我在 Ubuntu 22.04 系统上,正在使用 C 语言和库。
我知道(从不同的书籍中,包括 Kerrisk 的《Linux 编程接口》)在寻找运行时共享库位置时会使用这种算法(为了简单起见,我只是为了省略预加载的库):
当指定 RUNPATH 字段时(即DT_RUNPATH
非空)
LD_LIBRARY_PATH
- 运行路径(
DT_RUNPATH
字段) ld.so.cache
- 默认库路径(
/lib
和/usr/lib
)
在没有 RUNPATH 的情况下(即为DT_RUNPATH
空字符串)
RPATH
LD_LIBRARY_PATH
ld.so.cache
- 默认库路径(
/lib
和/usr/lib
)
问题是大多数书上都说,一般来说默认的库路径是 /lib 和 /usr/lib,但没有提到如何获取系统的精确默认库路径。
- 我可以在我的 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)
您可以对其他拱门使用类似的方法,但链接器的具体名称和位置可能会有所不同。