编译和链接是把人写的源代码变成机器可执行程序的两个关键步骤。
1. 编译
任务:把高级语言(如 C/C++)翻译成机器能识别的二进制指令。
过程分四步:
• 预处理:展开头文件、替换宏、删除注释,生成纯 C 代码。
• 词法-语法-语义分析:把代码拆成 token,构建语法树,检查类型和作用域。
• 优化:根据 -O2 等级别对代码做性能或体积优化。
• 生成汇编:输出平台相关的汇编文件(.s)。
最终得到的目标文件(.o 或 .obj)已经是二进制格式,但还不能直接运行,因为里面的函数、全局变量等外部引用仍处于“未定义”状态。
2. 链接
任务:把多个目标文件和库文件“拼接”成一个完整的可执行文件。
原理:
• 符号解析:遍历所有目标文件和库,找出每个未定义符号(函数、变量名)对应的定义。
• 重定位:给每个符号分配最终的内存地址,并把原来目标文件里的“占位符”地址全部替换为真实地址。
• 合并段:把各目标文件的代码段、数据段等按规则合并到可执行映像里。
结果:生成一个可被操作系统直接加载运行的二进制可执行文件。