程序的装入与链接(动、静态重定位)
用户程序要在系统中运行,必须要把它装入内存,然后再将其转变成一个可执行程序。
用户程序变为可执行程序都需要执行以下步骤:
-
编译:由编译程序进行编译,形成若干个目标模块。 (编译程序执行)
-
链接:由链接程序将编译好的若干个目标模块以及它们所需要的若干个库函数链接在一起。形成转入模块 (链接程序执行)
-
装入:由装入程序将链接好的转入模块转入到内存中。(装入程序执行)
程序的链接
由于用户不知道内存具体地址到底是多少,所以一般编写的地址都是相对地址,都是相对于每个模块中的起始地址,通常都是0。而且在链接之前,彼此是相互独立的。
静态链接
首先看看第一个问题:
链接多个模块为一个模块,各个模块使用的都是相对地址,其起始地址都是0,在链接成一块后,除了第一个起始地址为0,其后面的起始地址都应该发生变化。
第二个问题是要变换外部调用符号。如下图A中的CALL B 和B中的CALL C要变成相对地址
如下图:源程序编译后得到三个目标模块A、B、C,长度分别为L、M、N,链接后形成右侧的装入模块:
装入时动态链接
顾名思义,就是在程序装入时进行链接,具体操作还是和上图一样,就是时机不同“而已”
优点:
-
便于修改和更新:如果是静态链接,再修改或更新某个目标模块,则需要重新打开装入模块。这很明显低效,而且有时是不可能的。若采用动态连接方式,由于各目标模块是分开存放的,所以先对静态来说是件很容易的事情。
-
便于实现目标模块的共享:静态链接是把各模块都复制一遍,形成装入模块,无法实现对目标模块的共享。动态链接OS就很容易的将一个目标模块链接到几个应用模块上。实现对多个应用程序对该模块的共享。