连接器和加载器 - 目录
原著:John R. Levine
原文:收藏
翻译:lover_P
[译序]
搞底层开发的至臻境界我想大概要算操作系统开发和编译器开发了。计算机,就其字面意义,无非是冷血废铁一块,之所以有血有肉,正是操作系统从中支撑,之所以有经有脉,那便是编译器的功劳了。然而,这血肉之躯如何令周身经脉游走自如,这周身经脉又如何牵动血肉之躯动停行止,却有如不为人知的秘密,令许多初涉底层的人感到神秘异常。这便是连接器和加载器的职责了。熟悉汇编语言程序设计的人应该知道,每当我们xasm后,必当link一番,源文件变成的二进制代码才肯乖乖地在特定的操作系统之上运行。而即使是link过的程序,也只是存在于磁盘或其他存储介质上的指令,如何依照操作系统的意愿将它们们搬运到内存中的指定位置并开始执行,loader功不可没。
不幸的是,现在介绍操作系统和编译原理的书籍很多,但无论哪一方面的书籍、无论哪一本书,都忽略了连接和加载这一细节问题。偶尔提到,也不过是“编译之后经过连接即可生成可执行文件”或“操作系统将可执行文件加载到内存中的指定位置开始运行”云云。令狗狗(Google)发动灵鼻,爬遍“遍布世界的蜘蛛网(World Wide Web)”也难寻有关连接器和加载器的只言片语,只有少数文章介绍了.net加载器或Java加载器,也无非是宣传其如何如何安全、如何如何快速等等,毫无实际意义可言。
然而,本书却可称得上是“唯一”一本极详细介绍连接器和加载器的文献了。本书说不上偏重理论还是实践,抑或是偏重方法,总之是一本极为实用的书。
[注]英文link一词及其衍生词(如linker、Dynamic link library)通常被翻译为“链接”、“链接器”或“动态链接库”;而我在本书的翻译过程中却将它们译为“连接”、“连接器”、“动态连接库”等,这是出于这一术语的动作特征而做出的决定。“链接”通常指根据给出的标识找到特定的目标的过程,而“连接”大有“连续地放到一起”的意味。我们知道linking这个过程指的是将一个程序各个片段的代码绑定为一个逻辑上的整体,以形成可执行程序,因此,使用“连接”一词才更为恰当。
[内容]
小目录
第0章 写在前面
第1章 连接和加载
第2章 架构问题
第3章 目标文件
第4章 存储分配
第5章 符号管理
第6章 库
第7章 重定位
第8章 加载和复用
第9章 共享库
第10章 动态连接和加载
第11章 高级技术
第12章 参考
详细目录
第0章 写在前面
献给
简介
谁应该阅读本书?
章节预览
项目
感谢
联系我们
第1章 连接和加载
连接器和加载器都做些什么?
地址绑定:一个历史性观点
连接 VS 加载
两遍连接
目标代码库
重定位和代码修正
编译驱动器
连接器命令语言
连接:一个真实的例子
练习
第2章 架构问题
应用程序二进制接口
存储器地址
字节顺序和对齐
地址格式
指令格式
程序调用和可定地址性
程序调用
数据和指令引用
IBM 370
SPARC
SPARC V8
SPARC V9
Inter x86
分页和虚拟存储
程序地址空间
映射文件
共享库和程序
位置无关的代码
Intel 386 中的分段
嵌入式架构
地址空间槽
非一致存储
存储对齐
练习
第3章 目标文件
一个目标文件中都有什么?
设计一个目标格式
无格式的目标格式:MS-DOS .COM文件
代码节:Unix a.out文件
a.out头
与虚拟存储器交互
重定位:MS-DOS EXE文件
符号和重定位
可重定位的a.out
重定位入口
符号和字符串
a.out小结
Unix ELF
可重定位文件
ELF可执行文件
ELF小结
IBM 360目标格式
ESD记录
TXT记录
RLD记录
END记录
小结
Microsoft可移植可执行格式
PE专用节
运行一个PE可执行文件
PE和COFF
PE小结
Intel/Microsoft OMF文件
OMF记录
OMF文件的细节
OMF小结
目标格式的对比
项目
练习
第4章 存储器分配
节和地址
简单的存储器布局
多重节类型
节和页面对齐
公共块和其他特殊节
公共
C++副本调动
初始化器和终止化器
特殊表
x86节存储器分配
连接器控制脚本
嵌入式系统的存储器分配
实践中的存储器分配
Unix a.out连接器中的存储器分配
ELF中的存储器分配
Windows连接器中的存储器分配
练习
第5章 符号管理
绑定和名字判定
符号表格式
模块符号表
全局符号表
符号判定
特殊符号
名字管理
简单的C和Fortran名字管理
C++类型编码:类型和作用域
连接时类型检查
弱外部符号和其他种类的符号
维护调试信息
行号信息
符号和变量信息
实践问题
练习
项目
第6章 库
库的目的
库格式
使用操作系统
Unix和Windows存档文件
Unix存档
64位扩展
Intel OMF库
创建库
搜索库
性能问题
练习
项目
第7章 重定位
硬件和软件重定位
连接时和加载时重定位
符号和节重定位
符号查找
基本重定位技术
指令重定位
x86指令重定位
SPARC指令重定位
ECOFF节重定位
ELF重定位
OMF重定位
可重连接和可重定位的输出格式
其他重定位格式
链式引用
位图
特殊段
重定位的特殊情况
练习
项目
第8章 加载和复用
基本加载
带重定位的基本加载
位置无关的代码
TSS/360位置无关代码
每例程(per-routine)指针表
内容表
ELF位置无关代码
PIC开销和优点
引导程序加载
树结构复用
复用的定义
复用的实现
复用的优点
数据
重复代码
多重区
复用小结
练习
项目
第9章 共享库
绑定时间
实践中的共享库
地址空间管理
共享库的结构
创建共享库
创建跳转表
创建共享库
创建存根库
版本名字
带有共享库的连接
带有共享库的运行
malloc漏洞——另一个共享库问题
练习
项目
第10章 动态连接和加载
ELF动态连接
一个ELF文件的内容
加载一个动态连接的程序
启动动态连接器
查找库
共享库的初始化
带有PLT的程序迟连接
动态连接的其它特征
静态初始化
库版本
运行时动态加载
Microsoft动态连接库
PE文件中的导入和导出符号
迟绑定
DLL和线程
OSF/1伪静态共享库
令共享库更快
动态连接方法的比较
第11章 高级技术
C++技术
试连接
重复代码消除
数据库方法
增量连接和重连接
连接时垃圾收集
连接时优化
连接时代码生成
连接时剖析和编配
连接时汇编器
加载时代码生成
Java连接模型
加载Java类
练习
项目
第12章 参考
Perl书籍
最后,让我们一起期待着这本书的出炉吧~~