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
次にbinutilsとgccのソースをダウンロードしておきます。
以下、作業ディレクトリとして$HOMEにwork、そのwork内にソースのフォルダsrcと実行可能プログラムが置かれるcross、src内にビルド用の設定(makeファイルとか)を置くフォルダをそれぞれbinutils用とgcc用のそれぞれをbuild-binutils、build-gccというディレクトリを作っておきます。ついでに最終的なファイルが作られるフォルダcrossもwork内に作っておきます。その名前はcrossです。また、binutilsとgccのソースを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とかでカーネル作ってみたいので今度はそっちの環境も作ってみたいですね。わかんなかったら質問投げてください。極力答えます。あと、LLVMのgccで直接カーネルとかもコンパイルしてリンクしましたがちょっといかんかったみたいです。
そんなわけで
Aim TO Be A Kernel Hacker!!
近況
春休みなんでいろいろやろうと思ってたら案の定時間ないわけで。今日は寝ないで秋葉原行ってこようと思います!!!ライターとか工作系の機器が欲しいので下見ということで!!そういえば、なんと、今日は2月14日!!nanobiiさんの曲が出る日!!ヤッター ていうか5000兆円欲しい。欲しくない?