![RPATH의 $ORIGIN이 심볼릭 링크를 따르지 않게 만드는 방법은 무엇입니까?](https://linux55.com/image/92175/RPATH%EC%9D%98%20%24ORIGIN%EC%9D%B4%20%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%EB%A5%BC%20%EB%94%B0%EB%A5%B4%EC%A7%80%20%EC%95%8A%EA%B2%8C%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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 파일을 검색할 때 심볼릭 링크는 파일 시스템의 실제 파일(검색의 "끝점")로 처리됩니다.
또한 이 문제에 대한 몇 가지 추론은 다음과 같습니다.
바이너리 파일을 다음과 같이 설정하는 것이 편리합니다.여러 관계 디렉터리에서 종속성 검색, 예를 들어
$ORIGIN/
바이너리 자체 에서$ORIGIN/appname_dependencies/
(따라서 바이너리와 해당 종속성을 디렉터리에 복사하여 실행할 수 있지만 시스템에서 동일한 바이너리의 여러 버전을 사용하여 대체하는 더 복잡한 설정도 가능합니다).요청으로 인해
RPATH
검색 방법에는 여러 종속 검색 경로가 사용됩니다.: 종속성의 "슬래시" 이름( )은NEEDED Shared library: [./libbar.so]
검색 경로를 1개만 설정합니다. 또한 단순화를 위해 종속성 해결 경로는 바이너리 자체에 있어야 합니다.모든 바이너리(애플리케이션 및 모든 종속성)를 병합하는 기능링크가 포함된 완전한 종속성 그래프, 파일을 복사하는 대신. 그리고심볼릭 링크가 더 유연함하드 링크보다: 파일 시스템 전체에 걸쳐 링크됩니다. 실제로 저는 Linux 클러스터의 교육 환경에서 상위 디렉터리에 대한 하드 링크를 완료할 수 없는 이 문제에 직면했습니다.
$ ln ../afile ln: creating hard link `./afile' => `../afile': Invalid cross-device link
답변1
만약 당신이 정말로생각하다이와 같은 심볼릭 링크를 혼합하려면할 수 있다다음 구성을 빌드합니다.
- 실행 파일을 자체 디렉터리로 이동
- "일반" 위치에서 이동된 실행 파일로 심볼릭 링크를 만듭니다.
- 해결될 공유 라이브러리에 대한 실행 파일 디렉터리에 심볼릭 링크를 만듭니다.