编译链接

目录

1,编译链接

(1)预处理(预编译)

(2)编译

(3)汇编

(4)链接

2,编译过程

(1)词法分析

(2)语法分析

(3)语义分析

3,链接


1,编译链接

编译链接分为4个步骤:预处理、编译、汇编、链接

(1)预处理(预编译)

预编译过程把源文件变成.i文件,主要处理以#开头的预编译指令,比如#include、#define等

主要处理规则:

编译链接_第1张图片

(2)编译

编译是把预处理完的文件进行一系列词法分析、语法分析、语义分析、优化后,生成相应的汇编代码文件.s。

(3)汇编

汇编器将汇编代码变成机器指令,没有复杂语法,也没有语义,也不需要优化,只需要一一对应的翻译即可,最后生成目标文件,Windows中的.obj,Linux中的.o。

(4)链接

链接过程把.o文件和.a库文件链接到一起,生成可执行文件。

2,编译过程

(1)词法分析

词法分析就是把源代码变成一个个词,即token,

每个token的类型有关键字、标识符、字面量、特殊符号等。

(2)语法分析

语句分析就是建立语法树,一个语句对应一颗语法树。

编译链接_第2张图片

(3)语义分析

有些符合语法的句子在语义层面不合法,比如两个指针相乘。

编译器所能分析的是静态语义,即编译器可以确定的语义,另外一种是动态语义,即运行期语义。

编译链接_第3张图片

3,链接

链接过程主要包括地址和空间分配、符号决议(符号绑定/地址绑定)、重定位等。

各个模块是单独编译的,编译完成之后链接起来的过程叫静态链接。

编译时,对于其他模块的各符号地址都是未知的,先暂时写成0,这里会留一个重定位入口,

链接时,各个符号都有了地址之后,把各模块中各符号的地址都刷新成正确的值,这个过程叫重定位。

动态链接库:Windows中的.dll,Linux中的.so

静态链接库:Windows中的.lib,Linux中的.a

你可能感兴趣的:(编译链接)