技术知识库

Linux 5.0 RISC-V 无法使用 GCC 15 和 Binutils 2.46 编译

Linux 5.0 RISC-V 无法使用 GCC 15 和 Binutils 2.46 编译

摘要

Linux 5.0 的 RISC-V 端口使用旧特权规范 CSR 名称和旧 ISA 扩展表达方式,不能直接由 Ubuntu 26.04 的 GCC 15.2/Binutils 2.46 构建。当前选择独立安装 Bootlin 2018.11 工具链(GCC 8.2、Binutils 2.31.1),避免污染系统工具链,也暂不修改教学内核源码。

现象

entry.S:92: Error: unknown CSR `sbadaddr'
irqflags.h:30: Error: unrecognized opcode `csrs sstatus,a5', extension `zicsr' required
ld.bfd: internal error: aborting ... cmdline_check_object_only_section

触发命令:

make ARCH=riscv \
  CROSS_COMPILE=riscv64-linux-gnu- \
  O=build/riscv \
  -j"$(nproc)"

根因

  • Linux 5.0 使用旧 CSR 名 sbadaddr;新规范使用 stval。
  • Linux 5.0 生成 rv64im... ISA 字符串;现代汇编器要求把 CSR 指令扩展显式写为 zicsr。
  • Binutils 2.46 的新链接行为与旧 RISC-V VDSO 构建产生额外不兼容。
  • 仓库 arch/riscv/configs/debian_defconfig 记录的原始编译器为 Ubuntu 18.04 GCC 7.3,说明实验代码预期的是旧工具链语义。

选择的解决方案

从 Bootlin 官方归档下载并校验:

riscv64--glibc--bleeding-edge-2018.11-1
GCC 8.2.0
Binutils 2.31.1

安装位置:

/home/martin-zou/workspace/toolchains/riscv64--glibc--bleeding-edge-2018.11-1

构建时使用完整前缀,避免误用 /usr/bin 中的 GCC 15:

RISCV_TOOLCHAIN=/home/martin-zou/workspace/toolchains/riscv64--glibc--bleeding-edge-2018.11-1/bin/riscv64-buildroot-linux-gnu-

旧、新工具链中间产物不可混用。重新构建前执行保留 .config 的清理:

make ARCH=riscv \
  CROSS_COMPILE="$RISCV_TOOLCHAIN" \
  O=build/riscv \
  clean

结果

旧工具链已经下载并解压,前缀已确认。完整内核重编结果尚待验证,因此本笔记保持 status: growing。

关联