___________________________________________
EXECUTABLE AND LINKABLE FORMAT (ELF)
ELF(可执行链接格式)手册
Portable Formats Specification, Version 1.1
Tool Interface Standards (TIS)
___________________________________________
1. 目标文件(Object file) 3
序言 3
文件格式 3
数据表示 4
ELF Header 5
ELF 鉴别(Identification) 8
节 11
特殊节 18
字符串表String Table 22
符号表Symbol Table 23
符号值Symbol Values 27
重定位Relocation 27
重定位类型Relocation Types 29
2. 程序装入和动态链接PROGRAM LOADING AND DYNAMIC LINKING 33
序言 33
程序头Program Header 34
基地址Base Address 36
注释节 37
程序载入Program Loading 39
动态链接Dynamic Linking 41
动态链接器Dynamic Linker 41
动态节Dynamic Section 43
共享Object的依赖关系 47
GOT全局偏移量表Global Offset Table 49
PLT过程链接表Procedure Linkage Table 50
哈希表Hash Table 52
初始化和终止函数Initialization and Termination Functions 53
3. C LIBRARY 54
**可执行链接格式 (ELF) 简介**
ELF,全称为Executable and Linkable Format,是一种在多种UNIX系统及其变种上广泛使用的对象文件格式。它为编译器、链接器、加载器和运行时环境提供了一种标准化的数据结构,用于存储代码和数据。ELF 手册是描述这种格式的规范,由Tool Interface Standards (TIS)组织发布,版本为1.1。
**目标文件 (Object File)**
目标文件是编译器将源代码转换后的中间产物,包含机器语言指令、符号表、重定位信息等。在ELF中,目标文件分为多个节(Section),每个节包含特定类型的数据,如代码、数据、常量字符串等。ELF Header位于文件开头,提供了文件的基本信息,包括文件类型、机器架构、节表位置等。鉴别部分则用于识别文件是否为ELF格式,并给出文件的版本信息。
**ELF Header**
ELF Header包含了关于整个ELF文件的元数据,如文件类型(可执行文件、共享库、对象文件等)、机器架构(如x86、ARM等)、ELF版本、入口点地址(程序启动执行的地址)、节表的大小和位置等。
**节 (Section)**
节是ELF文件的基本组成单元,用于组织不同类型的程序数据。常规节如.text(代码段)、.data(初始化数据)、.bss(未初始化数据)等,特殊节如.debug(调试信息)、.symtab(符号表)、.rela(重定位信息)等。每个节都有自己的名称、类型、属性和在内存中的布局。
**字符串表 (String Table)**
字符串表是ELF文件中存储字符串的区域,通常用于保存节名、符号名等。它是一个连续的字符序列,每个字符串以空字符结尾。
**符号表 (Symbol Table)**
符号表记录了文件中的函数、变量和其他标识符的位置和属性。每个符号条目包括符号的名字、类型、绑定(全局、局部等)、可见性(公共、私有等)以及在文件或内存中的地址。
**符号值 (Symbol Values)**
符号值表示符号在文件或内存中的地址或大小。这包括定义的符号(如函数或变量)和未定义的符号(通常由其他文件提供)。
**重定位 (Relocation)**
重定位是链接器处理的过程,用于修正代码和数据中的相对地址,确保它们在最终的可执行文件或共享库中正确指向。重定位类型定义了不同的修正规则,如直接添加、加法表达式等。
**动态链接 (Dynamic Linking)**
动态链接允许程序在运行时加载和链接所需的库,而不是在编译时静态地包含它们。动态链接器负责解析和应用重定位信息,创建符号的全局地址,使得程序可以使用库中的函数和数据。
**动态链接器 (Dynamic Linker)**
动态链接器是操作系统的一部分,它在程序启动时执行,解析程序的动态链接信息,加载必要的共享对象,并执行必要的重定位操作。
**动态节 (Dynamic Section)**
动态节包含有关动态链接的信息,如需要加载的库、动态链接器的路径、符号解析规则等。
**全局偏移量表 (GOT)**
全局偏移量表用于存储对全局符号的间接引用,以支持动态链接。在运行时,GOT中的条目会被动态链接器填充为正确的地址。
**过程链接表 (PLT)**
过程链接表是动态链接的一个关键机制,它允许程序调用未在本地代码中直接解析的函数。PLT条目包含跳转到动态链接器的指令,后者会提供实际的函数地址。
**哈希表 (Hash Table)**
哈希表用于加速符号查找,特别是对于大型动态链接库。它根据符号名字计算哈希值,从而快速定位到符号表中的对应条目。
**初始化和终止函数 (Initialization and Termination Functions)**
程序中可以包含初始化和终止函数,它们在程序启动前和退出后执行,用于完成特定的设置或清理工作。
**C 库**
虽然ELF主要涉及二进制文件格式,但C库是与之紧密相关的,因为它提供了许多系统调用和标准函数的实现,这些功能在大多数ELF程序中都会用到。
ELF格式是构建、链接和执行程序的基础,其详细的手册是理解这些过程和调试工具的关键参考。通过掌握ELF,开发者能更好地理解和优化他们的软件。
- 1
- 2
- 3
前往页