-
预处理:gcc -E test.c -o test.i
①头文件的展开(加载);
②宏替换
③处理条件编译
总结:处理以“#”开头的语句
注:预处理不做语法检查
-
编译:gcc -c test.i -o test.o
①语法检查
②词法分析
-
汇编:gcc -s test.o -o test.s
①将c语言转化为汇编码
-
链接:
链接程序的主要工作是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够让操作系统装入执行的同一整体。
展开头文件,调用标准库里面定义的函数(这些函数可执行,但看不见源代码)有些函数书静态的调用,就是直接把函数写到源文件中,但有些事动态链接的,就是在链接阶段只判断这个函数的存在性,分配一个地址,在执行时再来替换函数。
连接处理可以分为两种:
①静态链接:在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。
②动态链接:在这种链接方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其他少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。