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

Tim*_*Tim 66 gcc symbols strip

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

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

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

它们有相同的含义吗?

你用哪一个:

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

Cas*_*bel 58

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

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

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

  • 您使用哪一个来减少可执行文件的大小并加快其运行速度. (2认同)

Die*_*ino 42

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

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

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

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

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

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

  • +1"二进制的不可分配部分"和"删除符号表不会导致速度增加" (2认同)

Kha*_*led 13

"gcc -s"删除重定位信息以及符号表,而不是"strip".请注意,删除重定位信息会对地址空间布局随机化产生一些影响.看到这个链接.

  • 第一个答案提到了到底删除了什么!我想,删除部分的确切列表会更好。 (3认同)

Jim*_*wis 6

他们做类似的事情,但条带允许更精细地控制从文件中删除的内容.