我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客:RSIC-V工具链介绍及其安装教程 - 风正豪 (大佬的博客写的非常详细,唯一不足就是 sudo make linux -jxx
是全部小写。)
工具链前前后后我装了快5遍了,这篇博客主要是遇到的问题解决方案分享。
如果你要使用 spike & pk 模拟器
configure 的时候请务必加上如下选项!你也不想花40分钟重新编译吧。
shell
--with-arch=rv64gc_zifencei
再 make -jN 编译后,pk 编译时就不会出现 unrecognized fence.i 问题了,原理上简单来说大概是 pk 需要用到这条指令,但是这个指令所属的扩展默认不包含在 toolchain 里,所以需要手动加上。
参考:https://github.com/riscv-software-src/riscv-pk/issues/260
submodule 克隆失败
当然如果大家按照上面的博客中的虚拟机魔法配置方法修改上网后,克隆应该不会出问题。不过我自己采取更保险的方式是,根据根目录中的 .gitmodules 文件,在每个文件夹里分别手动克隆并切换分支 / 版本。(下面其中部分代码由于个人习惯我改为了 ssh 地址)
.gitmodules
[submodule "binutils"]
path = binutils
url = https://sourceware.org/git/binutils-gdb.git
branch = binutils-2_42-branch
[submodule "gcc"]
path = gcc
url = https://gcc.gnu.org/git/gcc.git
branch = releases/gcc-13
[submodule "glibc"]
path = glibc
url = https://sourceware.org/git/glibc.git
[submodule "dejagnu"]
path = dejagnu
url = https://git.savannah.gnu.org/git/dejagnu.git
branch = master
[submodule "newlib"]
path = newlib
url = https://sourceware.org/git/newlib-cygwin.git
branch = master
[submodule "gdb"]
path = gdb
url = https://sourceware.org/git/binutils-gdb.git
branch = gdb-14-branch
[submodule "qemu"]
path = qemu
url = https://gitlab.com/qemu-project/qemu.git
[submodule "musl"]
path = musl
url = https://git.musl-libc.org/git/musl
branch = master
[submodule "spike"]
path = spike
url = git@github.com:riscv-software-src/riscv-isa-sim.git
branch = master
[submodule "pk"]
path = pk
url = git@github.com:riscv-software-src/riscv-pk.git
branch = master
[submodule "llvm"]
path = llvm
url = git@github.com:llvm/llvm-project.git
branch = release/17.x
比如:
shell
cd pk
git clone git@github.com:riscv-software-src/riscv-pk.git
git checkout release/17.x
再根据官网版本号切换:
git
git reset --hard 2efabd3
最后执行 git submodule update --init
的时候其实相当于一个校验的过程。
stdio.h 找不到的问题
臭名昭著的问题。
其实本质原因在于我们用的不是自己编译安装的这个工具链,而是 ubuntu apt 下载的 gcc-riscv64-unknown-elf
,这个东西自从 ubuntu20 版本之后应该就有问题(头文件找不全)。可以通过 whereis riscv64-unknown-elf-gcc
查看我们使用工具链的优先级。
我们自己编译安装的工具链位于:/opt/riscv/bin
ubuntu apt 安装的工具链位于:/usr/bin
如图,这是我执行 riscv64-unknown-elf-gcc -v hello.c
时的部分输出信息:
正常来说 stdio.h 应该是在红框中的 /usr/riscv64-unknown-elf/include
里,但是 ubuntu 安装的时候缺少这个内容所以很多同学都遇到了这个工具链无法使用的问题。我们不要用它,用我们自己编译出来的 /opt/riscv/bin 里的工具链。只需要执行 sudo apt remove gcc-riscv64-unknown-elf
后重新打开窗口即可。
可以参考这个 issue 的讨论:stdio.h 头文件找不到 其中给出的另一种解决方式是使用另一款 ubuntu apt 安装的工具链:sudo apt install gcc-riscv64-linux-gnu
,其实这两种工具链我们的 riscv-gnu-toolchain 里面都有。
简单来说就是:
ubuntu 安装 newlib 工具链:sudo apt install gcc-riscv64-unknown-elf
用不了,报错 stdio.h 找不到
ubuntu 安装 linux 工具链:sudo apt install gcc-riscv64-linux-gnu
能用
但是我们自己编译的 riscv-gnu-toolchain 里面这两种都有,我建议要么就都用我们自己的,要么就只用 ubuntu 安装的 gcc-riscv64-linux-gnu
.
终于成功!