我试图在CentOS 6.x下运行drmaa(控制SGE中的作业的python模块)。根据drmaa-python(https://github.com/pygridtools/drmaa-python)的要求之一是libdrmaa.so
,这是我从gridengine-libdrmaa-dev
软件包中获得的。
我在libdrmaa.so
下存储了mydir/lib/
的副本。
我还将DRMAA_LIBRARY_PATH
环境变量放入.bashrc
:
DRMAA_LIBRARY_PATH=mydir/lib/libdrmaa.so
运行main.py
时显示错误消息:
Traceback (most recent call last):
File "mydir/main.py", line 3, in <module>
from . import tools
ImportError: cannot import name 'tools'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mydir/main.py", line 5, in <module>
import tools
File "mydir/tools.py", line 20, in <module>
import drmaa
File "mydir/anaconda3/lib/python3.6/site-packages/drmaa/\__init\__.py", line 63, in <module>
from .session import JobInfo, JobTemplate, Session
File "mydir/anaconda3/lib/python3.6/site-packages/drmaa/session.py", line 39, in <module>
from drmaa.helpers import (adapt_rusage, Attribute, attribute_names_iterator,
File "mydir/anaconda3/lib/python3.6/site-packages/drmaa/helpers.py", line 36, in <module>
from drmaa.wrappers import (drmaa_attr_names_t, drmaa_attr_values_t,
File "mydir/anaconda3/lib/python3.6/site-
packages/drmaa/wrappers.py", line 56, in <module>
_lib = CDLL(libpath, mode=RTLD_GLOBAL)
File "mydir/anaconda3/lib/python3.6/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /lib64/libc.so.6: version 'GLIBC_2.14' not found (required by mydir/lib/libdrmaa.so)
我怀疑libdrmaa.so
使用的默认libc.so.6
的GLIBC低于2.14。假设我没有sudo特权,并且没有超级用户可以为我升级glibc。我在主目录下安装了glibc-2.19
,然后再次运行了main.py
。错误消息保持不变。
经过研究,我现在可以列出libdrmaa.so
正在寻找的依赖项:
$ ldd /usr/lib/libdrmaa.so
linux-vdso.so.1 => (0x00007ffdd1199000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9d4ff97000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d4fd93000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d4f9c9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9d505a4000)
开发了程序patchelf
来更改软链接,而无需重新编译文件(https://nixos.org/patchelf.html):
$patchelf --set-rpath mydir/glibc/lib/libc.so.6 libdrmaa.so
$patchelf --set-interpreter mydir/glibc/lib/ld-2.19.so libdrmaa.so
cannot find section .interp
这是我遇到的问题。 rpath已成功切换到我的新libc.so.6
,但是libdrmaa.so
没有解释器部分。这也是patchelf --set-interpreter
对libdrmaa.so
没有做任何事情的原因。
libdrmaa.so
之后patchelf
的依存关系:
$ ldd ~/lib/libdrmaa.so
ldd: warning: you do not have execution permission for `mydir/lib/libdrmaa.so'
linux-vdso.so.1 => (0x00007ffde5799000)
libpthread.so.0 => mydir/glibc/lib/libpthread.so.0 (0x00007febbbba1000)
libdl.so.2 => mydir/glibc/lib/libdl.so.2 (0x00007febbb99c000)
libc.so.6 => mydir/glibc/lib/libc.so.6 (0x00007febbb5ef000)
/lib64/ld-linux-x86-64.so.2 (0x00000037dec00000)
没有解释器部分(cannot find section .interp
),我无法将最后一行更改为更新为2.19的新ld-linux-x86-64.so.2
。这是我的问题:
我可以将/lib64/ld-linux-x86-64.so.2
的{{1}}更改为mydir/glibc/lib/ld-linux-x86-64.so.2
而不重新编译libdrmaa.so
吗?
有人可以找到libdrmaa.so的源代码,以便我可以使用希望的前缀重新编译吗?
或者这比我想象的要容易得多。请不要犹豫,在这里回答一些解决方案。谢谢你
===============解决方案==============
在@EmployedRussian响应之后,它确认libdrmaa.so
没有解释器部分。由于我的情况是在Python下使用libdrmaa.so
,因此我应该修补的可执行程序是libdrmaa.so
!
因此,在为python
修补了rpath之后,我输入:
libdrmaa.so
然后再次运行patchelf --set-interpreter mydir/glibc/lib/ld-2.19.so python
。现在,python使用我安装在本地目录中的新glibc,而我的python和库使用本地glibc依赖项。
我认为这个问题似乎是多余的,但不是。 main.py
不是可执行文件,这就是为什么我被卡住了。也就是说,对于我来说,作为初学者(可能是其他正在关注此论坛的其他初学者)存在基本的知识鸿沟,需要逐步解决方案。希望该线程将来能对某人有所帮助。