连接器和加载器 - 目录
[译序]
搞底层开发的至臻境界我想大概要算操作系统开发和编译器开发了。计算机,就其字面意义,无非是冷血废铁一块,之所以有血有肉,正是操作系统从中支撑,之所以有经有脉,那便是编译器的功劳了。然而,这血肉之躯如何令周身经脉游走自如,这周身经脉又如何牵动血肉之躯动停行止,却有如不为人知的秘密,令许多初涉底层的人感到神秘异常。这便是连接器和加载器的职责了。熟悉汇编语言程序设计的人应该知道,每当我们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章 架构问题
- 应用程序二进制接口
- 存储器地址
- 地址格式
- 指令格式
- 程序调用和可定地址性
- 数据和指令引用
- 分页和虚拟存储
- 程序地址空间
- 映射文件
- 共享库和程序
- 位置无关的代码
- Intel 386 中的分段
- 嵌入式架构
- 练习
- 第3章 目标文件
- 一个目标文件中都有什么?
- 无格式的目标格式:MS-DOS .COM文件
- 代码节:Unix a.out文件
- 重定位:MS-DOS EXE文件
- 符号和重定位
- 可重定位的a.out
- Unix ELF
- IBM 360目标格式
- ESD记录
- TXT记录
- RLD记录
- END记录
- 小结
- Microsoft可移植可执行格式
- PE专用节
- 运行一个PE可执行文件
- PE和COFF
- PE小结
- Intel/Microsoft OMF文件
- 目标格式的对比
- 项目
- 练习
- 第4章 存储器分配
- 节和地址
- 简单的存储器布局
- 多重节类型
- 节和页面对齐
- 公共块和其他特殊节
- 公共
- C++副本调动
- 初始化器和终止化器
- 特殊表
- x86节存储器分配
- 连接器控制脚本
- 嵌入式系统的存储器分配
- 实践中的存储器分配
- Unix a.out连接器中的存储器分配
- ELF中的存储器分配
- Windows连接器中的存储器分配
- 练习
- 第5章 符号管理
- 绑定和名字判定
- 符号表格式
- 名字管理
- 简单的C和Fortran名字管理
- C++类型编码:类型和作用域
- 连接时类型检查
- 弱外部符号和其他种类的符号
- 维护调试信息
- 练习
- 项目
- 第6章 库
- 库的目的
- 库格式
- 使用操作系统
- Unix和Windows存档文件
- 64位扩展
- Intel OMF库
- 创建库
- 搜索库
- 性能问题
- 练习
- 项目
- 第7章 重定位
- 硬件和软件重定位
- 连接时和加载时重定位
- 符号和节重定位
- 基本重定位技术
- 指令重定位
- ECOFF节重定位
- ELF重定位
- OMF重定位
- 可重连接和可重定位的输出格式
- 其他重定位格式
- 重定位的特殊情况
- 练习
- 项目
- 第8章 加载和复用
- 基本加载
- 带重定位的基本加载
- 位置无关的代码
- TSS/360位置无关代码
- 每例程(per-routine)指针表
- 内容表
- ELF位置无关代码
- PIC开销和优点
- 引导程序加载
- 树结构复用
- 练习
- 项目
- 第9章 共享库
- 绑定时间
- 实践中的共享库
- 地址空间管理
- 共享库的结构
- 创建共享库
- 带有共享库的连接
- 带有共享库的运行
- malloc漏洞——另一个共享库问题
- 练习
- 项目
- 第10章 动态连接和加载
- ELF动态连接
- 一个ELF文件的内容
- 加载一个动态连接的程序
- 带有PLT的程序迟连接
- 动态连接的其它特征
- 运行时动态加载
- Microsoft动态连接库
- OSF/1伪静态共享库
- 令共享库更快
- 动态连接方法的比较
- 第11章 高级技术
- C++技术
- 增量连接和重连接
- 连接时垃圾收集
- 连接时优化
- 连接时代码生成
- Java连接模型
- 练习
- 项目
- 第12章 参考
最后,让我们一起期待着这本书的出炉吧~~ 
|