reference:
利用码云镜像快速拉取riscv-gnu-toolchain工具链
RISC-V GNU编译环境搭建与运行实践
riscv各种版本gcc工具链编译与安装

1.拉取riscv-gnu-toolchain源码

riscv-gnu-toolchain是riscv的gcc交叉编译工具链
github地址为:https://github.com/riscv/riscv-gnu-toolchain/tree/master

正常拉取的步骤为:

git clone  git@github.com:riscv/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
git submodule update --init --recursive

但由于外网原因,往往会卡在拉取子模块的阶段(有时有梯子也挺慢的)。
这些子模块包括:

riscv-qemu
riscv-newlib(100MB)
riscv-binutils(394MB)
riscv-gdb(394MB)
riscv-dejagnu(3MB)
riscv-glibc(155MB)
riscv-gcc (1.3GB)

为了解决这个问题,可以拉取码云上的riscv-gnu-toolchain镜像。
码云地址为:https://gitee.com/mirrors/riscv-gnu-toolchain

git clone  https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain

然而码云上的子模块的地址仍然为github的地址,所以需要分别拉取其子模块在码云上的镜像。(虽然挺麻烦的,但总的来说还是挺快的)

riscv-newlib:https://gitee.com/mirrors/riscv-newlib
riscv-binutils:https://gitee.com/mirrors/riscv-binutils-gdb
riscv-gdb:https://gitee.com/mirrors/riscv-binutils-gdb(riscv-gdb和riscv-binutils为同一个仓库下的不同分支)
riscv-dejagnu:https://gitee.com/mirrors/riscv-dejagnu
riscv-glibc:https://gitee.com/mirrors/riscv-glibc
riscv-gcc:https://gitee.com/mirrors/riscv-gcc

需要注意的是,riscv-gnu-toolchain工具链下子模块拉取的不都是其主分支,我们可以通过其最近的一次commit来判断是那个分支,下图红框处:

这里我直接列出其子模块对应的分支:(工具链可能会更新,要使用最新版本大家自行切换具体分支)

riscv-binutils:riscv-binutils-2.35
riscv-dejagnu:master
riscv-gcc:riscv-gcc-10.2.0
riscv-gdb:fsf-gdb-10.1-with-sim
riscv-glibc:riscv-glibc-2.29
riscv-newlib:master

git clone https://gitee.com/mirrors/riscv-dejagnu

git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc

git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc

git clone https://gitee.com/mirrors/riscv-newlib

git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb  riscv-binutils

 git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb  riscv-gdb

2.编译工具链

安装依赖

sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev


在~/.bashrc中添加环境变量

编译riscv-gnu-toolchain
riscv-gnu-toolchain 工具链分elf-gcc,linux-gnu-gcc两个版本,以及他们对应的32位和64位版本。两个的主要区别在于:

riscv32-unknown-elf-gcc,riscv64-unknown-elf-gcc:使用的riscv-newlib库(面向嵌入式的C库),而且只支持静态链接,不支持动态链接。
riscv32-unknown-linux-gnu-gcc,riscv64-unknown-linux-gnu-gcc:使用的是glibc标准库,支持动态链接。
个人认为从名字上便可以区分两者的使用场景,如果是编译简单,较小的elf程序,使用elf-gcc版本即可,如果编译比较大的程序或者需要动态库(比如编译linux,或opencv库等),推荐使用linux-gnu-gcc版本。

以riscv32为例:


../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d

观察其生成的makefile文件:

make -j4      #wait...
make install  #No action

make正常的效果如下图, 如果卡在mkdir这步,或者是出现git下载riscv-*失败,可能因素:1.riscv-*分支版本过旧; 2.环境依赖需要更新;3.需要耐心等待;


其他编译选项:

# 默认生成64位的编译工具:riscv64-unknown-elf-***
../configure --prefix=$RISCV
make -j4
# 安装至设定的$RISCV路径
make install # 生成32位的编译工具:riscv32-unknown-elf-***
../configure --prefix=$RISCV --with-arch=rv32gc --with-abi=ilp32d
make -j4
make install# 编译linux-gnu-gcc版本(默认64位):riscv64-unknown-linux-gnu-***
../configure --prefix=$RISCV
make linux -j4
make install

查看其配置信息:

完整tools-chain效果如下图:

编译运行测试下:

因为本机为x86架构,所有exec是不能执行的.但可以看到生成了可执行文件.

3.安装QEMU

https://www.qemu.org/docs/master/
https://www.qemu.org/download/

首先安装好依赖:

 sudo apt-get install libglib2.0-dev ninja-build  build-essential zlib1g-dev pkg-config libglib2.0-dev  \
binutils-dev libboost-all-dev autoconf libtool libssl-dev  libpixman-1-dev libpython-dev  \virtualenv libmount-dev   libpixman-1-dev

然后按步骤安装:

wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xvJf qemu-6.2.0.tar.xz
cd qemu-6.2.0
mkdir build
cd build
../configure
make -j4   #wait...

4.测试

回到helloworld路径下,使用gcc编译c代码,生成的可执行文件可以被qemu中编译出来的qemu-riscv32执行,说明工具链和Qemu均安装成功:

riscv-gnu-toolchain工具链-从下载到运行相关推荐

  1. RISC-V GNU Toolchain及交叉编译

    交叉编译 想要理解riscv gnu Toolchain的作用,首先要了解交叉编译的概念.我们平时常见的架构有Intel的X86架构.龙芯处理器的MIPS架构.苹果A系列处理器的ARM架构等. 交叉编 ...

  2. 在 Linux 下安装 GNU ARM 工具链

    可以使用多种工具编写不同版本的 ARM 内核,但最流行的一组工具是 GNU ARM 工具链.更多地了解如何使用 ARM 内核进行嵌入式开发,以及如何安装并使用 GNU 工具. 如果您对在最普遍的微处理 ...

  3. DIY自己的GNU交叉工具链(i386-arm) 【ZT】

    嵌入式设备由于不具备一定的处理器能力和存储空间,程序开发一般用PC来完成,然后将可执行文件下载到嵌入式系统中运行.这是目前嵌入式程序开发的不二选择--Host/target模式.但这引发了一个问题:由 ...

  4. HarmonyOS开发工具DevEcoStudio 的下载以及运行(包含下载开发工具,sdk,模拟机,以及运行第一个应用你好,世界)

    开发工具下载 首先打开HarmonyOS 官网 地址链接 向下滑动一下就能看到开发工具DevEcoStudio 了,点击下载 下载之后是一个压缩包(我这里下载的windos版本的) 解压之后有一个.e ...

  5. 用最快速度,打造「最强 Webpack 前端工具链」,强势运行

    webpack是前端开发中很火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包. 当前,前端技术日新月异,公司的团队技术栈和业务场景不同,都会建立自己的前端工程体系.一个好的工程体系能 ...

  6. RISCV toolchain编译工具链搭建

    目录 写在前面 1.获取源文件 2.安装相关依赖包 3.修改环境变量 4.编译GCC 写在前面 刚刚接触RISCV编译器,根据网上RISCV toolchain工具链的搭建方法,结合自己体会,写点儿学 ...

  7. GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序

    GNU 工具链调试信息分离和挂载:支持 GDB 调试 RELEASE 版本程序 一般地,release 版本的程序都不带调试信息,无法使用 gdb 调试. GNU 编译工具链和二进制工具链做法如下: ...

  8. 香橙派嵌入式arm开发板下载交叉编译工具链说明

    香橙派开发板以处理器分类,包含全志H2.全志H3.全志H5.全志H6等系列,下文以全志H3芯片的开发板为例,对交叉编译工具链的下载进行说明: 1) orangepi-build第一次运行的时候会自动下 ...

  9. linux 脚本自动编制工具,全自动工具链编译脚本

    GCC 工具链自动编译脚本 本工具用于自动编译指定的工具链,可以同时生成运行于本机系统 (Build system) 和 Windows 系统(可以修改)的两套工具链 具体编译规则指定于 .confi ...

最新文章

  1. [Runtime]-交换方法
  2. IT兄弟连 JavaWeb教程 JSON和JSON字符串
  3. 从frame跳转到一个新的页面
  4. 怎么安装Scrapy框架以及安装时出现的一系列错误(win7 64位 python3 pycharm)
  5. 175. Combine Two Tables
  6. 主攻计算机专业英语翻译,湖师大“博导”黄振定,主攻“翻译学”
  7. 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
  8. Windows下Github使用方法
  9. vs2019键盘钩子_低级键盘钩子回调函数
  10. java 置顶窗体_windows 下如何让一个窗口置顶?
  11. Setup Factory 安装程序的图标
  12. namecheap namesilo 域名需要备案吗
  13. MES生产制造执行系统与APS计划排产系统相关名词解释
  14. 腾讯恢复微信个人号注册
  15. 通过ping检测网络故障的典型次序
  16. tuts4you 注册_设计和开发完整的网站(Tuts + Mini系列,第3页)
  17. 亚马逊和Global Optimism欢迎汉高和昕诺飞加入《气候宣言》
  18. python图灵_python图灵机器人
  19. uniapp人脸识别解决方案
  20. http,https,TCP,UDP,apache 的ab,压测工具

热门文章

  1. 【计算机网络】运输层:传输协议TCP概述
  2. python爬虫在线测试_Python爬虫的初步测试:在B站评论区爬虫,python,初试,取
  3. Thingsboard的本地编译与运行详细说明
  4. 开源软件多云转晴:Weather.com
  5. netpayclient.php,银联 chinapay php版本库文件netpayclient php在php5 4以上版本中提示hex2bin 重定义...
  6. 一只鸭子带来的震撼 - Aland·Sun
  7. scala实战同时实现同比和环比 不使用样例类,使用原数据
  8. 用java实现KFC收银:请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统
  9. 如何高速下载百度网盘文件?—第一篇—使用Aria2
  10. Docker常见问题1: driver failed programming external connectivity on endpoint