档案信息网站建设,网络宣传平台,安徽省安徽省建设工程信息网站,成都php网站建设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核…RISC-V 编译环境搭建riscv-gnu-toolchain 和 riscv-tools
编译环境搭建以及说明
操作系统什么系统都可以
虚拟机VMmare Workstation Pro 17.50.x (版本不限)
编译环境Ubuntu 18.04.5
CPUi7-8750h(虚拟机分配4核8线程基频2.2GHz睿频3.9GHz)
RAM32GB虚拟机分配10GB3G以上均可
梯子这里由于有些地方无法访问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 图中子库均包含在顶层 .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.gitriscv-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 图中子库均包含在顶层 .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 llvmriscv-binutils-gdb 实际上是两个文件夹内容所以下载完成之后需要进行分割这里我们采用分支的方式已经完成了分割
当前状态不需要手动分隔该步骤已经更新入后续 makefile
提醒一下如果是第一种直接 –recursive 的方式binutilsgdb 和 riscv-gcc 大概率会在第一次失败等待 reschedule 之后会成功
这里的 binutils、qemu、musl、llvm 比较容易下载失败如果下载失败后需要删除文件夹重新下载即可
建议在拥有良好网络状态的环境下使用第一种方式并且最后 git clone 校验表明所有 submodule 均已成功下载否则删除没有成功的文件夹用第二种方式逐条下载
请务必保证每个 submodule 均已成功下载并且所在文件夹内拥有充足内容。整个 riscv-gnu-toolchain 大概有 6.65GB 官方声称左右
编译步骤
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编译riscv-gnu-toolchain
这一步是最头疼的地方一方面是整个编译时间非常的长在我前述配置环境下大概要1个小时多另一方面如果当前文件夹中任何一个 submodule 没有 clone --recuresive 完整的话中途就会报错再次编译只能重头开始
如果你中途报错了不要犹豫定位子模块文件夹之后重新git clonemake 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 -marchrv32imac -mabiilp32 -o hello hello.c需要注意的时rv 工具链编译出来的文件linux 系统是无法使用 ./hello 来执行的。需要用 spike 进行仿真但是 spike 需要配置 text 段这个之后我找到正确的方法再更新
我这里使用的 gem5 进行验证没有出现问题
可能出现和存在的问题
riscv-tools
gcc: error: unrecognized argument in option ‘-mcmodelmedany’
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环境搭建 #另一篇指导