現在の位置
backup プラグインを使用中
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- バックアップ を表示
- ターゲット環境/クロスコンパイラの構築方法/gcc-alpha へ行く。
*概要 [#kb585a3e] **必要なもの [#g08870c0] -binutils -gcc -glibc -カーネルヘッダ -gmp,mpfr,mpc **作業手順概要 [#o203bac7] +binutilsを作成 +glibcのヘッダだけ作成 +glibc構築用gccの作成(C言語のみ) +glibcの構築 +glibc構築用gccの作成(C言語のみ)2回目 +glibcの構築 +フルgccの作成(すべての言語) -glibcとgccはお互いに依存しているので,何回かに分けて無効オプションを外しながら構築を繰り返す必要がある **注意 [#o4929584] -configure,makeを行う場合は,必ずソースがおいてあるディレクトリ以外で行うこと -文中では,ソース中にworkと言うディレクトリを掘り,そこからの相対パス(../configureなど)で実行している * 1. 環境 [#rfc76f68] 以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。 ** 1.1 環境変数の設定 [#cb2f74e9] .rcの名前でファイル作成 # # .rc # ALPHA Cross compile environment # CROSS=/opt/gcc/alpha/4.5.3 export PATH=${CROSS}/bin:${PATH} export CROSS_HOST_LIB=${CROSS}/host-lib export ALPHA_HOST=alpha-unknown-linux-gnu export ALPHA_TARGET=alpha-unknown-linux-gnu 上記のファイルを以下のようにして読み込んでおく source ./.rc ** 1.2 ディレクトリ作成 [#d8bfb618] ${CROSS}以下にインストールを行うものとする mkdir ${CROSS} -p * 2. カーネルヘッダの展開 [#zdebdd89] rpm2cpio kernel-smp-devel-2.6.9-34.EC.alpha.rpm | cpio --extract --make-directories chmod 755 -R usr mkdir ${CROSS}/${ALPHA_TARGET}/include -p cp -a usr/src/kernels/2.6.9-34.EC-smp-alpha/include/ ${CROSS}/${ALPHA_TARGET}/ -カーネルソース内のヘッダの位置はディストリビューションによってかわるかもしれず -シンボリックリンクが含まれているので,展開時は上記のようにrpm用コマンドで展開する -上はCentOSの場合 -- glibcコンパイル時に以下のファイルで怒られるので,カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする ${CROSS}/alpha-unknown-linux-gnu/include/linux/config.h * 3. binutils作成 [#i10e7bec] **パッチ [#v1b7559c] makeinfo が新しすぎる場合,バージョンチェックではじかれるので修正 configure:6138 - | egrep 'texinfo[^0-9]*([1-3][0-9]|4\.[4-9]|[5-9])' >/dev/null 2>&1; + | egrep 'texinfo[^0-9]*(4\.([4-9]|[1-9][0-9])|[5-9]|[1-9][0-9])' >/dev/null 2>&1; then then **make [#t41a7fa0] ../configure \ --target=${ALPHA_TARGET} \ --prefix=${CROSS} \ --enable-64-bit-bfd \ --disable-werror make make install -&color(Red){追加のファイルコピー}; mkdir ${CROSS}/include cp -v ../include/libiberty.h ${CROSS}/include * 4 gmp,mpfr,mpcの導入 [#w38fa94f] -双方はホスト側の環境に入れる必要がある --クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない -gmp<-mpfr<-mpcで依存しているため,この順番でインストールする **gmp [#p589a7f2] ../configure \ --prefix=${CROSS_HOST_LIB} \ make make install **mpfr [#b45658b7] ../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \ make make install **mpc [#jac652ff] ../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \ make make install **共有ライブラリの削除 [#r4f7c4ed] -gmp,mpfr,mpc を導入した後,${CROSS_HOST_LIB}/lib/*.so を削除 --gcc が共有ライブラリのリンクに失敗するため * 5 glibc作成用GCC その1 [#r8ed4815] ../configure \ --prefix=${CROSS} \ --target=${ALPHA_TARGET} \ --without-headers \ --enable-languages=c \ --disable-libmudflap \ --disable-libssp \ --disable-threads \ --disable-shared \ --with-gmp=${CROSS_HOST_LIB} \ --with-mpfr=${CROSS_HOST_LIB} \ --with-mpc=${CROSS_HOST_LIB} \ make all-gcc make install-gcc -この時点で出来るgccはかなり不完全 --色々disableしてall-gccでコンパイルしないと通らない --glibc 抜きでごく基本的な機能のみある * 6. glibcのヘッダだけを作る [#sf5651f3] **作成 [#i7db5a6c] AR=alpha-unknown-linux-gnu-ar \ RANLIB=alpha-unknown-linux-gnu-ranlib \ CC=gcc \ libc_cv_mlong_double_128=yes \ ../configure \ --prefix=${CROSS} \ --host=${ALPHA_TARGET} \ --with-headers=${CROSS}/${ALPHA_TARGET}/include \ --with-binutils=${CROSS}/${ALPHA_TARGET}/bin \ --enable-add-ons \ --disable-sanity-checks \ --disable-versioning \ --disable-profile \ --with-tls \ make install-headers -CCが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 --これを忘れると動かない -最後まで通らなくても一回installする * 7. glibc作成用GCC その2 [#p5268317] **注意 [#z442aafc] -前のステップのファイル追加コピーを忘れていると,エラーになる --stubs.h等が足りないと言われる --一度失敗するとファイルをそのあとでコピーしても失敗し続ける --一度make distcleanすべし **makeの前に [#ib7bfe3c] -work の中を全部一回消す -make distclean では消えきらない場合がある **make [#fdeb900d] ../configure \ --prefix=${CROSS} \ --target=${ALPHA_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} \ --with-mpc=${CROSS_HOST_LIB} \ make all-gcc make all-target-libgcc make install-gcc make install-target-libgcc -libgcc を含んだgcc を作る --まだ不完全 * 8. glibcの作成 [#qe44fa8a] **makeの前に [#xba9f703] -work の中を全部一回消す -make distclean では消えきらない場合がある ** make [#md6f4248] ac_cv_type_long_double=no \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ ../configure --prefix=${CROSS} \ --host=${ALPHA_TARGET} \ --disable-sanity-checks \ make gnulib=-lgcc make install -最後まで通らなくても一回installする * 9. glibc作成用GCC その3 [#aa629240] rm ${CROSS}/${ALPHA_TARGET}/lib -f -r ../configure \ --prefix=${CROSS} \ --target=${ALPHA_TARGET} \ --with-headers=${CROSS}/include \ --with-libs=${CROSS}/lib \ --enable-languages=c \ --with-gmp=${CROSS_HOST_LIB} \ --with-mpfr=${CROSS_HOST_LIB} \ --with-mpc=${CROSS_HOST_LIB} \ make make install -glibcのコアができたので,それを使ってgccを作る -&color(Red){注意:glibcのコンパイルを行った後は,gccのコンパイル前に一度${CROSS}/${ALPHA_TARGET}/libを削除すること}; --gccはconfigure時に${CROSS}/lib内のglibcを${CROSS}/${ALPHA_TARGET}/libにコピーする --このコピーを行うかどうかは,${CROSS}/${ALPHA_TARGET}のディレクトリが存在しているかどうかに依存している. --このため,glibcをコンパイルしても,${CROSS}/${ALPHA_TARGET}/libを消しておかないと,新しいglibcがgccのコンパイルに使用されない * 10. glibcの作成 その2 [#a91bc7bd] -基本的に前回と同じだが,追加で付けていたオプションを外す **makeの前に [#o99f0e6e] -work の中を全部一回消す -make distclean では消えきらない場合がある ** make [#md6f4248] ac_cv_type_long_double=no \ ../configure --prefix=${CROSS} \ --host=${ALPHA_TARGET} \ --disable-sanity-checks \ make make install * 11. GCCの作成 [#v137d262] ../configure \ --prefix=${CROSS} \ --enable-languages=c,c++,fortran \ --target=${ALPHA_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 を全部消してしまっても多分いける -g++でhypotの二重定義エラーが出たら,以下のフラグを追加する ac_cv_func_hypot=no \ glibcxx_cv_func_hypot_use=no \ -一回そのままmake installしてしまって,glibcをもう一度作り直すとでないかも *使用プログラムのバージョンおよび備考 [#sf6b674f] **20110621 [#i04bb910] -kernel-smp-devel-2.6.9-34.EC.alpha.rpm -binutils-2.18 -gcc-4.5.3 -glibc-2.6.1 -gmp-5.0.2 -mpfr-3.0.1 -mpc-0.8.2 (文責:しおや)