programing tip

이미 컴파일 된 바이너리에서 'rpath'를 변경할 수 있습니까?

itbloger 2020. 10. 9. 09:02
반응형

이미 컴파일 된 바이너리에서 '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>

메모:

  • 삭제 모두 RPATHRUNPATH

R [UN] PATH에 값 추가

patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>

메모:

  • <desired-path> 쉼표로 구분 된 디렉토리 목록입니다. 예 : /my/libs:/my/other/libs
  • 지정하면 --force-rpath, sets RPATH, 그렇지 않으면 설정RUNPATH

이것은 XORIGIN을 $ ORIGIN으로 대체하여 나를 위해 일했습니다.

chrpath -r '\$\ORIGIN/../lib64' httpd

참고 URL : https://stackoverflow.com/questions/13769141/can-i-change-rpath-in-an-already-compiled-binary

반응형