Back

/ 4 min read

ELF文件结构学习(施工中)

简介

ELF全称Executable and Linkable Format翻译过来称为可执行和可链接格式,是Unix和类Unix系统下的可执行文件格式。ELF文件格式是一种通用的、可扩展的、可重定位的、可共享的、可执行的二进制文件格式。ELF文件格式是Linux下的标准可执行文件格式,也是Linux下的动态链接库文件格式。

常见的ELF文件

文件类型后缀/常见名称描述主要用途
可执行文件(无后缀)包含可以直接在操作系统上执行的程序代码和数据。它们通常是最终用户运行的程序。应用程序、系统工具、游戏等
可重定位文件.o也称为目标文件,包含编译后的代码和数据,但尚未链接成可执行文件或共享库。它们是链接器的输入。编译过程中的中间产物,用于链接生成可执行文件或共享库
共享库/动态链接库.so包含可以被多个程序共享的代码和数据。它们在程序运行时被加载到内存中,允许多个程序共享同一份库代码,节省内存空间。在 Windows 系统中,类似的文件是 .dll提供可重用的代码库,例如 glibc、libstdc++ 等
核心转储文件core当程序崩溃时,操作系统会将程序当时的内存状态保存到核心转储文件中。这对于调试程序崩溃的原因非常有用。调试程序崩溃问题
静态库.a包含一组可重定位文件的归档。链接器在链接时会将静态库中需要的代码和数据复制到最终的可执行文件中。与共享库不同,静态库的代码会被复制到每个使用它的程序中。提供可重用的代码库,链接时嵌入到可执行文件中
内核模块.koLinux 内核模块是可以在运行时动态加载和卸载到内核中的代码。它们用于扩展内核的功能,例如添加设备驱动程序或文件系统支持。扩展 Linux 内核功能

ELF通常由以下部分组成:

  1. ELF头部(ELF Header),所有ELF文件都包含这个头部,它描述了文件的整体结构。
  2. 程序头部(Program Header),只有可执行文件和共享库文件包含这个头部,它描述了程序在内存中的布局。
  3. 节头部(Section Header),所有ELF文件都包含这个头部,它描述了文件中的节的布局。
  4. 节(Section),包含程序的代码、数据、符号表等信息。

ELF头部

typedef struct elf32_hdr {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry; /* Entry point */
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;

e_ident e_ident大小为16字节,包含了文件的魔数和文件的类别等信息。 前4个字节是ELF文件的魔数,用于标识文件是否是ELF文件,值为0x7FELF

e_ident结构