Elf 文件

概述1

在学习Elf文件的细节之前,我们先明确Elf是什么,为何要学习这种格式。

什么是Elf

Elf全称为Executable and Linkable Format,他定义了二进制可执行文件、库以及核心文件(类似于a.out)的格式结构。这个格式允许操作系统将文件翻译为对应的机器指令。一般Elf文件由编译器或链接器产生,并且是二进制格式。

为何学习这种格式

Elf文件格式分析

在linux下我们可以使用file命令对文件格式进行分析,例如进入/bin目录下,对ls这个命令的可执行文件进行分析:

1
2
[root@iZuf65mbkzmyfcfo9jni4qZ bin]# file ls
ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f4154ce8a36c20d9aa270cc21c6b25ec026ac00f, stripped

可以看到他是一个64位的共享对象(竟然不是可执行对象),是动态链接的。

Elf结构

一个Elf文件由如下部分组成:

  1. ELF 头
  2. 文件数据

使用readelf命令可以看到Elf文件的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@iZuf65mbkzmyfcfo9jni4qZ bin]# readelf -h ls
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: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x5e00
Start of program headers: 64 (bytes into file)
Start of section headers: 141384 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 10
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30

Elf头

Elf头起始是一些魔数,提供了一些文件相关的信息,前四个十六进制数表示这是一个Elf文件:以7f开始,45=E,4c=L,46=F

参考文献

0%