Glibc 2를 주 C 라이브로리로 설치하는 방법을 설명하겠다. 주 C 라이브러리로 설치 한다는 것은 당신이 컴파일하는 프로그램을 glibc로 링크되게 하는 것이다. 물론, 다른 버전에 링크시킬려면 컴파일 옵션을 추가시켜서 컴파일하면 된다.
만약 당신이 레드헷이나 데비안을 사용하고 적절한 rpm 파일이나 deb 파일을 다운했었다면, 레드헷이나 데비안의 설치 안내를 읽어 보아라. 그러면, 여기있는 내용을 읽지 않아도 된다.
여기에서는 소스로부터 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가 추가된 라이브러리 디렉토리를
찾을 수 있다.
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
소스로부터 설치했든, 바이너리 파일로 설치했든 glibc 2라이브러리 설치 준비하기 위해선 어떤 파일을 옮길 필요가 있다. 이유는 앞으로 컴파일 할 새로운 프로그램을 glibc에 링크시키고, 정적으로 링크되지 않는 구 프로그램은 여전히 libc 5에 의존 하게 하기위해서이다. 고로 구 버전에 덮어 쓰지 않아야한다.
mkdir -p /usr/i486-linuxlibc5/lib
mv /usr/include /usr/i486-linuxlibc5/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에 옮기길 원할 것이다.
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를 사용하기때문이고 이것들은 루트 디렉토리에 있어야만 한다.
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
ldconfig -v
미리 컴파일된 바이너리로부터 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나 다른 버전을 가지고 있다면, 적절한 파일 이름으로 바꾸면 된다.
소스로부터 라이브러리를 설치하려면, 다음을 실행하라:
make install
ldconfig -v
바이너리로부터 설치이든 소스로부터 설치하든 마지막 단계는 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 파일단원에서 찾을 수 있다.
우선 다음과 같은 파일(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!" 가
출력이 된다면, 설치는 성공적으로 끝난 것이다. (축하....^^)