Linux에서 루트가 아닌 별도의 (최신) glibc/gcc/... 스택을 유지하는 방법

Linux에서 루트가 아닌 별도의 (최신) glibc/gcc/... 스택을 유지하는 방법

우리의 컴퓨팅 클러스터는 오래된 커널(2.6.18)과 물론 오래된 라이브러리 및 바이너리를 포함하는 아주 오래된 버전의 CentOS를 실행합니다. 전체를 업데이트하려면 모든 노드에서 많은 작업이 필요하므로 이는 선택 사항이 아닙니다.

C++11gcc최신 버전(및/또는)이 필요한 프로그램을 컴파일하고 사용하려고 합니다 clang. 나는 시스템을 전혀 엉망으로 만들고 싶지 않기 때문에 일부 로컬 디렉터리 트리에서 루트가 아닌 사용자로 이 작업을 수행하고 싶습니다.

문제는 이 작업을 수행하려면 이미 시스템에 있는 것보다 더 새로운 것이 필요하다는 것입니다 gcc. 따라서 언급한 것처럼 별도의 업데이트 버전 트리에서 로컬로 별도의 업데이트 버전을 유지 glibc해야 합니다 .glibclib/여기.

내가 잃어버린 것은 기본 라이브러리 경로를 모든 필수 바이너리로 "하드 코딩"하는 방법 입니다 gcc. g++LD_LIBRARY_PATH를 내 로컬 트리로 설정하면 모든 시스템 바이너리가 내 새 / 아직 컴파일된 파일을 사용하려고 하기 때문에 lib/더 이상 작동하지 않습니다( ).ELF file OS ABI invalidlibm.solibc.so

요약하자면, 루트가 되는 것을 방해하지 않고 이전 시스템과 병렬로 새로운 로컬 개발 스택(포함 등)을 유지하는 올바른 방법은 무엇입니까 glibc?gcc

부가적인 질문으로, 분리된 glibc.나 경우 시스템 바이너리(예: )를 실행하려고 하면 ls위의 오류가 발생합니다. 어떻게요? 제가 뭔가 잘못하고 있는 건가요, 아니면 예상되는 동작인가요?

답변1

기본적으로 세 가지 옵션이 있습니다.

  1. LD_LIBRARY_PATH적절한 설정을 수행한 다음 필요한 라이브러리를 실행 하는 래퍼를 라이브러리 주위에 사용합니다 . 다음과 같습니다.

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. -rpath( ) 연결을 사용하여 -Wl,rpath동적 링커의 검색 경로를 바이너리에 추가합니다(참조:그래서 대답은- 포장지에 대해서도 언급되어 있습니다.)

  3. 이 글을 읽는 것이 즐겁지 않을 것입니다: 업데이트당신의클러스터(“귀하의”에 중점을 둡니다). 조만간 완료될 것이므로 오늘은 어떻습니까?“옵션이 아닙니다”대부분의 경우 약간 강합니다. 다른 사용자도 같은 문제가 발생할 수 있습니다.

문제의 이전 바이너리의 경우 바이너리에는 선호하는 동적 링커가 내장되어 있습니다. 그리고 이전 동적 링커는 새 ABI를 이해하지 못합니다. 다음과 같이 바이너리를 호출해 보세요 path/to/your/ld-linux-<arch>.so binary.

GCC 빌드: 언제든지 GCC 빌드 환경에서 내보내기를 시도할 수 있지만 CFLAGS전파될 것이라고 확신합니다. 다양한 배포판에 대한 빌드 스크립트는 몇 가지 단서를 제공할 수 있습니다(예: openSUSE의 경우 1880행 참조)..spec 파일).

관련 정보