第一章 计算机系统漫游
CSAPP
Our story will begin with “Hello, World.”
1 | // hello.c |
hello 程序的生命周期是从一个高级 C 语言程序开始的。然而,为了在系统上运行 hello.c
程序,每条 C 语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以 二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。
在 Unix 系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
1 | gcc -o hello hello.c |
上述指令其背后可分为四个阶段:预处理、链接、汇编、链接。这四个阶段共同构成了编译系统。
- 预处理阶段:
hello.c -> hello.i
,这一阶段预处理器会根据以字符#
开头的命令,来修改原始程序(hello.c
)。将#include <stdio.h>
之类的头文件直接插入到到文本中。 - 编译阶段:
hello.i -> hello.s
,这一阶段编译器会将hello.i
文件翻译汇编文件hello.s
。 - 汇编阶段:
hello.s -> hello.o
,这一阶段汇编器会将hello.o
文件翻译成机器指令,然后把这些指令打包成可重定位目标程序的格式,并把结果放在hello.o
文件中。 - 链接阶段:
hello.o + printf.o -> hello
,printf函数存在于一个printf.o
内,为了能够让hello
程序能够调用printf
函数,链接器就需要将所有需要用的的.o
文件合并起来,从而得到可执行文件hello
。
- Title: 第一章 计算机系统漫游
- Author: Castle
- Created at : 2024-09-04 15:19:53
- Updated at : 2024-09-04 15:19:53
- Link: https://master--castlechen.netlify.app/2024/09/04/CSAPP_Chacpter1/
- License: This work is licensed under CC BY-NC-SA 4.0.