[linux] 단일 호스트의 여러 glibc 라이브러리

단일 호스트의 여러 glibc 라이브러리

내 Linux (SLES-8) 서버에는 현재 glibc-2.2.5-235가 있지만이 버전에서 작동하지 않으며 glibc-2.3.3이 필요한 프로그램이 있습니다.

동일한 호스트에 여러 개의 glibcs를 설치할 수 있습니까?

이것은 이전 glibc에서 프로그램을 실행할 때 발생하는 오류입니다.

./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./myapp)
./myapp: /lib/i686/libpthread.so.0: version `GLIBC_2.3.2' not found (required by ./myapp)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libxerces-c.so.27)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)
./myapp: /lib/i686/libc.so.6: version `GLIBC_2.3' not found (required by ./libstdc++.so.6)

그래서 newglibc라는 새 디렉토리를 만들고 다음 파일을 복사했습니다.

libpthread.so.0
libm.so.6
libc.so.6
ld-2.3.3.so
ld-linux.so.2 -> ld-2.3.3.so

export LD_LIBRARY_PATH=newglibc:$LD_LIBRARY_PATH

그러나 오류가 발생합니다.

./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libpthread.so.0)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by libstdc++.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libm.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_2.3' not found (required by ./newglibc/libc.so.6)
./myapp: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by ./newglibc/libc.so.6)

그래서 그들은 여전히 ​​/ lib에 연결되어 있고 내가 놓은 곳에서 픽업하지 않는 것 같습니다.

감사



답변

동일한 시스템에서 여러 버전의 glibc를 사용할 수 있습니다 (매일 그렇게합니다).

그러나 glibc는 모두 일치해야하는 많은 조각 (200 개 이상의 공유 라이브러리)으로 구성되어 있습니다. 조각 중 하나는 ld-linux.so.2이며 libc.so.6와 일치 해야합니다. 그렇지 않으면보고있는 오류가 표시됩니다.

ld-linux.so.2의 절대 경로는 링크 타임에 실행 파일에 하드 코딩되어 있으며 링크가 완료된 후에는 쉽게 변경할 수 없습니다.

새로운 glibc와 호환되는 실행 파일을 빌드하려면 다음과 같이하십시오 :

g++ main.o -o myapp ... \
   -Wl,--rpath=/path/to/newglibc \
   -Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2

-rpath링커 옵션에서 라이브러리 런타임 로더 검색 할 것입니다 /path/to/newglibc(당신은 설정할 필요가 없습니다 것입니다, 그래서 LD_LIBRARY_PATH그것을 실행하기 전에)를, 그리고 -dynamic-linker해결하려면 옵션 것이다 “빵”경로 ld-linux.so.2응용 프로그램에.

myapp응용 프로그램을 다시 연결할 수없는 경우 (예 : 타사 바이너리이므로) 모두 손실되지는 않지만 까다로워집니다. 한 가지 해결책은 적절한 chroot환경 을 설정하는 것입니다. 또 다른 가능성은 rtldi이진 편집기 를 사용 하는 것 입니다.


답변

이 질문은 오래되었고 다른 답변은 오래되었습니다. “고용 된 러시아어”의 대답은 매우 유익하고 유익하지만 소스 코드가있는 경우에만 작동합니다. 그렇지 않으면 대안이 매우 까다 롭습니다. 다행히 오늘날 우리는 patchelf를 사용하여 (그의 답글 중 하나에서 언급 한 것처럼)이 문제에 대한 간단한 해결책을 가지고 있습니다 . 당신이해야 할 일은 :

$ ./patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 --set-rpath /path/to/newglibc/ myapp

그리고 나서 파일을 실행할 수 있습니다.

$ ./myapp

chroot고맙게도 바이너리를 수동으로 편집 할 필요가 없습니다 . 그러나 바이너리 파일을 수정하기 때문에 수행중인 작업이 확실하지 않은 경우 패치하기 전에 바이너리를 백업해야합니다. 패치 한 후에는 기존 경로를 인터프리터 / rpath로 복원 할 수 없습니다. 작동하지 않는 경우 실제로 작동 할 경로를 찾을 때까지 계속 패치해야합니다. 음, 시행 착오 과정 일 필요는 없습니다. 예를 들어, OP의 예에서 그는 필요 GLIBC_2.3하므로 다음을 사용하여 해당 버전을 제공하는 lib를 쉽게 찾을 수 있습니다 strings.

$ strings /lib/i686/libc.so.6 | grep GLIBC_2.3
$ strings /path/to/newglib/libc.so.6 | grep GLIBC_2.3

이론적으로 첫 번째 grep은 시스템 libc에 원하는 버전이 없기 때문에 비어있을 것이고, 두 번째 grep은 버전 myapp이 사용 중이므로 GLIBC_2.3을 출력해야 하므로 patchelf해당 경로를 사용하여 바이너리를 사용할 수 있습니다 .

리눅스에서 바이너리를 실행하려고 할 때 바이너리는 링커를로드하려고 시도한 다음 라이브러리를로드하려고하며 경로 및 / 또는 올바른 위치에 있어야합니다. 링커에 문제가 있고 바이너리가 찾는 경로를 찾으려면 다음 명령을 사용하십시오.

$ readelf -l myapp | grep interpreter
  [Requesting program interpreter: /lib/ld-linux.so.2]                                                                                                                                                                                   

libs에 문제가있는 경우 사용중인 lib를 제공하는 명령은 다음과 같습니다.

$ readelf -d myapp | grep Shared
$ ldd myapp 

바이너리에 필요한 라이브러리가 나열되지만 OP의 경우와 같이 이미 오류가 발생하기 때문에 문제가있는 라이브러리를 이미 알고있을 것입니다.

“patchelf”는이 두 가지 문제와 관련된 프로그램을 실행하려고 할 때 발생할 수있는 여러 가지 문제에 적용됩니다. 예를 들어, 당신이 얻는다면 : here 설명하는 것처럼 ELF file OS ABI invalid새 로더 ( --set-interpreter명령 의 일부)를 설정하여 수정 될 수 있습니다 . 또 다른 예는 여기에 예시 된 것처럼 파일이 있고 실행 가능한 파일을 실행할 때 발생하는 문제입니다 . 이 특정 경우 OP에는 로더에 대한 링크가 누락되었지만 루트 액세스 권한이 없으며 링크를 만들 수 없습니다. 새로운 통역사를 설정하면 문제가 해결됩니다.No such file or directory

통찰력과 해결책에 대해 러시아어와 Michael Pankov를 고용해 주셔서 감사합니다!


답변

LD_PRELOAD를 사용하십시오 : 라이브러리를 man lib 디렉토리 외부에 놓고 다음을 실행하십시오.

LD_PRELOAD='mylibc.so anotherlib.so' program

참조 : Wikipedia article


답변

우선, 동적으로 링크 된 각 프로그램의 가장 중요한 종속성은 링커입니다. 따라서 라이브러리는 링커 버전과 일치해야합니다.

간단한 exaple을 보자 : 나는 어떤 프로그램을 실행하는 새로운 우분투 시스템을 가지고있다 (내 경우에는 D 컴파일러-ldc2). 이전 CentOS에서 실행하고 싶지만 이전 glibc 라이브러리로 인해 불가능합니다. 알았어

ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)
ldc2-1.5.0-linux-x86_64/bin/ldc2: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ldc2-1.5.0-linux-x86_64/bin/ldc2)

우분투에서 센토로 모든 의존성을 복사해야합니다. 올바른 방법은 다음과 같습니다.

먼저 모든 의존성을 확인하자 :

ldd ldc2-1.5.0-linux-x86_64/bin/ldc2
    linux-vdso.so.1 =>  (0x00007ffebad3f000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f965f597000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f965f378000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f965f15b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f965ef57000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f965ec01000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f965e9ea000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f965e60a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f965f79f000)

linux-vdso.so.1은 실제 라이브러리가 아니므로 신경 쓸 필요가 없습니다.

/lib64/ld-linux-x86-64.so.2는 리눅스가 실행 파일을 모든 동적 라이브러리와 연결하는 데 사용되는 링커입니다.

나머지 파일은 실제 라이브러리이며 링커와 함께 모두 centos 어딘가에 복사해야합니다.

모든 라이브러리와 링커가 “/ mylibs”디렉토리에 있다고 가정합니다.

ld-linux-x86-64.so.2는 이미 말했듯이 링커입니다. 동적 라이브러리는 아니지만 정적 실행 파일입니다. 당신은 그것을 실행할 수 있으며 –library-path와 같은 매개 변수가 있음을 알 수 있습니다 (돌아가겠습니다).

리눅스에서 동적으로 링크 된 프로그램은 이름만으로 점심을 먹을 수 있습니다.

/bin/ldc2

Linux는 이러한 프로그램을 RAM에로드하고 어떤 링커가 설정되어 있는지 확인합니다. 일반적으로 64 비트 시스템에서는 /lib64/ld-linux-x86-64.so.2입니다 (파일 시스템에서는 실제 실행 파일에 대한 심볼릭 링크 임). 그런 다음 리눅스는 링커를 실행하고 동적 라이브러리를로드합니다.

이것을 조금 변경하고 그러한 트릭을 수행 할 수도 있습니다.

/mylibs/ld-linux-x86-64.so.2 /bin/ldc2

리눅스가 특정 링커를 사용하도록하는 방법입니다.

이제 앞서 언급 한 매개 변수 –library-path로 돌아갈 수 있습니다.

/mylibs/ld-linux-x86-64.so.2 --library-path /mylibs /bin/ldc2

ldc2를 실행하고 / mylibs에서 동적 라이브러리를로드합니다.

선택한 (시스템 기본값 아님) 라이브러리를 사용하여 실행 파일을 호출하는 방법입니다.


답변

설정 1 : 전용 GCC없이 자신의 glibc를 컴파일하여 사용하십시오

이 설정은 전체 GCC 툴체인을 다시 컴파일하지 않고 glibc로 빠르게 작동 할 수 있습니다.

그것뿐만 호스트 C 런타임 객체는 사용하지만 이는 신뢰성없는 crt1.o, crti.o그리고 crtn.oglibc에 의해 제공. : 이것은에서 언급 https://sourceware.org/glibc/wiki/Testing/Builds?action=recall&rev=21#Compile_against_glibc_in_an_installed_location 일이 멋진 추락하면 나는 놀라지 않을 것이다, 그래서 그 객체가, glibc는가에 의존 초기 설정을 놀랍도록 미묘한 방법.

보다 안정적인 설정은 아래의 설정 2를 참조하십시오.

glibc를 빌드하고 로컬로 설치하십시오.

export glibc_install="$(pwd)/glibc/build/install"

git clone git://sourceware.org/git/glibc.git
cd glibc
git checkout glibc-2.28
mkdir build
cd build
../configure --prefix "$glibc_install"
make -j `nproc`
make install -j `nproc`

설정 1 : 빌드 확인

test_glibc.c

#define _GNU_SOURCE
#include <assert.h>
#include <gnu/libc-version.h>
#include <stdatomic.h>
#include <stdio.h>
#include <threads.h>

atomic_int acnt;
int cnt;

int f(void* thr_data) {
    for(int n = 0; n < 1000; ++n) {
        ++cnt;
        ++acnt;
    }
    return 0;
}

int main(int argc, char **argv) {
    /* Basic library version check. */
    printf("gnu_get_libc_version() = %s\n", gnu_get_libc_version());

    /* Exercise thrd_create from -pthread,
     * which is not present in glibc 2.27 in Ubuntu 18.04.
     * /programming/56810/how-do-i-start-threads-in-plain-c/52453291#52453291 */
    thrd_t thr[10];
    for(int n = 0; n < 10; ++n)
        thrd_create(&thr[n], f, NULL);
    for(int n = 0; n < 10; ++n)
        thrd_join(thr[n], NULL);
    printf("The atomic counter is %u\n", acnt);
    printf("The non-atomic counter is %u\n", cnt);
}

다음과 test_glibc.sh같이 컴파일하고 실행하십시오 .

#!/usr/bin/env bash
set -eux
gcc \
  -L "${glibc_install}/lib" \
  -I "${glibc_install}/include" \
  -Wl,--rpath="${glibc_install}/lib" \
  -Wl,--dynamic-linker="${glibc_install}/lib/ld-linux-x86-64.so.2" \
  -std=c11 \
  -o test_glibc.out \
  -v \
  test_glibc.c \
  -pthread \
;
ldd ./test_glibc.out
./test_glibc.out

프로그램은 다음을 예상합니다.

gnu_get_libc_version() = 2.28
The atomic counter is 10000
The non-atomic counter is 8674

명령에서 적응 https://sourceware.org/glibc/wiki/Testing/Builds?action=recall&rev=21#Compile_against_glibc_in_an_installed_location 하지만 --sysroot그것은 실패했다 :

cannot find /home/ciro/glibc/build/install/lib/libc.so.6 inside /home/ciro/glibc/build/install

그래서 제거했습니다.

ldd출력 ldd은 방금 빌드 한 및 라이브러리가 실제로 예상대로 사용되고 있음을 확인합니다 .

+ ldd test_glibc.out
        linux-vdso.so.1 (0x00007ffe4bfd3000)
        libpthread.so.0 => /home/ciro/glibc/build/install/lib/libpthread.so.0 (0x00007fc12ed92000)
        libc.so.6 => /home/ciro/glibc/build/install/lib/libc.so.6 (0x00007fc12e9dc000)
        /home/ciro/glibc/build/install/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fc12f1b3000)

gcc이전에 언급,하지만 난 그것을 해결할 방법을 알고하지 않는 나쁜 나의 호스트 런타임 개체가 사용 된 것을 컴파일 디버그 출력 쇼, 예를 들어, 그것은 포함 :

COLLECT_GCC_OPTIONS=/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o

설정 1 : glibc 수정

이제 glibc를 다음과 같이 수정하자 :

diff --git a/nptl/thrd_create.c b/nptl/thrd_create.c
index 113ba0d93e..b00f088abb 100644
--- a/nptl/thrd_create.c
+++ b/nptl/thrd_create.c
@@ -16,11 +16,14 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */

+#include <stdio.h>
+
 #include "thrd_priv.h"

 int
 thrd_create (thrd_t *thr, thrd_start_t func, void *arg)
 {
+  puts("hacked");
   _Static_assert (sizeof (thr) == sizeof (pthread_t),
                   "sizeof (thr) != sizeof (pthread_t)");

그런 다음 glibc를 다시 컴파일하고 다시 설치하고 프로그램을 다시 컴파일하고 다시 실행하십시오.

cd glibc/build
make -j `nproc`
make -j `nproc` install
./test_glibc.sh

hacked예상대로 몇 번 인쇄 된 것을 볼 수 있습니다.

이것은 우리가 실제로 컴파일 한 glibc를 호스트가 아닌 glibc를 사용했음을 확인합니다.

우분투 18.04에서 테스트되었습니다.

설정 2 : crosstool-NG 초기 설정

이 설정 1의 대안이며, 그것은 내가 지금까지 달성 한 가장 올바른 설정입니다 : 모든 것을 내가 C 런타임과 같은 개체를 포함하여 관찰 할 수있는만큼 지금까지 올바른지 crt1.o, crti.o그리고 crtn.o.

이 설정에서는 원하는 glibc를 사용하는 완전한 전용 GCC 툴체인을 컴파일합니다.

이 방법의 유일한 단점은 빌드 시간이 더 오래 걸린다는 것입니다. 그러나 나는 더 적은 것을 가진 생산 체제의 위험을 감수하지 않을 것입니다.

crosstool-NG 는 GCC, glibc 및 binutils를 포함하여 소스의 모든 것을 다운로드하고 컴파일하는 스크립트 세트입니다.

예. GCC 빌드 시스템이 너무 나빠서 별도의 프로젝트가 필요합니다.

crosstool-NG는 여분의 -Wl플래그 없이 실행 파일을 빌드하는 것을 지원하지 않기 때문에 완벽 하지 않습니다 . GCC 자체를 빌드 한 이후로 이상하게 느껴집니다. 그러나 모든 것이 작동하는 것처럼 보이므로 이는 불편한 일입니다.

crosstool-NG를 가져 와서 구성하고 빌드하십시오.

git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng
git checkout a6580b8e8b55345a5a342b5bd96e42c83e640ac5
export CT_PREFIX="$(pwd)/.build/install"
export PATH="/usr/lib/ccache:${PATH}"
./bootstrap
./configure --enable-local
make -j `nproc`
./ct-ng x86_64-unknown-linux-gnu
./ct-ng menuconfig
env -u LD_LIBRARY_PATH time ./ct-ng build CT_JOBS=`nproc`

빌드에는 약 30 분에서 2 시간이 걸립니다.

내가 볼 수있는 유일한 필수 구성 옵션은 올바른 커널 헤더를 사용하기 위해 호스트 커널 버전과 일치시키는 것입니다. 다음을 사용하여 호스트 커널 버전을 찾으십시오.

uname -a

그것은 나를 보여줍니다 :

4.15.0-34-generic

그래서 menuconfig나는 :

  • Operating System
    • Version of linux

그래서 나는 선택합니다 :

4.14.71

첫 번째 동일하거나 이전 버전입니다. 커널은 이전 버전과 호환되므로 이전 버전이어야합니다.

설정 2 : 옵션 구성

.config우리는 생성하는 것이 ./ct-ng x86_64-unknown-linux-gnu있다 :

CT_GLIBC_V_2_27=y

이를 변경하려면 다음을 menuconfig수행하십시오.

  • C-library
  • Version of glibc

를 저장하고 .config빌드를 계속하십시오.

또는 최신 git의 glibc를 사용하기 위해 자신의 glibc 소스를 사용하려면 다음 과 같이 진행 하십시오 .

  • Paths and misc options
    • Try features marked as EXPERIMENTAL: true로 설정
  • C-library
    • Source of glibc
      • Custom location: 예라고
      • Custom location
        • Custom source location: glibc 소스를 포함하는 디렉토리를 가리 킵니다.

glibc는 다음과 같이 복제되었습니다.

git clone git://sourceware.org/git/glibc.git
cd glibc
git checkout glibc-2.28

설정 2 : 테스트

원하는 툴체인을 구축했으면 다음을 사용하여 테스트하십시오.

#!/usr/bin/env bash
set -eux
install_dir="${CT_PREFIX}/x86_64-unknown-linux-gnu"
PATH="${PATH}:${install_dir}/bin" \
  x86_64-unknown-linux-gnu-gcc \
  -Wl,--dynamic-linker="${install_dir}/x86_64-unknown-linux-gnu/sysroot/lib/ld-linux-x86-64.so.2" \
  -Wl,--rpath="${install_dir}/x86_64-unknown-linux-gnu/sysroot/lib" \
  -v \
  -o test_glibc.out \
  test_glibc.c \
  -pthread \
;
ldd test_glibc.out
./test_glibc.out

올바른 런타임 객체가 사용되었다는 점을 제외하고는 모든 것이 설치 1에서와 같이 작동하는 것 같습니다.

COLLECT_GCC_OPTIONS=/home/ciro/crosstool-ng/.build/install/x86_64-unknown-linux-gnu/bin/../x86_64-unknown-linux-gnu/sysroot/usr/lib/../lib64/crt1.o

설정 2 : 효율적인 glibc 재 컴파일 시도 실패

아래 설명과 같이 crosstool-NG에서는 불가능한 것 같습니다.

방금 재건한다면;

env -u LD_LIBRARY_PATH time ./ct-ng build CT_JOBS=`nproc`

그런 다음 사용자 정의 glibc 소스 위치에 대한 변경 사항이 고려되지만 처음부터 모든 것을 빌드하므로 반복 개발에 사용할 수 없습니다.

우리가 할 경우 :

./ct-ng list-steps

빌드 단계에 대한 훌륭한 개요를 제공합니다.

Available build steps, in order:
  - companion_tools_for_build
  - companion_libs_for_build
  - binutils_for_build
  - companion_tools_for_host
  - companion_libs_for_host
  - binutils_for_host
  - cc_core_pass_1
  - kernel_headers
  - libc_start_files
  - cc_core_pass_2
  - libc
  - cc_for_build
  - cc_for_host
  - libc_post_cc
  - companion_libs_for_target
  - binutils_for_target
  - debug
  - test_suite
  - finish
Use "<step>" as action to execute only that step.
Use "+<step>" as action to execute up to that step.
Use "<step>+" as action to execute from that step onward.

따라서 우리는 glibc 단계가 여러 GCC 단계와 얽혀 있으며, 가장 주목할만한 것은 libc_start_files이전 단계이며 cc_core_pass_2, 이는 아마도 가장 비싼 단계 일 것입니다 cc_core_pass_1.

한 단계 만 만들려면 먼저 .config초기 빌드에 대해 “중간 단계 저장”옵션을 설정해야합니다 .

  • Paths and misc options
    • Debug crosstool-NG
      • Save intermediate steps

그리고 당신은 시도 할 수 있습니다 :

env -u LD_LIBRARY_PATH time ./ct-ng libc+ -j`nproc`

그러나 불행히도 https://github.com/crosstool-ng/crosstool-ng/issues/1033#issuecomment-424877536에+ 언급 된대로 필요합니다.

그러나 중간 단계에서 다시 시작하면 설치 디렉토리가 해당 단계 동안의 상태로 재설정됩니다. 즉, libc를 다시 빌드 할 수 있지만이 libc로 빌드 된 최종 컴파일러는 없습니다 (따라서 libstdc ++와 같은 컴파일러 라이브러리도 없음).

기본적으로 여전히 재 구축이 너무 느려 개발에 적합하지 않으며 crosstool-NG를 패치하지 않고 이것을 극복하는 방법을 알지 못합니다.

또한 libc단계 부터 시작하여에서 소스를 다시 복사하지 않아이 Custom source location방법을 사용할 수 없게되었습니다.

보너스 : stdlibc ++

C ++ 표준 라이브러리에 관심이 있다면 보너스 : GCC libstdc ++ C ++ 표준 라이브러리 소스를 편집하고 다시 작성하는 방법?


답변

Nix http://nixos.org/nix/ 사용을 고려할 수 있습니까 ?

Nix는 다중 사용자 패키지 관리를 지원합니다. 여러 사용자가 공통 Nix 저장소를 안전하게 공유 할 수 있으며 소프트웨어를 설치하기 위해 루트 권한이 필요하지 않으며 다른 버전의 패키지를 설치 및 사용할 수 있습니다.


답변

@msb는 안전한 솔루션을 제공합니다.

내가 한 때이 문제를 충족 import tensorflow as tf에 CONDA 환경에서 CentOS 6.5만 가지고있는 glibc-2.12.

ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by /home/

몇 가지 세부 정보를 제공하고 싶습니다.

먼저 glibc홈 디렉토리에 설치 하십시오.

mkdir ~/glibc-install; cd ~/glibc-install
wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
tar -zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build
cd build
../configure --prefix=/home/myself/opt/glibc-2.17  # <-- where you install new glibc
make -j<number of CPU Cores>  # You can find your <number of CPU Cores> by using **nproc** command
make install

둘째, 동일한 방법으로 patchelf 를 설치 하십시오 .

셋째, 파이썬을 패치하십시오.

[myself@nfkd ~]$ patchelf --set-interpreter /home/myself/opt/glibc-2.17/lib/ld-linux-x86-64.so.2 --set-rpath /home/myself/opt/glibc-2.17/lib/ /home/myself/miniconda3/envs/tensorflow/bin/python

@msb에서 언급했듯이

이제 tensorflow-2.0 alpha에서 사용할 수 있습니다 CentOS 6.5.

심판 : https://serverkurma.com/linux/how-to-update-glibc-newer-version-on-centos-6-x/