ELF 文件介绍
前言
如果需要了解 动态加载,需要先了解需要动态加载的目标(对象):ELF 文件
Executable Files(如ELF)被广泛应用于Linux和Unix这样的操作系统平台中;它们在Windows环境下通常以.exe(如PE)或DLL的形式存在。
ELF 简介
全称:Executable and Linking Format
中文:可执行和链接格式
ELF 文件格式是 Linux/Unix 通用的二进制标准文件格式
如何理解ELF文件格式标准
就是大家都在用的二进制文件格式。
无需依赖标准 ELF 文件来构建自定义二进制文件,同样需要同时建立相应的编译器链表。由于 GNU gcc 工具链生成的结果就是 ELF 格式的文件。
ELF 文件视图
ELF 生成过程,可以查看【链接视图】 Linking View
执行视图
Segment
执行视图
执行视图

ELF 文件分类
通常分为三类的软件包中,常见的是ELF可执行文件与动态加载库so的情况。需注意动态库属于elf文件格式

- elf 应用程序, 一般分为静态链接、动态链接两种

ELF 文件查看
除了基于二进制查看编辑工具的常规方式外,在实际操作中我们通常会采用 ELF 专用解析工具来进行文件分析。例如,在实际应用中可以通过该工具来分析文件内容

ELF 文件头部查看

ELF 文件头部结构
- ELF 头部,不同的平台,如32位或者 64位是不同的(大小不同)

ELF 程序头表
Program Header Table : 可以视为是一个结构体数组的具体说明各段信息的具体内容
从数据组织形式的角度来看,在这个系统中每个单元代表一个段(Segment),整个系统的段数量决定了程序头表结构体成员的数量。


ELF 动态加载
解析 ELF 头文件内容后,在确定连接类型的基础上决定是否需要同时加载解析器(如 ldso 动态加载器)。
通常通过变量程序头表结构中是否存在PT_INTERP Segment以确定ELF应用程序是否基于动态链接。
将ELF文件加载至内存空间仅需加载指定PT_LOAD段(Segment),而非整个ELF文件内容。
虚拟地址
虚拟地址
静态链接的应用程序,默认加载地址固定,不能随便加载到其他【虚拟地址】
在加载一个segment时,请注意该segment所在的文件中的段偏移量(offset)与该segment的虚拟内存地址(virtual address)可能存在差异;计算加载起始地址时应基于虚拟内存地址(vaddress)来进行;具体而言,在计算该segment的实际物理长度时应依据指定内存块大小(memsize),而不是依据实际文件长度;若指定内存块大小(memsize)大于实际文件长度(real file size),则超出部分属于bss空间并需清除
