此页提到了ld.so中的图书馆搜索订单
除非loaded对象具有加载对象的RUNPATH: RPATH,否则加载器的RPATH (除非它有RUNPATH),.,直到链的末尾,这要么是可执行文件,要么是由dlopen加载的对象,除非可执行文件有RUNPATH: RPATH是加载对象的可执行LD_LIBRARY_PATH RUNPATH的默认值。
然后建议:
当您发布二进制文件时,要么使用RPATH而不是RUNPATH,要么确保在运行LD_LIBRARY_PATH之前设置它们。
因此,将RPATH与RUNPATH结合使用是不好的,因为RUNPATH类取消了RPATH,所以间接动态加载不能像预期的那样工作?但是为什么RPATH被反对支持RUNPATH呢?
有人能解释一下情况吗?
发布于 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。
发布于 2013-06-04 16:21:06
激冷的回答是完全正确的;我只想添加一些颜色,从最近阅读的glibc源代码(主8b0ccb2,在2.17)。要明确的是,如果没有在给定级别指定的位置找到库,则将尝试下一个级别。如果在给定级别找到库,则搜索将停止。
动态图书馆搜索顺序:
https://stackoverflow.com/questions/7967848
复制相似问题