概述
显式运行时链接
支持动态链接的系统都支持一种更加灵活的模块加载方式,叫做显示运行时链接(Explicit Run-time Linking),有时也叫运行时加载。也就是让程序自己在运行时控制加载指定的模块,并且可以在不需要该模块时将其卸载。一般的共享对象不需要进行任何修改就可以进行运行时装载,这种共享对象往往被叫做动态装载库(Dynamic Loading Library),其实本质上它跟一般的共享对象没什么区别,只是程序开发者使用它的角度不同。
在Linux 中,从文件本身的格式上来看,动态库实际上跟一般的共享对象没有区别。主要的区别是共享对象是由动态链接器在程序启动之前负责装载和链接的,这一系列步骤都由动态链接器在程序启动之前负责装载和链接的,这一系列步骤都由动态链接器自动完成,对于程序本身是透明的;而动态库的装载是通过一系列由动态链接库提供的API,具体的讲有4个函数:打开动态库(dlopen)、查找符号(dlsym)、错误处理(dlerror)以及关闭动态库(dlclose),程序可以通过这几个API对动态库进行操作。这几个API的实现是在/lib/libdl.so.2里面,他们的声明和相关常量被定义在系统标准库文件
1.dlopen()
打开一个动态库,并将其加载到进程的地址空间,以完成初始化过程。
2.dlsym()
dlsym函数基本上是运行时装载的核心部分,我们可以通过这个函数找到所需要的符号。
3.dlerror()
每次我们调用dlopen()、dlsym()或者dlclose()以后,我们都可以通过dlerror()函数来判断上一次调用是否成功。dlerror()的返回值类型是char *,如果返回NULL,则表示上一次调用成功;如果不是,则返回相应的错误消息。
4.dlclose()
dlclose()的作用跟dlopen()刚好相反,它的作用的是将一个已经加载的模块卸载。
第七章小结
装载时重定位和地址无关代码是解决绝对地址引用问题的两个方法,装载时重定位的缺点是无法共享代码,但是他的运行速度较快;而地址无关代码的缺点是运行速度较慢,但它可以实现代码段在各个进程之间的共享。
最后
以上就是辛勤巨人为你收集整理的程序员的自我修养第七章读书笔记-动态链接2的全部内容,希望文章能够帮你解决程序员的自我修养第七章读书笔记-动态链接2所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复