ELF 的全称为 Executable and Linkable Format 用于存储 Linux 程序,可以从运行以及链接的两个视角查看,分别通过 Program Header Table 以及 Section Header Table 查看。
简介
ELF 文件的结构类似如下,包含了三个关键的索引表 ELF Header
、Program 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