这一页 https://web.archive.org/web/20120418232524/http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/说关于图书馆检索的顺序ld.so
:
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 而不是 RUNPATH,或者确保
LD_LIBRARY_PATH 在运行之前设置。
所以,使用RPATH
with RUNPATH
很糟糕,因为RUNPATH
某种程度的取消RPATH
那么间接动态加载不能按预期工作吗?但为什么那么RPATH
已被弃用,有利于RUNPATH
?
有人可以解释一下情况吗?
当您发布二进制文件时,最好为用户提供一种方法,使二进制文件适应他们自己系统的具体情况,其中包括调整库搜索路径。
用户通常可以调整LD_LIBRARY_PATH
and /etc/ld.so.conf
,两者的优先级都低于DT_RPATH
,即您不能覆盖二进制文件中硬编码的内容,而如果您使用DT_RUNPATH
相反,用户可以使用以下命令覆盖它LD_LIBRARY_PATH
.
(FWIW,我认为ld.so.conf
也应该优先于DT_RUNPATH
,但是,无论如何,至少我们有LD_LIBRARY_PATH
).
另外,我强烈不同意上面的使用建议DT_RPATH
。 IMO,最好两者都不使用DT_RPATH
nor DT_RUNPATH
在已发送的二进制文件中。
unless
您将所有依赖库与可执行文件一起提供,并希望确保安装后JustWork(tm),在本例中使用DT_RPATH
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)