arm-gcc

ARMクロスコンパイラ構築

  • Windows版arm-gccを作るのはしんどいので、Linux( ubuntu 11.10 )上で作成。

ビルドのコツ

  • 最初にCだけ作って、あとでC++を作るよろし。




手順


Linuxマシンを用意する。ubuntu10.4が今回のターゲット。

  • マシンを用意しなくても、VMWare上で実行すればホストOSはWindowsでもよい。


  • いろいろビルドに必要なパッケージをインストールしておく。
# apt-get install build-essential
# apt-get install libtool
# apt-get install autoconf
# apt-get install automake
# apt-get install texinfo
# apt-get install libmpfr-dev
# apt-get install libmpc-dev
# apt-get install libgmp3-dev
# apt-get install libcloog-ppl-dev

# apt-get install bison
# apt-get install flex
# apt-get install zlib1g-dev
  • 無意識にインストール済みなやつも多いので、もしかしたら、抜けがあるかもしれない。

作業ディレクトリを掘る

$ mkdir build
$ cd build

ソースTARボールを入手する。

  • wget.shを用意
    #!/bin/sh
    wget -o wget1.log http://aist.ring.gr.jp/archives/GNU/binutils/binutils-2.21.tar.bz2   
    wget -o wget2.log http://aist.ring.gr.jp/archives/GNU/gcc/gcc-4.5.2/gcc-4.5.2.tar.bz2       
    wget -o wget3.log ftp://sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz
  • 実行
    ./wget.sh

取得できたら展開

  • extract.sh
    #!/bin/sh
    tar xvfj binutils-2.21.tar.bz2
    tar xvfj gcc-4.5.2.tar.bz2
    tar xvfz newlib-1.18.0.tar.gz
  • 実行
    ./extract.sh

では、一気に行こうか。

  • build-all.sh
    #!/bin/sh
    
    echo '# =========================================================='
    echo '# setenv'
    echo '# =========================================================='
    
    BINUTILS=binutils-2.21
    GCC4=gcc-4.5.2
    NEWLIB=newlib-1.18.0
    BUILDTARGET='--target=arm-none-eabi --prefix=/usr/local/arm '
    
    
    #   第一引数がエラー値だったらexitする
    print_error () {
        if [ $1 -ne 0 ]
        then
            exit $1
        fi
    }
    
    export PATH=$PATH:/usr/local/arm/bin
    
    mkdir _binutils
    mkdir _gccbuild
    mkdir _newlib
    
    echo '# =========================================================='
    echo '# _binutils'
    echo '# =========================================================='
    
    cd _binutils
    ../$BINUTILS/configure $BUILDTARGET
    print_error $?
    
    make 
    print_error $?
    
    sudo make install
    
    # 次、gccのC言語のみ。config内容はWindowsのWinARMコマンドラインのhelpから取得
    
    cd ..
    
    
    echo '# =========================================================='
    echo '# _gccbuild'
    echo '# =========================================================='
    
    cd _gccbuild
    
    ../$GCC4/configure $BUILDTARGET \
    --disable-nls --disable-shared --disable-threads \
    --with-gcc --with-gnu-ld --with-gnu-as --enable-languages=c,c++ \
    --enable-interwork --enable-multilib --disable-libssp --disable-libstdcxx-pch \
    --with-dwarf2 --program-prefix=arm-none-eabi- --with-newlib \
    --disable-newlib-supplied-syscalls --disable-libunwind-exceptions \
    --disable-newlib-atexit-dynamic-alloc \
    --disable-zlib
    print_error $?
    
    make LANGUAGES=c all-gcc 
    print_error $?
    
    sudo make LANGUAGES=c install-gcc 
    
    #次はNewlib
    
    cd ..
    
    echo '# =========================================================='
    echo '# _newlib'
    echo '# =========================================================='
    
    cd _newlib
    ../$NEWLIB/configure $BUILDTARGET
    print_error $?
    
    make
    print_error $?
    
    #sudo make install ???あれ?
    sudo PATH=$PATH:/usr/local/arm/bin  make install
    
    #最後に、残りのC++も含める。
    
    cd ..
    
    echo '# =========================================================='
    echo '# gcc ALL'
    echo '# =========================================================='
    
    cd _gccbuild
    make
    print_error $?
    
    sudo make install
    cd ..
  • だいたいこんな感じ。
  • zlibは -m64でエラーする・・・。--> --disable-zlibでごまかす。


  • たいていは途中でつまずくので、これを切り出して個別に実行したほうが良いかも。
  • gcc,binutils,newlibのバージョンは旬というものがあるので、環境変数にしてみました。



  • 出来たのは良いけれど、armonをビルドして試してみると、"syscalls.c"のビルドが通らなくなっていた。
  • SVC命令が-mthumbでは使えない、というアセンブラメッセージだった。
  • もしかしたら、ThumbではSVCが使えないのに、そのようなasm文が落ちる設定になっていたのかも。
  • 古いbinutilsではノーチェックなのか????
    • いや、SVCは使えるはずだ。少なくともThumbでは。
    • ただ、SVCの引数は24bitなくて8bitになるらしい。



  • 実は、CodeSourcery G++ LiteのDLサイトを良く見たら、Windows/Linux版だけでなく、ソースもDL出来るようになっている。
  • ソースをDLしてみた。

arm-2010.09-51-arm-none-eabi% ls

arm-2010.09-51-arm-none-eabi.sh
binutils-2010.09-51.tar.bz2
cloog-2010.09-51.tar.bz2
coreutils-2010.09-51.tar.bz2
expat-2010.09-51.tar.bz2
gcc-2010.09-51.tar.bz2
gdb-2010.09-51.tar.bz2
gmp-2010.09-51.tar.bz2
gnu-2010.09-51-arm-none-eabi.txt
libelf-2010.09-51.tar.bz2
libiconv-2010.09-51.tar.bz2
make-2010.09-51.tar.bz2
mpc-2010.09-51.tar.bz2
mpfr-2010.09-51.tar.bz2
newlib-2010.09-51.tar.bz2
ppl-2010.09-51.tar.bz2
zlib-2010.09-51.tar.bz2
  • 必要物全部入っとるやんけ。
  • arm-2010.09-51-arm-none-eabi.sh はビルドスクリプトになっていて、Linux版とWindows版の両方を、(たぶん)GNU/Linux OS上でビルド出来るようになっている。
  • Windows版のexeファイルはLinux上のクロスMinGW-gccで作成出来る。便利だ。
  • というわけで、今のところ CodeSourcery G++ Liteの成果を使わせていただくのが最も便利で楽勝だ。という結論に達した。






別解:summon-arm-toolchainを使ってLinux上でarm-gcc(elf)を作る。

summon-arm-toolchain

  • https://github.com/esden/summon-arm-toolchain/
  • 上記ページのDOWNLOADリンクをクリックして、zipファイルを取得する。
  • 展開すると、summon-arm-toolchainというシェルスクリプトが出てくるので、これを、たとえばubuntu11.04上 で走らせる。(もちろんWindows上のVMimageなubuntuでも構わない)
  • 走らせる前に、なるべくなら、build-essential とか gcc , git , libmpfr-dev , libmpc-dev ,libftdi-dev , texinfo などはインストールしておいたほうが良い。( apt-get install 〜 を使う)

あとはほぼ自動でダウンロード&クロスビルドを行ってくれる。

  • できたブツは ~/sat/ 以下に生成されるようだ。 一応ユーザー権限で全部作成された。(含: OpenOCD , gdb7 etc)
  • ものぐさな人には便利かも。(全自動でビルドしてくれるので)