链接过程分析(二)---ELF文件基础

本文介绍了ELF文件的基础知识,包括三种类型:可重定位目标文件、可执行文件和共享库。重点分析了链接器如何将ELF文件视为Section集合,而加载器则将其视为Segment集合。通过两个视角对比,阐述了链接过程如何将Section转换为Segment,同时提到了Section Header Table和Program Header Table在不同阶段的作用。文章以max.s汇编程序为例,探讨了链接和加载过程中ELF文件的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下文字大部分来源于《Linux C编程一站式学习》一书,只是增加了本人的一些解读和注释,原书对相关问题的描述更加系统化,建议参考。

2.  ELF文件

ELF文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型:

1. 可重定位的目标文件(Relocatable,或者Object File),<=== 如max.o

2. 可执行文件(Executable),<=== 如max

3. 共享库(Shared Object,或者 Shared Library),<=== 不是本节的内容,了解个名词即可

本节以前一节提供的max.s汇编程序为目标,分析 max.o 和 max 两个文件。

ELF格式提供了两种不同的视角,对应到我们分析的实例:

1. 链接器(ld命令)把输入文件max.o(ELF格式)看成是Section的集合;

2. 加载器(输入./max敲回车后由Linux自动调用完成)把输入文件max(ELF格式)看成是Segment的集合;



图2-1

上图2-1是原书提供的一个说明图。两点说明:

1)左边是从链接器的视角来看ELF文件(max.o),开头的ELF Header描述了体系结构和操作系统等基本信息,并指出Section Header Table和Program Header Table在文件中的什么位置,Program Header Table在链接过程中用不到,所以在max.o中是可有可无的,Section Header Table中保存了所有Section的描述信息,通过Section Header Table可以找到每个Section在文件中的位置。

2)右边是从加载器的视角来看ELF文件(max),开头是ELF Header,Program Header Table中保存了所有Segment的描述信息,Section Header Table在加载过程中用不到,所以在max中是可有可无的。

从上图可以看出,一个Segment由一个或多个Section组成,这些Section加载到内存时具有相同的访问权限。有些Section只对链接器有意义,在运行时用不到,也不需要加载到内存,那么就不属于任何Segment。注意Section Header Table和Program Header Table并不是一定要位于文件的开头和结尾,其位置由ELF Header指出,上图这么画只是为了清晰。


综合来看,如下图2-2所示:


图2-2


链接过程的横跨两种ELF格式文件的两头,其输入文件(max.o)是图2-1左边的视图--Section的集合,其输出文件(max)是图2-1右边的视图--Segment的集合。所以链接过程就是把一只ELF形式转化为另一种ELF形式的过程。后面将针对链接的输入和输出文件展开详细分析,以此了解链接过程所做的具体工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值