Linker 运行时链接器忽略solaris上可执行文件中的RPATH

Linker 运行时链接器忽略solaris上可执行文件中的RPATH,linker,runtime,shared-libraries,solaris,search-path,Linker,Runtime,Shared Libraries,Solaris,Search Path,我正在尝试在Solaris服务器上进行编译,但我没有根目录。Samtools依赖于zlib。这台机器上的系统zlib没有使用大文件支持进行编译,因此针对这个版本编译samtools具有预期的效果:samtools只处理小文件。我需要它能够处理大文件。幸运的是,管理员在/usr/local/apps/zlib-1.2.5/中编译了一个版本的zlib,支持大文件。我可以通过在CFLAGS中添加-R/usr/local/apps/zlib-1.2.5/lib来进行编译,但这似乎不起作用。病征如下: 当

我正在尝试在Solaris服务器上进行编译,但我没有根目录。Samtools依赖于zlib。这台机器上的系统zlib没有使用大文件支持进行编译,因此针对这个版本编译samtools具有预期的效果:samtools只处理小文件。我需要它能够处理大文件。幸运的是,管理员在/usr/local/apps/zlib-1.2.5/中编译了一个版本的zlib,支持大文件。我可以通过在CFLAGS中添加
-R/usr/local/apps/zlib-1.2.5/lib
来进行编译,但这似乎不起作用。病征如下:

当我尝试运行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_路径,那么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呢



编辑:文档似乎表明
-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\u LIBRARY\u PATH
已经设置,并且其中的
/usr/lib
路径优先于任何运行时链接器路径。如果LD\u LIBRARY\u PATH确实存在,您能否将其取消设置,并查看是否可以解决此问题?

Gah!你说得对!但是我的init文件都没有设置它,所以我不知道它是如何设置的。然而,让它不稳定会让事情发生。似乎是配置错误的服务器。我将在我的shell init文件中取消设置它,并通过电子邮件发送给系统管理员。现在我已经平静了一些,我想添加“谢谢”