LS-GL向けのクロスコンパイル環境を構築

id:NeoCat:20070808でシリアルコンソールを付けてhack可能にしたLS-GLですが、せっかく常時稼働しているので監視やロギング用途に使えるようにしようかと考えています。そんなわけで、クロスコンパイル環境を整えて、必要なソフトを組み込んでみることに。
BUFFALO LS-400GL ギガビット LAN接続HDD LinkStation
とりあえず、バッファローの申し込み窓口からソースCD-ROMを入手してみました。中を見てみたところ、glibc(コンパイル済み)とか、gcc等のSRPM、各種ライブラリやbusyboxなどのソースコードが入っていました。glibcコンパイル済みなのでちょっと楽できそうです。
(普通はクロスコンパイラを作ろうとすると、gcc(共有ライブラリ非サポート版) → glibcgcc(本番) とビルドしていかなければならないので、手間がかかります。)

今回は母艦はPowerPC / Mac OS Xを使います。まあUNIX的な環境ならcygwinとかでも大丈夫でしょう。
/usr/local/arm以下に適当にクロスコンパイル環境を導入することにします。
何か失敗しても、これを消せば元通りのはず。

まずは、binutils, gcc, g++などのtoolchainを一式作ります。
途中で本体のライブラリを抜いてきて使ってたり、結構手抜きですが、試行錯誤した結果、以下のような手順で入れられそうだと判明。備忘録としてメモっておきます。

0. 準備: beecrypt, rpmのダウンロード・インストー

 % cd beecrypt
 % ./configure ; make ; sudo make install
 % cd rpm
 % ./configure --without-python ; make ; sudo make install

1. binutils 2.17をビルド

 % sudo mkdir /usr/local/src/redhat
 % sudo chown NeoCat /usr/local/src/redhat #自分のユーザにする
 % rpm -ivh binutils-2.17pre-1.src.rpm
 % cd /usr/local/src/redhat/SOURCE
 % tar jxf binutils-2005q3-2.tar.bz2
 % cd binutils-2.17pre
 % ./configure --target=arm-none-linux-gnueabi --prefix=/usr/local/arm \
      --enable-shared
 % make
 % sudo mkdir /usr/local/arm
 % sudo chown ${USER}:${GROUP} /usr/local/arm
 % make install

2. ソースコードCDから glibc, glibc-dev パッケージをリロケートしてインストー

このままだと後でライブラリが usr と arm-none-linux-gnueabiとの二カ所に分散しており、不都合が起きるようなので、マージしてしまう。

% cd /usr/local/arm
% ln -s arm-none-linux-gnueabi usr

 % cd /Volumes/Untitled
 % sudo rpm -ivh --ignoreos --ignorearch \
    --relocate /=/usr/local/arm/ \
    glibc-devel-arm_trg-2005q3-2.arm.rpm  \
    glibc-arm_trg-2005q3-2.arm.rpm
 % sudo vi /usr/local/arm/arm-none-linux-gnueabi/lib/libc.so
 ライブラリのパスの先頭に 「../..」を追記
 % sudo vi /usr/local/arm/arm-none-linux-gnueabi/lib/libpthread.so
 ライブラリのパスの先頭に 「../..」を追記

3. gccのビルド

 % rpm -ivh gcc-2005q3-2.src.rpm
 % cd /usr/local/src/redhat/SOURCES
 % tar xjf gcc-2005q3-2.tar.bz2
 % cd gcc-2005q3
 % export PATH=$PATH:/usr/local/arm/bin
 % ./configure --prefix=/usr/local/arm --target=arm-none-linux-gnueabi \
    --enable-languages=c,c++
 % make all-gcc
 % make install-gcc

なんかまだライブラリ配置がおかしいらしく、「ld-linux.so.3がない」といってリンクが失敗するようなので、若干姑息ですが

% cd /usr/local/arm/usr/lib
% ln -s ../../lib/ld-linux.so.3 .

とスタティックリンクしてしまいます。なんだかなあ…。