6.9. Glibc-2.12.1

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

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

6.9.1. Glibc のインストール

[注記]

注記

LFS が取り扱っていないパッケージの中には GNU libiconv の導入を推奨しているものがあります。 これは文字データのエンコーディングを変換する機能を持ちます。 プロジェクトのホームページ (http://www.gnu.org/software/libiconv/) には以下のような説明があります。 「このライブラリは iconv() 関数を提供します。 この関数を持たないシステムや、Unicode を取り扱うことができないシステムにて、この関数を利用することができます。 」 Glibc が iconv() 関数を用意しており Unicode の変換を実現しているため LFS では libiconv は用いないことにします。

Glibc は自らによってビルドされるものであり、そうして完全な形でインストールされます。 ただしコンパイラのスペックファイルやリンカは、まだ /tools ディレクトリを示したままです。 スペックファイルやリンカを再調整するのは Glibc をインストールした後になります。 これは Glibc の autoconf テストが失敗するためであり、最終的にきれいなビルド結果を得るという目的が達成できないためです。

make install を実行すると test-installation.pl というスクリプトが実行され、新たに作り出された Glibc に対しての簡単な健全性テストが実施されます。 しかしこの時点ではツールチェーンが /tools ディレクトリを指し示しているため、誤った Glibc を対象としてテストが実施されてしまいます。 このスクリプトのテスト対象が、これから作り出す Glibc となるように以下を実行します。

DL=$(readelf -l /bin/sh | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=$DL -o|" \
        scripts/test-installation.pl
unset DL

ldd シェルスクリプトは Bash が定める文法書式により構成されています。 デフォルトで記述されているインタープリタを /bin/bash に変更します。 BLFS ブックの シェル (Shells) で説明しているように、別の /bin/sh がインストールされている場合もあるからです。

sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

Glibc が GCC-4.5.1 に対してビルドできなくなるバグを修正します。

patch -Np1 -i ../glibc-2.12.1-gcc_fix-1.patch

Make の バージョンが 3.81 より最新では Glibc がビルドできないバグを修正します。

patch -Np1 -i ../glibc-2.12.1-makefile_fix-1.patch

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

mkdir -v ../glibc-build
cd ../glibc-build

第5章と同じように x86 マシンにおいては CFLAGS に対してコンパイラフラグの追加が必要です。 ライブラリ構築においても gcc コンパイラに対して最適化フラグをセットすることで、コンパイル時間を向上 (-pipe) させ、パッケージのパフォーマンスも向上 (-O3) させます。

case `uname -m` in
  i?86) echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms ;;
esac

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

../glibc-2.12.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.22.5 --libexecdir=/usr/lib/glibc

configure オプションの意味:

--libexecdir=/usr/lib/glibc

このオプションは pt_chown プログラムのインストール先を、デフォルトの /usr/libexec から /usr/lib/glibc に変更します。

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

make
[重要項目]

重要項目

本節における Glibc のテストスイートは極めて重要なものです。 したがってどのような場合であっても必ず実行してください。

テストを実施する前に、ソースディレクトリからビルドディレクトリにファイルを一つコピーします。 いくつかのテストが失敗してしまうことを回避するためです。 こうしておいてコンパイル結果をテストします。

cp -v ../glibc-2.12.1/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log

posix/annexc のテストはおそらく失敗します。 これは想定されていることであり無視することができます。 そもそも Glibc のテストスイートはホストシステムにある程度依存します。 発生しがちな問題を以下に示します。

  • nptl/tst-clock2, nptl/tst-clock2, tst-attr3 の各テストは失敗することがあります。 失敗の理由は明確ではありません。 ただ処理速度が原因してそれらが発生すると思われます。

  • math テストは、純正 Intel プロセッサや AMD プロセッサが最新のものではない場合に失敗することがあります。

  • LFS パーティションを noatime オプションを用いてマウントしている場合 atime テストが失敗します。 2.4. 「新しいパーティションのマウント」 で説明しているように、LFS のビルド中は noatime オプションを使わないようにしてください。

  • 旧式のハードウェアや性能の低いハードウェア、あるいは負荷の高いシステムにおいてテストを行うと、処理時間をオーバーしてタイムアウトが発生しテストが失敗します。 make check コマンドにて TIMEOUTFACTOR をセットするものに修正すれば、それらのエラーは回避できると報告されています。 (例: TIMEOUTFACTOR=16 make -k check)

支障が出る話ではありませんが Glibc のインストール時には /etc/ld.so.conf ファイルが存在していないとして警告メッセージが出力されます。 これをなくすために以下を実行します。

touch /etc/ld.so.conf

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

make install

システムを各種の言語に対応させるためのロケールは、今までのコマンドではインストールされませんが、テストスイートにおいてロケールは必要ではありません。 ただ将来的にはロケールがないことによって、重要なテストを逃してしまうかもしれません。

各ロケールは localedef プログラムを使ってインストールします。 例えば以下に示す一つめの localedef では、キャラクタセットには依存しないロケール定義 /usr/share/i18n/locales/cs_CZ とキャラクタマップ定義 /usr/share/i18n/charmaps/UTF-8.gz とを結合させて /usr/lib/locale/locale-archive ファイルにその情報を付け加えます。 以下のコマンドは、テストを成功させるために必要となる最低限のロケールをインストールするものです。

mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030

上に加えて、あなたの国、言語、キャラクタセットを定めるためのロケールをインストールしてください。

必要に応じて glibc-2.12.1/localedata/SUPPORTED に示されるすべてのロケールを同時にインストールしてください。 (そこには上のロケールも含め、すべてのロケールが列記されています。) 以下のコマンドによりそれを実現します。 ただしこれには相当な処理時間を要します。

make localedata/install-locales

さらに必要なら glibc-2.12.1/localedata/SUPPORTED ファイルに示されていない特殊なロケールは localedef コマンドを使って生成・インストールを行ってください。

6.9.2. Glibc の設定

/etc/nsswitch.conf ファイルを作成しておく必要があります。 Glibc はこのファイルが無い場合や誤っている場合でもデフォルト設定を用いて動作しますが、ネットワーク環境下ではデフォルト設定であっても正しく動作しません。 またタイムゾーンの設定も必要になります。

以下のコマンドを実行して /etc/nsswitch.conf ファイルを生成します。

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

ローカルなタイムゾーンの設定を行うために、ここでは以下のスクリプトを実行します。

tzselect

地域情報を設定するためにいくつか尋ねられるのでそれに答えます。 このスクリプトはタイムゾーン名を表示します。 (例えば America/Edmonton などです。) /usr/share/zoneinfo ディレクトリにはさらに Canada/EasternEST5EDT のようなタイムゾーンもあります。 これらはこのスクリプトでは認識されませんが、利用することは可能です。

以下のコマンドにより /etc/localtime ファイルを生成します。

cp -v --remove-destination /usr/share/zoneinfo/<xxx> \
    /etc/localtime

<xxx> の部分は設定するタイムゾーンの名前 (例えば Canada/Eastern など) に置き換えてください。

cp オプションの意味:

--remove-destination

このオプションは既に存在するシンボリックリンクを削除します。 ここではシンボリックリンクを再生成するのではなく、ファイルのコピーを行います。 これは別パーティション内に /usr ディレクトリが存在するケースに対応するためです。 シングルユーザーモードでシステムを起動する際にはこのことが必要となります。

6.9.3. ダイナミックローダの設定

デフォルトにおいてダイナミックリンカ (/lib/ld-linux.so.2) は /lib ディレクトリと /usr/lib ディレクトリを検索しにいきます。 これに従って、他のプログラムが実行される際に必要となるダイナミックライブラリがリンクされます。 もし /lib/usr/lib 以外のディレクトリにライブラリファイルがあるなら /etc/ld.so.conf ファイルに記述を追加して、ダイナミックローダがそれらを探し出せるようにしておくことが必要です。 追加のライブラリが配置されるディレクトリとしては /usr/local/lib ディレクトリと /opt/lib ディレクトリという二つがよく利用されます。 ダイナミックローダの検索パスとして、それらのディレクトリを追加します。

以下のコマンドを実行して /etc/ld.so.conf ファイルを新たに生成します。

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

6.9.4. Glibc の構成

インストールプログラム: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump, zic
インストールライブラリ: ld.so, libBrokenLocale.{a,so}, libSegFault.so, libanl.{a,so}, libbsd-compat.a, libc.{a,so}, libc_nonshared.a, libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a, libm.{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so}, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.{a,so}, libpthread_nonshared.a, libresolv.{a,so}, librpcsvc.a, librt.{a,so}, libthread_db.so, libutil.{a,so}
インストールディレクトリ: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/rpcsvc, /usr/include/sys, /usr/lib/gconv, /usr/lib/glibc, /usr/lib/locale, /usr/share/i18n, /usr/share/zoneinfo

概略説明

catchsegv

プログラムがセグメンテーションフォールトにより停止した時に、スタックトレースを生成するために利用します。

gencat

メッセージカタログを生成します。

getconf

ファイルシステムに固有の変数に設定された値を表示します。

getent

管理データベースから設定項目を取得します。

iconv

キャラクターセットを変換します。

iconvconfig

高速ロードができる iconv モジュール設定ファイルを生成します。

ldconfig

プログラム実行時におけるダイナミックリンカのリンクを設定します。

ldd

指定したプログラムまたは共有ライブラリが必要としている共有ライブラリを表示します。

lddlibc4

オブジェクトファイルを使って ldd コマンドを補助します。[訳註:意味不明]

locale

現在のロケールに対する様々な情報を表示します。

localedef

ロケールの設定をコンパイルします。

mtrace

メモリトレースファイル (memory trace file) を読み込んで解釈します。 そして可読可能な書式で出力します。

nscd

一般的なネームサービスへの変更要求のキャッシュを提供するデーモン。

pcprofiledump

PC プロファイリングによって生成される情報をダンプします。

pt_chown

grantpt コマンドのヘルパープログラム。 所有者、グループ、スレーブ擬似端末 (slave pseudo terminal) へのアクセスパーミッションをそれぞれ設定します。

rpcgen

リモートプロシージャコール (Remote Procedure Call; RPC) を実装するための C 言語コードを生成します。

rpcinfo

RPC サーバーに対しての RPC コールを行います。

sln

スタティックなリンクを行う ln プログラム。

sprof

共有オブジェクトのプロファイリングデータを読み込んで表示します。

tzselect

ユーザーに対してシステムの設置地域を問合せ、対応するタイムゾーンの記述を表示します。

xtrace

プログラム内にて現在実行されている関数を表示することで、そのプログラムの実行状況を追跡します。

zdump

タイムゾーンをダンプします。

zic

タイムゾーンコンパイラ。

ld.so

共有ライブラリのためのヘルパープログラム。

libBrokenLocale

Glibc が内部で利用するもので、異常が発生しているプログラムを見つけ出します。 (例えば Motif アプリケーションなど) 詳しくは glibc-2.12.1/locale/broken_cur_max.c に書かれたコメントを参照してください。

libSegFault

セグメンテーションフォールトのシグナルハンドラ。 catchsegv が利用します。

libanl

非同期の名前解決 (asynchronous name lookup) ライブラリ。

libbsd-compat

特定の BSD (Berkeley Software Distribution) プログラムを Linux 上で動作させるために必要な可搬ライブラリを提供します。

libc

主要な C ライブラリ。

libcidn

Glibc が内部的に利用するもので getaddrinfo() 関数によって国際化ドメイン名 (internationalized domain names) を取り扱います。

libcrypt

暗号化ライブラリ。

libdl

ダイナミックリンクのインターフェースライブラリ。

libg

関数を全く含まないダミーのライブラリ。 かつては g++ のランタイムライブラリであったものです。

libieee

このモジュールをリンクすると、数学関数におけるエラー制御方法を IEEE (the Institute of Electrical and Electronic Engineers) が定義するものに従うようになります。 デフォルトは POSIX.1 エラー制御方法です。

libm

数学ライブラリ。

libmcheck

このライブラリにリンクした場合、メモリ割り当てのチェック機能を有効にします。

libmemusage

memusage コマンドが利用するもので、プログラムのメモリ使用に関する情報を収集します。

libnsl

ネットワークサービスライブラリ。

libnss

NSS (Name Service Switch) ライブラリ。 ホスト、ユーザー名、エイリアス、サービス、プロトコルなどの名前解決を行う関数を提供します。

libpcprofile

プロファイリングを行う関数を提供するもので、特定のソース行に費やされる CPU 時間を追跡するために利用します。

libpthread

POSIX スレッドライブラリ。

libresolv

インターネットドメインネームサーバーに対しての、パケットの生成・送信・解析を行う関数を提供します。

librpcsvc

様々な RPC サービスを実現する関数を提供します。

librt

POSIX.1b リアルタイム拡張 (Realtime Extension) にて既定されている、インターフェースをほぼ網羅した関数を提供します。

libthread_db

マルチスレッドプログラム用のデバッガを構築するための有用な関数を提供します。

libutil

数多くの Unix ユーティリティにて利用される 「標準」 関数を提供します。