简单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文件, 他是一个可执行目标文件,可以被加载到内存中,由系统执行.








网友评论