1. 翻译环境,在这个环境中源代码被转换成可执行的机器指令
每一个源文件通过编译过程转换成目标代码,每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序
同时链接器同时也会引用标准C库函数中任何被该程序锁用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
2.执行环境,用于实际执行代码
编译本身也分为几个阶段
1.预处理
由test.c 文件变为test.i,编译器主要做文本操作,内容如下:
一 ,#include头文件的包含
二,#define符号的替换
三,注释的删除
我们可以在linux下查看编译器在预处理阶段到底做了什么
这是我写的test.c:
在我们实行预处理 gcc -E test.o test.i,预处理结束后结果放在test,i中,看下结果是不是我们刚才所说的呢?
大体结果就是这样,和我们所说的一样
2.编译--把c语言代码转换为汇编代码,主要包括:
一,语法分析
二,词法分析
三,语义分析
四,符号汇总(如全局变量 main()等)
linux,操作指令,gcc -S test.c 编译停下来后放在test.s中
汇编代码:
3.汇编--把汇编代码转换成二进制,形成符号表
linux,在gcc -c test.s test o 指令后结果保存在test.o中
结果是给机器看的,我们看不懂,我就不展示了
下面说下链接:
一,合并断表
二,符号标的合并和重定位(把test.o的文件和目标文件里的符号表合并,)
好了,到这里就说完了,希望大家能进步。