ELF文件格式

ELF(Executable and Linkable Format),是一种广泛应用于Linux等系统可执行文件、目标文件以及库文件组织格式。在Linux上,用户空间应用程序、库文件、内核模块以及内核本身都以ELF格式存在。Linkable和Executable文件格式稍有差异。
ELF文件格式

  • ELF Header:指定文件格式和大小,或者文件在加载运行时的入口位置
  • Program Header Table:主要用户可执行文件,对Linkable为非必须字段,指定可执行文件的各个段在进程虚拟地址空间中的分布,段的数量、位置以及每个段的作用
  • Sections:实际的数据或者代码段等
  • Section Header Table:提供了section的额外信息,对Executable文件为非必须字段
ELF文件格式
文章图片
ELF file Layout ELF实例
通过readelf工具可以解析ELF文件信息,file工具也可以识别ELF基本信息。下面c程序可以编译生成对应的object文件和executable文件,通过readelf可以对其进行解析:
#includeint add (int a, int b) { printf("Numbers are added together\n"); return a+b; }int main(void) { int a,b; a = 3; b = 4; int ret = add(a,b); printf("Result: %u\n"); exit(0); }

编译:
$ gcc main.c -o test
【ELF文件格式】$ gcc main.c -c -o test.o
$ ls
main.ctesttest.o
$
$ file test*
test: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]=893f61a5f9e6714e1377e5a2d08925bccb35b446, not stripped
test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
可以看到编译结果以及file命令看到的信息,接下来可以通过readelf应用具体看看前面提到各个组成部分的具体信息。
ELF Header
$ readelf -h test
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:0x5c0
Start of program headers:64 (bytes into file)
Start of section headers:6560 (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:29
Section header string table index: 28
Magic:以0x7f开始,紧接着ELF的ASCII码信息E (0x45), L (0x4c), and F (0x46),作为ELF文件格式头部识别信息
Class:此处为ELF64,这里的二进制是在x86_64机器上编译的,如果为IA32或者ARM等架构,则为ELF32
$ uname -a
Linux ubuntu 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Type:EXEC(Executable File)

    推荐阅读