시스템은 동적 라이브러리를 어디에서 검색합니까? [복사]

시스템은 동적 라이브러리를 어디에서 검색합니까? [복사]

시스템이 동적 라이브러리를 검색하는 위치를 알고 싶습니다. nxclient를 예로 들어보겠습니다. 예를 들어, ldd /usr/NX/bin/nxclient는 나에게 몇 가지 출력을 제공했습니다.

libpng12.so.0 => /usr/NX/lib/libpng12.so.0 (0x00007fcb4a16f000)

이제 시스템이 /usr/lib64/libpng12.so.0 대신 /usr/NX/lib/libpng12.so.0을 선택하는 이유는 무엇입니까? 둘 다 존재합니다. 이것은 어디에 구성되어 있나요? /etc/ld.so.conf*에는 /usr/NX가 포함되어 있지 않으며 $LD_LIBRARY_PATH가 비어 있습니다.

답변1

라이브러리 경로는 바이너리에 하드코딩될 수 있습니다.

~에서RPATH 위키피디아 페이지

GNU C 라이브러리의 동적 링커와 그 파생물인 임베디드 GLIBC는 매우 정교한 공유 라이브러리 검색 알고리즘을 구현합니다. 기본 검색 순서는 다음과 같습니다.

  1. 바이너리 파일의 DT_RPATH 동적 섹션 속성에 있는 (콜론으로 구분된) 경로입니다(있는 경우). DT_RUNPATH 속성은 존재하지 않습니다.
  2. 실행 파일이 setuid/setgid 바이너리가 아닌 경우 환경 변수 LD_LIBRARY_PATH의 (콜론으로 구분된) 경로입니다. 이 경우 무시됩니다. --library-path 옵션(예: /lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram)을 사용하여 동적 링커를 호출하여 LD_LIBRARY_PATH를 재정의할 수 있습니다.
  3. 바이너리 파일의 DT_RUNPATH 동적 섹션 속성에 있는 (콜론으로 구분된) 경로(있는 경우)입니다.
  4. 조회는 향상된 라이브러리 경로(/etc/ld.so.conf에 의해 설정됨)에서 이전에 발견된 후보 라이브러리의 컴파일된 목록을 포함하는 ldconfig 캐시 파일(일반적으로 /etc/ld.so.cache에 있음)을 기반으로 합니다. . 그러나 -z nodeflib 링커 옵션을 사용하여 바이너리를 링크하면 기본 라이브러리 경로의 라이브러리를 건너뜁니다.
  5. 신뢰할 수 있는 기본 경로 /lib와 /usr/lib에 있습니다. -z nodeflib 링커 옵션을 사용하여 바이너리가 연결된 경우 이 단계를 건너뜁니다.

바이너리에 RPATH가 구성되어 있는지 확인하려면 다음을 수행하세요.

readelf -d filename은 "동적" 부분의 데이터만 표시합니다.

헤더의 "동적" 부분은 초기 로드 중에 사용된 데이터를 포함하고 있기 때문에 흥미롭습니다. 예를 들면 다음과 같습니다.

NEEDED: libraries needed by this module
RPATH: See “Loader search procedure” below
SONAME: If this module is a library, this item shows the “soname” of the library.

원천:Linux 로더 및 라이브러리를 찾는 방법: ld-linux 등

ldconfig 캐시에 있는 모든 라이브러리를 보려면 다음을 실행하세요.

ldconfig -p

바이너리 파일에 RUNPATH를 설정하는 예

$ readelf -d /opt/teamviewer9/tv_bin/TVGuiSlave.64 | grep -i RUNPATH
 0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib]

답변2

시스템은 에 지정된 경로에서 먼저 검색 LD_LIBRARY_PATH한 다음 에 지정된 경로에서 검색합니다 /etc/ld.so.conf.

관련 정보