ld-linux.so와 함께 대체 libc 사용하기 더 깨끗한 방법?


13

나는 매우 오래된 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를 포함 하여 사용자 정의 라이브러리 경로를 사용하는 깔끔한 방법을 알고 있습니까?

답변:


12

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

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


운이 좋지 않았으므로 바이트를 이동할 필요가 없다는 것을 알았습니다. ;-) 그러나 patchelf는 내가 원하는 것 같습니다. 상대 경로를 사용할 수없는 것 외에도 래퍼가 필요하지 않도록 사용중인 LD_LIBRARY_PATH를 처리 할 수 ​​있습니다. 테스트 할 기회가 생기면 바로 답변을드립니다.
dataless

1
효과가있다! 이것은 새로운 서버 프로그램을이 서버의 이전 라이브러리 프로그램과 혼합 할 수있는 좋은 방법입니다. 향후 독자들에게 명령은였습니다 patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java. 여기서 $ JAVA는 JRE의 디렉토리이며 모든 종속 라이브러리를 모아서 lib/JRE 의 디렉토리에 넣었습니다 .
dataless

@dataless well libstvm ++. so.6 : 공유 객체 파일을 열 수 없기 때문에이 libjvm.so를 해결하려면 LD_LIBRARY_PATH가 여전히 필요합니다. 공유 파일을 열 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다 [root @ 97245bbe7cc1 tensorflow-java] #
Amos

@Amos 오랜 시간이 지났지 만 내 경우에는 기본값이 Java 바이너리에서 왔기 때문에 더 이상 LD_LIBRARY_PATH가 필요하지 않았습니다. 그러나 내가 돌아가서 java가 사용하는 모든 라이브러리를 찾아서 java lib 디렉토리에 복사했다고 말한 부분에 주목하십시오. 나는 ldd $JAVA/bin/javaist를 얻는 데 사용 했습니다. libnss.so와 같이 필요한 동적 libc 파일도 있습니다
dataless
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.