1. ELF文件格式概述
ELF文件分为:链接时的目标文件和执行时的目标文件。如下图:
ELF文件头:文件最开始的地方,包含整个文件的信息结构。
程序头表:在运行时必须要有的,告诉操作系统如何创建进程的镜像。
节:对于链接过程而言的,每个节中包含指令数据、符号数据和重定位数据等等。
段:运行时必须要有的,每个段可以包含多个节。
节头表:包含文件中节的所有信息,文件中的每个节都需要在节头表中有一个对应的注册项。
2. ELF文件头
文件头含有整个文件的结构信息。结构体表示如下:
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;//表示目标文件属于哪种类型
Elf32_Half e_machine;//处理器体系结构
Elf32_Word e_version;//文件版本
Elf32_Addr e_entry;//程序入口的虚拟地址,只有可执行文件有。
Elf32_Off e_phoff;//程序头表在文件中的偏移量,没有为0
Elf32_Off e_shoff;//节头表在文件中的偏移量
Elf32_Word e_flags;//处理器特定的标志
Elf32_Half e_ehsize;//ELF文件头的大小
Elf32_Half e_phentsize;//程序头表中每一项的大小
Elf32_Half e_phnum;//程序头表一共有多少项
Elf32_Half e_shentsize;//节头表中每一项的大小
Elf32_Half e_shnum;//节头表一共有多少项
Elf32_Half e_shstrndx;//节头表中与节名字表相对应的表项的索引。
} Elf32_Ehdr;
3. 节头表
ELF文件中包含很多“节”,这些“节”的信息都登记在节头表中,通过每一个表项可以定位到对应的节,节头表中每一个表项的数据结构如下:
typedef struct {
Elf32_Word sh_name;//本节的名字,整个名字的字符串不存储在这里,它只是一个索引,指向“字符串表”节中的某个位置
Elf32_Word sh_type;//节的类型
Elf32_Word sh_flags;