将多个程序编译成一个二进制文件以节省 space

Compiling multiple programs into a single binary to save space

类似 busybox and dropbear 的应用程序在一个二进制文件中包含多个程序。

是否有促进此过程的工具?我可以相对容易地将来自不同作者的几个 C 程序编译成一个二进制文件吗?

我问是因为我正在为一个小型 Linux 嵌入式设备编译一些东西,我想尽可能多地节省 space。

不,这不是一种数据压缩形式。您通常不能使用两个相似的应用程序并利用它们的功能相似性来节省磁盘 space.

这些应用程序所做的是检查第一个命令行参数 argv[0] 的值,它告诉二进制文件是如何被调用的。然后程序做正确的事情。

如果您可以访问一些应用程序的源代码并且您知道它们正在重复复制完全相同的代码(即,它们正在合并来自同一静态库的函数),您有几个选择:

  • 将重复的代码(静态库)移动到共享库中。
  • 尝试通过编写您自己的 main 函数并同时编译它们来实现您提出的策略。

如果没有看到相关程序的构建系统,很难知道这会有多少工作,但它可能 不是 "fairly easy."

如果没有任何通用的静态库,但它们只是在做类似的事情,那么你就是在谈论重构它们。这很容易变成对所有程序的完全重写。可能是值得的,如果结果大于其各部分的总和,并且它可能比从头开始更容易,但断然我们可以说 "lots of work."

我不知道有任何通用工具可以执行此操作,无论如何,当要合并的程序的代码之间存在大量重叠时,这只是一种 space 节省措施。对于 busybox,节省的不是各个小程序代码之间的太多重叠,而是共享静态链接 libc 的单个副本。对于动态链接,大部分好处都消失了。