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_strp
的 DW_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
节中的相应值.
我正在尝试了解 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_strp
的 DW_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
节中的相应值.