【问题标题】:why is binary compiled with gcc not stripped by default为什么默认情况下使用 gcc 编译的二进制文件没有被剥离
【发布时间】:2026-01-15 16:00:01
【问题描述】:

当我编译我的程序 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?或者没有剥离二进制文件有什么好处?

AFAICS,/bin//usr/bin/ 中的大多数二进制文件都被剥离。

【问题讨论】:

  • Linux 上的 AFAIK 剥离通常通过 install 命令完成
  • @Anycorn - 在什么情况下我会使用install 命令?直到现在我才听说过。
  • install 通常用于将文件从构建目录移动到其最终目的地,/usr/bin/bin 等。它具有剥离二进制文件、设置权限等选项:linux.die.net/man/1/install
  • Related。 gcc 默认不剥离的符号不是调试信息,它们是重定位信息(链接所需的东西)。
  • 无需剥离它们。 IIUC:加载器忽略它们,VM 是你的朋友,磁盘空间是免费的。

标签: c gcc


【解决方案1】:

AFAIK 一旦二进制文件被剥离,您将无法取回剥离的信息,除非您重新生成二进制文件。当您需要处理内存限制时,剥离很有用。这可能是 GCC 默认情况下不启用条带的原因。

【讨论】:

  • 好的,但是我的 linux 系统上的几乎所有二进制文件都被剥离了。那么为什么 gcc 会留下多余的符号呢?
  • 如您所知,strip 可以在程序调试后节省空间并限制动态绑定的符号。您可能需要调试程序以查找可能的错误。
  • 额外的符号在调试程序时很有用。
最近更新 更多