我想知道两者之间有什么区别:
gcc -s
:从可执行文件中删除所有符号表和重定位信息。strip
:丢弃目标文件中的符号。
它们具有相同的含义吗?
您使用哪一个来:
- 减少可执行文件的大小?
- 加快运行速度?
Answers:
gcc
作为编译器/链接器,其-s
选项是在链接时完成的。它也是不可配置的-它具有一组要删除的信息,这不少。
strip
是可以在已编译的目标文件上运行的东西。它还具有多种命令行选项,可用于配置将删除哪些信息。例如,-g
仅去除gcc -g
添加的调试信息。
请注意,这strip
不是bash命令,尽管您可以从bash shell运行它。它是与bash完全分开的命令,bash是GNU二进制实用程序套件的一部分。
strip
类似于的默认行为gcc -s
,但是我不是专家。如果您真的需要知道,请等待另一个答案。不过,就我个人而言,我会避免混入您对该部门不完全了解的任何内容。我敢肯定,您应该期望减小可执行文件的大小,但是执行速度不会有重大变化。
可以接受的答案非常好,但是只是为了补充您的其他问题(也可以作为在此处结束的任何人的参考)。
在带有某些选项的剥离方面,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