当我使用gcc进行发布构建时(即我没有指定-g
),我似乎仍然在二进制文件中使用符号,并且必须使用strip
来删除它们。事实上,我仍然可以在gdb中断点函数并获得回溯(尽管没有行号)。
这让我感到惊讶 - 任何人都能解释为什么会这样吗?
e.g。
#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
答案 0 :(得分:10)
调试符号和链接符号之间存在很大差异。调试符号将代码位置等映射到源文件名和行号以及各种其他有用的东西,以帮助调试器,分析器等。链接器符号只定义代码中各种入口点和其他重要位置的地址。如果您想使可执行文件完全匿名,那么您需要使用strip
,如您所见。
答案 1 :(得分:6)
这只是GCC的默认行为。包含调试信息和根本没有任何内容之间的半有用折衷。当然可以说剥离应该是默认的,但这只是添加-s
或使用strip
命令控制它的问题。