linux 解析elf文件中的dwarf .debug_info节时出现问题

xtupzzrd  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(188)

我正在尝试在c++中实现一个侏儒解析器,而不使用任何外部依赖。正如在dwarf 5标准中提到的,调试信息的前4个字节或12个字节表示单元长度基本上是这样的:

unit_length (initial length)
A 4-byte or 12-byte unsigned integer representing the length of the3
.debug_info contribution for that compilation unit, not including the length field itself. In the 32-bit DWARF format, this is a 4-byte unsigned integer (which must be less than 0xfffffff0); in the 64-bit DWARF format, this consists of the 4-byte value 0xffffffff followed by an 8-byte unsigned integer that gives the actual length (see Section 7.4 on page 196).

当我使用objdump十六进制转储.debug_info部分时,我得到了这个(参见下面的readelf输出)。
objdump -s -j .debug_info hello.o
Hello.o:文件格式elf 64-x86-64
.debug_info节的内容:

0000 01000000 00000000 9a000000 00000000  ................  
 0010 01000000 00000000 789c9bc6 c0c0c0ca  ........x.......  
 0020 c0c801a4 18984084 2c031a10 42623372  ......@.,...Bb3r  
 0030 b0832916 0805d1c6 c804e5b1 4178ac20  ..).........Ax.  
 0040 8a998535 33af04a8 8115498e 05aa2002  ...53.....I... .  
 0050 8bf18c73 58131918 99394172 4c137318  ...sX....9ArL.s.  
 0060 180011e5 0560

因此,根据这个长度应该是0x 01000000,但实际长度是0x 96。(参见下面的readelf输出)
readelf -wi hello.o
.debug_info部分的内容:
偏移量为0时的编译单元:
长度:0x 96(32位)
版本:5单位类型:DW_UT_compile(1)缩写偏移:0
指针大小:8
我知道,我错过了一些基本的东西,但即使在阅读多次标准。我找不到我的错误。还有一件事,我搜索了一些基本的dwaf解析器,这样我就可以理解他们在做什么,但无法找到任何。所有的解析器都是很大的库,很难理解。如果你们中的任何人至少能提供一些可读和可理解的解析器代码,这也会很有帮助。

kcwpcxri

kcwpcxri1#

.debug_info部分通常是 * 压缩 * 的。objdump -s显示压缩数据,包括压缩标头。你应该自己处理压缩。
要验证,请执行以下操作:

objcopy --decompress-debug-sections hello.o hello.d.o
objdump -s -j .debug_info hello.d.o

您应该会看到以下数据

0000 96000000 05000108 ....

相关问题