编译与链接

编译与链接

编译与链接的过程

预处理(Prepressing)、 编译(Compilation)、汇编(Assembly)和链接(Linking)

image-20220208103928489

预编译

首先是源代码文件hello.c和相关的头文件,如stdio.h等被预编译器预编译成一个.i文件。相当于如下命令:

1
gcc –E hello.c –o hello.i

或者

1
cpp hello.c > hello.i

主要处理那些源代码文件中的以“#”开始的预编译指令。如 “#include”会把包含的文件插入到预编译指令的位置、“#define ”会展开所有宏定义等。

编译

把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。相当于如下命令:

1
gcc –S hello.i –o hello.s

现在版本的GCC把预编译和编译两个步骤合并成一个步骤,使用一个叫做cc1的程序来完成这两个步骤

1
gcc –S hello.c –o hello.s

汇编

将汇编代码转变成机器可以执行的指令,可以调用汇编器as来完成:

1
as hello.s –o hello.o

或者使用gcc命令经过预编译、编译和汇编直接输出目标文件:

1
gcc –c hello.c –o hello.o

链接

一大堆文件链接起来才可以得到可执行文件

1
ld -static /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux- gnu/4.1.3/crtbeginT.o -L/usr/lib/gcc/i486-linux-gnu/4.1.3 -L/usr/lib - L/lib hello.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i486- linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

后面会介绍为什么要链接这么多东西

编译器

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间语言生成
  • 目标代码生成与优化

链接器

很久以前人们写代码全写在一个文件中,直到后来没有能力维护一个程序。

链接器的历史比编译器还长

  • Copyrights © 2018-2022 Haojia Zhu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信