rsp

C コンパイラをつくってみる (1)

純粋にコンパイラの構成に興味が出てきたので挑戦。 低レイヤを知りたい人のための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 に返り値を渡すことに成功した。

次回 (2)

参考文献