ELF文件头结构定义在“/usr/include/elf.h”头文件下,ELF文件有32位版本和64位版本,故其头文件结构也有32位结构和64位结构,分别定义为Elf32_Ehdr和Elf64_Ehdr。两种版本文件内容一样,只是有些成员的大小不一样。以下是32位版本的文件头结构Elf32_Ehdr。
ELF header/格式代码如下:
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type; //它标识的是该文件的类型。
Elf32_Half e_machine; //表明运行该程序需要的体系结构。
Elf32_Word e_version; // 表示文件的版本。
Elf32_Addr e_entry; //程序的入口地址。
Elf32_Off e_phoff; //表示Program header table 在文件中的偏移量
Elf32_Off e_shoff; //表示Section header table 在文件中的偏移量
Elf32_Word e_flags; // 对IA32而言,此项为0。
Elf32_Half e_ehsize; //表示ELF header大小
Elf32_Half e_phentsize; //表示Program header table中每一个条目的大小。
Elf32_Half e_phnum; //表示Program header table中有多少个条目。
Elf32_Half e_shentsize; // 表示Section header table中的每一个条目的大小
Elf32_Half e_shnum; //表示Section header table中有多少个条目。
Elf32_Half e_shstrndx; //包含节名称的字符串是第几个节(从零开始计数
}Elf32_Ehdr;
由readelf -h libelf.o
可得如下输出:
ELF 头:
- Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
- 类别: ELF32
- 数据: 2 补码,小端序 (little endian)
- 版本:1 (current)
- OS/ABI: UNIX - System V
- .版本:0
- 类型: DYN (Share object file)
- 系统架构: ARM
- 版本:0x1
- 入口点地址:0x0
- 段头起点:52 (bytesintofile)
- 节头起点:12616 (bytesintofile)
- 标志:0x5000000 ,Version5 EABI
- 本头的大小:52 (字节)
- 段头大小(每条):32(字节)
- 段头数量: 8
- 节头大小(每条):40(字节)
- 节头数量:22
- 字符串表索引节头:21
魔数:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
7f 、45、4c、46分别对应ascii码的Del(删除)、字母E、字母L、字母F。这四个字节被称为ELF文件的魔数,操作系统在加载可执行文件时会确认魔数是否正确,如果不正确则拒绝加载。
第五个字节标识ELF文件是32位(01)还是64位(02)的。
第六个字节标识该ELF文件字节序是小端(01)还是大端(02)的。
第七个字节指示ELF文件的版本号,一般是01。
后九个字节ELF标准未做定义。一般为00.
文件类型:
e_type成员标识文件类型,ELF文件有三种类型,如下表所示。
常量标识 | 值 | 类型 |
---|---|---|
ET_REL | 1 | 可重定位文件,一般位.o文件 |
ET_EXEC | 2 | 可执行文件 |
ET_DYN | 3 | 共享目标文件,一般位.so文件 |
系统架构:
系统架构: Intel 80386、
ARM等。