Hasty Briefsbeta

双语

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的复杂性来完成段加载和运行时链接器调用。