我正在尝试在没有 root 的 Solaris 服务器上编译samtools 。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]
显然在二进制文件的 RPATH 中也是如此/usr/local/apps/zlib-1.2.5/lib
,据我所知,它应该在运行时搜索共享库。但是,ldd -s
表明该目录从未被搜索过。将此路径添加到 LD_LIBRARY_PATH 并重新运行 ldd 命令具有预期的效果:搜索目录并找到正确版本的 libz。
那么如何/usr/local/apps/zlib-1.2.5/lib
在不使用 LD_LIBRARY_PATH 的情况下强制 samtools 在运行时搜索?
编辑:这里的文档似乎表明该-R
选项是正确的做法。但它不起作用。