为啥 gcc 在非调试版本中添加符号?

Posted

技术标签:

【中文标题】为啥 gcc 在非调试版本中添加符号?【英文标题】:Why does gcc add symbols to non-debug build?为什么 gcc 在非调试版本中添加符号? 【发布时间】:2010-03-22 09:51:50 【问题描述】:

当我使用 gcc 进行发布构建时(即我没有指定 -g),我似乎仍然会在二进制文件中得到符号,并且必须使用 strip 来删除它们。事实上,我仍然可以在 gdb 中断点函数并获取回溯(尽管没有行号)。

这让我很惊讶——谁能解释为什么会这样?

例如

#include <stdio.h>

static void blah(void)

    printf("hello world\n");

int main(int argc, char *argv[])

    blah();
    return 0;

gcc -o foo foo.c

nm foo | grep blah:

08048374 t blah

【问题讨论】:

【参考方案1】:

调试符号和链接器符号有很大的不同。调试符号将代码位置等映射到源文件名和行号以及各种其他有用的东西,以帮助调试器、分析器等。链接器符号仅定义代码中各种入口点和其他重要位置的地址。如您所见,如果您想让可执行文件完全匿名,则需要使用strip

【讨论】:

【参考方案2】:

这只是 GCC 的默认行为。在包含调试信息和根本不包含任何内容之间的一种半有用的折衷。当然有人可能会争辩说剥离应该是默认设置,但这只是添加-s 或使用strip 命令来控制它的问题。

【讨论】:

以上是关于为啥 gcc 在非调试版本中添加符号?的主要内容,如果未能解决你的问题,请参考以下文章

gcc/g++ 不为变量生成调试符号

使用安装了 GCC 4.9 的 MacPorts 调试符号错误?

使用库进行编译时,gcc不包含调试符号

为啥调试器需要符号来重建堆栈?

GDB调试

w601 开发板+ rt-thread+gcc+gdb使用eclipse 进行在线调试的说明