完整的开发环境需要构建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 git@github.com: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
脚本进行临时修改