如何查看ELF文件中记录的部分布局信息?

时间:2016-07-07 14:54:39

标签: ld elf objdump

假设以下链接描述文件用于布局可执行文件。

SECTIONS
{
. = 0x10000;
.text : { *(.text) }
.data : { *(.data) }
.bss  : { *(.bss) }
}

OUTPUT_FORMAT(ELF)

我的问题是:

  1. 我认为这样的布局信息必须存储在输出ELF文件中,以便 loader 可以根据该信息加载可执行文件。右

  2. 如果1为真,那么如何在ELF中查看此类布局信息? objdump的?

3 个答案:

答案 0 :(得分:1)

  
      
  1. 我认为这样的布局信息必须存储在输出ELF文件中,以便加载程序可以根据该信息加载可执行文件。正确?
  2.   

ELF代表可执行和链接格式。

.text.data等是链接格式的一部分。虽然通常存在于完全链接的二进制文件中,但它们可以被剥离。

加载程序加载可执行文件所需的信息存储为 segments Elf{36,64}_Phdr[])表。

  
      
  1. 如果1为真,如何在ELF中查看此类布局信息? objdump的?
  2.   

您可以使用readelf -Wl a.out检查细分(以及,如果存在可选的部分表,则部分到细分的映射)。

答案 1 :(得分:0)

我搜索了一下,找到了一些东西。

For 1.根据ELF format on wikipedia,有program headers记录地址布局信息。

For 2. readelf是一个很有前途的工具。

答案 2 :(得分:0)

您可以通过查看-Sreadelf选项的输出,从链接器命令脚本中推断出信息。

$ readelf -S $(which ls)
There are 28 section headers, starting at offset 0x1f6f8:

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] .note.gnu.build-i NOTE             0000000000400274  00000274
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
       0000000000000104  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000004003a0  000003a0
       0000000000000c48  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           0000000000400fe8  00000fe8
       0000000000000582  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           000000000040156a  0000156a
...

如果您想知道它的来源,请查看工具链的默认链接器命令脚本;如果您没有显式创建自己的默认值,则使用此默认值。我认为它们之间可能存在一些遗传,但我无法肯定地说。

$ ls -l /usr/lib/ldscripts/ | grep elf
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.x
-rw-r--r-- 1 root root 8880 Mar 22 04:05 elf32_x86_64.xbn
-rw-r--r-- 1 root root 8706 Mar 22 04:05 elf32_x86_64.xc
-rw-r--r-- 1 root root 9024 Mar 22 04:05 elf32_x86_64.xd
-rw-r--r-- 1 root root 8720 Mar 22 04:05 elf32_x86_64.xdc
-rw-r--r-- 1 root root 8680 Mar 22 04:05 elf32_x86_64.xdw
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.xn
-rw-r--r-- 1 root root 5443 Mar 22 04:05 elf32_x86_64.xr
-rw-r--r-- 1 root root 8551 Mar 22 04:05 elf32_x86_64.xs
-rw-r--r-- 1 root root 8247 Mar 22 04:05 elf32_x86_64.xsc
-rw-r--r-- 1 root root 8207 Mar 22 04:05 elf32_x86_64.xsw
-rw-r--r-- 1 root root 5489 Mar 22 04:05 elf32_x86_64.xu
-rw-r--r-- 1 root root 8666 Mar 22 04:05 elf32_x86_64.xw
-rw-r--r-- 1 root root 8396 Mar 22 04:05 elf_i386.x
-rw-r--r-- 1 root root 8249 Mar 22 04:05 elf_i386.xbn
-rw-r--r-- 1 root root 8209 Mar 22 04:05 elf_i386.xc
-rw-r--r-- 1 root root 8389 Mar 22 04:05 elf_i386.xd
-rw-r--r-- 1 root root 8219 Mar 22 04:05 elf_i386.xdc
...