🍍一.程序的翻译环境和执行环境
在ANSI C的任何一种实现中,存在两个不同的环境:
在翻译环境中又可以细分:
🌽 二.详解编译+链接
🍉(1)编译和链接图解:
>组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
>每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
>链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中
我们常用的VS 2022 就是一个集成开发环境(IDE):集成了 编辑器 ,编译器,链接器 ,调试器。
🍉(2)编译本身也分为几个阶段:
🍉1.预处理:
这里用linux环境,和gcc编译环境展示。
这我们用linux下创建一个test.c的文件。
经过预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中:
gcc -E test.c -o test.i
我们发现原本只有几行的代码,经过预处理以后,变成了几百行了,代码里的注释也没有了。
这是因为在预处理时会发生:
1.头文件的包含,#include
2.注释的删除
3.#definde符号的替换
主要是一些文本的操作。
🍉2.编译:
编译时我们使用:
gcc -S test.i
生成 test.s 。
不难发现,这里的生成的 test.s 我们已经看不懂了,没错这里的就已经是汇编代码了。
而整个编译所做的事情有:
1.语法分析
2.此法分析
3.语义分析
4.符号汇总
最终把C语言的代码转换成汇编代码。
🍉3.汇编
我们通过命令:
gcc -c test.s
生成 test.o 的目标文件。
这里的 test.o 就更看不懂了,这里的 test.o 就是一个二进制文件了。
这里的汇编主要时通过:
1.将汇编指令,转换成二进制指令。
2.利用之前的符号汇总,生成符号汇总表。
🍉4.链接
我们通过命令:
gcc test.o -o test
生成一个可执行文件 test。
我们使用:
./test
执行我们的 test 文件。 就可以得到我们的代码执行结果了。
在链接期间主要是:
1.合并汇编期间产生的段表
2.符号表的合并和重定位
总体: