Skip to content

LV205-从elf文件到linux进程

一、ELF 文件

1. 是什么?

ELF(Executable and Linkable Format)文件是一种目标文件格式,用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。它主要用于 Linux 平台,用于存储和传输可执行文件和库。

常见的文件类型‌:

  • ‌可执行文件‌:包含可执行的机器代码,可直接运行。
  • ‌可重定位文件‌(.o 文件):机器代码和数据地址相对,需重定位才能运行,通常用于编译过程。
  • ‌共享对象文件(.so 文件)‌:动态链接库,包含可共享代码和数据,可在运行时被多个进程共享。
  • ‌核心转储文件‌(core 文件):程序崩溃或异常终止时生成,包含内存状态和寄存器信息,用于调试。

2. 文件格式

这里就不详细展开了,有一个中文版本的 ELF 格式文档,里面说的非常详细,可以参考:ELF 手册-中文版.pdf

二、从 EFL 文件到 linux 进程

进入正题,ELF 文件是如何转变成 Linux 进程的?首先我们要知道 Linux 创建一个新的进程需要经过两个步骤:

  • (1)父进程通过克隆方式创建子进程。
  • (2)子进程加载 ELF 文件生成新的进程地址空间。

对于用户程序来说,实现以上两个步骤需要调用 fork 和 execve 两个系统调用。

Linux 子进程的创建必须由父进程完成,因为这样的一个约束,Linux 进程之间形成了类似于家族关系的进程关系,而所有进程的共同祖先就是 1 号进程(init)。

子进程创建时需要继承父进程的关键信息才能正常工作,从父进程继承而来的信息只能保证子进程按照父进程的方式去工作。当子进程有特定的任务需要执行,此时从父进程继承的信息就没有意义了。子进程如果需要执行特定的任务,需要加载ELF文件,替换掉子进程从父进程继承的旧信息,生成新的进程信息,这样子进程就能独立工作了。

image-20260325154437752

参考资料:

从 ELF 文件到 Linux 进程