Как получить libdrmaa.so для использования локально установленного GLIBC?

Я пытаюсь запустить drmaa (модуль python, который управляет заданиями в SGE) под CentOS 6.x. Согласно 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), Я не смог изменить последнюю строку на новую ld-linux-x86-64.so.2 это обновлено до 2.19. Вот мои вопросы:

  1. Могу ли я изменить /lib64/ld-linux-x86-64.so.2 в mydir/glibc/lib/ld-linux-x86-64.so.2 для libdrmaa.so без перекомпиляции libdrmaa.so?

  2. Может ли кто-нибудь найти исходный код для libdrmaa.so, чтобы я мог перекомпилировать с префиксом, который я хочу?

Или, если это намного проще, чем я думал. Пожалуйста, не стесняйтесь ответить с некоторым решением здесь. Спасибо вперед.

=============== решение ==============

После ответа @EmployedRussian было подтверждено, что libdrmaa.so не имеет раздела переводчика. Поскольку мой случай заключается в использовании libdrmaa.so под python исполняемая программа, которую я должен исправить python! Так что после исправления rpath для libdrmaa.soЯ набрал:

patchelf --set-interpreter mydir/glibc/lib/ld-2.19.so python

Затем побежал main.py снова. Теперь python использует новый glibc, который я установил в своих локальных каталогах, а мой python и библиотеки используют локальные зависимости glibc.

Я думаю, что этот вопрос кажется излишним, но это не так. libdrmaa.so это не исполняемый файл, и именно поэтому я застрял. Это также говорит о том, что для меня как для новичка есть фундаментальный пробел в знаниях (и, вероятно, для других новичков, просматривающих этот форум), который нуждается в более пошаговом решении. Надеюсь, эта тема поможет кому-то в будущем.

0 ответов

Другие вопросы по тегам