第八章主要讲的是从源文件到可执行文件,编写好源文件之后,对源文件进行编译和链接,就可以生成可执行文件了,编译和链接的操作需要使用编译器和链接器来完成。这一章中,作者把重点放在了编译器和链接器的功能上,向我们介绍了程序从编写到运行的整个过程。
首先我们看到的是源文件是如何转变成可执行文件的,源文件是将源代码保存成一个文件,而源代码是用某种编程语言编写的程序,负责翻译源代码的叫做编译器,用不同的编程语言编写的源代码,需要使用该源专用的编译器来进行编译,而编译器本身也是一种程序,因此,也有其对应的运行环境,而仅靠编译无法得到可执行文件,作为源代码的翻译,结果编译器生成的是包含本机代码的文件,但这个文件不能直接运行,要得到可执行的EXE文件,在编译之后还需要进行链接操作
下面就是,运行可执行文件需要什么?在EXE文件中,变量和函数被分配的内存地址都是虚拟的,在程序运行时,这些虚拟的内存地址会转换成实际的内存地址,链接器会在EXE文件的开头记录需要进行内存地址转换的各个位置。这些信息被统称为重定位信息中记录的是变量和函数的相对地址,而EXE文件的内容被分为重定位信息变量区和函数区,但是在加载程序的内存空间中,还会生成另外两个区域,就是栈和堆,栈和堆都是在程序运行时分配的内存空间