更新时间:2023-02-23 15:59:46
封面
版权页
内容简介
译者序
前言
第1章 多任务操作系统基础
1.1 一些有用的抽象概念
1.2 存储器层次结构与缓存策略
1.3 虚拟内存
1.4 虚拟地址
1.5 进程的内存划分方案
1.6 二进制文件、编译器、链接器与装载器的作用
1.7 小结
第2章 程序生命周期阶段基础
2.1 基本假设
2.2 编写代码
2.3 编译阶段
2.3.1 基本概念
2.3.2 相关概念
2.3.3 编译的各个阶段
2.3.4 目标文件属性
2.3.5 编译过程的局限性
2.4 链接
2.4.1 链接阶段
2.4.2 链接器视角
2.5 可执行文件属性
2.5.1 各种节的类型
2.5.2 各种符号类型
第3章 加载程序执行阶段
3.1 shell的重要性
3.2 内核的作用
3.3 装载器的作用
3.3.1 装载器视角下的二进制文件(节与段)
3.3.2 程序加载阶段
3.4 程序执行入口点
3.4.1 装载器查找入口点
3.4.2 _start()函数的作用
3.4.3 __libc_start_main()函数的作用
3.4.4 栈和调用惯例
第4章 重用概念的作用
4.1 静态库
4.2 动态库
4.2.1 动态库和共享库
4.2.2 动态链接详解
4.2.3 Windows平台中动态链接的特点
4.2.4 动态库的特点
4.2.5 应用程序二进制接口
4.3 静态库和动态库对比
4.3.1 导入选择条件的差异
4.3.2 部署难题
4.4 一些有用的类比
4.5 结论:二进制重用概念所产生的影响
第5章 使用静态库
5.1 创建静态库
5.1.1 创建Linux静态库
5.1.2 创建Windows静态库
5.2 静态库的使用场合
5.3 静态库设计技巧
5.3.1 丢失符号可见性和唯一性的可能性
5.3.2 静态库使用禁忌
5.3.3 静态库链接的具体规则
5.3.4 将静态库转换成动态库
5.3.5 静态库在64位Linux平台上的问题
第6章 动态库的设计:基础篇
6.1 创建动态库
6.1.1 在Linux中创建动态库
6.1.2 在Windows中创建动态库
6.2 设计动态库
6.2.1 设计二进制接口
6.2.2 设计应用程序的二进制接口
6.2.3 控制动态库符号的可见性
6.2.4 完成链接需要满足的条件
6.3 动态链接模式
6.3.1 加载时动态链接
6.3.2 运行时动态链接
6.3.3 比较两种动态链接模式
第7章 定位库文件
7.1 典型用例场景
7.1.1 开发用例场景
7.1.2 用户运行时用例场景
7.2 构建过程中库文件的定位规则
7.2.1 Linux构建过程中的库文件定位规则
7.2.2 Windows构建过程中的库文件定位规则
7.3 运行时动态库文件的定位规则
7.3.1 Linux运行时动态库文件的定位规则
7.3.2 Windows运行时动态库文件的定位规则
7.4 示例:Linux构建时与运行时的库文件定位
第8章 动态库的设计:进阶篇
8.1 解析内存地址的必要性
8.2 引用解析中的常见问题
8.3 地址转换引发的问题
8.3.1 情景1:客户二进制文件需要知道动态库符号地址
8.3.2 情景2:被装载的库不需要知道其自身符号地址
8.4 链接器-装载器协作
8.4.1 总体策略
8.4.2 具体技术
8.4.3 链接器重定位提示概述
8.5 链接器-装载器协作实现技术
8.5.1 装载时重定位
8.5.2 位置无关代码