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

Posted

技术标签:

【中文标题】“gcc -s”和“strip”命令有啥区别?【英文标题】:What is the difference between "gcc -s" and a "strip" command?“gcc -s”和“strip”命令有什么区别? 【发布时间】:2010-11-23 20:45:54 【问题描述】:

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

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

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

它们的含义相同吗?

你用哪一个:

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

【问题讨论】:

【参考方案1】:

它们做类似的事情,但 strip 允许更细粒度地控制要从中删除的内容 文件。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

谢谢!在带有一些选项的条带方面,gcc -s 的等价物是什么? 您使用哪一个来减小可执行文件的大小并加快其运行速度。 我认为strip 的默认行为类似于gcc -s,但我不是专家。如果您真的需要知道,请等待另一个答案。不过,就我个人而言,我会避免在这个部门处理任何你不完全理解的事情。我很确定您应该预期可执行文件大小会减少,但执行速度不会有显着变化。【参考方案3】:

接受的答案非常好,但只是为了补充您的其他问题(也可以作为任何最终出现在这里的人的参考)。

就 strip 和它的一些选项而言,gcc -s 的等价物是什么?

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

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

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

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

【讨论】:

+1 表示“二进制文件的不可分配部分”和“删除符号表不会导致速度增益” “它永远不会被加载到 RAM 内存中”。那么为什么man strip 声明'一个在 RAM 中占用更少空间的剥离二进制文件' @YvesgereY:我认为这是一个有点乐观的说法。如果内核的文件预读算法碰巧拉入该页面而不是有用的页面,则它在 disk 和 RAM 中的页面缓存中占用更少的空间。或者,如果二进制文件的任何部分确实 需要加载到与符号表相同的 4k 页中,那么一页大部分无用的数据可能会被拉入内存。 (例如,用于动态链接的符号表部分。)我实际上不确定动态链接所需的符号是否组合在一起,或者它们是否与“无用”调试符号混合在一起。 关于剥离共享对象的链接文章很好。【参考方案4】:

"gcc -s" 删除 重定位信息 以及不是由 "strip" 完成的符号表。请注意,删除重定位信息会对 Address space layout randomization 产生一些影响。见this链接。

【讨论】:

第一个提到确切删除内容的答案!我猜,删除部分的确切列表会更好。

以上是关于“gcc -s”和“strip”命令有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

“diff3”和“svn merge”命令有啥区别?

在C,C++,java和python运行时解释器和编译器的区别

下面的两个 sed 命令有啥区别?

linux命令ln的两个不同参数,-d硬链接,-s符号链接,有啥区别?

gcc 和 g++/gcc-c++ 有啥区别?

在DOS下copy和xcopy有啥不同?rmdir的用法?