ELF头简介

​ 在linux中我们常用readelf指令来读取ELF (Executable and Linkable Format) 文件中的信息,本文主要介绍ELF头的基本信息

ELF文件结构

ELF头

elf头是位于elf文件的头部,里面存储着一些机器和该ELF文件的基本信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf64_Half e_type;
Elf64_Half e_machine;
Elf64_Word e_version;
Elf64_Addr e_entry;
Elf64_Off e_phoff;
Elf64_Off e_shoff;
Elf64_Word e_flags;
Elf64_Half e_ehsize;
Elf64_Half e_phentsize;
Elf64_Half e_phnum;
Elf64_Half e_shentsize;
Elf64_Half e_shnum;
Elf64_Half e_shstrndx;
} Elf64_Ehdr;

我们分别介绍其含义


1、e_ident

  • 长度:16字节
  • 简介:包含着文件和操作系统信息
Magic Num - e_ident[0:3]

​ 前四个字节包含着一个 magic number,表示该文件是一个 ELF 文件

EI_Class - e_ident[4]

​ 指示文件类型,是ELF32还是ELF64位

EI_DATA - e_ident[5]

​ 指示文件的编码方式,是大端法还是小端法

ELFDATA2LSB - 小端法

ELFDATA2MSB - 大端法

EI_Version - e_ident[6]

​ 标识ELF Version, 该值等于EV_CURRENT,目前为1

EI_OSABI - e_ident[7]

​ 表示着该文件运行的操作系统

操作系统类型对应
EI_ABIVERSION - e_ident[8]

​ 标志着 ABI (应用二进制接口)的版本,ABI相当于硬件层级的API(见下图)

ABI解释
EI_PAD - e_ident[8:15]

​ 填充位,用零填充用以对齐,可以预留给未来使用

2、e_type

  • 长度:2字节

  • 简介:指示文件类型

3、e_machine

  • 长度:2字节

  • 简介:指示机器类型

    部分机器类型

4、e_version

长度:4字节

简介:指示文件版本

5、e_entry

长度:4字节(32位)/8字节(64位)

简介:进程开始的虚拟地址

6、e_phoff

长度:4字节(32位)/8字节(64位)

简介:指向程序头部表的开始

7、e_shoff

长度:4字节(32位)/8字节(64位)

简介:指向节头部表的开始

8、e_flags

长度:4字节

简介:意义取决于目标架构

9、e_ehsize

长度:2字节

简介:该文件头部的大小

10、e_phentsize

长度:2字节

简介:程序头部的大小

11、e_phnum

长度:2字节

简介:程序头部的条目数

12、e_shentsize

长度:2字节

简介:节头部表的大小

13、e_shnum

长度:2字节

简介:节头部表的条目数

14、e_shstrndx

长度:2字节

简介:节头部表的条目和其位置 (idx) 的对应关系


Reference

[1] https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

[2] https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!