내 경우에는 LD_LIBRARY_PATH
빈 문자열로 설정된 것 같습니다. 그러나 모든 표준 시스템 도구는 여전히 잘 작동하므로 동적 링커가 이 경우를 확인하고 LD_LIBRARY_PATH
이 경우 몇 가지 기본값을 사용하는 것 같습니다.
이 기본값은 무엇입니까? 최소한 포함되어 있는 것 같은데 /usr/lib
그 외에는 무엇이 있나요? 동적 링커가 검색할 표준 위치를 결정하는 체계적이고 좋은 방법이 있습니까?
문제는 동적 링커가 검색할 경로와 약간 다릅니다. 기본값이 있다는 것은 주어진 경우 해당 값을 사용하고 LD_LIBRARY_PATH
, 지정되지 않은 경우 기본값을 사용한다는 의미입니다. 즉, LD_LIBRARY_PATH
제공된 경우 기본값을 사용하지 않는다는 의미입니다.
답변1
Linux의 일반적인 동적 링커는 캐시를 사용하여 라이브러리를 찾습니다. 캐시는 지정된 경로(현재 일반적으로 의 파일)를 찾아서 에 저장되고 /etc/ld.so.cache
업데이트 됩니다. 를 실행하여 해당 내용을 나열할 수 있습니다.ldconfig
/etc/ld.so.conf
/etc/ld.so.conf.d
ldconfig -p
따라서 기본값이 없으며 LD_LIBRARY_PATH
기본 라이브러리 조회에는 기본값이 전혀 필요하지 않습니다. 정의된 경우 LD_LIBRARY_PATH
먼저 사용되지만 다른 조회(일부 기본 디렉터리도 포함)는 비활성화되지 않습니다.
이것ld.so(8)
맨페이지세부 사항은 다음과 같습니다.
공유 라이브러리 종속성에 슬래시가 포함되어 있지 않으면 다음 순서로 검색됩니다.
DT_RPATH
DT_RUNPATH
존재하지만 속성이 존재하지 않는 경우 바이너리의 동적 섹션 속성에 지정된 디렉터리를 사용합니다 .DT_RPATH
권장되지 않습니다.실행 파일이 안전 실행 모드(아래 참조)에서 실행되고 있지 않으면 환경 변수가 사용되며
LD_LIBRARY_PATH
, 이 경우 무시됩니다.
DT_RUNPATH
존재하는 경우 바이너리의 동적 부분 속성에 지정된 디렉터리를 사용합니다.
/etc/ld.so.cache
이전에 향상 라이브러리 경로에서 발견된 후보 공유 객체의 컴파일된 목록이 포함된 캐시 파일에서 . 그러나 링커 옵션을 통해 바이너리가-z nodeflib
연결된 경우 기본 경로의 공유 개체는 건너뜁니다. 하드웨어 기능 디렉터리(아래 참조)에 설치된 공유 개체는 다른 공유 개체보다 우선합니다.기본 경로 아래
/lib
에서/usr/lib
. (일부 64비트 아키텍처에서 64비트 공유 객체의 기본 경로는/lib64
이고 그 다음은 입니다.) 링커 옵션을 사용하여/usr/lib64
바이너리가 링크된 경우 이 단계를 건너뜁니다 .-z nodeflib
LD_LIBRARY_PATH
설정되지 않았거나 비어 있는 경우무시당하다. 공백으로 설정한 경우가치( LD_LIBRARY_PATH=:
예를 들어) 이러한 null 값은현재 디렉토리로 해석됨.