打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

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

1 链接概述

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

2 链接过程

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

链接过程

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函数的地址。这就是静态链接最基本的过程和作用。

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
动态链接库创建与使用
程序的链接和装入及Linux下动态链接的实现
linux平台的链接与加载
程序怎么在系统中运行,详细解读程序在系统中的装入和链接
LNK2001错误探究
undefined reference to" 问题解决方
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服