SWEet

A Software Engineer Is Eating Technologies

自作OS入門の環境をOS Xで整える

動機

「30日でできる!OS自作入門」を読み実装しようと思ったところ、環境がwindows。おまけにアセンブラやビルド環境がWindows故、そのまま流用できませんでした。

そこで少し色々調べた結果、http://bttb.s1.valueserver.jp/wordpress/blog/2017/11/14/make-os1/ この方のブログが大変シンプルに纏まっており参考にさせていただくことにしました。 このブログの環境はLinuxなので大体は流用することができます。

1日、2日目の内容はアセンブラオンリーなので特に問題はなかったのですが3日目以降はC言語アセンブラをリンクしてビルドする必要がでてきます。 この際、OS Xだと少々一筋縄ではいかない問題がでてきます。

それがgccとldリンカです。OS Xに標準で入っているのは恐らくXcode-command-line-toolsを入れた時に一緒に入るgccです。 gccは別にいいのですがldはGNU ldではないため、リンカスクリプトを指定する-Tオプションがありません。

そこで、本はi386をターゲットにビルドしているのでi386のクロスコンパイル環境を構築することにしました。

以下にその際の手順を示します。

QEMU

brew install qemu

nasm

brew install nasm

i386-elf-gcc, gnu ld

ここからが少し長いです。 基本的に同じコマンドを実行すれば大丈夫なはずです(2018-5現在)

brew install gcc6

export CC=/usr/local/Cellar/gcc@6/6.4.0_2/bin/gcc-6 # ↑の手順でinstallしたGCCのパス
export LD=/usr/local/bin/gcc@6/6.4.0_2/bin/gcc-6

export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"

# binutilsのインストール
mkdir /tmp/src
cd /tmp/src
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz
tar xf binutils-2.28.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.28/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
sudo make all install 2>&1 | tee make.log

# libiconv最新版をインストールする
cd /tmp/src
curl -O https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xf libiconv-1.15.tar.g
cd libiconv-1.15
./configure -prefix=/usr/local
make
make install

# クロスコンパイラなGCCをビルド
cd /tmp/src
curl -O https://ftp.gnu.org/gnu/gcc/gcc-6.4.0/gcc-6.4.0.tar.gz
tar xf gcc-6.4.0.tar.gz
mkdir gcc-build
cd gcc-build
../gcc-6.4.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpfr=/usr/local --with-libiconv-prefix=/usr/local
make all-gcc 
make all-target-libgcc 
sudo make install-gcc 
sudo make install-target-libgcc

最終的な環境

テスト

以上の環境構築が終了した場合、

day4/harib01j 内で make run をするとそれっぽいosの画面がqemuで開くはずです。