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
更多关于Golang X/sys是否支持linux/sparc64架构?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据你的错误信息,这确实是 golang.org/x/sys 在 linux/sparc64 架构下支持不完整导致的问题。具体来说:
问题分析
-
cpu/cpu.go中的cacheLineSize未定义:在cpu_linux_sparc64.go文件中缺少对应的cacheLineSize常量定义。 -
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 支持:
- 克隆
golang.org/x/sys仓库 - 添加缺失的 SPARC64 特定文件
- 编写测试验证功能
- 提交 Pull Request
当前问题主要是缺少架构特定的实现文件,而不是 gccgo 的问题。通过添加这些缺失的文件,你应该能够成功构建。

