“ gcc -s”和“ strip”命令有什么区别?


77

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

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

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

它们具有相同的含义吗?

您使用哪一个来:

  • 减少可执行文件的大小?
  • 加快运行速度?

Answers:


66

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

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

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


1
谢谢!在带有某些选项的剥离方面,gcc -s相当于什么?
蒂姆

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

我认为的默认行为strip类似于的默认行为gcc -s,但是我不是专家。如果您真的需要知道,请等待另一个答案。不过,就我个人而言,我会避免混入您对该部门不完全了解的任何内容。我敢肯定,您应该期望减小可执行文件的大小,但是执行速度不会有重大变化。
卡斯卡贝尔

50

可以接受的答案非常好,但是只是为了补充您的其他问题(也可以作为在此处结束的任何人的参考)。

在带有某些选项的剥离方面,gcc -s相当于什么?

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

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

符号表是二进制文件的不可分配部分。这意味着它永远不会加载到RAM内存中。它存储的信息可用于调试目的,例如在发生崩溃时打印出堆栈跟踪信息。它可能是有意义的删除符号表将是,你必须存储容量的严重制约因素(在这方面,方案中的情况下,gcc -Os -smake CXXFLAGS="-Os -s" ...因为它会导致更小更慢的可执行文件,被剥离,以进一步减小尺寸是很有用的) 。我不认为删除符号表会因上述原因而导致速度提高。

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


3
+1表示“二进制文件的不可分配部分”和“删除符号表不会导致速度提高”
Makesh 2015年

“它永远不会加载到RAM内存中”。那么,为什么人要剥离状态“将在RAM中占用较少空间的剥离二进制文件”
YvesgereY

@YvesgereY:我认为这有些乐观。如果内核的文件预读算法恰好拉入了该页面而不是有用的页面,则它在磁盘和RAM的页面缓存中占用的空间更少。或者,如果有,该二进制的任何部分需要在同一个4K页即可加载符号表,则大多无用数据的页面可能会被拉入到内存中。(例如,符号表中用于动态链接的部分。)实际上,我不确定动态链接所需的符号是否组合在一起,或者它们是否与“无用的”调试符号混合在一起。
彼得·科德斯


7

它们执行类似的操作,但是strip允许对从文件中删除的内容进行更精细的控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.