在使用Tasking编译器为英飞凌的Tricore CPU编译后,我正在努力解析ELF文件 - * .elf的DWARF内容。我无法匹配.debug_abbrev和.debug_info,看起来内容已损坏。 你们可以指导我如何解析.debug_info内容吗?
.debug_abbrev;
...
04 (code)
05 (DW_TAG_compile_unit)
00 (no child)
03 08 (DW_AT_name, DW_FORM_string)
3A 0F (DW_AT_decl_file, DW_FORM_udata)
3B 0F (DW_AT_decl_line, DW_FORM_udata)
39 0F (DW_AT_decl_column, DW_FORM_udata)
49 13 (DW_AT_type, DW_FORM_ref4)
00 00 (end)
05 (code)
35 (DW_TAG_volatile_type)
00 (no child)
49 13 (DW_AT_type, DW_FORM_ref4)
00 00 (end)
06 (code)
0F (DW_TAG_pointer_type)
00 (no child)
49 13 (DW_AT_type, DW_FORM_ref4)
00 00 (end)
...
使用上面的.debug_abbrev内容我试图解析.debug_info内容,但是这很奇怪,可能是错误的解析,并且进一步解析不匹配,结果很奇怪。 我想我的解析器出错了,但我无法理解为什么。
.debug_info;
04 (04, code)
75 77 56 61 6C 75 65 00 (uwValue, DW_FORM_string)
01 (1, DW_FORM_udata)
8D 01 (8D, DW_FORM_udata)
1F (1F, DW_FORM_udata)
93 00 00 00 (00000093, DW_FORM_ref4)
00 (end)
05 (05, code)
93 00 00 00 (00000093, DW_FORM_ref4)
03 75 6E 73 69 67 6E 65 6E 73 69 67
(???我该如何解析它们?)
没有06
(用于匹配代码06
)...我无法再执行解析。
对于.debug_info的开头部分,我很好地解析了,但从上面我不能完全理解我需要如何处理这些值。 我还阅读了DWARF pdf文件,但没有找到更详细的描述。
请指导我如何对此有更详细的了解,谢谢!
答案 0 :(得分:0)
我收到了其他人的一些评论 - 然后我解决了这个问题。
我犯了一些误解,因为.debug_info应该在下面解析;
.debug_info的第1部分与.debug_abbrev的第1部分匹配,
.debug_info的第2部分与.debug_abbrev的第2部分匹配,
.debug_info的第3部分与.debug_abbrev的第3部分匹配,
等...
所以我假设.debug_info的部分总是顺序的:01 - > 02 - > 03 - > 04 - > ...
但是我发现事实并非如此,实际上.debug_info可能没有连续的数字。
通常他们有01 - > 02 - > 02 - > 02 - > 03 - > 04 - > 02 - > 01 - > ...
所以这个差异是我误解的原因,而且.debug_info的字节看起来与.debug_abbrev不匹配。
我希望任何需要类似事情的人都不要像我一样困惑。
答案 1 :(得分:0)
如果您查看 DWARF 标准(http://dwarfstd.org/Dwarf4Std.php 处的 V4)并找到第 7.5.1.1 节(“编译单元标题”),这将为您提供所需的信息。从 objdump --dwarf=info,这里是要查找的内容
$ objdump --dwarf=info mybinary
...
Compilation Unit @ offset 0x8cc:
Length: 0x2d7 (32-bit)
Version: 4
Abbrev Offset: 0x0 <<<=== HERE
Pointer Size: 8
<0><8d7>: Abbrev Number: 1 (DW_TAG_compile_unit)
<8d8> DW_AT_name : os/signal
...
基本上每个编译单元都会在标头中有一个指向与该单元对应的正确 .debug_abbrev 部分的指针。
另外值得注意的是 .debug_abbrev 表可以被多个编译单元共享。 Go (golang) 程序会发生这种情况——如果您将 DWARF 转储为 Go 二进制文件,您会发现所有编译单元都指向单个 .debug_abbrev。