第一阶段:预处理
这个阶段输入*.c源文件,这个阶段主要处理的是文件中的带“#”的语句,就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理
gcc –E file.c –o file.i
第二阶段:编译阶段
这个阶段输入第一阶段生成的 .i 文件,输出成汇编语言的 .s 文件
gcc –S file.i –o file.s
第三阶段:汇编阶段
这个阶段将第二阶段的汇编文件 .s 文件输入,然后编译成机器语言 .o 文件,在Linux系统上一般表现位ELF目标文件(OBJ文件)
gcc –c file.s –o file.o
(合三为一)以上三个阶段可以:gcc –c file.c –o file.o
第四阶段:链接阶段
将第三步输出的机器文件 .o 输入,然后做链接处理,就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序,生成可执行文件
gcc file.o –o file 这个file文件才是最终的可执行文件。
测试代码:
#include<stdio.h>
int main()
{
printf("HELLO\n");
return 0;
}
执行测试:
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc -E file.c -o file.i
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc -S file.i -o file.s
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc -c file.s -o file.o
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc file.o -o file
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ ./file
HELLO
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc -c file.c -o file2.o
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ gcc file2.o -o file2
linux@ubuntu:/mnt/hgfs/000myShare/binutils/as$ ./file2
HELLO