2010-03-22 44 views
12

当我使用gcc进行版本构建时(即,我没有指定-g),我似乎仍然以二进制文件中的符号结尾,并且必须使用strip来删除它们。实际上,我仍然可以使用断点函数并在gdb中获取回溯(尽管没有行号)。为什么gcc将符号添加到非调试版本?

这让我感到惊讶 - 任何人都可以解释为什么会发生这种情况?

例如

#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

回答

10

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

6

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

相关问题