我读过page人。它说
在ELF标头中:
e_phoff-该成员保存程序头表的文件偏移量(以字节为单位)。
e_shoff-该成员保存节头表的文件偏移量(以字节为单位)。
在程序标题中
p_offset此成员保存距文件开头的偏移量 段的第一个字节所在的位置。
节标题中
sh_offset该成员的值保存从文件开头到节中第一个字节的字节偏移量
我很困惑。在我看来,这意味着在Elf标头中,我可以看到所有程序和节标头的偏移量。在程序标题中,我可以看到文件中具体段的偏移量。在节标题中,我可以看到文件中具体节的偏移量。但这不是真的。我发现了简单的小精灵解析,并且看到了这个结果
segment offset: 52
section offset: 6032
Program Entry point: 0x8048420
Section header list:
.interp: 0x8048154
offset: 340
.note.ABI-tag: 0x8048168
offset: 360
.note.gnu.build-id: 0x8048188
offset: 392
.gnu.hash: 0x80481ac
offset: 428
.dynsym: 0x80481e8
offset: 488
.dynstr: 0x80482b8
offset: 696
.gnu.version: 0x8048342
offset: 834
.gnu.version_r: 0x804835c
offset: 860
.rel.dyn: 0x804837c
offset: 892
.rel.plt: 0x8048394
offset: 916
.init: 0x80483ac
offset: 940
.plt: 0x80483d0
offset: 976
.plt.got: 0x8048410
offset: 1040
.text: 0x8048420
offset: 1056
.fini: 0x8048604
offset: 1540
.rodata: 0x8048618
offset: 1560
.eh_frame_hdr: 0x8048628
offset: 1576
.eh_frame: 0x8048664
offset: 1636
.init_array: 0x8049efc
offset: 3836
.fini_array: 0x8049f00
offset: 3840
.dynamic: 0x8049f04
offset: 3844
.got: 0x8049ff4
offset: 4084
.got.plt: 0x804a000
offset: 4096
.data: 0x804a018
offset: 4120
.bss: 0x804a020
offset: 4128
.comment: 0x0
offset: 4128
.symtab: 0x0
offset: 4172
.strtab: 0x0
offset: 5244
.shstrtab: 0x0
offset: 5768
Program header list
Phdr segment: 0x8048034
offset: 52
Interpreter: /lib/ld-linux.so.2
offset: 340
Text segment: 0x8048000
offset: 0
Data segment: 0x8049efc
offset: 3836
Dynamic segment: 0x8049f04
offset: 3844
Note segment: 0x8048168
offset: 360
PT_GNU_EH_FRAME: 0x8048628
offset: 1576
PT_GNU_STACK: 0x0
offset: 0
PT_GNU_RELRO: 0x8049efc
offset: 3836
您可以看到Elf偏移的部分偏移= 6032,但是所有部分的偏移都小于Elf偏移。实际上,该程序中的所有节的偏移量都像6032 +(n * sizeof(Elf32_Shdr))。在这种情况下,我无法理解节标题中的偏移量是什么意思?我以为,它在过程映像中是偏移量,但是手册页在谈论文件内部的偏移量。关于程序头中的偏移量的相同问题。请说明所有相同的平均节头偏移和程序头偏移。
解析器太大,因此我没有附加它。但是如果有人需要,我会做
答案 0 :(得分:1)
实际上,该程序中的所有节的偏移量都像6032 +(n * sizeof(Elf32_Shdr))。
不,并非所有节都具有此偏移量,但节标题表中的所有节条目。
您看到的是表格的偏移量比其条目中定义的部分高。
在您的示例中:
在文件的偏移量1056开始“ .text”部分。
在文件的偏移量6032处启动节头表。它的第14个条目(在6032 + 13 * sizeof(Elf32_Shdr)处)定义了“ .text”部分,并将其偏移量设置为1056。