Linux共享库的动态加载(附测试案例)

共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库。常用于某些系统或者应用程序的自动升级。
在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h,并在一个独立的库中予以实现。使用这组函数需要包含此头文件,并链接该库。

使用共享库的动态加载时需要用到的函数
1、dlopen函数:打开一个动态链接库,并返回动态链接库的句柄
void *dlopen(const char *filename, int flag);
参数解析:
1)字符串形式的文件名(路径名),主要用于指定共享库文件名
2)加载共享库的方式,常用方式如下:
RTLD_LAZY - 延迟加载
RTLD_NOW - 立即加载
返回值:成功时返回所对应的句柄(地址)信息,失败返回NULL;
2、dlsym函数:根据动态链接库操作句柄与符号,返回符号对应的地址
void *dlsym(void *handle, const char *symbol);
参数解析:
1)表示具体的句柄信息,也就是dlopen函数的返回值;
2)字符串形式的符号/标识符,通常指“函数名”;
返回值:成功返回函数对应的地址信息,失败返回NULL;
3、dlclose函数:用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
int dlclose(void *handle);
参数解析:
具体的句柄信息,也就是dlopen函数的返回值。
4、dlerror函数:
可以返回出错信息,返回值为NULL时表示操作函数执行成功。
char *dlerror(void);
参数解析:
具体的句柄信息,也就是dlopen函数的返回值。
该函数主要用于获取dlopen()/dlsym()/dlclose()函数调用期间产生的错误信息,如果没有产生错误,则返回NULL;

这里用上一篇文章中生成的共享库作为需要打开的共享库
链接地址:
Linux C语言高级编程之共享库(附测试案例)
http://blog.csdn.net/coding13/article/details/78589141
目录结构如下图:
Linux共享库的动态加载(附测试案例)

2、测试代码
Linux共享库的动态加载(附测试案例)
3、调用方式及结果如下:
Linux共享库的动态加载(附测试案例)
这里使用-ldl选项指明生成的对象模块需要使用共享库。

以下是我的个人公众号,主要作为C/C++语言技术分享使用,该公众号里干货满满,如果您有对此博文的疑问或者java方面的问题也可以添加公众号交流讨论。最后,再次希望您能添加关注,互相交流互相学习共同进步:
Linux共享库的动态加载(附测试案例)