【问题标题】:Can't parse DWARF - Tricore CPU's DWARF info无法解析 DWARF - Tricore CPU 的 DWARF 信息
【发布时间】:2016-06-02 00:51:54
【问题描述】:

我正在努力解析 ELF 文件 - 由 Infineon 的 Tricore CPU 的 Tasking 编译器编译后 *.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 文件,但没有找到更详细的描述。

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

【问题讨论】:

    标签: elf dwarf


    【解决方案1】:

    我从其他人那里收到了一些 cmets - 然后我解决了这个问题。

    我误解了 .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 不匹配。

    我希望任何需要类似东西的人不会像我一样感到困惑。

    【讨论】:

      【解决方案2】:

      如果您查看 DWARF 标准(V4 http://dwarfstd.org/Dwarf4Std.php)并找到第 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-22
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多