编译链接基本原理

编译过程分为四个阶段,如下图所示:
在这里插入图片描述
1、预编译
将.c文件生成.i文件,在预处理器里主要做以下处理
a、进行宏替换,也就是展开所有的宏定义,并将#define删除
b、处理条件预编译指令
c、处理各种头文件
d、删掉所有注释
e、添加文件标识和行号
f、保留#progma
注意:此时不会判断语法等错误

2、编译
将.i文件转为.s文件,在编译器里主要做以下处理
主要 将进行语法的处理,判断,将提示警告、错误等信息,并进行代码优化。

3、汇编
将.s文件转为.o文件,在汇编器里主要做以下处理
注意:.o文件又被称为可重定位的二进制文件
(重定位的解释可参考:https://blog.csdn.net/yesyes120/article/details/78944991)
a、将我们写的代码翻译成机器能够识别的语言即二进制代码

4、链接
将.o文件生成.exe文件,被称为可执行目标程序,在链接器里主要做以下处理
a、合并段(相同段之间)和符号表,整个链接过程就是将几个输入目标文件加工合并成一个输出文件。
b、 进行符号解析:在符号引用的地方找到符号定义的地方
c、分配地址和空间
d、 符号的重定位

拓展:动态编译/静态编译

1、动态编译
动态编译使用的是动态库文件进行编译,我们的程序在编译时会调用动态库中相关用到的函数,注意两者之间只是建立联系,最终的可执行程序并没有包括动态库,运行的时候调用即可,这就使得可执行程序体积较小,但是该可执行程序很难在另一台机器上运行,除非这台机器也有相关环境。
2、静态编译
静态编译使用的是静态库文件进行编译,最终的可执行文件包括了整个静态库文件,体积较大,但是该可执行程序可以在其他机器上运行。

注意:
该篇文字是对以前学习的整理,摘抄出处已经不清楚了,若有侵权,请告知,立删!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值