환경 변수를 사용하여 지정한 디렉터리의 하위 디렉터리에서 라이브러리 파일을 찾으려는 프로그램이 있습니다. 추가되는 첫 번째 하위 디렉터리를 무시하고 지정한 디렉터리에 경로를 넣을 수 있습니까? 그게 내 뜻이야.
내 폴더 구조
/usr/lib64/[All the library files]
볼 수 있는 프로그램
$MAGICK_HOME/lib/[All the library files]
어디서 조작할 수 있나요 $MAGICK_HOME
?
그래서 내가 MAGICK_HOME=/usr
보기로 설정하면 /usr/lib/[library files]
잘못된 것입니다. 내가 설정하면 어느 것이 잘못되었는지 MAGICK_HOME=/usr/lib64
확인할 수 있습니다 ./usr/lib/lib64/[library files]
그 반대라면 ../
접미사를 a로 시작하여 접두사 경로에 지정된 마지막 디렉터리를 무시하여 가장 바깥쪽 디렉터리에서 돌아올 수 있습니다. MAGICK_HOME
올바른 디렉토리를 지정 하려면 무엇을 입력해야 합니까 ?
답변1
다음은 3가지 흥미로운 상황입니다.
애플리케이션이 읽고 있는 라이브러리 /usr/lib64
와 읽으려는 라이브러리는 다음과 같습니다 $MAGICK_HOME/lib
.
애플리케이션을 컴파일 하는 RPATH
경우 RUNPATH
바이너리 가 $ORIGIN/../lib64
. 라이브러리가 추가되었습니다$MAGICK_HOME/lib
$LD_LIBRARY_PATH
ldconfig
/etc/ld.so.cache
$MAGICK_HOME/lib
귀하의 애플리케이션이 대신 라이브러리에서 읽고 있습니다./usr/lib64
ld.so가 동적으로 링크되면 다음을 검색합니다.
DT_RPATH
DT_RUNPATH
존재하지 않는 경우 ELF 바이너리에서 컴파일된 필드입니다 . 이는 일반적으로 절대 경로이거나 바이너리 위치( )에 대한 상대 경로입니다$ORIGIN
. 이와 같은 환경 변수가$MAGICK_HOME
영향을 미칠 것이라고 생각하지 않습니다 .$LD_LIBRARY_PATH
환경 변수(안전 실행 모드에서 실행되지 않는 경우)DT_RUNPATH
ELF 바이너리로 컴파일된 필드(위와 유사DT_RPATH
)/etc/ld.so.cache
에는 후보 공유 객체의 컴파일된 목록이 포함되어 있습니다./lib
그리고 기본 경로/usr/lib
. 일부 아키텍처에서 64비트 공유 객체의 기본 경로는/lib64
및 입니다/usr/lib64
. 링커 옵션을 통해 바이너리가-z nodeflib
연결된 경우 이 단계를 건너뜁니다.
/usr/lib64
아마도 기본 경로에 있을 것이기 때문에 프로그램이 시작 시 이 작업을 수행하거나 $LD_LIBRARY_PATH
설치 중에 ldconfig
라이브러리를 추가하는 데 사용되는 것으로 의심됩니다 /etc/ld.so.cache
. 이렇게 하면 $MAGICK_HOME/lib
라이브러리가 먼저 검색됩니다. 이러한 일을 방지할 수 있으면 로 돌아가야 합니다 /usr/lib64
.
이것을 사용하여 특정인지 또는 컴파일 readelf
되었는지 확인할 수 있지만 환경 변수가 연결에 영향을 미치는 것처럼 들리고 이러한 옵션(AFAIK)은 환경의 영향을 받지 않기 때문에 그렇지 않다고 생각합니다.DT_RPATH
DT_RUNPATH
설치된 라이브러리를 찾을 수 없기 때문에 애플리케이션을 시작할 수 없습니다./usr/lib64
잘못된 바이너리를 로드하는 것이 아니라 어떤 바이너리도 로드하지 않는 것이 문제라면 /usr/lib64
기본 경로에 없는 것일 수 있습니다. 이 상황에서 추가 지원을 제공하려면 배포 및 아키텍처를 알아야 합니다.