花了两天,搭建了RISCV编译仿真环境,网上的资料非常多,这里主要记录一下安装流程,以及安装过程中遇到的问题。
关于这点网上的资料非常多,这里只罗列几条关键的下载代码
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev
git clone https://github.com/riscv/riscv-fesvr.git #克隆fesvr仓库
git clone --recursive https://github.com/riscv/riscv-tools.git
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
我在安装riscv-gnu-toolchain和riscv-tools这两个工具的时候,一直没搞清楚这两个工具之间的关系。这里根据我自己的理解,稍微说一下,其中,riscv-gnu-toolchain是编译环境,利用这个工具链对C文件进行编译,生成一个输出文件,riscv-tools是仿真工具,对前面的输出文件进行仿真。分别一前一后的安装这两个工具就好了,先装riscv-gnu-toolchain,再装riscv-tools。
git clone --recursive https://github.com/AFEI1100/Cores-SweRV-EL2.git
vim ~/.bashrc
export RISCV="/opt/riscv" #工具的安装链接
export PATH=$PATH:$RISCV/bin #该路径下为链接工具
:wq #保存退出
source ~/.bashrc
cd riscv-gnu-toolchain #克隆完成进入克隆下来的目录
mkdir build; cd build #创建并进入build文件夹
../configure --prefix=$RISCV --enable-multilib #检查环境并生成当前环境使用的Makefile
make #注意是make而不是make linux, make编译得到是我们最常用的unknown-elf-gcc等工具链,而make linux则是unknown-linux-gnu-gcc,整个make大概需要一个小时
cd riscv-fesvr #克隆完成进入克隆下来的目录
mkdir build && cd build #创建并进入build文件夹
../configure --prefix=$RISCV --target=riscv64-unknown-elf #检查环境并生成当前环境使用的Makefile,如果需要指定编译链的输出目录,就可以把R I S C V 改 为 相 应 目 录 或 者 配 置 RISCV改为相应目录或者配置RISCV改为相应目录或者配置RISCV环境变量为相应的目录。如果没有配置就默认为/bin --target=为你的编译链的路径
[sudo] make install #编译安装,[sudo]代表sudo可选,安装输出目录的读写全写的实际情况选择
cd riscv-tools
./build.sh
一般教程上是这样的流程,但是因为我在之前make gnu-toolchain中开启了–enable-multilib的选项,所以在这里使用build.sh进行构建时会在编译benchmark/dhrystone这个file的时候出现ld链接重复的问题,如果你在riscv-gnu-toolchain中了其他选项,有可能不会出错。当然为了绕开这个东西,我选择执行另一个
./build-spike-pk.sh
由于安装过程中遇到了写文件权限的问题,所以安装前面加入sudo,但又遇到了Please set the RISCV environment variable to your preferred install path问题,而echo $RISCV路径是存在的。
原因分析:echo $RISCV打印出来的是用户的环境变量,但是安装前加入sudo后,使用的root用户,而root用户没有设置RISCV这个环境变量。
解决的办法是:
su #切换到root
export RISCV=/opt/riscv
./build-spike-pk.sh
安装后的log如下所示:
Installing project riscv-pk
mkdir //opt/riscv/riscv64-unknown-elf/include/riscv-pk
mkdir //opt/riscv/riscv64-unknown-elf/lib/riscv-pk
RISC-V Toolchain installation completed!
至此,整个编译过程就结束了。
退出root权限,另外建立一个文件夹用于测试。
#include <stdio.h>
int main(void)
{
printf("Hello RISC-V!\n");
return 0;
}
编译执行的命令如下:
riscv64-unknown-elf-gcc -fno-builtin -o hello hello.c
#riscv64-unknown-elf-gcc -O3 -o hello hello.c
spike pk hello
采用riscv64-unknown-elf-gcc -O3 -o hello hello.c命令进行编译的时候,执行时会报错std::runtime_error what(): bad syscall。
解决方法是在编译的时候加上-fno-builtin选项,参考如下文献。
bbl loader
Hello World!
本文分下载工具、设置环境变量、编译环境、测试环境这四个步骤,记录了RISC-V编译和仿真环境搭建的方法,以及过程中遇到的问题。
下面列出来我认为比较好的几篇参考文献:
1、谨以此写下本人安装riscv的全过程 简单易懂!!(本人环境是在ubuntu18.04中)
2、Risc-V gcc 编译链编译安装,riscv-fesvr编译安装和spike的编译安装
3、RISCV编译环境搭建:riscv-gnu-toolchain和riscv-tools