- Published on
编译系统
- Authors
- Name
- Arvin Wei
本文摘抄自《深入理解计算机系统》
源代码
hello.c
#include <stdio.h>
int main() {
printf("hello, world\n");
}
编译系统
1. 预处理阶段 (Preprocessing phase)
预处理(cpp)根据以字符 # 开头的命令,修改原始的 C 程序,生成扩展名为 .i 的文件。
$ gcc -E hello.c -o hello.i
2. 编译阶段 (Compilation phase)
编译器(cc1)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。
$ gcc -S hello.i -o hello.s
3. 汇编阶段 (Assembly phase)
编译器(as)将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件 hello.o 中。
$ as hello.s -o hello.o
4. 链接阶段 (Linking phase)
printf
函数是标准 C 库中的一个函数,在 printf.o
这个单独预编译好的目标文件中。连接器(ld)将 printf.o 和 hello.o 合并,结果得到 hello 可执行目标文件。
$ gcc hello.o -o hello