실패 사례입니다.
상용 서비스를 하고 있는 리눅스 서버에 우분투에서 gcc로 빌드한 응용프로그램을 설치해야 합니다. 일반 리눅스 서버라면 필요한 패키를 설치하면 가능하지만 이미 상용 서버로 운영되고 있어 기 설치된 프로그램에 영향을 줄 수 있는 패키지의 추가 설치가 불가능합니다 프로그램 설치를 위해서 여러 방법을 시도했지만 결국 libc 버전 차이로 설치가 불가능 하다는 것으로 결론 지었습니다.
상용 리눅스 서버 전제 조건:
- 기 운영 중이 프로그램으로 인하여 서버에 추가 패키지 설치 불가
- 상당히 오래된 설치 상태에서 추가 패키지 업데이트 없음
잠재적 결론
- shared lib는 일반 서버에서 상용 리눅스 서버로 local lib로 참조가 가능하지만, libc는 불가능
- libc을 업데이트를 위해서는 상용 리눅스 버전의 gcc 컴파일 버전을 업데이트해야 함.
결론을 얻기 위한 과정
1. 설치하고자 하는 프로그램의 lib 종속성을 확인: $ ldd <my program> 명령어를 사용
$ ldd my_program
libasn1.so.8
libcrypt.so.1
libcurl-gnutls.so.4
libffi.so.6
libgmp.so.10
libgnutls.so.30
libgssapi.so.3
.... (생략)
2. 우분투에서 상용서버의 local path로 lib를 copy한다.copy 한다. 상용 서버에서 다른 응용 프로그램에 영향을 주지 않기 위해서 /lib 대신 설치 프로그램의 로컬 폴더에 copy 한다.
$ copy libs.so ~/my_program
3. Shared library의 참조 Path를 수정한다. LD_LIBRARY_PATH를 추가하면 shared lib를 로딩할 때 가장 먼저 로딩한다.
$ export LD_LIBRARY_PATH=LD_LIBRARY_PATH:~/my_program
4. libc 에서 버전 문제가 발생하고 결국 gcc 버전을 낮춰서 다시 빌드해야 한다. libc를 로컬 lib path에 반영하는 경우 Bash shell을 포함하여 C 컴파일된 프로그램이 동작하지 않음
./my_program: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found
(required by ./my_program)
./my_program: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by
./my_program)
/lib64/libc.so.6: version `GLIBC_2.15' not found (required by
libcurl-gnutls.so.4)
apt-get install gcc-4.9
apt-get upgrade libstdc++6
--> gcc tool chain 업그레이드가 필요하다.
* 다른 버전의 Libc 사용
다른 버전의 libc를 사용하는 방법이 소개되어 있어 해당 내용을 링크를 추가합니다. 제가 실제로 Test 하지는 않아서 실제 동작 여부를 확인하지 못 했습니다.
(위키피디아에서 발췌)
glibc는단일 유닉스 규격과POSIX(1c, 1d, 1j)가 요구하는 기능들을 제공하며,ISOC11,ISOC99,버클리 유닉스 (BSD) 인터페이스 등에서 요구하는 몇몇 기능들도 제공한다. 추가적으로 glibc는 또한 GNU 개발에 필요하다고 여겨지거나 유용한 확장들도 제공한다.
Glibc는 수많은 여러 커널들과 여러 하드웨어 아키텍처에서 돌아간다. 그러나 가장 흔한 사용은 x86 하드웨어 상의 리눅스 커널에서의 사용이다. 공식적으로 지원되는 하드웨어는[12] :ARM 아키텍처,알파 프로세서,PA-RISC, IA-64, Motorola m68k, MicroBlaze,MIPS 아키텍처, Nios II,파워PC,s390,SPARC,타일64, 그리고 x86이다. 이것은 Hurd와 리눅스 커널을 지원한다.
이것의 대안으로, 다른 C 표준 라이브러리는 다음과 같다: Bionic libc, dietlibc, EGLIBC, klibc, musl, Newlib, 그리고 uClibc.
댓글