ELF文件格式

ELF(Executable and Linkable Format,可执行与可链接格式)是一种常见的文件格式,主要用于Unix和类Unix系统(如Linux)中的目标代码、可执行文件、共享库和核心转储。

ELF文件格式可以表达如下三种类型的文件:

  1. 可执行文件(Executable File)

  • 可以直接被操作系统加载并执行的文件

  • 通常没有文件扩展名,或使用".exe"扩展名

  • 包含程序的完整指令和入口点

  • 可以直接运行

  1. 可重定位文件(Relocatable File)

  • 编译后的目标文件,通常以".o"结尾

  • 包含代码和数据,但尚未链接

  • 可以与其他目标文件链接生成可执行文件或共享库

  • 编译过程中的中间产物

  1. 共享目标文件(Shared Object File)

  • 动态链接库,通常以".so"结尾

  • 包含可以在运行时被多个程序共享的代码和数据

  • 支持动态链接

  • 可以在程序运行时被加载

  • 减少可执行文件大小,提高内存使用效率

示例

为了方便讲解,我们针对以下程序来解释一下ELF文件的各个部分。

#include <stdio.h>
int global_init = 0x11111111;
const int global_const = 0x22222222;
void main()
{
    static int static_var = 0x33333333;
    static int static_var_uninit;
    int auto_var = 0x44444444;
    printf("hello world!\n");
    return;
}

使用命令gcc -c test.c -o test.o 命令生成test.o文件。

ELF文件整体布局


ELF文件的整体布局可以分为以下几个部分:

1、ELF文件头(ELF Header)

  • 位于文件的最开始

  • 包含文件基本信息:文件类型(可执行、可重定位、共享库)、目标架构、文件版本、入口点地址、程序头表和节头表的位置和大小

2、程序头表(Program Header Table)

  • 告诉系统如何加载程序

  • 描述各个段(Segment)的信息

  • 指定内存中的映射方式

  • 对可执行文件和共享库很重要

3、节头表(Section Header Table)

  • 描述文件的各个节(Section)

  • 包含节的名称、大小、偏移等信息

  • 对目标文件和链接过程很重要

4、各个节(Sections) 主要包括:

  • .text:代码段

  • .data:已初始化的数据段

  • .rodata:只读数据段

  • .bss:未初始化数据段

  • .symtab:符号表

  • .strtab:字符串表

  • .dynamic:动态链接信息

  • .got:全局偏移表

  • .plt:程序链接表

5、节内容区域

  • 实际存储程序的代码、数据、符号等信息

  • 按照节头表中的描述组织

装修中