RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

编译环境搭建以及说明

操作系统:什么系统都可以
虚拟机:VMmare Workstation Pro 17.50.x (版本不限)
编译环境:Ubuntu 18.04.5 
CPU:i7-8750h(虚拟机分配4核8线程,基频2.2GHz,睿频3.9GHz) 
RAM:32GB(虚拟机分配10GB,3G以上均可)
梯子:这里由于有些地方无法访问github,这里最好在 Linux 系统中搭建梯子,这样以确保成功下载
  • 建议有条件可以直接装Linux系统,虚拟机有很大的性能损失。如果使用虚拟机,建议分配足够多的RAM内存

  • 推荐搭建科学合理的上网方式,在git clone tool-gnu-chain这个库的时候,有几个submodule如果网络状态不好,下载速度会以kb状态,并以fatal error收尾(在尝试过6个上网工具之后的感受)

  • 编译riscv-gnu-toolchain和riscv-tools的顺序不能变,否则会在之后报错

riscv-tools 环境安装

  • Git库所需要的各种前述依赖(此处更新命令
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
  • 建议在自己制定路径下新建文件夹进行下载和配置,例如:
mkdir /home/{你的用户名}/RISCV
  • 下载riscv-tools(此处按照 GitHub 增补库,一次性库补全):
git clone --recursive https://github.com/riscv/riscv-tools.git

​ 如果上述命令中间存在失败的过程,我们就需要删除已经下载好的文件,重新下载安装,尝试优先建议国内先git clone库,进入库文件夹之后执行recursive命令(二者等效);可以同时开多个 terminal 下载各个库

​ 首先我们下载 riscv-tools 包:

git clone https://https://github.com/riscv/riscv-tools.git 

​ 然后查看我们 riscv-tools 包中需要补充的子模块:

cat riscv-tools/.gitmodules

image

​ 图中子库均包含在顶层 .gitmodules 文件中,可以用下面命令进行安装:

cd riscv-tools 
git clone --recursive https://github.com/riscv/riscv-openocd.git 
git clone --recursive https://github.com/riscv/riscv-isa-sim.git 
git clone --recursive https://github.com/riscv/riscv-opcodes.git 
git clone --recursive https://github.com/riscv/riscv-pk.git 
git clone --recursive https://github.com/riscv/riscv-tests.git

riscv-gnu-toolchain 环境安装

  • 下载riscv-gnu-toolchain(主要内容)
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

​ 同样可以先 git clone 库,再执行 recursive 的命令:

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

​ 查看所需要的库:

cat riscv-gnu-toolchain/.gitmodules

image

​ 图中子库均包含在顶层 .gitmodules 文件中,可以用下面命令进行安装(已更新到最新版链接):

cd riscv-gnu-toolchain 
# git clone --recursive https://github.com/riscv-collab/riscv-binutils-gdb.git			#binutils与gdb在同一仓库地址,只是分支不同
git clone --recursive -b binutils-2_42-branch https://sourceware.org/git/binutils-gdb.git binutils
git clone --recursive -b gdb-14-branch https://sourceware.org/git/binutils-gdb.git gdb
# git clone --recursive https://github.com/riscv-collab/riscv-gcc.git 
git clone --recursive -b releases/gcc-13 https://gcc.gnu.org/git/gcc.git gcc
git clone --recursive https://sourceware.org/git/glibc.git glibc						#原链接git://sourceware.org/git/glibc.git; 修改为https协议便于下载,下同 
# git clone --recursive https://github.com/riscv-collab/riscv-dejagnu.git 
git clone --recursive -b master https://git.savannah.gnu.org/git/dejagnu.git dejagnu
git clone --recursive -b master https://sourceware.org/git/newlib-cygwin.git newlib		#原链接git://sourceware.org/git/newlib-cygwin.git
# git clone --recursive https://git.qemu.org/git/qemu.git 
git clone --recursive https://gitlab.com/qemu-project/qemu.git qemu
# git clone --recursive git://git.musl-libc.org/musl									#修改https也不一定有用,建议直接转到链接下载最新的压缩包
git clone --recursive -b master https://git.musl-libc.org/git/musl musl
git clone --recursive -b master https://github.com/riscv-software-src/riscv-isa-sim.git spike
git clone --recursive -b master https://github.com/riscv-software-src/riscv-pk.git pk
git clone --recursive -b release/17.x https://github.com/llvm/llvm-project.git llvm

riscv-binutils-gdb 实际上是两个文件夹内容,所以下载完成之后,需要进行分割,这里我们采用分支的方式已经完成了分割

​ 当前状态不需要手动分隔;该步骤已经更新入后续 makefile

提醒一下,如果是第一种直接 –recursive 的方式,binutils,gdb 和 riscv-gcc 大概率会在第一次失败,等待 reschedule 之后会成功

​ 这里的 binutils、qemu、musl、llvm 比较容易下载失败,如果下载失败后,需要删除文件夹,重新下载即可

​ 建议在拥有良好网络状态的环境下使用第一种方式,并且最后 git clone 校验表明所有 submodule 均已成功下载,否则,删除没有成功的文件夹,用第二种方式逐条下载

请务必保证每个 submodule 均已成功下载并且所在文件夹内拥有充足内容。整个 riscv-gnu-toolchain 大概有 6.65GB (官方声称)左右

  1. 编译步骤

​ export路径:

# 在 .bashrc 中定义路径和 export 之后 bin 文件,方便以后直接使用 tab 补全 riscv64 工具链
sudo vim ~/.bashrc

进入bashrc后在尾部添加

export RISCV="/home/{你的用户名}/RISCV/riscv" #参考链接中此处有误 
export PATH=$PATH:$RISCV/bin #该路径下为链接工具

保存退出后,执行source实时生效

source ~/.bashrc

可以在shell中敲入,确认路径是否正确

echo $RISCV

image

编译riscv-gnu-toolchain

​ 这一步是最头疼的地方,一方面是整个编译时间非常的长,在我前述配置环境下大概要1个小时多;另一方面,如果当前文件夹中任何一个 submodule 没有 clone --recuresive 完整的话,中途就会报错,再次编译只能重头开始

如果你中途报错了,不要犹豫,定位子模块文件夹之后重新git clone,make clean之后重新开始。

cd riscv-gnu-toolchain ./configure --prefix=$RISCV --enable-multilib make 
#注意是make而不是make linux(参考一个版主的讲解)

我在这里使用了 enable-multilib 的选项,主要是因为需要32和64位两种环境。一般情况下,建议你在 riscv-gnu-toolchain 网站中确认自己需要的编译库

​ riscv-gnu-toolchain

注:make 编译得到是我们最常用的 unknown-elf-gcc 等工具链,而 make linux 则是 unknown-linux-gnu-gcc

多嘴一句,目前 RISC-V 主流还在 32bit 的环境下,64bit 实用上确实是少之又少,但是虽然少,还是不能忽略

整个make大概需要一个小时,完成后,riscv-gnu-toolchain文件占用13GB左右空间。

事实上,到这一步结束,riscv-unknown-elf 工具链已经创建成功,接下来步骤是创建相关仿真工具,如果没有需求可以不用继续。

​ 编译riscv-tools

cd riscv-tools ./build.sh

一般教程上是这样的流程,但是因为我在之前 make gnu-toolchain 中开启了 –enable-multilib 的选项,所以在这里使用 build.sh 进行构建时会在编译 benchmark/dhrystone 这个 file 的时候出现 ld 链接重复的问题,如果你在 riscv-gnu-toolchain 中了其他选项,有可能不会出错。当然为了绕开这个东西,我选择执行另一个:

./build-spike-pk.sh

其实最主要使用的也就是 spike 和 pk 这个仿真工具

至此,在没有 error 的情况下,整个编译过程就结束了

Hello World

​ 用任意你喜欢的方式创建hello.c文件

#include <stdio.h>  int main(void) {         printf("Hello RISC-V!\n");         return 0; }`

​ 编译

riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 -o hello hello.c

需要注意的时,rv 工具链编译出来的文件,linux 系统是无法使用 ./hello 来执行的。需要用 spike 进行仿真,但是 spike 需要配置 text 段,这个之后我找到正确的方法再更新

我这里使用的 gem5 进行验证,没有出现问题

可能出现和存在的问题

​ riscv-tools

gcc: error: unrecognized argument in option ‘-mcmodel=medany’ 
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’? make: *** [file.o] Error 1

这个就是没有成功编译完成 riscv-gnu-toolchain

​ 路径中不要有中文字符,这个就要修改路径下所有带有中文字符的文件夹名称了

梯子推荐

这里推荐使用”魔界“,靠谱稳定,某管视频可以实现 4k/8k 无延迟、无卡顿,github 连接快速,节点多,支持 chatgpt,流量付费,不限时间,价格最优惠

点击连接跳转注册使用:魔界

参考资料

参考版块:

riscv各种版本gcc工具链编译与安装 #链接库说明

GCC RISCV环境搭建 #另一篇指导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544624.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作&#xff1f; IntelliJ IDEA的插件系统工作原理如下&#xff1a; 1、插件架构&#xff1a; IntelliJ IDEA通过插件架构扩展其功能&#xff0c;插件可以添加新的功能或修改现有功能。 2、安装和管理&#xff1a; 通过IDEA内置的插件市场下载…

游戏引擎中的动画基础

一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战&#xff1a; 交互&#xff1a;游戏中的玩家动画需要和场景中的物体进行交互。实时&#xff1a;最慢需要在1/30秒内算完所有的场景渲染和动画数据。&#xff08;可以用动画压缩解决&am…

【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 文章目录 该系列目录设计目标设计思路RTL及Testbench代码RTL代码Testbench代码 仿真结果上板视频 该系列目录 Verilog线性序列机点灯案例(一)&#xff…

图像处理ASIC设计方法 笔记10 插值算法的流水线架构

&#xff08;一&#xff09; 三次插值算法实现的图像旋转设计的流水线架构 传统上&#xff0c;三次插值算法实现的图像旋转设计需要三块一样的处理资源&#xff0c;为了节约资源&#xff0c;采用流水线设计&#xff0c;简单来讲就是三次插值算法共用一块资源&#xff0c;优化这…

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合&#xff1a; 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…

【视频异常检测】Diversity-Measurable Anomaly Detection 论文阅读

Diversity-Measurable Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Diversity-Measurable Anomaly Detection3.1. The framework3.2. Information compression module3.3. Pyramid deformation module3.4. Foreground-background selection3.5. Trai…

宜搭faas服务器报错Network response was not OK

[error] https://api.dingtalk.com/v1.0/yida/forms/instances? fetch error Error: Network response was not OK 不出意外的话肯定是请求代码的某个部分出了问题&#xff1a;其中formInstanceId和updateFormDataJson是业务的内容 我检查过是没问题的。appType和systemToken…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

VMware的安装和Ubuntu的配置安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、linux是什么&#xff1f;二、基础知识虚拟机 三、安装VMware总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Linux是一个功能…

第18节 动态规划一讲

1假设有排成一行的N个位置记为1~N&#xff0c;N一定大于或等于2 开始时机器人在其中的M位置上(M一定是1~N中的一个) 如果机器人来到1位置&#xff0c;那么下一步只能往右来到2位置&#xff1b; 如果机器人来到N位置&#xff0c;那么下一步只能往左来到N-1位置&#xff1b; 如果…

【LeetCode: 2684. 矩阵中移动的最大次数 + dfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

数据结构的概念大合集04(队列)

概念大合集04 1、队列1.1 队列的定义1.2队列的顺序存储1.2.1 顺序队1.2.2 顺序队的基本运算的基本思想1.2.3 顺序队的4要素的基本思想 1.3 环形队列1.3.1 环形队列的定义1.3.1 环形队列的实现 1.4 队列的链式存储1.4.1 链队1.4.2 链队的实现方式1.4.3 链队的4要素的基本思想 1.…