分享

程序员每天充电5分钟:模块拼接——静态链接

 youxd 2017-01-22

小编已陆续连载链接、装载与库相关文章,如感兴趣敬请关注。

程序员每天充电5分钟:模块拼接——静态链接

今天我们简单的聊一聊静态链接,后面文章中我们再深入学习静态链接。人们一直在追求程序的模块化设计,因为当一个系统十分复杂时,我们不得不将一个复杂的系统逐步分割成小的系统以达到各个突破的目的。一个复杂的软件也是如此,人们把每个源代码模块独立地编译,然后按照需要把它们“组装”起来,这个组装模块的过程就是链接(Linking)

1 链接概述

链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接,本质上就是把一些指令对其他符号的地址的引用加以修正。链接过程主要包括了地址和空间分配(Adress and Storage Allocation)、符号决议(Symbol Resolution)和 重定(Relocation)

2 链接过程

最基本的链接过程如下图所示。每个模块的源代码(如.c)文件经过编译器编译成目标文件Objiect File,一般扩展名为.o或.obj),目标文件和库(Library)一起链接形成最终可执行文件。最常见的库就是运行时库(Runtime Library),它是支持支持程序运行的基本函数的的集合。库其实是一组目标文件的包,就是一些最常用的代码编译成目标文件后打包存放。

程序员每天充电5分钟:模块拼接——静态链接

链接过程

3 链接解例

现代的编译和链接过程也并非想象的那么复杂,其实链接是一个比较容易理解的概念。比如我们在程序模块main.c中使用另为一个模块func.c中的函数func()。我们在main.c模块中每一处调用func的时候都必须确切的知道func这个函数的地址,但是由于每个模块都是单独编译的,在编译器编译main.c的时候它并不知道func函数的地址,所以暂时把这些调用func的指令的目标地址搁置,等待最后链接的时候由连接器将这些指令的目标地址修正。如果没有连接器,需要我们手工把每个调用func的指令进行修正,填入正确的func函数地址。当func.c模块被重新编译,func函数的地址有可能改变时,我们在main.c中所使用的func的地址的指令将要全部重新调整。这些繁琐的工作将成为程序员的噩梦。使用连接器,你可以直接引用其他模块的函数和全局变量而无需知道他们的地址,因为连接器在链接的时候,会根据你所引用的符号func,自动去相应的func.c模块查找func的地址,然后将main.c模块中所有引用到func的指令重新修正,让他们的目标地址为真正的func函数的地址。这就是静态链接最基本的过程和作用。

小编已陆续连载链接、装载与库相关文章,如感兴趣敬请关注。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多