简单helloworld程序:
# include <stdio.h>
int main(void)
{
printf("hello world\n");
}
命令是gcc -o hello hello.c
GCC编译器驱动程序读取源程序文件hello.c
,并把它翻译成一个可执行目标文件hello
这个翻译的过程可分为四个阶段
- 预处理阶段
gcc -E -o hello.i hello.c
预处理器(cpp) 根据以字符#开头的命令, 修改原始的C程序,比如#include <stdio.h>
命令告诉预处理器读取系统头文件stdio.h
的内容,并直接插入到程序文本中。 结果得到了另一个C程序,通常以.i
结尾 - 编译阶段
gcc -S -o hello.s hello.c
编译器(cc1)将文本文件hello.i
翻译成文本文件hello.s
, 它包含了一个汇编语言程序。 - 汇编阶段
gcc -c -o hello.o hello.c
汇编器as
将hello.s
翻译成机器语言指令, 把这些指令打包成一种叫做可重定位目标程序(relocatable object program)
的格式, 并将结果保存在目标文件hello.o
中。
hello.o
是一个二进制文件,它的字节编码是机器指令而不是字符,如果我们在文本编辑器中打开,看到的将是乱码 - 链接阶段
请注意,hello
程序调用了printf
函数, 他是每个C编译器都会提供的标准C库中的一个函数。printf
函数存在于一个名为printf.o
的单独的预编译好了的目标文件中, 而这个文件必须以某种方式合并到我们的hello.o
程序中。
链接器(ld)
就负责处理这种合并。 结果就得到hello文件, 他是一个可执行目标文件,可以被加载到内存中,由系统执行.
网友评论