6.9. Glibc-2.14.1

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

概算ビルド時間: 14.2 SBU
必要ディスク容量: 856 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

また test-installation.pl スクリプトにはバグがあり、make install ではインストールされないライブラリに、テストプログラムをリンクしてしまいます。 そこで以下の sed コマンドを実行してこれを修正します。

sed -i -e 's/"db1"/& \&\& $name ne "nss_test1"/' scripts/test-installation.pl

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

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

クラッシュしコアダンプを吐くバグを修正します。

patch -Np1 -i ../glibc-2.14.1-fixes-1.patch
patch -Np1 -i ../glibc-2.14.1-sort-1.patch

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

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

特定の条件のもとでスタックが不安定になる現象を、以下により解消します。

sed -i '195,213 s/PRIVATE_FUTEX/FUTEX_CLOCK_REALTIME/' \
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timed{rd,wr}lock.S

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.14.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.25 --libexecdir=/usr/lib/glibc

configure オプションの意味:

--libexecdir=/usr/lib/glibc

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

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

make
[重要項目]

重要項目

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

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

cp -v ../glibc-2.14.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)

  • 上記以外に特定のアーキテクチャーにてテストが失敗することが分かっています。 失敗するのは posix/bug-regex32, misc/tst-writev, elf/check-textrel, nptl/tst-getpid2, stdio-common/bug22 です。

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

touch /etc/ld.so.conf

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

make install

デフォルトではインストールされない、NIS と RPC に関するヘッダーファイルをインストールします。 これは BLFS の各種パッケージにて必要となります。

cp -v ../glibc-2.14.1/sunrpc/rpc/*.h /usr/include/rpc
cp -v ../glibc-2.14.1/sunrpc/rpcsvc/*.h /usr/include/rpcsvc
cp -v ../glibc-2.14.1/nis/rpcsvc/*.h /usr/include/rpcsvc

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

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

make localedata/install-locales

さらに必要なら glibc-2.14.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

EOF

必要がある場合には、ダイナミックローダーに対する設定として、他ディレクトリにて指定されるファイルをインクルードするようにもできます。 通常は、そのファイル内の1行に、必要となるライブラリパスを記述します。 このような設定を利用する場合には以下のようなコマンドを実行します。

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir /etc/ld.so.conf.d

6.9.4. Glibc の構成

インストールプログラム: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, pcprofiledump, pt_chown, rpcgen, sln, sotruss, 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/audit, /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 言語コードを生成します。

sln

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

sotruss

指定されたコマンドの共有ライブラリ内のプロシジャーコールをトレースします。

sprof

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

tzselect

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

xtrace

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

zdump

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

zic

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

ld.so

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

libBrokenLocale

Glibc が内部で利用するもので、異常が発生しているプログラムを見つけ出します。(例えば Motif アプリケーションなど) 詳しくは glibc-2.14.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 ユーティリティにて利用される「標準」関数を提供します。