2013年10月15日火曜日

OS X Mountain Lion で i686-elf 向け GCC をビルドする

Xcode の Command Line Tools でインストールされる gcc コマンドは llvm-gcc なので、本当の GNU C Compiler ではありません。 Mac でクロスコンパイル用の GCC をビルドするためには、本物の gcc コマンドが必要です。
Mountain Lionユーザのためのクロスコンパイラビルド - Handwriting を読んでこの事実を知りました(それまで5回ぐらいクロスコンパイル用 GCC をビルドしようとして失敗していました)。

以下、ビルド手順メモ

ネイティブ用 GCC ビルド

クロスコンパイル用 GCC をビルドするための GCC をビルドします。A bare-metal x86-cross-compiler on Mountain Lion | The Intobooks や、そこからリンクされている Compiling gcc-4.7.1 on Mac OSX Lion が参考になりました。これらの記事の手順は僕の Mountain Lion でも使えました。

各種ソースコードのダウンロードと展開

$ cd ~
$ mkdir gcc-4.8.1
$ cd gcc-4.8.1
$ curl -O http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.1/gcc-4.8.1.tar.gz
$ curl -O http://ftp.tsukuba.wide.ad.jp/software/gmp/gmp-5.1.3.tar.gz
$ curl -O http://ftp.tsukuba.wide.ad.jp/software/mpfr/mpfr-3.1.2.tar.gz
$ curl -O http://ftp.tsukuba.wide.ad.jp/software/mpc/mpc-1.0.1.tar.gz
$ tar zxvf gcc-4.8.1.tar.gz
$ tar xzvf gmp-5.1.3.tar.gz 
$ tar xzvf mpfr-3.1.2.tar.gz
$ tar xzvf mpc-1.0.1.tar.gz

ビルドとインストール

ビルドするまえに環境変数 PATH の値をなるべくシンプルに調整するとミスがありません。PATHを調整し終えたらいざビルド。

GMP
$ mkdir gmp-build
$ cd gmp-build
$ ../gmp-5.1.3/configure --prefix=/Users/uchan/gcc-4.8.1/ --enable-cxx
$ make -j4
$ make install
$ cd ..

MPFR
$ mkdir mpfr-build
$ cd mpfr-build
$ ../mpfr-3.1.2/configure --prefix=/Users/uchan/gcc-4.8.1 --with-gmp=/Users/uchan/gcc-4.8.1
$ make -j4
$ make install
$ cd ..

MPC
$ mkdir mpc-build
$ cd mpc-build
$ ../mpc-1.0.1/configure --prefix=/Users/uchan/gcc-4.8.1 --with-gmp=/Users/uchan/gcc-4.8.1 --with-mpfr=/Users/uchan/gcc-4.8.1
$ make -j4
$ make install
$ cd ..

GCC
$ mkdir gcc-build
$ cd gcc-build
$ ../gcc-4.8.1/configure --prefix=/Users/uchan/gcc-4.8.1 --enable-checking=release --with-gmp=/Users/uchan/gcc-4.8.1 --with-mpfr=/Users/uchan/gcc-4.8.1 --with-mpc=/Users/uchan/gcc-4.8.1 --enable-languages=c,c++
$ make -j4
$ make install
$ cd ..

以上でクロスコンパイル用 GCC をビルドするためのネイティブ GCC が出来上がりました!(ややこしい(^^;

さて、やっとクロスコンパイル用 GCC のビルドです。まず PATH の調整など。先ほどビルドした GCC のパスと、クロスコンパイル用 GCC のパスも忘れず通します。GCC, GMP, MPFR, MPC のソースは先ほど展開したものを再利用します。
$ export PATH=$HOME/i686-elf-gcc-4.8.1/bin:$HOME/gcc-4.8.1/bin:$PATH
$ cd ~
$ mkdir i686-elf-gcc-4.8.1
$ cd i686-elf-gcc-4.8.1
$ mkdir src
$ cd src
$ ln -s ~/gcc-4.8.1/src/gcc-4.8.1 ./
$ ln -s ~/gcc-4.8.1/src/gmp-5.1.3 ./
$ ln -s ~/gcc-4.8.1/src/mpfr-3.1.2 ./
$ ln -s ~/gcc-4.8.1/src/mpc-1.0.1 ./

binutils
$ curl -O http://ftp.tsukuba.wide.ad.jp/software/binutils/releases/binutils-2.23.2.tar.bz2
$ tar xjvf binutils-2.23.2.tar.bz2
$ mkdir binutils-build
$ cd binutils-build
$ ../binutils-2.23.2/configure --prefix=/Users/uchan/i686-elf-gcc-4.8.1 --target=i686-elf
$ make -j4
$ make install
$ cd ..

GCC
$ mkdir gcc-build
$ cd gcc-build
$ ../gcc-4.8.1/configure --prefix=/Users/uchan/i686-elf-gcc-4.8.1 --target=i686-elf --enable-languages=c,c++ --without-headers
$ make -j4 all-gcc
$ make install-gcc

必要な configure オプションについては 開発環境(自作OS) - こうじのがく まとめ(自作OS、ホームページ作成) を参考にしました。
  • --without-headers : 自作 OS 開発には標準ヘッダファイルや標準ライブラリは要りませんので、これを指定しておきましょう。
make に all-gcc を指定するのが重要です。これを指定しないと make の途中でエラーが発生するかもしれません。(実際、 libstdc++ のビルドに失敗している様でした)

以上でクロスコンパイル用 GCC のインストールは完了です。やったね!

2013年10月11日金曜日

【自作OS】 Bookmarks

自作OSを作る上で参考になりそうなサイトを見つけたら追記していきます。主に個人用メモ。

起動処理,MBR

HDDの話 : CHS・LBAアドレスの話
MBR(Master Boot Recode)の構造 : MBRの何処に何が書いてあるか
Partition types : パーティションタイプのリスト

ATA in x86 RealMode (BIOS) : リアルモードでの BIOS の色々なお話。フロッピーの BPB に書かれている "Sectors per Track" や "Number of Heads" の値は「ほとんど常に間違っている」という記述に笑ってしまった(笑)
INT 13 Drive Type : BIOSは起動直後に DL レジスタにドライブ番号を格納してくれるというお話(でもこの番号は信頼性がない場合があり、MSのIPLは番号決め打ちしているという情報をいただいた)

Windows NT ブート処理とハード ディスクの制限 : MS公式サイト。Windows NT の IPL のディスク読み取り処理は BIOS int 0x13 にのみ依存することなどが書いてある

NASM

The Netwide Assembler: NASM : nasm の -f オプションに応じてビット数がデフォルトで設定されており、通常は明示的な BITS ディレクティブは必要ない。

ELF

Executable and Linkable Format - Wikipedia
ELF

リンカ ld

GNU リンカ LD の使い方
NASK環境からの解脱

building binutils

[Qemu-devel] [PATCH] configure: disable clang -Wstring-plus-int warning

メモリマップ

(AT)memorymap - OS-Wiki
Memory Map (x86) - OSDev Wiki

C++対応

C++ - OSDev Wiki

【自作OS】USBメモリからブートする

昨日あるチャットで自作OSの話題になったとき、最近のパソコンにはフロッピーが無い、USBメモリから起動できたらいいよね、という話が出ました。

気になったのでやってみました。


ブートセクタ - Wikipedia によれば、どんな起動デバイスでも BIOS は先頭 512 バイトを 0x7c00 番地に配置して実行してくれるらしい。

Hello World を表示する 512 バイトのバイナリを用意して、それを USB メモリの MBR に書き込んでしまえばいいはず。ちょうど良いことに「30日でできる! OS自作入門」の2日目3節で Hello World を表示するだけの 512 バイトのバイナリを作っていますので、これを利用することにしました。

MBR への書き込みには 【取り扱い注意】USB(メモリ)ブート関連ツール で紹介されている BOOTICE というツールを使いました。BOOTICE の画面で ProcessMBR → Restore MBR を選択し、上記の 512 バイトバイナリを選択すれば書き込めます。楽ちんだね!

壊れてもいい USB メモリを使ってくださいね!

で MBR への書き込みが完了した USB メモリをパソコンに刺して起動させれば、ほら! Hello World が出ました!