데비안: 혼란스러운 ld.so 맨페이지 문서

데비안: 혼란스러운 ld.so 맨페이지 문서

ld.so나는 데비안 안정 시스템의 맨페이지를 보고 있습니다 .현재는 다음과 같이 말합니다.:

$ 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.confld.so이는 등 의 기능 관련 디렉토리 나열에 의존하지 않습니다.아들검색 경로에 있는 디렉터리의 디렉터리입니다. 당신이 달리면

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

시스템에서 사용되는 기능 관련 디렉토리를 볼 수 있습니다(여기에는 라이브러리가 포함되어 있으며 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"

관심 있는 분들을 위해 버그 보고서를 작성했습니다.

관련 정보