为什么要动态链接
静态链接使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,大大提高了开发的效率,但是缺点也很明显,比如浪费内存和磁盘空间、模块更新困难等问题,动态链接就可以完美的解决上述问题。
动态链接及优点
动态链接思想:把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起,等到程序运行时才进行链接。
优点一:对于共享的目标文件被多个项目引用时,动态链接只会在内存和磁盘中存储一份目标文件,很好的节省内存。
截屏2021-07-21 上午11.25.23.png
优点二:模块升级变得更加容易,只需要将旧的目标文件覆盖掉,当程序下一次运行的时候,新版本的目标文件自动装载到内存并且链接起来。
优点三 : 程序在运行时可以动态地选择加载各种程序模块,所以我们可以利用此优点来制作程序的插件。
优点四:可以加强程序的兼容性,一个程序在不同的平台运行时可以动态链接到操作系统提供的动态库,从而消除了程序对不同平台之间依赖的差异性。
截屏2021-07-21 下午3.57.50.png
当程序模块Program1.c被编译成为Program1.o时,编译器还不知道foobar(共享库Lib.so中的函数)函数的地址。当链接器将Program1.o链接成可执行文件时,链接器必须确定Program1.o中引用foobar函数的性质。如果foobar是一个定义在静态目标模块中的函数,那么链接器将会按照静态链接的规则,将Program1.o中的foobar地址引用重定位;如果foobar是一个定义在动态共享模块中的函数,那么链接器就会将这个符号的引用标记为一个动态链接的符号,不对它进行地址重定位,把这个过程留到装载时再进行。
共享对象的最终装载地址在编译时是不确定,而是在装载时,装载器根据当前地址空间的空闲情况,动态分配一块足够大小的虚拟地址空间给相应的共享对象。