系统会在哪里搜索动态库?

系统会在哪里搜索动态库?

我想知道系统会在哪里搜索动态库。我们以nxclient为例。例如, ldd /usr/NX/bin/nxclient 给了我一些输出

libpng12.so.0 => /usr/NX/lib/libpng12.so.0 (0x00007fcb4a16f000)

现在为什么系统选择 /usr/NX/lib/libpng12.so.0 而不是 /usr/lib64/libpng12.so.0?两者都存在。这是在哪里配置的? /etc/ld.so.conf* 不包含 /usr/NX 并且我的 $LD_LIBRARY_PATH 为空。

答案1

库路径可能被硬编码在二进制文件中。

来自RPATH 维基百科页面

GNU C 库的动态链接器及其衍生的嵌入式 GLIBC 实现了相当复杂的共享库搜索算法。基本搜索顺序是:

  1. 二进制文件的 DT_RPATH 动态节属性中的(以冒号分隔的)路径(如果存在)且 DT_RUNPATH 属性不存在。
  2. 环境变量 LD_LIBRARY_PATH 中的(冒号分隔的)路径,除非可执行文件是 setuid/setgid 二进制文件,在这种情况下它将被忽略。 LD_LIBRARY_PATH 可以通过使用选项 --library-path 调用动态链接器来覆盖(例如 /lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram)。
  3. 二进制文件的 DT_RUNPATH 动态节属性中的(冒号分隔的)路径(如果存在)。
  4. 基于 ldconfig 缓存文件(通常位于 /etc/ld.so.cache)进行查找,该文件包含先前在增强库路径(由 /etc/ld.so.conf 设置)中找到的候选库的编译列表。但是,如果二进制文件是使用 -z nodeflib 链接器选项链接的,则将跳过默认库路径中的库。
  5. 在受信任的默认路径 /lib 中,然后在 /usr/lib 中。如果二进制文件是使用 -z nodeflib 链接器选项链接的,则将跳过此步骤。

要查看二进制文件是否配置了 RPATH:

readelf -d filename 仅显示“动态”部分的数据

标头的“动态”部分很有趣,因为它包含初始加载过程中使用的数据,例如:

NEEDED: libraries needed by this module
RPATH: See “Loader search procedure” below
SONAME: If this module is a library, this item shows the “soname” of the library.

来源:linux 加载器,以及它如何查找库:ld-linux 等

要查看 ldconfig 缓存中的所有库,您可以运行

ldconfig -p

在二进制文件中设置 RUNPATH 的示例

$ readelf -d /opt/teamviewer9/tv_bin/TVGuiSlave.64 | grep -i RUNPATH
 0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib]

答案2

系统将首先在 中指定的路径中搜索LD_LIBRARY_PATH,然后在 中指定的路径中搜索/etc/ld.so.conf

相关内容