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

时间:2009-08-28 20:28:48

标签: gcc strip symbols

我想知道这两者之间的区别是什么:

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

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

他们有相同的含义吗?

您使用哪一个:

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

4 个答案:

答案 0 :(得分:56)

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

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

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

答案 1 :(得分:40)

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

  

在带有一些选项的条带方面,gcc -s相当于什么?

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

  

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

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

最后,我建议使用此链接来剥离共享对象:http://www.technovelty.org/linux/stripping-shared-libraries.html

答案 2 :(得分:11)

" gcc -s"删除重定位信息以及#34; strip"未执行的符号表。请注意,删除重定位信息会对 Address space layout randomization 产生一些影响。请参阅this链接。

答案 3 :(得分:5)

他们做类似的事情,但剥离允许更精细的控制从什么被删除 文件。