如何获取libdrmaa.so以使用本地安装的GLIBC?

时间:2018-08-28 13:31:40

标签: python linux centos6 glibc drmaa

我试图在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-interpreterlibdrmaa.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。这是我的问题:

  1. 我可以将/lib64/ld-linux-x86-64.so.2的{​​{1}}更改为mydir/glibc/lib/ld-linux-x86-64.so.2而不重新编译libdrmaa.so吗?

  2. 有人可以找到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不是可执行文件,这就是为什么我被卡住了。也就是说,对于我来说,作为初学者(可能是其他正在关注此论坛的其他初学者)存在基本的知识鸿沟,需要逐步解决方案。希望该线程将来能对某人有所帮助。

0 个答案:

没有答案