だいたい1348日前に更新最終更新日時: 2021-06-07 (月) 01:03:05 1348日前
現在の位置
FrontPage > ターゲット環境 > クロスコンパイラの構築方法 > gcc-alpha > 20090327
Table of Contents |
概要 †
必要なもの †
- binutils
- gcc
- glibc
- カーネルヘッダ
- gmp,mpfr
作業手順概要 †
- binutilsを作成
- glibcのヘッダだけ作成
- glibc構築用gccの作成(C言語のみ)
- glibcの構築
- glibc構築用gccの作成(C言語のみ)2回目
- glibcの構築
- glibc構築用gccの作成(C言語のみ)3回目
- glibcの構築
- フルgccの作成(すべての言語)
- glibcとgccはお互いに依存しているので,何回かに分けて無効オプションを外しながら構築を繰り返す必要がある
注意 †
- configure,makeを行う場合は,必ずソースがおいてあるディレクトリ以外で行うこと
- 文中では,ソース中にworkと言うディレクトリを掘り,そこからの相対パス(../configureなど)で実行している
1. 環境 †
以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。
1.1 環境変数の設定 †
.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 ディレクトリ作成 †
${CROSS}以下にインストールを行うものとする
mkdir ${CROSS} -p
2. カーネルヘッダの展開 †
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
- glibcコンパイル時に以下のファイルで怒られるので,カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
3. binutils作成 †
../configure \ --target=${ALPHA_TARGET} \ --prefix=${CROSS} \ --enable-64-bit-bfd
make make install
- intlがどーのこーのでエラーが出たら以下のオプションを追加
--disable-nls
- 以下のオプションはホストが32bitのとき用(64でも多分問題ない)
--enable-64-bit-bfd
- 追加のファイルコピー
mkdir ${CROSS}/include cp -v ../include/libiberty.h ${CROSS}/include
4. glibcのヘッダだけを作る †
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 \
- エラーの例:TLSサポートが無い
- gcc-4.3.3 /glibc-2.6.1 の組み合わせの場合,このページ最後の備考を参照
- makeは単独でたたく必要はなく,"make install-headers"だけでよい
- ファイルが足りないので仕上げ
- work中のbitsを参照
cp -v bits/stdio_lim.h ${CROSS}/include/bits mkdir ${CROSS}/include/gnu -p touch ${CROSS}/include/gnu/stubs.h
- これを忘れると動かない
- work中のbitsを参照
5. gcc(glibc作成用)の作成 †
5.1 gmp,mpfrの導入 †
- 双方はホスト側の環境に入れる必要がある
- クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない
gmp †
../configure \ --prefix=${CROSS_HOST_LIB} \
make make install
mpfr †
../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \
make make install
5.2 gcc の作成 †
../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の作成 †
パッチ †
- カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
${CROSS}/alpha-unknown-linux-gnu/include/linux/config.h
make †
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 †
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を作る
- 注意: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 †
- 基本的に6と同じ
- make時のgnulib=-lgccをはずしてmake
9. glibc作成用gcc その3 †
- もう一度7と同様にしてgcc を作成する
- gccのコンパイル前に一度${CROSS}/${ALPHA_TARGET}/libを削除すること
10. glibcの作成 その3 †
- もう一度8と同様にしてglibc を作成する
11. GCCの作成 †
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をもう一度作り直すとでないかも
使用プログラムのバージョンおよび備考 †
20070923 †
- 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 †
- 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 †
- 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` &&
(文責:しおや)
ツールボックス
メニュー
最新の20件
最新の20件
2022-12-31
2022-09-24
2022-01-26
2019-09-17
2019-07-11
2018-07-12
2018-05-09
2018-02-07
2017-10-27
2017-10-15
2017-05-01
2017-03-27
2015-12-24