いろいろ調査して、Whisperで動かすためにはいろんなことが必要だとわかった。
- Whisperで動かすためには、基本的に
riscv64-unknown-elf-gxxでコンパイルする必要がある。どうにも、GitHubのページを調べて、これまでの経験からも、riscv64-unknown-elf-gccのコンパイルが前提とされるっぽい。
下記のCコードについて:
#include <stdio.h> int main(int argc, char **argv) { printf("Hello World\n"); if (argc > 1) { printf("%s\n", argv[1]); } return 0; }
- Baremetal GCC
riscv64-unknown-elf-gcc hello_world.c -o hello_world.bare.elf
- Linux GCC
riscv64-unknown-linux-gnu-gcc hello_world.c -o hello_world.linux.elf
Whisperでの動作を確認する。
- Baremetal GCC
whisper -t "./hello_world.bare.elf hoge" Hello World hoge
- Linux GCC
whisper -t "./hello_world.linux.elf hoge" Warning: Target program options or env vars present which requires the use of --newlib/--linux. Options ignored. Error: Failed stop: Hart 0: 16 consecutive illegal instructions Executed 45 instructions and retired 0 instruction in 0.00s 360000 inst/s hart=0
whisper --newlib -t "./hello_world.linux.elf hoge" Error: Failed stop: Hart 0: 16 consecutive illegal instructions Executed 45 instructions and retired 27 instructions in 0.00s 335820 inst/s hart=0
whisper --linux -t "./hello_world.linux.elf hoge" Error: Failed stop: Hart 0: 16 consecutive illegal instructions Executed 45 instructions and retired 27 instructions in 0.00s 298013 inst/s hart=0
同様に、SPEC2017でも同じことが言えそうだ。これまではLinux-GCCを使ってSPECをコンパイルしてきたけど、これはBaremetalでコンパイルすべきなのだろうか? すると、幾つかのオプションが必要になり、リンク時に失敗する。
/home/msyksphinz/riscv64//bin/riscv64-unknown-elf-gcc -std=c99 -c -o caretx.o -DSPEC -DNDEBUG -DPERL_CORE -I. -Idist/IO -Icpan/Time-HiRes -Icpan/HTML-Parser -Iext/re -Ispecrand -DDOUBLE_SLASHES_SPECIAL=0 -D_LARGE_FILES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -g -march=rv64gc -fno-unsafe-math-optimizations -fno-tree-loop-vectorize -DSPEC_LINUX_X64 --sysroot=/home/msyksphinz/riscv64-linux/sysroot -fno-strict-aliasing -I/home/msyksphinz/riscv64-linux/sysroot/usr/include -DSPEC_LP64 caretx.c
/home/msyksphinz/riscv64//bin/riscv64-unknown-elf-gcc -std=c99 -z muldefs -g -march=rv64gc -fno-unsafe-math-optimizations -fno-tree-loop-vectorize -DSPEC_LINUX_X64 --sysroot=/home/msyksphinz/riscv64-linux/sysroot -fno-strict-aliasing -I/home/msyksphinz/riscv64-lin ux/sysroot/usr/include av.o caretx.o deb.o doio.o doop.o dump.o globals.o gv.o hv.o keywords.o locale.o mg.o numeric.o op.o pad.o perl.o perlapi.o perlio.o perlmain.o perly.o pp.o pp_ctl.o pp_hot.o pp_pack.o pp_sort.o pp_sys.o regcomp.o regexec.o run.o scope.o sv.o ta int.o toke.o universal.o utf8.o util.o reentr.o mro_core.o mathoms.o specrand/specrand.o dist/PathTools/Cwd.o dist/Data-Dumper/Dumper.o ext/Devel-Peek/Peek.o cpan/Digest-MD5/MD5.o cpan/Digest-SHA/SHA.o DynaLoader.o dist/IO/IO.o dist/IO/poll.o cpan/MIME-Base64/Base64.o Opcode.o dist/Storable/Storable.o ext/Sys-Hostname/Hostname.o cpan/Time-HiRes/HiRes.o ext/XS-Typemap/stdio.o ext/attributes/attributes.o cpan/HTML-Parser/Parser.o ext/mro/mro.o ext/re/re.o ext/re/re_comp.o ext/re/re_exec.o ext/arybase/arybase.o ext/PerlIO-scalar/scal ar.o ext/PerlIO-via/via.o ext/File-Glob/bsd_glob.o ext/File-Glob/Glob.o ext/Hash-Util/Util.o ext/Hash-Util-FieldHash/FieldHash.o ext/Tie-Hash-NamedCapture/NamedCapture.o cpan/Scalar-List-Utils/ListUtil.o -lm -o perlbench_s /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: av.o: in function `S_is_safe_syscall': /home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/inline.h:309: undefined reference to `__errno_location' /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: caretx.o: in function `S_is_safe_syscall': /home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/inline.h:309: undefined reference to `__errno_location' /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: deb.o: in function `S_is_safe_syscall': /home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/inline.h:309: undefined reference to `__errno_location' /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: doio.o: in function `S_is_safe_syscall': /home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/inline.h:309: undefined reference to `__errno_location' /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: doio.o: in function `Perl_do_open6': /home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/doio.c:302: undefined reference to `__errno_location' /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: doio.o:/home/msyksphinz/work/spec2017/spec2017_gcc_riscv64/benchspec/CPU/600.perlbench_s/build/build_base_mytest-m64.0000/doio.c:396: more undefined references to `__errno_loca tion' follow /home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/11.1.0/../../../../riscv64-unknown-elf/bin/ld: doio.o: in function `Perl_do_open6':