在 Ubuntu 中查找默认库路径位置

在 Ubuntu 中查找默认库路径位置

我在 Ubuntu 22.04 系统上,正在使用 C 语言和库。

我知道(从不同的书籍中,包括 Kerrisk 的《Linux 编程接口》)在寻找运行时共享库​​位置时会使用这种算法(为了简单起见,我只是为了省略预加载的库):

当指定 RUNPATH 字段时(即DT_RUNPATH非空)

  1. LD_LIBRARY_PATH
  2. 运行路径(DT_RUNPATH字段)
  3. ld.so.cache
  4. 默认库路径(/lib/usr/lib

在没有 RUNPATH 的情况下(即为DT_RUNPATH空字符串)

  1. RPATH
  2. LD_LIBRARY_PATH
  3. ld.so.cache
  4. 默认库路径(/lib/usr/lib

问题是大多数书上都说,一般来说默认的库路径是 /lib 和 /usr/lib,但没有提到如何获取系统的精确默认库路径

  1. 我可以在我的 Ubuntu 22.04 系统上使用什么命令来获取确切的默认库路径?

答案1

您可以使用 ld,它可以显示系统库路径以及用户定义的库路径。

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012

如果在您的系统中不存在,您可以通过以下方式安装

sudo apt install binutils

笔记:它可能有点重,但你会得到准确的结果,但在你的情况下你必须已经安装了它。

答案2

Ubuntu 使用 glibc,glibc 支持一些调试选项,这些选项在这里可能会有所帮助。man ld.so

LD_DEBUG (since glibc 2.1)
      Output verbose debugging information about operation of the  dynamic  linker.   The
      content  of  this variable is one of more of the following categories, separated by
      colons, commas, or (if the value is quoted) spaces:

      help        Specifying help in  the  value  of  this  variable  does  not  run  the
                  specified  program,  and displays a help message about which categories
                  can be specified in this environment variable.

      all         Print all debugging information  (except  statistics  and  unused;  see
                  below).
      bindings    Display information about which definition each symbol is bound to.
      files       Display progress for input file.
      libs        Display library search paths.
      reloc       Display relocation processing.
      scopes      Display scope information.
      statistics  Display relocation statistics.
      symbols     Display search paths for each symbol look-up.
      unused      Determine unused DSOs.
      versions    Display version dependencies.

此外,您还可以使用以下方法抑制缓存:

--inhibit-cache
      Do not use /etc/ld.so.cache.

这样,您需要做的就是确保LD_LIBRARY_PATH未设置,并找到不会干扰RPATH或的二进制文件RUNPATH。例如:

env -u LD_LIBRARY_PATH LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --inhibit-cache /bin/true # on amd64
env -u LD_LIBRARY_PATH LD_DEBUG=libs /lib/ld-linux-armhf.so.3 --inhibit-cache /bin/true # on armhf

答案3

假设您使用的是 amd64,您可以执行/lib64/ld-linux-x86-64.so.2 --help,底部部分将为您提供所需的内容:

Shared library search path:
  (libraries located via /etc/ld.so.cache)
  /lib/x86_64-linux-gnu (system search path)
  /usr/lib/x86_64-linux-gnu (system search path)
  /lib (system search path)
  /usr/lib (system search path)

Subdirectories of glibc-hwcaps directories, in priority order:
  x86-64-v4 (supported, searched)
  x86-64-v3 (supported, searched)
  x86-64-v2 (supported, searched)

您可以对其他拱门使用类似的方法,但链接器的具体名称和位置可能会有所不同。

相关内容