魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

mipsクロスコンパイラ[gcc-mips]

投稿日:
タグ:

目次

gcc4.4.0でのmips用クロスコンパイラを作成した時のメモ.基本的に次のページを参考にしている.というか一部を除いてほぼその通り.

基本情報

ソースファイル

使用するソフトウェアとバージョンは次の通り.リンク先は皆ダウンロードページであり,ここで使用するものと同じバージョンがダウンロードできない場合がある.

使用したソフトウェア名前説明
gcc-4.4.0GNU Compiler CollectionGNUのコンパイラ群で,CやC++,FORTRAN,Objective-C,Javaなど様々な言語のコンパイラやライブラリを提供する.以前はCコンパイラだけを提供していて,GNU C Compiler(GCC)だった.
glibc-2.11GNU C LibraryGNUの標準Cライブラリ.
glibc-ports-2.11glibcのソース本体に入っていないいくつかのアーキテクチャ用のファイルが入っている.
binutils-2.22GNU binutilsアセンブラやリンカなど機械語を扱ういくつかのソフトウェア群.
linux-2.6.27.62Linux KernelLinuxのカーネル.いくつかのアーキテクチャ用のヘッダを持つ.
gmp-5.0.5GNU Multi-Precision Library多倍長整数など任意の精度の算術ライブラリ.
mpfr-3.1.1GNU Multiple Precision Floating-Point ReliablyGMPライブラリを使用する任意の精度の浮動小数点演算のためのポータブルライブラリ.

システム環境

クロスコンパイラを構築するために,3種類のシステム環境を考慮する必要がある.これは作成するクロスコンパイラの用途や環境に応じて設定する.以下に今回使用する設定を示す.

binutilsgccglibc
ビルドマシンx86_64-linuxx86_64-linuxx86_64-linux
ホストマシンx86_64-linuxx86_64-linuxmips-linux
ターゲットマシンmips-linuxmips-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コンパイルに使用する場所.
scriptsconfigureやmakeを実行するスクリプトファイルを配置.
srcダウンロードしたファイルを解凍したものを配置
src_originalダウンロードしたファイルを配置.
※ glibc-portsはglibcの中に解凍して名前をportsに変更.
MIPS用のライブラリを作成するのに必要なものがportsの中にあり,configureの引数で--enable-add-ons=portsを指定することで,glibcはそれを認識する.

ビルド

環境変数: 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
変数の用途は以下の通り.
変数名用途
TARGETMIPSクロスコンパイラ作成用の引数
PATHコンパイラやライブラリのインストール先のパス
LIB_HOSTホスト用のライブラリのパス
BUILD_DIRコンパイルを行うディレクトリのパス
SRC_DIRソースコードを配置したディレクトリのパス
LOG_DIRconfigureや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-gmpgmpのパスを指定.--with-gmp=$PATHと指定した場合,--with-gmp-include=$PATH/includeと--with-gmp-lib=$PATH/libとして扱われる.
--with-mpfrmpfrのパスを指定.--with-mpfr=$PATHと指定した場合,--with-mpfr-include=$PATH/includeと--with-mpfr-lib=$PATH/libとして扱われる.
--without-headers標準Cヘッダを使用しない.
--enable-languagesビルドするコンパイラやライブラリのプログラミング言語を指定.
--disable-libmudflapmudflapライブラリをビルドしない.
--disable-libsspsspライブラリをビルドしない.
--disable-threadsスレッド処理のサポートを無効にする.
--disable-shared共有ライブラリをビルドしない
--disable-multilib32/64ビットアーキテクチャ向けのライブラリを共存するサポートを無効にする.
--disable-biarch32ビットと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-tlsTLS(Thread local Storage)をサポートする.TLSとは,静的もしくは大域的なメモリをスレッドごとに局所的に使用するためのプログラミングの方法のこと.
--disable-sanity-checksgccとglibcのバージョンの依存関係を無視する.
--disable-versioningライブラリにバージョニング情報を入れない.
--disable-profileプロファイル情報を含めずにビルドする.
環境変数用途
ac_cv_type_long_doublelong double型に関する変数らしいが詳細は不明.ないとエラーになった.
libc_cv_forced_unwindyesの場合,unwindサポート機能のテストを省略し利用可能とする.
libc_cv_c_cleanupyesの場合,テストが省略され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-_threadTLSがサポートされている場合でも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という異なるオプションがある

一覧