ELF文件结构描述
文件头
查看文件头 $ readelf -h *.obj
Elf32_Ehdr
变量名 | 英文名 | 备注 |
---|---|---|
e_ident | Magic | ELF魔数 |
Class | 文件机器字节长度 | |
Data | 数据存储方式 | |
Version | 版本 | |
OS/ABI | 运行平台 | |
ABI Version | ABI版本 | |
e_type | Type | ELF文件类型(ELF重定位类型) |
e_machine | Machine | ELF文件的CPU平台属性(硬件平台) |
e_version | Version | ELF版本号(硬件平台版本) |
e_entry | Entry point address | 入口地址 |
e_phoff | Start of program headers | 程序头入口 |
e_shoff | Start of section headers | 段表在文件中的偏移 |
e_word | Flags | ELF标志位 |
e_ehsize | Size of this header | ELF文件头本身的大小 |
e_phentsize | Size of program headers | 程序头长度 |
e_phnum | Number of program headers | 程序头数量 |
e_shentsize | Size of section headers | 段表描述符的大小 |
e_shnum | Number of section headers | 段表描述符数量 |
e_shstrndx | Section header string table index | 段表字符串表所载的段在段表中的下标 |
段表
查看段表结构 $ readelf -S *.obj
段表的结构比较简单,它是一个以“Elf32_Shdr”结构体为元素的数组。数组元素的个数等于段的个数,每个结构体对应一个段。“Elf32_Shdr”又被称为段描述符。
Elf32_Shdr
变量名 | 英文名 | 备注 |
---|---|---|
sh_name | Section name | 段名 |
sh_type | Section type | 段的类型 |
sh_flags | Section flag | 段的标志位 |
sh_addr | Section Address | 段虚拟地址 |
sh_offset | Section Offset | 段偏移 |
sh_size | Section Size | 段的长度 |
sh_link和sh_info | Section Link and Section Information | 段链接信息 |
sh_addralign | Section Address Alignment | 段地址对齐 |
sh_entsize | Section Entry Size | 项的长度 |
Name | sh_type | sh_flag | sh_link | sh_info |
---|---|---|---|---|
.dynamic | SHT_DYNAMIC | SHF_ALLOC + SHF_WRITE | 该段所使用的字符串表在段表中的下标 | 0 |
.hash | SHT_HASH | SHF_ALLOC | 该段所使用的符号表在段表中的下标 | 0 |
SHT_REL | 该段所使用的相应符号表在段表中的下标 | 该重定位表所作用的段在段表中的下标 | ||
SHT_RELA | ||||
.symtab | SHT_STMTAB | 同字符串表 | 操作系统相关的 | 操作系统相关的 |
SHT_DYNSYM | ||||
.bss | SHT_NOBITS | SHF_ALLOC + SHF_WRITE | SHN_UNDEF | 0 |
.comment | SHT_PROGBITS | none | ||
.data | SHF_ALLOC + SHF_WRITE | |||
.data1 | SHF_ALLOC + SHF_WRITE | |||
.debug | none | |||
.line | none | |||
.rodata | SHF_ALLOC | |||
.rodata1 | SHF_ALLOC | |||
.text | SHF_ALLOC + SHF_EXECINSTR | |||
.note | SHT_NOTE | none | ||
.shstrtab | SHT_STRTAB | none | ||
.strtab | 如果该ELF文件中有可装载的段须要用到该字符串表,name该字符串表也将被装载到进程空间,则有SHF_ALLOC标志位 |