《程序是怎么跑起来的》第八章学习笔记
第一章笔记传送门 ???? 点击这里
第二章笔记传送门 ???? 点击这里
第三章笔记传送门 ???? 点击这里
第四章笔记传送门 ???? 点击这里
第五章笔记传送门 ???? 点击这里
第六章笔记传送门 ???? 点击这里
第七章笔记传送门 ???? 点击这里
第八章笔记传送门 ???? 点击这里
第九章笔记传送门 ???? 点击这里
第8章:从源文件到可执行文件
- CPU可以解析和运行的程序形式称为什么代码
本地代码 - 将多个目标文件结合生成EXE文件的工具称为什么
链接器 - 扩展名为.obj的目标文件的内容,是源代码还是本地代码
本地代码 - 把多个目标文件收录在一起的文件称为什么
库文件 - 仅包含Windows的DLL文件中存储的函数信息的文件称为什么
导入库 - 在程序运行时,用动态申请分配的数据和对象的内存区域形式称为什么
堆
8.1 计算机只能运行本地代码
- CPU能直接解析并运行的不是源代码而是本地代码的程序
8.2 本地代码的内容
- Dump:指把文件的内容,每个字节用2位十六进制数来表示的方式
- 本地代码的内容就是各种数值的罗列
8.3 编译器负责转换源代码
- CPU不同,本地代码的类型也是不同的
8.4 仅靠编译时无法得到可执行文件的
- 编译后生成的不是EXE文件,而是.obj的目标文件,这个文件是无法直接运行的,此时程序处于未完成状态
- 链接:将多个目标文件结合,生成一个EXE文件的处理
- 链接器:运行链接的程序
8.5 启动及库文件
- 库文件:把多个目标文件集成保存到一个文件中的形式
- 链接器指定库文件后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。
- 外部符号:指其他目标文件中的变量或函数(无法进行链接)
- 标准函数:不是通过源代码的形式而是通过库文件的形式和编译器一起提供的
- 使用库文件是为了简化链接器的参数指定多个目标文件这一过程
- 通过一目标文件的形式或集合多个目标文件的库文件形式来提供函数,就可以不用公开标准函数的源代码内容。
- 标准函数的源代码是编译器厂商的重要财产!
8.6 DLL文件及导入库
- Windows中,API的目标文件,并不是存储在通常的库文件中,而是存储在名为DLL文件的特殊库文件中。
- 导入库:存储着DLL文件的文件夹信息,目标文件的实体并不存在
- 静态链接库:存储着目标文件的实体,并直接和EXE文件结合的库文件的形式称为静态链接库。
8.7 可执行文件运行时的必要条件
- EXE文件是作为单独的文件存储在硬盘中的,通过资源管理器找到并双击EXE文件,就会把EXE文件的内容加载到内存中运行
- EXE文件中给变量及函数分配了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需要的必要信息。
这个信息被称为再配置信息。 - EXE文件的再配置信息,就成为了变量和函数的相对地址。
在链接后的EXE文件中,变量及函数就会编程一个连续排列的组。
8.8 程序加载时会生成栈和堆
-
栈:用来存储函数内部临时使用的变量(局部变量),以及函数调用时所使用的参数的内存区域。
-
堆:用来存储程序运行时的任意数据及对象的内存领域
-
EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。
-
内存中的程序,就是由用于变量的内存空间,用于函数的内存空间,用于栈的内存空间,用于堆的内存空间这4部分组成的。
-
栈中对数据进行存储和舍弃(清理处理)的代码,时由编译器自动生成的,因此不需要程序员参与。使用栈的数据结构的内存空间,每当函数被调用时就会得到申请分配,并在函数处理完毕后自动释放。
-
使用堆的空间,需要程序员和编写程序,来明确进行申请分配或释放
-
内存泄漏:没有在程序中明确释放堆的空间,那么即使处理完毕轴,该空间仍会一直残留。
内存泄漏会造成内存不足而导致宕机。
8.9 有点难度的Q&A
- 分割编译:将整个程序分为多个源代码来编写,然后分别进行编译。最后链接生成一个EXE文件,这样每个源代码相对变短,便于程序管理。
- Build:指的是连续执行编译和链接
- 叠加链接:将不会同时执行的函数,交替加载到同一个地址中运行。通过使用”叠加链接器“这一特殊的链接器即可实现。在计算机中分配的内存容量不多的MS-DOS时代,经常使用叠加链接。