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标志位 |
重定位表
字符串表