Riscv-gnu-toolchain安装与使用 【gcc、spike、pk和qemu】
Ubuntu22.04.5版本镜像,磁盘大小20G时下载有问题,后续调整为60G顺利完成。下载完成的riscv-gnu-toolchain文件夹12.1G,容量已经使用了25.4G。
本文记录了我安装riscv工具链的完整过程。
如果参考本文安装所有软件,建议先完整阅读全文,因为流程里有一些步骤是没必要的。复制命令时也需要注意删除开头的数字或者将大写的首字母改为小写。
重点提示:
安装完整工具链虚拟机磁盘需要大于80G;
如果需要使用pk,裸机64位gcc的配置请参考pk安装部分。
1 标题创建虚拟机
Ubuntu22.04.5版本镜像,磁盘分配尽可能大一些。一开始分配了20G,后面扩充到60G,最后续调整为100G顺利完成。下载完成的riscv-gnu-toolchain文件夹12.1G,容量已经使用了25.4G。安装好gcc、spike、pk和qemu后总共占用77G。
1.1 标题安装后桌面没有vmware且GUI安装栏为灰色,使用如下命令安装
6 sudo apt-get update
7 sudo apt-get autoremove open-vm-tools
8 sudo apt-get install open-vm-tools-desktop
2 riscv-gnu-toolchain下载
2.1 下载工具链包的主要命令:
10 sudo apt-get install git
11 git --version
12 sudo reboot
13 git clone https://github.com/riscv/riscv-gnu-toolchain
14 cd riscv-gnu-toolchain/
15 git submodule update --init –recursive
2.2 期间会出现下载中断的问题,主要的解决方式有:
13 git config --global http.proxy http://127.0.0.1:7890
14 git config --global https.proxy https://127.0.0.1:7890
31 git config --global --unset http.proxy
32 git config --global --unset https.proxy
60 sudo apt-get install gnutls-bin
59 git config --global http.postBuffer 1048576000 【值太小链接中文件加载失败,太大无法分配空间。】
61 git config --global http.sslVerify false
78 git config --global http.version HTTP/1.1
94 sudo vi ~/.gitconfig 【确保该文件的内容:version = HTTP/1.1 sslVerify = false postBuffer = 1048576000。】
104 git status【查看是否所有子文件夹都已更新,若还有标红的子文件夹,但submodule update无效,需要删除该子文件夹内的.git文件再次update。网络问题会导致下载中止,只需要不断地进行标红命令的update尝试。】
2.3 依赖库安装
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
3 gcc编译器安装
3.1 gcc编译器种类
gcc编译器分为两大类,裸机(unknown-elf)和linux(linux)。如果禁用multilib,那么分为32位和64位版本。如果使能multilib,则一个版本同时支持32位和64位。
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
gcc被编译为了elf32位和linux64位,都可以编译测试程序。其他版本的安装可以参考https://www.cnblogs.com/ppqppl/articles/18077030。
3.2 riscv64-unknown-linux-gnu-gcc安装
gcc以及后面的spike等其他工具都是,需要两个文件夹:
一个是build专门用于进行安装的配置以及安装前编译;
另一个放在opt目录下,是最终所安装的程位置。
到下载好的riscv-gnu-toolchain目录下,新建build,专门用于配置编译某种版本gcc。
mkdir build
cd build
例如我最终安装成:
linux 64版本gcc放在build文件夹内编译,编译器安装到/opt/riscv目录下;
裸机64版本gcc放在build64文件夹内编译,编译器安装到/opt/riscv64目录下。
如果不新建build直接配置编译,riscv-gnu-toolchain文件会变成下面这样很乱,新出现很多名为build-*的文件。其他工具也是同样的道理。
首先安装linux版本。
configure时添加了multilib,意味着安装好的gcc既可以编译32位又可以编译64位。默认是64位。
prefix指目标安装路径。
-j8指运行make时并行8个线程,加快编译速度。这个数目取决于虚拟机的配置,分了几个核,数字太大会报交换空间不足的错误。
115条命令用来查看安装的gcc版本。
112 export PATH=/opt/riscv/bin:$PATH
113 ../configure --prefix=/opt/riscv --enable-multilib
114 sudo make linux -j8
115 riscv64-unknown-linux-gnu-gcc -v
116 lsb_release -a
为了安装好gcc后不用每次启动前都先运行类似112条的export命令,修改.bashrc文件,在文档最后面添加export语句。
gedit ~/.bashrc
export PATH=/opt/riscv/bin:$PATH
为了进一步验证安装好的gcc编译器是否能正常使用,编写测试代码进行编译。
mkdir ~/Desktop/code 【建立用于放置C语言代码的文件夹。】
touch ~/Desktop/code/hello.c 【在该文件夹下新建hello测试文件。】
vi ~/Desktop/code/hello.c 【编辑该c文件,添加如下代码。】
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
131 riscv64-unknown-linux-gnu-gcc -o hello ../../code/hello.c 【Gcc编译器使用测试】
执行完131命令后,在当前路径下会生成一个名为hello的文件,这就是对hello.c进行编译后得到的文件,后面可以通过spike等运行。
3.3 riscv64-unknown-elf-gcc安装
随后安装了兼容64和32位架构的裸机版本gcc编译器,该版本使用C运行库为newlib。在riscv-gnu-toolchain文件夹下创建build64文件夹,用于后续的配置编译。
mkdir build64
cd build
export PATH=/opt/riscv32/bin:$PATH
修改用户文件夹下的.bashrc文件,在文档最下方添加如下语句。
Gedit ~/.bashrc
export PATH=/opt/riscv64/bin:$PATH
将更新的bashrc文件载入,否则编译时找不到riscv64-unknown-elf-gcc执行文件。
source ~/.bashrc
.. /configure -- prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=lp64
sudo make -j8 【编译,8表示编译使用的核心个数。】
riscv64-unknown-elf-gcc -v 【如下为gcc配置含义说明】
riscv64-unknown-elf-gcc -o hello ../../code/hello.c 【测试裸机64gcc】
cofigure文件的配置可以通过…/cofigure --help进行查看,例如裸机32位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
4 spike安装
spike的安装很顺利,只需要安装前下载device-tree-compiler。注意新建build文件夹和/opt目录下的最终安装路径。最后292步骤前需要修改bashrc文件,把prefix里的路径添加到PATH,就像前面gcc安装所做的类似。
278 sudo apt install device-tree-compiler
279 cd spike/
280 mkdir build
281 cd build/
282 ../configure --prefix=/opt/spike
283 sudo make
285 sudo make install
292 spike –help 用来查看是否安装成功。这一步之前需要修改.bashrc文件,增加spike运行环境,然后source或者在新的终端运行。
5 pk安装
5.1 裸机32位gcc版本导致安装pk时报错
其实一开始我没有安装裸机64位gcc,而是裸机32位gcc,在这种情况下安装pk时在make步骤会报错:
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small
make: *** [Makefile:332: file.o] Error 1
也就是说pk的安装需要确保有riscv64-unknown-elf-gcc,因此才又安装了该版本gcc。
5.2 由于虚拟机磁盘空间不足,编译中断
安装过程中make步骤中断退出,因为磁盘不够,需要先进行扩容。
关闭虚拟机,在虚拟机设置里改为100G。
但由于磁盘空间不足虚拟机无法重启,出现如下提示:
/dev/sda3 : clean , ***files , ***blocks
参考下面链接的方案删除了32位gcc的编译和安装文件。后续安装gpated进行磁盘分配。
https://blog.csdn.net/SunshineLiy/article/details/134372529
5.3 部分裸机64位gcc版本也会导致pk安装报错
64位裸机gcc安装的配置有很多种选择,例如我第一次使用下面这样的配置:
.. /configure -- prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=lp64
gcc编译没问题,但是安装pk时会报错
./pk/syscall.c:540: Error: unrecognized opcode `csrr a3,cycle', extension `zicsr' required
5.4 可以成功安装pk的裸机64位gcc版本以及pk安装
参考另一个博主的文章
https://blog.csdn.net/qq_45149657/article/details/134070279
再次重新安装裸机64位gcc。multilib使能,因此也可以编译32位。
cd build64
make clean
../configure --prefix=/opt/riscv64 --enable-multilib
make -j8
Pk编译的配置使用如下命令
../configure --prefix=/opt/riscv64 --host=riscv64-unknown-elf --with-arch=rv64gc_zifence --prefix=/opt/pk
sudo make -j8
make install
到这里pk安装完成了,还是像前面的软件一样,配置bashrc文件,并在下面的spike启动命令前source更新的bashrc文件。
下面这条命令即联合spike和pk运行先前用gcc编译得到的hello文件。
spike pk hello
6 QEMU安装
cd ../qemu/
mkdir build
cd build/
6.1 缺少ensurepip 导致配置时报错
../configure --target-list=riscv64-linux-user
运行后报错
python determined to be '/usr/bin/python3'
python version: Python 3.10.12
*** Ouch! ***
Python's ensurepip module is not found.
It's normally part of the Python standard library, maybe your distribution packages it separately?
Either install ensurepip, or alleviate the need for it in the first place by installing pip and setuptools for '/usr/bin/python3'.
(Hint: Debian puts ensurepip in its python3-venv package.)
使用下面的命令按照报错提示安装
sudo apt update
sudo apt install python3-venv # python3-venv中包含ensurepip 模块
sudo apt install python3-pip
pip3 install setuptools # 安装setuptools模块
../configure --target-list=riscv64-linux-user --prefix=/opt/qemu
6.2 缺少tomli导致配置时报错
但是运行后继续报错
python determined to be '/usr/bin/python3'
python version: Python 3.10.12
mkvenv: Creating non-isolated virtual environment at 'pyvenv'
*** Ouch! ***
found no usable tomli, please install it
安装tomli
sudo apt-get -y install python3-tomli
../configure --target-list=riscv64-linux-user --prefix=/opt/qemu
6.3 无法找到Ninja导致配置时报错
再次报错
ERROR: Cannot find Ninja
需要安装下面的软件。
pip3 install Sphinx sphinx_rtd_theme #安装Sphinx,这个步骤总是会因为网络连接的问题退出,需要多次重新运行
sudo apt install ninja-build # 安装ninja
出现一些warning,按照提示修改bashrc。
WARNING: The script pygmentize is installed in '/home/plankton/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
继续安装并配置
sudo apt install ninja-build
../configure --target-list=riscv64-linux-user --prefix=/opt/qemu
6.4 meson setup失败导致配置报错
报错
../meson.build:995:10: ERROR: Dependency lookup for glib-2.0 with method 'pkgconfig' failed: Pkg-config for machine host machine not found. Giving up.
A full log can be found at /home/plankton/Desktop/riscv-gnu-toolchain/qemu/build/meson-logs/meson-log.txt
ERROR: meson setup failed
安装,这次配置后没有报错了
sudo apt install libglib2.0-dev
../configure --target-list=riscv64-linux-user --prefix=/opt/qemu
6.5 先前误删文件导致重装pk
此时尝试运行spike pk hello时出现如下报错
terminate called after throwing an instance of 'std::runtime_error'
what(): could not open pk; searched paths:
. (current directory)
/opt/spike/riscv64-unknown-elf/bin/ (based on configured --prefix and --with-target)
发现opt里没有pk文件夹,以为被误删,因此重新装了pk……
../configure --prefix=/opt/pk --host=riscv64-unknown-elf --with-arch=rv64gc_zifence
重装之后才发现之前pk安装在riscv64下了,下面是上次安装的命令= =。
../configure --prefix=/opt/riscv64 --host=riscv64-unknown-elf --with-arch=rv64gc_zifence
现在的情况是必须给出pk的绝对路径才能运行。好像是pk有多个版本就必须这样。
spike /opt/pk/riscv64-unknown-elf/bin/pk helloelf
= =然鹅,由于直接暴力把riscv64/riscv64-unknown-elf删除,没注意其中不仅有pk的东西还有gcc的东西,导致现在gcc运行不起来。
/opt/riscv64/bin/riscv64-unknown-elf-ld: cannot find crt0.o: No such file or directory
/opt/riscv64/bin/riscv64-unknown-elf-ld: cannot find hellotest: No such file or directory
/opt/riscv64/bin/riscv64-unknown-elf-ld: cannot find -lc: No such file or directory
/opt/riscv64/bin/riscv64-unknown-elf-ld: cannot find -lgloss: No such file or directory
collect2: error: ld returned 1 exit status
决定再重新安装一次gcc。
删除opt/riscv64,回到riscv/tool/chain/build64文件夹内
重复之前的安装过程。现在可以
make clean
spike /opt/pk/riscv64-unknown-elf/bin/pk helloelf
但是又出了问题,qemu的安装忘记sudo make直接make install了!!!
删掉build重新安装,配置的时候设置一下安装路径,放在opt里。
../configure --target-list=riscv64-linux-user –prefix=/opt/qemu
6.6 sphinx导致的make失败
Make时出现
FAILED: docs/docs.stamp
/usr/bin/env CONFDIR=etc/qemu /home/plankton/Desktop/riscv-gnu-toolchain/qemu/build/pyvenv/bin/sphinx-build -q -W -Dkerneldoc_werror=1 -j auto -Dversion=9.2.0 -Drelease= -Ddepfile=docs/docs.d -Ddepfile_stamp=docs/docs.stamp -b html -d /home/plankton/Desktop/riscv-gnu-toolchain/qemu/build/docs/manual.p /home/plankton/Desktop/riscv-gnu-toolchain/qemu/docs /home/plankton/Desktop/riscv-gnu-toolchain/qemu/build/docs/manual
Traceback (most recent call last):
File "/home/plankton/Desktop/riscv-gnu-toolchain/qemu/build/pyvenv/bin/sphinx-build", line 5, in <module>
from sphinx.cmd.build import main
ModuleNotFoundError: No module named 'sphinx'
尝试了各种操作,总是sphinx出问题,因此卸载重装
sudo uninstall Sphinx sphinx_rtd_theme
sudo install Sphinx sphinx_rtd_theme
再次经历漫长的下载过程,网速不稳定需要多次重新下载。下载完成后有warning,据说是因为sphinx应该放在虚拟环境里下载。但是这里就先这样了。
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
最终的安装:
../configure --target-list=riscv64-linux-user –prefix=/opt/qemu
Sudo make -j8
Sudo make install
Qemu-riscv64 -version #记得把/opt/qemu放在PATH里。
Qemu-riscv64 hellotest #运行先前编译好的程序,打印出hello world。
7 最终的成果:)

更多推荐



所有评论(0)