ATS 6.2.1打release版本rpm包时插件中出现undefined symbol的问题追踪
2017-05-12 13:31
351 查看
问题场景
我基于ATS 6.2.1社区版整合进一些插件,发现debug版本一直运行好好的,后来改为release版本(就是configure时不加--enable_debug)时,安装后显示下面的出错信息
[May 11 11:33:18.659] Server {0x2ab7cd116700} ERROR: <RemapConfig.cc:1360 (remap_parse_config_bti)> [ReverseProxy] failed to add remap rule at /etc/trafficserver/remap.config line 206: Can't load plugin "/usr/lib64/trafficserver/plugins/libtsrefinequery.so"
- /usr/lib64/trafficserver/plugins/libtsrefinequery.so: undefined symbol: _ZN17RefineQueryConfig7IsWhiteEv
这会ATS反复重启,后果非常严重!
问题定位
根据报错的信息,找到源码Remap.config.cc中的相应代码位置
remap_parse_config_bti()
remap_load_plugin()
dolmen()
dlerror()
发现这里的报错信息实质是就是,dlopen调用一个插件的so,发现里面没有需要的符号信息,就报这里的错误
问题分析
1.一些无谓的摸索
上述场景写个demo就能验证出来,所以网上的观点集中在,没有加载到动态库之类的简单问题,仔细分析之后,发现都不太切合我的问题场景。因为这里的出错信息已经明确说,
已经找到动态库,都是没有里面的符号_ZN17RefineQueryConfig7IsWhiteEv
2.debug版本一切正常,但是release版本就有这个问题
3.将debug版本中的libtsrefinequery.so覆盖release版本中的同名动态库,发现正常
最自然最直接的方法,我最后觉得还是直接分析动态库中的符号差异,比较接地气。
linux 查看so文件导出的符号
#nm -D ****.so,
#nm ****.a
下面是nm对应的用法
下面是对比两个动态库中的符号差异
查明原因
通过研究该插件中的相关源码,发现一个可疑点
在一个c文件中定义的inline函数是不能在其它c文件中直接使用.也就是,这个inline会使编译器的行为产生一些差异。
解决方法
去掉该inline
下面是去掉inline之后重新打包安装之后的动态库符号表对比图,发现_ZN17RefineQueryConfig7IsWhiteEv由原来的W类型变为了T类型,这正是我们需要的结果。
再次安装确认,debug和release版本都统一了,没有问题。
参考文献
[1].http://blog.csdn.net/qq_34488499/article/details/51873341
[2].http://daisy8867.blog.51cto.com/1043582/1201568/
[3].http://blog.csdn.net/shuanghujushi/article/details/23025055
我基于ATS 6.2.1社区版整合进一些插件,发现debug版本一直运行好好的,后来改为release版本(就是configure时不加--enable_debug)时,安装后显示下面的出错信息
[May 11 11:33:18.659] Server {0x2ab7cd116700} ERROR: <RemapConfig.cc:1360 (remap_parse_config_bti)> [ReverseProxy] failed to add remap rule at /etc/trafficserver/remap.config line 206: Can't load plugin "/usr/lib64/trafficserver/plugins/libtsrefinequery.so"
- /usr/lib64/trafficserver/plugins/libtsrefinequery.so: undefined symbol: _ZN17RefineQueryConfig7IsWhiteEv
这会ATS反复重启,后果非常严重!
问题定位
根据报错的信息,找到源码Remap.config.cc中的相应代码位置
remap_parse_config_bti()
remap_load_plugin()
dolmen()
dlerror()
发现这里的报错信息实质是就是,dlopen调用一个插件的so,发现里面没有需要的符号信息,就报这里的错误
问题分析
1.一些无谓的摸索
上述场景写个demo就能验证出来,所以网上的观点集中在,没有加载到动态库之类的简单问题,仔细分析之后,发现都不太切合我的问题场景。因为这里的出错信息已经明确说,
已经找到动态库,都是没有里面的符号_ZN17RefineQueryConfig7IsWhiteEv
2.debug版本一切正常,但是release版本就有这个问题
3.将debug版本中的libtsrefinequery.so覆盖release版本中的同名动态库,发现正常
最自然最直接的方法,我最后觉得还是直接分析动态库中的符号差异,比较接地气。
linux 查看so文件导出的符号
#nm -D ****.so,
#nm ****.a
下面是nm对应的用法
下面是对比两个动态库中的符号差异
查明原因
通过研究该插件中的相关源码,发现一个可疑点
在一个c文件中定义的inline函数是不能在其它c文件中直接使用.也就是,这个inline会使编译器的行为产生一些差异。
解决方法
去掉该inline
下面是去掉inline之后重新打包安装之后的动态库符号表对比图,发现_ZN17RefineQueryConfig7IsWhiteEv由原来的W类型变为了T类型,这正是我们需要的结果。
再次安装确认,debug和release版本都统一了,没有问题。
参考文献
[1].http://blog.csdn.net/qq_34488499/article/details/51873341
[2].http://daisy8867.blog.51cto.com/1043582/1201568/
[3].http://blog.csdn.net/shuanghujushi/article/details/23025055
相关文章推荐
- VC发布release版本出现问题的解决方案!
- MFC下debug改成release版本出现问题及解决办法
- ubuntu16.04下编译caffe出现.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...的问题
- c++ 代码使用 dlopen/dlsym 时出现undefined symbol的问题
- centos7中使用rpm方式安装mysql5.7版本后出现问题
- 解决apcu-bc在安装中出现的问题。 今天在编译安装apcu-bc时出现了:apc.so: undefined symbol: zif_apcu_store in Unknown on line 0
- keil中出现Undefined symbol FLASH_PrefetchBufferCmd (referred from main.o)等问题解决办法
- linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
- Xcode调用旧版本库出现Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64
- vc6.0 release版本下出现内容读写错误问题
- linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
- 由于CentOS的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题。
- keil中出现Undefined symbol FLASH_PrefetchBufferCmd (referred from main.o)等问题解决办法
- 解决Oxygen.2 Release (4.7.2)版本eclipse在线安装Activiti插件总是失败的问题
- opencv出现不能运行release版本的问题
- 后台使用Spring MVC 4.15 版本 通过 ajaxFileUpload plugin插件上传文件相应时引起的一个小问题,Chrome、Firefox中出现SyntaxError:unexpected token <
- 关于安装Cmake软件出现的"undefined reference to symbol 'keypad'"问题
- MDK编译出现*.axf: Error: L6218E: Undefined symbol 问题解决方法
- VC 6.0 编译Debug和Release 版本库出现的问题?
- 调试release版本程序dump时出现的代码定位不准确问题