我是靠谱客的博主 安静老虎,最近开发中收集的这篇文章主要介绍静态链接、装入时动态链接和运行时动态链接,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实现链接的方法有三种:静态链接、装入时动态链接和运行时动态链接。

①静态链接

经编译后所得到的三个目标模块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去找到该模块,将它装入内存,并把它连接到调用者模块上。

最后

以上就是安静老虎为你收集整理的静态链接、装入时动态链接和运行时动态链接的全部内容,希望文章能够帮你解决静态链接、装入时动态链接和运行时动态链接所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部