“gcc -s”和“strip”命令有什么区别?
我不知道这两者之间有什么区别:
-
gcc -s
:从可执行文件中删除所有符号表和重定位信息。 -
strip
:从目标文件中丢弃符号。
他们有相同的意思吗?
你用哪一个来:
- 减小可执行文件的大小?
- 加快运行?
gcc
是一个编译器/链接器,它的-s
选项是在编译和链接时完成的 。 它也是不可configuration的 – 它有一组信息,它删除了,不多不less。
strip
是可以在已编译的目标文件上运行的东西。 它还具有多种命令行选项,您可以使用它们来configuration哪些信息将被删除。 例如, -g
仅剥离gcc -g
添加的debugging信息。
请注意, strip
不是bash命令,尽pipe您可能正在从bash shell运行它。 它是一个完全独立于bash的命令,是GNU二进制工具套件的一部分。
接受的答案是非常好的,但只是为了补充你的进一步的问题(也作为任何人最终在这里的参考)。
对于带有某些选项的gcc -s而言,等于多less?
他们都做同样的事情,完全删除符号表。 不过,正如@JimLewis指出的,strip可以更好的控制。 例如,在可重定位对象中, strip --strip-unneeded
不会删除其全局符号。 但是, strip
或strip --strip-all
会删除完整的符号表。
您使用哪一个来减小可执行文件的大小并加快运行速度
符号表是二进制文件的一个不可分配部分。 这意味着它永远不会被加载到RAM内存中。 它存储可用于debuggingpurpours的信息,例如,在发生崩溃时打印堆栈跟踪。 一个情况下,删除符号表将是一个情况下,你有严重的限制存储容量(在这方面, gcc -Os -s
或make CXXFLAGS="-Os -s" ...
是有用的这将导致一个更小的二进制文件,也被剥离,以进一步减小尺寸)。 我不认为删除符号表会导致速度增益的原因评论。
最后,我推荐这个关于剥离共享对象的链接: http : //www.technovelty.org/linux/stripping-shared-libraries.html
“gcc -s”删除重定位信息以及不是由“strip”完成的符号表。 请注意,删除重定位信息会对地址空间布局随机化产生一些影响。 看到这个链接。
他们做类似的事情,但剥离允许更好地控制从文件中删除的内容。