RPATH의 $ORIGIN이 심볼릭 링크를 따르지 않게 만드는 방법은 무엇입니까?

RPATH의 $ORIGIN이 심볼릭 링크를 따르지 않게 만드는 방법은 무엇입니까?

app라이브러리에 의존하고 다음 과 같이 libbar.so로드하는 실행 파일이 있습니다 .RPATH$ORIGIN

$ readelf -d app

Dynamic section at offset 0xe08 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libbar.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/lib/]

실행 파일에 대한 기호 링크로 구성된 적절한 디렉토리 구조에서 실행하는 것이 가장 좋습니다 libbar.so.

$ ls -R
.:
app@  lib/

./lib:
libbar.so@

- 하지만링커는 실행 파일의 원본 파일에 대한 심볼릭 링크를 따라 $ORIGIN디렉터리를 실행 파일로 설정하고 거기에서 종속성 경로를 확인합니다. 이렇게 하지 않게 하는 것이 가능한가요?따라서 디렉터리 경로 측면에서 lib 파일을 검색할 때 심볼릭 링크는 파일 시스템의 실제 파일(검색의 "끝점")로 처리됩니다.

또한 이 문제에 대한 몇 가지 추론은 다음과 같습니다.

  1. 바이너리 파일을 다음과 같이 설정하는 것이 편리합니다.여러 관계 디렉터리에서 종속성 검색, 예를 들어 $ORIGIN/바이너리 자체 에서 $ORIGIN/appname_dependencies/(따라서 바이너리와 해당 종속성을 디렉터리에 복사하여 실행할 수 있지만 시스템에서 동일한 바이너리의 여러 버전을 사용하여 대체하는 더 복잡한 설정도 가능합니다).

  2. 요청으로 인해RPATH검색 방법에는 여러 종속 검색 경로가 사용됩니다.: 종속성의 "슬래시" 이름( )은 NEEDED Shared library: [./libbar.so]검색 경로를 1개만 설정합니다. 또한 단순화를 위해 종속성 해결 경로는 바이너리 자체에 있어야 합니다.

  3. 모든 바이너리(애플리케이션 및 모든 종속성)를 병합하는 기능링크가 포함된 완전한 종속성 그래프, 파일을 복사하는 대신. 그리고심볼릭 링크가 더 유연함하드 링크보다: 파일 시스템 전체에 걸쳐 링크됩니다. 실제로 저는 Linux 클러스터의 교육 환경에서 상위 디렉터리에 대한 하드 링크를 완료할 수 없는 이 문제에 직면했습니다.

        $ ln ../afile 
        ln: creating hard link `./afile' => `../afile': Invalid cross-device link
    

답변1

만약 당신이 정말로생각하다이와 같은 심볼릭 링크를 혼합하려면할 수 있다다음 구성을 빌드합니다.

  • 실행 파일을 자체 디렉터리로 이동
  • "일반" 위치에서 이동된 실행 파일로 심볼릭 링크를 만듭니다.
  • 해결될 공유 라이브러리에 대한 실행 파일 디렉터리에 심볼릭 링크를 만듭니다.

관련 정보