日志线挂载插件出现dlopen段错误

标签:dlopen   段错误   日志加载   外挂计算    3020人阅读 评论(1)
分类:

      在回传配置线的日志的时候,出现了挂载外挂计算插件的dlopen错误,现记录一下过程。


一、现象

      使用GDB前台跑,出现的dlopen段错误如下图所示:


11.jpg


二、问题解决过程:

        1、起初以为是在不同的机器编译导致这种现象,于是将代码在公钥机、运行机上分别进行了重新编译,现象依旧出现;

        2、回想此次编译与上一次的不同之处,就是代码里增加了计算MD5的逻辑,链接了openssl的库:libssl.so和libcrypto.so,将这两个动态链接去掉,问题就不再出现!

        链接的几个库如下图:

1.jpg


        3、回想一下是不是库的链接顺序导致的?于是将几个链接库的顺序打乱,进行多次试验,问题依旧出现;此处都是动态库,应该不是顺序的问题;

        4、之前使用过很多次openssl,都没出现这种问题,代码与之前也没有什么特别之处,于是想不能纠结在插件这里。SOQ也使用了openssl、ghttp库,于是想试一下该插件能否在SOQ的日志线三级上挂载成功?就把SOQ的MAGELLAN_oci程序拷贝到运行机器上,使用它挂载我们的外挂插件,居然成功了!

        5、可以确定是MAGELLAN_oci导致的,于是查看此处编译MAGELLAN_oci与之前有何差别?难道是MAGELLAN_oci使用的公共组件(使用静态链接)没有重新编译?于是重新编译使用到的所有公共库,重新编译MAGELLAN_oci,问题依旧出现!

        6、查看一下MAGELLAN_oci的Makefile,发现编译MAGELLAN_oci时,将当前lib/目录下的所有静态库都编译进可执行程序中了,这其中包括libdictator_debug.a,想到之前尝试使用dictator托管malloc和free都没成功,且libdictator_debug.a是在华严6.4的操作系统上编译的,现在的程序里没有使用到它,于是将它去掉,重新编译。

        再次尝试,插件挂载就成功了!


三、总结经验

       1、对于用到的所有公共库、开源库,都重新编译;

       2、对于不使用的库,不要编译到代码中,会造成不可预料的问题。




查看评论
1楼 李佳 2017-06-25 16:22:33 [回复]
之前也遇到业务模块自己“私藏”公共库.a的情况, 公共库应该仅用/opt/MESA标准目录下的

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1