나는 읽었다which
공유 라이브러리와 동일그리고실행 파일이 실행될 때 공유 객체를 찾는 곳은 어디입니까?, 하지만모든 디렉토리를 나열하는 명령이 있습니까?공유 라이브러리는 어디에서 검색되나요?
두 번째 질문에서 설명한 모든 목록을 자동으로 계산하는 명령과 유사합니다.
답변1
짧은: 없음
long: 관련 환경 변수는 시스템 및 구성에 따라 다릅니다. 특정 시스템/구성에 대해 이를 수행하는 스크립트를 작성할 수 있습니다.
실행 파일이 실행될 때 공유 객체를 찾는 곳은 어디입니까?약간의 통찰력을 제공하지만 불완전합니다. OSX와 Solaris를 언급하지만 Linux에 중점을 두고 다음 두 가지 리소스를 가리킵니다.
- 라이브러리 HOWTO: 3. 공유 라이브러리(
LD_LIBRARY_PATH
덜 일반적인 것들은 언급되었지만 언급되지 않았으며LD_LIBRARY_PATH_64
, 또한 한 줄로 언급됩니다.길). - ld.so, ld-linux.so* - 동적 링커/로더, 다시 일부 환경 변수를 언급하고길.
다음 사항도 유용할 수 있습니다.
- ldconfig - 동적 링커 런타임 바인딩 구성, Linux 특정(OSX 또는 Solaris 아님):
ldconfig
명령줄에 지정된 디렉터리에 있는 최신 공유 라이브러리에 대한 필수 링크와 캐시를 파일에 생성합니다./etc/ld.so.conf
및 신뢰할 수 있는 디렉터리에서/lib
그리고/usr/lib
(x86-64, lib 및/usr/lib
32비트 라이브러리의 신뢰할 수 있는 디렉터리입니다./lib64
그리고/usr/lib64
64비트 라이브러리의 경우). - 공유 라이브러리는 64비트/32비트 혼합 시스템에서 어떻게 작동합니까?
- shlib 스크립트, 공유 라이브러리의 위치를 지정하는 데 사용되는 다양한 환경 변수를 나열하는 ncurses의 유틸리티 스크립트입니다.
특히, "sudo ldconfig -v
"
-v
,--verbose
상세 모드. 현재 버전 번호, 스캔된 각 디렉터리의 이름 및 생성된 모든 링크를 인쇄합니다. 자동 모드를 재정의합니다.
이것은폐쇄질문에 답변하지만 관련 없는 정보를 많이 제공합니다. (BSD가 이를 사용하는 동안 대부분은 Linux에 국한되지만 다릅니다.매뉴얼 페이지를 참조하세요). 출력 형식에 대해 몇 가지 가정을 하면 다음을 사용하여 해당 출력 형식에서 디렉터리를 가져올 수 있습니다.
sudo ldconfig -v 2>/dev/null | grep ':$' |sed -e 's/://'
(하나의 시스템에서)
/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/lib
/usr/lib
요약하자면: 없음주문하다, 그러나 시스템에 따라 달라지는 스크립트를 만들 수 있습니다.
답변2
GNU 시스템에서
ldconfig -p | tail -n +2 | grep -o '/.*/' | sort -u
캐시에서 동적 라이브러리가 있는 디렉터리를 제공합니다. 이를 에 추가할 수 있습니다 $LD_LIBRARY_PATH
. 여기서 구문은 다음 zsh
과 같습니다.
(
ldconfig -p | tail -n +2 | grep -o '/.*/'
[ -n "$LD_LIBRARY_PATH" ] && printf '%s/\n' ${${(s/:/)LD_LIBRARY_PATH}:A}
) | sort -u
또한 적어도 내 x86_64 GNU 시스템에서는 64비트 실행 파일의 경우 $dir/x86_64
및 각 디렉토리에서도 $dir/tls
검색합니다 $dir/tls/x86_64
.
또한 실행 파일에는 하드코딩된 라이브러리 경로가 있을 수 있습니다. 여전히 GNU 동적 링커를 사용하면 LD_DEBUG=libs
다음과 같은 방법을 사용하여 검색 경로를 얻을 수 있습니다(여기서는 내 GNU/Linux 시스템에서 실행 가능한 64비트 ELF입니다).
$ LD_DEBUG=libs /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --inhibit-cache /bin/true 2>&1 |
sed '/.*search path=/!d;s///;s/[[:blank:]]*([^)]*)$//' |
tr : '\n' |
sort -u
/home/stephane/lib
/home/stephane/lib/tls
/home/stephane/lib/tls/x86_64
/home/stephane/lib/x86_64
/lib
/lib/tls
/lib/tls/x86_64
/lib/x86_64
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/tls
/lib/x86_64-linux-gnu/tls/x86_64
/lib/x86_64-linux-gnu/x86_64
/usr/lib
/usr/lib/tls
/usr/lib/tls/x86_64
/usr/lib/x86_64
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/tls
/usr/lib/x86_64-linux-gnu/tls/x86_64
/usr/lib/x86_64-linux-gnu/x86_64
답변3
그런 명령이 있는 줄은 몰랐네요. 그러나 /etc/ld.so.conf
아마도 모든 파일 /etc/ld.so.conf.d/
과 그 안에서 찾은 모든 것이 $LD_LIBRARY_PATH
귀하의 질문에 대한 답을 제공할 것입니다.공유 라이브러리는 어디서 검색하나요?.
참고: 실행 파일은 추가 또는 대체 검색 경로를 정의할 수 있습니다.
또한 ldd
모든 파일의 검색 경로를 사용하여 동적 링커가 실제로 검색하는 위치를 확인할 수도 있습니다. 다음 방법은 시간이 걸리며 확실히 상을 받지 못할 것입니다.
ldd /bin/* /usr/bin/* /sbin/* /usr/sbin/* 2>/dev/null | grep '=>' | awk '{print $3;}' | xargs dirname | sort -u
답변4
모든 공유 라이브러리를 나열하는 특정 명령을 모르지만 다음을 실행하여 "모호한" 해결 방법을 사용할 수 있습니다.
which <non-existent command/alias>
예를 들어 다음과 같이 출력을 확인합니다.
[$]› which fake-command
/usr/bin/which: no fake-command in (/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
또는 *bin으로 끝나는 디렉토리를 찾으세요.
find / -name *bin -type d
그러나 이로 인해 공유 라이브러리에 없는 결과가 너무 많이 발생할 가능성이 높습니다.