为什么使用gcc编译的二进制文件默认不会被剥离?

5

当我编译我的程序gcc -o myprog myprog.c时,生成的二进制文件没有被剥离:

myprog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically 
linked (uses shared libs), for GNU/Linux 2.6.26, 
BuildID[sha1]=0x2697ed96b65e8a11239af0a44abc7896954b6e20, not stripped

我想知道为什么在没有提供任何调试参数的情况下,gcc默认生成非剥离二进制文件。

在编译后,所有二进制文件应该被剥离,例如使用strip myprog吗?或者拥有非剥离二进制文件有什么优势吗?

据我所知,/bin//usr/bin/中的大多数二进制文件都已剥离。


1
据我所知,在Linux上剥离通常是通过install命令完成的。 - Anycorn
@Anycorn - 在什么情况下我会使用install命令?直到现在我都没有听说过它。 - Martin Vegter
1
“install” 通常用于将文件从构建目录移动到其最终目的地,如 /usr/bin/bin 等。它具有剥离二进制文件、设置权限等选项:http://linux.die.net/man/1/install - Anycorn
1
相关内容:链接。GCC默认不会剥离的符号并非调试信息,而是重定位信息(在链接时需要)。 - n. m.
如果我理解正确:加载器会忽略它们,虚拟机是你的朋友,而磁盘空间是免费的。 - wildplasser
非常有效的关注点,我们通常假设GCC默认会剥离这些信息。 - Zeeshan
1个回答

0
据我所知,一旦二进制文件被剥离,除非重新生成二进制文件,否则您将无法获取剥离的信息。当您需要处理内存限制时,剥离是很有用的。这可能是GCC默认未启用strip的原因。

好的,但是我Linux系统上几乎所有的二进制文件都被剥离了。那么为什么gcc会留下额外的符号呢? - Martin Vegter
正如您已经知道的那样,strip 函数在程序调试完成后节省空间并限制动态绑定符号非常有用。您可能希望调试程序以查找可能的错误。 - neo
额外的符号在调试程序时非常有用。 - neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接