1. 编译和链接【《链接、装载与库》学习笔记】

使用gcc命令编译的时候可以分解为4个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

1
2
gcc hello.c
./a.out

预编译

预编译将相关头文件被预编译器cpp预编译成一个.i文件。C++预编译后的文件扩展名时.ii,相当于如下命令(-E表示只进行预编译):

1
gcc -E hello.c o hello.i

1
cpp hello.c > hello.i

主要处理所有的#define#include等命令(展开了所有的宏),添加行号以便编译错误显示行号。但是保留所有的#pragma编译器指令。

编译

编译过程相当于如下命令:

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

gcc把预编译和编译使用cc1完成,可以直接调用:

1
/usr/lib/gcc/i486-linux-gnu/4.1/cc1 hello.c

或者使用

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

编译过程一般可以分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

词法分析

首先源代码程序被输入到扫描器(Scanner),扫描器简单的进行词法分析,运用一种类似于有限状态机的算法可以将源代码字符串分割成一系列的记号。

词法分析的记号一般分为关键字、标识符、字面量和特殊符号。

继续编译

  • 语法分析器对记号进行语法分析,产生语法树
  • 语义分析器可以分析静态语义
  • 源代码优化器对语法树进行优化,将语法树转化成中间代码。
  • 编译器后端主要包括代码生成器目标代码优化器

链接

链接过程主要包括地址和空间分配符号决议重定位
重定位指的是给程序中每一个绝对地址引用的位置“打补丁”,使他们指向正确的位置。


1. 编译和链接【《链接、装载与库》学习笔记】
http://blog.bluspace.ren/2025/11/30/1. 编译和链接【《链接、装载与库》学习笔记】/
作者
Blauter
发布于
2025年11月30日
许可协议