我正在尝试在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解析器,这样我就可以理解他们在做什么,但无法找到任何。所有的解析器都是很大的库,很难理解。如果你们中的任何人至少能提供一些可读和可理解的解析器代码,这也会很有帮助。
1条答案
按热度按时间kcwpcxri1#
.debug_info
部分通常是 * 压缩 * 的。objdump -s
显示压缩数据,包括压缩标头。你应该自己处理压缩。要验证,请执行以下操作:
您应该会看到以下数据