久しぶりにQEMUで遊んでいたのだけれども、RISC-V版のユーザモードQEMU(qemu-riscv64)で遊んでいると、どうもファイルの読み書きができないっぽい?
追記:これはlinux版gccでビルドするとうまくいくことが分かった。
riscv64-unknown-linux-gnu-gcc -static writeout.cpp -o writeout # staticも追記する必要がある
writeout.cpp
#include <iostream> #include <fstream> #include <string> int main () { std::cout << "Hello world\n"; std::ofstream write_fp; std::string filename = "sample.txt"; write_fp.open(filename, std::ios::out); std::string writing_text = "Hello World"; write_fp << writing_text << std::endl; write_fp.close(); return 0; }
$ riscv64-unknown-elf-g++ writeout.cpp -o writeout $ qemu-riscv64 -cpu rv64 writeout Hello world # ただしsample.txtが生成されない
writeout_c.c
#include <stdio.h> #include <stdlib.h> int main() { FILE *write_fp; if ((write_fp = fopen("sample_c.txt", "w")) == NULL) { perror ("sample_c.txt"); } fprintf(write_fp, "Hello QEMU!!\n"); fclose(write_fp); return 0; }
$ riscv64-unknown-elf-g++ writeout_c.c -o writeout_c $ qemu-riscv64 -cpu rv64 writeout_c sample_c.txt: # sample_c.txtは生成されない
#include <stdio.h> #include <stdlib.h> #define MAX_LEN 100 int main() { FILE *read_fp; char line[MAX_LEN], *result; if ((read_fp = fopen("sample_c.txt", "r")) == NULL) { perror ("sample_c.txt"); exit(EXIT_FAILURE); } do { if ((result = fgets(line, MAX_LEN, read_fp)) != NULL) { printf("%s", line); } } while (!feof(read_fp)); fclose (read_fp); return 0; }
$ riscv64-unknown-elf-g++ read_c.c -o read_c $ qemu-riscv64 -cpu rv64 read_c sample_c.txt: # なにもひょうじされない $ spike pk read_c bbl loader Hello QEMU!! # Spikeの場合はファイルの読み込みができた