동적 로더: 이상한 동작(Debian 8)

동적 로더: 이상한 동작(Debian 8)

Debian 8 게스트 운영 체제(OpenVZ 컨테이너화된 환경)에서 과학 애플리케이션을 설정하고 실행하려고 합니다. 운영 체제와 함께 번들로 제공되는 GNU C++ 라이브러리는 꽤 오래되었고 필요한 기호가 모두 포함되어 있지 않기 때문에 최신 버전의 라이브러리를 포함하는 특수 디렉터리를 만들고 해당 디렉터리를 가리키도록 libstdc++.so.6환경 변수를 설정했습니다 . LD_LIBRARY_PATH또한 대상 응용 프로그램에 SUID 권한이 설정되어 있지 않은지 확인했습니다( LD_LIBRARY_PATH일부 플랫폼에서는 무시될 수 있음). 그럼에도 불구하고 ldd <APP_EXECUTABLE>명령은 여전히 ​​기본 시스템 위치를 사용하는 것으로 표시됩니다 /usr/lib/x86_64-linux-gnu. 왜 LD_LIBRARY_PATH무시됩니까?

추신: 환경 변수를 사용해 보았지만 LD_PRELOAD역시 무시되었습니다.

답변1

/lib이 명령은 표준 시스템 라이브러리 디렉터리(일반적으로 및 /usr/lib)와 파일 및/또는 파일에 정의된 모든 디렉터리 의 내용을 확인 /etc/ld.so.conf하고 결과를 에 캐시합니다. 패키지 관리 도구는 일반적으로 라이브러리 패키지를 설치하거나 제거할 때마다 이 작업을 자동으로 실행합니다./etc/ld.so.conf.d/*.confldconfig/etc/ld.so.cacheldconfig

새 프로그램이 로드될 때마다 동적 로더는 이 캐시를 사용하여 필요한 라이브러리 검색 속도를 높입니다.

시스템 라이브러리 디렉터리에서 기호 링크를 수동으로 추가하거나 제거하는 경우 ldconfig변경 사항을 적용하려면 시스템의 루트로 실행하여 캐시를 플러시해야 할 가능성이 높습니다. 이 명령을 실행하지 않으면 동적 로더는 라이브러리 경로가 변경되었음을 알지 못하고 이전 캐시의 라이브러리 경로를 계속 사용할 것입니다.

LD_LIBRARY_PATH위의 내용은 본질적으로 라이브러리를 찾는 기본 메커니즘이지만 (= "이 라이브러리 디렉터리를 먼저 확인하세요") 또는 LD_PRELOAD(= "를 사용하여 수행할 수 있습니다.언제나이 라이브러리를 먼저 로드하세요) 환경 변수.

DT_RPATH(더 이상 사용되지 않음) 또는 이라는 섹션 속성을 사용하여 프로그램 바이너리 자체에 라이브러리 경로 정보를 포함할 수도 있습니다 DT_RUNPATH. 이는 또한 캐싱 메커니즘을 무시하지만 내가 아는 한 그 사용은 다소 특이합니다.정확하게더 이상 동일하지 않은 시스템/환경에서 작동하기 위해 프로그램이 필요할 때 원래 문제와 같은 문제가 발생하는 경향이 있기 때문입니다.정밀한프로그램이 의도된 시스템과 일치합니다.

관련 정보