笔者在项目开发中遇到一个莫名奇妙
coredump问题,单独在测试程序中使用某个动态库没发现问题,将动态库整合到其他程序中则会引起coredump。再次记录一下解决过程。
程序发生coredump时,首先我们就会查看调用堆栈信息,如下所示截取了部分:
Device info:Unknown
Build info:Unknown
Pid:1840
Uid:0
Reason:SIGSEGV
Tid:1843 Name
#00 pc 000000000015c7a2 /system/lib/libsysparam_hal.z.so(X509_PUBKEY_get0_param+29)
#01 pc 000000000013615c /system/lib/libsysparam_hal.z.so(rsa_pss_get_param+277)
#02 pc 00000000000d9e16 /system/lib/libxquic.z.so(EVP_parse_public_key+159)
#03 pc 000000000015e0d8 /system/lib/libxquic.z.so(_ZN4bssl12ssl_set_certEPNS_4CERTENSt3__h10unique_ptrI16crypto_buffer_stNS_8internal7DeleterIS4_EEEE+213)
#04 pc 000000000015e012 /system/lib/libxquic.z.so(_ZN4bssl12ssl_set_certEPNS_4CERTENSt3__h10unique_ptrI16crypto_buffer_stNS_8internal7DeleterIS4_EEEE+15)
#05 pc 000000000016a6c6 /system/lib/libxquic.z.so(SSL_use_certificate+83)
#06 pc 00000000001612ea /system/lib/libxquic.z.so(SSL_CTX_use_certificate_chain_file+63)
#07 pc 000000000009e70e /system/lib/libxquic.z.so(xqc_create_server_ssl_ctx+87)
#08 pc 000000000009ec36 /system/lib/libxquic.z.so(xqc_tls_ctx_create+131)
#09 pc 00000000000a5852 /system/lib/libxquic.z.so(xqc_engine_create+615)
笔者想实现的功能是集成xquic库到我的项目中,按说应该在libxquic.z.so库中直接调用ssl相关函数,最后堆栈走到libsysparam_hal.z.so动态库中,分别查看这两个库的符号信息也都能找到X509_PUBKEY_get0_param
# strings libsysparam_hal.z.so | grep X509_PUBKEY_get0_param
X509_PUBKEY_get0_param
# strings libxquic.z.so | grep X509_PUBKEY_get0_param
X509_PUBKEY_get0_param
所以,我们就需要解决指定走本动态库中的函数。
使用百度搜索,动态库中符号冲突还是比较多的资料。这种问题还很多都是openssl版本不一致特别多,与我遇到问题差不多,xquic中依赖boringssl,也是从openssl中的一个分支出来的。
解决方法就是:
- openssl相关库编译成静态库(这个我本来就是如此编译的)
- 使用openssl库的动态库,如我的libxquic.z.so,编译是添加
-Wl,-Bsymbolic选项,Bsymbolic表示强制采用本地的全局变量定义,这样就不会出现动态链接库的全局变量定义被应用程序/动态链接库中的同名定义给覆盖了。
参考资料
C++动态库符号冲突解决方法

在项目中集成动态库时遇到符号冲突问题,通过查看调用堆栈和库的符号信息,发现需要解决调用路径问题。解决方法包括将openssl编译为静态库或在编译时添加选项强制使用本地全局变量定义,避免覆盖其他库的定义。
1091

被折叠的 条评论
为什么被折叠?



