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标志位

重定位表

字符串表

原文地址:https://www.cnblogs.com/fr-ruiyang/p/10445800.html