目录
ELF文件类型
ELF是一种文件格式,全名为可执行和可链接格式(Executable and Linkable Format)。
ELF文件主要有以下三类:
- 可重定位文件(relocatable file) 它保存了一些可以和其他目标文件链接并生成可执行文件或者共享库的二进制代码和数据。一般为.o文件,静态链接库属于可重定位文件。
- 可执行文件(excutable file)它保存了适合直接加载到内存中执行的二进制程序。
- 共享库文件(shared object file)一种特殊的可重定位目标文件,可以在加载或者运行时被动态的加载进内存并链接。一般为.so文件。
有两种情况可以使用:
- 链接器将其与其他可重定位文件、共享目标文件链接成新的目标文件
- 动态连接器将其与其他共享目标文件,结合一个可执行文件,创建进程映像。
ELF文件主要由4部分组成:
- ELF Header
- ELF Program Header Table (或称Program Headers、程序头)
- ELF Section Header Table (或称Section Headers、节头表)
- ELF Sections
ELF Header
每个ELF文件都存在一个ELF Header用来描述其结构和组成。ELF Header对应的是一个结构体,结构体定义如下:
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT]; //包含一个magic number、ABI信息,该文件使用的平台、大小端规则
uint16_t e_type; //文件类型,表示该文件属于可执行文件、可重定位文件、core dump文件或共享库
uint16_t e_machine; //机器类型,ELF文件的CPI平台属性
uint32_t e_version; //通常都是1
ElfN_Addr e_entry; //表示程序执行的入口地址
ElfN_Off e_phoff; //表示Program Header的入口偏移量(以字节为单位)
ElfN_Off e_shoff; //表示Section Header的入口偏移量(以字节为单位)
uint32_t e_flags; //保存了这个ELF文件相关的特定处理器的flag
uint16_t e_ehsize; //表示ELF Header大小(以字节为单位)
uint16_t e_phentsize; //表示Program Header大小(以字节为单位)
uint16_t e_phnum; //表示Program Header数量(十进制)
uint16_t e_shentsize; //表示Section Header大小(以字节为单位)
uint16_t e_shnum; //表示Section Header数量(十进制)
uint16_t e_shstrndx; //表示字符串表的索引,字符串表用来保存ELF文件中的字符串,如段名,变量名。然后通过字符串在表中的偏移访问字符串
}ElfN_Ehdr;
ElfN_Addr Unsigned program address,uintN_t
ElfN_OFF Unsigned file offset,uintN_t
可以使用readelf工具来查看ELF Header
$ readelf -h hello.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 792 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size