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

2022/07/31更新
修改内容:

  1. 增补riscv-tool-chain开源工具链内容,主要是部分riscv-打头的内容不再独立更新,直接follow其他上游仓库;
  2. 修改部分步骤与建议

参考版块:
https://blog.csdn.net/weiqi7777/article/details/88045720 #链接库说明
https://blog.csdn.net/ACHENJIE/article/details/108450912 #另一篇指导

  1. 编译环境搭建以及说明

    操作系统:win10 pro 1909
    虚拟机:VMmare Workstation Pro 15.x
    编译环境:Ubuntu 18.04.5
    CPU:i7-8750h(虚拟机分配4核8线程,基频2.2GHz,睿频3.9GHz)
    RAM:16GB(虚拟机分配8GB)
    
  • 建议有条件可以直接装Linux系统,虚拟机有很大的性能损失。如果使用虚拟机,建议分配足够多的RAM内存

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

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

  1. 需要的Git库
  • 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/{你的用户名}/data/tools/RISCV
  • 下载riscv-tools(此处按照GitHub增补库)
git clone --recursive https://github.com/riscv/riscv-tools.git

  或者可以尝试 优先建议国内先git clone库,进入库文件夹之后执行recursive命令(二者等效);可以同时开多个terminal下载各个库
下列子库均包含在顶层.gitmodules文件中

git clone https://https://github.com/riscv/riscv-tools.git
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(主要内容)
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

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

git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git clone --recursive https://github.com/riscv-collab/riscv-binutils-gdb.git	#binutils与gdb在同一仓库地址
git clone --recursive https://github.com/riscv-collab/riscv-gcc.git
git clone --recursive https://sourceware.org/git/glibc.git 						#原链接git://sourceware.org/git/glibc.git; 修改为https协议便于下载,下同
git clone --recursive https://github.com/riscv-collab/riscv-dejagnu.git
git clone --recursive https://sourceware.org/git/newlib-cygwin.git				#原链接git://sourceware.org/git/newlib-cygwin.git
git clone --recursive https://git.qemu.org/git/qemu.git
git clone --recursive git://git.musl-libc.org/musl								#修改https也不一定有用,建议直接转到链接下载最新的压缩包
git clone --recursive https://github.com/riscv-software-src/riscv-isa-sim.git
git clone --recursive https://github.com/riscv-software-src/riscv-pk.git

  riscv-binutils-gdb实际上是两个文件夹内容,所以下载完成之后,需要进行分割 当前状态不需要手动分隔;该步骤已经更新入后续makefile

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

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

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

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

  进入bashrc后在尾部添加

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

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

source ~/.bashrc

  可以在shell中敲入

echo $RISCV

  确认路径是否正确

  • 编译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网站中确认自己需要的编译库

https://github.com/riscv/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的情况下,整个编译过程就结束了。

  1. 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进行验证,没有出现问题。

  1. 可能出现和存在的问题
  • 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

  • 路径中不要有中文字符
    这个我没有碰到过,所以不在这里细讲
  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
riscv-tools的安装可以按照以下步骤进行: 1. 首先,根据需要选择合适的编译器类型。根据引用,riscv-tools编译器分为裸机和嵌入式Linux两大类。其中,裸机编译器为riscv32-unknown-elf-gccriscv64-unknown-elf-gcc,嵌入式Linux编译器为riscv32-unknown-linux-gnu-gccriscv64-unknown-linux-gnu-gcc。 2. 在命令行中执行以下步骤来编译相应的编译器: a. 编译裸机编译riscv32-unknown-elf-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数 - 运行make命令进行编译 b. 编译裸机编译riscv64-unknown-elf-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数 - 运行make命令进行编译 c. 编译嵌入式Linux编译riscv32-unknown-linux-gnu-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数,包括启用Linux支持 - 运行make linux命令进行编译 d. 编译嵌入式Linux编译riscv64-unknown-linux-gnu-gcc: - 进入riscv-gnu-toolchain目录 - 创建一个build目录并进入 - 运行configure命令,设置安装路径和相关参数,包括启用Linux支持和禁用multilib选项 - 运行make linux命令进行编译 3. 另外,根据引用,为了模拟RISC-V二进制文件,还需要构建riscv-fesvr和riscv-isa-sim两个组件。可以按照以下步骤进行: - 获取riscv-tools源码 - 进入riscv-tools目录 - 运行build.sh脚本进行构建 4. 创建安装目录并设置环境变量: - 创建安装目录,例如sudo mkdir /opt/RISCV/riscv64 - 设置目录权限,例如sudo chmod -R 777 /opt/RISCV/riscv64 - 编辑.bashrc文件,添加环境变量设置,例如export RISCV="/opt/RISCV/riscv64"和export PATH=$PATH:$RISCV/bin - 运行source ~/.bashrc命令使环境变量生效 综上所述,以上是安装riscv-tools的一般步骤。根据具体需求选择编译器类型,并根据引用、中提供的命令和参数进行操作即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Ubuntu安装riscv-gnu-toolchain和riscv-tools](https://blog.csdn.net/weixin_43283275/article/details/125365614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [RISC-V Tools编译安装三部曲之一](https://blog.csdn.net/l919898756/article/details/80987091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值