如何彻底剥离可执行文件

Posted

技术标签:

【中文标题】如何彻底剥离可执行文件【英文标题】:How to strip executables thoroughly 【发布时间】:2011-05-09 21:42:39 【问题描述】:

我想尽可能多地剥离 - 在 Linux 上:一个 ELF。我只想要运行它所需的东西。

我尝试使用strip

strip --strip-all elf

但它似乎做得不好:nm 仍然显示很多东西,而且二进制文件仍然很大。

我该怎么办?

【问题讨论】:

你是如何开始构建它的? 我意识到很久以前就有人问过这个问题。我假设您已将其构建为动态链接的二进制文件。如果你创建一个静态链接的 ELF 文件然后剥离它,你可能会得到更满意的结果。 @peoro Ignacio 的评论是相关的。在 gcc 中添加-s 会清空符号表。 【参考方案1】:

我会查看这篇很棒的文章,该文章深入探讨了如何使 ELF 可执行文件尽可能小。也许它有可以提供帮助的信息!

http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

【讨论】:

【参考方案2】:
strip -R .comment
gcc -Os elf.c

这两个可能会有所帮助。

【讨论】:

【参考方案3】:

如果一切都失败了,您可以阅读以man strip 开头的文档。

说真的,也许您的应用程序有很多符号和代码。在一种极端情况下,最大的尺寸减少将是rm elf,但是您的程序将不再运行。这一切都取决于您的程序以及您在其中编码的内容。

作为一个具体的例子,我最近使用了一个大型 C++ 库,其中 strip 没有进一步的参数将大小从 400+mb 减少到大约 28mb。但是你不能再链接它(在其他共享库的上下文中),使它有点无用。

但是当使用strip --strip-unneeded 时,它将大小从 400+ mb 更改为 55 mb,这仍然是相当大的,但允许从其他共享库访问该库。

简而言之,我相信strip。如果不更改代码,您的应用程序可能无法进一步缩减。

【讨论】:

【参考方案4】:

使用 -R 选项剥离,您可以剥离所有不需要的部分。另请参阅this,了解最少的 ELF 可执行文件。

【讨论】:

以上是关于如何彻底剥离可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

如何防止特定符号被编译器/链接器剥离?

如何确定是不是在 Mac OS X 上剥离了二进制文件?

Spring Boot 可执行 jar 和外部配置文件

在ubuntu中 怎么给脚本文件添加执行的权限 ?

彻底搞懂程序链接过程之动态链接

链接器如何在剥离的动态库中定位代码?