RedHat ES4 서버에 설치된 컴파일러는 gcc 3.4버전이다. 여기에 어플리케이션 설치후 실행하니, 컴파일러가 gcc4.0 이상이 필요하다는 메시지가 나왔다. 문제는, 현재 설치된 서버의 서브스크립션이 등록되어 있지 않고, 서브스크립션도 구매하지 않았기 때문에, up2date를 사용할 수 없다는 점이다. (물론, up2date를 한다고 gcc 4.0이상으로 업그레이드 되리라는 보장도 없다.)
얼마전 libstdc++ 를 잘못 건드렸다가 kernel panic을 경험한터이므로, 가상머신에 RedHat ES4를 설치, 업그레이드를 미리 수행해 보기로 했다.
일단,
[root@localhost ~]# rpm -qa | grep gcc
gcc-g77-3.4.3-9.EL4
libgcc-3.4.3-9.EL4
gcc-c++-3.4.3-9.EL4
gcc-java-3.4.3-9.EL4
gcc-3.4.3-9.EL4
[root@localhost ~]# rpm -qa | grep glib
glibc-2.3.4-2
glib2-2.4.7-1
glib-1.2.10-15
glibc-headers-2.3.4-2
glibc-common-2.3.4-2
dbus-glib-0.22-11.EL
glib2-devel-2.4.7-1
glibc-kernheaders-2.4-9.1.87
glibc-devel-2.3.4-2
로 컴파일러에 필요한 패키지들을 검색.
RedHat ES5 에서 아래 화일 가져옴.
gcc-4.1.2-42.el5.i386.rpm
glibc-2.5-24.i386.rpm
gcc-c++-4.1.2-42.el5.i386.rpm
glibc-2.5-24.i686.rpm
gcc-gfortran-4.1.2-42.el5.i386.rpm
glibc-common-2.5-24.i386.rpm
gcc-gnat-4.1.2-42.el5.i386.rpm
glibc-devel-2.5-24.i386.rpm
gcc-java-4.1.2-42.el5.i386.rpm
glibc-headers-2.5-24.i386.rpm
gcc-objc-4.1.2-42.el5.i386.rpm
glibc-utils-2.5-24.i386.rpm
gcc-objc++-4.1.2-42.el5.i386.rpm
glib-devel-1.2.10-20.el5.i386.rpm
glib-1.2.10-20.el5.i386.rpm
glib-java-0.2.6-3.fc6.i386.rpm
glib2-2.12.3-2.fc6.i386.rpm
glib-java-devel-0.2.6-3.fc6.i386.rpm
glib2-devel-2.12.3-2.fc6.i386.rpm
libgcc-4.1.2-42.el5.i386.rpm
rpm -ivh –force –nodeps *.rpm 을 수행하여 컴파일러 강제 업그레이드하고, gcc 버전 확인
[root@localhost rpm]# gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure –prefix=/usr –mandir=/usr/share/man –infodir=/usr/share/info –enable-shared –enable-threads=posix –enable-checking=release –with-system-zlib –enable-__cxa_atexit –disable-libunwind-exceptions –enable-libgcj-multifile –enable-languages=c,c++,objc,obj-c++,java,fortran,ada –enable-java-awt=gtk –disable-dssi –enable-plugin –with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre –with-cpu=generic –host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
아래와 같은 샘플코드를 컴파일
a.c
#include <stdio.h>
#include <stdlib.h>
main()
{
printf(“gcc is ok!!!\n”);
}
오류가 발생
[root@localhost ~]# gcc a.c
gcc: error trying to exec ‘cc1’: execvp: No such file or directory
[root@localhost ~]# find / -name cc1 -print
/usr/libexec/gcc/i386-redhat-linux/3.4.3/cc1
[root@localhost ~]# rpm -qf /usr/libexec/gcc/i386-redhat-linux/3.4.3/cc1
cpp-3.4.3-9.EL4
위과정을 보면, cc1의 버전과 업그레이드한 gcc의 버전이 맞지 않아서 발생하는 에러라 추정했고,
[root@localhost rpm]# rpm -ivh –force –nodeps cpp-4.1.2-42.el5.i386.rpm
warning: cpp-4.1.2-42.el5.i386.rpm: V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:cpp ########################################### [100%]
이번엔 아래처럼 ld관련 오류 마찬가지로 버전 차이라 생각되어,
[root@localhost ~]# gcc a.c
/usr/bin/ld: unrecognized option ‘–hash-style=gnu’
/usr/bin/ld: use the –help option for usage information
collect2: ld returned 1 exit status
[root@localhost ~]# rpm -qf /usr/bin/ld
binutils-2.15.92.0.2-10.EL4
[root@localhost rpm]# rpm -ivh –force –nodeps binutils-2.17.50.0.6-6.el5.i386.rpm
warning: binutils-2.17.50.0.6-6.el5.i386.rpm: V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:binutils ########################################### [10
이제, 컴파일은 잘되며, 생성된 실행화일 실행해보니,
[root@localhost rpm]# gcc a.c
[root@localhost rpm]# ./a.out
gcc is ok!!!
마지막으로 서버 재부팅해보았다. 걱정하던 커널패닉은 발생하지 않았다.