资源简介
◆ 本书对装载、链接和库进行了深入浅出的剖析,并且辅以大量的例子和图表,可以作为计算机软件专业和其他相关专业大学本科高年级学生深入学习系统软件的参考书。同时,还可作为各行业从事软件开发的工程师、研究人员以及其他对系统软件实现机制和技术感兴趣者的自学教材。
◆ 本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何与应用程序代码静态链接,应用程序如何被装载到内存中并开始运行,动态链接如何实现,C/C++运行库的工作原理,以及操作系统提供的系统服务是如何被调用的。每个技术专题都配备了大量图、表和代码实例,力求将复杂的机制以简洁的形式表达出来。本书最后还提供了一个小巧且跨平台的C/C++运行库MiniCRT,综合展示了与运行库相关的各种技术。
◆ 这是一本深人阐述链接、装载和库等问题的优秀图书,读来让人愉悦,你从巾可以清晰地了解程序的前世今生,彻底理解敲人的代码如何变成程序任系统中运行。通读本书不管对于开发还是trouble shootin都会很有帮助。建议每一位希望从事系统开发、或希望更实务地理解操作系统和编译器、或不满足于只写代码的优秀程序员都拥有这样一本书。
——邹飞,趋势科技(中国)研发中心资深软件工程师
◆ 本书从大处着眼,小处着手,以通俗易懂的语言,深入浅出地对系统软件的底层形成机制进行条分缕析,正合药山禅师所谓“高高山顶立,深深海底行”。循着作者的思绪一路走来,有如醍醐灌顶。畅快淋漓。非常高兴有预览此书初稿的宝贵机会,我在浏览书稿和查核相关资料的过程中,学到了很多以前未知或知之不深的内容。
——冯亮,阿里巴巴(中国)网络技术有限公司运维部系统架构师
作者简介/出版社简介
书 名|程序员的自我修养
副标题|链接、装载与库
作 者|俞甲子,石凡,潘爱民
ISBN|9787121085116
页 数|459页
定 价|65.00元
出版社|电子工业出版社
出版时间|2009-4-1
开 本|16开
目录
{目录}
内容 | 页码 |
导读 | 13 |
目录 | 16 |
第 1 部分 简介 | 16 |
第一章 温故而知新 | 26 |
1.1 从Hello World说起 | 27 |
1.2 万变不离其宗 | 28 |
1.3 站得高,望得远 | 31 |
1.4 操作系统做什么 | 33 |
1.4.1不要让CPU打盹 | 33 |
1.4.2设备驱动 | 34 |
1.5 内存不够怎么办 | 37 |
1.5.1 关于隔离 | 38 |
1.5.2 分段 | 38 |
1.5.3 分页 | 40 |
1.6 众人拾柴火焰高 | 42 |
1.6.1 线程基础 | 42 |
1.6.2 线程安全 | 47 |
1.6.3 多线程内部情况 | 53 |
1.7 本章小结 | 56 |
第 2 部分 静态链接 | |
第 2 章 编译和链接 | |
2.1 被隐藏了的过程 | 61 |
2.1.1 预编译 | 62 |
2.1.2 编译 | 63 |
2.1.3 汇编 | 63 |
2.1.4 链接 | 64 |
2.2 编译器做了什么 | 64 |
2.2.1 词法分析 | 65 |
2.2.2 语法分析 | 66 |
2.2.3 语义分析 | 67 |
2.2.4 中间语言生产 | 68 |
2.2.5 目标代码生成与优化 | 70 |
2.3 链接器年龄比编译器长 | 71 |
2.4 模块拼装----静态链接 | 73 |
2.5 本章小结 | 76 |
第 3 章 目标文件里有什么 | 78 |
3.1 目标文件的格式 | 79 |
3.2 目标文件是什么样的 | 81 |
3.3 挖掘 SimpleSection.o | 84 |
3.3.1 代码段 | 87 |
3.3.2 数据段和只读数据段 | 88 |
3.3.3 BSS 段 | 89 |
3.3.4 其他段 | 90 |
3.4 ELF 文件结构描述 | 91 |
3.4.1 文件头 | 92 |
3.4.2 段表 | 97 |
3.4.3 重定位表 | 102 |
3.4.4 字符串表 | 103 |
3.5 链接的接口----符号 | 104 |
3.5.1 ELF 符号表结构 | 105 |
3.5.2 特殊符号 | 108 |
3.5.3 符号修饰与函数签名 | 109 |
3.5.4 extern "C" | 113 |
3.5.5 弱符号与强符号 | 115 |
3.6 调试信息 | 117 |
3.7 本章小结 | 118 |
第 4 章 静态链接 | 120 |
4.1 空间与地址分配 | 121 |
4.1.1 按序叠加 | 121 |
4.1.2 相似段合并 | 122 |
4.1.3 符号地址的确定 | 126 |
4.2 符号解析与重定位 | 126 |
4.2.1 重定位 | 126 |
4.2.2 重定位表 | 129 |
4.2.3 符号解析 | 131 |
4.2.4 指令修正方式 | 132 |
4.3 COMMON 块 | 134 |
4.4 C++相关问题 | 135 |
4.4.1 重复代码消除 | 136 |
4.4.2 全局构造与析构 | 137 |
4.4.3 C++与 ABI | 138 |
4.5 静态库链接 | 140 |
4.6 链接过程控制 | 146 |
4.6.1 链接控制脚本 | 146 |
4.6.2 最 "小" 的程序 | 147 |
4.6.3 使用 ld 链接脚本 | 150 |
4.6.4 ld 链接脚本语法简介 | 151 |
4.7 BFD 库 | 154 |
4.8 本章小结 | 155 |
第 5 章 Windows PE/COFF | 156 |
5.1 Windows 的二进制文件格式 PE/COFF | 157 |
5.2 PE 的前身----COFF | 158 |
5.3 链接指示信息 | 162 |
5.4 调试信息 | 163 |
5.5 大家都有符号表 | 164 |
5.6 Windows 下的 ELF----PE | 165 |
5.6.1 PE 数据目录 | 168 |
5.7 本章小结 | 169 |
第 3 部分 装载与动态链接 | 170 |
第 6 章 可执行文件的装载与进程 | 172 |
6.1 进程虚拟地址空间 | 173 |
PAE | 175 |
6.2 装载的方式 | 176 |
6.2.1 覆盖装入 | 176 |
6.2.2 页映射 | 178 |
6.3 从操作系统角度看可执行文件的装载 | 180 |
6.3.1 进程的建立 | 180 |
6.3.2 页错误 | 182 |
6.4 进程虚存空间分布 | 183 |
6.4.1 ELF 文件链接视图和执行视图 | 183 |
6.4.2 堆和栈 | 189 |
6.4.3 堆的最大申请数量 | 191 |
6.4.4 段地址对齐 | 192 |
6.4.5 进程栈初始化 | 194 |
6.5 Linux 内核装载 ELF 过程简介 | 196 |
6.6 Windows PE 的装载 | 198 |
6.7 本章小结 | 200 |
第 7 章 动态链接 | 202 |
7.1 为什么要动态链接 | 203 |
7.2 简单的动态链接例子 | 207 |
7.3 地址无关代码 | 211 |
7.3.1 固定装载地址的困扰 | 211 |
7.3.2 装载时重定位 | 212 |
7.3.3 地址无关代码 | 213 |
7.3.4 共享模块的全局变量问题 | 220 |
7.3.5 数据段地址无关性 | 222 |
7.4 延迟绑定(PLT) | 223 |
7.5 动态链接相关结构 | 225 |
7.5.1 ".interp" 段 | 226 |
7.5.2 ".dynamic" 段 | 227 |
7.5.3 动态符号表 | 229 |
7.5.4 动态链接重定位表 | 230 |
7.5.5 动态链接时进程堆栈初始化信息 | 234 |
7.6 动态链接的步骤和实现 | 237 |
7.6.1 动态链接器自举 | 237 |
7.6.2 装载共享对象 | 238 |
全局符号介入 | 241 |
7.6.3 重定位和初始化 | 241 |
7.6.4 Linux 动态链接器实现 | 242 |
7.7 显式运行时链接 | 244 |
7.7.1 dlopen() | 245 |
7.7.2 dlsym() | 246 |
7.7.3 dlerror() | 247 |
7.7.4 dlclose() | 247 |
7.7.5 运行时装载的演示程序 | 248 |
7.8 本章小结 | 251 |
第 8 章 Linux 共享库的组织 | 252 |
8.1 共享库版本 | 253 |
8.1.1 共享库兼容性 | 253 |
8.1.2 共享库版本命名 | 255 |
8.1.3 SO-NAME | 256 |
8.2 符号版本 | 258 |
8.2.1 基于符号的版本控制 | 259 |
8.2.2 Solaris 中的符号版本控制 | 260 |
8.2.3 Linux 中的符号版本 | 262 |
8.3 共享库系统路径 | 264 |
8.4 共享库查找过程 | 264 |
8.5 环境变量 | 265 |
8.6 共享库的创建和安装 | 268 |
8.6.1 共享库的创建 | 268 |
8.6.2 清除符号信息 | 269 |
8.6.3 共享库的安装 | 269 |
8.6.4 共享库构造和析构函数 | 270 |
8.6.5 共享库脚本 | 271 |
8.7 本章小结 | 271 |
第 9 章 Windows 下的动态链接 | 272 |
9.1 DLL 简介 | 273 |
9.1.1 进程地址空间和内存管理 | 273 |
9.1.2 基地址和 RVA | 274 |
9.1.3 DLL 共享数据段 | 274 |
9.1.4 DLL 的简单例子 | 274 |
9.1.5 创建 DLL | 275 |
9.1.6 使用 DLL | 276 |
9.1.7 使用模块定义文件 | 277 |
9.1.8 DLL 显式运行时链接 | 279 |
9.2 符号导出导入表 | 280 |
9.2.1 导出表 | 280 |
9.2.2 EXP 文件 | 284 |
9.2.3 导出重定向 | 284 |
9.2.4 导入表 | 284 |
9.2.5 导入函数的调用 | 288 |
9.3 DLL 优化 | 289 |
9.3.1 重定基地址 | 290 |
9.3.2 序号 | 293 |
9.3.3 导入函数绑定 | 294 |
9.4 C++ 与动态链接 | 296 |
9.5 DLL HELL | 299 |
9.6 本章小结 | 302 |
第 4 部分 库与运行库 | 304 |
第 10 章 内存 | 306 |
10.1 程序的内存布局 | 307 |
10.2 栈与调用惯例 | 309 |
10.2.1 什么是栈 | 309 |
10.2.2 调用惯例 | 316 |
10.2.3 函数返回值传递 | 322 |
10.3 堆与内存管理 | 328 |
10.3.1 什么是堆 | 328 |
10.3.2 Linux 进程堆管理 | 329 |
10.3.3 Windows 进程堆管理 | 331 |
10.3.4 堆分配算法 | 334 |
10.4 本章小结 | 338 |
第 11 章 运行库 | 340 |
11.1 入口函数和程序初始化 | 341 |
11.1.1 程序从 main 开始吗 | 341 |
11.1.2 入口函数如何实现 | 342 |
11.1.3 运行库与 I/O | 350 |
11.1.4 MSVC CRT 的入口函数初始化 | 352 |
11.2 C/C++ 运行库 | 358 |
11.2.1 C 语言运行库 | 358 |
11.2.2 C 语言标准库 | 359 |
11.2.3 glibc 与 MSVC CRT | 363 |
11.3 运行库与多线程 | 373 |
11.3.1 CRT 的多线程困扰 | 373 |
11.3.2 CRT 改进 | 375 |
11.3.3 线程局部存储实现 | 376 |
11.4 C++ 全局构造与析构 | 380 |
11.4.1 glibc全局构造与析构 | 381 |
11.4.2 MSVC CRT 的全局构造和析构 | 387 |
11.5 fread 实现 | 391 |
11.5.1 缓冲 | 392 |
11.5.2 fread_s | 393 |
11.5.3 fread_nolock_s | 394 |
11.5.4 _read | 399 |
11.5.5 文本换行 | 400 |
11.5.6 fread 回顾 | 403 |
11.6 本章小结 | 404 |
第 12 章系统调用与 API | 406 |
12.1 系统调用介绍 | 407 |
12.1.1 什么是系统调用 | 407 |
12.1.2 Linux 系统调用 | 408 |
12.1.3 系统调用的弊端 | 410 |
12.2 系统调用原理 | 411 |
12.2.1 特权级与中断 | 411 |
12.2.2 基于 int 的 Linux 的经典系统调用实现 | 413 |
12.2.3 Linux 的新型系统调用机制 | 422 |
12.3 Windows API | 424 |
12.3.1 Windows API 概览 | 425 |
12.3.2 为什么要使用 Windows API | 427 |
12.3.3 API 与子系统 | 431 |
12.4 本章小结 | 433 |
第 13 章 运行库实现 | 434 |
13.1 C 语言运行库 | 435 |
13.1.1 开始 | 436 |
13.1.2 堆的实现 | 440 |
13.1.3 IO 与文件操作 | 443 |
13.1.4 字符串相关操作 | 448 |
13.1.5 格式化字符串 | 449 |
13.2 如何使用 Mini CRT | 452 |
13.3 C++ 运行库实现 | 456 |
13.3.1 new 与 delete | 458 |
13.3.2 C++ 全局构造与析构 | 460 |
13.3.3 atexit 实现 | 462 |
13.3.4 入口函数修改 | 464 |
13.3.5 stream 与 string | 465 |
13.4 如何使用 Mini CRT++ | 469 |
13.5 本章小结 | 471 |
附录 A | 472 |
A.1 字节序(Byte Order) | 473 |
A.2 ELF 常见段 | 474 |
A.3 常用开发工具命令行参考 | 476 |
A.3.1 gcc,GCC 编译器 | 476 |
A.3.2 ld,GNU 链接器 | 477 |
A.3.3 objdump,GNU 目标文件可执行文件查看器 | 477 |
A.3.4 cl,MSVC 编译器 | 478 |
A.3.5 link,MSVC 链接器 | 478 |
A.3.6 dumpbin,MSVC 的 COFF/PE 文件查看器 | 479 |
索引 | 480 |
链接:http://pan.baidu.com/s/1jIjZ5m2
页:
[1]