이미 컴파일 된 바이너리에서 'rpath'를 변경할 수 있습니까?
스크랩 힙에 대해 예약 된 오래된 실행 파일이 있지만 아직 없습니다. 내 환경에서 제거 된 일부 라이브러리에 의존하지만 제대로 작동하는 어딘가에 스텁 라이브러리가 있습니다. 이 실행 파일을 이러한 스텁 라이브러리로 가리키고 싶습니다. 예, LD_LIBRARY_PATH를 설정할 수 있지만이 실행 파일은 많은 스크립트에서 호출되며 많은 사용자가 한곳에서 수정하고 싶습니다.
나는 이것에 대한 출처가 없으며 그것을 얻기가 어려울 것입니다. 나는 생각하고 있었다-ELF 인식 편집기를 사용하여이 파일을 편집하고 rpath에 간단한 PATH를 추가하여 새 라이브러리에 맞출 수 있습니까? 이것이 가능합니까, 아니면 ELF 바이너리를 만든 후에는 위치를 수정하고 이동할 수 없습니까?
chrpath
이를 수행 할 수 있는 도구 가 있습니다. 배포판의 패키지에서 사용할 수 있습니다.
chrpath
라는 것보다 더 보편적 인 도구가 patchelf
있습니다. 원래는 Nix 및 NixOS (패키징 시스템 및 GNU / Linux 배포판) 용 패키지를 만드는 데 사용하기 위해 만들어졌습니다.
바이너리 (여기서는 rdsamp라고 함)에 rpath가없는 경우 chrpath
실패합니다.
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
반면에
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
잘 성공합니다.
@ user7610이 말했듯이 올바른 방법은 patchelf
도구입니다.
그러나 나는 정확히 그것을 수행하는 데 필요한 모든 명령을 포함하여보다 포괄적 인 답변을 줄 수 있다고 생각합니다.
주제에 대한 포괄적 인 기사를 보려면 여기를 클릭 하십시오.
우선, 많은 개발자들이에 대해 이야기 RPATH
하지만 실제로는 RUNPATH
. 이들은 두 개의 다른 선택적 동적 섹션이며 로더는 매우 다르게 처리합니다. 앞서 언급 한 링크에서 이들 간의 차이점에 대해 자세히 알아볼 수 있습니다.
지금은 기억하세요 :
- 경우
RUNPATH
설정,RPATH
무시됩니다 RPATH
더 이상 사용되지 않으며 피해야합니다.RUNPATH
재정의 될 수 있기 때문에 선호됩니다.LD_LIBRARY_PATH
현재 R [UN] PATH보기
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
R [UN] PATH 지우기
patchelf --remove-rpath <path-to-elf>
메모:
- 삭제 모두
RPATH
와RUNPATH
R [UN] PATH에 값 추가
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
메모:
<desired-path>
쉼표로 구분 된 디렉토리 목록입니다. 예 :/my/libs:/my/other/libs
- 지정하면
--force-rpath
, setsRPATH
, 그렇지 않으면 설정RUNPATH
이것은 XORIGIN을 $ ORIGIN으로 대체하여 나를 위해 일했습니다.
chrpath -r '\$\ORIGIN/../lib64' httpd
참고 URL : https://stackoverflow.com/questions/13769141/can-i-change-rpath-in-an-already-compiled-binary
'programing tip' 카테고리의 다른 글
리팩토링 목적으로 속성 만있는 클래스를 갖는 것이 괜찮습니까? (0) | 2020.10.09 |
---|---|
X509Store 인증서 관련 문제. FindByThumbprint 찾기 (0) | 2020.10.09 |
OS X 용 lsusb와 동등한 기능이 있습니까? (0) | 2020.10.09 |
moment.js, 요일 번호를 얻는 방법 (0) | 2020.10.09 |
Flutter 앱에 스플래시 화면 추가 (0) | 2020.10.09 |