RISC-V GNU Toolchain 工具链安装问题解决(stdio.h 问题解决,pk fence.i 问题解决)

我的安装过程主要参照 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 .

终于成功!

相关推荐
华纳云IDC服务商3 分钟前
服务器Linux防火墙怎样实现访问控制
linux·运维·服务器
Viking_bird9 小时前
centos 7.5 + Hadoop 3.2.4 集群搭建
linux·运维·服务器·hadoop·centos
Lovyk12 小时前
基于 Ansible 与 Jinja2 模板的 LNMP 环境及 WordPress 自动化部署实践
linux·运维·服务器·自动化·ansible
知白守黑26713 小时前
Linux磁盘阵列
linux·运维·服务器
TPBoreas15 小时前
Jenkins启动端口修改失败查找日志
运维·服务器·jenkins
正在努力的小河17 小时前
Linux设备树简介
linux·运维·服务器
小张快跑。17 小时前
Tomcat下载、安装及配置详细教程
java·服务器·tomcat
没有不重的名么19 小时前
Tmux Xftp及Xshell的服务器使用方法
服务器·人工智能·深度学习·机器学习·ssh
wdxylb19 小时前
云原生俱乐部-杂谈1
服务器·云原生
赏点剩饭7781 天前
linux中的hostpath卷、nfs卷以及静态持久卷的区别
linux·运维·服务器