-
Notifications
You must be signed in to change notification settings - Fork 31
gcc arm
Ryota Shioya edited this page Mar 24, 2022
·
2 revisions
- 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など)で実行している
以下の作業はbashで行うこと。cshだとこのままのコマンドでは動かない場合がある。
.rcの名前でファイル作成
#
# .rc
# ARM Cross compile environment
#
CROSS=/opt/arm-cross
export PATH=${CROSS}/bin:${PATH}
export CROSS_HOST_LIB=${CROSS}/host-lib
export ARM_HOST=arm-unknown-linux-gnu
export ARM_TARGET=arm-unknown-linux-gnu
上記のファイルを以下のようにして読み込んでおく
source ./.rc
${CROSS}以下にインストールを行うものとする
mkdir ${CROSS} -p
rpm2cpio kernel-headers-2.6.31.5-122.fc12.armv5tel.rpm | cpio --extract --make-directories
chmod 755 -R usr
mkdir ${CROSS}/${ARM_TARGET}/include -p
cp -a usr/include/ ${CROSS}/${ARM_TARGET}/
- カーネルソース内のヘッダの位置はディストリビューションによってかわるかもしれず
- シンボリックリンクが含まれているので,展開時は上記のようにrpm用コマンドで展開する
../configure \
--target=${ARM_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
AR=arm-unknown-linux-gnu-ar \
RANLIB=arm-unknown-linux-gnu-ranlib \
CC=gcc \
libc_cv_mlong_double_128=yes \
../configure \
--prefix=${CROSS} \
--host=${ARM_TARGET} \
--with-headers=${CROSS}/${ARM_TARGET}/include \
--with-binutils=${CROSS}/${ARM_TARGET}/bin \
--enable-add-ons \
--disable-sanity-checks \
--disable-versioning \
--disable-profile \
--with-tls
make install-headers
-
CCがgccになっているのは間違いではない
- ヘッダしか作らないからホストの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
* これを忘れると動かない
- 双方はホスト側の環境に入れる必要がある
- クロスコンパイラ内部で使用するためであり,ターゲットでリンクするためではない
../configure \
--prefix=${CROSS_HOST_LIB} \
make
make install
../configure \
--prefix=${CROSS_HOST_LIB} \
--with-gmp=${CROSS_HOST_LIB} \
make
make install
../configure \
--prefix=${CROSS} \
--target=${ARM_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すべし
CC=arm-unknown-linux-gnu-gcc \
AR=arm-unknown-linux-gnu-ar \
RANLIB=arm-unknown-linux-gnu-ranlib \
ac_cv_type_long_double=no \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes \
../configure --prefix=${CROSS} \
--host=${ARM_TARGET} \
--with-headers=${CROSS}/${ARM_TARGET}/include \
--disable-sanity-checks \
--with-tls \
--with-__thread \
--enable-thread \
--enable-add-ons \
--enable-kernel=2.6.31
make gnulib=-lgcc
make install
- 最後まで通らなくても一回installする
- この段階ではglibcのコアだけ出来ていれば良い
rm ${CROSS}/${ARM_TARGET}/lib -f -r
../configure \
--prefix=${CROSS} \
--target=${ARM_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}/${ARM_TARGET}/libを削除すること};
- gccはconfigure時に${CROSS}/lib内のglibcを${CROSS}/${ARM_TARGET}/libにコピーする
- このコピーを行うかどうかは,${CROSS}/${ARM_TARGET}のディレクトリが存在しているかどうかに依存している.
- このため,glibcをコンパイルしても,${CROSS}/${ARM_TARGET}/libを消しておかないと,新しいglibcがgccのコンパイルに使用されない
- 基本的に6と同じ
- make時のgnulib=-lgccをはずしてmake
- もう一度7と同様にしてgcc を作成する
- gccのコンパイル前に一度${CROSS}/${ARM_TARGET}/libを削除すること
- もう一度8と同様にしてglibc を作成する
- そのまま続けると次のmake時にCFLAGSが変わったと怒られるのであらかじめワーキングディレクトリをきれいにしておく
rm -rf ./
CFLAGS="-O2 -static" \
../configure \
--prefix=${CROSS} \
--enable-languages=c,c++,fortran \
--target=${ARM_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 を全部消してしまっても多分いける
- binutils-2.20.1
- gcc-4.4.3
- glibc-2.11.1
- gmp-4.3.2
- mpfr-2.4.2
- kernel-headers-2.6.31.5-122.fc12.armv5tel.rpm
(文責:くらた)