5.5. Glibc-2.39

Glibc パッケージは主要な C ライブラリを提供します。 このライブラリは基本的な処理ルーチンを含むもので、メモリ割り当て、ディレクトリ走査、ファイルのオープン、クローズや入出力、文字列操作、パターンマッチング、算術処理、等々があります。

概算ビルド時間: 1.5 SBU
必要ディスク容量: 846 MB

5.5.1. Glibc のインストール

はじめに LSB コンプライアンスに合うように、シンボリックリンクを生成します。 さらに x86_64 向けとして、互換のシンボリックリンクを生成して、ダイナミックライブラリローダーが適切に動作するようにします。

case $(uname -m) in
    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
    ;;
esac
[注記]

注記

上記のコマンドに間違いはありません。 ln コマンドにはいくつか文法の異なるバージョンがあります。 間違いと思われる場合には info coreutils lnln(1) をよく確認してください。

Glibc のプログラムの中で、FHS コンプライアンスに適合しない /var/db ディレクトリを用いているものがあり、そこに実行時データを保存しています。 以下のパッチを適用することで、実行時データの保存ディレクトリを FHS に合致するものとします。

patch -Np1 -i ../glibc-2.39-fhs-1.patch

Glibc のドキュメントでは、専用のビルドディレクトリを作成することが推奨されています。

mkdir -v build
cd       build

ldconfigsln ユーティリティーを /usr/sbin にインストールするようにします。

echo "rootsbindir=/usr/sbin" > configparms

次に Glibc をコンパイルするための準備をします。

../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=4.19               \
      --with-headers=$LFS/usr/include    \
      --disable-nscd                     \
      libc_cv_slibdir=/usr/lib

configure オプションの意味

--host=$LFS_TGT, --build=$(../scripts/config.guess)

このようなオプションを組み合わせることで /tools ディレクトリにあるクロスコンパイラー、クロスリンカーを使って Glibc がクロスコンパイルされるようになります。

--enable-kernel=4.19

Linux カーネル 4.19 以上のサポートを行うよう指示します。 これ以前のカーネルは利用することができません。

--with-headers=$LFS/usr/include

これまでに $LFS/usr/include ディレクトリにインストールしたヘッダーファイルを用いて Glibc をビルドすることを指示します。 こうすればカーネルにどのような機能があるか、どのようにして処理効率化を図れるかなどの情報を Glibc が得られることになります。

libc_cv_slibdir=/usr/lib

この指定は 64 ビットマシンにおいて、ライブラリのインストール先をデフォルトの /lib64 ではなく /usr/lib とします。

--disable-nscd

nscd (name service cache daemon) は使われることがないのでビルドしないようにします。

ビルド中には以下のようなメッセージが出力されるかもしれません。

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

msgfmt プログラムがない場合 (missing) や互換性がない場合 (incompatible) でも特に問題はありません。 msgfmt プログラムは Gettext パッケージが提供するもので、ホストシステムに含まれているかもしれません。

[注記]

注記

本パッケージは並行ビルドを行うとビルドに失敗するとの報告例があります。 もしビルドに失敗した場合は make コマンドに -j1 オプションをつけて再ビルドしてください。

パッケージをコンパイルします。

make

パッケージをインストールします。

[警告]

警告

LFS が適切に設定されていない状態で、推奨する方法とは異なり root によってビルドを行うと、次のコマンドはビルドした Glibc をホストシステムにインストールしてしまいます。 これを行ってしまうと、ほぼ間違いなくホストが利用不能になります。 したがってその環境変数が適切に設定されていること、root ユーザーではないことを確認してから、以下のコマンドを実行してください。

make DESTDIR=$LFS install

make install オプションの意味

DESTDIR=$LFS

make 変数 DESTDIR はほとんどすべてのパッケージにおいて、そのパッケージをインストールするディレクトリを定義するために利用されています。 これが設定されていない場合のデフォルトは、ルートディレクトリ(/)となります。 ここではパッケージのインストール先を $LFS とします。 これは 「Chroot 環境への移行」 に入ってからはルートディレクトリとなります。

ldd スクリプト内にある実行可能なローダーへのパスがハードコーディングされているので、これを修正します。

sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
[注意]

注意

この時点で以下を必ず実施します。 新しいツールチェーンの基本的な機能 (コンパイルやリンク) が正常に処理されるかどうかを確認することです。 健全性のチェック (sanity check) を行うものであり、以下のコマンドを実行します。

echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux

すべてが正常に処理され、エラーが発生しなければ、最終のコマンドの実行結果として以下が出力されるはずです。

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

インタープリター名は 32 ビットマシンの場合 /lib/ld-linux.so.2 となります。

出力結果が上とは異なったり、あるいは何も出力されなかったりした場合は、どこかに不備があります。 どこに問題があるのか調査、再試行を行って解消してください。 解決せずにこの先に進まないでください。

すべてが完了したら、テストファイルを削除します。

rm -v a.out
[注記]

注記

次節にてビルドするパッケージでは、ツールチェーンが正しく構築できたかどうかを再度チェックすることになります。 特に Binutils 2 回めや GCC 2 回めのビルドに失敗したら、それ以前にインストールしてきた Binutils, GCC, Glibc のいずれかにてビルドがうまくできていないことを意味します。

本パッケージの詳細は 「Glibc の構成」を参照してください。