FreeBSDでglibcをクロスコンパイル

FreeBSDglibcをクロスコンパイル出来たのでメモ。
コンパイル出来たけど使い道が思いつかない…


ロスコンパイルにはPortsのemulators/linux_dist-gentoo-stage3を使う。
ターゲットはLinux

ロスコンパイルの手順

★ソースの用意

バージョン2.3.6ならコンパイル出来たので、このバージョンのソースを用意する。
適当なミラーからglibc-2.3.6.tar.bz2とglibc-linuxthreads-2.3.6.tar.bz2をダウンロードする。

★ファイルの展開

作業ディレクトリに移動してglibcのソースを展開する。
さらに、展開されたglibcディレクトリに移動して、glibc-linuxthreadsのソースを展開する(ここがポイント)。

# mkdir /usr/local/gentoo-stage3/tmp/glibc
# cd /usr/local/gentoo-stage3/tmp/glibc
# tar xjvf 適当なパス/glibc-2.3.6.tar.bz2
# cd glibc-2.3.6
# tar xjvf 適当なパス/glibc-linuxthreads-2.3.6.tar.bz2
コンパイル

ビルド用のディレクトリを作る。

# cd ..
# mkdir build


linux_dist-gentoo-stage3環境にchrootする。

# cd /usr/local/gentoo-stage3
# mount_devfs devfs dev
# chroot `pwd`
# cd /tmp/glibc/build


configureを下記の通りにする。

# ../glibc-2.3.6/configure \
 --prefix=/hoge \
 --enable-add-ons=linuxthreads \
 --without-__thread


makeをするが、途中で「ELF binary type "0" not known.」と言うエラーメッセージが出て止まったら、FreeBSD環境からbrandlfでLinuxのバイナリだと教えてやる。

# brandelf -t Linux /usr/local/gentoo-stage3/tmp/glibc/build/elf/ld-linux.so.2


makeが終わったら、「make install」をする前に、/usr/local/gentoo-stage3/tmp/glibc/build/elf以下の実行ファイル全部にbrandlfをする。
さらに/hoge/etc/ld.so.confを空ファイルで用意する。

linux_dist-gentoo-stage3環境で)
# mkdir -p /hoge/etc
# touch /hoge/etc/ld.so.conf


「make install」をすると、/hoge以下にglibcがインストールされる。