90

我想知道这两者有什么区别:

  • gcc -s:从可执行文件中删除所有符号表和重定位信息。

  • strip:从目标文件中丢弃符号。

它们有相同的含义吗?

你用哪一个:

  • 减小可执行文件的大小?
  • 加速它的运行?
4

4 回答 4

82

gcc作为编译器/链接器,它的-s选项是在链接时完成的。它也是不可配置的——它有一组被删除的信息,不多不少。

strip是可以在已经编译的目标文件上运行的东西。它还具有多种命令行选项,您可以使用它们来配置将删除哪些信息。例如,-g只剥离gcc -g添加的调试信息。

请注意,这strip不是 bash 命令,尽管您可能是从 bash shell 运行它。它是一个完全独立于 bash 的命令,它是 GNU 二进制实用程序套件的一部分。

于 2009-08-28T20:42:09.713 回答
56

接受的答案非常好,但只是为了补充您的进一步问题(也可以作为最终在这里的任何人的参考)。

就 strip 和它的一些选项而言,gcc -s 的等价物是什么?

他们都做同样的事情,完全删除符号表。但是,正如@JimLewis 指出的那样,strip 可以进行更精细的控制。例如,在可重定位对象中,strip --strip-unneeded不会删除其全局符号。但是,strip还是strip --strip-all会删除完整的符号表。

您使用哪一个来减小可执行文件的大小并加快其运行速度

符号表是二进制文件的不可分配部分。这意味着它永远不会被加载到 RAM 内存中。它存储可用于调试目的的信息,例如,在发生崩溃时打印出堆栈跟踪。删除符号表可能有意义的情况是您对存储容量有严重限制的情况(在这方面,gcc -Os -s或者make CXXFLAGS="-Os -s" ...是有用的,因为它会导致更小的更慢的二进制文件也被剥离以进一步减小大小) . 出于评论的原因,我认为删除符号表不会导致速度提高。

最后,我推荐这个关于剥离共享对象的链接:http ://www.technovelty.org/linux/stripping-shared-libraries.html

于 2013-10-24T11:11:36.697 回答
22

“gcc -s”删除重定位信息以及“strip”没有完成的符号表。请注意,删除重定位信息会对地址空间布局随机化产生一些影响。请参阅链接。

于 2015-04-30T03:23:54.003 回答
7

他们做类似的事情,但 strip 允许更细粒度地控制从文件中删除的内容。

于 2009-08-28T20:41:49.980 回答