深刻理解预编译、编译、汇编和链接

在编译一个程序时,编译器(如GCC)会经历几个阶段,这些阶段包括预编译、编译、汇编和链接。下面我将逐一解释这些阶段:

1. **预编译(Preprocessing)**:

  • 这个阶段处理源代码文件中的预处理指令,如宏定义的展开(`#define`)、条件编译指令(`#ifdef`、`#ifndef`、`#endif`)、包含头文件(`#include`)以及删除多余的空格和注释。

  • 预编译器(preprocessor)会将所有的宏替换为它们的定义,并将包含的头文件内容插入到源代码中相应的位置。

  • 输出是预编译后的源代码,通常是一个`.i`或`.ii`文件,但这个文件通常不会被保存,而是直接传递给下一个阶段。

2. **编译(Compilation)**:

  • 编译阶段是将预处理后的源代码转换成汇编语言代码。

  • 编译器会进行语法检查、语义分析、优化等操作,将高级语言代码转换成低级的汇编代码。

  • 输出是汇编语言文件,通常以`.s`为扩展名。

3. **汇编(Assembly)**:

  • 汇编阶段是将汇编语言代码转换成机器代码。

  • 汇编器(assembler)会将汇编代码转换成计算机可以理解的二进制代码,生成目标文件 (object file),通常以`.o `或`.obj`为扩展名。

  • 目标文件包含了程序的一部分或全部的机器代码,但还不能直接运行,因为它们还没有被链接。

4. **链接(Linking)**:

  • 链接阶段是将一个或多个目标文件与库文件、其他目标文件等链接在一起,生成一个可执行文件。

  • 链接器(linker)会解析不同目标文件之间的外部依赖关系,将它们合并成一个单一的可执行文件。

  • 如果程序中使用了库函数,链接器还会将这些库中相应的代码链接到最终的可执行文件中。

  • 输出是一个可执行文件,可以在操作系统中直接运行。

这个过程可以用下面的命令行来表示:

cpp 复制代码
gcc -o hello hello.c
  • 这里,`gcc` 首先对 `hello.c` 进行预编译,然后编译成汇编代码,接着汇编成目标文件,最后链接成最终的可执行文件 `hello`。
相关推荐
我在人间贩卖青春12 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春12 天前
汇编之伪操作
汇编·伪操作
济61712 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka12 天前
汇编TEST指令
汇编
我在人间贩卖青春12 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春12 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka13 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子13 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka13 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春14 天前
汇编之分支跳转指令
汇编·arm·分支跳转