就我而言,似乎LD_LIBRARY_PATH
设置为空字符串。但所有标准系统工具仍然可以正常工作,因此我猜动态链接器会检查这种情况并LD_LIBRARY_PATH
在这种情况下使用一些默认值。
该默认值是多少?我想它至少包括/usr/lib
但还有什么?是否有任何好的系统方法来确定动态链接器将搜索的标准位置?
这个问题与动态链接器将搜索的路径略有不同。具有默认值意味着,如果给定,它将使用值LD_LIBRARY_PATH
,或者如果未给定,它将使用默认值 - 这意味着,它不会使用如果LD_LIBRARY_PATH
提供了默认值。
答案1
Linux 上通常的动态链接器使用缓存来查找其库。缓存存储在 中,并通过查找给定的路径(现在通常是在 中的文件)/etc/ld.so.cache
进行更新。可以通过运行列出其内容。ldconfig
/etc/ld.so.conf
/etc/ld.so.conf.d
ldconfig -p
所以 没有默认值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=:
例如),那些空值是解释为当前目录。