概述
- ELF(Executable and Linkable Format,可执行可链接格式),比如
- ELF文件的组成部分
- 可执行头部(Executable Header,Ehdr)
- 程序头部(Program Header,Phdr)
- 分区(Section)
- 分区头部(Section Header,Shdr)
可执行头部
- 位于/usr/include/elf.h,比如64位ELF文件,对应于Elf64_Ehdr
- 魔法数字、文件信息 –> e_ident[16]
- 魔法数字,用于识别ELF文件
- ELF文件信息
- EI_CLASS(32位/64位) –> ELFCLASS32(1)、ELFCLASS64(2)
- EI_DATA(小端/大端) –> ELFDATA2LSB(1)、ELFDATA2MSB(2)
- EI_VERSION(ELF规范的版本) –> 1
- EI_OSABI(UNIX System V ABI) –> 0
- EI_ABIVERSION(OSABI的版本) –> 0
- 填充
- 两种接口
- 应用程序接口(Application Program Interface,API) –> 应用程序和应用程序之间的接口
- 应用二进制接口(Application Binary Interface,ABI) –> 应用程序和操作系统之间的接口
- 更多信息 –> e_type、e_machine、e_version、e_entry、e_flags
- e_type –> ELF文件类型,比如
- ET_EXEC –> 可执行文件
- ET_REL –> 可重定位的对象文件
- ET_DYN –> 可动态链接的共享库
- e_machine –> 机器,比如
- EM_X86_64 –> 64位X86
- EM_ARM –> ARM
- e_version –> ELF规范的版本
- e_entry –> 入口点
- e_flags –> 机器相关的标志
- X86为0,其他机器(比如嵌入式ARM)可能会设置标志
- 分区和分段 –> e_shoff、e_phoff
- ELF文件的两种视角
- 分区(Section) –> 链接时使用,静态程序
- 分段(Segment) –> 运行时使用,动态进程
分区头部和分区
程序头部