为什么gcc会将符号添加到非调试版本中?

Mat*_*ate 12 c gcc debug-symbols

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

这让我感到惊讶 - 任何人都能解释为什么会这样吗

例如

#include <stdio.h>

static void blah(void)
{
    printf("hello world\n");
}
int main(int argc, char *argv[])
{
    blah();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc -o foo foo.c

nm foo | grep blah:

08048374 t blah

Pau*_*l R 10

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


Mar*_*man 6

这只是GCC的默认行为.包含调试信息和根本没有任何内容之间的半有用折衷.当然可以说剥离应该是默认的,但这只是添加-s或使用strip命令控制它的问题.