ld-linux.so와 함께 대체 libc 사용하기 더 깨끗한 방법? data시도 할 때 오류가 발생합니다. /lib/ld-linux.so.2chroot에서도 필요하다는 것이

나는 매우 오래된 glibc를 가진 레거시 시스템을 가지고 있으며, 많은 테스트 / 검증 작업을 거치지 않으면 업그레이드 할 수 없습니다.

해당 시스템에서 여러 번 새로운 프로그램 (예 : Java 1.7)을 실행해야했습니다. 필요한 모든 libs를 패키지하고 chroot에서 서비스를 실행하는 chroot 솔루션을 선택했습니다.

chroot는 매우 제한적이며 LD_LIBRARY_PATH의 문제를 해결하려고합니다. 불행히도, libc.so.6: cannot handle TLS data시도 할 때 오류가 발생합니다.

/lib/ld-linux.so.2chroot에서도 필요하다는 것이 밝혀졌습니다 . 이것은 작동합니다 :

LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program

그러나 라이브러리를로드 할 위치를 java검사 /proc/self/cmdline하여 바이너리를 ‘bin / java’로 지정하지 않으면 실패합니다. 또한 Java는 시작하는 동안 자체적으로 실행되어 문제를 더욱 복잡하게 만듭니다.

이 작업을 수행하기위한 마지막 도랑 시도에서 16 진 편집기로 Java 바이너리를 열고 문자열 /lib/ld-linux.so.2/home/chroot/ld.so(으로 심볼릭 링크로 ld-linux.so.2) 바꾸면 효과가 있습니다!

그러나 모든 사람들이 모든 새로운 바이너리의 경로를 중첩 시스템의 절대 경로로 다시 작성하는 것이 큰 문제라는 데 모든 사람들이 동의 할 것이라고 생각합니다.

누구나 사용자 정의 ld-linux.so를 포함 하여 사용자 정의 라이브러리 경로를 사용하는 깔끔한 방법을 알고 있습니까?



답변

로더에 대한 경로는 16 진 편집기에서 발견 한대로 2 진으로 컴파일됩니다. 당신은 실제로 편집 바이너리가 직접 모두 때문에 일 운 얻었다 /lib/ld-linux.so.2/home/chroot/ld.so같은 길이입니다. 해당 문자열의 길이도 이진으로되어 있으며 문자열을 직접 수정하면 미묘한 문제가 발생할 수 있습니다.

경로를 찾게 되면 인터프리터를 업데이트하기 위해 patchelf 와 같은 것을 살펴 봐야 합니다. 이를 통해 통역사를 빠르고 안전하게 영구적으로 변경할 수 있습니다.


답변