交叉编译工具


巩固善其事必先利其器,由于我们大多使用的是 X86 或者 ARM指令集的计算机设备,如果想要在我们的X86\ARM机器上将代码转换为 RISCV 指令集机器上可以运行的程序,我们需要首先完成交叉编译器工具的准备。

1. 章节目标

在体系结构研究中常用的测试套件SPEC的的各个测试程序是由 C、C++ 和 FORTRAN 语言编写的,想要将他们的源代码在我们的 x86 PC 上转换为 RISCV 机器上的可执行程序,就需要交叉编译工具。简单的说我们在这一章节需要完成的任务是获得一套能在你的计算机上生成 RISCV 可执行程序的编译工具链。

2. GNU 工具链介绍

我们可以从 newbing 轻松问到下面的内容。对于我们的目标 RISCV 机器,我们需要的是 riscv-gnu-toochain

GNU工具链(英语:GNU toolchain)是一个包含了由GNU计划所产生的各种编程工具的集合,由自由软件基金会负责维护工作。这些工具形成了一条工具链,用于开发应用程序和操作系统。GNU工具链在针对嵌入式系统的Linux内核、BSD及其它软件的开发中起着至关重要的作用。

3. 下载构建 RISCV-GNU-TOOCHAIN

运行以下命令即可完成,具体可以参见其官方仓库的文档。

  1. 源码下载
  • 推荐使用软件所的脚本从镜像仓库下载完整源码
1
curl https://mirror.iscas.ac.cn/riscv-toolchains/git/riscv-collab/riscv-gnu-toolchain.sh | bash #下载仓库 && 子模块
  • 也可以使用github源码仓库下载
1
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git #下载仓库
  1. 配置安装信息
1
2
3
4
5
6
cd riscv-gnu-toolchain && mkdir -p build && cd build

# 配置最终安装路径等安装信息
# 注意:路径需要为绝对路径
# 高版本的 gnu 编译套件将 zicsr 和 zifence 独立了出来
../configure --prefix=$HOME/software/riscv-gnu-toolchain --with-arch=rv64gc_zba_zbb_zbc_zbs_zicsr_zifencei

值得注意的是默认情况下不会生成 riscv-unknown-elf-fortran 的编译器,如果需要,则得在configure配置安装信息之后修改 build/Makefile 文件的目标 stamps/build-gcc-newlib-stage2 的规则 —enable-languages,增加上 fortran

1
--enable-languages=c,c++,fortran \
  1. 编译安装
1
2
3
4
# 编译安装 riscv-unknown-elf- 系列工具链
make -j $(nproc)
# 编译安装 riscv-unknown-linux- 系列工具链
make linux -j $(nproc)

安装完成后,其文件树如下,我的安装路径

1
2
3
4
5
6
7
8
9
/path/to/install
├── bin
├── include
├── lib
├── libexec
├── riscv64-unknown-elf
├── riscv64-unknown-linux-gnu
├── share
└── sysroot
  1. 添加环境变量
1
2
export RISCV=$HOME/software/riscv-gnu-toolchain
export PATH=$RISCV/bin:$PATH
  1. 检查安装结果
1
2
riscv64-unknown-elf-gcc --version
riscv64-unknown-linux-gcc --version

4.章节验收

编译一个 helloword 使用 qemu 运行