現在の位置
diff プラグインを使用中
- 追加された行はこの色です。
- 削除された行はこの色です。
- ターゲット環境/クロスコンパイラの構築方法/gcc-arm へ行く。
- ターゲット環境/クロスコンパイラの構築方法/gcc-arm の差分を削除
*概要 [#u566f83a] &color(red){2010/3/31現在 この方法で構築したクロスコンパイラによって作られたバイナリは正常に動作しません。glibcまわりにバグがあると思われますが現在調査中です。}; **必要なもの [#m3c231b1] -binutils -gcc -glibc -カーネルヘッダ -gmp,mpfr **作業手順概要 [#r7457e1e] +binutilsを作成 +glibcのヘッダだけ作成 +glibc構築用gccの作成(C言語のみ) +glibcの構築 +glibc構築用gccの作成(C言語のみ)2回目 +glibcの構築 +glibc構築用gccの作成(C言語のみ)3回目 +glibcの構築 +フルgccの作成(すべての言語) -glibcとgccはお互いに依存しているので,何回かに分けて無効オプションを外しながら構築を繰り返す必要がある **注意 [#t430e4f0] -configure,makeを行う場合は,必ずソースがおいてあるディレクトリ以外で行うこと -文中では,ソース中にworkと言うディレクトリを掘り,そこからの相対パス(../configureなど)で実行している * 1. 環境 [#t414bb23] 以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。 ** 1.1 環境変数の設定 [#pbe389cb] .rcの名前でファイル作成 # # .rc # ARM Cross compile environment # CROSS=/opt/arm-cross export PATH=${CROSS}/bin:${PATH} export CROSS_HOST_LIB=${CROSS}/host-lib export ARM_HOST=arm-unknown-linux-gnu export ARM_TARGET=arm-unknown-linux-gnu 上記のファイルを以下のようにして読み込んでおく source ./.rc ** 1.2 ディレクトリ作成 [#i5386f9a] ${CROSS}以下にインストールを行うものとする mkdir ${CROSS} -p * 2. カーネルヘッダの展開 [#fe989d60] rpm2cpio kernel-headers-2.6.31.5-122.fc12.armv5tel.rpm | cpio --extract --make-directories chmod 755 -R usr mkdir ${CROSS}/${ARM_TARGET}/include -p cp -a usr/include/ ${CROSS}/${ARM_TARGET}/ -カーネルソース内のヘッダの位置はディストリビューションによってかわるかもしれず -シンボリックリンクが含まれているので,展開時は上記のようにrpm用コマンドで展開する * 3. binutils作成 [#u30c28f9] ../configure \ --target=${ARM_TARGET} \ --prefix=${CROSS} \ --enable-64-bit-bfd make make install -intlがどーのこーのでエラーが出たら以下のオプションを追加 --disable-nls -以下のオプションはホストが32bitのとき用(64でも多分問題ない) --enable-64-bit-bfd -&color(Red){追加のファイルコピー}; mkdir ${CROSS}/include cp -v ../include/libiberty.h ${CROSS}/include * 4. glibcのヘッダだけを作る [#k1999580] AR=arm-unknown-linux-gnu-ar \ RANLIB=arm-unknown-linux-gnu-ranlib \ CC=gcc \ libc_cv_mlong_double_128=yes \ ../configure \ --prefix=${CROSS} \ --host=${ARM_TARGET} \ --with-headers=${CROSS}/${ARM_TARGET}/include \ --with-binutils=${CROSS}/${ARM_TARGET}/bin \ --enable-add-ons \ --disable-sanity-checks \ --disable-versioning \ --disable-profile \ --with-tls make install-headers -CCがgccになっているのは間違いではない --ヘッダしか作らないからホストのgccでもかまわない --クロス用gccはまだないので使えない -makeは単独でたたく必要はなく,"make install-headers"だけでよい -&color(Red){ファイルが足りないので仕上げ}; --work中のbitsを参照 cp -v bits/stdio_lim.h ${CROSS}/include/bits mkdir ${CROSS}/include/gnu -p touch ${CROSS}/include/gnu/stubs.h --これを忘れると動かない * 5. gcc(glibc作成用)の作成 [#r228723a] ** 5.1 gmp,mpfrの導入 [#p117fc64] -双方はホスト側の環境に入れる必要がある --クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない ***gmp [#f42eef08] ../configure \ --prefix=${CROSS_HOST_LIB} \ make make install ***mpfr [#za9461d1] ../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \ make make install ** 5.2 gcc の作成 [#e28a6b6f] ../configure \ --prefix=${CROSS} \ --target=${ARM_TARGET} \ --with-headers=${CROSS}/include \ --enable-languages=c \ --disable-libmudflap \ --disable-libssp \ --disable-threads \ --disable-shared \ --with-gmp=${CROSS_HOST_LIB} \ --with-mpfr=${CROSS_HOST_LIB} make all-gcc make install -この時点で出来るgccはかなり不完全 --色々disableしてall-gccでコンパイルしないと通らない -make install時にエラーが出るが気にしない -前のステップのファイル追加コピーを忘れていると,エラーになる --stubs.h等が足りないと言われる --一度失敗するとファイルをそのあとでコピーしても失敗し続ける --一度make distcleanすべし * 6. glibcの作成 [#k8b708a4] CC=arm-unknown-linux-gnu-gcc \ AR=arm-unknown-linux-gnu-ar \ RANLIB=arm-unknown-linux-gnu-ranlib \ ac_cv_type_long_double=no \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ ../configure --prefix=${CROSS} \ --host=${ARM_TARGET} \ --with-headers=${CROSS}/${ARM_TARGET}/include \ --disable-sanity-checks \ --with-tls \ --with-__thread \ --enable-thread \ --enable-add-ons \ --enable-kernel=2.6.31 make gnulib=-lgcc make install -最後まで通らなくても一回installする --この段階ではglibcのコアだけ出来ていれば良い * 7. glibc作成用GCC その2 [#y9a55218] rm ${CROSS}/${ARM_TARGET}/lib -f -r ../configure \ --prefix=${CROSS} \ --target=${ARM_TARGET} \ --with-headers=${CROSS}/include \ --with-libs=${CROSS}/lib \ --enable-languages=c \ --enable-threads=posix \ --disable-libmudflap \ --disable-libssp \ --disable-libgomp \ --with-gmp=${CROSS_HOST_LIB} \ --with-mpfr=${CROSS_HOST_LIB} \ make make install -glibcのコアができたので,それを使ってgccを作る -&color(Red){注意:glibcのコンパイルを行った後は,gccのコンパイル前に一度${CROSS}/${ARM_TARGET}/libを削除すること}; --gccはconfigure時に${CROSS}/lib内のglibcを${CROSS}/${ARM_TARGET}/libにコピーする --このコピーを行うかどうかは,${CROSS}/${ARM_TARGET}のディレクトリが存在しているかどうかに依存している. --このため,glibcをコンパイルしても,${CROSS}/${ARM_TARGET}/libを消しておかないと,新しいglibcがgccのコンパイルに使用されない * 8. glibcの作成 その2 [#qcc83a49] -基本的に6と同じ -make時のgnulib=-lgccをはずしてmake * 9. glibc作成用gcc その3 [#c87dea26] -もう一度7と同様にしてgcc を作成する -gccのコンパイル前に一度${CROSS}/${ARM_TARGET}/libを削除すること * 10. glibcの作成 その3 [#h969778a] -もう一度8と同様にしてglibc を作成する * 11. GCCの作成 [#eb6861b1] -そのまま続けると次のmake時にCFLAGSが変わったと怒られるのであらかじめワーキングディレクトリをきれいにしておく rm -rf ./ CFLAGS="-O2 -static" \ ../configure \ --prefix=${CROSS} \ --enable-languages=c,c++,fortran \ --target=${ARM_TARGET} \ --enable-threads=posix \ --with-headers=${CROSS}/include \ --with-libs=${CROSS}/lib \ --with-gmp-include=${CROSS_HOST_LIB}/include \ --with-gmp-lib=${CROSS_HOST_LIB}/lib \ --with-mpfr-include=${CROSS_HOST_LIB}/include \ --with-mpfr-lib=${CROSS_HOST_LIB}/lib \ make make install -最初のCFLAGS(-static)は,fortranのconfigureでうまくgmpをロードしてくれないため --システムにgmp,mpfrをインストールしてしまえば多分大丈夫 --${CROSS_HOST_LIB}/lib 以下のmpfr/gmp.so を全部消してしまっても多分いける *使用プログラムのバージョンおよび備考 [#u22bee85] **20100331 [#e5f80823] -binutils-2.20.1 -gcc-4.4.3 -glibc-2.11.1 -gmp-4.3.2 -mpfr-2.4.2 -kernel-headers-2.6.31.5-122.fc12.armv5tel.rpm (文責:くらた)