【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

Linux互換環境にglibcをインストール

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スクリプトのパス

FreeBSDbashパス(/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...]
(以下略)

以上でインストールは完了です。