명령은 공유 라이브러리를 찾을 디렉토리를 나열합니까?

명령은 공유 라이브러리를 찾을 디렉토리를 나열합니까?

나는 읽었다which공유 라이브러리와 동일그리고실행 파일이 실행될 때 공유 객체를 찾는 곳은 어디입니까?, 하지만모든 디렉토리를 나열하는 명령이 있습니까?공유 라이브러리는 어디에서 검색되나요?

두 번째 질문에서 설명한 모든 목록을 자동으로 계산하는 명령과 유사합니다.

답변1

짧은: 없음

long: 관련 환경 변수는 시스템 및 구성에 따라 다릅니다. 특정 시스템/구성에 대해 이를 수행하는 스크립트를 작성할 수 있습니다.

실행 파일이 실행될 때 공유 객체를 찾는 곳은 어디입니까?약간의 통찰력을 제공하지만 불완전합니다. OSX와 Solaris를 언급하지만 Linux에 중점을 두고 다음 두 가지 리소스를 가리킵니다.

다음 사항도 유용할 수 있습니다.

특히, "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 

그러나 이로 인해 공유 라이브러리에 없는 결과가 너무 많이 발생할 가능성이 높습니다.

관련 정보