问题背景
当我们的工程需要链接多个动态链接库时,若这些动态链接库分别依赖了不同的openssl版本,则程序在运行时可能无法按预期运行对应版本的openssl,本文介绍解决此问题的方法。
解决方案
假设有如下依赖关系:
libmodule.so需要依赖libssl.so.1.0.1d
demo需要链接libssl.so.1.1.1d和libmodule.so
编译libmodule.so的注意事项:
- 在编译
libmodule.so时,链接openssl的静态库文件libssl.so.1.0.1d.a - 需要保证编译
libmodule.so时,引用的openssl头文件和对应的静态库文件是一致的 - 在链接
libmodule.so时,指定-Wl,-Bsymbolic选项,表示优先使用库内的全局符号 - 在链接
libmodule.so时,指定-Wl,--exclude-libs,ALL选项,表示将内部引入的静态库符号隐藏,不对外可见,可以使用readelf -s libmodule.so | grep SSL查看结果,所有函数均为LOCAL, 非GLOBAL属性 - 最后,使用
ldd -r libmodule.so查看生成的动态库文件,确保没有未找到的符号即可
编译demo:使用动态链接的方式链接libssl.so.1.1.1d.so即可。