Linux에서 별도의 (최신) glibc / gcc /… 스택을 루트가 아닌 스택으로 유지 관리하는 방법 아주 오래된 CentOS 버전을

우리의 계산 클러스터는 구 커널 (2.6.18)과 구 라이브러리와 바이너리가있는 아주 오래된 CentOS 버전을 실행합니다. 모든 것을 업데이트하려면 모든 노드에서 많은 작업이 필요하기 때문에 이것은 옵션이 아닙니다.

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

문제는 머신에있는 것보다 gcc새로운 것이 필요 glibc하다는 것입니다. 따라서, 나는 별도, 최신 버전을 유지할 필요가 glibc내 로컬에 lib/설명 된대로 아마 트리 여기 .

어디에서 잃어버린하고, 어떻게 모든 일에 내 로컬 libs와의 I “하드 코드”경로 필요한 바이너리, 즉 gcc, g++등? LD_LIBRARY_PATH를 로컬 lib/트리로 설정 하면 모든 시스템 바이너리 가 컴파일되지 않은 ELF file OS ABI invalidlibm.so/ 를 사용하기 때문에 더 이상 작동하지 않습니다 ( ) libc.so.

그래서, 그것을 포장하기 : 새로운 지역 개발 스택 (포함 유지하는 적절한 방법은 무엇입니까 glibc, gcc루트로 장난하지 않고 기존 시스템에 병렬로 등)?

부수적 인 질문으로 : LD_LIBRARY_PATH 설정은 분리에 관해서 SE 전역에 솔루션으로 게시됩니다 glibc. 나를 위해 시스템 바이너리 (예 :)를 실행하려고하면 위의 오류가 발생합니다 ls. 어떻게 오세요? 내가 잘못했거나 의도 한 행동입니까?



답변

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

  1. 라이브러리 주위에 래퍼를 사용하면 LD_LIBRARY_PATH적절 하게 설정 한 다음 원하는 라이브러리를 실행할 수 있습니다.

    #!/bin/sh
    export LD_LIBRARY_PATH="path/goes/here"
    exec "$@"
    
  2. 동적 링커의 검색 경로를 바이너리에 추가 하는 -rpath( -Wl,rpath) 와의 링크 ( SO 답변 참조 -래퍼도 언급).

  3. 이 글을 읽고 싶지 않을 것입니다 : 클러스터를 업데이트 하십시오 ( “your”에 중점을 두십시오). 그것은 하루나 다른 날에 이루어져야 할 것이므로 오늘은 어떻습니까? 대부분의 경우 “옵션이 아님” 은 약간 강력합니다. 다른 사용자들도 아마 같은 문제가있을 것입니다.

문제가있는 오래된 바이너리의 경우 바이너리에는 선호하는 동적 링커가 포함되어 있습니다. 그리고 오래된 동적 링커는 최신 ABI를 이해하지 못합니다. 다음과 같이 바이너리를 호출하십시오 path/to/your/ld-linux-<arch>.so binary.

GCC 구축 : 항상 CFLAGSGCC의 빌드 환경에서 내보내기 를 시도 할 수 있지만 전파 될 것이라고 확신합니다. 다양한 배포판의 빌드 스크립트는 몇 가지 단서를 제공 할 수 있습니다 (예 : openSUSE의 경우 .spec 파일의 1880 행을 둘러보십시오 ).