본문 바로가기

카테고리 없음

GLIBC - GNU C Library

$ ./program: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by ./program)

 

리눅스 상에서 프로그램이 GLIBC 버전을 못 찾아서 실행이 안된다.

GLIBC 버전을 찾으려면?


1. libc.so 확인

so 파일은 shared object, 즉 공유 라이브러리 파일이지만 또한 executable 이기도 해서 실행도 된다.

 

$ ldd `which ls` | grep libc | awk '{ print $3 }' | xargs sh -c
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.4) stable release version 2.27.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 7.5.0.
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

 

2. ldd 버전 체크

$ ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1.4) 2.27
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

 

 


 

 

버전은 알았는데, 이렇게 버전이 다른 경우 어떻게 해야 하나?

 

일단 기본적으로 시스템 상의 GLIBC 를 올리는 건 금지다. cp, ls 을 포함한 글자 그대로 모든 명령어가 GLIBC 에 의존하고 있기 때문이다. 한때 올리는 짓을 해 봤는데, 모든 명령어가 깨져서.. 복구가 굉장히 어려웠다 -_-;;

 

그래서.. 첫번째 방법으로는, 별도로 상위 버전의 GLIBC 를 컴파일해주고, 상위 버전의 GLIBC 버전이 필요한 프로그램에게 환경변수로 LD_LIBRARY_PATH 를 상위 버전의 GLIBC 가 포함된 경로를 설정해서 실행시켜주면 된다. 쉘 스크립트나 systemd 스크립트 등에서 LD_LIBRARY_PATH  를 설정해주는 방법이 일반적이다.

 

두번째로는, 그냥 컨테이너 쓰는 것이다. 컨테이너 쓰면 컨테이너 안에 필요한 C 런타임을 포함해서 시스템 라이브러리들이 다 포함되어 있으니 잘 된다. 첫번째 방법과 결과론적으로는 유사하다. 결국 별도의 GLIBC 버전이 필요하다는 것이다. 컨테이너는 애당초 환경이 포함되었으니 신경을 안 써도 되는 것 뿐.