程序实现的过程中,电脑中存在两个环境:翻译环境(用于将源代码转换为机器指令) 和 运行环境(执行翻译生成的机器指令)
在翻译环境中将源代码翻译为机器指令的过程中,分为两大部分:> 编译 和 链接
在一个工程(solution)下,通常可能存在多个源程序文件,在编译过程中,各个源程序文件会单独被 编译器 编译为各个目标文件(文件后缀名为 .obj),各个目标文件会与 链接库(主要是各种库函数) 在 链接器 的处理下,生成一个完整的可执行程序
编译部分分为三大部分:> 预编译 编译 汇编
在VS中,可以通过使用 extern 的声明 来使用处于其他源文件中的函数;预编译(又称为预处理)
gcc test.c -E -o test.i
在预编译阶段
#inlcude
#include #pragama #define
删除注释:在预编译阶段会 被删除 或者 被替换为空格
预编译阶段的操作主要是 文本操作
编译gcc test.i -S
将 C语言代码 转换为 汇编代码:
- 语法分析
- 词法分析
- 语义分析
- 符号汇总:主要对全局的符号(变量)进行汇总
gcc test.s -c
会将编译阶段生成的汇编代码转化成二进制指令
在符号汇总之后,在汇编阶段形成符号表
链接在链接阶段会采取以下操作:
- 合并段表:Linux环境利用elf来组织文件,可以使用命令 readelf 来读取目标文件
- 符号表的重定位:将 函数声明中的符号地址 替换为 实际函数的符号地址



