« ubuntuが自動アップデート後に起動しなくなった | トップページ | T2SPのT-Kernelソースコードのビルド »

2015/05/03

ARM用のgccクロスコンパイラ他の作成について

 必要があって、Windows上でARM用のgccクロスコンパイラ(+GDB)を作成しました。
 これについては、ネット上に数多くの情報があるのですが、時代と共に陳腐化しているものも混ざっており、そのためにハマったこともあるので、覚書としてまとめておきます(当然、この情報もいずれ陳腐化することでしょう)。
 なお、作業にあたって、以下の資料を参考にしました。

Interface (インターフェース) 2015年 03月号
CとGNU開発ツールによる組み込みシステムプログラミング 第2版

 特に、インターフェースの特集記事は、環境は異なるものの勉強になりました。

 作成した環境は、WindowsXP+MinGWで、各ツールのバージョンは、
binutils 2.25
gcc 4.9.2
newlib 2.2.0-1
gdb 7.9
です。
 newlib以外は、GNUオペレーティングシステムのリンク先からダウンロードしました。

 MinGWは、バージョンによってインストーラーが異なるらしく、私が利用したインストーラー(現時点の最新)は「MinGW Installation Manager」を利用するものでした。
 MinGW Installation Managerで、以下をMark for Installationとしました。

[Basic Setup]
mingw-developer-toolkit
mingw32-base
mingw32-gcc-g++
msys-base

[All Packages]
mingw32-libexpat … gdbのビルドで必要
mingw32-gmp dev … gccのビルドで必要
mingw32-mpc dev … gccのビルドで必要
mingw32-mpfr dev … gccのビルドで必要

 マークした後に、[Installation]→[Apply Changes]の「Apply」ボタンでインストールし、インストール後に"C:/MinGW/msys/1.0/etc"にある"fstab.sample"をコピーして、(ActivePerlは使用しない予定なので)、
c:/ActiveState/perl /perl
をコメントアウトして、"fstab"としました。これにより、"/mingw"が"C:\MinGW"に置き換えられるようになるので、例えば"cd /mingw/bin"の実行などが有効となります。
 Msysは"C:/MinGW/msys/1.0/msys.bat"で起動しますが、起動後にタイトルバーを右クリックして、プロパティを表示して、オプションタブの編集オプションの「簡易編集モード」と「挿入モード」にチェックを入れると、右クリックで選択範囲をコピーしたり、選択していないときは右クリックでクリップボードの内容をペーストできるようになるので便利です。
 Msys上では、"C:/MinGW/msys/1.0"は"/usr"となります。
 また、ドライブの指定は、例えばCドライブなら"/c/"を使用します。例えば"C:/MinGW/msys/1.0"は"/c/MinGW/msys/1.0"となります。

 MinGWの他に、Pythonをインストールしました。これは、GDBビルド時に"libpython27.a"が必要となるので、Active Pythonではなく、python.orgのPython2.7.Xをインストールしました(最初にActive Pythonをインストールしたらビルドできなくて悩みました)。

 クロスコンパイラの作成は、

1.binutilsのビルド&インストール
2.newlibビルド用のgccのビルド&インストール
3.newlibのビルド&インストール
4.gccのビルド&インストール
5.gdbのビルド&インストール

の順で行ないました。
 以下に、Msys上で実行した各ツールのビルド&インストール時のコマンドを記載します。なお、作業は"/usr/tmp"で行なうことを前提としています。
 また、作成したツールのインストール先は、"c:\gnutools"としています。prefixを指定しないと基本的に"/usr/local/bin"にインストールされるようですが、prefixのオプションを指定した方がパスを気にする必要性が少し減るようです。

1.binutilsのビルド&インストール
tar xvf binutils-2.25.tar.bz2
cd binutils-2.25
mkdir build
cd build
../configure --target=arm-*-eabi --prefix=/c/gnutools --disable-nls --enable-gold
make
make install

[補足]
 "arm-*-eabi"の"*"には適当な文字列を入れてください。
 ターゲットには"arm-elf"を指定することが紹介されていることが多いのですが、今回使用したgccのバージョンでは"arm-elf"はサポートされていませんでした。
 サポートしているターゲットについては、gccのソースコード解凍後の"INSTALL/specific.html"に記載されています。
 この件以外にも、解凍後の"README"や"INSTALL"には、必要な情報が記載されていることが多いので、目を通したほうが無難です(例えば、gccのconfigureは他のフォルダから実行しなければいけない("./configure"で実行してはいけない)、とか)。

 "--enable-gold"はリンカにgoldを使用することを有効にするオプションですが、指定しているとビルド時間がかなり長くなるようです。

2.newlibビルド用のgccのビルド&インストール
cd /usr/tmp
tar xvf gcc-4.9.2.tar.bz2
cd gcc-4.9.2
mkdir build
cd build
../configure --target=arm-*-eabi --prefix=/c/gnutools --disable-nls --disable-libssp --disable-shared --enable-languages=c
make
make install

[補足]
 make実行時に、
C:¥MinGW¥msys¥1.0¥bin¥make.exe: *** couldn't commit memory for cygwin heap, Win32 error 487
と出力されますが無視してmakeを再実行すれば良いらしいです(こちらのブログを参考にしました)。

3.newlibのビルド&インストール
cd /usr/tmp
tar xvf newlib-2.2.0-1.tar.gz
cd newlib-2.2.0-1
mkdir build
cd build
export PATH=/c/gnutools/bin:$PATH
../configure --target=arm-*-eabi --prefix=/c/gnutools
mkdir build
cd build

4.gccのビルド&インストール
cd /usr/tmp/gcc-4.9.2/build
../configure --target=arm-*-eabi --prefix=/c/gnutools --disable-nls --disable-libssp --disable-shared --enable-languages=c,c++ --with-newlib
make
make install

5.gdbのビルド&インストール
cd /usr/tmp
tar xvf gdb-7.9.tar.xz
cd gdb-7.9
mkdir build
cd build
export PATH=/c/gnutools/bin:/c/Python27:$PATH
../configure --target=arm-*-eabi --prefix=/c/gnutools --disable-nls --enable-gld --enable-gold --enable-expat --with-expat=yes
make
make install

[補足]
 MinGWで"mingw32-libexpat"をインストールしていないと、

checking for libexpat... no
configure: error: expat is missing or unusable

というエラーが出力されます。

 また、使用したgdbのソースバージョンだとmake実行時に、
----
gcc -DHAVE_CONFIG_H -I. -I../../../../gdb/gnulib/import -I.. -g -O2 -D__USE_MINGW_ACCESS -MT rename.o -MD -MP -MF .deps/rename.Tpo -c -o rename.o ../../../../gdb/gnulib/import/rename.c
In file included from ./sys/stat.h:44:0,
from ../../../../gdb/gnulib/import/rename.c:34:
c:¥mingw¥include¥parts¥time.h:65:8: error: redefinition of 'struct rpl_timespec'

struct timespec
^
./time.h:386:8: note: originally defined here
struct timespec
^
make[8]: *** [rename.o] Error 1
----
と出力されました。この問題については、"/c/MinGW/include/parts/time.h"の51行目の、

#if defined __need_struct_timespec && ! __struct_timespec_defined

#if defined __need_struct_timespec && ! __struct_timespec_defined && ! GNULIB_defined_struct_timespec

に変更することで対応しました。
 これは、"struct timespec"が"gdb-7.9/build/gdb/build-gnulib/import/time.h"の386行目で定義されているので、再定義を防ぐためです。

|

« ubuntuが自動アップデート後に起動しなくなった | トップページ | T2SPのT-Kernelソースコードのビルド »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/55806/61531832

この記事へのトラックバック一覧です: ARM用のgccクロスコンパイラ他の作成について:

« ubuntuが自動アップデート後に起動しなくなった | トップページ | T2SPのT-Kernelソースコードのビルド »