跳转至

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