2011-11-01 52 views
17

本页面 - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/ - 说,大约为了在ld.so库搜索:使用RPATH而不是RUNPATH?

Unless loading object has RUNPATH: 
    RPATH of the loading object, 
     then the RPATH of its loader (unless it has a RUNPATH), ..., 
     until the end of the chain, which is either the executable 
     or an object loaded by dlopen 
    Unless executable has RUNPATH: 
     RPATH of the executable 
LD_LIBRARY_PATH 
RUNPATH of the loading object 
ld.so.cache 
default dirs 

,然后建议:

当你船的二进制文件,或者使用RPATH,而不是运行路径或保证 LD_LIBRARY_PATH在它们运行之前被设置。

因此,使用RPATHRUNPATH是不好的,因为RUNPATH样-的取消预期RPATH所以间接动态加载不起作用?但为什么然后RPATH已弃用RUNPATH

有人可以解释一下情况吗?

回答

13

当您发布一个二进制文件时,最好为用户提供一种方法来调整二进制文件以适应他们自己系统的具体情况,尤其是调整库搜索路径。

用户一般可以调整LD_LIBRARY_PATH/etc/ld.co.conf,这两者都与优先级低于DT_RPATH,即不能覆盖什么是在二进制硬编码的,而如果你使用DT_RUNPATH代替,用户可与LD_LIBRARY_PATH覆盖它。 (FWIW,我认为ld.so.conf也应该优先于DT_RUNPATH,但无论如何,至少我们已经得到了LD_LIBRARY_PATH)。

此外,我强烈不同意上面使用DT_RPATH的建议。国际海事组织,它最好在运输的二进制文件中使用暗号DT_RPATH而不是DT_RUNPATH

除非

你船与您的可执行所有的依赖库,并希望确保事情JustWork(TM)安装后,在这种情况下使用DT_RPATH

+1

问题是,建议使用RUNPATH而不使用RPATH,并且不推荐使用RPATH,但RUNPATH目前不受所有系统支持。所以我今天做了什么**来使申请工作?正如Qt文章所示,在使用插件时,使用RPATH比RUNPATH更有用。所以整个情况在这里非常混乱 – zaharpopov

+1

@zaharpopov,我推荐并遵循自己的最佳方法是生成很好地集成在目标平台中的应用程序,其中包括*不分发竞争版本的平台共享库*。我认为这是问题的根源,并且在'DT_RPATH'和'DT_RPATH'之间进行了黑客攻击和破解,而朋友是一个试图侧重解决问题而不是解决问题的错误尝试。 – chill

+1

这不简单。与Qt问题是该应用程序想要Qt库的更新版本比系统上存在。有些系统已经过时了Qt SO,那么你会怎么做?如果你需要一个特定的版本 – zaharpopov

10

奇尔的回答是完全正确的;我想简单地添加一些颜色,从最近读取glibc源文件([master 8b0ccb2],2.17)。清楚的是,如果在给定级别指定的位置没有找到库,则尝试下一级。如果在给定级别找到了库,搜索将停止。

动态库搜索顺序:

  1. DT_RPATH在ELF二进制,除非DT_RUNPATH集。
  2. LD_LIBRARY_PATH条目,除非的setuid/setgid的
  3. DT_RUNPATH在ELF二进制
  4. /etc/ld.so.cache中条目,除非-z nodeflib在链接时给定
  5. /lib下,/ usr/lib中除非 - z nodeflib
  6. 完成,“未找到”。
4

但是,为什么那么RPATH得到了赞成RUNPATH的过时?

当引入DT_RPATH时,它优先于所有其他参数。 即使为了开发目的,这也无法覆盖库搜索路径。 因此引入了另一个参数LD_RUNPATH,其优先级低于LD_LIBRARY_PATH。

更多细节可在"How to write shared libraries"作品Ulrich Drepper

+1

这个答案解释了对'DT_RUNPATH'的需求,但不解释为什么'DT_RPATH'已被弃用。两者都有自己的用法,当使用'LD_LIBRARY_PATH'时,'DT_RUNPATH'会中断'libtool':https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 – vinc17