ELF 全称 “Executable and Linkable Format”,即可执行可链接文件
文件布局常见的ELF文件大致结构如下:
常见的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 的声明如下 :
e_ident
e_type
e_machine
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
节字符串表的节索引。
,