現在の位置
diff プラグインを使用中
- 追加された行はこの色です。
- 削除された行はこの色です。
- ターゲット環境/クロスコンパイラの構築方法/gcc-alpha/20090327 へ行く。
- ターゲット環境/クロスコンパイラの構築方法/gcc-alpha/20090327 の差分を削除
*概要 [#kb585a3e]
**必要なもの [#g08870c0]
-binutils
-gcc
-glibc
-カーネルヘッダ
-gmp,mpfr
**作業手順概要 [#o203bac7]
+binutilsを作成
+glibcのヘッダだけ作成
+glibc構築用gccの作成(C言語のみ)
+glibcの構築
+glibc構築用gccの作成(C言語のみ)2回目
+glibcの構築
+glibc構築用gccの作成(C言語のみ)3回目
+glibcの構築
+フルgccの作成(すべての言語)
-glibcとgccはお互いに依存しているので,何回かに分けて無効オプションを外しながら構築を繰り返す必要がある
**注意 [#o4929584]
-configure,makeを行う場合は,必ずソースがおいてあるディレクトリ以外で行うこと
-文中では,ソース中にworkと言うディレクトリを掘り,そこからの相対パス(../configureなど)で実行している
* 1. 環境 [#rfc76f68]
以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。
** 1.1 環境変数の設定 [#cb2f74e9]
.rcの名前でファイル作成
#
# .rc
# ALPHA Cross compile environment
#
CROSS=/opt/alpha-cross
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コンパイル時に以下のファイルで怒られるので,カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
opt/{CROSS}/alpha-unknown-linux-gnu/include/linux/config.h
* 3. binutils作成 [#i10e7bec]
../configure \
--target=${ALPHA_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のヘッダだけを作る [#sf5651f3]
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でもかまわない
--クロス用gccはまだないので使えない
--configure/makeでエラーが出た場合,configureの先頭に以下を追加
---エラーの例:TLSサポートが無い
libc_cv_gcc___thread=yes \
libc_cv_z_relro=yes \
libc_cv_z_initfirst=yes \
libc_cv_z_nodlopen=yes \
libc_cv_z_nodelete=yes \
libc_cv_broken_alias_attribute=no \
libc_cv_broken_visibility_attribute=no \
libc_cv_visibility_attribute=yes \
libc_cv_initfini_array=yes \
libc_cv_asm_cfi_directives=yes \
libc_cv_asm_global_directive=.globl \
libc_cv_asm_previous_directive=yes \
libc_cv_asm_protected_directive=yes \
libc_cv_asm_set_directive=no \
libc_cv_asm_symver_directive=yes \
libc_cv_asm_type_prefix=@ \
libc_cv_asm_underscores=no \
libc_cv_asm_weak_directive=yes \
-gcc-4.3.3 /glibc-2.6.1 の組み合わせの場合,このページ最後の備考を参照
-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作成用)の作成 [#p5268317]
** 5.1 gmp,mpfrの導入 [#w38fa94f]
-双方はホスト側の環境に入れる必要がある
--クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない
-gmp
***gmp [#p589a7f2]
../configure \
--prefix=${CROSS_HOST_LIB} \
make
make install
-mpfr
***mpfr [#b45658b7]
../configure \
--prefix=${CROSS_HOST_LIB} \
--with-gmp=${CROSS_HOST_LIB} \
make
make install
** 5.2 gcc の作成 [#r8ed4815]
../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} \
make all-gcc
make install
-この時点で出来るgccはかなり不完全
--色々disableしてall-gccでコンパイルしないと通らない
-make install時にエラーが出るが気にしない
-前のステップのファイル追加コピーを忘れていると,エラーになる
--stubs.h等が足りないと言われる
--一度失敗するとファイルをそのあとでコピーしても失敗し続ける
--一度make distcleanすべし
* 6. glibcの作成 [#qe44fa8a]
** パッチ [#kfd3bc90]
-カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
${CROSS}/alpha-unknown-linux-gnu/include/linux/config.h
** make [#md6f4248]
CC=alpha-unknown-linux-gnu-gcc \
AR=alpha-unknown-linux-gnu-ar \
RANLIB=alpha-unknown-linux-gnu-ranlib \
ac_cv_type_long_double=no \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes \
../configure --prefix=${CROSS} \
--host=${ALPHA_TARGET} \
--with-headers=${CROSS}/${ALPHA_TARGET}/include \
--disable-sanity-checks \
--with-tls \
--with-__thread \
--enable-thread \
--enable-add-ons \
--enable-kernel=2.6.9
make gnulib=-lgcc
make install
-最後まで通らなくても一回installする
--この段階ではglibcのコアだけ出来ていれば良い
* 7. glibc作成用GCC その2 [#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 \
--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}/${ALPHA_TARGET}/libを削除すること};
--gccはconfigure時に${CROSS}/lib内のglibcを${CROSS}/${ALPHA_TARGET}/libにコピーする
--このコピーを行うかどうかは,${CROSS}/${ALPHA_TARGET}のディレクトリが存在しているかどうかに依存している.
--このため,glibcをコンパイルしても,${CROSS}/${ALPHA_TARGET}/libを消しておかないと,新しいglibcがgccのコンパイルに使用されない
* 8. glibcの作成 その2 [#a91bc7bd]
-基本的に6と同じ
-make時のgnulib=-lgccをはずしてmake
* 9. glibc作成用gcc その3 [#aa629240]
-もう一度7と同様にしてgcc を作成する
-gccのコンパイル前に一度${CROSS}/${ALPHA_TARGET}/libを削除すること
* 10. glibcの作成 その3 [#aa629240]
-もう一度8と同様にしてglibc を作成する
* 11. GCCの作成 [#v137d262]
CFLAGS="-O2 -static" \
../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]
**20070923 [#i04bb910]
-binutils-2.18
-gcc-4.2.1
-glibc-2.6.1
-gmp-4.2.1
-mpfr-2.2.1
-kernel-smp-devel-2.6.9-34.EC.alpha.rpm
**20080323 [#zf817dd9]
-binutils-2.18
-gcc-4.2.3
-glibc-2.6.1
-gmp-4.2.1
-mpfr-2.2.1
-kernel-smp-devel-2.6.9-34.EC.alpha.rpm
-glibc 2.7にはalphaでコンパイルが通らないバグがある
--PTR_MANGLEが定義されていない
--http://sourceware.org/bugzilla/show_bug.cgi?id=5216
**20090327 [#z563e892]
-binutils-2.18
-gcc-4.3.3
-glibc-2.6.1
-gmp-4.2.1
-mpfr-2.2.1
-kernel-smp-devel-2.6.9-34.EC.alpha.rpm
備考:
-gmp,mpfr をあらかじめ導入しておかないと,一回目のgcc作成に失敗するようになっていた
-glibc 2.8,2.9 だと,リンクに失敗する
-glibc ヘッダ生成時に,TLS がらみでエラーが出る
-- gcc 側の仕様変更のため,ファイルが見つからない
-- 以下のパッチを当てる
RCS file: /cvs/glibc/libc/configure.in,v
retrieving revision 1.468
diff -u -r1.468 configure.in
--- configure.in 17 Mar 2007 17:01:46 -0000 1.468
+++ configure.in 18 Mar 2007 20:35:03 -0000
@@ -912,7 +912,7 @@
# thing on a system that doesn't need fixincludes. (Not presently a problem.)
if test -n "$sysheaders"; then
ccheaders=`$CC -print-file-name=include`
- SYSINCLUDES="-nostdinc -isystem $ccheaders \
+ SYSINCLUDES="-nostdinc -isystem $ccheaders -isystem $ccheaders-fixed \
-isystem `echo $sysheaders | sed 's/:/ -isystem /g'`"
if test -n "$CXX"; then
cxxversion=`$CXX -dumpversion 2>&AS_MESSAGE_LOG_FD` &&
(文責:しおや)