linux:gcc编译器的四个阶段

第一阶段:预处理

这个阶段输入*.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
发布了37 篇原创文章 · 获赞 6 · 访问量 2925

猜你喜欢

转载自blog.csdn.net/yuupengsun/article/details/104357866