当我们采用异步事件驱动模型,保证主程序逻辑不变,将各个业务用动态链接库的形式加载进来,这就是所谓的插件。linux和Windows提供了加载和处理动态链接库的系统调用,非常方便。该文章记录一个在使用过程中的问题。
1、Linux
Linux提供了一套API来动态装载库:
dlopen,打开一个动态库,并为使用该库做些准备。
dlsym,在打开的库中查找符号的值。dlclose,关闭库。
dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。
包括头文件:
#include <dlfcn.h>
函数定义:
void * dlopen( const char * pathname, int mode);
函数描写叙述:mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:
(1)解析方式
RTLD_LAZY:在dlopen返回前,对于动态库中的没有定义的符号不运行解析(仅仅对函数引用有效。对于变量引用总是马上解析)。
RTLD_NOW: 须要在dlopen返回前。解析出全部没有定义符号,假设解析不出来。在dlopen会返回NULL,错误为:: undefined symbol: xxxx.......
(2)作用范围,可与解析方式通过“|”组合使用。
RTLD_GLOBAL:动态库中定义的符号可被其后打开的其他库解析。
RTLD_LOCAL: 与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其他库重定位。假设没有指明是RTLD_GLOBAL还是RTLD_LOCAL。则缺省为RTLD_LOCAL。
(3)作用方式
RTLD_NODELETE: 在dlclose()期间不卸载库,而且在以后使用dlopen()又一次载入库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。
RTLD_NOLOAD: 不载入库。

本文介绍了在Linux和Windows下动态链接库的加载和使用方法,如Linux的dlopen、dlsym等API和Windows的LoadLibrary、GetProcAddress等函数。在实践中遇到的问题是动态库初始化时因依赖其他库导致的非法内存访问,通过设置RTLD_GLOBAL解决了这个问题。同时,探讨了Windows下LoadLibraryEx的使用,特别是LOAD_WITH_ALTERED_SEARCH_PATH标志的作用。

2388

被折叠的 条评论
为什么被折叠?



