转自 https://blog.csdn.net/tangyuesb/article/details/54630787
ELF文件头结构定义在“/usr/include/elf.h”头文件下,ELF文件有32位版本和64位版本,故其头文件结构也有32位结构和64位结构,分别定义为Elf32_Ehdr和Elf64_Ehdr。两种版本文件内容一样,只是有些成员的大小不一样。以下是32位版本的文件头结构Elf32_Ehdr。
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;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
}Elf32_Ehdr;
由readelf -h test.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
ABI 版本: 0
类型: REL (可重定位文件)
系统架构: Intel 80386
版本: 0x1
入口点地址: 0x0
程序头起点: 0 (bytes into file)
Start of section headers: 916 (bytes into file)
标志: 0x0
本头的大小: 52 (字节)
程序头大小: 0 (字节)
Number of program headers: 0
节头大小: 40 (字节)
节头数量: 14
字符串表索引节头: 11
- 我们将Elf32_Ehdr结构与readelf命令输出的信息对比可得如下对应关系:
成员 |
readelf输出结果 |
e_ident |
Magic,类别,数据,版本,OS/ABI,ABI |
e_type |
类型 |
e_machine |
系统架构 |
e_version |
版本 |
e_entry |
入口点地址 |
e_phoff |
start of program headers |
e_shoff |
start of section headers |
e_flags |
标志 |
e_ehsize |
文件头的大小 |
e_phentsize |
程序头大小 |
e_phnum |
number of program headers |
e_shentsize |
节头大小 |
e_shnum |
number of program headers |
e_shstrndx |
字符串表段索引 |
下面我们依次分析各个部分。
魔数:
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.
文件类型:
类型: REL (可重定位文件)
e_type成员标识文件类型,ELF文件有三种类型,如下表所示。
常量标识 |
值 |
类型 |
ET_REL |
1 |
可重定位文件,一般位.o文件 |
ET_EXEC |
2 |
可执行文件 |
ET_DYN |
3 |
共享目标文件,一般位.so文件 |
系统架构:
系统架构: Intel 80386
e_machine成员标识系统架构(机器类型),ELF定义了以下多种系统架构。可在“/usr/include/elf.h”头文件中查看,以下是其中的几种
常量标识 |
值 |
系统架构 |
EM_M32 |
1 |
AT&T WE 32100 |
EM_SPARC |
2 |
SPARC |
EM_386 |
3 |
Intel 80386 |
EM_68K |
4 |
Motorola m68k family |
EM_88K |
5 |
Motorola m88k family |
EM_860 |
6 |
Intel 80860 |