How to build toolchains for ARM

last update: 25 Dec 2004

home

ARMのためのクロス開発環境構築



1.1 はじめに
これは、ARMのためのクロス開発環境(toolchains)構築に関する備忘録です。

対象とするCPUやツールは次のとおり:
CPU ARM(XScale含む)
Kernel Linux-2.6.9
binutils binutils-2.14
glibc glibc-2.3.2
gcc gcc-3.4.2

作業を行なったのは2004年11月。この時点での最新環境です。

remark: これらのバージョンは、個々に眺めると最新ではありません(例えばbinutils-2.15が最新)。しかし、binutils-2.15ではglibc-3.4.2がコンパイルできないなど、いろいろと不具合があります。
ここでは、glibcの最新バージョンをコンパイルすることを最優先事項として、binutilsやgccのをバージョンを選択しました。

なお、クロス開発環境の構築は、オライリー社『組み込みLINUXシステム構築(ISBN4-87311-161-7)』に準拠しています。

1.2 開発環境

    1.2.1 ユーザ

    "developer"というユーザを作成し、クロス開発はユーザ"developer"が行うこととします。

    1.2.2 環境変数

    ユーザ"developer"には、以下の環境変数を設定してください。
    export PROJECT=arm-cross
    export PRJROOT=${HOME}/${PROJECT}
    export TARGET=arm-linux
    export PREFIX=${PRJROOT}/tools
    export TARGET_PREFIX=${PREFIX}/${TARGET}
         

    環境変数"PATH"は、ブートストラップ用gccの作成までは次のようにし、

    export PATH=/sbin:/bin:/usr/sbin:/usr/bin:${PREFIX}/bin:${PATH} 
         
    以降は次のようにしてください。
    export PATH=${PREFIX}/bin:${PATH}
         

1.3 Kernel Header
  1. カーネルソースの展開
    適当な作業ディレクトリにカーネルソースを展開します。
      % tar xvfj linux-2.6.9.tar.bz2
      % cd linux-2.6.9

  2. Makefileの編集
    必要に応じて、Makefileの変数”CROSS_COMPILE”を書き換えます。
    編集前: CROSS_COMPILE ?= 
    編集後: CROSS_COMPILE ?= arm-linux-
         

  3. make menuconfigなど
      % make oldconfig
      % make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

  4. ヘッダーファイル群のコピー
      % mkdir -p ${TARGET_PREFIX}/include
      % cp -r include/linux/ ${TARGET_PREFIX}/include
      % cp -r include/asm-arm/ ${TARGET_PREFIX}/include/asm
      % cp -r include/asm-generic/ ${TARGET_PREFIX}/include


1.4 binutils-2.14
適当な作業ディレクトリにソースを展開し、make,make installしてください。

    % tar xvfz binutils-2.14.tar.gz
    % cd binutils-2.14
    % mkdir work
    % cd work
    % ../configure --target=$TARGET --prefix=$PREFIX
    % make
    % make install

1.5 glibc-2.3.2のheader file
適当な作業ディレクトリにソースを展開し、パッチ(glibc-2.3.2-forARM-sh1.patch)を当て、makeします。

    % tar xvzf glibc-2.3.2.tar.gz
    % tar -xvzf glibc-linuxthreads-2.3.2.tar.gz --directory=glibc-2.3.2
    % cd glibc-2.3.2
    % patch -t -p1 < glibc-2.3.2-forARM-sh1.patch
    % mkdir build-headers
    % ../configure --host=$TARGET --build=i386-linux --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include
    % make cross-compiling=yes install_root=$TARGET_PREFIX prefix="" install-headers
    % touch $TARGET_PREFIX/include/gnu/stubs.h

1.6 gcc-3.4.2 (ブートストラップcc)
適当な作業ディレクトリにソースを展開し、make,make installします。
    % tar xvjf gcc-3.4.2.tar.bz2
    % cd gcc-3.4.2
    % mkdir boot-gcc
    % cd boot-gcc
    % ../configure --target=$TARGET --prefix=$PREFIX --disable-shared --with-headers=$TARGET_PREFIX/include --with-newlib --enable-languages=c
    % make all-gcc
    % make install-gcc

1.7 glibc-2.3.2
すでに展開してあるglibc-2.3.2のディレクトリに移動し、make,make installします。
    % cd glibc-2.3.2
    % mkdir build-glibc
    % cd build-glibc
    % CC=arm-linux-gcc ../configure --host=$TARGET --build=i386-linux --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include
    % make
    % make install_root=$TARGET_PREFIX prefix="" install

インストール後、 ファイル"${TARGET_PREFIX}/lib/libc.so"を編集します。
編集前: ***BUG in libc/scripts/output-format.sed *** elf32-bigarm,elf32-littlearm
	GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )

編集後: GROUP ( libc.so.6 libc_nonshared.a )
     

remark: "***BUG in libc/s..."は全行削除します。

1.8 gcc-3.4.2
すでに展開してあるgcc-3.4.2のディレクトリに移動し、make,make installします。
    % cd gcc-3.4.2
    % mkdir build-gcc
    % cd build-gcc
    % mkdir build-gcc
    % ../configure --target=$TARGET --prefix=$PREFIX ?enable-languages=c,c++
    % make all
    % make install

1.9 kernel-2.6.9
すでに展開してあるlinux-2.6.9のディレクトリに移動し、make clean zImage,make modulesなどを行ないます。

    % cd linux-2.6.9
    % make zImage
    % make modules && make modules_install


home


since 04/Oct/2004