搭建RISC_V交叉编译环境

搭建RISC_V交叉编译环境


前言

本人历经三天时间在中秋节假期前夕成功搭建了RISC_V的交叉编译环境,中间踩了很多坑,遇到了很多bug,看了网上好多相关的教程,结果在自己的电脑都失败了,在此记录一下,希望能帮助到未来和我一样零基础的小白,最后祝大家中秋节快乐~~


一、搭建riscv-tools

我的实验环境是vmware上的虚拟机,镜像是ubuntu-20.04.1-desktop-amd64.iso。这个大家可以自行去官网下载,这里就不一一介绍了。这里注意一个关键的点,你最好给你的虚拟机硬盘分配较大的容量,我认为最好在50G以上,当然如果你仅需要搭建编译环境20G+就够了,如果你的硬盘容量不够我在第四步搭建qemu的时候会讲解虚拟机扩展硬盘容量的方法,因为我当时也遇到了相同的问题!
首先我参考的是这个博主写的教程,网址如下:(https://blog.csdn.net/shensen0304/article/details/95504258),第一步是将github上的riscv-tools文件夹拷入到您的ubuntu上,然后再拷贝它的子文件夹,有两种方式,第一种是在命令行通过git clone的方式,第二种我给那些网速不好或者不能翻墙的老铁推荐https://gitee.com/yushulx,虽然我记得好像riscv-tools不需要这样,因为像我这种垃圾网速的都能拷贝下来,记得试了三次,但对于后面的risc-toolchain、spike、qemu很实用,你们去这个gitee上直接下载下来然后拉到你的虚拟机上就行,如果直接clone的话大概需要一个多小时。
git clone的相关代码如下:

cd /home/suiqian
sudo mkdir riscv
cd riscv
sudo git clone https://github.com/riscv/riscv-tools.git
cd riscv-tools
sudo git submodule update --init --recursive

注意的几点也是我犯的错误,搞了我很久:
1.千万不要直接去github上下载下来然后拉到你的虚拟机上,然后再去github上把子文件夹下下来再拷进去,然后自以为是的觉得我都手动搞定了,结果一编译,一大堆问题。。。。。。。
2.git clone的时候会失败很多次,我的是,因为我用的翻墙软件垃圾,经常会挂断,失败之后,你要sudo rm -rf riscv-tools,之后再重复git命令,对于文件夹较小的,多试几次就成功了。。。。。。
3.对于网速实在很差的,你们去gitee上拷完之后,怎么弄到ubuntu上去呢,一种方式就是在ubuntu上下载,第二种是安装vmware tools,安完之后就可以手动拉进去了,第三种是vmware设置那里共享文件夹,找到你windows的共享目录,从共享目录中拉进去。。。。。。

二、搭建riscv-toolchain

第二步是搭建riscv-toolchain,还是那些问题,网速好的直接git,不好的去gitee上拷。
1.下载文件

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

我是将gitee上的riscv-gnu-toolchain文件夹拷贝下来,放到ubuntu里的riscv文件夹里去的。
2.安装依赖

cd riscv-gnu-toolchain
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
sudo apt-get install libnewlib-dev

注意第三个,由于第三个没安,我报错了N次 草。。。
3.安装

INSTALL_PATH='/opt/riscv'
NUM_CPU=8

export PATH=$PATH:$INSTALL_PATH/BIN
./configure --prefix=$INSTALL_PATH
sudo make -j$NUM_CPU

这一步需要很久,我大概make了一个半小时。。。
4.修改环境变量

sudo gedit ~/.bashrc

在其底部添加如下代码,这样你以后就不用手动在命令行去敲了。

export PATH=/opt/riscv/bin:$PATH

在这里插入图片描述

5.编译测试
写一个hello world,然后进入代码文件夹里编译测试
在这里插入图片描述

riscv64-unknown-elf-gcc -o hello hello.c
riscv32-unknown-elf-gcc -o hello hello.c

在这里插入图片描述

注意:
后面我发现我要跑的代码是基于32位riscv工具链的,因此我又加安了riscv32的,也能编译成功,这个好像与64之间不影响,但是我的spike受影响,会报版本错误,所以我现在是用64位编译之后才能spike,32位编译之后不能spike,我这两天正在解决这个问题,不过后面的qemu没事。

三、搭建spike及pk

riscv-tools安装中已包含了spike和pk的相关文件,首先安装Spike(顺序不影响)。
在riscv-isa-sim路径下打开终端:

apt-get install device-tree-compiler
 mkdir build
 cd build
 ../configure --prefix=$RISCV
 make
 sudo make install

这一步很顺利,后面我按照同样的方法cd riscv-pk文件夹里去失败了。。。中间解决了很多问题我记得最后也编译成功了,但是报了个错:

gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
Makefile:332: recipe for target 'file.o' failed
make: *** [file.o] Error 1

大家可以去参考一下(http://yolo.org.cn/iblog/details/16)的解决方法,但我最后还是不成功。。。

我最后是通过另一个博主(https://www.codeleading.com/article/44825286911/)解决的,当然在这之前好像我做了好多非人类的操作,我真记不清楚了,如果你们在安的时候遇到什么问题,欢迎截图私信我。。。

su    #切换到root
export RISCV=/opt/riscv 
./build-spike-pk.sh
Installing project riscv-pk
。。。。。。
RISC-V Toolchain installation completed!

在这里插入图片描述

四、搭建qemu

在搭建qemu的时候我突然发现我的硬盘容量仅剩1G多一点了,这对于qemu肯定是不够的,我选择扩充了硬盘容量。
首先你去下面这里扩展磁盘容量,我扩展到了80G。
在这里插入图片描述
扩展完成之后我又发现,我的硬盘容量那里没变,草,还是那个数。。。现在这个图变了,当时还是40G。。。
在这里插入图片描述
我的解决方法是下个Gparted工具:

sudo apt-get install Gparted*

之后再Show Applications那里打开该软件:
在这里插入图片描述
首先在unallocated那里new一个新的区域,然后将其挂载(format to)到/dev/sda目录下,然后再挂载到/dev/sda5目录下,可以通过左右拉顶上那个进度条来控制,具体你们去试试就知道了。。。
扩展完之后,我又直接进到qemu那个文件夹下安装编译依然出错,草。。。
我的解决方法是把原来那个qemu文件夹删除了,https://download.qemu.org/zheli
去这个网址下了个qemu-6.1.0,然后按照以下步骤安装编译:

sudo mv qemu-6.1.0.tar.xz /home/suiqian/riscv/riscv-tools/riscv-gnu-toolchain
sudo tar qemu-6.1.0.tar.xz
cd qemu-6.1.0
sudo mkdir build
cd build
./configure 
sudo make
sudo make install

大功告成:
在这里插入图片描述
注意可能遇到的问题:
你们在./configure那步可能会遇到好多问题,比如Cannot find Ninja,没有python了等等,一个个安装就好,系统都会有提示安装的命令。。。

五、编译、调试及运行

下面以一个最简单的RISC_V汇编代码为例给大家展示编译、调试及运行的过程:
1.首先建立一个test文件夹,再新建一个test.S文件。

mkdir test
touch test.S
gedit test.S

将以下代码拷贝到文件中:

 .global _start
 _start:      
 	li a1,23      
 	li a2,18      
 	add a0,a1,a2
 loop:      
 	j   loop

2.开始编译

riscv64-unknown-elf-gcc -save-temps -nostdlib -nostartfiles -ffreestanding -o test test.S -g

3.启动带调试虚拟机

qemu-riscv64 -singlestep -g 12345 test -nographic

4.重新打开一个命令行,开启远程调试

riscv64-unknown-elf-gdb

具体过程截图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至于调试代码用到的指令这里就不一一介绍了,后面可能会出一篇基于树莓派编译arm-cortex-a neon技术的文章,也是暑假我零基础搞得,里面会详细介绍gdb的用法~~
至此所有工作全部完成!哦,运行的话之前都讲过不管是spike还是qemu都能用。。。

六、可视化界面调试——ddd的使用

首先安装可视化工具ddd------data display debugger:

sudo apt-get install ddd

在这里插入图片描述
View—Machine Code Window
Status—Registers
在一个窗口中打开qemu服务器: qemu-riscv64 -singlestep -g 12345 test -nographic
在另一个窗口中打开data display debugger: ddd --debugger riscv64-unknown-elf-gdb

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值