ubuntuでc言語のクロスコンパイラを作ろう
普段はcentosかfreebsdを使用しているのですが、osを自作するにあたりクロスコンパイラが必要になったので、ubuntuも使うことにしました。クロスコンパイラの構築に思いの外時間がかかったのでここに備忘録を残します。あと、rootになっておいてください。
1.必要なソースコードやパッケージ
sudo apt install -y
1.gccのソースコード(https://ftp.gnu.org/gnu/gcc/)
2.binutilsのソースコード(https://ftp.gnu.org/gnu/binutils/)
3.build-essential[makeコマンドをインストール]
4.bison(https://ftp.gnu.org/gnu/bison/)
5.flex(https://github.com/westes/flex/releases)
6.libgmp3-dev(https://ftp.gnu.org/gnu/gmp/)
7.libmpc-dev(https://ftp.gnu.org/gnu/mpc/)
8.libmpfr-dev(https://ftp.gnu.org/gnu/mpfr/)
9.texinfo(https://ftp.gnu.org/gnu/texinfo/)
10.libcloog-isl-dev(https://www.cloog.org)?
11.libisl-dev(http://isl.gforge.inria.fr)
12.gcc(パッケージのやつ)
13.g++(パッケージのやつ)
さすがubuntu。必要なツールのパッケージは殆ど揃ってますね。
ubuntuは1,2以外はすべてパッケージが用意されています(1,2は環境にチューニングされていると困るので自分でビルドします)。以上に記された名前のパッケージをインストールしてください。括弧はソースコードのURLを示しています。パッケージが無いときはこちらからソースコードをダウンロードしてビルド([1]tar -xvfで解凍[2]./configureをソースコードのディレクトリで実行[3]makeコマンドを実行[4]make installコマンドを実行)してください。
2. 環境変数を設定
export PREFIX="/usr/local"
export TARGET=x86_64-elf
export PATH=$PATH:$PREFIX/bin
PREFIX(コンパイラを呼び出すときに使用するアドレス(コンパイラが置かれるアドレス))
TARGET(コンパイラのバイナリを処理させる環境)
PATH(コンパイラのバイナリが置かれる場所。PATH:を忘れると変数が初期化されてしまうので気をつけてください)
TARGETに指定できる環境(他にもあります)
x86_64 : x86_64-elf
i386 : i386-elf
i686 : i686-elf
aarch : aarch64-elf
powerpc: powerpc-elf
3.binutilsのビルド
mv binutils-x.y.z /usr/local(PREFIXに指定したアドレス)
cd $PREFIX
mkdir build-binutils
cd build-binutils
../binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
make
make install
4.gccのビルド
mv gcc-x.y.z /usr/local(PREFIXに指定したアドレス)
cd $PREFIX
mkdir build-gcc
cd build-gcc
../gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc
5.クロスコンパイラの呼び出し
x86_64-elf-gcc
TARGETがi386のときはi386-elf-gccとなります。
先に設定しているので大方大丈夫だと思いますが上記のように"TARGET"+-gccの形で呼び出せないときは、
export PATH=$PATH:$PREFIX/bin
6.最後に
これでクロスコンパイラは用意できました。一般ヘッダはlinuxやbsdの場合はダウンロード出来ます。
8.参考文献
OSdev.org(一部内容を変更してお送りしました。)
ちょっとmemo
1.-Ttext org(それぞれ出力ファイルの bss、 data、 text セグメント に対して org を開始アドレスにする。 org は 16 進の整数でなければならない。)
2.-nostdlib