Линкер компоновки игнорирует RPATH в исполняемом файле на Solaris - PullRequest
4 голосов
/ 20 ноября 2010

Я пытаюсь скомпилировать samtools на сервере Solaris, где у меня нет root. 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 и readelf дает следующее:

$ 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 явно находится в RPATH двоичного файла, который, как я понимаю, должен быть найден во время выполнения для поиска общих библиотек. Однако ldd -s показывает, что этот каталог никогда не ищется. Добавление этого пути к LD_LIBRARY_PATH и повторное выполнение команд ldd дает ожидаемый эффект: поиск в каталоге и поиск правильной версии libz.

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


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

1 Ответ

3 голосов
/ 20 ноября 2010

Я ни в коем случае не эксперт по 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 в нем имеет приоритетпо любым путям компоновщика во время выполнения.Можете ли вы сбросить LD_LIBRARY_PATH, если он действительно присутствует, и посмотреть, разрешит ли это это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...