我想知道的是这两者之间的区别:
gcc -s
:从可执行文件删除所有符号表和重定位信息。strip
:丢弃从对象文件的符号。
他们有相同的意义?
你使用哪一种:
- 减少可执行文件的大小?
- 加快它的运行?
我想知道的是这两者之间的区别:
gcc -s
:从可执行文件删除所有符号表和重定位信息。
strip
:丢弃从对象文件的符号。
gcc
是一个编译器/连接器,它的-s
选项的东西,而连接完成。 这也是不可配置 - 它有一组信息,它消除,不多不少。
strip
的东西,可以在已经编译的目标文件中运行。 它也有多种,你可以用它来配置哪些信息将被删除命令行选项。 例如, -g
条只调试信息,其gcc -g
增加。
需要注意的是strip
不bash命令,但你可以从bash shell中运行它。 它是一个命令完全从bash中,GNU二进制工具套件的一部分分开。
接受的答案是非常好的,但只是为了让您进一步的问题(也为任何人在这里结束了参考)。
是什么在它的某些选项条的条款与gcc -s等价?
他们都做同样的事情,完全去除符号表。 然而,如@JimLewis指出条允许更精细的控制。 例如,在可重定位目标, 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
“GCC -s”除去与未通过“条”所作的符号表沿重定位信息 。 需要注意的是,除去重定位信息将有一定的影响的地址空间布局随机化 。 请参阅此链接。
他们做类似的事情,但带允许什么获取从文件中删除更细粒度的控制。