ELF文件格式
ELF(Executable and Linkable Format,可执行与可链接格式)是一种常见的文件格式,主要用于Unix和类Unix系统(如Linux)中的目标代码、可执行文件、共享库和核心转储。
ELF文件格式可以表达如下三种类型的文件:
可执行文件(Executable File)
可以直接被操作系统加载并执行的文件
通常没有文件扩展名,或使用".exe"扩展名
包含程序的完整指令和入口点
可以直接运行
可重定位文件(Relocatable File)
编译后的目标文件,通常以".o"结尾
包含代码和数据,但尚未链接
可以与其他目标文件链接生成可执行文件或共享库
编译过程中的中间产物
共享目标文件(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、节内容区域
实际存储程序的代码、数据、符号等信息
按照节头表中的描述组织