动态库的加载涉及到4个API接口:打开动态库(dlopen)、查找符号(dlsym)、错误处理(dlerror)以及关闭动态库(dlclose),程序可以通过这几个API对动态库进行操作。
1.dlopen()
dlopen()函数用来打开一个动态库,并将其加载到进程地址空间,完成初始化的过程,它的C原型定义为:
void * dlopen(const char *filename, int flag);
第一个参数是加载动态库的路径,如果这个路径是绝对路径(以"/"开始的路径),则该函数将尝试直接打开该动态库;如果是相对路径,那么dlopen()会尝试在以一定的顺序去查找该动态库文件:
1.查找有环境变量 LD_LIBRARY_PATH 指定的一系列目录。
2.查找由/etc/ld.so.cache里面所指定的共享库路径。
3./lib、/usr/lib。
当然,这在理论上不应该成为一个问题,因为所有的库都应该只存在于某个目录中,而不应该在多个目录中有不同的副本,这将会导致系统变得极为不可靠。
很有意思的是,如果我们将filename这个参数设置为0,那么dlopen返回的将是全局符号表的句柄,也就是说我们可在运行时找到全局符号表里面的任何一个符号,并且可以执行它们,这有些类似高级语言反射(Reflection)的特性。全局符号表包括了程序的可执行文件本身、被动态链接器加载到进程中的所有共享模块以及在运行时通