​​​ELF 全称 “Executable and Linkable Format”,即可执行可链接文件

什么是elf格式文件(ELF格式详解一)(1)

文件布局

常见的ELF文件大致结构如下:

什么是elf格式文件(ELF格式详解一)(2)

常见的ELF格式如上图所示,左边为链接视图,右边为执行视图。

链接视图:

静态链接器(即编译后参与生成最终ELF过程的链接器,如ld )会以链接视图解析 ELF。编译时生成的 .o(目标文件)以及链接后的 .so (共享库)均可通过链接视图解析,链接视图可以没有段表(如目标文件不会有段表)。

执行视图:

动态链接器(即加载器,如 x86 架构 linux 下的 /lib/ld-linux.so.2 或者安卓系统下的 /system/linker 均为动态链接器)会以执行视图解析ELF并动态链接,执行视图可以没有节表。

文件头

ELF 的结构声明位于系统头文件 elf.h 中,ELF 格式分为 32 位与 64 位两种,除了重定位类型稍有区别,其它大致相同,为了简化描述,后续说明将省略 32/64 字样。

ELF Header 的声明如下 :

什么是elf格式文件(ELF格式详解一)(3)

e_ident

什么是elf格式文件(ELF格式详解一)(4)

e_type

什么是elf格式文件(ELF格式详解一)(5)

e_machine

什么是elf格式文件(ELF格式详解一)(6)

e_verison

文件版本,目前常见的ELF 文件版本均为EV_CURRENT(1)。

e_entry

入口虚拟地址。

e_phoff

段表文件偏移。

e_shoff

节表文件偏移。

e_flags

处理器特定的标志,一般为0。

e_ehsize

Elf_Header的大小(字节)

e_phentsize

段头(Program Header)的大小(字节)。

e_phnum

段的数量。

e_shentsize

节头(Section Header)的大小(字节)。

e_shnum

字的数量。

e_shstrndx

节字符串表的节索引。

,