Linux에서 바이너리를 컴파일할 때 공유 객체를 찾을 위치를 동적 로더에게 알려주는 RPATH라는 것이 있습니다. RPATH에 대해 제가 좋아하는 점은 이 속성을 사용하여 .so
원하는 경우 $ORIGIN
로더가 실행 파일 경로에 상대적인 경로에서 해당 파일을 검색하는 특정 파일을 제공 할 수 있다는 것입니다. 따라서 내 바이너리에 RPATH가 있는 경우 $ORIGIN/.
로더는 해당 디렉터리에서 검색하므로 소프트웨어 배포에 유용합니다.
문제가 있습니다. 로더 자체를 하드코딩해야 하므로 모든 종속성을 배송할 수 있다고 해도 로더가 잘못되면 아무 소용이 없습니다. musl 로더를 예로 들면, ld
or to be 와 같은 patchelf
것을 사용하여 인터프리터 경로를 설정할 수 있습니다 ./musl-ld.so
. 문제는 실행 파일이 자체 디렉토리에서 호출되는 경우에만 작동한다는 것입니다. 을 사용하면 $ORIGIN
커널이 다음을 검색하게 됩니다. 텍스트 경로의 이름입니다 $ORIGIN/./musl-ld.so
. 인터프리터는 이것을 할 수 있는데 커널은 할 수 없는 것 같은 이유가 있나요? 그러한 제한을 수정하는 것이 커널 관리자에게 이익이 됩니까? 이는 시스템에 안정적인 시스템 호출 인터페이스가 있기 때문에 AppImage와 같은 해킹을 사용하지 않고도 Linux에 이식 가능한 실행 파일을 만드는 프로세스를 크게 단순화합니다.