Линкер компоновки игнорирует RPATH в исполняемом файле на Solaris
Я пытаюсь скомпилировать 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 и 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 ответ
Я ни в коем случае не эксперт по 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, если он действительно присутствует, и посмотреть, разрешит ли это это?