CSAPP - 7. 链接
7.1 编译器驱动程序¶
一个.c程序从调用cpp编译起经过以下几步,成为一个可执行目标文件 (executable object file)
- 预处理 (preprocess): cpp生成.i文件 将源程序翻译成一个ASCII码的中间文件,gcc -E
- 编译 (compile): ccl生成.s文件 将中间文件翻译成一个ASCII汇编语言文件,gcc -S
- 汇编 (assemble): as生成.o文件 将汇编文件翻译成一个可重定位目标文件(relocatable object file) gcc -c
- 链接 (link): 运行链接器ld,将rof和一些必要的系统文件组合起来,创建一个可执行目标文件
如main.c和sum.c
// main.c
#include <stdio.h>
int sum(int* a, int n);
int array[2] = {1, 2};
int main() {
int val = sum(array, 2);
printf("%d\n", val);
return val;
}
// sum.c
int sum(int* a, int n) {
int i, s = 0;
for (i = 0; i < n; i ++) s += a[i];
return s;
}
gcc分步编译如下,最终组合成一个可执行目标文件a.out
gcc -E main.c -o main.i
gcc -E sum.c -o sum.i
gcc -S main.i -o main.s
gcc -S sum.i -o sum.s
gcc -c main.s -o main.o
gcc -c sum.s -o sum.o
gcc main.o sum.o -o a.out
./a.out # 3
各选项含义为
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link