純粋にコンパイラの構成に興味が出てきたので挑戦。 低レイヤを知りたい人のためのCコンパイラ作成入門 を参考にしてみようと思う。
ターゲットはせっかくなので RISC-V (64bit)。
環境構築
Ubuntu 18.04
先日リリースされた 19.04 を入れてみていたが、壊れていたので再インストール。
ツールチェイン
1回ビルドしてみたけど長くて少し懲りた。
$ apt search riscv
で、 gcc-8-riscv64-linux-gnu
やら g++-8-riscv64-linux-gnu
が見つかるのでインストールした。
エミュレータ
QEMU の公式 から、最新の 4.0.0 のソースを落としてきてビルドした。
Linux イメージ
エミュレータで動かす Linux イメージを調達する。 QEMU の Wiki に、Fedora を動かす方法が詳しくかいてあったのでイメージをダウンロードし、起動用コマンドラインをコピペした。
Welcome to Fedora 28 (Rawhide)!
動いた。ユーザー root, PW riscv でログインできた。
整数1つを返すプログラム
まずはクロスビルド環境が動いているか確認したい。
参考サイト における「整数1個をコンパイルする言語」の出力となるようなシンプルなプログラムを動かしてみる。
適当な .c
をコンパイルした結果や、RISC-V 原典の Hello, World を見比べながら下のようなアセンブリを書いた。
.global main main: li a0, 42 ret
クロスビルドする。
$ riscv64-linux-gnu-gcc-8 single_int.s -o single_int
QEMU の中に転送する。
$ scp -P10000 single_int root@localhost:single_int
QEMU 内で実行する。
[root@stage4 ~]# ./single_int [root@stage4 ~]# echo $? 42
OS に返り値を渡すことに成功した。