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

大家好,我是Cone,一名毕业于双非本科的抖音全栈程序猿。 

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

前言

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

PS:如果你还没有读过本书,建议你去认真阅读本书,你肯定能收获不小。

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

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

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

全书概览

如上图所示,全书分为四个部分。

第一部分:温故而知新 

通过hello、world 第一个C程序引出相关一些列问题,抛出本书的目的,并回顾了操作系统相关的知识,包括硬件、线程、进程、内存等基础知识。

第二部分:静态链接 

全面讲解了编译的基本概念和过程以及链接器历史,然后通过讲解目标文件为引出静态链接做铺垫,最后详细介绍了静态链接知识。

第三部分:装载与动态链接 

首先讲解了可执行文件的转载讲解出内存中的进程虚拟空间布局、载入方式以及加载过程,之后详细介绍了动态链接相关知识,后面追着介绍了Liunx下的动态库特性。

第四部分:库与运行库

这一部分主要介绍了运行时内存利用相关知识、以及运行库基本知识和实现,还讲解了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页的知识读下来会比较轻松,同时也能掌握很多的知识,从动态链接开始难度有会有提升了。但是只有理解了动态链接,你才能理解程序编译链接时给动态链接留下接口是为什么,当然你也可以大致把动态库理解为一堆功能代码的共享。导读总结就到这里了,希望你读完有所收获。

阅读到这里,赶紧行动起来吧~ 

这里为你精心准备了电子书:

链接:https://pan.baidu.com/s/1zmegxUifY4x9aN7H17ui3Q  密码:o589

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值