Debian:令人困惑的 ld.so 联机帮助页文档

Debian:令人困惑的 ld.so 联机帮助页文档

我正在查看ld.so我的 Debian 稳定系统的联机帮助页。目前它指出

$ man ld.so
[...]
NOTES
   Hardware capabilities
       Some shared objects are compiled using hardware-specific instructions which do not exist on every CPU.  Such objects should be installed in directories whose names define the required hardware ca‐
       pabilities, such as /usr/lib/sse2/.  The dynamic linker checks these directories against the hardware of the machine and selects the most suitable version of a given shared object.  Hardware capa‐
       bility directories can be cascaded to combine CPU features.  The list of supported hardware capability names depends on the CPU.  The following names are currently recognized:

让我惊讶的是最后一句话:

目前可以识别以下名称

目前这不是真的(或者至少不再是),因为我所能找到的就是:

% cat /etc/ld.so.conf.d/*
/usr/lib/x86_64-linux-gnu/libfakeroot
# Multiarch support
/usr/local/lib/i386-linux-gnu
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/usr/local/lib/i686-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
# Legacy biarch compatibility support
/lib32
/usr/lib32
# Legacy biarch compatibility support
/libx32
/usr/libx32

真的会在我的机器上ld.so神奇地找到一个库吗?/usr/lib/sse2/

参考:

% apt-cache policy manpages
manpages:
  Installed: 5.10-1
  Candidate: 5.10-1
  Version table:
 *** 5.10-1 500
        500 http://deb.debian.org/debian bullseye/main amd64 Packages
        500 http://deb.debian.org/debian bullseye/main i386 Packages
        100 /var/lib/dpkg/status

为了完整起见,这里是 Bullseye 32 位 chroot 的相同输出:

% cat /etc/ld.so.conf.d/*
/usr/lib/i386-linux-gnu/libfakeroot
# Multiarch support
/usr/local/lib/i386-linux-gnu
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/usr/local/lib/i686-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib

答案1

以下是基于glibc的系统(2.37版本之前)

是的,会的,但由于您使用的是 x86,因此仅适用于 32 位二进制文​​件。参见示例libspeex1 哪艘船其库位于/usr/lib/i386-linux-gnu/(对于所有 32 位 x86 系统)和/usr/lib/i386-linux-gnu/sse2/(对于支持 SSE2 的 32 位 x86 系统)。另一个例子是libx264-160 哪艘船其库位于/usr/lib/i386-linux-gnu//usr/lib/i386-linux-gnu/i686/sse2/(适用于支持 SSE2 的 i686 兼容 32 位 x86 系统)。

ld.so.conf这不依赖于在等中列出与功能相关的目录;ld.so寻找其搜索路径上的目录的目录。如果你跑

/sbin/ldconfig -v 2>/dev/null | grep -A3 hwcap

您将看到系统上使用的与功能相关的目录(IE它们包含库并且ldconfig了解它们)。

另一个查找搜索路径的技巧(适用于 2.37 glibc)如下:

% LD_DEBUG=libs LD_LIBRARY_PATH=. /bin/true
   3626040:     find library=libc.so.6 [0]; searching
   3626040:      search path=./glibc-hwcaps/x86-64-v3:./glibc-hwcaps/x86-64-v2:.                (LD_LIBRARY_PATH)

答案2

感谢 @stephen-kitt 的帮助,我发现 x86_64 上还有一些未记录的“子文件夹”。

例如:

$ sudo mkdir /usr/lib/x86_64-linux-gnu/haswell
$ sudo mkdir /usr/lib/x86_64-linux-gnu/avx512_1
$ sudo cp /usr/lib/x86_64-linux-gnu/libx264.so.160 /usr/lib/x86_64-linux-gnu/haswell
$ sudo cp /usr/lib/x86_64-linux-gnu/libx264.so.160 /usr/lib/x86_64-linux-gnu/avx512_1
$ sudo ldconfig
% sudo ldconfig -p | grep hwcap
        libx264.so.160 (libc6,x86-64, hwcap: 0x0004000000000000) => /lib/x86_64-linux-gnu/haswell/libx264.so.160
        libx264.so.160 (libc6,x86-64, hwcap: 0x0000000000000004) => /lib/x86_64-linux-gnu/avx512_1/libx264.so.160

以供参考:

% apt-get source libc-bin
% cat sysdeps/x86/dl-procinfo.c | grep haswe
    "i586", "i686", "haswell", "xeon_phi"
% cat sysdeps/x86/dl-procinfo.c | grep avx
    "sse2", "x86_64", "avx512_1"

我已经为感兴趣的人填写了错误报告:

相关内容