请稍侯

程序的构建过程

28 November 2020

程序的构建过程

以最简单的hello.c为例

#include <stdio.h>

int main() {
    printf("Hello World\n");
    return 0;
}

gcc hello.c 做了什么事情?

预处理(也叫预编译Prepressing) -> 编译(Compilation) -> 汇编(Assembly) -> 链接(Linking)

预编译

处理源文件中以#开头的预编译指令、删除注释、添加行号与文件标识等。
.c文件预编译成.i文件,.cpp文件成.ii文件,使用gcc 加-E 选项表示只进行预编译。

gcc -E hello.c -o hello
或
cpp hello.c > hello.i

编译

把预处理文件转化成汇编代码文件。

gcc -S hello.i -o hello.s

现在版本的gcc把预编译与编译两个步骤合并成了一个步骤,使用了一个叫cc1的程序;对应的C++有cc1plus,Objective-C是cc1obj;fortran是f771;java是jc1。

cc1 hello.c

汇编

将汇编代码转变成机器可以执行的指令。

as hello.s -o hello.o
或
gcc -c hello.s -o hello.o
或直接使用gcc
gcc -c hello.c -o hello.o

链接

将不同代码产生的模块组装起来,过程主要包括:地址和空间分配、符号决议及重定位(地址修正)。

ld -static /ur/lib/crti.o -L/usr/lib -L/lib hello.o -start-group -lgcc_en -lc --end-groupcrtn.o