概述
实现链接的方法有三种:静态链接、装入时动态链接和运行时动态链接。
①静态链接
经编译后所得到的三个目标模块A、B、C,他们的长度分别为 L、M、N。在模块A中,有
一条语句CALL B,用于调用模块B。在模块B中,有一条语句CALL C, 用于调用模块C。B和C都属于外部
调用符号,在将这几个目标模块链接装配成一个装入模块时,需要解决以下两个问题:
●对相对地址进行修改
通常由编译程序产生的所有目标模块,其起始地址都为0,每个模块中的地址都是相对于0的。在链接成
一个装入程序后,模块B和C的起始地址不再是0,而是L和L+M,此时需修改B和C中的相对地址,即模块
B中的所有相对地址加上L,模块C中的相对地址都加上L+M。
●变换外部调用符号
即将每个模块中所用的外部调用符号,都变换为相对地址,如把B的起始地址变换为L;C的起始地址变
换为L+M。这种先进行链接所形成的一个完整的装入模块,又称为可执行文件。
通常都不要拆开它,要运行时可直接将它装入内存。这种事先进行链接,以后不再拆开的链接方式,称为
静态链接方式。
②装入时动态链接(Load-Time Dynamic Linking)
用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的.即在装入一个目标模块时,若
发生一个外部模块调用,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要修改目标模
块中的相对地址。装入时动态链接方式有以下优点:
●便与软件版本的修改和更新
在采用装入时动态链接方式时,要修改或更新各个目标模块,是件非常容易的事,但对于经静态链接以
装配在一起的装入模块,如果要修改或更新其中的某个目标模块时,则要求重新打开装入模块,这不仅
是低效的,而且有时是不可能的。
●便于实现目标模块共享
若采用装入时动态链接方式,OS能够将一个目标模块链接到几个应用模块,即实现多个应用程序对该模
块的共享;然而,采用静态链接方式时每个应用模块都必须含有该目标模块的拷贝,否则无法实现共享。
③运行时动态链接(Run –Time Dynamic Linking)
虽然前面所介绍的动态装入方式,可将一个装入模块装入到内存的任何地方,但装入模块的结构是静态
的,它主要表现在两个方面:一是在进程的整个执行期间,装入模块不改变;再者是每次运行时的装
入模块都是相同的。实际上,在许多情况下,每次要运行的模块可能是不相同的,但由于事先无法知道
本次要运行哪些模块,故只能是将所有可能要运行到的模块,在装入时全部链接在一起,是每次执行时
的装入模块是相同的。显然这是低效的。因为这样,在装入模块的运行过程中,往往会有某些目标模块
根本就不运行。比较典型的例子是错误处理模块,如果程序在整个运行过程中,都不出现错误,便不会
用到该模块。
能有效的改变这种情况的链接方式,是最近几年流行起来的运行时动态链接方式。这种链接方式,可将
某些目标模块的链接,推迟到执行时才进行。即在执行过程中,若发现一个被调用模块尚未装入内存时
,由OS去找到该模块,将它装入内存,并把它连接到调用者模块上。
最后
以上就是安静老虎为你收集整理的静态链接、装入时动态链接和运行时动态链接的全部内容,希望文章能够帮你解决静态链接、装入时动态链接和运行时动态链接所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复