🍙

Onikiri2をビルドして試す

2024/08/14に公開

Onikiri2 というプロセッサシミュレータがあります。
このプロセッサシミュレータを触る機会があったため、ビルドから動作確認までの手順をまとめました。

とは言っても、基本的には README.md や Wiki に従うだけです。

ビルド(Linuxを仮定)

git clone git@github.com:onikiri/onikiri2.git --recursive
cd onikiri2

2024/09/18 以下は修正されたようです

project/gcc/onikiri2 ディレクトリには Makefile が置いてあるのですが、この中の CXXFLAGS-Wno-deprecated-declarations を追加します。
これは、コード中で deprecated な std::unary_function が使われており、新しい g++(手元は 13.2.0)だとエラーになってしまうためです。

...
# Platform: linux
ifneq (,$(findstring Linux,$(HOST_TYPE)))
WORK_DIR = WorkLinux/
CXX = g++
- CXXFLAGS = -Wall -Werror -O2 -g -std=c++11 -DONIKIRI_DEBUG \
+ CXXFLAGS = -Wall -Werror -O2 -g -std=c++11 -DONIKIRI_DEBUG -Wno-deprecated-declarations \
        -I../../../src \
        -I../../../src/pch \
...

あとは make するだけです。project/gcc/onikiri2/a.out が生成されます。

(cd project/gcc && make -j$(nproc))

動作確認

benchmark/HelloWorld ディレクトリには "hello, world" を出力するための main.c および param.xml が置いてあります。
どうやら、onikiri2 のバイナリに param.xml を渡すことでシミュレーションを実行できるようです。

main.c のコンパイルには riscv64-unknown-linux-gnu-gcc が使われるため、パスが通っていることを確認しましょう。

(cd benchmark/HelloWorld && make && ../../project/gcc/onikiri2/a.out param.xml)

これで "hello, world" できるはずなのですが、RISC-V GCC(か glibc)のバージョンが当時と異なるせいか unknown syscall と言われてしまいました。

ひとまず src/Emu/RISCV64Linux/RISCV64LinuxSyscallConv.cpp に不足していた syscall (99, 278) を追加することで対処しました。

# ../../project/gcc/onikiri2/a.out param.xml
Onikiri Version 2.9000
Emulator ... initialized.
Resources ... initialized.
214 brk(0x0) = 89678
214 brk(0x8a170) = 8a170
96 set_tid_address(0x89750) = 3e8
99  = error 0
261 prlimit64(0, 3, 0x0, 0x7ffffffffeb0) = 0
78 readlinkat(-100, 0x64540="/proc/self/exe", 0x7fffffffee20="", 4096) = 0
278  = error 0
113 clock_gettime(1, 0x7ffffffffdb0) = 0
113 clock_gettime(1, 0x7ffffffffdb0) = 0
214 brk(0x0) = 8a170
214 brk(0xab170) = ab170
214 brk(0xac000) = ac000
226 mprotect(0x7f000, 0x3000, 0x1) = 0
79 fstatat(1, 0x64028="", 0x7ffffffffc40, 4096) = 0
64 write(1, 0x8a530, 13)hello, world
 = d
94 exit_group() = error 0

きちんと "hello, world" が出力されていますね。

Discussion