当前位置: 首页 > news >正文

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环境搭建 #另一篇指导

相关文章:

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

RISC-V 编译环境搭建&#xff1a;riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统&#xff1a;什么系统都可以 虚拟机&#xff1a;VMmare Workstation Pro 17.50.x (版本不限) 编译环境&#xff1a;Ubuntu 18.04.5 CPU&#xff1a;i7-8750h(虚拟机分配4核…...

一文速通ESP32(基于MicroPython)——含示例代码

ESP32 简介 ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片&#xff0c;支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器&#xff0c;主频高达 240 MHz&#xff0c;内置 512 KB SRAM (TCM)&#xff0c;具有 45 个可编程 GPIO 管…...

记录一次业务遇到的sql问题

刚开始工作 业务能力比较薄弱 记录一下这几天遇见的一个业务问题 场景 先简单说一下场景&#xff0c;有一批客户&#xff08;一张表&#xff09;&#xff0c;可以根据这个客户匹配出很多明细数据&#xff08;另一张表&#xff09;&#xff0c;现在需要删除明细&#xff0c;一个…...

代码分支管理

代码分支管理规范 一、分支管理要求 分支管理 • 将代码提交到适当的分支,遵循分支管理策略。 • 随时可以切换到线上稳定版本代码,确保可以快速回滚到稳定版本。 • 同时进行多个版本的开发工作,确保分支清晰,避免混淆。提交记录的可读性 • 提交描述准确,具有可检索性,…...

uniapp sqlite时在无法读取到已准备好数据的db文件中的数据

问题 {“code”:-1404,“message”:“android.database.sqlite.SQLiteException: no such table: user (Sqlite code 1): , while compiling: select * from user, (OS error - 2:No such file or directory),http://ask.dcloud.net.cn/article/282”} at pages/index/index.vu…...

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…...

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…...

数据结构--七大排序算法(更新ing)

下面算法编写的均是按照由小到大排序版本 选择排序 思想&#xff1a; 每次遍历待排序元素的最大下标&#xff0c;与待排序元素中最后一个元素交换位置&#xff08;此时需要设置一个临时变量来存放下标&#xff09; 时间复杂度--O(n^2) 空间复杂度--O(1) 稳定性--不稳定 代码实…...

202203青少年软件编程(图形化) 等级考试试卷(二级)

第1题:【 单选题】 红框中加入哪个选项积木, 不能阻止气球下落? ( ) A: B: C: D: 【正确答案】: D 【试题解析】 : 第2题:【 单选题】 下图分别是两个角色的初始位置和“黑色圆形”的程序, 点击绿旗后, 角色显示为下列哪个选项?( ) A: B: C: D: 【正确答…...

【智能硬件、大模型、LLM 智能音箱】Emo:基于树莓派 4B DIY 能笑会动的桌面机器人

简介 Emo 是一款个人伴侣机器人,集时尚与创新于一身。他的诞生离不开最新的树莓派 4 技术和先进的设计。他不仅仅是一款机器人,更是一个活生生的存在。与其他机器人不同,他拥有独特的个性和情感,能够俘获你的心灵。 硬件部分 – 树莓派 4B – 微雪 2 英寸 IPS LCD 显示屏…...

rust学习笔记(1-7)

原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1&#xff09;打开 cmd 输入命令查看 cargo 版本 cargo --version2&#xff09; 使用 cargo new 项目名 在文件夹&#xff0c;按 shift 鼠标右键 &#xff0c;打开命令行&#xff0c;运行如下命令&#xff0c;即可创建…...

vscode jupyter 如何关闭声音

网上之前搜的zen模式失败 仅仅降低sound失败 #以下是成功方式&#xff1a; 首先确保user和remote的声音都是0&#xff1a; 然后把user和remote的以下设置都设置为off就行了&#xff01; 具体操作参考 https://stackoverflow.com/questions/54173462/how-to-turn-off-or-on-so…...

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)

背景&#xff1a; 用默认 plt.savefig() 保存图片&#xff0c;图中文字是以瞄点保存&#xff0c;而不是以文字格式。在编辑矢量图中&#xff0c;无法调整文字大小和字体。 方法&#xff1a; import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…...

Nacos与Eureka的使用与区别

Nacos与Eureka的使用与区别 单体架构&#xff1a;优点缺点 分布式架构需要考虑的问题&#xff1a;微服务企业需求 认识SpringCloud服务的拆分与远程调用微服务调用方式 Eureka提供者和消费者架构搭建Eureka服务注册服务发现 Ribbon负载均衡饥饿加载总结 Nacos注册中心Nacos安装…...

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…...

如何在Ubuntu中查看编辑lvgl的demo和examples?

如何在Ubuntu中查看编辑lvgl的demo和examples&#xff1f; 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库&#xff0c;找到lv_port_pc_eclipse这个仓库&#xff0c;点进去 拉取仓库代码和子仓库代码 仓库网址&#xff1a;https://github…...

深入了解 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…...

C语言之快速排序

目录 一 简介 二 代码实现 快速排序基本原理&#xff1a; C语言实现快速排序的核心函数&#xff1a; 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结&#xff1a; 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法&#xff0c;由英国计算机科学家C.A.R. H…...

获取扇区航班数

1、Spark Streaming清洗服务&#xff0c;接收kafka中Topic为“task_ATC”中的数据&#xff0c;保存在MySQL中。 打开SpringBoot项目BigData-Etl-KongGuan 请认真阅读&#xff1a;在前面的“使用Spark清洗统计业务数据并保存到数据库中”任务阶段中应该已经完成了所有Topic的数…...

​【已解决】npm install​卡主不动的情况

使用 npm install 初始化前端项目时&#xff0c;会出现卡住不动的情况。原因是淘宝镜像源由原来的https://registry.npm.taobao.org 更换为下面这个&#xff1a; https://registry.npmmirror.com 直接在终端执行下面的指令即可&#xff1a; npm config set registry https://re…...

别再傻傻分不清了!一文搞懂HIS、LIS、PACS这些医院里的‘系统天团’

医疗信息化系统全解析&#xff1a;从HIS到PACS的协同作战指南 第一次走进医院信息中心时&#xff0c;那些闪烁的服务器和此起彼伏的术语让我头晕目眩——HIS、LIS、PACS...它们就像医院里的"复仇者联盟"&#xff0c;每个系统都是独特的超级英雄&#xff0c;但又必须完…...

mtkclient-gui技术指南:联发科设备深度控制与系统修复实战

mtkclient-gui技术指南&#xff1a;联发科设备深度控制与系统修复实战 【免费下载链接】mtkclient-gui GUI tool for unlocking bootloader and bypassing authorization on Mediatek devices (Not maintained anymore) 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclie…...

AI率15-20-30哪来的各平台要求全汇总

论文AI率多少算合格&#xff1f;15%&#xff1f;20%&#xff1f;30%&#xff1f; 这个问题没有统一答案&#xff0c;因为不同学校、不同平台的标准不一样。搞清楚这个&#xff0c;你才知道自己的目标线在哪里&#xff0c;才能判断用什么工具处理、处理到什么程度就够了。 检测…...

对在aarch64 Linux环境编译安装的CinderX补充测试

前文最后说&#xff0c;CinderX报错不能用&#xff0c;这不对&#xff0c;我在其github存储库上提了这个issue&#xff0c;alexmalyshev回复 I think that’s actually just a warning that you’re getting but things should be working after that?Right, this is just a l…...

MATLAB图像锐化避坑指南:为什么你的拉普拉斯算子效果总是不对?

MATLAB图像锐化实战&#xff1a;拉普拉斯算子常见误区与专业解决方案 当你在MATLAB中尝试用拉普拉斯算子锐化图像时&#xff0c;是否遇到过这些情况&#xff1a;锐化后图像反而模糊、边缘出现光晕、或者整体对比度异常&#xff1f;这些现象往往源于数据类型处理、核函数选择、叠…...

别让SDF警告淹没你!芯片后仿真中那些‘不起眼’却至关重要的VCS编译选项详解

别让SDF警告淹没你&#xff01;芯片后仿真中那些‘不起眼’却至关重要的VCS编译选项详解 当数字IC设计进入后仿真阶段&#xff0c;工程师们常常会陷入海量警告信息的泥潭。特别是当SDF&#xff08;Standard Delay Format&#xff09;文件反标时产生的各类警告&#xff0c;往往…...

双倍效率:在快马平台中融合chatgpt实现智能代码生成与即时调试

最近在开发过程中&#xff0c;我发现了一个能显著提升效率的工作方式&#xff1a;将ChatGPT的智能生成能力与InsCode(快马)平台的即时调试环境结合起来。这种组合让我在代码编写、问题排查和逻辑优化上都节省了大量时间&#xff0c;今天就来分享一下具体的使用体验。 自然语言…...

JavaSE从0到1-DAY7-内部类(i)

Java 内部类学习笔记&#xff08;i&#xff09; 一、为什么会有内部类&#xff1f; 核心作用 内部类是写在外部类里面的类&#xff0c;它的主要作用是&#xff1a; 逻辑封装&#xff1a;把只属于外部类的辅助功能封装起来&#xff0c;不暴露给外界访问权限&#xff1a;内部类可…...

给OpenClaw小龙虾喂点 “数据库饲料”,它竟能替你加班到天亮?

目录 &#x1f4a1;DBA 的痛&#xff0c;龙虾不懂 &#x1f99e; 给“龙虾”喂点“硬菜” &#x1f4cd; 成为首批体验官&#xff0c;有福利 最近大家都在养龙虾。 龙虾越养越聪明&#xff0c;写代码、查资料、做分析……什么都能干。 但有一件事&#xff0c;现在的龙虾还…...

华硕笔记本风扇异常修复终极指南:用G-Helper轻松解决散热问题

华硕笔记本风扇异常修复终极指南&#xff1a;用G-Helper轻松解决散热问题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, St…...