目录
GCC典型的编译过程:
test.c –预处理 —> test.i –编译 —> test.s –汇编 —> test.o –连接 —> test
简单例子:
$ cat test.c (查看程序源代码)
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("hello world\n");
return 0;
}
$ gcc -o test test.c (编译连接程序)
$ ./test (执行test程序)
预处理
预编译命令: $ gcc -o test.i -E test.c
执行结果: 生成预处理后的文件test.i, 该文件包含了test.c需要的所有的类型和函数申明。
编译及优化
编译命令:
$ gcc -o test.i -S test.c (-E编译选项)
$ gcc -o test.s -S test.i (-S编译选项)
$ cc1 -o test.s test.i (cc1为C语言真正编译器)
结果: 生成汇编文件test.s, test.s中包含了AT&T的x86汇编代码。
汇编命令:
$ gcc -o test.o -c test.s
$ as -o test.o test.s
执行结果: 生成目标机器指令文件test.o(可以通过objdump查看汇编指令)
链接
执行命令:
$ gcc -o test test.o
执行结果: 生成可执行文件test (可用objdump查看)
执行
执行过程 $ ./test
Linux GCC 可执行程序的生成过程
1. –预处理(Preprocessing):分析各种预处理命令,如#define, #include, #if等;
2. –编译(Compilation): 根据输入文件产生汇编语言的程序;
3. –汇编(Assembly): 将汇编语言输入,产生扩展名为.o的目标文件;
4. –链接(Linking):以.o目标文件,库文件作为输入,生成可执行文件;
希望对你有帮助。
源程序文件(.h, .c, .cc, .etc) ----》 经预处理的文件(.i, .ii) ----》 汇编语言文件(.s) ----》 目标文件(.o) ----》 可执行程序(.out)