请选择 进入手机版 | 继续访问电脑版
快捷导航
3 93

服务器更新:Linux下的显式调用so库

小亮 于 2017-12-11 16:04 发表在 [头脑风暴] [复制链接]
本帖最后由 小亮 于 2017-12-11 18:50 编辑

显式调用虽然代码复杂但是却比隐式调用灵活,我们不必再编译时确定加载那个动态链接库,可以运行时在确定甚至重新加载。
  1. /*mylib.h*/
  2. void Print();

  3. /*mylib.c*/
  4. #include <stdio.h>
  5. #include "mylib.h"
  6. void Print()
  7. {
  8.     printf("This is in mylib\n");
  9. }
复制代码
编译方法如下:
gcc -fpic -shared mylib.c -o mylib.so
gcc -fpic -shared mynewlib.c -o mylib.so
显式调用的方式,不必包含mylib.h,但是需要增加几个系统调用:
  1. #include <stdio.h>
  2. #include <dlfcn.h> // 显式加载需要用到的头文件

  3. int main(void)
  4. {
  5.     while(1)
  6.     {
  7.         void *pdlHandle = dlopen("./mylib.so", RTLD_LAZY); // RTLD_LAZY 延迟加载
  8.         char *pszErr = dlerror();
  9.         if( !pdlHandle || pszErr )
  10.         {
  11.             printf("Load mylib failed!\n");
  12.             return 1;
  13.         }
  14.         void (*Print)() = dlsym(pdlHandle, "Print"); // 定位动态链接库中的函数
  15.         if( !Print )
  16.         {
  17.              pszErr = dlerror();
  18.              printf("Find symbol failed!%s\n", pszErr);
  19.              dlclose(pdlHandle);
  20.              return 1;
  21.         }

  22.         Print(); // 调用动态链接库中的函数

  23.         dlclose(pdlHandle); // 系统动态链接库引用数减1
  24.     }
  25.     return 0;
  26. }
复制代码
显式调用的编译方式:
gcc -o test test.c -ldl -L/home/project/dll/201712111430 mylibso
注意:要加上动态链接库的搜索路径,否则编译器只会到系统路径中寻找
添加-dll选项,以使用显式相关的函数调用
测试结果:
直接运行./test,结果如下:

如果此时将mylib.so库替换则程序终止,结果如下:
cp ./mynewlib.so ./mylibso

重新运行./test后,so库被替换,结果如下:

总结:在运行时调用dlopen函数,引用相应的so库。若so库被更改,则程序会终止。重新运行后则是使用被更改的so库。任然需要重启。如果在dlsym(pdlHandle, "Print")前进行检测mylib.so文件是否存在,若不存在则进行延时再重新检测,并延时一秒while(access("./mylib.so",0))delay_ms(1000);
此时可以进行so库替换,并且程序正常运行。
参考博客:
http://bbs.anymsg.net/forum.php? ... d=95&extra=page%3D1
http://www.cnblogs.com/Xiao_bird/archive/2010/03/01/1675821.html


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 3 个关于本帖的回复 最后回复于 2017-12-11 22:16

李腾杰 中级会员 发表于 2017-12-11 16:49:16 | 显示全部楼层
点到第一个链接吓到我了。。。
Connecting & Messaging from Any.
举报 使用道具
小亮 中级会员 发表于 2017-12-11 18:44:28 | 显示全部楼层
李腾杰 发表于 2017-12-11 16:49
点到第一个链接吓到我了。。。

惊不惊喜,意不意外,刺不刺激
Connecting & Messaging from Any.
举报 使用道具
chinmel 版主 发表于 2017-12-11 22:16:06 from Mobile | 显示全部楼层
在替换时,试试dlclose诸如此类的,然后暂停程序,随后替换,然后dlopen恢复。
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 19:38