首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >:RTLD_GLOBAL分段错误

:RTLD_GLOBAL分段错误
EN

Stack Overflow用户
提问于 2013-12-31 00:16:25
回答 1查看 3.4K关注 0票数 1

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

这会导致随后的scipy.linalg导入分段错误,至少在我的机器上是这样。我认为这种行为取决于枕木的建造方式和与之相关的东西。

代码语言:javascript
运行
复制
# 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?我使用的代码包含评论 "#以下是允许POSIX "dlopen“函数工作所需的邪恶咒语。我不理解它。如果知道更好的解决方案,请转发给PyOpenMM代码维护人员。”当我移除sys.setdlopenflags(flags | ctypes.RTLD_GLOBAL)行时,库似乎一切正常,所以这可能是特定于某些python版本或平台的?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 16:53:38

您正在f2py工具中碰到一个bug,该工具用于构建SciPy。请参阅这里的详细信息:https://github.com/numpy/numpy/issues/2521

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

正在发生的事情是,NumPy和SciPy都在使用符号PyArray_APIRTLD_GLOBAL标志迫使SciPy导出自己的副本。这导致了冲突和分段的错误。(如果有人能更详细地解释这件事,我很想知道)

RTLD_GLOBAL使来自共享库的符号公开,并可用于重新定位。当您通过dlopen()导入几个使用彼此符号的单独库时,就需要这样做。在Python中,当单个项目(PyOpenMM)包含几个希望共享其中一个项目提供的公共功能的二进制子模块时,就会出现这种情况。“一切看起来都很好”这一事实可能仅仅意味着您没有使用任何需要共享功能的东西--或者PyOpenMM实际上不再需要这样的功能了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20849755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档