Advertisement

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空间并需清除

全部评论 (0)

还没有任何评论哟~