読者です 読者をやめる 読者になる 読者になる

OS開発環境を整える with OS X Sierra

今回はOSの開発環境についていろいろ書きたいと思います。もう少し詳しく言うと、クロスコンパイラとbinutilsのビルドです。やってから結構時間がたってしまったのでもしかしたら途中で抜けてたりするかもしれませんが悪しからず。参考にしたのはOS Devです。いくつかOSを作ってみようっていうサイトがあるのですが、開発環境とかがとてもめんどくさかったり更新されてなかったり内容がありきたりで個人的に嫌いだったので、とりあえずOS Devにしました。

環境

OS X Sierra
・Homebrew

前準備

gccをインストールします。え?既にgcc入っているって?えぇ、入ってます。ですが、コンパイラの狭義のコンパイラの部分がLLVMというものが使われており、残念ながらOSDevではLLVMをサポートしておりません。なので、brewで新しくインストールします。

brew install gcc

次にbinutilsgccのソースをダウンロードしておきます。
以下、作業ディレクトリとして$HOMEにwork、そのwork内にソースのフォルダsrcと実行可能プログラムが置かれるcross、src内にビルド用の設定(makeファイルとか)を置くフォルダをそれぞれbinutils用とgcc用のそれぞれをbuild-binutils、build-gccというディレクトリを作っておきます。ついでに最終的なファイルが作られるフォルダcrossもwork内に作っておきます。その名前はcrossです。また、binutilsgccのソースをwork/srcに展開しておきます。

使うコンパイラの設定のために環境変数を設定します。

export CC=/usr/local/Cellar/gcc/6.3.0_1/c++-6
export CXX=/usr/local/Cellar/gcc/6.3.0_1/g++-6
export CPP=/usr/local/Cellar/gcc/6.3.0_1/cpp-6
export LD=/usr/local/Cellar/gcc/6.3.0_1/gcc-6

バージョンなどは適宜読み替えてください。cppとかはそのコンパイラの機能的に分割したものの一つです。(多分w)
また、他のちょっとしたディレクトリの設定として環境変数を追加しておきます。

export PREFIX="$HOME/work/cross"
export TARGET=i686-elf 
export PATH="$PREFIX/bin:$PATH"

前準備はこれで終わりです。

binutilsのビルド

まず、binutilsをbuildしたいと思います。binutilsというのはアセンブラとかオブジェクトファイルを取り扱うプログラム群です(適当)もともと入ってるbinutilsはそれぞれのプラットフォーム向けにbuildされています。なので、自分のターゲット向けに設定したうえでコンパイルします。

cd $HOME/work/src/build-binutils
cd build-binutils
../binutils-x.y.z/configure --prefix=$PREFIX \
--target=$TARGET \
--enable-interwork --enable-multilib \
--disable-nls --disable-werror
make
make install

以上でbinutilsのビルドは終わりです。

gccのビルド

そうしたら、gccのビルドです。

cd $HOME/work/src
which -- $TARGET-as || echo $TARGET-as is not in the PATH
cd build-gcc
../gcc-4.8.3/configure --prefix=$PREFIX \
--target=$TARGET \
--disable-nls \
--enable-languages=c,c++ --without-headers \
--enable-interwork --enable-multilib \
--with-gmp=/usr/local/opt/gmp \
--with-mpc=/usr/local/opt/mpc \
--with-mpfr=/usr/local/opt/mpfr
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc
--with-gmp=/usr/local/opt/gmp \
--with-mpc=/usr/local/opt/mpc \
--with-mpfr=/usr/local/opt/mpfr

configureのこの設定部分なのですが、これは先ほどインストールしたgccの-vオプションで見れるconfigureの設定を参照してください。無くてもできるような気もしますがやってないのでわかりません!!!
以上で終わりです。$HOME/work/cross/binにパスが通っているので

$TARGET-gcc -v

で情報が見られると思います。てかmakeでエラーが出なければ大丈夫だと思います。barebonesというチュートリアルで一度試した方がいいと思います。

そのほか思ったこと

1度build-inのgccコンパイルしたんですけど通るには通るのですが、ちゃんと動くプログラムはできなかったことを一応報告しておきます。また、最新のgccコンパイルしようとしましたがうまくいきませんでした。brew使った方がいいですね。クロスコンパイラをビルドするほうが簡単だと思いました。AdaとかDとかでカーネル作ってみたいので今度はそっちの環境も作ってみたいですね。わかんなかったら質問投げてください。極力答えます。あと、LLVMgccで直接カーネルとかもコンパイルしてリンクしましたがちょっといかんかったみたいです。
そんなわけで
Aim TO Be A Kernel Hacker!!

近況

春休みなんでいろいろやろうと思ってたら案の定時間ないわけで。今日は寝ないで秋葉原行ってこようと思います!!!ライターとか工作系の機器が欲しいので下見ということで!!そういえば、なんと、今日は2月14日!!nanobiiさんの曲が出る日!!ヤッター ていうか5000兆円欲しい。欲しくない?