技术知识库
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。