RISC-V Linux内核编译报错extension zicsr required

背景

今天师弟问我一个问题,说Linux内核编译报错?我寻思是啥错呢,遂让师弟发来报错截图,只见:
在这里插入图片描述
满屏的extension zicsr required哇!
师弟的编译环境:Linux Kernel v5.4,GCC 12.3.0
按理来说编译器应该没有问题,网上搜索了下也没找到好方案。究竟是哪里的问题呢?

原因

(摘自新版本Linux内核KConfig文件)

Binutils-2.38 and GCC-12.1.0 bumped the default ISA spec to the newer 20191213 version, which moves some instructions from the I extension to the Zicsr and Zifencei extensions. This requires explicitly specifying Zicsr and Zifencei when binutils >= 2.38 or GCC >= 12.1.0. Zicsr and Zifencei are supported in binutils from version 2.36 onwards. To make life easier, and avoid forcing toolchains that default to a newer ISA spec to version 2.2, relax the check to binutils >= 2.36. For clang < 17 or GCC < 11.3.0, for which this is not possible or need special treatment, this is dealt with in TOOLCHAIN_NEEDS_OLD_ISA_SPEC.

原来是新版本的GCC编译器根据SPEC做了更改,将csr相关指令从基本指令集当中挪了出去,变成了zicsr拓展。而RV Linux内核涉及很多csr的指令,如果在编译时没有体现zicsr拓展,在编译时便会报错。

解决方案一:说到底,还是使用的Linux内核版本较老其Makefile没有适应新版本编译器的变化使用新版本Linux内核即可

尤其是网络上很多教程教我们使用git checkout v5.4,这个版本恰好还没适应变化,笔者在GCC 12.3下出现上图报错。更改为git checkout v6.8,即6.8版本,编译一切顺畅。

直接给师弟说了这种方法,顺利解决。但个人还是觉得不过瘾呐。万一就是要研究老版本Linux内核呢?总不能再去下一个旧版本编译器吧?

解决方案二我就是要用老版本的Linux内核,但是我的编译器版本较新!此时便需要自己手动修改march标志,在后面加上_zicsr_zifencei。怎么加呢?

参照新版本Linux的Makefile,我们需要对arch/riscv/Makefile这个文件修改下。
下以Linux 5.4.0内核为例,在riscv-march-*相关变量的最后,加一行riscv-march-y := $(riscv-march-y)_zicsr_zifencei即可。如图:

在这里插入图片描述
然后就可以丝滑编译啦!

尾声

想必搜到这篇文章的小盆友们都是要在QEMU跑Linux的吧,温馨提示:新版QEMU在跑RV时,需要手动加一个-bios default参数,不然会“卡死”在启动页面,连OpenSBI都出不来哦: )

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值