Python导入失败,出现“dlopen:无法使用静态TLS加载任何更多对象”

时间:2017-06-07 12:53:24

标签: python cython dlopen pycaffe

我在fast_nn编写了一个名为Cython的多线程模块,并使用以下setup.py编译它:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy

setup(
    ext_modules = cythonize([
        Extension("fast_nn", ["fast_nn.pyx"], language = 'c++', extra_compile_args = ['-O3', '-fopenmp'], extra_link_args = ['-fopenmp'], include_dirs = [numpy.get_include()])
    ])
)

此外,我使用caffe框架的python绑定。

如果我单独使用我的模块或单独使用pycaffe,一切都很好。但是,以下组合存在问题:

import caffe.io
import fast_nn

在一台机器上,它不会导致任何问题。在另一台机器上,我得到以下异常:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    import fast_nn
ImportError: dlopen: cannot load any more object with static TLS

this thread我知道有太多带有initial-exec静态TLS的库已动态加载。但是我该怎么做才能解决这个问题呢?有没有办法在禁用静态TLS的情况下编译我的模块或更好的解决方案?

但是,readelf -a fast_nn.cpython-35m-x86_64-linux-gnu.so | grep TLS的输出在我的库中不显示任何TLS符号。但是一些依赖库包含这样的符号。

到目前为止尝试的解决方案

更改两个导入的顺序(即,在caffe模块之后导入cython)可以解决问题。但是,由于我的实际案例要复杂得多,并且两个模块都是从其他进口间接导入的,所以我无法改变导入的顺序。

同样,将已编译模块库的路径导出到LD_PRELOAD具有相同的效果,但也不是一个优雅的解决方案。

0 个答案:

没有答案