以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/04/27/040000より取得しました。


RISC-V 命令セットシミュレータ Whisperを試す (3. LLVMでビルドしたバイナリを試す)

いろいろ調査して、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':



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/04/27/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14