《程序员自我修养》学习心得

一、总结

读了这本书到四分之一之后,发现有一句话关于Linux名言非常适合这本书,“一切皆为文件”,没有什么玄学概念,有的只是你没有接触过的规则和智慧结晶。程序从编译到运行这个过程中,有各种各样的标准和规则相互配合。

二、模糊概念整理

2.1、dll(so)为什么叫动态共享库

我最早的理解是一个dll可以被多个进程同事使用,彼此之间内存隔离,互不干扰。其实还有一层深意,目标文件中的.text程序段,在被一个进程加载然后写入到内存中之后,其他同样使用这个dll的进程,操作系统不会重复的将这个dll的.text程序段放进内存,因为他是只读的,不会被修改,可以被所有进程共享使用。从操作系统的角度来看,比如微软的底层vcruntime.dll这种c/c++底层运行库,大部分应用程序都需要用到,这就给操作系统节省了大量内存。

2.2、符号

符号包含很多东西,不单单是变量名称和函数名称,文件名称和段名都是符号,对应有个符号值,就是表示这些符号的存储地址,当然不是物理内存地址,而是虚拟内存地址。每个编译单元(.o、.obj)都有一个符号表,对于编译单元内部的符号,在编译时会分配好虚拟内存地址,但是对于引用其他编译单元中的符号,比如使用了标准库中的一个接口,此时这个符号不需要只需要给他一个默认值,比如0,等到链接的时候,才给这个引用的符号分配对应的虚拟内存地址。

2.3、调试信息

在windows上使用msvc编译器,在调试模式下会生成pdb调试符号,但是在Linux上,使用编译选项-g,此时并没有产生额外的调试文件,它的调试信息直接集成到了目标文件中,在目标文件中多了许多debug段,就是调试信息保存的位置。


《程序员自我修养》学习心得
http://yoursite.com/2023/08/10/程序员自我修养学习心得/
作者
还在输入
发布于
2023年8月10日
许可协议