很好的一本书 linker and loader 链接器和加载器
对这方面比较困惑或者需要了解的,可以看看。第0 章 引子.......................................................................................................................................10
献给...............................................................................................................................................10
介绍...............................................................................................................................................10
本书的目标读者是哪些人?.......................................................................................................10
章节摘要.......................................................................................................................................11
项目...............................................................................................................................................12
致谢...............................................................................................................................................12
联系我们.......................................................................................................................................13
第 1 章 链接和加载...........................................................................................................................14
链接器和加载器做什么?...........................................................................................................14
地址绑定:从历史的角度...........................................................................................................14
链接与加载...................................................................................................................................16
两遍链接...................................................................................................................................17
目标代码库...............................................................................................................................18
重定位和代码修改...................................................................................................................19
编译器驱动...................................................................................................................................20
链接器命令语言.......................................................................................................................21
链接:一个真实的例子...............................................................................................................22
练习...............................................................................................................................................26
第2 章 体系结构的问题...................................................................................................................27
应用程序二进制接口...................................................................................................................27
内存地址.......................................................................................................................................27
字节顺序和对齐.......................................................................................................................27
地址构成.......................................................................................................................................29
指令格式.......................................................................................................................................29
过程调用和可寻址性...................................................................................................................30
过程调用...................................................................................................................................30
数据和指令引用...........................................................................................................................32
IBM 370....................................................................................................................................32
SPARC...........................................................................................................................................34
SPARC V8.......................................................................................................................34
SPARC V9.......................................................................................................................35
Intel x86....................................................................................................................................36
分页和虚拟内存...........................................................................................................................37
----------------------- Page 4-----------------------
程序地址空间...........................................................................................................................39
映射文件...................................................................................................................................40
共享库和程序...........................................................................................................................41
位置无关代码...........................................................................................................................41
Intel 386 分段................................................................................................................................42
嵌入式体系结构...........................................................................................................................43
怪异的地址空间.......................................................................................................................44
非一致性内存...........................................................................................................................44
内存对齐...................................................................................................................................44
练习...............................................................................................................................................44
第3 章 目标文件...............................................................................................................................47
目标文件中都有什么?..................................................................................................................47
设计一个目标文件格式...........................................................................................................47
空目标文件格式: MS-DOS 的.COM 文件..................................................................................48
代码区段: nix a.out 文件............................................................................................................48
a.out 头部..................................................................................................................................50
与虚拟内存的交互...................................................................................................................51
重定位:MS-DOS EXE 文件.......................................................................................................54
符号和重定位...............................................................................................................................56
可重定位的a.out 格式..................................................................................................................56
重定位项...................................................................................................................................58
符号和字串...............................................................................................................................59
a.out 格式小结..........................................................................................................................60
nix ELF 格式..............................................................................................................................60
可重定位文件...........................................................................................................................62
ELF 可执行文件.......................................................................................................................66
ELF 格式小结...........................................................................................................................68
IBM 360目标格式........................................................................................................................68
ESD 记录..................................................................................................................................69
TXT 记录..................................................................................................................................70
RLD 记录..................................................................................................................................70
END 记录..................................................................................................................................71
小结...........................................................................................................................................71
微软可移植可执行体格式...........................................................................................................72
PE 特有区段.............................................................................................................................76
运行PE 可执行文件................................................................................................................77
PE 和COFF..............................................................................................................................78
PE 文件小结.............................................................................................................................78
Intel/Microsoft 的OMF 文件格式................................................................................................78
----------------------- Page 5-----------------------
OMF 记录.................................................................................................................................79
OMF 文件的细节.....................................................................................................................80
OMF 格式小结.........................................................................................................................82
不同目标格式的比较...................................................................................................................82
项目...............................................................................................................................................83
练习...............................................................................................................................................84
第4 章 存储空间分配.......................................................................................................................85
段和地址.......................................................................................................................................85
简单的存储布局...........................................................................................................................85
多种段类型...................................................................................................................................87
段与页面的对齐...........................................................................................................................88
公共块和其它特殊段...................................................................................................................88
公共块.......................................................................................................................................89
C++重复代码消除....................................................................................................................90
初始化和终结...........................................................................................................................92
IBM 伪寄存器..........................................................................................................................93
特殊的表...................................................................................................................................94
X86 分段的存储分配...............................................................................................................95
链接器控制脚本...........................................................................................................................96
嵌入式系统的存储分配...............................................................................................................97
实际中的存储分配.......................................................................................................................98
nix a.out 链接器的存储分配策略.........................................................................................98
ELF 中的存储分配策略...........................................................................................................99
Windows 链接器的存储分配策略.........................................................................................101
练习.............................................................................................................................................102
项目.............................................................................................................................................103
第5 章 符号管理.............................................................................................................................104
绑定和名字解析.........................................................................................................................104
符号表格式.................................................................................................................................104
模块表.....................................................................................................................................106
全局符号表.............................................................................................................................108
符号解析.................................................................................................................................109
特殊符号.................................................................................................................................110
名称修改.....................................................................................................................................110
简单的C 和Fortran 名称修改...............................................................................................110
C++类型编码:类型和范围..................................................................................................111
链接时类型检查.....................................................................................................................113
弱外部符号和其它类型符号.....................................................................................................113
维护调试信息.............................................................................................................................113
----------------------- Page 6-----------------------
行号信息.................................................................................................................................114
符号和变量信息.....................................................................................................................114
实际的问题.............................................................................................................................115
练习.............................................................................................................................................115
项目.............................................................................................................................................116
第6 章 库.........................................................................................................................................117
库的目的.....................................................................................................................................117
库的格式.....................................................................................................................................117
使用操作系统.........................................................................................................................117
NIX 和Windows 的Archive 文件......................................................................................118
扩展到 64 位..........................................................................................................................120
Intel OMF 库文件...................................................................................................................120
建立库文件.................................................................................................................................121
搜索库文件.................................................................................................................................122
性能问题.....................................................................................................................................123
弱外部符号.................................................................................................................................123
练习.............................................................................................................................................124
项目.............................................................................................................................................124
第 7 章 重定位.................................................................................................................................126
硬件和软件重定位.....................................................................................................................126
链接时重定位和加载时重定位.................................................................................................127
符号和段重定位.........................................................................................................................127
符号查找.................................................................................................................................128
基本的重定位技术.....................................................................................................................128
指令重定位.............................................................................................................................129
ECOFF 段重定位...................................................................................................................131
ELF 重定位.............................................................................................................................132
OMF 重定位...........................................................................................................................132
可重链接和重定位的输出格式.................................................................................................132
其它重定位格式.........................................................................................................................133
以链表形式组织的引用.........................................................................................................133
以位图形式组织的引用.........................................................................................................134
特殊段.....................................................................................................................................134
特殊情况的重定位.....................................................................................................................135
练习.............................................................................................................................................135
项目.............................................................................................................................................135
第8 章 加载和重叠.........................................................................................................................137
基本加载.....................................................................................................................................137
带重定位的基本加载.................................................................................................................138
----------------------- Page 7-----------------------
位置无关代码.............................................................................................................................138
TSS/360 位置无关代码..........................................................................................................138
例程指针表.............................................................................................................................140
目录表.....................................................................................................................................141
ELF 位置无关代码.................................................................................................................141
位置无关代码的开销和得益.................................................................................................143
自举加载.....................................................................................................................................144
树状结构的覆盖.........................................................................................................................145
定义覆盖.................................................................................................................................147
覆盖的实现.............................................................................................................................149
覆盖的其它细节.....................................................................................................................150
覆盖技术小结 .......................................................................................................................151
练习.............................................................................................................................................151
项目.............................................................................................................................................151
第9 章 共享库.................................................................................................................................153
绑定时间.....................................................................................................................................154
实际的共享库.........................................................................................................................155
地址空间管理.........................................................................................................................155
共享库的结构.............................................................................................................................156
创建共享库.................................................................................................................................156
创建跳转表.............................................................................................................................157
创建共享库.............................................................................................................................158
创建空占位库.........................................................................................................................158
版本命名.................................................................................................................................159
使用共享库链接.........................................................................................................................159
使用共享库运行.........................................................................................................................160
malloc hack 和其它共享库问题.................................................................................................160
练习.............................................................................................................................................163
项目.............................................................................................................................................163
第 10 章 动态链接和加载...............................................................................................................165
ELF 动态链接.............................................................................................................................165
ELF 文件内容.............................................................................................................................165
加载一个动态链接的程序.........................................................................................................168
启动动态链接器.....................................................................................................................169
库的查找.................................................................................................................................169
共享库的初始化.....................................................................................................................170
使用PLT 的惰性过程链接(lazy procedure linkage).............................................................171
动态链接的其它特性.............................................................................................................172
静态的初始化.........................................................................................................................172
----------------------- Page 8-----------------------
库的版本.................................................................................................................................173
运行时的动态链接.....................................................................................................................173
Microsoft 动态链接库.................................................................................................................174
PE 文件中的输入/输出符号 (imported and exported symbols )........................................174
惰性绑定.................................................................................................................................177
DLL 库和线程........................................................................................................................178
OSF/1 伪静态共享库..................................................................................................................178
让共享库快一些.........................................................................................................................179
几种动态链接方法的比较.........................................................................................................179
练习.............................................................................................................................................180
项目.............................................................................................................................................181
第 11 章 高级技术...........................................................................................................................182
C++的技术..................................................................................................................................182
试验链接.................................................................................................................................183
消除重复代码.........................................................................................................................184
借助于数据库的方法.............................................................................................................185
增量链接和重新链接.................................................................................................................185
链接时的垃圾收集.....................................................................................................................187
链接时优化.................................................................................................................................188
链接时代码生成.........................................................................................................................189
链接时统计和工具.................................................................................................................190
链接时汇编.............................................................................................................................190
加载时代码生成.....................................................................................................................190
Java 链接模式..............................................................................................................................191
加载Java 类............................................................................................................................192
练习.............................................................................................................................................193
项目.............................................................................................................................................194
----------------------- Page 9-----------------------
----------------------- Page 10-----------------------
第0 章 引子
$Revision: 2.2 $
$Date: 1999/06/09 00:48:48 $
献给
我的家人, 托妮亚和莎拉。
介绍
几乎从有计算机以来,链接器和加载器就是软件开发工具包中的一部分,因为他们是
允许使用模块 (而不是一个单独的大文件)来构建程序的关键工具。
早在1947年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁
带上,并将他们合并、重定位为一个程序。在上世纪60年代早期,这些加载器就已经发展
的相当完善了。由 那时内存很贵且容量有限,计算机的速度 (以今天的标准)很慢,为了
创建复杂的内存覆盖策略 (将大容量的程序加在到少量的内存中 ),以及重复编辑之前链接
过的文件 (节省重新创建程序的时间 ),这些链接器都包含了很多复杂的特性。
上世纪70到80年代,链接技术几乎没有什么进展。链接器趋向 更加简单,虚拟内存
技术将应用程序和覆盖机制中的大多数存储管理工作都转移给了操作系统,越来越快的计算
机和越来越大的磁盘也使得重新链接一个程序或替换个别模块比仅仅链接改变过的地方更加
容易了。从上世纪90年代起,由 增加了诸如动态链接共享库和C++的诸多现代特性,链接
器又开始变得复杂起来。像IA64这样具有长指令字和编译时访存调度等特性的先进处理器
架构,也需要将一些新的特性加入到链接器中以确保在被链接的程序中可以满足代码的这些
复杂需求。
本书的目标读者是哪些人?
本书预计供下述几类读者使用。
?学生:由于链接过程看起来似乎是微不足道和显而易见的,编译器构建和操作系统
课程通常对链接和加载都缺乏重视。这对 以前讨论Fortan,Pascal,C,和不使
用内存映射或共享库的操作系统而言可能是对的,但是现在就不那么正确了。
C++,Java和其它的面向对象语言需要更加完善的链接环境。使用内存映射的可执
行程序,共享库,和动态链接影响了一个操作系统的很多部分,一个忽略链接问题
的操作系统设计者将承担巨大的风险。
?实习程序员也需要知道链接器都做了什么,尤其是对现代语言。C++在链接器中放
置了不少独特的特性,而大型C++程序容易发生难以诊断的bug也是由 在链接时
发生了不可预料的事情(最常见的情况是静态构造函数没有按照程序员预计的顺序
执行 )。 当正确使用时,诸如共享库和动态链接此类的链接器特性将(给程序员
----------------------- Page 11-----------------------
的工作 )带来很大的灵活性和强大支持。
? 语言设计者和开发人员应该在构建语言和编译器时了解链接器会做什么和能做什么。
由于可以由链接器处理某些细节,那些手工进行了30多年的编程任务今天在C++中
可以自动处理了(想一想在C语言中为了获取和C++中的模板相同的功能,或为了
保证在程序主体执行之前使成百个C源文件中的初始化例程可以执行,程序员不得
不做的那堆事情)。有了功能更强大的链接器的支持,未来的语言将更加自动化而
不仅限于程序范畴内的常规任务。由于链接是编译过程中将整个程序的代码放在一
起处理并可对程序作为一个整体施加影响的唯一阶段,因此链接器还将被加入更多
的全局程序优化功能。
(编写链接器的人员当然都需要本书。但是全球所有的链接器设计者大概只能坐满一个
房间,而且其中有半数因为审阅手稿已经拥有本书了。 )
章节摘要
第 1章,链接和加载,对链接的过程进行了一个简短的历史回顾,并讨论链接过程中的
各个阶段,最后以一个可由输入目标文件产生显示“Hello,world”程序的简单却完整的链
接器实例结束本章。
第2章,体系结构问题,以链接器设计的角度来回顾计算机体系结构。这里会以典型的
精简指令集体系结构的SPARC,古老而富有活力的寄存器 内存体系结构的IBM 360/370,以
及自成一派的Intel x86体系结构为例。在每种体系结构中,会讨论包括内存架构、程序寻
址架构和地址布局等重要方面。
第 3章,目标文件,探究了目标文件和可执行文件的内部结构。本章从最简单的MS
DOS .COM文件开始,进而分析包括DOS的EXE,Wondows的COFF和PE (EXE和DLL),UNIX
的a.out和ELF,以及Intel/Microsoft的OMF等更加复杂的文件。
第4章,存贮分配,涵盖了链接过程的第一个阶段,即为被链接程序的各段分配存储空
间,跟以实际的链接器来举例。
第 5章,符号管理,涵盖符号的绑定和解析,这是一个将某个文件中引用的另一个文件
的符号解析为机器地址的过程。
第6章,库,涵盖目标代码库的创建和使用,以及库的结构和性能问题。
第 7章,重定位,涵盖地址重定位,即将程序内的目标代码调整为可以反映其运行时实
际地址的过程。这里同样谈到了位置无关代码 (PIC),这种代码是通过无需重定位的方法
建立的,并讨论了这种方法的优势和代价。
第8章,加载和覆盖,涵盖了加载过程,即将程序从文件中取出装入计算机内存以运行。
本章还讨论了一种古老而有效的节省存储空间的树结构覆盖技术。
第9章,共享库,讨论了在不同程序中共享一个库代码的单一拷贝需要做哪些工作。本
章将注意力放在静态链接的共享库上。
第 10章,动态链接和加载,将第9章的讨论延伸至动态链接的共享库。本章详细说明
了两个实例,Win32的动态链接库 (DLLs),和Unix/Linux 的ELF共享库。
第 11章,高级技术,着眼于成熟的现代链接器所做的一些变化。讨论C++需要的新特
----------------------- Page 12-----------------------
性,包括编译命名格式(name mangling),全局构造与析构函数,模板扩充,和冗余代码的
消除。此外还包括如增量链接,链接时垃圾收集,链接时代码生成和优化,加载时代码生成,
统计和性能监视。本章对Java的链接模式进行了简要阐述,相对于本书涉及的其它链接器
它被认为更具有语义上的复杂性。
第 12章,参考文献,这是一个带有说明的参考书目 (第 12章没有翻译,也没有归入翻
译稿中)。
项目
从第 3章到第 11章有一个持续的实践项目,使用perl语言开发一个小但可用的链接器。
尽管perl不那么像是实现产品级链接器时所使用的编程语言,但对一个学期内要完成的项
目而言是很好的选择。Perl处理了很多在C/C++编程中会拖延编程速度的许多低层编程细节,
好让学生把精力集中在当前项目的算法和数据结构上。在当前很多的计算机上,Perl是免
费的,包括Windows 95/98和NT,UNIX和Linux,并且还有很多非常优秀的书籍指导新手使
用Perl (可参看12章书目中的建议 )。
第 3章最初的项目构建了一个可以以简单却完整的目标代码格式读取和写入文件的链接
器框架。后继章节不断的向它添加功能,直到最后变成一个支持共享库并可产生动态可链接
目标代码的功能完善的链接器。
Perl颇能处理二进制文件和数据结构,因此如果愿意的话,该项目的链接器可以用来
处理它自己的目标代码格式。
页:
[1]