我在试着编译
samtools
在没有根目录的Solaris服务器上。Samtools依赖于zlib。此计算机上的系统zlib没有使用大文件支持进行编译,因此针对此版本编译samtools具有预期的效果:samtools只处理小文件。我需要它能处理大文件。幸运的是,管理员在/usr/local/apps/zlib-1.2.5/中编译了一个zlib版本,并提供了大文件支持。我可以通过添加
-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工作正常。
使用ldd和readelf分析samtools会得到以下结果:
$ 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?
编辑:文档
here
似乎表明
-R
选择是正确的选择。但没用。