一、程序生成
使用C语言编写的源文件如何生成可执行程序呢?
源文件(.c)-->编译(预处理(.i)-->编译(.s)-->汇编(.o))-->链接-->程序(.exe)
其中,编译过程将C语言翻译成汇编语言,汇编过程将汇编语言转化为机器语言的可链接文件,链接将自身程序与库文件进行关联,形成可执行程序。
二、编译
2.1预处理
2.1.1头文件包含
在编写程序时,经常需要用#include来包含许多头文件。(这里的#include实际上就是一种预处理指令)那么,在预处理过程中,就会将头文件的内容复制到文件中,以便进行调用。
2.1.2宏替换
将所有宏进行替换,并删除定义符号。
2.1.3去注释
预处理阶段会将所有注释替换为空格。
2.2编译
编译过程,将C语言代码转换为汇编代码。
需要进行词法分析、语法分析、符号汇总、语义分析的过程。
2.3汇编
汇编过程,将汇编代码转换成二进制指令,在此过程中形成符号表。
符号表是给每个源文件的所有全局符号关联一个地址形成的。(局部变量在程序执行时创建)对于仅声明的符号,分配一个无效地址。
三、链接
3.1合并段表
.o目标文件有具体格式(Linux环境下为elf格式),该格式将.o文件分成一段一段,每个段存储相应的数据。合并段表即将相同格式的文件合并。
3.2符号表的合并和重定位
将多个.o文件的符号表合并。对于相同符号,选择地址有效的一个。