gpt4 book ai didi

Python共享库: RTLD_GLOBAL segfault

转载 作者:行者123 更新时间:2023-11-30 23:30:05 25 4
gpt4 key购买 nike

我使用 python swig 包装的 C++ 库。在它的 __init__.py 文件中,它 sets在导入包含实现代码的共享对象文件之前,使用 dlopen 标志 RTLD_GLOBAL。

这会导致随后导入 scipy.linalg 出现段错误,至少在我的机器上是这样。我认为这种行为取决于 scipy 的构建方式以及它所链接的内容。

# minimal example of what's going on
$ cat test.py
import sys
import ctypes
flags = sys.getdlopenflags()
sys.setdlopenflags(flags | ctypes.RTLD_GLOBAL)
import scipy.linalg

$ python test.py
[1] 16886 segmentation fault (core dumped) python test.py
  1. 为什么会发生这种情况?这是怎么回事?
  2. 在什么情况下可能需要设置 RTLD_GLOBAL?我使用的代码包含 comment “# 以下是允许 POSIX“dlopen”功能工作所需的邪恶咒语。我不明白它。如果知道更好的解决方案,请转发给 PyOpenMM 代码维护者。”当我删除 sys.setdlopenflags(flags | ctypes.RTLD_GLOBAL) 行时,一切似乎都与库一起正常工作,所以这可能是特定于某些 python 版本或平台的?

最佳答案

您在用于构建 SciPy 的 f2py 工具中遇到了错误。在这里查看更多详细信息:https://github.com/numpy/numpy/issues/2521

不幸的是,您只能通过重建 SciPy 或删除 RTLD_GLOBAL 标志来解决该问题。

实际情况是,NumPy 和 SciPy 都使用符号 PyArray_API,并且 RTLD_GLOBAL 标志强制 SciPy(尝试)导出自己的副本。这会导致冲突和段错误。(如果有人能更详细地解释这一点,我很想知道)

RTLD_GLOBAL 使共享库中的符号公开并可用于重定位。当您通过 dlopen() 导入多个使用彼此符号的单独库时,需要这样做。在 Python 中,当单个项目 (PyOpenMM) 由多个二进制子模块组成,并且这些子模块想要共享其中一个子模块提供的通用功能时,就会出现这种情况。 “一切似乎都工作正常”这一事实可能仅仅意味着您没有使用任何需要共享功能的东西——或者 PyOpenMM 实际上不再需要这个。

关于Python共享库: RTLD_GLOBAL segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com