トップ > 最小システムの構築 > 新システムの作成(前半) >
glibc

  

glibcのビルド

glibcは、GNUプロジェクトによる標準Cライブラリです。 C言語で記述されたソフトウェアの開発・実行に必要とされます

  
ここで行う作業は、標準Cライブラリの参照先を /tools/lib から /lib および /usr/lib に移すための重要な作業です。

glibcの1回目のビルドでは、ライブラリ群は /tools/lib にインストールしました。 glibcは標準Cライブラリであるため、C言語で開発されたソフトウェアの実行ファイルは、実行時にglibcのライブラリを必要とします。 つまり、現時点では、これまでの作業でビルド・インストールした実行ファイルは /tools/lib にあるglibcのライブラリに依存しています。

しかし、/tools は一時的な開発ツールが置かれる場所であり、最終的には削除します。 そうなると、/tools に依存している実行ファイルは動作しなくなります

ここまでの作業でビルド・インストールしたのは一時的な開発ツールですので、/tools以下に置かれています。 つまり、最終的には/toolsごと削除されます。 よって、/toolsの削除によって動作しなくなることを心配する必要はありません。

問題は、これから先の作業でビルド・インストールする新システム用のソフトウェア群です。 新システム用にこれからビルド・インストールしていくソフトウェア群が動作しなくなっては困ります。 新システム用のソフトウェア群が /tools がなくても動作するよう、ここでglibcを本来あるべき位置にビルド・インストールします

ビルド・インストール前リストの生成

最初に、ビルド・インストール前リストを生成します。


/sources/genprevlist.sh > /dev/null 2>&1

 

ソースファイルの展開

ソースファイルを展開します。


cd /sources
tar xvf glibc-2.21.tar.xz
cd glibc-2.21

 

ソースファイルの修正

展開したソースファイルを修正します。


sed -i -e '/ia32/s/^/1:/' ./sysdeps/i386/i686/multiarch/mempcpy_chk.S
sed -i -e '/SSE2/s/^1://' ./sysdeps/i386/i686/multiarch/mempcpy_chk.S

 

ビルド用ディレクトリの準備

ビルド用ディレクトリを準備します。


mkdir -vp ../glibc-build
cd ../glibc-build

 
  
glibcでは、ソースファイルが置かれているディレクトリでのビルドは推奨されていません。 別にビルド用のディレクトリを用意し、そこでビルドを行うことが推奨されています。

configure

configureを実行します。


../glibc-2.21/configure \
  --prefix=/usr \
  --enable-obsolete-rpc \
  --disable-profile > ../../logs/configurelog.glibc 2>&1

 
  
インストール先の基準ディレクトリを --prefix=/usr としています。 これからの作業でビルド・インストールするのは、一時的な開発ツールではなく、新システムで利用されるソフトウェア群であるためです。

configureが終了したら、ログファイルに出力された内容を参照し、正常に終了したことを確認します。


cat ../../logs/configurelog.glibc

 

ビルド

ビルドを実行します。


make

 

ビルドが終了したら、画面に出力された内容を参照し、正常に終了したことを確認します。

テスト

テストを行います。


make -k check 2>&1 | tee ../../logs/checklog.glibc

 

テストが終了したら、ログファイルに出力された内容を参照し、正常に終了したことを確認します。


grep '^FAIL' ../../logs/checklog.glibc

 

上記の結果、何も表示されなければ問題ありません

なお、筆者の環境(仮想マシン)では以下のように4つのエラーが発生します

FAIL: localedata/tst-setlocale3
FAIL: nptl/tst-cleanupx4
FAIL: posix/tst-getaddrinfo4
FAIL: posix/tst-getaddrinfo5

localedata/tst-setlocale3 は、仮想マシンで作業をしている場合に発生することがあります。 筆者の環境では、ホストOSごと再起動してテストをやり直したところこのエラーは発生しませんでした。 よって、localedata/tst-setlocale3 に関しては、無視して作業を続行しても問題ありません

nptl/tst-cleanupx4 は、多くの環境で失敗することで有名ですので気にする必要はありません

posix/tst-getaddrinfo4 と posix/tst-getaddrinfo5 についても、ネットワークに接続されていない現状では失敗するので気にすることはありません

  
上記の4件以外のエラーが発生する場合は、ネット等で情報を検索して原因を探してください。 原因が不明な場合は対策のしようがありませんので、無視して作業を続行してください。

インストール

まず、/etc/ld.so.conf を作成します。 このファイルが存在しないとインストールが警告を表示するためです。


touch /etc/ld.so.conf

 

続いて、インストールを行います。


make install

 

インストールが終了したら、画面に出力された内容を参照し、正常に終了したことを確認します。

インストール後の追加作業

インストール後の追加作業を行います。 nscd関係の設定ファイルおよびディレクトリを追加インストールします。


cp -va ../glibc-2.21/nscd/nscd.conf /etc/
mkdir -vp /var/cache/nscd

 

nscdは、/etc/hosts /etc/passwd /etc/group へのアクセスのキャシュを提供するサービスです

名前解決の順序を決定するための設定ファイルを作成します。


cat > /etc/nsswitch.conf << "EOF"
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
EOF

 

かなり前のバージョンでは /etc/host.conf が名前解決の優先順位の指定に使われていました。 しかし、現在では /etc/nsswitch.conf が使われます

ロケール情報をインストールします。


mkdir -vp /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_GB -f UTF-8 en_GB.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 it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030

 

日本語用のロケールとして、日本語EUC と 日本語UTF-8 を追加しています

ロケール情報に続き、タイムゾーン情報を追加します。


tar xvf ../tzdata2015e.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/posix
mkdir -pv $ZONEINFO/right
for tz in etcetera southamerica northamerica europe africa antarctica asia australasia backward pacificnew systemv; do
  zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}
  zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
  zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

 

タイムゾーンを設定します。


LOCALEPATH=`tzselect << "EOF"
5
19
1
EOF`
echo $LOCALEPATH
cp -va --remove-destination /usr/share/zoneinfo/${LOCALEPATH} /etc/localtime
unset LOCALEPATH

 

上記によって、Asia/Tokyo がタイムゾーンとして設定されます。

/etc/ld.so.conf を生成します。


cat > /etc/ld.so.conf << "EOF"
/usr/local/lib
/opt/lib
EOF

 

/etc/ld.so.conf は共有ライブラリの検索パスを指定するための設定ファイルです。 ダイナミックリンカは、このファイルを元に共有ライブラリを検索します

なお、/lib と /usr/lib については標準で検索されますので、このファイルに記述する必要はありません

ソースファイル付属文書のインストール

ソースファイルに付属している文書のインストールを行います。


cd ../glibc-2.21
mkdir -vp /usr/share/doc/glibc-2.21
cp -va BUGS         /usr/share/doc/glibc-2.21
cp -va CONFORMANCE  /usr/share/doc/glibc-2.21
cp -va COPYING      /usr/share/doc/glibc-2.21
cp -va COPYING.LIB  /usr/share/doc/glibc-2.21
cp -va ChangeLog    /usr/share/doc/glibc-2.21
cp -va ChangeLog.1  /usr/share/doc/glibc-2.21
cp -va ChangeLog.2  /usr/share/doc/glibc-2.21
cp -va ChangeLog.3  /usr/share/doc/glibc-2.21
cp -va ChangeLog.4  /usr/share/doc/glibc-2.21
cp -va ChangeLog.5  /usr/share/doc/glibc-2.21
cp -va ChangeLog.6  /usr/share/doc/glibc-2.21
cp -va ChangeLog.7  /usr/share/doc/glibc-2.21
cp -va ChangeLog.8  /usr/share/doc/glibc-2.21
cp -va ChangeLog.9  /usr/share/doc/glibc-2.21
cp -va ChangeLog.10 /usr/share/doc/glibc-2.21
cp -va ChangeLog.11 /usr/share/doc/glibc-2.21
cp -va ChangeLog.12 /usr/share/doc/glibc-2.21
cp -va ChangeLog.13 /usr/share/doc/glibc-2.21
cp -va ChangeLog.14 /usr/share/doc/glibc-2.21
cp -va ChangeLog.15 /usr/share/doc/glibc-2.21
cp -va ChangeLog.16 /usr/share/doc/glibc-2.21
cp -va ChangeLog.17 /usr/share/doc/glibc-2.21
cp -va INSTALL      /usr/share/doc/glibc-2.21
cp -va LICENSES     /usr/share/doc/glibc-2.21
cp -va NEWS         /usr/share/doc/glibc-2.21
cp -va PROJECTS     /usr/share/doc/glibc-2.21
cp -va README       /usr/share/doc/glibc-2.21
cp -va WUR-REPORT   /usr/share/doc/glibc-2.21

 

後始末

ディスクを圧迫しないよう、ビルド用のディレクトリを削除します。


cd ..
rm -fr glibc-2.21
rm -fr glibc-build

 

インストールリストの生成

最後に、インストールリストを生成します。


/sources/genpostlist.sh > /dev/null 2>&1
/sources/gendifflist.sh glibc

 
  
  

まとめ

glibcは、GNUプロジェクトによる標準Cライブラリです。

メニュー