ELF是一种开放格式,Linux不仅将ELF用于用户空间程序和库,还有与构建模块。内核本身也是ELF格式。维基百科:ELF格式

布局和结构

ker-head.png

除了用于标示ELF文件的几个字节之外,ELF头还包含了有关文件大小的有关信息每一集文件夹在后程序执行的入口点信息。

  • 程序表头:向系统提供了可执行文件的数据在进程虚拟地址空间中组织方式的相关信息。它还表示了文件可能包含的段数目、段的文职和用途。
  • 各个段保存了与文件相关的各种形式的数据。例如:符号表、时间的二进制码、固定值(如字符串)或程序使用的数值常数。
  • 节头表:包含了与各个段相关的附加信息。

ELF 头

在文件起始处,有4个标识字节,0x7f 0x45 0x4C 0x46,代表这个是一个ELF文件。

  • 每个节都指定了一个类型,定义了节数据的予以。ORGBITS(程序必须解释的信息)、SYMTAB(符号表)、REL(重定位信息)、STRTAB(存储与ELF格式相关字符串,与程序无关,如:.text/.comment)
  • 各个节都指定了大小和二进制文件内部的偏移量。
  • 强制规定了使用.text节来保存程序代码

符号表

保存了程序实现或使用的所有全局变量和函数。如果程序引用了一个自身代码未定义的符号,则称之为未定义符号,如 使用了标准库中的printf函数。

  • 局部符号(STB_LOCAL):只在目标文件内部可见,与在其他程序的其他部分合并时,是不可见的。
  • 全局符号(STB_GLOBAL): 在定义的目标文件内可见,也可以由构成程序的其他目标文件引用。
  • 弱符号(STB_WEAK): 在整个程序内可见,但可以有多个定义。如果程序中的一个全局符号和一个局部符号名称相同,全局符号将优先处理。
Last modification:September 12, 2022
If you think my article is useful to you, please feel free to appreciate