chap-7 7.1 为什么需要动态链接?

7.1 为什么要动态链接
为什么静态链接会被舍弃?首先,从空间方面而言,因为每个程序在装载进内存
运行之前,要将程序和所需要的其他模块进行链接。比如,程序A用到了printf.o
模块,同时程序B也用到了printf.o模块,如果磁盘中有成百上千个可执行文件用到
了printf.o模块,那么printf.o将被链接到各个最终的可执行文件中。printf.o的不可
共享导致了磁盘和内存空间的浪费。其次,静态链接对程序的更新、部署、发布也会
带来很多麻烦。比如program1用到了模块Lib.o,并且该模块是第三方厂商提供的,当
该厂上更新Lib.o模块后,program1需要和Lib.o重新进行链接形成可执行文件,这会
导致程序在更新、部署和发布过程中产生种种不便。

而动态链接(Dynamic Linking)就是不对那些组成程序的目标文件进行链接,等到
程序运行才进行链接。

动态链接还有一个特点就是程序在运行时可以动态地选择加载各种程序模块,这个
优点就是后来被人们用来制作程序的插件(Plug-In)。比如某个公司开发完某个产品,
它按照一定的规则制定好程序的接口,其他公司或开发者按照这种接口编写符合要求的
动态链接文件。该产品程序可以动态地载入各种由第三方开发的模块,在程序运行时
动态的链接,实现程序功能的扩展。

动态链接的基本思想是把程序按照模块拆分成各个相对独立的部分,在程序运行时才
将他们链接在一起形成一个完整的程序,而不是像静态链接一样把所有的程序模块
都链接成一个单独的可执行文件。目前,几乎主流的操作系统都支持动态链接的方式,
在Linux系统中,ELF动态链接文件被称为动态共享对象(DSO,Dynamic Shared Object),
简称共享对象,它们一般都是以“.so”为扩展名的一些文件;而在Windows系统中,动态链接
文件被称为动态链接库(Dynamic Linking Library),它们就是我们经常见到的以
“.dll”为扩展名的文件。

在Linux中,常用的C语言的运行库glibc,它的动态链接形式的版本保存在/lib目录下,文件
名叫做“libc.so”,整个系统只保留一份C语言运行库的动态链接文件,而所有用C语言
编写的、动态链接的程序都可以在运行时使用它。当程序被装载的时候,系统的动态链接器会将
程序所需要的所有动态链接库装载到程序的地址空间,并且将程序中所有的未决议符号
绑定到相应的动态链接中,并进行重定位工作。

posted on 2014-01-12 00:51  Persistence  阅读(210)  评论(0编辑  收藏  举报

导航