假设用户编写了一个c程序如下:
#include <stdio.h>
int main(){
printf("hello,world!");
}
编写完后的程序称为C源程序(hello.c)。
然后C源程序经过下列流程转化为可执行程序hello.exe
(1)预编译阶段:预处理程序(cpp)对源程序中以字符井开头的命令进行处理。例如,将#include命令后面的.h文件内容嵌入到源程序文件中。预处理程序的输出结果还是一个源程序文件,以i为扩展名。
(2)编译阶段:编译程序(ccl)对预处理后的源程序进行编译,生成一个汇编语言源程序文件,以s为扩展名,例如,hello.s是一个汇编语言程序文件。
(3)汇编阶段:汇编程序(as)对汇编语言源程序进行汇编,生成一个可重定位目标文件(relocatable object file),以o为扩展名,例如,hello.o是一个可重定位目标文件。它是一种二进制文件(binary file),因为其中的代码已经是机器指令,数据以及其他信息也都是用二进制表示的,所以它是不可读的,即打开显示出来的是乱码。
(4)链接阶段:链接程序(ld)将多个可重定位目标文件和标准库函数合并成为一个可执行文件(executable object file),可执行目标文件简称为可执行文件。本例中,链接器将hello.o和标准库函数printf所在的可重定位目标模块printf.o进行合并,生成可执行文件hello.exe。
最终生成的可执行文件被保存在磁盘上,可以通过某种方式启动一个磁盘上的可执行文件运行。