elf文件结构解析
elf文件解析
- 1、ELF文件結構格式:
- 2、ELF頭文件解析:
- 3、ELF段表:
1、ELF文件結構格式:
| .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];//前四個字節為ELF文件魔術,第五個字節為ELF文件類,0x01為32位,0x02為64位;第6位為字節序,規定為大端緒還是小端;第7位為elf文件的版本號,后9字節未定義,可作為擴展標志
Elf32_Half e_type;//ELF文件類型,1表示可重定位文件,2表示可執行文件,3表示共享文件
Elf32_Half e_machine;//ELF文件運行平臺,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;//標志位,用來標志文件平臺等
Elf32_Half e_ehsize;//ELF文件頭大小
Elf32_Half e_phentisize;//程序頭表大小
Elf32_Half e_phnum;//程序頭表數目
Elf32_Half e_shentsize;//段表描述符大小
Elf32_Half e_shnum;//段表數量
Elf32_Half e_shstrndx;//段表字符串表所在段在段表中的下標
}Elf32_Ehdr;
我們以一個ELF文件為例,
可以看到ELF頭文件信息,我們打開以16進制打開一個這個文件
第一行前4個字節為 7F 45 4C 46,這個為ELF文件的魔數,其為DEL控制符,第5個字節為01,表示此文件為32位,第6個字節01表示小端序。與解析出的頭文件內容相一致。
第二行的前2個字節為0x0002(小端序),表示為此文件類型為可執行文件,第3,4字節為0x0003,表示在intel x86平臺運行,第5-8字節為0x00000001,表示版本號為0x1,第9-12字節為0x080484B0,表示程序的入口地址。
第三行的前四個字節為0x00002224,表示段表在文件中的偏移。第5-8個字節為0x00000000,為平臺信息,等等后面可依次解析
3、ELF段表:
成員信息如下:
由上知,elf段表的文件偏移為0x2224,找到文件偏移位置,如下
由上知第一個段表全為空,段表解析就不一一闡述,本文件的段表信息如下圖
總結
- 上一篇: input子系统基础之按键5——按键驱动
- 下一篇: android 6.0 ios9谁快,没