目录
第0章 引子
献给 10
介绍 10
本书的目标读者是哪些人? 10
章节摘要 11
项目 12
致谢 12
联系我们 13
第1章 链接和加载
链接器和加载器做什么? 14
地址绑定:从历史的角度 14
链接与加载 16
两遍链接 17
目标代码库 18
重定位和代码修改 19
编译器驱动 20
链接器命令语言 21
链接:一个真实的例子 22
练习 26
第2章 体系结构的问题
应用程序二进制接口 27
内存地址 27
字节顺序和对齐 27
地址构成 29
指令格式 29
过程调用和可寻址性 30
过程调用 30
数据和指令引用 32
IBM 370 32
SPARC 34
SPARC V8 34
SPARC V9 35
Intel x86 36
分页和虚拟内存 37
程序地址空间 39
映射文件 40
共享库和程序 41
位置无关代码 41
Intel 386 分段 42
嵌入式体系结构 43
怪异的地址空间 44
非一致性内存 44
内存对齐 44
练习 44
第3章 目标文件
目标文件中都有什么? 47
设计一个目标文件格式 47
空目标文件格式: MS-DOS 的.COM 文件 48
代码区段: Unix a.out 文件 48
a.out 头部 50
与虚拟内存的交互 51
重定位:MS-DOS EXE 文件 54
符号和重定位 56
可重定位的a.out 格式 56
重定位项 58
符号和字串 59
a.out 格式小结 60
Unix 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
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
Unix a.out 链接器的存储分配策略 98
ELF 中的存储分配策略 99
Windows 链接器的存储分配策略 101
练习 102
项目 103
第5章 符号管理
绑定和名字解析 104
符号表格式 104
模块表 106
全局符号表 108
符号解析 109
特殊符号 110
名称修改 110
简单的C和Fortran名称修改 110
C++类型编码:类型和范围 111
链接时类型检查 113
弱外部符号和其它类型符号 113
维护调试信息 113
行号信息 114
符号和变量信息 114
实际的问题 115
练习 115
项目 116
第6章 库
库的目的 117
库的格式 117
使用操作系统 117
UNIX 和Windows的Archive文件 118
扩展到 64 位 120
Intel OMF 库文件 120
建立库文件 121
搜索库文件 122
性能问题 123
弱外部符号 123
练习 124
项目 124
第7章 重定位
硬件和软件重定位 126
链接时重定位和加载时重定位 127
符号和段重定位 127
符号查找 128
基本的重定位技术 128
指令重定位 129
ECOFF段重定位 131
ELF 重定位 132
OMF 重定位 132
可重链接和重定位的输出格式 132
其它重定位格式 133
以链表形式组织的引用 133
以位图形式组织的引用 134
特殊段 134
特殊情况的重定位 135
练习 135
项目 135
第8章 加载和重叠
基本加载 137
带重定位的基本加载 138
位置无关代码 138
TSS/360 位置无关代码 138
例程指针表 140
目录表 141
ELF 位置无关代码 141
位置无关代码的开销和得益 143
自举加载 144
树状结构的覆盖 145
定义覆盖 147
覆盖的实现 149
覆盖的其它细节 150
覆盖技术小结 151
练习 151
项目 151
第9章 共享库
绑定时间 154
实际的共享库 155
地址空间管理 155
共享库的结构 156
创建共享库 156
创建跳转表 157
创建共享库 158
创建空占位库 158
版本命名 159
使用共享库链接 159
使用共享库运行 160
malloc hack和其它共享库问题 160
练习 163
项目 163
第10章 动态链接和加载
ELF 动态链接 165
ELF 文件内容 165
加载一个动态链接的程序 168
启动动态链接器 169
库的查找 169
共享库的初始化 170
使用PLT 的惰性过程链接(lazy procedure linkage) 171
动态链接的其它特性 172
静态的初始化 172
库的版本 173
运行时的动态链接 173
Microsoft 动态链接库 174
PE 文件中的输入/输出符号(imported and exported symbols) 174
惰性绑定 177
DLL 库和线程 178
OSF/1 伪静态共享库 178
让共享库快一些 179
几种动态链接方法的比较 179
练习 180
项目 181
第11章 高级技术
C++的技术 182
试验链接 183
消除重复代码 184
借助于数据库的方法 185
增量链接和重新链接 185
链接时的垃圾收集 187
链接时优化 188
链接时代码生成 189
链接时统计和工具 190
链接时汇编 190
加载时代码生成 190
Java 链接模式 191
加载Java 类 192
练习 193
项目 194