Golang X/sys是否支持linux/sparc64架构?

Golang X/sys是否支持linux/sparc64架构? 大家好!

我有个问题。每当我尝试在 linux/sparc64 上构建 x/sys 时(当然是用 gccgo-12,因为这是唯一受支持的编译器),都会遇到这个错误:

golang.org/x/sys/cpu
golang.org/x/sys/unix
# golang.org/x/sys/cpu
/root/go/pkg/mod/golang.org/x/sys@v0.0.0-20200615200032-f1bc736245b1/cpu/cpu.go:17:30: error: reference to undefined name ‘cacheLineSize’
   17 | type CacheLinePad struct{ _ [cacheLineSize]byte }
      |                              ^
github.com/matrix-org/dendrite/cmd/kafka-producer
# golang.org/x/sys/unix
/root/go/pkg/mod/golang.org/x/sys@v0.0.0-20200615200032-f1bc736245b1/unix/dirent.go:16:12: error: reference to undefined name ‘isBigEndian’
   16 |         if isBigEndian {
      |            ^

浏览 x/sys 的源代码,我看到了多处提到 sparc。但是,其他架构有的文件在 sparc 目录下却没有。

那么,是什么导致了这个问题?是因为 x/sys 不支持 sparc64 吗?还是正在进行中?如果是这样,我能做些什么来帮助 x/sys 获得完整的 sparc 支持?

或者,这是 gccgo(与 gc 相比功能落后)的问题,还是我的系统有什么奇怪的地方?

感谢您抽出时间 :^D


更多关于Golang X/sys是否支持linux/sparc64架构?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang X/sys是否支持linux/sparc64架构?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据你的错误信息,这确实是 golang.org/x/syslinux/sparc64 架构下支持不完整导致的问题。具体来说:

问题分析

  1. cpu/cpu.go 中的 cacheLineSize 未定义:在 cpu_linux_sparc64.go 文件中缺少对应的 cacheLineSize 常量定义。

  2. unix/dirent.go 中的 isBigEndian 未定义:SPARC64 是大端架构,但相关常量可能未正确定义。

当前状态

x/sys 对 SPARC64 的支持确实不完整。虽然代码中有多处 SPARC 引用,但缺少完整的架构特定实现文件。

解决方案

你可以通过添加缺失的架构特定文件来帮助完善支持:

1. 修复 cpu 包的问题

创建或修改 cpu_linux_sparc64.go 文件:

//go:build linux && sparc64
// +build linux,sparc64

package cpu

const cacheLineSize = 64 // SPARC64 典型的缓存行大小

func initOptions() {
    // SPARC64 特定的 CPU 特性检测
}

func doinit() {
    // 初始化逻辑
}

2. 修复 unix 包的问题

unix 包中添加大端架构支持。检查或创建 endian_big.go

//go:build sparc64 || s390x || ppc64 || ppc64le
// +build sparc64 s390x ppc64 ppc64le

package unix

const isBigEndian = true

或者为 SPARC64 创建特定文件:

//go:build linux && sparc64
// +build linux,sparc64

package unix

const isBigEndian = true

// SPARC64 特定的系统调用常量
const (
    SYS_GETDENTS64 = 61 // 示例值,需要验证
    // 添加其他必要的系统调用号
)

3. 验证系统调用号

你需要验证 SPARC64 的实际系统调用号。可以通过以下方式:

package main

import (
    "fmt"
    "golang.org/x/sys/unix"
)

func main() {
    // 测试系统调用
    var uts unix.Utsname
    err := unix.Uname(&uts)
    if err != nil {
        fmt.Printf("Uname error: %v\n", err)
    }
}

4. 构建测试

修复后使用 gccgo 构建测试:

# 设置 gccgo
export CC=gccgo-12
export GO111MODULE=on

# 清理并重新构建
go clean -cache
go build ./...

贡献建议

如果你希望为上游项目贡献 SPARC64 支持:

  1. 克隆 golang.org/x/sys 仓库
  2. 添加缺失的 SPARC64 特定文件
  3. 编写测试验证功能
  4. 提交 Pull Request

当前问题主要是缺少架构特定的实现文件,而不是 gccgo 的问题。通过添加这些缺失的文件,你应该能够成功构建。

回到顶部