書籍サポートページ で配布しているアセンブラ出力環境の,環境構築方法です. gccバージョン3版・バージョン4版共通です.
※ 環境構築の方法については書籍の第3部で詳しく説明していますので, よくわからなければそちらも参考にしてみてください.
以下,環境構築の方法の説明です.cross2やcross-gcc4を利用する場合は, 「cross」→「cross2」,「cross」→「cross-gcc4」などのように適宜 読み変えてください.
以下を実施して,ツール類の準備をする.
~>% tar xvzf cross-XXXXXXXX.tgz ~>% cd cross/toolchain ~/cross/toolchain>% ./fetch.sh (ツール類をダウンロードしMD5チェック) ~/cross/toolchain>% ./setup.sh (ツール類を展開しパッチ当てする) ~/cross/toolchain>% cd .. ~/cross>%以下はとくに行わなくてもよいが,マルチコアのPCならば,以下で-jオプションを 有効にしておくとビルドが高速になってとてもよい.全アーキビルドとかやる場合には やっておいたほうがいい.
~/cross>% vi config.sh (#makeopt="-j 2" の行のコメントを外して有効化して,コア数に合わせて -j 4 とかにする)さらに以下を行って,インストール先のディレクトリにユーザ権限で書き込みできる ようにしておく.システムディレクトリを開けるのが嫌だったら上記config.shを修正 してインストール先を/usr/local/cross とかでなくユーザのホームディレクトリ とかにしておくか,カスタムでビルド&suしながらインストールを繰り返しながら インストールする.
~/cross>% su # mkdir /usr/local/cross # chmod 777 /usr/local/cross # exit ~/cross>%
※ 以下はgcc4の場合のみ行ってください.gcc3では必要ありません
gmp,mpfr,mpcのインストール状況をチェックする.
~/cross>% cd build ~/cross/build>% ./config.sh※ これでシステムに(apt-getなどによって)すでにインストール済みの gmp,mpfr,mpcがあれば,以下のようにして検出される.
~/cross/build>% ./config.sh -------- configuration parameters -------- tool = gcc ...(中略)... gmp = gmp-5.1.1 (これは無視.単にconfig.shで指定されているバージョン) mpfr = mpfr-3.1.2 (これは無視.単にconfig.shで指定されているバージョン) mpc = mpc-1.0.1 (これは無視.単にconfig.shで指定されているバージョン) ...(中略)... gmp_dir = /usr/local (gmpは/usr/localにインストール済み) mpfr_dir = /usr/local (mpfrは/usr/localにインストール済み) mpc_dir = /usr/local (mpcは/usr/localにインストール済み) ...(後略)...無ければ無いよと言われて,以下のインストール作業が必要になる.ただし検出された としても,バージョン不整合の相性問題が置きやすいので,やっぱり以下の インストール作業を行って,個別にビルド&インストールしておいたほうがよい.
インストールはスクリプト一発でできる.
~/cross/build>% ./setup-all.sh終わったらもう一度 config.sh を実行して,gmp,mpfr,mpcがある場所が 「/usr/local/cross」になっていることを確認する.
~/cross/build>% ./config.sh -------- configuration parameters -------- ...(中略)... gmp_dir = /usr/local/cross mpfr_dir = /usr/local/cross mpc_dir = /usr/local/cross ...(後略)...
上記の「準備手順」をひととおり行った後,インストール規模に応じて以下を行う.
※ HDDの空き容量が数GB単位で必要なので注意(とくにcross2は巨大).時間もかかる.
上記の「準備手順」を行ったあと,以下を行う.すんごく時間がかかるので注意. ビルド中はbuildディレクトリ以下で ls * とかやることで,進捗を知ることができる. 基本,数時間(PC性能によっては数日)PCをつけっぱなしにする覚悟で実行する こと.
~/cross/build>% ./build-install-all.shホームディレクトリの容量が心配な場合には,上記でなく以下を実行すると, ビルド用のワークディレクトリを削除しながらビルドを行う.
~/cross/build>% ./build-install-clean-all.sh
上記の「準備手順」を行ったあと,以下を行う.
~/cross/build>% ./build-install-all.sh arm-elf mips-elfアーキテクチャ名は build/gcc/targets.sh を参照.
build-install-all.sh の他に build-install-clean-all.sh でも, 同様にアーキテクチャ指定できる.
以下に例をいくつか.以下はbinutilsの例だが,gccやgdbに関しても同様に可能.
~/cross/build>% cd binutils ~/cross/build/binutils>% ./build.sh (binutilsを全アーキテクチャに対してビルド) ~/cross/build/binutils>% ./install.sh (全アーキテクチャに対してインストール.事前にビルドが必要) ~/cross/build/binutils>% ./clean.sh (全アーキテクチャのワークディレクトリを削除) ~/cross/build/binutils>% ./build.sh arm-elf mips-elf (ARMとMIPSをビルド) ~/cross/build/binutils>% ./install.sh arm-elf (ARMのみインストール) ~/cross/build/binutils>% ./clean.sh mips-elf (MIPSのみ削除) ~/cross/build/binutils>% ./all.sh -build -install arm-elf mips-elf (ARMとMIPSについて,ビルドとインストールを行う)build.shやinstall.shは,実際には内部でall.shを呼び出しているだけなので, 基本的にはall.shですべての作業ができる.
※ 以前はbuild.sh,install.sh,clean.shが独立していたため,ワークディレクトリを 削除しながらビルドを進めることができませんでした(全ビルド,全インストール後に 全削除,ということしかできなかった). 今回は処理をall.shにまとめてさらにアーキ指定できるようにすることで, アーキテクチャ単位でビルド・インストール・クリーンの一連の処理を行えるように してあります.で,build.shとかはall.shを適切なパラメータで呼び出すだけに なっています.
~/cross/build>% ./build-install-clean-all.shと
~/cross/build>% cd ../binutils ~/cross/build/binutils>% ./build.sh ; install.sh ; clean.sh ~/cross/build/binutils>% cd ../gcc ~/cross/build/gcc>% ./build.sh ; install.sh ; clean.sh ~/cross/build/binutils>% cd ../gdb ~/cross/build/gdb>% ./build.sh ; install.sh ; clean.shでは,最終的にインストールされる結果は同じです.しかし順番が異なります.
前者はツール(binutils,gcc,gdb)ごと,アーキテクチャごとに 「build, install, clean」を順番に行います.このためビルド用の ワークディレクトリを細かく削除しながらビルドを行います.ビルド用のHDDの 消費量は,一時的に数100MBくらいです.
後者はbinutilsを全アーキで全ビルド・全インストールを行った後に ワークディレクトリを全削除する,という順番になります.その後のgccも同様です. このためワーク用に,HDDを一時的に大量に(数GB単位で)消費することになります.
toolchainのインストール後は,以下でアセンブラを出力させることができます.
~/cross/build>% cd ../sample ~/cross/sample>% make clean ; make ~/cross/sample>% ls *.d ~/cross/sample>% more mips-elf.d以下のようにすると,アーキテクチャ単位で出力できます. いろいろ遊んでみてください.
~/cross/sample>% make mips-elf.d以下でHello Worldが実行できます.
~/cross/sample>% cd ../exec ~/cross/exec>% make clean ; make ; make run ~/cross/exec>% cat *.not *.sot以下でprintf()によるHello Worldが実行できます.
~/cross/exec>% cd ../printf ~/cross/printf>% make clean ; make ; make run ~/cross/printf>% cat *.not *.sot