mipsクロスコンパイラ[gcc-mips]
投稿日: | |
---|---|
タグ: |
目次
gcc4.4.0でのmips用クロスコンパイラを作成した時のメモ.基本的に次のページを参考にしている.というか一部を除いてほぼその通り.
基本情報
ソースファイル
使用するソフトウェアとバージョンは次の通り.リンク先は皆ダウンロードページであり,ここで使用するものと同じバージョンがダウンロードできない場合がある.
使用したソフトウェア | 名前 | 説明 |
---|---|---|
gcc-4.4.0 | GNU Compiler Collection | GNUのコンパイラ群で,CやC++,FORTRAN,Objective-C,Javaなど様々な言語のコンパイラやライブラリを提供する.以前はCコンパイラだけを提供していて,GNU C Compiler(GCC)だった. | glibc-2.11 | GNU C Library | GNUの標準Cライブラリ. | glibc-ports-2.11 | glibcのソース本体に入っていないいくつかのアーキテクチャ用のファイルが入っている. | binutils-2.22 | GNU binutils | アセンブラやリンカなど機械語を扱ういくつかのソフトウェア群. | linux-2.6.27.62 | Linux Kernel | Linuxのカーネル.いくつかのアーキテクチャ用のヘッダを持つ. | gmp-5.0.5 | GNU Multi-Precision Library | 多倍長整数など任意の精度の算術ライブラリ. | mpfr-3.1.1 | GNU Multiple Precision Floating-Point Reliably | GMPライブラリを使用する任意の精度の浮動小数点演算のためのポータブルライブラリ. |
システム環境
クロスコンパイラを構築するために,3種類のシステム環境を考慮する必要がある.これは作成するクロスコンパイラの用途や環境に応じて設定する.以下に今回使用する設定を示す.
binutils | gcc | glibc | |
---|---|---|---|
ビルドマシン | x86_64-linux | x86_64-linux | x86_64-linux |
ホストマシン | x86_64-linux | x86_64-linux | mips-linux |
ターゲットマシン | mips-linux | mips-linux | × |
- ビルドマシン
- クロスコンパイラを作るシステム環境
- ホストマシン
- 作成したプログラムやライブラリなどを実行または使用するシステム環境
- ターゲットマシン
- 作成したコンパイラやアセンブラなどが生成するコードのシステム環境
作業ディレクトリ
あまり意味はないが,環境変数を共用したりビルドするソフトウェアの数が多かったりするので,混乱を防ぐために作業環境を整理する.
user% pwd /home/user/00_workspace/cross user% ls * build: log: scripts: build-01-linux.sh build-04-rmso.sh build-07-glibc-header.sh build-10-glibc.sh build-common build-02-gmp.sh build-05-binutils.sh build-08-glibc.sh build-11-gcc.sh build-03-mpfr.sh build-06-gcc.sh build-09-gcc.sh build-12-glibc.sh src: binutils-2.22 gcc-4.4.0 glibc-2.11 gmp-5.0.5 linux-2.6.27.62 mpfr-3.1.1 src_original: binutils-2.22.tar.gz glibc-2.11.tar.gz gmp-5.0.5.tar.bz2 mpfr-3.1.1.tar.bz2 gcc-4.4.0.tar.bz2 glibc-ports-2.11.tar.gz linux-2.6.27.62.tar.bz2
ディレクトリ名 | 目的 |
---|---|
build | コンパイルに使用する場所. |
scripts | configureやmakeを実行するスクリプトファイルを配置. |
src | ダウンロードしたファイルを解凍したものを配置※. |
src_original | ダウンロードしたファイルを配置. |
ビルド
環境変数: build-common
今回引数として使用するものの一部を環境変数として定義する.
export PREFIX=$HOME/90_mypath/cross
export TARGET=mips-linux
export PATH=$PREFIX/bin:$PATH
export LIB_HOST=$PREFIX/lib_host
export BUILD_DIR=/home/user/00_workspace/cross/build
export SRC_DIR=/home/user/00_workspace/cross/src
export LOG_DIR=/home/user/00_workspace/cross/log
変数の用途は以下の通り.
変数名 | 用途 |
---|---|
TARGET | MIPSクロスコンパイラ作成用の引数 |
PATH | コンパイラやライブラリのインストール先のパス |
LIB_HOST | ホスト用のライブラリのパス |
BUILD_DIR | コンパイルを行うディレクトリのパス |
SRC_DIR | ソースコードを配置したディレクトリのパス |
LOG_DIR | configureやmakeの出力結果を記したファイルを配置したディレクトリのパス |
カーネルヘッダ: build-01-linux.sh
インストール先のディレクトリを作成し,MIPS向けや全てのCPUで共通するカーネルヘッダをそこにコピーする.
#!/usr/bin/zsh
. ./build-common
mkdir $PREFIX
cd $SRC_DIR/linux-2.6.27.62
make include/linux/version.h
mkdir $PREFIX/$TARGET/
cp -a include $PREFIX/$TARGET/.
cd $PREFIX/$TARGET/include
ln -s asm-mips asm
gmp : build-02-gmp.sh
(クロス)コンパイラが内部で使用する多倍長整数など任意の精度の算術ライブラリをコンパイルする.
#!/usr/bin/zsh
. ./build-common
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/gmp-5.0.5/configure --prefix=$LIB_HOST |& tee $LOG_DIR/build_02_configure.log
make |& tee $LOG_DIR/build_02_make.log
make install |& tee $LOG_DIR/build_02_make_install.log
mpfr : build-03-mpfr.sh
(クロス)コンパイラが内部で使用する任意の精度の浮動小数点演算のためのポータブルライブラリをコンパイルする.mpfrはgmpライブラリを使用するため,gmpの後にコンパイルしなければならない.
#!/usr/bin/zsh
. ./build-common
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/mpfr-3.1.1/configure --prefix=$LIB_HOST \
--with-gmp=$LIB_HOST |& tee $LOG_DIR/build_03_configure.log
make |& tee $LOG_DIR/build_03_make.log
make install |& tee $LOG_DIR/build_03_make_install.log
共有ライブラリの削除 : build-04-rmso.sh
ファイル名にbuildが付くが,処理内容はgmpとmpfrの共有ライブラリを削除するだけ.参考サイトによると共有ライブラリを使用しないように指定しても適用されないことがあるらしく,それを避けるために削除する.
#!/usr/bin/zsh
. ./build-common
rm $LIB_HOST/lib/*.so $LIB_HOST/lib/*.so.*
binutils : build-05-binutils.sh
MIPSクロスコンパイルのために使用するアセンブラやローダ,書庫作成ソフト,バイナリ解析などのソフトウェアをインストールする.
#!/usr/bin/zsh
. ./build-common
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/binutils-2.22/configure --target=$TARGET --prefix=$PREFIX |& tee $LOG_DIR/build_05_configure.log
make all |& tee $LOG_DIR/build_05_make.log
make install |& tee $LOG_DIR/build_05_make_install.log
mkdir $PREFIX/include
cp $SRC_DIR/binutils-2.22/include/libiberty.h $PREFIX/include/.
gccのコア部分のみ : build-06-gcc.sh
gccのコンパイラ部分のみをビルドする.ライブラリの生成などを無効にしないと,エラーが発生する.
#!/bin/sh
. ./build-common
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/gcc-4.4.0/configure --target=$TARGET --prefix=$PREFIX \
--without-headers --enable-languages=c \
--disable-libmudflap --disable-libssp --disable-threads --disable-shared \
--disable-multilib --disable-biarch \
--with-gmp=$LIB_HOST --with-mpfr=$LIB_HOST |& tee $LOG_DIR/build_06_configure.log
make all-gcc |& tee $LOG_DIR/build_06_make.log
make install-gcc |& tee $LOG_DIR/build_06_make_install.log
出来上がったコンパイラは,ライブラリや必要なオブジェクトがないので,このままではまともにコンパイルできない.オプションについての説明は以下の通り.
オプション | 説明 |
---|---|
--with-gmp | gmpのパスを指定.--with-gmp=$PATHと指定した場合,--with-gmp-include=$PATH/includeと--with-gmp-lib=$PATH/libとして扱われる. |
--with-mpfr | mpfrのパスを指定.--with-mpfr=$PATHと指定した場合,--with-mpfr-include=$PATH/includeと--with-mpfr-lib=$PATH/libとして扱われる. |
--without-headers | 標準Cヘッダを使用しない. |
--enable-languages | ビルドするコンパイラやライブラリのプログラミング言語を指定. |
--disable-libmudflap | mudflapライブラリをビルドしない. |
--disable-libssp | sspライブラリをビルドしない. |
--disable-threads | スレッド処理のサポートを無効にする. |
--disable-shared | 共有ライブラリをビルドしない |
--disable-multilib | 32/64ビットアーキテクチャ向けのライブラリを共存するサポートを無効にする. |
--disable-biarch | 32ビットと64ビットアーキテクチャのサポートらしいが詳細は不明. |
glibc Cライブラリヘッダ : build-07-glibc-header.sh
ターゲットマシン用の標準Cライブラリのヘッダを生成する.
#!/usr/bin/zsh
. ./build-common
export ac_cv_type_long_double=no
export libc_cv_forced_unwind=yes
export libc_cv_c_cleanup=yes
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/glibc-2.11/configure --host=$TARGET --prefix=$PREFIX \
--with-headers=$PREFIX/mips-linux/include --with-binutils=$PREFIX/mips-linux/bin \
--enable-add-ons=ports --with-tls --disable-sanity-checks \
--disable-versioning --disable-profile |& tee $LOG_DIR/build_07_configigure.log
make install-headers |& tee build_make.log
cp -v bits/stdio_lim.h $PREFIX/include/bits/.
mkdir -p $PREFIX/include/gnu
touch $PREFIX/include/gnu/stubs.h
configureのオプションの詳細は次の通り.
オプション | 説明 |
---|---|
--with-headers[=DIR] | システムヘッダが格納されているディレクトリのパスを指定. |
--with-binutils[=DIR] | binutils(asとld)が格納されているディレクトリのパスを指定. |
--enable-add-ons[=DIRS...] | 指定したディレクトリらもビルド対象とする. |
--with-tls | TLS(Thread local Storage)をサポートする.TLSとは,静的もしくは大域的なメモリをスレッドごとに局所的に使用するためのプログラミングの方法のこと. |
--disable-sanity-checks | gccとglibcのバージョンの依存関係を無視する. |
--disable-versioning | ライブラリにバージョニング情報を入れない. |
--disable-profile | プロファイル情報を含めずにビルドする. |
環境変数 | 用途 |
---|---|
ac_cv_type_long_double | long double型に関する変数らしいが詳細は不明.ないとエラーになった. |
libc_cv_forced_unwind | yesの場合,unwindサポート機能のテストを省略し利用可能とする. |
libc_cv_c_cleanup | yesの場合,テストが省略されCのクリーンアップハンドリングのサポートを有効にする. |
glibc ライブラリや必要なオブジェクト : build-08-glibc.sh
標準Cライブラリやスタートアップルーチンなどのオブジェクトをコンパイルする.作成するオブジェクトファイルは,プログラムの初期化やmain関数を呼び出す部分,プログラムを終了するコードを持つ.
#!/usr/bin/zsh
. ./build-common
export CC=mips-linux-gcc
export AR=mips-linux-ar
export RANLIB=mips-linux-ranlib
export ac_cv_type_long_double=no
export libc_cv_c_cleanup=yes
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/glibc-2.11/configure --host=$TARGET --prefix=$PREFIX \
--disable-sanity-checks --enable-kernel=2.6.27.62 --enable-add-ons=ports \
--with-tls --with-_thread --enable-thread |& tee $LOG_DIR/build_08_configure.log
make -k gnulib=-lgcc |& tee $LOG_DIR/build_08_make.log
make -k install |& tee $LOG_DIR/build_08_make_install.log
makeコマンドのkオプションを指定することで,可能な限りエラーが発生してもコンパイルを続ける.kオプションを指定せずにビルドを試みても良いが,私の環境では失敗した.うまくいけば$PATH/$TARGET/libにcrti.oやcrtn.o,crt0.oなどができているはずである.configureのオプションの詳細は次の通り.
オプション | 説明 |
---|---|
--with-_thread | TLSがサポートされている場合でもTLSを使用しない. |
--enable-thread | 詳細は不明.名前からするとスレッド関係のオプションっぽい. |
--enable-kernel | 互換性に関するオプション.指定したバージョン以降のカーネル向きにコンパイルする. |
環境変数 | 用途 |
---|---|
CC | コンパイルに使用するコンパイラを指定. |
AR | 静的ライブラリを作るために使用する圧縮ソフトを指定. |
RANLIB | 書庫のインデックスを作成するソフトを指定. |
GCC Cコンパイラのみ : glibc-09-gcc.sh
Cコンパイラとlibgccを生成する.libgccはgccが自動的にコードに付加するライブラリである.
#!/bin/sh
. ./build-common
rm -rf $BUILD_DIR/*
rm -rf $PREFIX/mips-linux/lib
rm -rf $PREFIX/mips-linux/sys-include
cd $BUILD_DIR
$SRC_DIR/gcc-4.4.0/configure --target=$TARGET --prefix=$PREFIX \
--with-headers=$PREFIX/include --enable-languages=c \
--disable-libmudflap --disable-libssp --disable-threads \
--disable-multilib --disable-biarch \
--with-gmp=$LIB_HOST --with-mpfr=$LIB_HOST |& tee $LOG_DIR/build_09_configure.log
make all-gcc |& tee $LOG_DIR/build_09_make1.log
make all-target-libgcc |& tee $LOG_DIR/build_09_make2.log
make install-gcc |& tee $LOG_DIR/build_09_make_install1.log
make install-target-libgcc |& tee $LOG_DIR/build_09_make_install2.log
基本的に前回のビルドと同じオプションだが,disable-sharedを外す.disable-sharedを外しておかないとgcc_ehとエラーになる.
glibc gccが使用するCライブラリをglibcへ(1) : build-10-glibc.sh
出来上がったコンパイラを使って完全なglibcをコンパイルする.
#!/usr/bin/zsh
. ./build-common
export ac_cv_type_long_double=no
export libc_cv_forced_unwind=yes
export libc_cv_c_cleanup=yes
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/glibc-2.11/configure --host=$TARGET --prefix=$PREFIX \
--disable-sanity-checks |& tee $LOG_DIR/build_10_configure.log
make |& tee $LOG_DIR/build_10_make.log
make install |& tee $LOG_DIR/build_10_make_install.log
gcc CとC++,fortranのコンパイラ : build-11-gcc.sh
完全なCコンパイラとglibcの標準Cライブラリを使用して,その他のライブラリやコンパイラを生成する.そのために,前回まで指定していた--disable-libから始まるオプションを外し,--enable-languagesに他の言語を追加する.
#!/bin/sh
. ./build-common
rm -rf $BUILD_DIR/*
rm -rf $PREFIX/mips-linux/lib
rm -rf $PREFIX/mips-linux/sys-include
cd $BUILD_DIR
$SRC_DIR/gcc-4.4.0/configure --target=$TARGET --prefix=$PREFIX \
--with-headers=$PREFIX/include --with-libs=$PREFIX/lib \
--enable-languages=c,c++,fortran \
--with-gmp=$LIB_HOST --with-mpfr=$LIB_HOST |& tee $LOG_DIR/build_11_configure.log
make |& tee $LOG_DIR/build_11_make.log
make install |& tee $LOG_DIR/build_11_make_install.log
glibc gccが使用するCライブラリをglibcへ(2) : build-12-glibc.sh
コンパイラが変更されたので,もう一度glibcをコンパイルする.これにより新しいコンパイラに合わせて各種設定が変更される.configureに与える引数は同じだが,
#!/usr/bin/zsh
. ./build-common
export ac_cv_type_long_double=no
rm -rf $BUILD_DIR/*
cd $BUILD_DIR
$SRC_DIR/glibc-2.11/configure --host=$TARGET --prefix=$PREFIX \
--disable-sanity-checks |& tee $LOG_DIR/build_12_configure.log
make |& tee $LOG_DIR/build_12_make.log
make install |& tee $LOG_DIR/build_12_make_install.log
注意
作業中に実際に陥った問題を以下にメモ.
- --hostと--build,--targetについて.glibcとgccで指定が異なるので注意.
- gccのconfigureには--enable-threads,glibcのconfigureには--enable-threadという異なるオプションがある