为什么gcc向非调试构建添加符号?

为什么gcc向非调试构建添加符号?,c,gcc,debug-symbols,C,Gcc,Debug Symbols,当我使用gcc进行发布构建时(即,我没有指定-g),我似乎仍然以二进制符号结束,并且必须使用strip删除它们。事实上,我仍然可以在gdb中中断函数并获取回溯(尽管没有行号) 这让我很惊讶——有人能解释为什么会发生这种情况吗 e、 g #包括 静态空洞空洞(空洞) { printf(“hello world\n”); } int main(int argc,char*argv[]) { 诸如此类; 返回0; } gcc-o foo foo.c nmfoo | grep blah: 080483

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

这让我很惊讶——有人能解释为什么会发生这种情况吗

e、 g

#包括
静态空洞空洞(空洞)
{
printf(“hello world\n”);
}
int main(int argc,char*argv[])
{
诸如此类;
返回0;
}
gcc-o foo foo.c

nmfoo | grep blah


08048374 t blah

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

这只是GCC的默认行为。在包含调试信息和完全不包含调试信息之间的一种半有用的折衷方法。当然,有人可能会认为剥离应该是默认的,但这只是添加
-s
或使用
strip
命令来控制它的问题

#include <stdio.h>

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