クロスコンパイルに関するページです。

Ubuntu/クロスコンパイル/ARM

deb パッケージで提供されている ARM 用のクロスコンパイル用ツール

ArchLinux/クロスコンパイル/ARM

ArchLinux での ARM 用クロスコンパイル

Sourcery

Code Sourceery社が提供しているクロスコンパイル環境。Lite版は無料で利用可能。玄箱-T4 でも採用されている。

emdebian-tools

組み込み系の開発システムとしてDebianを活用できるようサポートするプロジェクト。apt-cross と違い、実行ファイルまでパッケージでインストールしてくれる。 参考:ARMクロス開発環境構築 (ひまじめ)

apt-cross

crosstoolは最近メンテナンスされていないようなので、試しに apt-cross を使ってみる。
参考:狐の王国 Debianのapt-crossでクロスコンパイル環境を作り、玄箱カーネルをビルドしてみる

crosstool

Dan Kegel氏が作成したクロスコンパイル用gcc, glibcの自動生成スクリプト集。PowerPCなど多くのプラトフォームと、gccとglibcの組合せに対応している。

ベンダ提供のツール

Globalscale Technologies

SheevaPlug Development Kits という SheevaPlug 用の開発ツールを plugcomputer.org で提供している。

その他の方法

IT Memo - コンピューターのちょっとマニアなメモサイトに詳しく説明されているので、それにしたがえばOK。ただし、いくつかひっかかった点があるので、忘れないうちにメモしておく。

PPC用のライブラリとヘッダファイルをPCにコピーする

上記サイトでは、玄箱上のライブラリとヘッダファイルを利用して、クロスコンパイル環境を構築している。

# apt-get install libc6-dev
# mkdir runtime
# cd runtime
# cp -RL /lib ./
# cp -RL /usr/lib/* lib	←ライブラリをまとめるのに注意。
# cp -RL /usr/include ./
# cd ..
# tar zcvf runtime.tar.gz runtime

できあがったruntime.tar.gzを PC に転送する。

PC上でのライブラリの展開と編集

$ tar zxvf runtime.tar.gz

runtime/lib/libc.so を変更する。(上記サイトでは、runtime/usr/libc.soとなっている。たぶん誤記だろう。)

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-powerpc)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )
            ↓
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-powerpc)
GROUP ( libc.so.6 libc_nonshared.a )

binutilsのインストール

Ringなどの近いミラーサイトから最新版のソースコードをダウンロードし、コンパイル、インストールする。

$ pwd
/home/hogehoge/cross-commpile
$ wget http://ring.maffin.ad.jp/archives/GNU/binutils/binutils-2.17.tar.bz2
$ mkdir source
$ cd source/
$ tar jxvf ../binutils-2.17.tar.bz2
$ cd ..
$ mkdir build
$ mkdir build/binutils
$ cd build/binutils
$ ../../source/binutils-2.17/configure --target=ppc-linux --enable-shared --prefix=/usr/local/ppc-cross
$ make
# su
# make install
# exit

以上の操作で、/usr/local/ppc-cross以下にインストールされる。

gcc-2.95.3のインストール

loader.oをコンパイルするにはフラッシュ上のカーネルをコンパイルしたのと同じバージョンのgccでないといけない(?)ので、とりあえずgcc-2.95.3をインストールする。

$ wget http://ring.maffin.ad.jp/archives/GNU/gcc/gcc-2.95.3.tar.gz
$ cd source/
$ tar zxvf ../gcc-2.95.3.tar.gz
$ cd ../
$ mkdir build/gcc
$ cd build/gcc/
$ su		←ここでルートになることに注意!
# export PATH=/usr/local/ppc-cross/bin/:$PATH
# ~/source/gcc-2.95.3/configure \
> --prefix=/usr/local/ppc-cross \
> --target=ppc-linux \
> --enable-shared --disable-nls \
> --with-as=/usr/local/ppc-cross/bin/ppc-linux-as \
> --with-ld=/usr/local/ppc-cross/bin/ppc-linux-ld \
> --with-headers=/home/hogehoge/cross-compile/runtime/include \
> --with-libs=/home/hogehote/cross-compile/runtime/lib
# make
# make install
# exit

make時に

gcc -c -DCROSS_COMPILE -DIN_GCC   -g -O2     -I. -I.. -I/home/hogehoge/cross-compile/source/gcc-2.95.3/gcc/ch
 途中略
/home/hogehoge/cross-compile/source/gcc-2.95.3/gcc/ch/loop.c
/home/hogehoge/cross-compile/source/gcc-2.95.3/gcc/ch/loop.c:321:8: missing terminating " character
/home/hogehoge/cross-compile/source/gcc-2.95.3/gcc/ch/loop.c:322:38: missing terminating " character
make[2]: *** [loop.o] Error 1
make[2]: Leaving directory `/home/hogehoge/cross-compile/build/gcc-2.95.3/gcc/ch'
make[1]: *** [cc1chill] Error 2
make[1]: Leaving directory `/home/hogehoge/cross-compile/build/gcc-2.95.3/gcc'
make: *** [all-gcc] Error 2

というエラーが出るので、/home/hogehoge/cross-compile/source/gcc-2.95.3/gcc/ch/loop.c の321行目と322行目の " を削除する。

gcc-3.3.5のインストール

最近のソフトはGCC3系を要求するものも多いので、Debian Sargeと同じgcc-3.3.5をインストールする。gcc-2.95.3との共存法が分からなかったので、別ディレクトリにbinutilsからインストールすることにした。

binutilsのインストール

gcc-2.95.3とほぼ手順は一緒。ただし、runtime/lib/libc.soの他にruntime/lib/libpthread.so も同様に変更する必要あり。

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-powerpc)
GROUP ( /lib/libpthread.so.6 /usr/lib/libpthread_nonshared.a )
            ↓
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-powerpc)
GROUP ( libpthread.6 libpthread_nonshared.a )
$ pwd
/home/hogehoge/cross-commpile
$ cd source/
$ tar jxvf ../binutils-2.17.tar.bz2
$ cd ..
$ mkdir build
$ mkdir build/binutils
$ cd build/binutils
$ ../../source/binutils-2.17/configure --target=ppc-linux --enable-shared --prefix=/usr/local/ppc-cross3
$ make
# su
# make install
# exit

以上の操作で、/usr/local/ppc-cross3以下にインストールされる。

gcc-3.3.5のインストール

$ wget http://ring.maffin.ad.jp/archives/GNU/gcc/gcc-3.3.5/gcc-3.3.5.tar.bz2
$ cd source/
$ tar jxvf ../gcc-3.3.5.tar.bz2
$ cd ../
$ mkdir build/gcc-3.3.5
$ cd build/gcc-3.3.5/
$ su		←ここでルートになることに注意!
# export PATH=/usr/local/ppc-cross3/bin/:$PATH
# ~/source/gcc-3.3.5/configure \
> --prefix=/usr/local/ppc-cross3 \
> --target=ppc-linux \
> --enable-shared --disable-nls \
> --with-as=/usr/local/ppc-cross3/bin/ppc-linux-as \
> --with-ld=/usr/local/ppc-cross3/bin/ppc-linux-ld \
> --with-headers=/home/hogehoge/cross-compile/runtime/include \
> --with-libs=/home/hogehote/cross-compile/runtime/lib \
> --enable-languages=c,c++
# make
# make install
# exit

クロスコンパイルの仕方

例えば、以下のようなソースファイルが hello.c という名前で保存されているとすると、

#include <stdio.h>
int main (void) {
	printf ("Hello world.\n");
	return 0;
}
$ export PATH=/usr/local/ppc-cross/bin:$PATH
$ ppc-linux-gcc -Wall -o hello hello.c

とすると、helloという名前でPPC上で実行可能なファイルがコンパイルされる。

$ file hello
hello: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), 
    for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped

fileコマンドを使って確認もできる。

カーネルのコンパイル

これもほとんど玄箱用のカーネルをクロス・コンパイルするのまま。カーネルソースの展開とパッチ当てまでは同じ。

前処理

まずは、クロス・コンパイル・ツールをインストールしたディレクトリへ、パスを通す。

$ export PATH=/usr/local/ppc-cross3/bin:$PATH

カーネルの設定を行う。以前に作成したconfigファイルを使うと楽。

$ cp ほげほげconfigファイル .config
$ make ARCH=ppc CROSS_COMPILE=ppc-linux- oldconfig

依存関係の解決を行います。 (kernel-2.6では不要のようだ。)

コンパイル

パラメータ入力の省略

  • Makefileの編集
    毎回コマンドラインでARCHやCROSS_COMPILEを指定するのは面倒なので、そういう場合はMakefile中のARCHとCROSS_COMPILEの行を編集すればよい。
    ARCH            ?= ppc
    CROSS_COMPILE   ?= ppc-linux-
  • 環境変数の設定
    ARCHおよびCROSS_COMPILEに適切な値を入れておく。

カーネル

$ make ARCH=ppc CROSS_COMPILE=ppc-linux- vmlinux

生成された vmlinux から、 loader.o が認識できる形式(raw バイナリ・ファイル)を作成する。

$ ppc-linux-objcopy -O binary vmlinux vmlinux-{version}-{type}-{option}.bin
例えば、
$ ppc-linux-objcopy -O binary vmlinux vmlinux-2.6.19.1-HGLAN2-HID-TUN-MPPE.bin

カーネルと関連するファイルを玄箱へコピーするときのために、ファイルを整理してアーカイブにまとておくと便利。

$ cp System.map System-2.6.19.1-HGLAN2-HID-TUN-MPPE.map
$ cp .config config-2.6.19.1-HGLAN2-HID-TUN-MPPE
$ tar jcvf ../kernel-2.6.19.1-HGLAN2-HID-TUN-MPPE.tar.bz2 \
> vmlinux-2.6.19.1-HGLAN2-HID-TUN-MPPE.bin \
> System-2.6.19.1-HGLAN2-HID-TUN-MPPE.map \
> config-2.6.19.1-HGLAN2-HID-TUN-MPPE

モジュール

$ make ARCH=ppc CROSS_COMPILE=ppc-linux- modules

モジュールを適当なディレクトリへインストールし、玄箱へコピーするときのためにアーカイブにまとめる。

$ make ARCH=ppc CROSS_COMPILE=ppc-linux- INSTALL_MOD_PATH=../modules-tmp modules_install
$ cd ../modules-tmp/lib/modules
$ tar jcvf ../../../modules-2.6.19.1-HGLAN2-HID-TUN-MPPE.tar.bz2 2.6.19.1-HGLAN2

インストール

カーネル

先ほど生成したアーカイブを玄箱にコピーし、/bootディレクトリに展開する。

# tar jxvf kernel-2.6.19.1-HGLAN2-HID-TUN-MPPE.tar.bz2 -C /boot

複数のバージョンが使えるように、(既にvmlinux.binなどがある場合はそれらのファイルを削除してから)シンボリック・リンクを張る。

# cd /boot
# rm .config vmlinux.bin System.map
# ln -s vmlinux-2.6.19.1-HGLAN2-HID-TUN-MPPE.bin vmlinux.bin
# ln -s System-2.6.19.1-HGLAN2-HID-TUN-MPPE.map System.map
# ln -s config-2.6.19.1-HGLAN2-HID-TUN-MPPE .config

モジュール

先ほど生成したアーカイブ modules-2.6.19.1-HGLAN2-HID-TUN-MPPE.tar.bz2 を玄箱にコピーし、アーカイブを/lib/modulesディレクトリに展開する。

# tar jxvf modules-2.6.19.1-HGLAN2-HID-TUN-MPPE.tar.bz2 -C /lib/modules

依存関係ファイルを作成します。

# /sbin/depmod -F /boot/System-2.6.19.1-HGLAN2-HID-TUN-MPPE.map -a 2.6.19.1-HGLAN2

/lib/modules/2.6.19.1-HGLAN2 に modules.dep に、モジュールの依存関係が記述される。

リンク


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-03-07 (金) 12:28:15 (1714d)