1.动态链接与静态链接的区别

1.为什么要动态链接?

由于静态链接的缺点:
1)静态链接会大量浪费内存和磁盘空间。
2)模块更新麻烦。

2.静态链接机制?

静态链接的机制就是:比如有两个程序program1与program2,这两个程序都依赖一个共同的库lib1,那么在进行静态链接方式分别编译program1与program2时,lib1都会分别被链接到program1与program2中去,因此在编译生成的可执行文件proram1和program2中会分别存在一个lib1的副本。假如系统不止2个应用程序,有1000个以上,那就会有大量的重复副本,占用大量的内存或者磁盘空间。另外,静态链接的机制导致模块更新非常麻烦,比如如果lib1模块更新了功能,那么就需要重新编译program1与program2,也就是一旦一个静态链接的库文件改变了,就需要重新编译应用程序,即使应用程序其他各模块的内容都没有改变。

3.动态链接机制?

动态链接在编译生成程序的时候不会对目标文件进行链接,而是等到了程序运行的时候才进行文件的链接。也就是在执行program1的过程时才开始进行链接lib1.当我们要执行program1时,系统首先加载program.o目标文件,当系统发现program.o中用到了lib1.o时,就会接着加载lib1.o目标文件,如果还有其他的依赖则同理全部加载至内存。当所有的依赖关系满足后,依赖的目标文件都存在内存中,系统开始进行链接工作,这个链接工作跟静态链接非常相似,包括符号解析,地址重定位等。完成这个步骤后,系统将控制权交给program1的程序的入口,入口程序开始执行。当我们要执行program2时,那么系统此时只需要加载program2.o,lib1.o已经在内存中,不需要再重复加载。很明显,这样的机制下,系统不需要重复加载多个副本到内存中。
另外,在进行模块更新lib1时,也是只需要将原先的lib1程序覆盖掉就行。不需要重新编译program1及program2等操作。

4.程序可扩展性和兼容性

动态链接还有一个特点就是程序在运行时可以动态的选择加载各个程序模块,这个优点就是后来被用来制作程序的插件

5.动态链接仍然有其缺点

1)当程序所依赖的某个模块更新后,由于新的模块与旧的模块之间接口不兼容,导致了原有的程序无法运行的问题。
2)动态链接是在每次程序运行时进行链接,那会导致每次程序运行会变慢。当然经过实践的证明,性能损失大约在5%以下,而且这点性能损失换取程序在空间上的节省和程序构建和程序升级时的灵活性,是相当值得的。

猜你喜欢

转载自blog.csdn.net/chg2663776/article/details/116660558