id:n7shi:20091115でビルドしたglibcはクロス開発用のため、そのままではLinux互換環境にインストールすることができません。インストールするにはもう一度ビルドを行う必要があります。
手順は以下の通りです。クロス開発環境が構築されていることを前提としています。
【追記】id:n7shi:20091117でビルド済みのバイナリを配布しています。
展開
ソースを展開してパッチを当てます。ソースやパッチの入手先はid:n7shi:20091115を参照してください。
tar xvjf glibc-2.11.tar.bz2 cd glibc-2.11 patch -p1 < ../glibc-gentoo.diff
パッチ
クロスコンパイルの時には出なかったエラーが発生するため、以下のパッチを当てます。-lsspを追加するだけの簡単な修正なので、手動で編集できます。
--- nscd/Makefile.orig +++ nscd/Makefile @@ -127,7 +127,7 @@ relro-LDFLAGS += -Wl,-z,now $(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o)) - $(+link-pie) + $(+link-pie) -lssp endif # This makes sure -DNOT_IN_libc is passed for all these modules.
ビルド
作業用ディレクトリを作成してビルドを行います。クロスコンパイルの時に使用したアーカイブを流用する場合、ディレクトリ名を変えてください。
mkdir build cd build env CFLAGS="-O2 -march=i686" ../configure --host=i686-linux --prefix=/usr --sysconfdir=/etc --libdir=/lib gmake
既にglibcが存在するため、前回のようにconfigureのエラーを抑制するオプションは必要ありませんが、インストールパスを細かく指定しています。
インストール
Linux互換環境のパス(/usr/compat/linux)を指定してインストールします。パスを指定しないでgmake installするとFreeBSD本体が壊れるため絶対に行わないでください。
gmake install_root=/usr/compat/linux install
修正
そのままではいくつか不具合があるため修正します。
bashスクリプトのパス
FreeBSDのbashパス(/usr/local/bin/bash)が記録されるため、/bin/bashに書き換えます。手動でも可能ですが、以下はGNU sedを使用する方法です。portsなどからgsedをインストールする必要があります。
cd /usr/compat/linux/usr/bin gsed -i "s|/usr/local/bin/bash|/bin/bash|" tzselect xtrace ldd
ELFローダのLinux指定
ELFローダにLinuxバイナリであることを刻印します。これをしないとlddが機能しません。
brandelf -t Linux /usr/compat/linux/lib/ld-2.11.so
ld-2.11.soはコマンドとして利用できる特殊な共有ライブラリで、brandelf後は実行できます。glibcのlddの実体はシェルスクリプトで、中でコマンドとしてld-2.11.soを呼び出しています。
% /usr/compat/linux/lib/ld-2.11.so Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...] (以下略)
以上でインストールは完了です。