2018.7.22 第七章 linking

linking基本上是一个和编译结合的比较紧密的过程,因为编译只是把代码翻译成机器码,编译器并不知道它处理的各种函数和变量都在哪里,这时就需要链接器来告诉它,它处理的这些东西是不是确有其物并且都在哪。

自然地,当一个可执行文件涉及到多个来源时(比如说调用了很多库),链接器就会去扫描所有的来源,试图搞清楚所有的数据都是怎么回事。

(那么这里就涉及到一个比较容易出现的错误,就是当全局变量的名字重复的时候,链接规则可能会把一个东西当成另外一个东西,结果就是出现bug,你以为自己是在操作某个全局变量,实际上你操作的是另一个。)

这一节比较令我困惑的部分是,不是有预处理了吗?预处理阶段难道不是已经把所有include的东西全都打包成了一个巨型c文件了么?所以他们一直说的什么共享库什么的都是怎么回事?为什么库还会编译出来一个.o文件呢?

我搜了一下得到的结论是,include的库其实只包含了函数的声明,真正的内容其实还呆在系统的某个地方。说起来这样的安排也是比较符合逻辑的,要不然随便写一个带printf的简单小程序都要打包进去那么大一个库文件,这也太累赘了。。。链接在处理这种printf的时候,基本就是给编译器预留一个printf的位置,然后知道运行时才去调用库里的printf,这样就不会弄得内存里到处都是printf的代码了。

这一节内容好像没有对应的lab。话说虽然不知道这些知识具体有啥用,但是听起来好像还是蛮厉害的样子。

转载于:https://www.cnblogs.com/dynasty919/p/9350764.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值