概述1
在学习Elf文件的细节之前,我们先明确Elf是什么,为何要学习这种格式。
什么是Elf
Elf全称为Executable and Linkable Format,他定义了二进制可执行文件、库以及核心文件(类似于a.out)的格式结构。这个格式允许操作系统将文件翻译为对应的机器指令。一般Elf文件由编译器或链接器产生,并且是二进制格式。
为何学习这种格式
Elf文件格式分析
在linux下我们可以使用file
命令对文件格式进行分析,例如进入/bin
目录下,对ls
这个命令的可执行文件进行分析:
1 | [root@iZuf65mbkzmyfcfo9jni4qZ bin]# file ls |
可以看到他是一个64位的共享对象(竟然不是可执行对象),是动态链接的。
Elf结构
一个Elf文件由如下部分组成:
- ELF 头
- 文件数据
使用readelf
命令可以看到Elf文件的结构:
1 | [root@iZuf65mbkzmyfcfo9jni4qZ bin]# readelf -h ls |
Elf头
Elf头起始是一些魔数,提供了一些文件相关的信息,前四个十六进制数表示这是一个Elf文件:以7f开始,45=E,4c=L,46=F。