日志线挂载插件出现dlopen段错误
在回传配置线的日志的时候,出现了挂载外挂计算插件的dlopen错误,现记录一下过程。
一、现象
使用GDB前台跑,出现的dlopen段错误如下图所示:
二、问题解决过程:
1、起初以为是在不同的机器编译导致这种现象,于是将代码在公钥机、运行机上分别进行了重新编译,现象依旧出现;
2、回想此次编译与上一次的不同之处,就是代码里增加了计算MD5的逻辑,链接了openssl的库:libssl.so和libcrypto.so,将这两个动态链接去掉,问题就不再出现!
链接的几个库如下图:
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标准目录下的