コンパイル用途としてのGlibc2環境の構築

 既存のメインGlibc2ライブラリ以外にバージョンの異なるGlibc2をインストールし、gccによるコンパイルで利用出来るようにします。

 そもそも、既にGlibc2がインストールされているのに、別バージョンのGlibc2をインストールするかと言うと、レスキューディスクを作成する為です。
 FD1枚で作成しようとすると、どうしても容量不足になりがちです。
 そこで、よりサイズの小さいGlibc2が欲しく、バージョンの低いGlibc2のインストールを考えました。
 今回使用するTurbolinux7環境ではglibc-2.2.4がインストールされており、今回新しくインストールするGlibc2バージョンは2.1.3です。インストール先は、/libではなく/usr/i686-linuxglibc2ディレクトリにインストールします。
 インストールするGlibc2ライブラリはコンパイル時に使用するだけで、既存のプログラムから使用される事はありません。

 今回のようにバージョンの落ちるライブラリをインストールする事は普段はないと思いますが、ここで紹介する方法は既存のGlibc2ライブラリより新しいバージョンのものをテスト的にインストールして使ってみる時にも有効です。

今回の参考文献
Glibc 2 HOWTO(http://www.linux.or.jp/JF/JFdocs/Glibc2-HOWTO.html

作業の流れは次のようになります。
 1.ソースコードのダウンロード
 2.glibc-2.1.3の構築
 3.gcc環境の構築(コンパイル時のglibc指定)
 4.テストプログラムのコンパイル

  1. ソースコードのダウンロード
    http://ftp.gnu.org/gnu/glibc/より以下の3つのファイルをダウンロードします。
    ・glibc-2.1.3.tar.gz
    ・glibc-linuxthreads-2.1.3.tar.gz
    ・glibc-crypt-2.1.tar.gz
    ダウンロードファイルは/usr/local/srcに保存します。以降そこにあると仮定して話を進めます。

    ファイルをダウンロードしたらまず解凍します。
    [root src]# tar zxvf glibc-2.1.3.tar.gz       glibc-2.1.3アーカイブの解凍
    [root src]# cd glibc-2.1.3/
    [
    root glibc-2.1.3]# tar zxvf ../glibc-linuxthreads-2.1.3.tar.gz  スレッド用ソースコード解凍
    [root glibc-2.1.3]# tar zxvf ../glibc-crypt-2.1.tar.gz       
    クリプト用ソースコード解凍
     
  2. glibc-2.1.3の構築
     異なるバージョンのGlibc2でも、/lib/ld-linux.so.2や/lib/libc.so.6などは同じ名前になります。
    今回のインストール先は/usr/i686-linuxglibc2を考えているので、名前が同じでも問題ないのですが、ダイナミックローダー(ld-linux.so.2)に限り/libディレクトリにないといけないので、名前の問題を解決する必要があります。
     ファイル名が同一になってしまう問題はshlib-versionsファイルを修正する事で解決します。今回は、ダイナミックローダーのファイル名をld-linux.so.2.1とします。
    [root glibc-2.1.3]# vi shlib-versions
    33行目あたりにある以下の行を見つけ、ダイナミックローダーの名前を変更します。
    i.86-.*-linux.* ld=ld-linux.so.2

    i.86-.*-linux.* ld=ld-linux.so.2.1 
    <--今回はlinux.so.2.1というファイル名を指定します。

     準備が出来たらglibc-2.1.3のコンパイルです。
     スレッド、クリプトオプションは有効にします。(スレッド、クリプトオプションを指定しないとエラーが発生し、コンパイルエラーとなりました。)
    [root glibc-2.1.3]# mkdir compile
    [root glibc-2.1.3]# cd compile
    インストール先は/usr/i686-linuxglibc2とします。
    [
    root compile]# ../configure --prefix=/usr/i686-linuxglibc2 --enable-add-ons=linuxthreads,crypt --enable-shared --disable-profile --disable-debug
    [root compile]# make
    [root compile]# make install
    ダイナミックローダーだけは/libディレクトリに手動でコピーします。
    [
    root compile]# cd /usr/i686-linuxglibc2/lib
    [
    root lib]# cp -a ld-2.1.3.so /lib/.
    [
    root lib]# cp -a ld-linux.so.2.1 /lib/.
    次にインクルードディレクトリに手を加えます。
    [root lib]# cd /usr/i686-linuxglibc2/include
    [
    root include]# ln -s /usr/src/linux/include/linux
    [root include]# ln -s /usr/src/linux/include/asm
    [root include]# ln -s /usr/X11R6/include/X11
     
  3. gcc環境の構築(新しいglibcを使ったコンパイル設定)
    新しくインストールしたGlibcをgccで利用できるように、/usr/lib/gcc-libの設定を行います。
    [root include]# gcc -v
    Reading specs from /usr/lib/gcc-lib/i586-pc-linux/2.95.3/specs  <--i586-pc-linuxや、2.95.3は環境により異なります。
    gcc version 2.95.3 20010315 (release)

    現在の設定をコピーして、今回のglibc用の設定を行います。
    [root include]# cd /usr/lib/gcc-lib/
    [
    root gcc-lib]# cp -a i586-pc-linux i686-linuxglibc2 <--現在の設定をコピー。新しい設定をi686-linuxglibc2としています。
    specsファイルの編集を行います。

    [
    root gcc-lib]# cd /usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/
    [
    root 2.95.3]# vi specs
    ファイルの中に以下のような行があるので、この名前を変更します。
    〜(省略)〜-dynamic-linker /lib/ld-linux.so.2.1 〜(省略)〜  
    <--ファイル名をld-linux.so.2からld-linux.so.2.1に変更します。
    これでOKです。
    後は、環境が正しく構築されている事を確認します。
     
  4. テストプログラムのコンパイル
    今回作成したGlibc2を使う為には、以下のコンパイルオプションが必要です。
    makeする際に、以下のオプションを付け加えるようにします。これらオプションを付けない場合には既存のGlibc2にリンクされます。
    CFLAGS = -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS = -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib

    簡単なテストプログラムと、Makefileの例を記載します。
    main.c
    int main( )
    {
            printf("Hello World!\n");
            exit( 0 );
    }
    Makefile
    CC=gcc
    CFLAGS = -b i686-linuxglibc2 -nostdinc -I/usr/i686-linuxglibc2/include -I/usr/lib/gcc-lib/i686-linuxglibc2/2.95.3/include
    LDFLAGS = -b i686-linuxglibc2 -Wl,-rpath=/usr/i686-linuxglibc2/lib
    TARGET = test.exe
    OBJECTS = main.o

    all: $(TARGET)

    $(TARGET):$(OBJECTS)
            $(CC) $(LDFLAGS) $(OBJECTS) -o $(TARGET)
     
    ↑ここの空白8個はMakefile上ではTABでなければなりません。コピーして使う場合は注意を!

    .c.o:
            $(CC) $(CFLAGS) -c -o $@ $<

    clean:
            rm -f *.o $(TARGET)
    実際にコンパイルします。
    [root test]# make

    lddでリンク情報を調べ以下のようになっていればOKです。
    [root test]# ldd test.exe
            libc.so.6 => /usr/i686-linuxglibc2/lib/libc.so.6 (0x40015000)
            /lib/ld-linux.so.2.1 => /lib/ld-linux.so.2.1 (0x40000000)
    実行します。
    [
    root test]# ./test.exe
    Hello World!
     

以上でglibcの設定はおしまいです。
 

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.