Skip to content

gcc alpha

Ryota Shioya edited this page Mar 24, 2022 · 2 revisions

dst/ターゲット環境/クロスコンパイラの構築方法/gcc-alpha.md

概要

必要なもの

  • binutils
  • gcc
  • glibc
  • カーネルヘッダ
  • gmp,mpfr,mpc
  • その他ツール
    • gcc, texinfo, m4, bison, gawk, rpm2cpio, gperf
    • これらは必ずあらかじめインストールしておくこと

作業手順概要

  1. binutilsを作成
  2. glibcのヘッダだけ作成
  3. glibc構築用gccの作成(C言語のみ)
  4. glibcの構築
  5. glibc構築用gccの作成(C言語のみ)2回目
  6. glibcの構築
  7. フル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

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 のあたりの指定は必要ない
  • &color(Red){追加のファイルコピー(必須)};
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 に失敗した場合はだめなので,なんとかする

ファイルのコピー

  • &color(Red){ファイルが足りないので仕上げ};
    • work中のbitsを参照
cp -v bits/stdio_lim.h ${CROSS}/include/bits
mkdir ${CROSS}/include/gnu -p
touch ${CROSS}/include/gnu/stubs.h
* これを忘れると動かないので注意

注意

  • awk 関連でエラーが出た場合,gawk が入っていないことが原因.gawk じゃないとダメなので,その場合はインストールする.

7. glibc作成用GCC その2

注意

  • 前のステップのファイル追加コピーを忘れていると,エラーになる
    • stubs.h等が足りないと言われる
    • 一度失敗するとファイルをそのあとでコピーしても失敗し続ける
    • 一度make distcleanすべし
  • &color(Red){注意: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

(文責:しおや)

Clone this wiki locally