封面
版权页
内容简介
译者序
前言
第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 位置无关代码
第9章 动态链接时的重复符号处理
9.1 重复符号的定义
9.2 重复符号的默认处理
9.3 在动态库链接过程中处理重复符号
9.3.1 处理重复符号问题的一般策略
9.3.2 链接器解析动态库重复符号的模糊算法准则
9.4 特定重复名称案例分析
9.4.1 案例1:客户二进制文件符号与动态库ABI函数冲突
9.4.2 案例2:不同动态库的ABI符号冲突
9.4.3 案例3:动态库ABI符号和另一个动态库局部符号冲突
9.4.4 案例4:两个未导出的动态库符号冲突
9.5 小提示:链接并不提供任何类型的命名空间继承
第10章 动态库的版本控制
10.1 主次版本号与向后兼容性
10.1.1 主版本号变更
10.1.2 次版本号变更
10.1.3 修订版本号
10.2 Linux动态库版本控制方案
10.2.1 基于soname的版本控制方案
10.2.2 基于符号的版本控制方案
10.3 Windows动态库版本控制
10.3.1 DLL版本信息
10.3.2 指定DLL版本信息
10.3.3 查询并获取DLL版本信息
第11章 动态库:其他主题
11.1 插件
11.1.1 导出规则
11.1.2 一些流行的插件架构
11.2 提示和技巧
11.2.1 使用动态库的实际意义
11.2.2 其他主题
第12章 Linux工具集
12.1 快速查看工具
12.1.1 file实用程序
12.1.2 size实用程序
12.2 详细信息分析工具
12.2.1 ldd
12.2.2 nm
12.2.3 objdump
12.2.4 readelf
12.3 部署阶段工具
12.3.1 chrpath
12.3.2 patchelf
12.3.3 strip
12.3.4 ldconfig
12.4 运行时分析工具
12.4.1 strace
12.4.2 addr2line
12.4.3 gdb
12.5 静态库工具
第13章 平台实践
13.1 链接过程调试
13.2 确定二进制文件类型
13.3 确定二进制文件入口点
13.3.1 获取可执行文件入口点
13.3.2 获取动态库入口点
13.4 列出符号信息
13.5 查看节的信息
13.5.1 列出所有节的信息
13.5.2 查看节的信息
13.6 查看段的信息
13.7 反汇编代码
13.7.1 反汇编二进制文件
13.7.2 反汇编正在运行的进程
13.8 判断是否为调试构建
13.9 查看加载时依赖项
13.10 查看装载器可以找到的库文件
13.11 查看运行时动态链接的库文件
13.11.1 strace实用程序
13.11.2 LD_DEBUG环境变量
13.11.3 /proc/<PID>/maps文件
13.11.4 lsof实用程序
13.11.5 通过编程方式查看
13.12 创建和维护静态库
第14章 Windows工具集
14.1 库管理器lib.exe
14.1.1 使用lib.exe处理静态库
14.1.2 使用lib.exe处理动态库
14.2 dumpbin实用程序
14.2.1 确定二进制文件类型
14.2.2 查看DLL的导出符号
14.2.3 查看节的信息
14.2.4 反汇编代码
14.2.5 确定是否使用了调试模式构建
14.2.6 查看加载时依赖项
14.3 Dependency Walker工具
作者简介
封底
更新时间:2023-02-23 15:59:46