ELF文件系列第一篇ELF文件的静态结构概述

前言

在看uboot编译过程时发现最终生成u-boot.bin文件时生成了一个ELF格式的中间文件u-boot,后来对ELF文件了解了一下后发现平时用的对象文件、可执行文件和库文件都是ELF格式的。考虑到平时一直在使用这些文件却对他们知之甚少,因此从这里开始系统学习一下ELF文件格式。

UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通用对象文件格式)、ELF(Executable and Linking Format 可执行和链接格式)

关于 ELF 格式

ELF(Executable and Linking Format),即“可执行可连接格式”。ELF 文件格式规范由 TIS(Tool Interface Standards – 工具接口标准)委员会制定,最初由 UNIX系统实验室(UNIX System Laboratories – USL)做为应用程序二进制接口(Application Binary Interface - ABI)的一部分而制定和发布。

ELF 的最大特点在于它有比较广泛的适用性,通用的二进制接口定义使之可以移植到多种不同的操作环境上。这样,不需要为每一种操作系统都定义一套不同的接口,因此减少了软件的重复编码与编译,加强了软件的可移植性。

这种接口包括目标标志格式可执行文件格式,以及调试信息的格式

ELF(v1.2)规范把 ELF 格式分为了三个层次。第一层是基本的部分,即格式中通用的部分,这部分在各种处理器架构和操作系统上都是相同的;第二层是处理器的扩展部分,这部分会因处理器架构的不同而不同;第三层是操作系统的扩展部分,这部分内容在不同的操作系统下面也可能是不同的。

ELF 文件的格式

ELF文件是由汇编器(assembler)和连接编辑器(link editor)生成的,它有三种类型:

  1. 可重定位文件(Relocatable file):用于与其它目标文件进行连接以构建可执行文件或动态链接库。可重定位文件就是常说的目标文件(.o文件),之所以称其为“可重定位”,是因为在这些文件中,如果引用到其它目标文件或库文件中定义的符号(变量或者函数)的话,只是给出一个名字,这里还并不知道这个符号在哪里,其具体的地址是什么。需要在连接的过程中,把对这些外部符号的引用重新定位到其真正定义的位置上,所以称目标文件为“可重定位”或者“待重定位”的。

  2. 可执行件(Executable file):经过连接的,可以执行的程序文件。

  3. 可被共享的目标文件(Shared object file):即动态连接库文件。它在以下两种情况下被使用:第一,在连接过程中与其它动态链接库或可重定位文件一起构建新的目标文件;第二,在可执行文件被加载的过程中,被动态链接到新的进程中,成为运行代码的一部分。

  4. 核心转储文件(Core Dump):核心转储文件是进程终止时内存映像的一个文件。core文件更详细内容参见man 5 core

如前所述,ELF文件的作用有两个,一是用于构建程序,构建动态链接库或都可执行程序,主要体现在连接的过程;二是用于运行程序。在这两种情况下,对于同一个目标文件,当它分别被用于连接和用于执行的时候,其特性是不一样的,所关注的内容也不一样。

ELF 文件头 (ELF header):位于文件的最开始处,包含有整个文件的结构信息。

(section):是专用于连接过程而言的,在每个“节”中包含有指令数据、符号数据、重定位数据等等。 

程序头表 (program header table):在运行过程中是必须的,在连接过程中是可选的,因为它的作用是告诉系统如何创建进程的镜像。 

节头表 (section header table):包含有文件中所有“节”的信息。在连接视图中,“节头表”是必须存在的,文件里的每一个“节”都需要在“节头表”中有一个对应的注册项,这个注册项描述了节的名字、大小等等。

在上图中,程序头表紧跟在 ELF 文件头之后,节头表紧跟在节信息之后,但在实际的文件中,这个顺序并不是固定的。在 ELF 文件的各个组成部分中,只有ELF 文件头的位置是固定的,其它内容的位置全都可变

下一篇文章细说ELF文件的文件头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值