【发布时间】:2018-09-20 05:06:48
【问题描述】:
我正在研究编译器,我突然很好奇,如果我用 -g 选项编译一个程序(比如说 test.c),是否会创建一个带有符号表的实际文件并将其存储在某个地方,或者它只是得到结合可执行文件?
我是全新的,所以我真的在学习基础知识,对你们中的一些人来说可能听起来很愚蠢。对不起,但请告诉我!
谢谢!
【问题讨论】:
标签: compiler-construction gdb symbol-table
我正在研究编译器,我突然很好奇,如果我用 -g 选项编译一个程序(比如说 test.c),是否会创建一个带有符号表的实际文件并将其存储在某个地方,或者它只是得到结合可执行文件?
我是全新的,所以我真的在学习基础知识,对你们中的一些人来说可能听起来很愚蠢。对不起,但请告诉我!
谢谢!
【问题讨论】:
标签: compiler-construction gdb symbol-table
ELF 对象文件格式(这是 gcc 在许多常见平台上生成的)是一种容器格式,可以包含许多不同类型的信息。它始终包含外部链接符号的符号表(从库中定义或需要)。此外,如果指定了-g,ELF 文件将包含大量仅供调试器使用的信息,包括所有使用的本地符号。
您可以使用objdump --debugging 或readelf --debug-dump 以某种易于阅读的格式查看调试信息。祝你好运!
调试信息中通常不包含的一件事是实际的源代码。您会发现源文件的名称和对应于不同编译代码块的行号。调试器读取源代码文件以报告源代码行;如果在编译可执行文件后对源代码文件进行了编辑,这将无法按预期工作。
【讨论】: