다른 glibc를 사용하여 정적으로 링크된 바이너리 실행

다른 glibc를 사용하여 정적으로 링크된 바이너리 실행

정적으로 연결된 바이너리가 있습니다.도구RHLE4에서 실행하려고합니다. 이 도구는 glibc에 대해 불평합니다. 2.4가 필요하며 시스템 버전은 2.3입니다. 이것이 내뱉는 메시지는 다음과 같습니다.

./wkhtmltoimage-i386: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./wkhtmltoimage-i386)

시스템에서 glibc2.3을 교체하지 않고 glibc2.4를 빌드하고 이 도구에만 사용할 수 있는 방법이 있습니까? glibc2.4를 구축할 때 구성에 어떤 접두사를 사용해야 합니까?

답변1

이 wkhtmltoimage 도구의 소스 코드를 사용할 수 있으므로 다음을 권장합니다. 재컴파일시스템의 기본 glibc를 사용하여 소스에서 컴파일합니다. 이는 아마도 쉬운 작업이 아닌 glibc를 다시 컴파일하는 것보다 더 빠를 것입니다.

정적 링크실행 파일에는 필요한 모든 C 라이브러리 호출에 대한 코드가 이미 포함되어 있으므로 새 glibc를 별도로 컴파일하고 실행 파일을 연결할 수 없습니다. 그러나 glibc를 사용하는 프로그램은 결코 완전히 정적이 아닙니다. 일부 라이브러리 호출("네임 서비스"와 연결된 모든 호출 등 )은 여전히 ​​동적으로 로드된 모듈( 일반적으로 glibc 아래에 있는 파일 ) getuid()을 사용합니다 . 이것이 아마도 프로그램이 실패한 이유일 것입니다. 일부 NSS 모듈을 찾고 있었지만 이러한 .libnss*.so/libglibc2.3

glibc를 다시 컴파일하는 방법을 절대적으로 원한다면 다음이 작동할 수 있습니다.(경고: 테스트되지 않았습니다!):

  1. glibc2.4가 설치되도록 구성비체계적디렉토리(예: )를 만든 /usr/local/glibc2.4다음 컴파일하고 설치합니다.

  2. wkhtmlto*동적 링커 검색 경로( )의 첫 번째 구성 요소로 지정하여 실행합니다 LD_LIBRARY_PATH.

    env LD_LIBRARY_PATH=/usr/local/glibc2.4/lib wkhtmltoimage ...

고쳐 쓰다:알고 보니 그렇게 쉬운 일이 아니었습니다. 시스템에 서로 다른 두 개의 libcs를 두려면 libc가 런타임 링커를 찾고 고정된 위치에 NSS 모듈을 동적으로 로드하기 때문에 단순히 재컴파일/설치하는 것 이상이 필요합니다. 이것RTDI이 프로그램을 사용하면 단일 Linux 시스템에 다양한 버전의 GNU libc를 설치할 수 있습니다. 해당 웹 페이지에 지침이 있습니다(그러나 이는 전문가 수준의 작업이므로 단계별 안내는 아닙니다).

다시 한 번 강조하지만, 재컴파일하는 작업이 훨씬 덜합니다 wkhtmltoimage...

관련 정보