无法解析DWARF - Tricore CPU的DWARF信息

时间:2016-06-02 00:51:54

标签: elf dwarf

在使用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文件,但没有找到更详细的描述。

请指导我如何对此有更详细的了解,谢谢!

2 个答案:

答案 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。