首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RPATH而不是RUNPATH?

使用RPATH而不是RUNPATH?
EN

Stack Overflow用户
提问于 2011-11-01 14:18:11
回答 2查看 23K关注 0票数 41

此页提到了ld.so中的图书馆搜索订单

除非loaded对象具有加载对象的RUNPATH: RPATH,否则加载器的RPATH (除非它有RUNPATH),.,直到链的末尾,这要么是可执行文件,要么是由dlopen加载的对象,除非可执行文件有RUNPATH: RPATH是加载对象的可执行LD_LIBRARY_PATH RUNPATH的默认值。

然后建议:

当您发布二进制文件时,要么使用RPATH而不是RUNPATH,要么确保在运行LD_LIBRARY_PATH之前设置它们。

因此,将RPATHRUNPATH结合使用是不好的,因为RUNPATH类取消了RPATH,所以间接动态加载不能像预期的那样工作?但是为什么RPATH被反对支持RUNPATH呢?

有人能解释一下情况吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-06 15:13:52

当您发布二进制文件时,最好是为用户提供一种方式,使其适应自己系统的具体情况,包括调整库搜索路径。

用户通常可以调整LD_LIBRARY_PATH/etc/ld.so.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

票数 42
EN

Stack Overflow用户

发布于 2013-06-04 16:21:06

激冷的回答是完全正确的;我只想添加一些颜色,从最近阅读的glibc源代码(主8b0ccb2,在2.17)。要明确的是,如果没有在给定级别指定的位置找到库,则将尝试下一个级别。如果在给定级别找到库,则搜索将停止。

动态图书馆搜索顺序:

  1. DT_RPATH在ELF二进制文件中,除非DT_RUNPATH设置。
  2. LD_LIBRARY_PATH条目,除非setuid/setgid
  3. ELF二进制中的DT_RUNPATH
  4. /etc/ld.so.cache条目,除非在链接时给出-z nodeflib
  5. /lib,/usr/lib,除非-z nodeflib
  6. 完成了,“没有找到”。
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7967848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档