RISC-V 工具链的官方仓库 README 文档中的操作说明已经比较详细了,本文主要是记录指定的 GCC 版本来构建工具链的方法。

如果出于某些原因,需要构建基于旧版 GCC 的工具链,可以按照本文步骤操作。

实际上,这是仓库 README 中已有过说明的方法,但是我之前一直没注意到,长期以来笨拙地根据 GCC 发布日志寻找对应的日期 tag 来编译对应版本的工具链……

1 系统环境

本文在 Debian 13 上构建 GCC 版本 15.2.0 的 RISC-V GNU 工具链,主机上的 GCC 版本为 apt 包管理器直接安装的 14.2.0 版。

1
2
3
4
5
6
7
➜  ~ uname -a
Linux minisforum 6.12.74+deb13+1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.74-2 (2026-03-08) x86_64 GNU/Linux
➜ ~ gcc --version
gcc (Debian 14.2.0-19) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2 准备

2.1 获取工具链代码

注意这里不需要手动获取(--recursive)所有 submodules,在编译时会自动按需获取。

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

2.2 安装依赖

1
2
3
4
5
sudo apt update
sudo apt install autoconf automake autotools-dev curl python3 python3-pip \
python3-tomli libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison \
flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build \
git cmake libglib2.0-dev libslirp-dev libncurses-dev

2.3 获取 GCC 代码

当前的 riscv-gnu-toolchain master 分支已经把 GCC 版本更新至 15.2.0,这里主要是展示指定的 GCC 版本构建的方法。手动下载 GCC 源码,不依赖 riscv-gnu-toolchain 自动获取。

下面步骤通过 GCC 的 git 仓库获取代码,直接在 GNU 网站上下载 tar 包后解压也是可以的。

1
2
3
4
5
# 在 riscv-gnu-toolchain 目录外
git clone https://github.com/gcc-mirror/gcc.git
cd gcc
git checkout -b branch-15.2.0
git reset --hard releases/gcc-15.2.0

此时的目录结构如下:

1
2
3
4
5
6
➜  ~ pwd
/home/ubuntu
➜ ~ ls -l
total 8
drwxrwxr-x 41 ubuntu ubuntu 4096 Apr 26 19:36 gcc
drwxrwxr-x 21 ubuntu ubuntu 4096 Apr 26 18:58 riscv-gnu-toolchain

3 编译安装

3.1 配置

1
2
3
4
5
6
7
8
9
cd riscv-gnu-toolchain
mkdir build && cd build

../configure \
--with-arch=rv64imafdcv_zicbom_zicboz_zicntr_zicond_zicsr_zifencei_zihintpause_zfh_zba_zbb_zbc_zbs_zkt \
--with-abi=lp64d \
--disable-multilib \
--with-gcc-src=$HOME/gcc \
--prefix=$HOME/.local/riscv-15.2.0

其中关键的参数就是 --with-gcc-src,该参数指定了 GCC 代码目录,配置了该参数后编译时就会直接使用其中代码,而不会再自动获取。

  • --with-arch 参数指定了一些架构特性,应当根据目标机器支持的特性来设置。删除高级特性可以保持较高的兼容性,可以直接使用 rv64imafdcv 或者 rv64i
  • --enable-multilib/--disable-multilib 参数同时编译会 32-bit 支持,一般不会用到,这里直接禁用;
  • --prefix 参数指定工具链安装路径。

3.2 编译

正如前面提到,编译时 riscv-gnu-toolchain 会自动获取所需的软件包,此时需要良好的网络连接。

编译后可执行文件会自动安装至之前配置的安装目录中:

1
2
3
4
# 使用 newlib 作为 C 库编译
make -j$(nproc)
# 使用 glibc 作为 C 库编译
make linux -j$(nproc)

关于选择 newlib 还是 glibc 这里不做展开,简单来说就是 newlib 一般用来编译裸机程序、嵌入式程序(固件、bootloader等),其工具链的前缀是 riscv64-unknown-elf-;glibc 有完整 POSIX 支持,一般用来编译 Linux 用户空间程序和 Kernel(Kernel 虽然是“裸机程序”,但也包含一些共享库组件),工具链前缀为 riscv64-unknown-linux-gnu-

编译中如果出现错误,可以删除 build 目录后重新配置、编译。

3.3 设置环境变量

把安装目录加入到 PATH 环境变量中,可以在任意目录中使用编译的工具链。

1
export PATH="$HOME/.local/riscv-15.2.0/bin:$PATH"

查看编译安装结果:

1
2
3
4
5
6
7
8
9
10
11
➜  ~ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (g5115c7e447f) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

➜ ~ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (g5115c7e447f) 15.2.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

本站由 @gsh1209 使用 Stellar 主题创建
Copyright © 2023 - CuriosityNotes.DEV
Favicon图标来自 @ChenCJ
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处
正在计算运行时间...