一段C语言程序从源文件到可执行文件的中间环节
预处理:
1、宏定义指令:对用到宏定义的地方用其指代的具体内容进行替换。
2、条件编译指令:对类似于#ifdef,#ifndef,#else,#elif,#endif的条件编译指令,跳过在条件判断中不需要编译的部分,把不必要的代码过滤。
3、头文件包含指令:预编译程序将把头文件中的定义都加入到它所产生的输出文件中,以供编译程序对之进行处理。在这个操作后文件的行数和大小就会变大。
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同,文件的体积也大大增加了。经过这个环节,可以把.c文件转化为.i文件。
编译:
编译环节做的事情是把C语言转化为汇编语言。其中包括词法分析、语法分析、语义分析、代码优化等环节。编译这个过程把.i文件转化为了.s文件,输出的是汇编语言。
汇编:
汇编环节做的事情是把汇编语言代码翻译成目标机器指令,得到目标文件,其中存放机器语言代码。目标文件一般由代码段和数据段组成,代码段存放程序指令,数据段存放全局变量或静态数据。汇编这个过程把.s文件转化为了.o文件。
链接:
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够在操作系统装入执行的统一整体。链接包括静态链接和动态链接两种,静态链接文件是目标文件的集合,它具有完整的代码,可以独立运行