elf文件结构解析
elf文件解析
- 1、ELF文件結(jié)構(gòu)格式:
- 2、ELF頭文件解析:
- 3、ELF段表:
1、ELF文件結(jié)構(gòu)格式:
| .text |
| .data |
| .bss |
| … |
| section header table |
| string tables |
| symbol tables |
| … |
elf文件頭包含了整個文件的基本屬性,如文件版本,入口地址等,接著就是ELF文件的各個段
2、ELF頭文件解析:
linux定義了自己的一套變量體系,如下
| Elf32_Addr | 32位版本程序地址 | 4 |
| Elf32_Half | 32位版本的無符號短整形 | 2 |
| Elf32_Off | 32位版本的偏移地址 | 4 |
| Elf32_Sword | 32位版本有符號整形 | 4 |
| Elf32_Word | 32位版本無符號整形 | 4 |
| Elf64_Addr | 64位版本程序地址 | 8 |
| Elf64_Half | 64位版本的無符號短整形 | 2 |
| Elf64_Off | 64位版本的偏移地址 | 8 |
| Elf64_Sword | 64位版本有符號整形 | 4 |
| Elf64_Word | 64位版本無符號整形 | 4 |
以32位版本為例,其頭定義如下
typedef struct{
unsigned char e_ident[16];//前四個字節(jié)為ELF文件魔術(shù),第五個字節(jié)為ELF文件類,0x01為32位,0x02為64位;第6位為字節(jié)序,規(guī)定為大端緒還是小端;第7位為elf文件的版本號,后9字節(jié)未定義,可作為擴(kuò)展標(biāo)志
Elf32_Half e_type;//ELF文件類型,1表示可重定位文件,2表示可執(zhí)行文件,3表示共享文件
Elf32_Half e_machine;//ELF文件運(yùn)行平臺,1為AT&T WE 32100,2為SPARC,3為intel x86,4為Motorola 68000,5為Motorola 88000,6為intel 80860,
Elf32_Word e_version;//elf版本號
Elf32_Addr e_entry;//程序入口地址
Elf32_Off e_phoff;//程序表頭文件偏移
Elf32_Off e_shoff;//段表在FOA中的便宜
Elf32_Word e_flags;//標(biāo)志位,用來標(biāo)志文件平臺等
Elf32_Half e_ehsize;//ELF文件頭大小
Elf32_Half e_phentisize;//程序頭表大小
Elf32_Half e_phnum;//程序頭表數(shù)目
Elf32_Half e_shentsize;//段表描述符大小
Elf32_Half e_shnum;//段表數(shù)量
Elf32_Half e_shstrndx;//段表字符串表所在段在段表中的下標(biāo)
}Elf32_Ehdr;
我們以一個ELF文件為例,
可以看到ELF頭文件信息,我們打開以16進(jìn)制打開一個這個文件
第一行前4個字節(jié)為 7F 45 4C 46,這個為ELF文件的魔數(shù),其為DEL控制符,第5個字節(jié)為01,表示此文件為32位,第6個字節(jié)01表示小端序。與解析出的頭文件內(nèi)容相一致。
第二行的前2個字節(jié)為0x0002(小端序),表示為此文件類型為可執(zhí)行文件,第3,4字節(jié)為0x0003,表示在intel x86平臺運(yùn)行,第5-8字節(jié)為0x00000001,表示版本號為0x1,第9-12字節(jié)為0x080484B0,表示程序的入口地址。
第三行的前四個字節(jié)為0x00002224,表示段表在文件中的偏移。第5-8個字節(jié)為0x00000000,為平臺信息,等等后面可依次解析
3、ELF段表:
成員信息如下:
由上知,elf段表的文件偏移為0x2224,找到文件偏移位置,如下
由上知第一個段表全為空,段表解析就不一一闡述,本文件的段表信息如下圖
總結(jié)
- 上一篇: input子系统基础之按键5——按键驱动
- 下一篇: android 6.0 ios9谁快,没