Alb*_*ert 13 defaults libraries path ld
在我的情况下,似乎LD_LIBRARY_PATH
设置为空字符串。但是所有标准系统工具仍然可以正常工作,所以我猜动态链接器会检查这种情况并LD_LIBRARY_PATH
在这种情况下使用一些默认值。
这个默认值是多少?我想它至少包括/usr/lib
但还有什么?有没有什么好的系统方法来确定动态链接器将搜索的标准位置?
这个问题与动态链接器将搜索的路径略有不同。 有一个默认值意味着它会使用LD_LIBRARY_PATH
如果给定的值,或者如果没有给定,它将使用默认值 - 这意味着它不会使用如果LD_LIBRARY_PATH
提供了默认值。
Ste*_*itt 25
Linux 上常用的动态链接器使用缓存来查找其库。缓存存储在 中/etc/ld.so.cache
,并通过ldconfig
查看它给出的路径/etc/ld.so.conf
(现在通常是 中的文件/etc/ld.so.conf.d
)进行更新。
所以没有默认值LD_LIBRARY_PATH
,默认库查找根本不需要它。如果LD_LIBRARY_PATH
已定义,则首先使用它,但不会禁用其他查找(也包括一些默认目录)。
该ld.so(8)
手册页有详细介绍:
如果共享对象依赖项不包含斜杠,则按以下顺序搜索它:
使用
DT_RPATH
二进制文件的动态部分属性中指定的目录(如果存在且DT_RUNPATH
属性不存在)。使用的DT_RPATH
是过时了。使用环境变量
LD_LIBRARY_PATH
,除非可执行文件在安全执行模式下运行(见下文),在这种情况下它会被忽略。使用
DT_RUNPATH
二进制文件的动态部分属性中指定的目录(如果存在)。来自缓存文件
/etc/ld.so.cache
,其中包含先前在扩充库路径中找到的候选共享对象的编译列表。但是,如果二进制文件与-z nodeflib
链接器选项链接,则会跳过默认路径中的共享对象。安装在硬件功能目录(见下文)中的共享对象优先于其他共享对象。在默认路径下
/lib
,然后/usr/lib
。(在某些 64 位体系结构上,64 位共享对象的默认路径是/lib64
,然后是/usr/lib64
。)如果二进制文件与-z nodeflib
链接器选项链接,则跳过此步骤。
如果LD_LIBRARY_PATH
为空,则忽略。如果它设置为空值(LD_LIBRARY_PATH=:
例如),这些空值将被解释为当前目录。