一、预处理(cpp)
1.预处理命令
gcc -E hello.c -o hello.i
2. 处理源文件中以"#"开头的预编译指令,包括:
- 删除"#define"并展开所定义的宏
- 处理所有条件预编译指令,如"#if" ,"#ifdef" ,"#endif" 等
- 插入头文件到"#include"处,可以递归方式进行处理
- 删除所有的注释"//" 和"/* */"
- 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息
- 保留所有#pragma编译指令(编译器需要用)
3.经过预编译处理后,得到的是预处理文件(如, hello.i) , 它还是一个可读的文本文件,但不包含任何宏定义
二、编译(cc1)
1.编译命令
- $gcc -S hello.i -o hello.s
- $gcc -S hello.c -o hello.s
- $/user/lib/gcc/i486-linux-gnu/4.1/cc1 hello.c
2.编译过程就是将预处理后得到的预处理文件(如hello.i )进行词法分析、语法分析、语义分析、优化后,生成汇编代码文件
- 经过编译后,得到的汇编代码文件(如hello.s )还是可读的文本文件, CPU无法理解和执行它,gcc命令实际上是具体程序(如ccp、cc1、 as等)的包装命令
- 用户通过gcc命令来使用具体的预处理程序ccp、编译程序cc1和汇编程序as等
三、汇编
1.汇编指令
- $gcc -c hello.s -o hello.o
- $gcc -c hello.c -o hello.o
- $as hello.s -o hello.o
2.汇编程序(汇编器)用来将汇编语言源程序转换为机器指令序列(机器语言程序)
- 汇编代码文件(由汇编指令构成)称为汇编语言源程序
- 汇编指令和机器指令一一对应,前者是后者的符号表示,它们都属于机器级指令,所构成的程序称为机器级代码
- 汇编结果是一个可重定位目标文件(如, hello.o ) ,其中包含的是不可读的二进制代码,必须用相应的工具软件来查看其内容
四、链接
1.链接指令
$gcc -static -o myproc main.o test.o
$ld -static -o myproc main.o test.o
2.链接过程将多个可重定位目标文件合并以生成可执行目标文件
- 预处理、编译和汇编三个阶段针对一个模块(一个*.c文件) 进行处理,得到对应的一一个可重定位目标文件( 一个.o文件)
- static表示静态链接,如果不指定-o选项,则可执行文件名为"a.out"