DW_FORM_strp 个值的位置

Location of DW_FORM_strp values

我正在尝试了解 DW_FORM_strp 属性值实际存储在 ELF 文件中的位置(可以在此处找到:https://filebin.net/77bb8359o0ibqu67)。

我找到了 .debug_info.debug_abbrev.debug_str 部分。然后我在 .debug_info 中解析了编译单元 header 并找到了编译单元的缩写 table 条目并迭代了它的缩写。第一个缩写是 DW_AT_producer,形式为 DW_FORM_strp。我想知道的是如何找到这个偏移量所在的位置?

从我读到的 DWARF4 规范:Each debugging information entry begins with a code that represents an entry in a separate abbreviations table. This code is followed directly by a series of attribute values.我对此的理解是,如果我回到编译单元 header,跳过它的内容,我应该在编译单元结束.它以 ULEB128(我解析)开始,之后应该是属性值。但是,在我的 ELF 文件中,这些字节都是 0。我在文件上有 运行 readelf -w,我看到以下内容:

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0xf6 (32-bit)
   Version:       4
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_producer    : (indirect string, offset: 0x62): GNU C11 7.5.0 -mtune=generic -march=x86-64 -g -O0 -fstack-protector-strong
    <10>   DW_AT_language    : 12   (ANSI C99)
    <11>   DW_AT_name        : (indirect string, offset: 0xd9): elf.c
    <15>   DW_AT_comp_dir    : (indirect string, offset: 0xad): /home//struct_analyzer
    <19>   DW_AT_low_pc      : 0x0
    <21>   DW_AT_high_pc     : 0x39
    <29>   DW_AT_stmt_list   : 0x0

这告诉我字符串 table 的偏移量是 0x62,名称的偏移量是 0xd9。但是,在解析作为任何 DIE 的第一部分的 ULEB128 之后,接下来的 4 个字节(第一个属性的值)是 0x00 00 00 00。这个我不懂?

编辑俄罗斯雇员

是的,我知道偏移量 0x62 指向 .debug_str 部分。但是,我想知道我在哪里可以找到这个 0x62 值?

每个DIE都以ULEB128值(缩写table入口代码)开头,后面是属性。相应缩写 table 条目中的第一个属性是形式 DW_FORM_strpDW_AT_producer。这意味着 DIE 中接下来的 4 个字节应该是 .debug_str 的偏移量。但是,接下来的 4 个字节是 0x00 00 00 00,而不是 0x62 00 00 00,这是我要查找的值。 0x62 驻留在 ELF 文件的偏移量 0x5c8 处,而据我所知,DIE 的属性从偏移量 0x85 开始(请参阅 hexdump(小端)的附加图像 - 突出显示byte 是 ULEB128,接下来的字节是我期望 .debug_str 的偏移量。

编辑 2

我已经能够确定表单 DW_FORM_strp 的实际属性值位于 ELF 文件的 .rela.debug_info 部分,因此我必须阅读更多相关内容。

This tells me that the offset into the string table is 0x62, and the name is at an offset 0xd9.

正确。这些偏移量位于 .debug_str 部分,该部分从文件中的偏移量 0x289 开始。

readelf -WS elf.o | grep debug_str
  [12] .debug_str        PROGBITS        0000000000000000 000289 0000e4 01  MS  0   0  1

dd if=elf.o bs=1 skip=$((0x289+0x62)) count=75 2>/dev/null
GNU C11 7.5.0 -mtune=generic -march=x86-64 -g -O0 -fstack-protector-strong

dd if=elf.o bs=1 skip=$((0x289+0xd9)) count=5 2>/dev/null
elf.c

P.S.

I've found sections .dwarf_info, .dward_abbrev and .dwarf_str.

None 以上部分存在于您的文件中。提问时准确会很有帮助。

针对此问题发布的特定 ELF 文件也有一个 rela.debug_info 部分,其中包含 .debug_info 部分的重定位条目。来自 ELF 规范:

 .relaNAME
              This section holds relocation information as described below.
              If the file has a loadable segment that includes relocation,
              the section's attributes will include the SHF_ALLOC bit.  Oth‐
              erwise, the bit will be off.  By convention, "NAME" is sup‐
              plied by the section to which the relocations apply.  Thus a
              relocation section for .text normally would have the name
              .rela.text.  This section is of type SHT_RELA.

本节中的每个重定位条目(在本例中为 Elf64_Rela 类型)应该被迭代,并且每个条目的值应该加上 .debug_info 节中的相应值.