获取 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_Phdrs。现在遍历它们,它们的 .p_vaddr.p_offset 将具有相同的值。

P.S。您正在查看未使用的程序 部分 ,并且不能保证它们存在于完全 linked 二进制文件中。您 应该 改为查看程序 。使用readelf -Wl a.out检查它们。