I always see ELF in some passages. And now it’s time to deeply see what it is.

ELF actually is Executable and Linkable Format. Yes, it’s a format for file (specifically for binary file such as Executable Program, Object Code and Shared Library Files)

ELF 文件的类型

  • 可重定位文件 (Relocatable File): 由源文件编译而成尚未链接的目标文件,通常以 .o 作为扩展名。用于与其它目标文件进行链接以构成可执行文件或动态链接库。
  • 可执行文件 (Executable File): 经过链接的、可执行的目标文件,就是我们通常在 Linux 中执行的程序。
  • 共享目标文件 (Shared Object File), 也叫共享库文件,包含代码和数据,这种文件是我们所称的库文件,一般以.so结尾。一般情况下,它会有以下两种使用情景:
    • 链接器 (Link eDitor, ld) 可能会处理它和其它可重定位文件以及共享目标文件,生成另外一个目标文件。
    • 动态链接器 (Dynamic Linker) 将它与可执行文件以及其它共享目标文件组合在一起生成进程镜像

ELF 文件的结构

结构概述

  • ELF 文件头表 (ELF header)

    • 记录了 ELF 文件的组织结构
  • 程序头表/段表 (Program header table)

    • 告诉系统如何创建进程
    • 生成进程的可执行文件必须拥有此结构
    • 重定位文件不一定需要
  • 节头表 (Section header table)

    • 记录了 ELF 文件的节区信息
    • 用于链接的目标文件必须拥有此结构
    • 其它类型目标文件不一定需要

段 (segment) 与节 (section)

一个段中包含多个节,段视图用于进程的内存区域的rwx权限划分,节视图用于 ELF 文件编译链接时与在磁盘上存储时的文件结构的组织

  • 代码段 (Text segment) 包含了代码与只读数据

    • .textsection
    • .rodatasection
    • .hashsection
    • .dynsymsection
    • .pltsection
    • .rel.gotsection
    • ……
  • 数据段 (Data segment) 包含了可读可写数据

    • .datasection
    • .dynamicsection
    • .gotsection
    • .got.pltsection
    • .bsssection
    • ……
  • 栈段 (Stack segment)

程序装载与虚拟内存