だいたい1348日前に更新最終更新日時: 2021-06-07 (月) 01:03:05 1348日前
現在の位置
FrontPage > ターゲット環境 > クロスコンパイラの構築方法 > gcc-alpha
Table of Contents |
概要 †
必要なもの †
- binutils
- gcc
- glibc
- カーネルヘッダ
- gmp,mpfr,mpc
- その他ツール
- gcc, texinfo, m4, bison, gawk, rpm2cpio, gperf
- これらは必ずあらかじめインストールしておくこと
作業手順概要 †
- binutilsを作成
- glibcのヘッダだけ作成
- glibc構築用gccの作成(C言語のみ)
- glibcの構築
- glibc構築用gccの作成(C言語のみ)2回目
- glibcの構築
- フルgccの作成(すべての言語)
- glibcとgccはお互いに依存しているので,何回かに分けて無効オプションを外しながら構築を繰り返す必要がある
注意 †
- configure,makeを行う場合は,必ずソースがおいてあるディレクトリ以外で行うこと
- 文中では,ソース中にworkと言うディレクトリを掘り,そこからの相対パス(../configureなど)で実行している
- 各ツールのバージョンはページ末尾にある作成例にあるものにきっちり合わせるのがコツ
- これらのツールはお互いに色々連動しているので,1つだけバージョンが違ったりするとトラブルの元になりやすい
1. 環境 †
以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。
1.1 環境変数の設定 †
.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 ディレクトリ作成 †
${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コンパイル時に以下のファイルで怒られるので,カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
${CROSS}/alpha-unknown-linux-gnu/include/linux/config.h
- glibcコンパイル時に以下のファイルで怒られるので,カーネル外でコンパイルしているかをチェックしている部分をコメントアウトする
3. binutils作成 †
パッチ †
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 †
LDFLAGS="-static" \ ../configure \ --target=${ALPHA_TARGET} \ --prefix=${CROSS} \ --enable-64-bit-bfd \ --disable-werror \ --disable-libtool \
make LDFLAGS="-static" make LDFLAGS="-all-static" make LDFLAGS="-all-static" install
- 明らかに LDFLAGS の指定方法はおかしいか,こうしないとスタティックリンクしてくれない
- スタティックリンクの必要がないのであれば,LDFLAGS と libtool のあたりの指定は必要ない
- 追加のファイルコピー(必須)
mkdir ${CROSS}/include cp -v ../include/libiberty.h ${CROSS}/include
注意 †
- 警告がエラー扱いされて失敗する場合,”--disable-werror" を configure につける
4 gmp,mpfr,mpcの導入 †
- 双方はホスト側の環境に入れる必要がある
- クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない
- gmp<-mpfr<-mpcで依存しているため,この順番でインストールする
gmp †
../configure \ --prefix=${CROSS_HOST_LIB} \
make make install
mpfr †
../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \
make make install
mpc †
../configure \ --prefix=${CROSS_HOST_LIB} \ --with-gmp=${CROSS_HOST_LIB} \
make make install
共有ライブラリの削除 †
- gmp,mpfr,mpc を導入した後,${CROSS_HOST_LIB}/lib/*.so を削除
- gcc が共有ライブラリのリンクに失敗するため
5 glibc作成用GCC その1 †
../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のヘッダだけを作る †
作成 †
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 install-headers
- makeは単独でたたく必要はなく,"make install-headers"だけでよい
- make は最後まで通らず途中で失敗しても,次のフェーズに進んで良い.
- ただし configure に失敗した場合はだめなので,なんとかする
ファイルのコピー †
- ファイルが足りないので仕上げ
- work中のbitsを参照
cp -v bits/stdio_lim.h ${CROSS}/include/bits mkdir ${CROSS}/include/gnu -p touch ${CROSS}/include/gnu/stubs.h
- これを忘れると動かないので注意
- work中のbitsを参照
注意 †
- awk 関連でエラーが出た場合,gawk が入っていないことが原因.gawk じゃないとダメなので,その場合はインストールする.
7. glibc作成用GCC その2 †
注意 †
- 前のステップのファイル追加コピーを忘れていると,エラーになる
- stubs.h等が足りないと言われる
- 一度失敗するとファイルをそのあとでコピーしても失敗し続ける
- 一度make distcleanすべし
- 注意:glibcのコンパイルを行った後は,gccのコンパイル前に一度${CROSS}/${ALPHA_TARGET} の lib と sys-include を削除すること
- gcc は configure 時に ${CROSS}/lib,inlclue 内の glibc を ${CROSS}/${ALPHA_TARGET}/lib, sys-include にコピーする
- このコピーを行うかどうかは,${CROSS}/${ALPHA_TARGET} 以下の lib, sys-include が存在しているかどうかに依存している.
- このため,glibcをコンパイルしても,${CROSS}/${ALPHA_TARGET}/lib, sys-include を消しておかないと,新しいglibcがgccのコンパイルに使用されない
makeの前に †
- work の中を全部一回消す
- make distclean では消えきらない場合がある
- sys-include も消しておく.
rm ${CROSS}/${ALPHA_TARGET}/lib -f -r rm ${CROSS}/${ALPHA_TARGET}/sys-include -f -r
make †
../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 install-gcc
8. glibcの作成 †
makeの前に †
- work の中を全部一回消す
- make distclean では消えきらない場合がある
make †
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 する
- '-k' を make につけて実行してみる
- work/csu/ 内に crti.o 等ができており,${CROSS}/lib 内にコピーされていれば OK
9. glibc作成用GCC その3 †
rm ${CROSS}/${ALPHA_TARGET}/lib -f -r
../configure \ --prefix=${CROSS} \ --target=${ALPHA_TARGET} \ --with-headers=${CROSS}/include \ --enable-languages=c \ --disable-libmudflap \ --disable-libssp \ --disable-threads \ --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
- glibc のスタートアップ部分ができたので,それを使って libgcc を作る
- disable-shared をはずしておかないと,glibc のリンク時に gcc_eh が無いためにエラーが出る.
10. glibcの作成 その2 †
- 基本的に前回と同じだが,追加で付けていたオプションを外す
makeの前に †
- work の中を全部一回消す
- make distclean では消えきらない場合がある
make †
ac_cv_type_long_double=no \ ../configure --prefix=${CROSS} \ --host=${ALPHA_TARGET} \ --disable-sanity-checks \
make make install
11. GCCの作成 †
LDFLAGS="-static" \ ../configure \ --prefix=${CROSS} \ --enable-languages=c,c++,fortran \ --target=${ALPHA_TARGET} \ --with-cpu=ev6 \ --with-tune=ev6 \ --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
- 21264 向けにデフォルトで ev6 を指定
- スタティックリンクで作るように
- g++でhypotの二重定義エラーが出たら,以下のフラグを追加する
ac_cv_func_hypot=no \ glibcxx_cv_func_hypot_use=no \
- 一回そのままmake installしてしまって,glibcをもう一度作り直すとでないかも
12. glibcの作成 †
- 基本的に前回と同じ
- 最終版 gcc で作り直す.
makeの前に †
- work の中を全部一回消す
- make distclean では消えきらない場合がある
make †
ac_cv_type_long_double=no \ ../configure --prefix=${CROSS} \ --enable-kernel=2.6.9 \ --host=${ALPHA_TARGET} \ --disable-sanity-checks \
- 鬼斬の Linux システムコール・エミュレータはカーネル 2.6.9 あたりを基準として実装されている
使用プログラムのバージョンおよび備考 †
20120612 †
- 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
- ホスト:ubuntu 12.04/gcc 4.6.3
20110621 †
- 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
- ホスト:ubuntu 11.04/gcc 4.5.2
(文責:しおや)
ツールボックス
メニュー
最新の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