搭建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