conda 中,如何兼容使用低版本 openssl 的.so 动态库?

52 天前
nowheremanx  nowheremanx
情况是这样的,正在写一个 python 的库叫作 mylib ,里面要用到一个 c/c++写的库,叫作 otherlib ,我只有编译好的.a 和.h 头文件。为了使用 otherlib 的功能,我写了个.c 文件,然后编译出 funcs.so 给 python 用,通过 ctypes 来交互。这个 otherlib 有点古老,需要低版本的 libcrypto.so ,不然有些 symbol 找不到( init 啥的函数)。我电脑里有已经编译好的 libcrypto.so.1.0.0 (在/opt/mypath/lib 下),所以编译的时候,要提供-L 和-Wl,rpath 这些参数给 gcc ,不然 funcs.so 的时候没办法找到这个版本的动态库。

折腾了很久,把这些编译的过程都写在 setup.py 中,本地跑已经没问题,用户直接把包拷过去 pip install.也没问题。 问题出现在 conda package 打包。


首先,我不能要求把 openssl 的依赖固定到低版本:虽然这个 otherlib 用了老版本的 libcrypto.so ( 1.0.0 或者 2.x.x ),但 mylib 中其他的依赖都已经用 3.x.x 。 其次,我设置的 rpath 参数不在 conda 的 build 环境中,一直给我报错,试了各种 whitelist 也没用。 这个库自带了 libressl ,我想着让 conda 直接编译了放到 env 里,但是 CONDA_PREFIX 这种东西指向的是 build 的环境,傻傻搞不清楚。

说实话,搞不懂 conda build 到底是个什么概念,这些.so 文件的编译不应该是用户那里跑的吗,为什么在我打包的时候要跑一次,那赋值 rpath 就变得非常困难了。有一个 @ORIGIN 的符号,但是这个符号本身代表的是 python 这个程序?那难道我要把东西都编译到 @ORIGIN/../lib/mylib/?


拓展一下,如果我要写一个 C++程序也用到这个 otherlib 库,但同时又有一个依赖需要高版本 libcrypto.so ,那我是不是就没办法编译了?


这个问题可能是相当深入了,不知道有没有大神能讲清楚,谢谢!!!
1286 次点击
所在节点   Python  Python
5 条回复
lixile
lixile
52 天前
funcs.so rpath 设置为 $ORIGIN 把你要的版本 libcrypto.sofuncs.so 放在同一路径下一起打包给 conda
必要时 可改名你要的版本 libcrypto.so
4BVL25L90W260T9U
4BVL25L90W260T9U
52 天前
有个工具叫 auditwheel, 专门修改 python 打包进去的 so 文件符号名的
nowheremanx
nowheremanx
51 天前
差点因为这个技术问题想退出码农生涯了,折磨了 3 天,搞得胃酸倒流,腰酸背痛。 关键这些问题完全是浪费生命,我宁愿 CRUD 写写业务。

然后反馈下最后解决方案吧。

最后是另外做了一个 python 包,用户通过 pip 安装。然后 ctypes 载入.so 的动作一定要放在所有的 import 之前,不然总是会有 segmentation fault ,这个可能和 rpath 的设置有关,应该是其他库对于底层动态库的引用做了隐式改变。 这个坑我是这辈子都不想踩了,真恶心啊。
pursuer
pursuer
51 天前
c/c++的 ABI 和版本问题一直存在,所以微软搞了 COM 。同时依赖不同版本对于很多语言/平台都是比较麻烦的问题,只能指望开发人员做好兼容处理。

“拓展一下,如果我要写一个 C++程序也用到这个 otherlib 库,但同时又有一个依赖需要高版本 libcrypto.so ,那我是不是就没办法编译了?”
静态链接并做符号隔离(RTLD_LOCAL)可能可以解决,但如果可能,我觉得还是做成 RPC 的调用方式会简单一点。
julyclyde
julyclyde
51 天前
openssl 可以同时装多个版本的
compat-openssl10

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1109248

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX