FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Windows版RISC-V GCCのビルド方法(1. msys2環境でRISC-V 32bit向けGCCをビルドする)

RISC-VのMLで話題に挙がっていた、WindowsRISC-V GCCコンパイル方法をやってみた。 まだイマイチ洗練されていないようだが、バイナリ自体は作れるようだ。 環境にはmsys2を利用する。

RISC-V GCC for Windowsのビルド方法

msys2には、あらかじめ以下のライブラリとツールをインストールしておく。

pacman -Su msys2-runtime diffutils

参考にしたのは、以下のgithubリポジトリだ。

github.com

./build.shを利用する。

github.com

ただしこのままではコンパイルできない。自分向けにいくつか改造している。

diff --git a/src/compiler/build.sh b/src/compiler/build.sh
index 0edffaa..aa74063 100755
--- a/src/compiler/build.sh
+++ b/src/compiler/build.sh
@@ -5,37 +5,38 @@
 # XXX sudo for install?

 # XXX impossible to build statically linked binutils?
-# F32C_MAKEOPTIONS="LDFLAGS=-static"
+F32C_MAKEOPTIONS="LDFLAGS=-static"

-SUDO=sudo
+SUDO=
 MAKE=make

 MAKE_JOBS=2

-BINUTILS_SRC_DIR=~/github/riscv-binutils-gdb
-GCC_SRC_DIR=~/github/riscv-gcc
-F32C_SRC_DIR=~/github/f32c
+BINUTILS_SRC_DIR=~/work/riscv-binutils-gdb
+GCC_SRC_DIR=~/work/riscv-gcc
+F32C_SRC_DIR=~/work/f32c
 F32C_TOOLCHAIN_DST_DIR=~/f32c_toolchain
  • SUDOはmsys2には必要ない。
  • ソースファイルの場所とビルド後のツールの格納場所を指定する。
@@ -44,14 +45,17 @@ fi

 ${SUDO} mkdir -p ${F32C_TOOLCHAIN_DST_DIR}

-for TARGET_ARCH in riscv32 mips
+for TARGET_ARCH in riscv32
 do
-    for SRC_DIR in ${BINUTILS_SRC_DIR} ${GCC_SRC_DIR}
+    # for SRC_DIR in ${BINUTILS_SRC_DIR} ${GCC_SRC_DIR}
+    for SRC_DIR in ${GCC_SRC_DIR}
     do
        cd ${SRC_DIR}
        ${MAKE} distclean
        find . -name config.cache -exec rm {} \;
        ./configure --target=${TARGET_ARCH}-elf --enable-languages=c,c++ \
+        --build=x86_64-pc-msys2 \
                --prefix=${F32C_TOOLCHAIN_DST_DIR} \
                --mandir=${F32C_TOOLCHAIN_DST_DIR}/man \
                --infodir=${F32C_TOOLCHAIN_DST_DIR}/info \
  • mipsのビルドターゲットは不要
  • ビルドオプションに--build=x86_64-pc-msys2 \を追加する。

これで./build.shを実行してしばらく待っていると、しばらくして ~/f32c_toolchainにビルドツールが生成されていることが分かる。

msyksphinz@fixedesk MINGW64 ~
$ cd ~/f32c_toolchain/bin/

msyksphinz@fixedesk MINGW64 ~/f32c_toolchain/bin
$ ls
a.out                      riscv32-elf-gcc-7.0.1.exe   riscv32-elf-nm.exe       riscv64-elf-cpp.exe          riscv64-unknown-elf-cpp.exe
riscv32-elf-addr2line.exe  riscv32-elf-gcc-ar.exe      riscv32-elf-objcopy.exe  riscv64-elf-g++.exe          riscv64-unknown-elf-g++.exe
riscv32-elf-ar.exe         riscv32-elf-gcc-nm.exe      riscv32-elf-objdump.exe  riscv64-elf-gcc.exe          riscv64-unknown-elf-gcc.exe
riscv32-elf-as.exe         riscv32-elf-gcc-ranlib.exe  riscv32-elf-ranlib.exe   riscv64-elf-gcc-7.0.1.exe    riscv64-unknown-elf-gcc-7.0.1.exe
riscv32-elf-c++.exe        riscv32-elf-gcov.exe        riscv32-elf-readelf.exe  riscv64-elf-gcc-ar.exe       riscv64-unknown-elf-gcc-ar.exe
riscv32-elf-c++filt.exe    riscv32-elf-gcov-tool.exe   riscv32-elf-run.exe      riscv64-elf-gcc-nm.exe       riscv64-unknown-elf-gcc-nm.exe
riscv32-elf-cpp.exe        riscv32-elf-gdb.exe         riscv32-elf-size.exe     riscv64-elf-gcc-ranlib.exe   riscv64-unknown-elf-gcc-ranlib.exe
riscv32-elf-elfedit.exe    riscv32-elf-gprof.exe       riscv32-elf-strings.exe  riscv64-elf-gcov.exe         riscv64-unknown-elf-gcov.exe
riscv32-elf-g++.exe        riscv32-elf-ld.bfd.exe      riscv32-elf-strip.exe    riscv64-elf-gcov-tool.exe    riscv64-unknown-elf-gcov-tool.exe
riscv32-elf-gcc.exe        riscv32-elf-ld.exe          riscv64-elf-c++.exe      riscv64-unknown-elf-c++.exe

GCCのテストを行う

ためしに以下のようなプログラムを作って、きちんと命令が生成されるか確認する。 ライブラリなどは、とりあえず不要とした。

float add (float a, float b)
{
  return a + b;
}

コンパイルしてみる。

$ ~/f32c_toolchain/bin/riscv32-elf-gcc -c main.cpp
$ ~/f32c_toolchain/bin/riscv32-elf-objdump.exe -d main.o

main.o:     file format elf32-littleriscv


Disassembly of section .text:

00000000 <_Z3addff>:
   0:   1101                    addi    sp,sp,-32
   2:   ce22                    sw      s0,28(sp)
   4:   1000                    addi    s0,sp,32
   6:   fea42627                fsw     fa0,-20(s0)
   a:   feb42427                fsw     fa1,-24(s0)
   e:   fec42707                flw     fa4,-20(s0)
  12:   fe842787                flw     fa5,-24(s0)
  16:   00f777d3                fadd.s  fa5,fa4,fa5
  1a:   20f78553                fmv.s   fa0,fa5
  1e:   4472                    lw      s0,28(sp)
  20:   6105                    addi    sp,sp,32
  22:   8082                    ret

一応、コンパイルは出来ているようだ。ダンプ結果が何だか変だな。