다음 이전 차례

5. Primary C library로 설치하기

Glibc 2를 주 C 라이브로리로 설치하는 방법을 설명하겠다. 주 C 라이브러리로 설치 한다는 것은 당신이 컴파일하는 프로그램을 glibc로 링크되게 하는 것이다. 물론, 다른 버전에 링크시킬려면 컴파일 옵션을 추가시켜서 컴파일하면 된다.

만약 당신이 레드헷이나 데비안을 사용하고 적절한 rpm 파일이나 deb 파일을 다운했었다면, 레드헷이나 데비안의 설치 안내를 읽어 보아라. 그러면, 여기있는 내용을 읽지 않아도 된다.

5.1 소스로부터 라이브러리를 설치하기

여기에서는 소스로부터 glibc 2와 add-ons를 컴파일하는 방법을 설명하려고 한다. 최적화 옵션이나 구성 옵션을 변경하고 싶거나 바이너리에 없는 패키지를 사용하려고 할 때 라이브러리를 컴파일할 필요가 있다.

전제 조건

RAM 64 MB인 i586@133 컴퓨터에서 추가 라이브러리(add-ons)포함한 전체 라이브러리 를 컴파일하는데 소요 시간은 약 3시간이며, i686@2에 컴퓨터의 경우는 약 1시간 30분 정도 걸렸다.

소스를 추출하기

소스 파일을 컴파일하기 위해서는 Archives에서 소스 파일을 추출해야만 한다. 아래와 같이 하면 된다:

 tar xzf glibc-2.0.5.tar.gz
 cd glibc-2.0.5
 cat ../glibc-2.0.5-2.0.5c.diff.gz | gzip -d | patch -p0
 tar xzf ../glibc-linuxthreads-2.0.5.tar.gz
 tar xzf ../glibc-crypt-2.0.5.tar.gz
 tar xzf ../glibc-localedata-2.0.5.tar.gz
 
위의 방법처럼 하면, glibc-2.0.5 디렉토리에 linuxthreads, crypt, localeddata 디렉토리가 생성된다. 이렇게 해야지만 configure가 추가된 라이브러리 디렉토리를 찾을 수 있다.

Configure를 실행하기

glibc-2.0.5 디렉토리에서 "compile"이란 디렉토리를 만들고, cd로 'compile' 디렉토리로 온다. 모든 작업은 이 compile 디렉토리에서 이루어진다.

mkdir compile
cd compile

위의 과정을 마쳤으면, '../configure'을 실행시키면 된다. 추가 패키지를 사용하고 싶으면, 추가 패키지에 대한 옵션(--enable-add-ons <예> --enable-add-ons=linuxthreads,crypt,localedata)을 포함시켜야 한다. 또 설치하고 싶은 디렉토리를 선택해야 한다. 보통 설치 디렉토리로 '--prefix=/usr'을 사용한다. 다음은 configure line의 예이다:

 ../configure --enable-add-ons=linuxthreads,crypt,localedata --prefix=/usr

컴파일하기

컴파일하고 제대로 되었는지 확인하는 절차는 다음과 같이 한다:

 make
 make check
 

5.2 설치하기 위한 준비 작업하기

소스로부터 설치했든, 바이너리 파일로 설치했든 glibc 2라이브러리 설치 준비하기 위해선 어떤 파일을 옮길 필요가 있다. 이유는 앞으로 컴파일 할 새로운 프로그램을 glibc에 링크시키고, 정적으로 링크되지 않는 구 프로그램은 여전히 libc 5에 의존 하게 하기위해서이다. 고로 구 버전에 덮어 쓰지 않아야한다.

  1. 구 파일(libc 5)을 저장할 새로운 디렉토리를 만든다:
     mkdir -p /usr/i486-linuxlibc5/lib
     
    
  2. 구(libc 5용) 헤더 파일을 /usr/include 에서 다른 디렉토리로 옮긴다:
     mv /usr/include /usr/i486-linuxlibc5/include
     
    
  3. 새로운(glibc 2용) include 디렉토리를 만들고, 다른 include에 링크시킨다:
     mkdir /usr/include
    
     ln -s /usr/src/linux/include/linux /usr/include/linux
     ln -s /usr/src/linux/include/asm /usr/include/asm
     ln -s /usr/X11R6/include/X11 /usr/include/X11
     ln -s /usr/lib/g++-include /usr/include/g++
     
    
    링크는 배포판에 따라서 약간 다를수 있다. 적어도 슬렉웨어의 경우 /usr/local/g++-include에 g++ 헤더파일이 있고, 반면에 데비안 패키지 경우 /usr/include/g++에 g++헤더파일이 있고, /usr/lib/g++-include는 /usr/include/g++ 에 링크되어 있다. 후자의 경우, 아마 당신은 원래 g++ include 디렉토리를 /usr/include에 옮기길 원할 것이다.
  4. 다른 헤더 파일을 복원하고 링크한다. 어떤 비표준 라이브러리경우, 예로 ncureses, /usr/include에 헤더파일을 놓거나 /usr/include 밑에 있는 그들의 include 디렉토리에 링크를 한다. 이 파일들이나 링크는 다른 라이브러리를 적절히 사용될수 있게 복원을 해 둘 필요가 있다.
  5. /etc/ld.so.conf파일 맨위에 glibc 2용 라이브러리 디렉토리(예, / usr/i486-linuxlibr/lib)를 추가한다. glibc를 설치할 때 이상한 메세지를 피하기 위해서는 ld.so-1.8.8이상의 버전을 설치되어 있어야 한다.
  6. 구 C 라이브러리를 새로운 디렉토리(/usr/i486-linuxlibc5/lib)로 옮기거나 복사한다.
     mv /usr/lib/libbsd.a /usr/i486-linuxlibc5/lib
     mv /usr/lib/libc.a /usr/i486-linuxlibc5/lib
     mv /usr/lib/libgmon.a /usr/i486-linuxlibc5/lib
     mv /usr/lib/libm.a /usr/i486-linuxlibc5/lib
     mv /usr/lib/libmcheck.a /usr/i486-linuxlibc5/lib
     mv /usr/lib/libc.so /usr/i486-linuxlibc5/lib
     mv /usr/lib/libm.so /usr/i486-linuxlibc5/lib
     cp /lib/libm.so.5.* /usr/i486-linuxlibc5/lib
     cp /lib/libc.so.5.* /usr/i486-linuxlibc5/lib
     
    
    만약 /usr이 /와 다른 파티션에 있다면, libm.so.5와 libc.so.5는 move가 아닌 복사되어야 한다. 이유는 리눅스를 시작하는데 필요한 프로그램이 libm.so.5와 libc.so.5를 사용하기때문이고 이것들은 루트 디렉토리에 있어야만 한다.
  7. /usr/lib/*.o 퍄일을 새로운 디렉토리로 옮긴다.
     mv /usr/lib/crt1.o /usr/i486-linuxlibc5/lib
     mv /usr/lib/crti.o /usr/i486-linuxlibc5/lib
     mv /usr/lib/crtn.o /usr/i486-linuxlibc5/lib
     mv /usr/lib/gcrt1.o /usr/i486-linuxlibc5/lib
     
    
  8. 당신의 라이브러리를 옮겼으면 라이브러리 cache를 업데이트한다.
     ldconfig -v
     
    

5.3 바이너리 패키지로부터 설치하기

미리 컴파일된 바이너리로부터 glibc를 설치하고자 하면, 다음과 같이 한다:

 cd /
 gzip -dc glibc-2.0.bin.i386.tar.gz | tar tvvf -
 gzip -dc glibc-crypt-2.0.bin.i386.tar.gz | tar tvvf -
 ldconfig -v
 
다른 architecture나 다른 버전을 가지고 있다면, 적절한 파일 이름으로 바꾸면 된다.

5.4 소스로부터 설치하기

소스로부터 라이브러리를 설치하려면, 다음을 실행하라:

 make install
 ldconfig -v
 

5.5 gcc specs 을 업데이트하기

바이너리로부터 설치이든 소스로부터 설치하든 마지막 단계는 gcc specs 파일을 업데이트하는 것이다. 그래야만 당신 프로그램이 적절하게 링크될 수 있다. gcc가 사용하는 specs 파일을 알아내기 위해서는 다음과 같이 한다:

 % gcc -v
 reading specs from /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2/specs
 gcc version 2.7.2.2
 

이 경우는 i486-unknown-linux 시스템이고 버전이 2.7.2.2이다. 당신이 해야할 일은 /usr/lib/gcc-lib/<system>을 구 시스템 디렉토리로 복사하는 것이다:

 cd /usr/lib/gcc-lib/
 cp -r i486-unknown-linux i486-linuxlibc5
 

그 다음 다음과 같이 하라.

 cd /usr/lib/gcc-lib/i486-unknown-linux/2.7.2.2
 

이 디렉토리에서 'specs'파일을 편집한다. 즉 specs 파일내에 /lib/ld-linux.so.1을 /lib/ld-linux.so.2로 바꾼다. 또 %{...:-lgmon} 가 들어간 모든 문장을 지워라. 왜냐면 glibc는 profile하기 위해서 gmon 라이브러리를 사용하지 않기 때문이다. 샘플 specs 파일은 샘플 specs 파일단원에서 찾을 수 있다.

5.6 설치된것을 테스트하기

우선 다음과 같은 파일(glibc.c)를 만든다:

 #include <stdio.h>

 main()
 {
     printf("hello world!\n");
 }
 
그리고 컴파일한다.
 % gcc glibc.c -o glibc
 
ldd를 이용하여서 프로그램이 glibc2에 링크되었는지 확인해본다:
 % ldd glibc
 libc.so.6 => /lib/libc.so.6 (0x4000e000)
 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
 
컴파일이 되고, 링크 과정도 정상이며, 실행시 "hello world!" 가 출력이 된다면, 설치는 성공적으로 끝난 것이다. (축하....^^)


다음 이전 차례