《程序员的自我修养》导读


今天来和大家分享《程序员的自我修养————链接、装载与库》这本书的全书导读,它在去年我拿下微信、抖音、百度等大厂sp以级上offer有非常大的帮助,分享与你,希望能够对你带来启发。

前言

最近在工作之余,重新认真阅读学生时代读过的书籍,阅读到了这本对我秋招帮助很大的书,重新思考了一些原来读这本书时的问题,比如:windows系统相关知识,我到底要不要精读?一些晦涩难懂的知识该怎么办?等等,所以打算梳理一篇该书的导读内容,希望对你能够有所帮助。
PS:如果你还没有读过本书,建议你去认真阅读本书,你肯定能收获不小。

阅读前所需要具备的基础知识

下面为你整理了,你阅读本书前,最好所具备的前言知识,这样能够在你阅读的时候减少很多阅读障碍。如果你缺少一些前言知识,也没关系,努努力,啃一啃,遇到问题时,去努力解决,也会有不小收获。

  • C/C++编程语言基础
  • 汇编语言基础
  • 操作系统基础
  • 计算机组成原理基础

全书概览

如上图所示,全书分为四个部分。
第一部分:温故而知新
第二部分:静态链接
第三部分:装载与动态链接
第四部分:库与运行库

章节概览

下面是一些章节的概览,有些知识Windows的知识也不需要去完全掌握,毕竟我们可能很少接触windows开发吧。
第一章:温故而知新
本章也就是全书概览上的第一部分,主要介绍一些背景知识和阅读本书的一点铺垫知识,比如:CPU、内存等硬件,操作系统进程、线程相关知识。
第二章:编译和链接
本章主要介绍基本的编译概念以及编译几大过程还有链接器相关知识。
第三章:目标文件
本章介绍了Windows和Liunx量大系统的目标文件,回答了目标文件是什么,目标文件类型,目标文件如存储等问题。
第四章:静态链接
本章主要讲解静态链接基础知识和静态链接基本步骤和过程,还讲解举例了最“小”链接。
第五章:Windows PE/COFF
本章介绍Windows平台的目标文件和可执行文件。
第六章:可执行文件的转载与进程
本章通过介绍进程的基本概念,地址空间布局等知识引申出了可执行文件的加载过程。
第七章:动态链接
本章主要讲解Liunx系统下的.so动态库的动态链接过程。
第八章:Liunx动态库
本章主要详解介绍动态库的相关知识,包括动态库的分布和组织等。
第九章:Windows下的动态链接
这章主要讲Windows下面的动态链接机制
第十章:内存
这章主要讲运行时内存相关知识,包括堆与栈,堆的分配算法,函数调用栈等。
第十一章:运行库
这章主要介绍运行库的概念、c/c++运行库、Glibc和MSVC CRT相关知识。
第十二章:系统调用与API
这章主要讲系统调用知识,包括系统调用流程以及相关API介绍。
第十三张:运行库实现
这章主要实现了一个支持堆、基本文件操作等功能的Mini CRT.

导读建议

通常阅读一本书,我们会有一个问题:我需要从书中得到一些什么?可能是已有知识的总结回顾、也可能是新知识的获取。不管怎么样,我们会有想要得到的收获,那么阅读《程序员的自我修养》这本书,你能得到什么呢?

  • 以CPU会为核心回顾计算机体系知识
  • 了解代码编译的基本概念和步骤
  • Liunx系统下目标文件格式以及如何存储
  • 静态链接基本概念,为什么要有静态链接
  • 目标文件如何被静态链接到一起行程可执行文件
  • 静态链接时的空间地址分配、符号决议和重定位如何进行
  • 可执行文件如何被系统加载,与进程的地址空间如何映射
  • 动态链接基本概念以及链接时相关问题
  • 运行时的内存分配以及入口程序初始化
    上面是一些基本能得到的收获,我们从中抽象为三个重要问题:
  • 源码是如何被编译成可执行程序的?
  • 可执行程序是如何被加载到内存的?
  • 内存中的进程空间布局是怎么样的?

带着这个三个问题,去阅读本书,效果会更好。首先我们从书本脉络出发,尝试回答第一个问题

源码是如何被编译成可执行程序的?

这个涉及相关编译问题,从上面的章节概览可以得到,在第二章:编译和链接就能找到相关答案,所以你需要认真阅读第二章全部内容,不过这里只稍微展开讲了编译的大致过程,但是生成可执行文件还需要链接,所以顺着下去需要搞懂链接。
那么在学习链接之前,书本第三章:目标文件里面有什么,就讲解了需要链接的输入产物长什么样子,以及链接前的基本知识:链接的接口(基本单位),所以第三是一个基础知识,是为后面章节做铺垫的,你需要大致清楚目标文件的基本知识,第三章也是需要全部认真阅读的。
接下来就是链接了,第四章:静态链接,本章首先根据目标文件,讲解了两种链接方法,之后讲解了链接的两个步骤,然后引申出C++的相关问题,其次讲解了静态库的链接,最后有一个小实验,让你动手体验。
到这里你很好的回答上面的这个问题了。
接下来我们继续下一个问题。

可执行程序是如何被加载到内存的?

回答完前面那个问题后,你了解了可执行程序的文件内容以及格式,前文开篇提到需要由操作系统的基础知识,操作系统知识中程序运行的基本单位是进程,可执行程序加载到内存肯定首先需要了解进程的地址空间,其次需要知道是以上面方式加载到内存的。在加载到内存之前需要进行进程的建立等操作,所以在本书第六章主要为你解答这些问题。
认真理解静态链接之后,我们会有一个疑问,那些在静态链接没有被重定位的符号怎么办?符号表里都是存在的偏移地址,那真实地址如何确定。这就涉及到了动态链接了,在静态链接没有完成的工程,由程序加载时进行动态链接完成。本书在第七章详细介绍了动态链接的相关知识,包括步骤实现、懒加载等等。
在了解完动态链接之后,还需要了解动态库的特性,所以在第八章介绍了Liunx下动态库相关的知识。
读完前面八章内容,你已经非常熟悉编译链接加载相关知识了。
那么加载完了之后是运行,所以接下来一个问题就是关于运行的了。

内存中的进程空间布局是怎么样的?

进程的空间布局直接影响会影响程序的运行,运行时也需要用到一些堆、栈等空间,所以在本书第十章讲解了内存相关知识,包括进程的空间布局、栈与调用惯例、堆与内存管理等知识,读完本章,你能够大致明白,程序运行时的一些地址是怎么回事。
程序运行你肯定好奇入口,也就是计算机是如何进入执行程序的。那么本书第十章:运行库,第一节为你讲解了相关知识。
读到这里你对于计算机的编译、链接、加载、运行有了很深刻的认识,从全局层面进行了系统性的学习。

回答完三个问题,接下来对本书的内容做一个小小的总结

导读总结

p1-109,建议精读,读懂读透,读完就能系统的计算机编译链接相关知识。
P127,使用ld链接脚本,本节需要自己动手尝试,计算机是一门工科,多动手体会。
P149-175,讲解可执行文件的转载和进程,需要精读。
P179-P219,讲解动态链接,这一部分内容稍有难度,需要花些精力认真读。
P229-P248 讲解动态库,如果动态链接有些吃力,这一章可跳过也不影响。
P283-334,这一部分就需要回到上面的第三个问题了,也需要认真弄懂。

整体下来前面175页的知识读下来会比较轻松,同时也能掌握很多的知识,从动态链接开始难度有会有提升了。但是只有理解了动态链接,你才能理解程序编译链接时给动态链接留下接口是为什么,当然你也可以大致把动态库理解为一堆功能代码的共享。导读总结就到这里了,希望你读完有所收获。

总结

正如这本书的取名一样,程序员也需要由自身的技术修养,在自我修养这条路上,笔者和大家一起成长。

更多内容你可以关注公众号: 「ConeZhang


文章作者: Cone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Cone !
  目录