【问题标题】:Runtime linker ignores RPATH in executable on solaris运行时链接器在 solaris 上的可执行文件中忽略 RPATH
【发布时间】:2010-11-19 21:26:00
【问题描述】:

我正在尝试在没有 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]

所以/usr/local/apps/zlib-1.2.5/lib 显然在二进制文件的 RPATH 中,我知道应该在运行时搜索共享库。但是,ldd -s 表明该目录从未被搜索过。将此路径添加到 LD_LIBRARY_PATH 并重新运行 ldd 命令具有预期效果:搜索目录并找到正确版本的 libz。

那么如何在不使用 LD_LIBRARY_PATH 的情况下强制 samtools 在运行时搜索 /usr/local/apps/zlib-1.2.5/lib


编辑:文档here 似乎表明-R 选项是正确的做法。但它不起作用。

【问题讨论】:

    标签: linker runtime shared-libraries solaris search-path


    【解决方案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 确实存在,您能否取消设置它并查看是否可以解决?

    【讨论】:

    • 啊!你是对的!但是我的初始化文件都没有设置它,所以我不知道它是如何设置的。尽管如此,取消它会使事情正常进行。看起来像一个错误配置的服务器。我将在我的 shell 初始化文件中取消它并通过电子邮件发送给系统管理员。
    • 冷静下来了,想补充一句“谢谢”。
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 2018-06-18
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多