最近在搭建一个基于Renode的裸机仿真Demo,基于RISC-V指令集,自定义硬件及软件,无操作系统,因此需要编译RISC-V的工具链。
1. 源码下载
RISC-V GNU编译器工具链提供了两种构建模式,一种是通用的ELF/Newlib工具链,以及更加复杂的Linux-ELF/glibc工具链。本篇只针对我们自己使用的模式进行介绍。
2. 安装依赖项
在编译之前,我们需要安装一些依赖项,这些依赖项信息来自源码地址中的说明:
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
3. 编译riscv32-unknown-elf-gcc
按照我们的仿真要求,我们只需要编译riscv32-unknown-elf-gcc即可,为了节省空间,其他的都不需编译。我们使用的是32bit指令,且只做整数运算,因此配置命令如下:
./configure --prefix=/opt/riscv --disable-linux --with-arch=rv32i
关于RISC-V指令集配置选项,可以参考下图:
上图来自维基百科:https://en.wikipedia.org/wiki/RISC-V
更详细的说明可以参考RISC-V的标准文档,此处不赘述,主要本人也还在摸索期,等搞懂了再做分享:Specifications - RISC-V International
完成以上配置后,别忘了把安装目录加入环境变量:
echo "PATH=$PATH:/opt/riscv/bin" >> ~/.bashrc
source ~/.bashrc
接下来,进行漫长的编译:
make -j4
耐心等待编译完成后,执行riscv32-unkown-elf-gcc -v命令查询编译信息,结果如下,从中可以看到详细的配置信息。
进入工具链安装目录/opt/riscv/bin,可以看到有如下riscv32-unknown-elf-*系列组件:
4. 测试
编译一段简单的代码(此处我们用了一个汇编文件baremetal.s进行编译)进行测试:
riscv32-unknown-elf-gcc baremetal.s -ggdb -O0 -o image -ffreestanding -nostdlib
编译成功: