RISC-V平台上如何修改Golang的默认ISA扩展配置

RISC-V平台上如何修改Golang的默认ISA扩展配置 目前,遵循大多数发行版所采用的配置方案,Go 编译器生成的二进制文件默认使用 rv64gc 扩展集。

我正在开发一款自定义 CPU,希望将默认的目标架构更改为 rv64g(即 rv64imafd),即不支持压缩指令。

在 GNU 工具链、Clang、LLVM 和 Rust 上修改默认目标相对容易。但我不确定在 Go 中该如何处理这个问题。如有任何帮助,我将不胜感激。

1 回复

更多关于RISC-V平台上如何修改Golang的默认ISA扩展配置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中修改RISC-V平台的默认ISA扩展配置需要通过修改Go工具链源码并重新编译。以下是具体步骤:

  1. 定位并修改目标架构配置: Go工具链的RISC-V目标配置位于 src/cmd/internal/objabi/elf.gosrc/cmd/compile/internal/riscv64/riscv64.go 中。需要将默认的 rv64gc 改为 rv64g

    示例修改: 在 src/cmd/internal/objabi/elf.go 中找到 riscv64 相关配置,修改 EF_RISCV_RVC 标志的默认设置:

    // 原始配置
    case "riscv64":
        flags = EF_RISCV_RVC
    
    // 修改为(移除RVC支持)
    case "riscv64":
        flags = 0
    

    src/cmd/compile/internal/riscv64/riscv64.go 中修改指令生成逻辑,禁用压缩指令:

    // 查找并修改proginfo函数中的默认ISA设置
    func proginfo(p *obj.Prog) {
        // 将默认的GC扩展改为G
        p.As = obj.ACALL
        p.Scond = riscv64.C_RVC // 移除此行或修改为不包含压缩指令
    }
    
  2. 重新编译Go工具链: 修改完成后,在Go源码根目录执行编译命令:

    cd src
    ./make.bash
    

    或者使用 go_bootstrap 进行交叉编译:

    GOOS=linux GOARCH=riscv64 ./bootstrap.bash
    
  3. 验证修改: 编译一个测试程序并检查生成的二进制文件:

    package main
    
    func main() {
        println("Hello, RISC-V without C extension")
    }
    

    使用 objdump 检查是否包含压缩指令:

    riscv64-unknown-elf-objdump -d testprogram | grep c.addi
    

    如果修改成功,输出中不应出现 c.addi 等压缩指令。

注意:Go工具链对RISC-V的支持仍在演进中,具体代码位置可能随版本变化。建议参考当前使用的Go版本源码进行修改。

回到顶部