基本信息

编辑推荐
多维度全面讲解多任务操作系统中编译、链接、装载与库的内幕与技术细节
为深入理解和掌握系统底层技术提供翔实参考与实践指南
内容简介
计算机书籍
本书从多个角度全面、系统地讲解多任务操作系统中编译、链接、装载与库的内幕和技术细节,为深入理解和掌握系统底层技术提供翔实参考和实践指南。和纯粹讲解理论与技术细节的书不同,本书一方面对基本的理论进行了阐述,另一方面则聚焦于C/C++使用静态库和动态库的一些注意事项,并举例说明如何解实际的链接与装载问题。此外,本书尽量使用通俗易懂的语言来阐述这些知识,并补充了大量示例,避免让读者整天纠结于枯燥的理论。
本书第1~4章对多任务操作系统、程序生命周期以及代码重用等重要概念进行介绍,为后续内容做铺垫;第5章介绍静态库的使用方法及设计技巧;第6~11章介绍动态库的相关概念,包括不同平台中动态库的技术细节,比如库文件定位、引用解析与符号处理等,以及一些动态库设计的基本方法与原则和不同平台下应当注意的设计细节;第12~14章主要给出一些实践方面的总结,便于读者快速查找相关的概念,而且还总结了一些特定平台的二进制文件分析工具。
作译者
资深软件顾问,在多个学科的工程领域有着丰富的经验。他主要从事Linux和Windows平台下的多媒体压缩格式及多媒体框架设计工作。他热衷于开源,是avxsynth开源项目的主要贡献者,对C和C++底层技术有着深入的研究。
目录
前言
第1章 多任务操作系统基础 1
1.1 一些有用的抽象概念 1
1.2 存储器层次结构与缓存策略 2
1.3 虚拟内存 3
1.4 虚拟地址 5
1.5 进程的内存划分方案 5
1.6 二进制文件、编译器、链接器与装载器的作用 6
1.7 小结 7
第2章 程序生命周期阶段基础 8
2.1 基本假设 8
2.2 编写代码 9
2.3 编译阶段 11
2.3.1 基本概念 11
2.3.2 相关概念 11
2.3.3 编译的各个阶段 12
2.3.4 目标文件属性 23
2.3.5 编译过程的局限性 24
2.4 链接 26
前言
本书将许多零碎的知识点进行汇总,并讨论其中有价值的内容,再通过一系列精心设计的简单示例进行验证。需要注意的是,我并非计算机科学科班出身。在20世纪90年代末至今的数字革命中,我作为电气工程师供职于硅谷的一家多媒体行业高新技术企业,并因此掌握了相关领域的知识。希望本书的主题和内容能够让更多读者受益。
【读者对象】
作为一名软件设计实践顾问(虽然很忙,但我还是非常自豪的),我经常会与不同专业背景和资历的人沟通。我经常在不同的办公环境中工作,因此接触了许多开发人员(绝大多数来自硅谷),这也让我更加了解了本书的受众群体,其中包括以下几类人群:
第一类受众群体是来自不同工程领域(电气工程、机械、机器人技术和系统控制、航天、物理和化学等领域)的C/C++开发人员,这类人需要在日常工作中通过编程来解决问题。对缺乏正规计算机科学课程和理论教学的人来说,本书所提供的资料弥足
珍贵。
第二类受众群体是具有计算机科学教育背景的初级程序员。本书能够帮助这类人将主修课程中学到的知识具体化,并注重实践。对资深工程师而言,将第12~14章的内容作为手册查阅也很有益。
第三类受众群体是操作系统集成和定制的爱好者。理解二进制文件及其内部工作机制将有助于在解决问题的过程中扫除障碍。
不管怎么说……
就目前就业市场的情况而言,我认为(自2005年左右开始)熟悉C/C++语言的复杂性,甚至是算法、数据结构和设计模式,对于找到一份好工作是远远不够的。
在开源盛行的今天,专业开发人员在日常工作中所编写的代码越来越少,取而代之的是将现有代码集成到项目中。这不仅要求开发人员能够读懂其他人编写的代码(使用不同的代码风格和实践),还需要了解如何才能以最好的方式将现有的包(绝大多数以二进制文件/库和导出头文件的形式提供)集成到代码中。
我希望本书能够兼具教学(对急需这些知识的读者而言)和快速查询的功能(对分析C/C++二进制文件相关工作的工程师而言)。
【为何采用Linux进行演示】
选择Linux并非我个人的偏好。实际上了解我的人都知道,我过去是多么喜欢使用Windows作为开发环境(原本这是我首选的设计平台),原因是Windows平台具有完善的文档、完美的支持和符合规范的认证组件。我设计过许多专业化软件(曾为Palm公司设计开发了Windows Mobile平台的GraphEdit,其中包含许多复杂的功能,随后又开发了多个媒体格式和DSP分析软件),当时我对Windows技术了如指掌,并感叹Windows相关技术所带来的改变。
与此同时, Linux的时代到来了。有关Linux的技术随处可见,而对开发人员来说,也必须顺应这种趋势去学习和使用它。
Linux软件开发环境具有开放、透明和简单明了的特点。在Linux中,我们可以对每个程序设计阶段进行控制。同时,Linux提供了完善的文档,再加上网络上提供的资源,就可以轻松地使用GNU工具链。
实际上,由于Linux C/C++开发经验可以直接适用于Mac OS平台的底层开发,因此我最终决定选用Linux/GNU作为本书所涵盖的主要开发环境。
别急!Linux与GNU完全是两回事
实际上,Linux是内核,而GNU中包含了Linux内核之上的所有软件。除了GNU编译器可以在其他操作系统上使用(比如Windows上的MinGW)以外,在绝大多数情况下,GNU与Linux的关系其实非常紧密。为了简单起见,同时为了符合一般开发人员对开发场景的认识,特别是为了将Linux与Windows进行对比,本书将GNU与Linux作为一个整体,简称为“Linux”。
【章节概览】
媒体评论
本书深入浅出地讲解了构建过程(编译、链接)中的细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码重用和系统集成的软件架构设计方法,同时展示了系统开发过程中疑难问题的解决方案。另外,本书也是一本C和C++二进制文件方面的软件工程指南,涵盖中级和专家级程序员所需的各方面内容和信息。
通过阅读本书,你将学到:
构建过程(编译和链接)与装载过程的内部原理。
静态库、动态库和可执行文件的内部工作机制。
面向代码重用和系统集成的软件架构设计方法。
编译、链接与运行时问题的排查技巧。
在Linux和Windows平台下利用二进制文件分析工具进行分析的方法。