文章结构:
1:二进制文件(对象文件)
导论:
ELF头:
节(sections):
字符串表(string table):
变量表(symbol table):
重定位(relocations):
2:程序执行(加载)和动态链接
程序头(Program header):
程序加载(Program Loading):
动态链接(Dynamic Linking):
3:C (语言) 库(C Library):
C 库
图表目录:(文章中包含的表格目录)
图表1-1:Linux二进制文件格式(对像文件格式)
图表1-2:32位数据类型(定义在elf.h头文件中)
图表1-3:ELF 头(可执行和可链接文件头结构)
图表1-4:e_ident[] (ELF)标识索引
图表1-5:ELFDATA2LSB 数据编码
图表1-6:ELFDATA2MSB数据编码
图表1-7:32位Intel架构鉴别e_ident
图表1-8:特定类型节索引(在这里将section翻译为‘节’ ,下文也将继续这样翻译)。
图表1-9:节头结构体
图表1-10:节类型 sh_type
图表1-11:节头表入口:索引0(这个图表可能不会翻译,而会放置原文截图)
图表1-12:节属性标志sh_flags
图表1-13:对sh_link sh_info的阐述
图表1-14:特殊的节(专用节)
图表1-15:字符表索引
图表1-16:符号表入口结构体
图表1-17:ELF32_ST_BIND符号绑定
图表1-18:ELF32_ST_TYPE符号类型
图表1-19:符号类型入口:索引0(这个图表可能不会被翻译,仍然是原文截图)
图表1-20:重定位入口
图表1-21:可重定位的域
图表1-22:重定位类型
图表2-1:程序头(结构体)
图表2-2:段类型p_type
图表2-3:NOTE节信息
图表2-4:一个note段的例子
图表2-5:可执行文件(linux)
图表2-6:程序头段
以后的图表会根据翻译逐步跟进。
导论:
ELF:可执行和可链接文件格式
ELF最初是UNIX系统实验试(USL)作为应用程序二进制接口(ABI)开发发布的。工具接口标准委员会(TIS)选择了ELF标准作为一系列运行在32位intel架构环境下的开源系统的可移植对像文件格式。
ELF标准意图通过使(假设)开发者有一套可在不同开源环境中通用的二进制接口定义来简单化软件开发[1]。这样可以减小不同接口实例的数量,从而减小对代码重编码和重编译的需求。
【译者的话1:当然这样不同的开源系统或环境中编译的对象文件都有相同的接口定义】
关于本文
本文针对为32位硬件环境下的各种开源系统创建(编写)可执行文件或对象文件的开发者,它(的内容)被分割成了以下的三部分。
第一部分:“对像文件” 描述三种主要类型对像文件(可执行文件,可链接文件,库文件)的ELF格式。
第二部分:“程序加载和动态链接”,描述对像文件的信息和系统创建运行程序时的行为。
第三部分:“C库”罗列出了libsys(标准C库)中包含的所有符号(函数),ANSI C 标准和libc例程,libc要求的全局数据符号例程(变量)。
第一部分:对像文件(OBJECT FILE)
译者序:
在英文中的object file直译为对象文件,在这里也译为对像文件。ABI是一个专有名词,是application binary interface 的首字母缩写,意为应用程序二进制接口。当然我片文章的目的就是介绍一种应用程序的二进制接口。我之所以译这扯文章是因为,它是GNU的一部分,是很重要的一部分,作为一个开源的项目,每个成员都没有义务去把它翻译成别国语言。说真的我也想为它而作一些事情,现在就慢慢的将它翻译成中文,我希望想了解这个组织的中国人能够找到一部分关于这个组织文章的能够读懂的翻译,而不是用百度翻译等翻译过来的,不知所云的翻译。在这里,我将Section翻译为“节”,这个翻译也大多数翻译中所采取的,很多书目和资料也有相同的称谓。对于很多的专有名词当第一次出现的时候我会解释,但当第二次出现的时候我很可能用已经用过的词比如ANSI它是美国国家标准学会的意思,在以后出现的时候我就不会再去解释了。
导言:
第一部分描述了被叫做ELF(可执行和可链接格式)的iABI(应用程序二进制接口)对象文件的格式。有三种主要的对象文件各式:
1.可重定位文件:包含了代码和数据,适用于和其它对象文件链接,以创建可执行或共享的对象文件。
2.可执行文件:一个适于执行的程序文件,这个文件详细指定了exec(BA_OS)如何创建一个进程映像。
3.共享文件:这个文件包含代码和数据,适于链接到两种不同的内容。首先,它可以被链接器链接到某一其它的可重定位或共享库文件中[详细内容见ld(SD_CMD)]以创建其它的对象文件。其次,它可以被动态链接器与其它的共享文件和可执行文件一起合拼创建一个(完整的)进程映像。
由汇编器和链接器创建的对象文件是以直接执行在某一CPU上为目的的。依靠解释器运行的程序(角本,解释语言等)如shell角本等不属于对象文件。
介绍性的材料过后,(下面的)第一部分将着重于文件的格式,以及文件格式与建立程序之间的关联。第二部分也介绍了对象文件的几个部分,集中描述执行一个程序必要的信息上。
文件格式