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

来源:互联网 发布:淘宝哪家官换机是真的 编辑:程序博客网 时间:2024/05/22 08:04

以下文字大部分来源于《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形式的过程。后面将针对链接的输入和输出文件展开详细分析,以此了解链接过程所做的具体工作。

0 0