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.conf
ld.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"
관심 있는 분들을 위해 버그 보고서를 작성했습니다.