《高级C/C++编译技术(典藏版)》内容简介
学习如何编写C和C++代码仅仅是个开始。如果你希望从事系统底层开发工作,或想深入理解操作系统、编译器及它们之间内在的关联,成为编程专家,那么就必须充分了解编译器生成的二进制文件(目标文件、静态库、动态库和可执行文件)的作用和结构。开源已经在许多方面从根本上改变了软件的原有面貌,越来越多的系统开始采用或集成开源代码,因此对每位开发人员来说,学习和理解这些底层技术也变得十分重要。
本书深入浅出地讲解了构建过程(编译、链接)中的细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码重用和系统集成的软件架构设计方法,同时展示了系统开发过程中疑难问题的解决方案。另外,本书也是一本C和C++二进制文件方面的软件工程指南,涵盖中级和专家级程序员所需的各方面内容和信息。
通过阅读本书,你将学到: 构建过程(编译和链接)与装载过程的内部原理。
静态库、动态库和可执行文件的内部工作机制。
面向代码重用和系统集成的软件架构设计方法。
编译、链接与运行时问题的排查技巧。
在Linux和Windows平台下利用二进制文件分析工具进行分析的方法。
米兰·斯特瓦诺维奇(Milan Stevanovic),资深软件顾问,在多个学科的工程领域有着丰富的经验。他主要从事Linux和Windows平台下的多媒体压缩格式及多媒体框架设计工作。他热衷于开源,是avxsynth开源项目的主要贡献者,对C和C++底层技术有着深入的研究。
作品目录
The
Translator's
Words
译者序
前言
Preface
Chapter
1、第1章:多任务操作系统基础
1.1、一些有用的抽象概念
1.2、存储器层次结构与缓存策略
1.3、虚拟内存
1.4、虚拟地址
1.5、进程的内存划分方案
1.6、二进制文件、编译器、链接器与装载器的作用
1.7、小结
Chapter
2、第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、各种符号类型
Chapter
3、第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、栈和调用惯例
Chapter
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、结论:二进制重用概念所产生的影响
Chapter
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平台上的问题
Chapter
6、第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、比较两种动态链接模式
Chapter
7、第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构建时与运行时的库文件定位
Chapter
8、第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、位置无关代码
Chapter
9、第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、小提示:链接并不提供任何类型的命名空间继承
Chapter
10、第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版本信息
Chapter
11、第11章:动态库:其他主题
11.1、插件
11.1.1、导出规则
11.1.2、一些流行的插件架构
11.2、提示和技巧
11.2.1、使用动态库的实际意义
11.2.2、其他主题
Chapter
12、第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、静态库工具
Chapter
13、第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/
/maps文件
13.11.4、lsof实用程序
13.11.5、通过编程方式查看
13.12、创建和维护静态库
Chapter
14、第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工具