riscv 各种版本 gcc 工具链编译与安装

riscv 各种版本 gcc 工具链编译与安装

riscv gcc工具下载

Riscv 的 gcc 交叉编译器,以开源的方式托管在 github 上。链接如下:

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

image

该仓库,里面包含了一些子仓库。

使用以下这个命令,将所有仓库,都 clone 下来。

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

以下是各个仓库的 github 地址(这里给出 riscv-gnu-toolchain 工具链中的最新版本):

名称链接 (分支)
binutilshttps://sourceware.org/git/binutils-gdb.git (binutils-2_42-branch)
gdbhttps://sourceware.org/git/binutils-gdb.git (gdb-14-branch)
gcchttps://gcc.gnu.org/git/gcc.git (releases/gcc-13)
glibchttps://sourceware.org/git/glibc.git
dejagnuhttps://git.savannah.gnu.org/git/dejagnu.git (master)
newlibhttps://sourceware.org/git/newlib-cygwin.git (master)
qemuhttps://gitlab.com/qemu-project/qemu.git
muslhttps://git.musl-libc.org/git/musl (master)
spikehttps://github.com/riscv-software-src/riscv-isa-sim.git (master)
pkhttps://github.com/riscv-software-src/riscv-pk.git (master)
llvmhttps://github.com/llvm/llvm-project.git (release/17.x)

下面是官方版本的 github 地址(非 riscv-gnu-toolchain 中的最新版本):

riscv-gcc

https://github.com/riscv/riscv-gcc

riscv-glibc

https://github.com/riscv/riscv-glibc

riscv-newlib

https://github.com/riscv/riscv-newlib

riscv-dejagnu

https://github.com/riscv/riscv-dejagnu

riscv-gdb

https://github.com/riscv/riscv-binutils-gdb.git

riscv-binutils

https://github.com/riscv/riscv-binutils-gdb.git

riscv-qemu

https://github.com/riscv/riscv-qemu.git

这里推荐使用 riscv-gnu-toolchain 工具链中的最新版

编译riscv gcc

下载完毕后,就要开始编译。首先在 riscv-gnu-toolchain 根目录下,创建 build 目录。用于编译 riscv gcc。

riscv gcc 可以编译成以下几个版本

  • riscv32-unknown-elf-gcc

  • riscv64-unknown-elf-gcc

  • riscv32-unknown-linux-gnu-gcc

  • riscv64-unknown-linux-gnu-gcc

  • riscv64-multilib-elf-gcc

  • riscv64-liunx-multilib-gcc

以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 --with-arch选项。

1、riscv32-unknown-elf-gcc

该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 newlib。

执行以下命令:

../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx 
make

–mabi可以选择如下:

  • ilp32

  • ilp32f

  • ilp32d

编译完成后,在 /opt/riscv/bin 目录下,有 riscv32-unknown-elf-gcc 的所有工具。

image

通过 riscv32-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv32-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv32-unknown-elf/8.2.0/lto-wrapper
Target: riscv32-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv32-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-elf: 指定工具为riscv32-unknow-elf
--prefix=/opt/riscv32:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-newlib:  c运行库使用newlib
--with-abi=ilp32: 工具链支持的abi方式是ilp64
--with-arch=rv32imc:  工具链支持的riscv架构是 rv64imc

在build目录下,有如下的文件夹和文件生成。

image

其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。

2、riscv64-unknown-elf-gcc

该工具,针对于 riscv64 架构的编译器,使用的 C 运行库为 newlib。

执行以下命令:

../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
make

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv64/bin 目录下,有 riscv64-unknown-elf-gcc 的所有工具。

image

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv64 --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv64/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64 --with-arch=rv64imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-elf: 指定工具为riscv64-unknow-elf
--prefix=/opt/riscv64:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-newlib:  c运行库使用newlib
--with-abi=lp64: 工具链支持的abi方式是lp64
--with-arch=rv64imc:  工具链支持的riscv架构是 rv64imc

在 build 目录下,有如下的文件夹和文件生成。

image

其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。

3、riscv32-unknown-linux-gnu-gcc

该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 linux 中的标准 glibc。

执行以下命令:

../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linux
make linux

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv32-linux/bin 目录下,有 riscv32-unknown-linux-gnu-gcc 的所有工具。

image

使用 riscv32-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv32-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-linux/libexec/gcc/riscv32-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv32-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-linux-gnu --prefix=/opt/riscv-linux --with-sysroot=/opt/riscv-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-linux-gnu: 指定工具为riscv32-unknow-linux-gnu
--prefix=/opt/riscv-linux:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=ilp32: 工具链支持的abi方式是ilp32
--with-arch=rv32imc:  工具链支持的riscv架构是 rv32imc

虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。

在 build 目录下,有如下文件以及文件夹:

image

可以看出,用的c运行库是glibc。

4、riscv64-unknown-linux-gnu-gcc

该工具,针对于 riscv64 架构的编译器,使用的C运行库为linux中的标准glibc。

执行以下命令:

../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
make linux

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-unknown-linux-gnu-gcc 的所有工具。

image

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-linux/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64-linux --with-sysroot=/opt/riscv64-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-linux-gnu: 指定工具为riscv64-unknow-linux-gnu
--prefix=/opt/riscv64:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc

虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而是有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。

在build目录下,有如下文件以及文件夹:

image

可以看出,用的c运行库是glibc。

5、riscv64-linux-multilib

在编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持 32 位和 64 位。

执行以下命令:

../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilib
make linux

image

编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-linux-multilib -gcc 的所有工具。

虽然有通过–target指定,但是生成的工具链名字还是 riscv64-unknow-linu-gnu-gcc。

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-multilib/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target= riscv64-linux-multilib --prefix=/opt/riscv-linux-multilib --with-sysroot=/opt/riscv-linux-multilib/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single

可以看出:

--target= riscv64-linux-multilib: 指定工具为riscv64-linux-multilib
--prefix=/opt/riscv-linux-multilib:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
--enabl-multilib: 启动 multilib

对于 riscv64-linux-multilib-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:

  • -march=rv32: 32 位版本
  • -march=rv64: 64 位版本

6、riscv64-multilib-elf-gcc

在裸机编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持32位和64位。

执行以下命令:

../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elf
make

编译完成后,在 /opt/ riscv64-multilib-elf /bin 目录下,有 riscv64-multilib-elf-gcc 的所有工具。

image

虽然有使用–target指定,但是生成的编译器还是 riscv64-unknown-elf-gcc。

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-multilib-elf/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-multilib-elf --prefix=/opt/riscv64-multilib-elf --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-system-zlib --with-newlib --with-sysroot=/opt/riscv64-multilib-elf/riscv64-unknown-elf --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-multilib-elf: 指定工具为riscv64-multilib-elf
--prefix=/opt/riscv64-multilib-elf:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
--enable-multilib:  启用multilib

对于 riscv64-multilib-elf-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:

  • -march=rv32: 32 位版本
  • -march=rv64: 64 位版本

riscv-none-embed-gcc

专门为嵌入式使用的gcc交叉编译工具链。官方网站:

https://gnu-mcu-eclipse.github.io/toolchain/riscv/

可以直接下载 linux 的二进制执行程序,以及 windows 的安装包。这个一般要搭配 GNU MCU eclipse 工具一起使用。

因为这个工具,直接提供执行程序,因此就不介绍了。

总结

riscv的gcc编译器,分为2大类:

  • 裸机: unknown-elf,none-embed

  • linux: linux

除了 none-embed 编译器,对于每一类,如果禁用 multilib,那么又分为 32 位版本和 64 位版本。如果使能 multilib,那么就只有一个版本,但是这个版本工具,可以同时支持 32 位和 64 位。

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

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

相关文章

FFmpeg转码参数说明及视频转码示例

-b : 设置音频或者视频的转码码率 -b:v 只设置视频码率 -b:a 只设置音频码率 -ab: 只设置音频码率, 默认码率大小为: 128k bit/s -g: 设置视频GOP大小,表示I帧之间的间隔,默认为12 -ar: 设置音频采样率,默认0 -ac: 设置音频通道数量 默认0 -bf: 设置连…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

计算机网络 |内网穿透

其实内网穿透,也挺好玩的,如果在大学的时候,那个时候讲计算机网络的老师能横向延展,估计课也会更有趣不少,本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说,怪可惜的 回到正题,内网…

数据分析-Pandas的直接用Matplotlib绘图

数据分析-Pandas的直接用Matplotlib绘图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表…

音频的录制及播放

在终端安装好pip install pyaudio,在pycharm中敲入录音的代码,然后点击运行可以在10s内进行录音,录音后的音频会保存在与录音代码同一路径项目中,然后再新建项目敲入播放的代码,点击运行,会把录入的录音进行…

[沉淀之华] 自研基于SpringBoot Mybaits 构建低代码数据治理脚手架分享:涵盖数据同步、数据比对、数据归档、数据恢复为一体

文章目录 成果演示背景整体能力功能描述相关细节安装使用 成果演示 Github地址:数据治理脚手架 wiki:kg-ctl-core使用文档 背景 为什么要做这个? 一个老生常谈且不得不谈问题:随着业务日益发展,如果不做数据迁移&…

路由器端口转发远程桌面控制:一电脑连接不同局域网的另一电脑

一、引言 路由器端口转发:指在路由器上设置一定的规则,将外部的数据包转发到内部指定的设备或应用程序。这通常需要对路由器进行一些配置,以允许外部网络访问内部网络中的特定服务和设备。端口转发功能可以实现多种应用场景,例如远…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…

AI毕业论文降重GPTS,避免AI检测,高效完成论文

视频演示 AI毕业论文降重GPTS,避免AI检测,高效完成论文! 开发目的 “毕业论文降重”GPTS应用,作用为:重新表述学术论文,降低相似性评分,避免AI检测。 使用地址 地址:毕业论文降重…

图解缓存淘汰算法 LRU、LFU | 最近最少使用、最不经常使用算法 | go语言实现

写在前面 无论是什么系统,在研发的过程中不可避免的会使用到缓存,而缓存一般来说我们不会永久存储,但是缓存的内容是有限的,那么我们如何在有限的内存空间中,尽可能的保留有效的缓存信息呢? 那么我们就可以…

PyCharm中如何使用不同的虚拟环境

1. 简介 有些项目用老的运行环境,而有些项目用新的运行环境,那么我们在运行这些代码(比如跑对比实验的时候)如何进行切换呢,这时候就可以使用虚拟环境啦 2. 虚拟环境的创建 首先启动Anaconda Prompt 并在其中执行如…

解决Linux中Eclipse启动时找不到Java环境的问题

按照报错的意思是没有在/usr/local/eclipse/jre/bin/java下找到java环境,我检查了一下eclipse的目录结构发现在/usr/local/eclipse没有jre/bin/java,我的想法是自己建对应文件夹然后软连接到我的java环境 cd /usr/local/eclipse sudo mkdir jre cd jre s…