在 Linux 上,编译时需要考虑哪些因素来减少二进制文件的大小?

在 Linux 上,编译时需要考虑哪些因素来减少二进制文件的大小?

我已经编译了一个实用程序,并在我的 Linux 系统上创建了二进制文件。但这个二进制文件的大小为 2.3 MB,我需要减小它的大小。我尝试在二进制文件上应用 STRIP,但效果不佳。那么,在编译实用程序时,是否有任何选项(可能是配置)可以应用?

提前感谢您的回复。

答案1

如果你使用 GCC 进行编译,则可以使用 -os 标志。你可以在GCC 标志页面 -

-Os
    Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

    -Os disables the following optimization flags:

              -falign-functions  -falign-jumps  -falign-loops 
              -falign-labels  -freorder-blocks  -freorder-blocks-and-partition 
              -fprefetch-loop-arrays

如果你出于某种原因必须有这些标志,那么,这不适合你。此外,你还牺牲了性能来换取大小

您还可以使用各种方法可执行压缩喜欢韓輯,编译后可使可执行文件的大小更小。这也是一种性能/大小权衡(尽管相当小),但可以与您选择的任何优化一起使用。此处的大小减少可能相当显著。

答案2

您可以使用以下方法来减少可执行文件的大小:

  • 确保可执行文件是在没有调试符号的情况下编译的。如果您的 makefile-ggcc命令行选项中存在标志,就会发生这种情况。这通常是默认的,因为它允许轻松调试此类可执行文件。您可以使用实用程序strip从现有可执行文件中移除调试符号。通常,仅此一项就可以将可执行文件的大小减少 2 倍或更多,有时甚至减少 10 倍。
  • 动态编译所有必要的库(尤其是glibcLinux 上的 C 运行时库)。静态编译(-s)可以很好地避免依赖关系,但代价是可执行文件的大小会显著增加。例如,如果您的可执行文件需要 libxml2,请添加-lxml2gcc命令行以进行libxml2动态链接。这种方法的缺点是,如果目标系统上未安装必要的库,您的可执行文件将崩溃(您必须确保sudo apt-get install libxml2先运行)。
  • 启用按大小优化-Os。但是,典型的收益非常小,很少超过 5%-10%。
  • 使用压缩您的可执行文件upx(使用 安装sudo apt-get install upx-ucl)。upx不仅支持 Intel 平台的打包,还支持许多其他平台,如 arm、mips、powerpc 等。请注意,虽然upx可以显著减少大小(2 到 5 倍),但不应盲目使用。与标准可执行文件不同,使用 压缩的程序upx不能共享相同的缓存页面。例如,如果您的程序大小为 2MB,并且您启动了 100 个副本,那么它只会消耗大约 2 MB 的内存 - 内核将重用缓存页面。如果您使用 将其压缩为upx1 MB 并启动 100 个副本,它将消耗 200 MB 内存。但是,它只需要从磁盘读取 1 MB,这将大大减少第一个副本的启动时间,因为upx解压缩非常快(比从磁盘读取快得多)。

相关内容