关于编译链接学习可以让我们深刻理解到语言的层次,下面讲一下编译链接
首先我们看一下我们常用的写代码环境
我们常用的vs2019等这些编译器他们都是集成开发器
而我们的翻译环境可以分为编译和链接
我们首先看一下编译链接的大体逻辑
我们的源文件首先需要经过编译器生成目标文件,最后我们将生成的目标文件链接之后生成唯一一个可执行程序
下面我们看一下编译链接的每一个步骤
我们可以仔细看每一步
首先就是编译的第一步
第一步就是预编译(预处理)我们预处理的作用就是头文件的展开,宏的替换,还有删除注释,其中例如#include和#define这些都是预处理的指令,就是在预处理的时候展开头文件等其中我们如果想要单独的对他进行预处理的话,我们需要在gcc上面,我们可以gcc -E test.c -o test.i
其中-E就是完成预处理,而-o的意思是指定生成文件名,而预处理之后生成的文件名是.i文件
下一步是编译
编译的作用是把C语言翻译成汇编代码,其中还会进行 语法分析 词法分析 语义分析 符号汇总
而想要进行单独的编译我们需要在gcc中进行
gcc -S test.i -o test.s
这一步会生成.s文件,这里面就是汇编代码
下一步是汇编,而汇编的作用是把汇编代码翻译成了二进制指令
其中还会生成符号表
而这一步我们需要
gcc -c test.s -o test.o
这一步会生成.o文件,此时该文件里面存档的就是二进制,打开后就是一堆乱码
而这一步会生成符号表,符号表和最后的链接有大的相关
而最后一步链接是最重要的,我们在这一步会
1.合并段表
2.符号表的合成和重定位
其中,就是把每个目标文件最后生成的符号表都合并,然后把有用的地址保留下来,最后合并为一个
其中重定位,简单来说就是,例如如果我们把函数的声明和定义分离,链接就是把声明和定义的的地址给重定位就可以了
最后就生成唯一一个可执行程序