多版本openssl依赖的解决方案

599 阅读1分钟

问题背景

当我们的工程需要链接多个动态链接库时,若这些动态链接库分别依赖了不同的openssl版本,则程序在运行时可能无法按预期运行对应版本的openssl,本文介绍解决此问题的方法。

解决方案

假设有如下依赖关系:

libmodule.so需要依赖libssl.so.1.0.1d

demo需要链接libssl.so.1.1.1dlibmodule.so

编译libmodule.so的注意事项:

  1. 在编译libmodule.so时,链接openssl的静态库文件libssl.so.1.0.1d.a
  2. 需要保证编译libmodule.so时,引用的openssl头文件和对应的静态库文件是一致的
  3. 在链接libmodule.so时,指定-Wl,-Bsymbolic选项,表示优先使用库内的全局符号
  4. 在链接libmodule.so时,指定-Wl,--exclude-libs,ALL选项,表示将内部引入的静态库符号隐藏,不对外可见,可以使用readelf -s libmodule.so | grep SSL查看结果,所有函数均为LOCAL, 非GLOBAL属性
  5. 最后,使用ldd -r libmodule.so查看生成的动态库文件,确保没有未找到的符号即可

编译demo:使用动态链接的方式链接libssl.so.1.1.1d.so即可。