代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

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

  •  4
  • Ryan C. Thompson  · 技术社区  · 15 年前

    我在试着编译 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 选择是正确的选择。但没用。

    1 回复  |  直到 13 年前
        1
  •  3
  •   bosmacs    15 年前

    我决不是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确实存在,您能取消它的设置并查看它是否能解决这个问题吗?