Усилитель времени выполнения игнорирует rpath в исполняемости на Solaris

StackOverflow https://stackoverflow.com/questions/4229513

Вопрос

Я пытаюсь скомпилировать Samtools. На сервере Solaris, где у меня нет корня. Samtools зависит от Zlib. Система Zlib на этой машине не скомпилирована с большой поддержкой файлов, поэтому компиляция Samtools против этой версии имеет ожидаемый эффект: Samtools только обрабатывает небольшие файлы. Мне нужно, чтобы он мог обрабатывать большие файлы. К счастью, существует версия Zlib, составленная администратором в /usr/local/apps/zlib-1.2.5/ с большой поддержкой файлов. Я могу скомпилировать против этого, добавив -R /usr/local/apps/zlib-1.2.5/lib к Cflags, но это кажется не работать. Симптомы следующие:

Когда я пытаюсь запустить Samtools, он сбивает с этой ошибкой:

ld.so.1: samtools: fatal: relocation error: file samtools: symbol gzopen64: referenced symbol not found

Если я добавлю /usr/local/apps/zlib-1.2.5/ для ld_library_path, то samtools работает нормально.

Анализируя Samtools с LDD и Headelf дает следующее:

$ ldd -r samtools
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libresolv.so.2 =>        /usr/lib/libresolv.so.2
        libm.so.2 =>     /usr/lib/libm.so.2
        libcurses.so.1 =>        /usr/lib/libcurses.so.1
        libz.so =>       /usr/lib/libz.so
        libc.so.1 =>     /usr/lib/libc.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        libmd.so.1 =>    /usr/lib/libmd.so.1
        libscf.so.1 =>   /usr/lib/libscf.so.1
        libdoor.so.1 =>  /usr/lib/libdoor.so.1
        libuutil.so.1 =>         /usr/lib/libuutil.so.1
        libgen.so.1 =>   /usr/lib/libgen.so.1
        symbol not found: gzopen64              (samtools)

$ ldd -s samtools

   ...(snip)...

   find object=libz.so; required by samtools
    search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib  (LD_LIBRARY_PATH)
    trying path=/usr/lib/libz.so
        libz.so =>       /usr/lib/libz.so

   ...(snip)...

$ readelf -d samtools | grep RPATH
 0x0000000f (RPATH)                      Library rpath: [/usr/local/apps/zlib-1.2.5/lib:/usr/local/apps/gcc-4.5.1/lib]

Так /usr/local/apps/zlib-1.2.5/lib Ясно, что в рапуренном двоике, который я понимаю, должен искать во время выполнения для общих библиотек. Однако, ldd -s показывает, что этот каталог никогда не ищет. Добавление этого пути к LD_LIBRARY_PATH и повторно запущении команд LDD имеет ожидаемый эффект: каталог ищет и правильная версия libz найден.

Так как я могу заставить Samtools искать в /usr/local/apps/zlib-1.2.5/lib Во время выполнения без использования ld_library_path?


Редактировать: документация здесь кажется, указывает на то, что -R Вариант - это правильная вещь. Но это не работает.

Это было полезно?

Решение

Я ни в коем случае не является экспертом Solaris, но эта линия:

find object=libz.so; required by samtools
 search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib  (LD_LIBRARY_PATH)

кажется, указывает мне, что LD_LIBRARY_PATH уже установлен, а /usr/lib Путь в нем предпринимает приоритет над любыми путями промежуточного времени. Можете ли вы unset ld_library_path, если это на самом деле присутствует и посмотрите, что это разрешит?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top