Как получить 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. Вот мои вопросы:
Могу ли я изменить
/lib64/ld-linux-x86-64.so.2
вmydir/glibc/lib/ld-linux-x86-64.so.2
дляlibdrmaa.so
без перекомпиляцииlibdrmaa.so
?Может ли кто-нибудь найти исходный код для 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
это не исполняемый файл, и именно поэтому я застрял. Это также говорит о том, что для меня как для новичка есть фундаментальный пробел в знаниях (и, вероятно, для других новичков, просматривающих этот форум), который нуждается в более пошаговом решении. Надеюсь, эта тема поможет кому-то в будущем.