ELF 详解

2016-06-21 linux language

ELF 的全称为 Executable and Linkable Format 用于存储 Linux 程序,可以从运行以及链接的两个视角查看,分别通过 Program Header Table 以及 Section Header Table 查看。

简介

ELF 文件的结构类似如下,包含了三个关键的索引表 ELF HeaderProgram Header Table 以及 Section Header Table

文件头部(ELF Header)
程序头部表(Program Header Table)
节区1(Section1)
节区2(Section2)
节区3(Section3)
...
节区头部表(Section Header Table)

在头文件 /usr/include/elf.h 中定义了相关的结构体。

保存格式

其中 Section Header Table 可以通过 readelf -S /bin/bash 查看,Program Header Table 通过 readelf -l /bin/bash 查看,两者会通过 ELF Header 结合起来。

$ readelf -h main
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x4004a0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          9200 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         30
  Section header string table index: 29

可以看到其长度为 64 字节。

$ hexdump -x main -n 64
0000000    457f    464c    0102    0001    0000    0000    0000    0000
0000010    0002    003e    0001    0000    04a0    0040    0000    0000
0000020    0040    0000    0000    0000    23f0    0000    0000    0000
0000030    0000    0000    0040    0038    0009    0040    001e    001d
0000040

参考