软件环境-ubuntu20.03,在系统按照以下的命令安装riscv交叉编译工具
|
安装完成后执行编译命令,对nemu进行编译
make ARCH=riscv32-nemu ALL=dummy run |
结果出现以下的错误
cc1: error: ‘-march=rv32im zicsr’: unsupported isa subset ‘z’ |
谷歌搜索后发现,有人说是版本问题
Package gcc-riscv64-linux-gnu depends on gcc-10-riscv64-linux-gnu which is too old for the new binutils. GCC 10 gives an error: cc1: error: ‘-march=rv64imac_zicsr_zifencei’: unsupported ISA subset ‘z The cross compiler package needs a respin to match the new binutils. |
考虑应该是ubuntu20.03版本的软件版本老了,去github上直接拉取最新的riscv-gnu-toolchain
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git make linux |
make后发现下载的很慢,参考riscv-gnu-toolchain 交叉编译器如何构建? - 知乎
sudo apt-get install git autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf patchutils bc libexpat-dev libglib2.0-dev ninja-build zlib1g-dev pkg-config libboost-all-dev libtool libssl-dev libpixman-1-dev libpython-dev virtualenv libmount-dev libsdl2-dev cd riscv-gnu-toolchain git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc git clone https://gitee.com/mirrors/riscv-dejagnu git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc git clone https://gitee.com/mirrors/riscv-newlib git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb riscv-binutils git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb riscv-gdb ./configure --prefix=/opt/riscv make linux -j4 |
安装完成后,继续执行make ARCH=riscv32-nemu ALL=dummy run,结果还是有错误,将nemu目录/ysyx-workbench/abstract-machine/scripts/isa/riscv.h中的riscv64-linux-gnu修改为riscv64-unknown-linux-gnu再次执行编译指令,成功!
此外,可能出现的问题
/usr/riscv64-linux-gnu/include/bits/wordsize.h:28:3: error: #error "rv32i-based targets are not supported"
可以修改
--- /usr/riscv64-linux-gnu/include/bits/wordsize.h
+++ /usr/riscv64-linux-gnu/include/bits/wordsize.h
@@ -25,5 +25,5 @@
#if __riscv_xlen == 64
# define __WORDSIZE_TIME64_COMPAT32 1
#else
-# error "rv32i-based targets are not supported"
+# define __WORDSIZE_TIME64_COMPAT32 0
#endif
还有
/usr/riscv64-linux-gnu/include/gnu/stubs.h:8:11: fatal error: gnu/stubs-ilp32.h: No such file or directory
可以修改
--- /usr/riscv64-linux-gnu/include/gnu/stubs.h
+++ /usr/riscv64-linux-gnu/include/gnu/stubs.h
@@ -5,5 +5,5 @@
#include <bits/wordsize.h>
#if __WORDSIZE == 32 && defined __riscv_float_abi_soft
-# include <gnu/stubs-ilp32.h>
+//# include <gnu/stubs-ilp32.h>
#endif