2018.7.22 第七章 linking
Posted dynasty919
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.7.22 第七章 linking相关的知识,希望对你有一定的参考价值。
linking基本上是一个和编译结合的比较紧密的过程,因为编译只是把代码翻译成机器码,编译器并不知道它处理的各种函数和变量都在哪里,这时就需要链接器来告诉它,它处理的这些东西是不是确有其物并且都在哪。
自然地,当一个可执行文件涉及到多个来源时(比如说调用了很多库),链接器就会去扫描所有的来源,试图搞清楚所有的数据都是怎么回事。
(那么这里就涉及到一个比较容易出现的错误,就是当全局变量的名字重复的时候,链接规则可能会把一个东西当成另外一个东西,结果就是出现bug,你以为自己是在操作某个全局变量,实际上你操作的是另一个。)
这一节比较令我困惑的部分是,不是有预处理了吗?预处理阶段难道不是已经把所有include的东西全都打包成了一个巨型c文件了么?所以他们一直说的什么共享库什么的都是怎么回事?为什么库还会编译出来一个.o文件呢?
我搜了一下得到的结论是,include的库其实只包含了函数的声明,真正的内容其实还呆在系统的某个地方。说起来这样的安排也是比较符合逻辑的,要不然随便写一个带printf的简单小程序都要打包进去那么大一个库文件,这也太累赘了。。。链接在处理这种printf的时候,基本就是给编译器预留一个printf的位置,然后知道运行时才去调用库里的printf,这样就不会弄得内存里到处都是printf的代码了。
这一节内容好像没有对应的lab。话说虽然不知道这些知识具体有啥用,但是听起来好像还是蛮厉害的样子。
以上是关于2018.7.22 第七章 linking的主要内容,如果未能解决你的问题,请参考以下文章