13

当我使用 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

4

2 回答 2

11

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

于 2010-03-22T09:55:26.177 回答
6

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

于 2010-03-22T09:58:24.907 回答