之间有什么“GCC -S”和“条”命令有什么区别?(What is the difference b

2019-07-04 00:33发布

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

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

  • strip :丢弃从对象文件的符号。

他们有相同的意义?

你使用哪一种:

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

Answer 1:

gcc是一个编译器/连接器,它的-s选项的东西,而连接完成。 这也是不可配置 - 它有一组信息,它消除,不多不少。

strip的东西,可以在已经编译的目标文件中运行。 它也有多种,你可以用它来配置哪些信息将被删除命令行选项。 例如, -g条只调试信息,其gcc -g增加。

需要注意的是strip不bash命令,但你可以从bash shell中运行它。 它是一个命令完全从bash中,GNU二进制工具套件的一部分分开。



Answer 2:

接受的答案是非常好的,但只是为了让您进一步的问题(也为任何人在这里结束了参考)。

是什么在它的某些选项条的条款与gcc -s等价?

他们都做同样的事情,完全去除符号表。 然而,如@JimLewis指出条允许更精细的控制。 例如,在可重定位目标, strip --strip-unneeded不会删除它的全局符号。 不过, stripstrip --strip-all将取出完整的符号表。

你用哪一个,以减少可执行文件的大小,并加快其运行

符号表是二进制的非可分配部分。 这意味着它永远不会在RAM存储器被加载。 它存储在调试purporses,例如,要打印出堆栈跟踪时崩溃发生的有用信息。 它可能是有意义的删除符号表将是一个场景,你的存储容量严重制约(在这方面,情况gcc -Os -smake CXXFLAGS="-Os -s" ...是有用它会导致更小的慢二进制,其也剥离,进一步减少尺寸)。 我不认为删除符号表将导致成速度增益评论的原因。

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



Answer 3:

“GCC -s”除去与未通过“条”所作的符号表沿重定位信息 。 需要注意的是,除去重定位信息将有一定的影响的地址空间布局随机化 。 请参阅此链接。



Answer 4:

他们做类似的事情,但带允许什么获取从文件中删除更细粒度的控制。



文章来源: What is the difference between “gcc -s” and a “strip” command?