总体结构
还是分为elf_header
,program_header_table
,section_header_table
32位为4字节,64位为8字节,结构体示例以32位为准
1. elf_header
ELF头部:描述了整个文件的基本属性,如字节序、机器类型、入口地址等。它是每个ELF文件都必须有的字段,位于文件的最开始处。
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT]; //e_ident: 16字节,标识ELF文件的魔数、编码方式、版本等信息1
Elf32_Half e_type;//2字节,标识ELF文件的类型,如可重定位文件、可执行文件、共享目标文件等
Elf32_Half e_machine;//2字节,标识目标机器的类型
Elf32_Word e_version;//2字节,标识ELF文件的版本号
Elf32_Addr e_entry;// 4或8字节,标识程序的入口虚拟地址
Elf32_Off e_phoff;// 4或8字节,标识program header table的偏移量
Elf32_Off e_shoff;// 4或8字节,标识section header table的偏移量
Elf32_Word e_flags;// 4字节,标识特定于处理器的标志
Elf32_Half e_ehsize;// 2字节,标识ELF header的大小
Elf32_Half e_phentsize;// 2字节,标识program header table中每个条目的大小
Elf32_Half e_phnum;// 2字节,标识program header table中条目的数量
Elf32_Half e_shentsize;// 2字节,标识section header table中每个条目的大小
Elf32_Half e_shnum; // 2字节,标识section header table中条目的数量
Elf32_Half e_shstrndx; // 2字节,标识section name string table在section header table中的索引
}Elf32_Ehdr;
2. program_header_table
程序头表:描述了各个段(segment)的信息,如类型、偏移、大小等。段是可执行文件或共享目标文件在内存中运行时的单位。程序头表是一个数组,每个元素是一个Elf64_Phdr结构。程序头表只对可执行文件或共享目标文件有意义,对于其他类型的目标文件,该信息可以忽略.
typedef struct {
Elf32_Word p_type;//4或8字节,标识段的类型,如可加载段、动态链接信息段、程序头表段等
Elf32_Off p_offset;// 4或8字节,标识段在文件中的偏移量
Elf32_Addr p_vaddr; //4或8字节,标识段在内存中的虚拟地址
Elf32_Addr p_paddr; // 4或8字节,标识段在物理地址空间中的地址,对于可执行文件和共享目标文件通常与p_vaddr相同(仅对某些系统有效)
Elf32_Word p_filesz;// 4或8字节,标识段在文件中的大小
Elf32_Word p_memsz;//4或8字节,标识段在内存中的大小
Elf32_Word p_flags;//4或8字节,标识段的属性,如可读、可写、可执行等
Elf32_Word p_align;// 4或8字节,标识段在文件和内存中的对齐方式
}Elf32_Phdr;
3. section_header_table
节头表:描述了各个节(section)的信息,如名称、位置、属性等。节是可重定位文件在链接时的单位。节头表也是一个数组,每个元素是一个Elf64_Shdr结构。节头表对于所有类型的目标文件都有意义,但不一定存在
typedef struct{
Elf32_Word sh_name;//4字节,标识节的名称,是一个索引值,指向节名字符串表
Elf32_Word sh_type;//4字节,标识节的类型,如空闲、可加载、符号表、重定位表等
Elf32_Word sh_flags;//4或8字节,标识节的属性,如可写、可分配、可执行等
Elf32_Addr sh_addr;//4或8字节,标识节在内存中的地址
Elf32_Off sh_offset;//4或8字节,标识节在文件中的偏移量
Elf32_Word sh_size;// 4或8字节,标识节在文件中的大小
Elf32_Word sh_link;//4字节,标识与该节相关联的另一个节的索引值
Elf32_Word sh_info;// 4字节,标识与该节相关联的额外信息
Elf32_Word sh_addralign;// 4或8字节,标识该节在文件和内存中的对齐方式
Elf32_Word sh_entsize;//4或8字节,标识该节中每个条目(如果有)的大小
}Elf32_Shdr;
4.symbol_table
symbol table
是ELF文件中存储符号信息的表,每个符号对应一个程序中的变量或函数。symbol table可以用来解析符号的名称、类型、作用域、地址等属性,方便链接器和调试器进行链接和调试。
st_name:符号名称在string table中的偏移量。
st_info:符号的类型和绑定属性,例如函数、变量、局部、全局等。
st_other:符号的其他属性,例如可见性。
st_shndx:符号所属的节索引。
st_value:符号的值,通常是符号在内存中的地址。
st_size:符号占用的字节数。
PS
1. segment 和 section的关系
segment
和section
的关系是,segment
是由多个属性相同的section
合并而成的,也就是说,一个segment
可以包含多个section
,但一个section
只能属于一个segment
。segment
和section
都是ELF文件中的逻辑划分,但segment
是用于加载到内存中执行的,而section
是用于链接器对代码重定位的