如何彻底删除可执行文件

45

我希望尽可能地减少文件大小 - 在Linux上: 一个ELF文件。我只需要里面运行所需的内容。

我尝试使用strip命令:

strip --strip-all elf

但是它似乎没有做好: nm 仍然显示很多内容,而且二进制文件仍然很大。

我该怎么做?


2
你最开始是怎么构建它的? - Ignacio Vazquez-Abrams
我意识到这个问题很久以前就被问过了。我假设你已经构建了一个动态链接的二进制文件。如果你创建一个静态链接的ELF文件,然后再剥离它,你可能会得到更令人满意的结果。 - user277465
1
@peoro Ignacio的评论很有参考价值。在gcc后添加“-s”将清空符号表。 - Déjà vu
5个回答

44

如果一切都失败了,你可以阅读文档,从 man strip 开始。

说真的,也许你的应用程序有很多符号和代码。在一个极端情况下,最大的大小缩减将是 rm elf,但是你的程序将无法再运行了。这完全取决于 你的程序 以及你编写的内容。

作为一个具体的例子,我最近使用了一个大型的C++库,其中没有进一步参数的 strip 将其大小从400多MB减小到约28MB。但是,你就不能再链接其他共享库来使用它,使它有些无用。

但是当使用 strip --strip-unneeded 时,它将大小从400多MB更改为55MB,仍然相当可观,并允许从其他共享库中访问该库。

总之,我会信任 strip。也许你的应用程序在没有代码更改的情况下无法进一步缩小。


有关于 rm 命令的调皮评论,但是 --strip-unneeded 似乎是重要的提示。如果没有执行这个操作,我也看到了来自另一个评论中的 gcc -s 标志作为不错的答案,但可能对于库链接来说太过复杂,正如此处所提到的。 - Pysis

16

使用strip命令的-R选项,您可以剥离掉所有不需要的部分。同时,参考这篇文章了解有关精简ELF可执行文件的信息。


8

2
strip -R .comment
gcc -Os elf.c

这两个可能会有所帮助。

0
要去除所有符号,请使用-s--strip-all

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接