접미사로 시작하는 경로 접두사를 제거하는 데 사용됩니다.

접미사로 시작하는 경로 접두사를 제거하는 데 사용됩니다.

환경 변수를 사용하여 지정한 디렉터리의 하위 디렉터리에서 라이브러리 파일을 찾으려는 프로그램이 있습니다. 추가되는 첫 번째 하위 디렉터리를 무시하고 지정한 디렉터리에 경로를 넣을 수 있습니까? 그게 내 뜻이야.

내 폴더 구조

/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_PATHldconfig/etc/ld.so.cache


$MAGICK_HOME/lib귀하의 애플리케이션이 대신 라이브러리에서 읽고 있습니다./usr/lib64

ld.so가 동적으로 링크되면 다음을 검색합니다.

  • DT_RPATHDT_RUNPATH존재하지 않는 경우 ELF 바이너리에서 컴파일된 필드입니다 . 이는 일반적으로 절대 경로이거나 바이너리 위치( )에 대한 상대 경로입니다 $ORIGIN. 이와 같은 환경 변수가 $MAGICK_HOME영향을 미칠 것이라고 생각하지 않습니다 .
  • $LD_LIBRARY_PATH환경 변수(안전 실행 모드에서 실행되지 않는 경우)
  • DT_RUNPATHELF 바이너리로 컴파일된 필드(위와 유사 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_RPATHDT_RUNPATH


설치된 라이브러리를 찾을 수 없기 때문에 애플리케이션을 시작할 수 없습니다./usr/lib64

잘못된 바이너리를 로드하는 것이 아니라 어떤 바이너리도 로드하지 않는 것이 문제라면 /usr/lib64기본 경로에 없는 것일 수 있습니다. 이 상황에서 추가 지원을 제공하려면 배포 및 아키텍처를 알아야 합니다.

관련 정보