ELF 概述
ELF(Executable and Linkable Format)是 Linux 系统中可执行文件的标准格式。它描述了程序如何从编译后的静态库(如 .a 文件)一步步形成可执行程序,并最终加载到内存运行。通俗来说,就像一本说明书:编译时,代码被拆成多个'零件'(Section);加载时,这些零件被组装成'模块'(Segment),便于操作系统高效管理。
静态库与可执行程序
静态库(如 .a 文件)是一堆预编译代码的集合。当我们编译程序时,链接器会将这些库中的代码和我们的代码合并,生成一个 ELF 可执行文件(如 a.out)。例如,用 C 语言写一个程序并链接静态库:
gcc main.c -static -o a.out # 编译并链接静态库,生成 ELF 可执行文件
这个过程分两步:
- 编译阶段:源代码(如
.c文件)被编译成目标文件(.o),每个目标文件包含多个 Section(如代码段.text、数据段.data)。 - 链接阶段:链接器将所有目标文件和静态库合并,生成一个完整的 ELF 文件。它创建一个 Section Header Table(节表头),记录每个 Section 的大小、位置和属性(如权限)。

从静态库到可执行程序,就像拼乐高:零件(Section)被分类打包,说明书(ELF 头)告诉系统如何组装。
ELF 结构与加载原理
ELF 文件在磁盘上存储时,是一堆 Section 的集合。但加载到内存时,这些 Section 会被合并成更大的 Segment。为什么?因为内存管理以 4KB 页面为单位,小 Section 会浪费空间。合并后,Segment 能更好地匹配页面大小,减少碎片。

- 合并原则:属性相同的 Section 合并成一个 Segment。例如,所有'可读可执行'的代码 Section(如
.text)合并成代码 Segment;所有'可读可写'的数据 Section(如.data)合并成数据 Segment。 - 关键角色:
- Section Header Table:记录所有 Section 的详细信息(位置、大小、属性)。
- Program Header Table:定义合并规则,指导哪些 Section 合并成一个 Segment。
用命令查看 ls 命令的 Section 信息(ls 本身是 C 语言写的 ELF 文件):
readelf -S /bin/ls # 查看所有 Section
输出类似图片:







