获取 ELF 文件中的虚拟地址和偏移量之间的差异
Getting difference between virtual address and Offset in an ELF file
特定二进制文件的 readelf -S
给出以下输出
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000000a7c 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 0000000000400cf8 00000cf8
.
.
.
第一个部分 .interp
的虚拟地址和偏移量之间的差异是 0x400000
。我很好奇:
- 这是怎么计算的?
- 是否有程序化的方法来确定这一点?
how is this calculated?
您刚刚自己计算的:0x400238 - 0x238 == 0x400000
。你的问题可能是 "why is this particular address selected?".
这是 Linux x86_64
位置 dependent 二进制文件的默认 link-at 地址。您可以使用 -Ttext=...
linker 标志更改该地址。 ix86
(32 位)二进制文件的默认值不同:它是 0x8048000
.
我不确定为什么选择这些特定的默认值。
Is there a programmatic way of determining this?
当然:从文件开头读取 Elf64_Ehdr
。它会告诉你程序头开始的偏移量(.e_phoff
)。寻找那个偏移量,然后读取 Elf64_Phdr
s。现在遍历它们,它们的 .p_vaddr
和 .p_offset
将具有相同的值。
P.S。您正在查看未使用的程序 部分 ,并且不能保证它们存在于完全 linked 二进制文件中。您 应该 改为查看程序 段 。使用readelf -Wl a.out
检查它们。
readelf -S
给出以下输出
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000000a7c 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 0000000000400cf8 00000cf8
.
.
.
第一个部分 .interp
的虚拟地址和偏移量之间的差异是 0x400000
。我很好奇:
- 这是怎么计算的?
- 是否有程序化的方法来确定这一点?
how is this calculated?
您刚刚自己计算的:0x400238 - 0x238 == 0x400000
。你的问题可能是 "why is this particular address selected?".
这是 Linux x86_64
位置 dependent 二进制文件的默认 link-at 地址。您可以使用 -Ttext=...
linker 标志更改该地址。 ix86
(32 位)二进制文件的默认值不同:它是 0x8048000
.
我不确定为什么选择这些特定的默认值。
Is there a programmatic way of determining this?
当然:从文件开头读取 Elf64_Ehdr
。它会告诉你程序头开始的偏移量(.e_phoff
)。寻找那个偏移量,然后读取 Elf64_Phdr
s。现在遍历它们,它们的 .p_vaddr
和 .p_offset
将具有相同的值。
P.S。您正在查看未使用的程序 部分 ,并且不能保证它们存在于完全 linked 二进制文件中。您 应该 改为查看程序 段 。使用readelf -Wl a.out
检查它们。