前言
在 Linux 世界里,我们每天都在和各种可执行程序打交道:ls、gcc、自己编译的二进制文件……这些文件并非杂乱的机器码堆砌,而是遵循一套标准格式——ELF(Executable and Linkable Format,可执行与可链接格式)。它是 Linux 二进制文件的'身份证',更是操作系统加载、运行程序的核心依据。
本文将带你吃透ELF 文件结构,并一步步拆解可执行程序从触发执行到正式运行的完整加载流程,既有底层原理,也有实操验证,帮你彻底理解 Linux 程序的'诞生与启动'。
一、ELF 文件:Linux 二进制的标准载体
ELF 并非只代表可执行程序,它是一套通用的二进制格式标准,覆盖了 Linux 编译、链接、运行全生命周期的文件类型。相比老旧的 a.out 格式,ELF 具备跨架构、可扩展、双视角解析(链接/加载)的优势,成为 Unix-like 系统的主流二进制格式。
实战示例:生成并查看目标文件
// hello.c
#include<stdio.h>
void run(); // 声明外部函数
int main()
{
printf("hello world!\n");
run();
return 0;
}
// code.c
#include<stdio.h>
void run()
{
printf("running...\n");
}
编译生成目标文件:
# 编译源码生成目标文件(-c:只编译不链接)
gcc -c hello.c code.c
# 查看生成的目标文件
ls -l *.o
# 验证文件类型(确认是 ELF 格式)
file hello.o

relocatable:表示该 ELF 文件是'可重定位文件'(目标文件类型);- :表示文件保留了符号表等调试信息。











