我正在使用GCC ARM交叉编译器(arm-none-eabi-*
)并使用专有调试器。调试器可以突出显示所选源代码行的结果程序集。使用nm和objdump,我可以看到二进制文件有多个.debug_*
部分。很明显,调试器使用这些部分中包含的信息将源代码行映射到反汇编(反之亦然)。但我想怎么样。我想知道这些部分包含哪些信息,它们是如何相关的,以及如何理解它们。简而言之,如果我要编写调试器(或者至少是一个可以显示这些映射的工具:反汇编源,返回,每个源代码行的反汇编行数),我将如何阅读这些部分并使用它们? 。假设零编译优化。
据推测,有一些文档描述了这些部分的格式?
答案 0 :(得分:1)
.debug_ *部分包含DWARF调试标准描述的格式的数据。该标准有一个网站,您可以在其中下载标准规范:http://www.dwarfstd.org/
有可用于解析存储格式的库(高度精简以节省空间),其中一个是libdwarf:http://reality.sgiweb.org/davea/dwarf.html
简而言之,不同的部分包含源程序的不同方面,以及它们如何映射到目标机器体系结构(代码和数据地址)。通常在编译过程中丢失的信息由调试信息条目树表示,该树是具有标识标签的结构和各种属性。例如,变量声明的DIE由带有DW_TAG_variable
标记的DIE表示,并且可以具有以下属性:name,file,line / column,声明它,目标文件中的内存位置等等
.debug_info和.debug_abbrev部分一起表示调试信息条目树。 .debug_line部分包含的信息允许调试器重建完整的表映射源代码行到目标代码地址(并包含其他信息,例如源代码行是否是语句的开头,并且是一个开头的基本块等。)。
其他部分包含调用框架信息和加速查找表,用于按名称快速查找变量DIE和类型等。这一切都在标准中描述。