How programs get run: ELF binaries (2015)
7 months ago
- #Kernel
- #ELF
- #Linux
- ELF(可执行与可链接格式)是现代Linux系统使用的主要二进制格式。
- 内核的ELF支持实现在`fs/binfmt_elf.c`中,其复杂度远超对`a.out`等旧格式的支持。
- 可执行文件的ELF格式必须在ELF头后包含程序头表,其中含有运行程序所需的条目。
- 内核主要关注三类程序头条目:PT_LOAD(内存段)、PT_INTERP(运行时链接器)和PT_GNU_STACK(栈可执行性)。
- 加载ELF二进制文件通过`load_elf_binary()`实现,该函数校验ELF头、处理程序头并初始化新程序的属性。
- 该过程包括设置虚拟内存、凭证和栈空间,并引入随机化以增强安全性。
- 动态链接程序使用PT_INTERP指定的运行时链接器,其加载方式与主程序类似。
- 内核通过`compat_binfmt_elf.c`支持64位系统运行32位二进制程序,该模块将函数重定向至32位兼容版本。
- `execve()`系统调用是Linux程序执行的核心,内核通过处理ELF的复杂性来完成段加载和运行时链接器调用。