实际生成的调试符号是在编译过程的哪个阶段。
如果我使用 -g 选项编译目标文件,那么是否必须将任何目标文件(共享库、静态库、可执行文件)内置到其中,输出中将始终包含调试符号?如果在链接期间不指定-g,输出二进制文件是否会有调试符号?
实际生成的调试符号是在编译过程的哪个阶段。
如果我使用 -g 选项编译目标文件,那么是否必须将任何目标文件(共享库、静态库、可执行文件)内置到其中,输出中将始终包含调试符号?如果在链接期间不指定-g,输出二进制文件是否会有调试符号?
通常,-g 是一个编译器选项,因为编译器知道哪些源代码行用于生成特定指令。
但是,某些链接器还要求您指定 -g,并且根据您的链接器,您可能需要指定其他开关,因为至少在 solaris 上,它不会将所有调试信息放入可执行文件中,并且调试器会发现它从 .o 文件中需要什么。
这一切都归结为阅读您的链接器文档。
.symtab
节中都有一个符号表,其中包括有关在程序中定义和引用的函数和全局变量的信息。但是,与编译器内部的符号表不同,.symtab
符号表不包含局部变量的条目。-g
允许使用额外的调试信息,例如行号。正如大卫指出的那样,默认行为取决于编译器和平台。