LD_LIBRARY_PATH 的默认值是多少?

LD_LIBRARY_PATH 的默认值是多少?

就我而言,似乎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.dldconfig -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=:例如),那些空值是解释为当前目录

相关内容