RISC-V GNU Toolchain 开发环境搭建Quickstart

完整的开发环境需要构建gcc、binutils、glibc等组件,以及qemu、gdb等辅助工具,他们都分布在不同的repo中。比起手动配置,一种更简单的方法是使用https://github.com/riscv-software-src/riscv-gnu-toolchain,其已通过submodule的方式引入好了这些组件。

0x00 环境配置

这里使用最常见的Ubuntu 20.04作为演示,其他环境可以参考riscv-gnu-toolchain中的README。

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

如果需要跑测试,还要安装expect软件包

然后clone该仓库:

git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain

如果你正在参与工具链中的开发/测试,你或许希望切换其中的一些组件到一些正在进行开发工作的下游仓库中,比如下面是一个切换riscv-gcc到https://github.com/WuSiYu/riscv-gcc仓库的例子:

cd riscv-gcc
git submodule update .   #如果未初始化submodule(该目录为空),则执行
git remote add wu [email protected]:WuSiYu/riscv-gcc.git
git remote update
git checkout --track wu/riscv-gcc-experiment   #切换到你需要的分支

其他组件同理

0x01 编译

在riscv-gnu-toolchain目录下使用./configure进行配置,详细参数含义可以参考./configure -h,multilib有时会导致问题,所以建议一次只编译一种架构,存放在不同的prefix里,一种保险的写法是:

./configure --prefix=/whatever/you/want/ --with-arch=<ARCH> --with-abi=<ABI> --with-multilib-generator="<ARCH>-<ABI>--"

替换<ARCH>为你需要的架构,如:rv32i、rv32gbk、rv64g

替换<ABI>为你需要且与架构匹配的ABI,如:ilp32、ilp32d、lp64d

然后执行make newlib编译newlib的工具链(裸机程序),或者执行make linux编译产生linux可执行文件的工具链。通常我们测试工具链的话使用newlib版就可以。

同时你或许希望记录时间、多核编译、记录输出,可以使用类似以下的指令:

time make newlib -j<YOUR_CPU_CORE_COUNT> 2>&1 | tee build.log

替换<YOUR_CPU_CORE_COUNT>为你的CPU线程数,比如你有一个10c20t的i9-10850k硅渣,就使用-j20

然后你就可以使用你编译出的工具链了,比如/whatever/you/want/bin/riscv64-unknown-elf-gcc

0x02 测试

使用类似如下的指令进行测试

make report-newlib SIM=qemu

SIM=表示使用的测试程序运行环境,可选的值有qemu、gdb、spike

备注:如果你使用qemu且需要自定义调用qemu程序时的命令行参数,可以编辑riscv-gnu-toolchain/scripts/wrapper/qemu/riscv64-unknown-elf-run脚本进行临时修改

作者:WuSiYu

学生,Web开发者,智能硬件&IOT爱好者

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注