rclone是一款使用广泛的存储实用工具,支持多种存储后端。由于rclone本身并未提供loongarch64指令集架构的二进制包,需要从源代码进行编译。rclone的源代码采用go语言编写,而go语言在2022年8月的时候自1.19版本开始提供了对loongarch64指令集的支持,但go语言的官网上并未提供编译好的二进制包可供使用。
此外,尽管统信UOS在其apt源中提供了go 1.15的软件包,但较新版本的rclone中的部分模块和依赖需要使用至少1.18版本的go编译器才能正常编译,因此在开始编译rclone之前,首先需要解决在龙芯3A5000上的go语言编译环境。
首先尝试直接在龙芯3A5000上编译go1.19.1版本,但似乎这样做并不能成功,会出现类似如下的错误:
1 2 3 4 5 |
Building Go cmd/dist using /usr/lib/go-1.15. (go1.15.6 linux/loongarch64) Building Go toolchain1 using /usr/lib/go-1.15. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. go tool dist: FAILED: /home/user/go1.19.3/pkg/tool/linux_loong64/go_bootstrap install -i cmd/asm cmd/cgo cmd/compile cmd/link: signal: segmentation fault |
转而尝试使用以下命令在x86或者arm环境下交叉编译生成loongarch64下的go编译器:
1 |
GOOS=linux GOARCH=loong64 ./bootstrap.bash |
然而不幸的是,交叉编译出来的二进制文件在龙芯3A5000上并不能直接运行,运行时报错为segmentation fault
后来,在loongnix官网上看到关于这一状况的说明:
1 2 3 |
问题2: 这里发布的版本与Golang上游社区的版本有什么区别? Golang上游社区发布的Go1.19版本已经加入了对LoongArch64架构的基础支持,但是对内核版本的最小需求是5.19. 这 里发布的Go1.19对内核版本的需求是4.19. 你可以在loongnix桌面系统、loongnix 服务器系统、UOS等操作系统中使用. |
使用uname -a
命令在系统内查看内核版本,确认统信UOS的内核版本的确为4.19,那么此时解决方案也已经明了:使用由龙芯开源社区提供的预编译二进制文件。
配置好相关环境变量后,在rclone目录下执行make
或者go build -v
即可,不过事情并不如想象的那般顺利,此时出现错误提示如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
github.com/shirou/gopsutil/v3/host go.etcd.io/bbolt # github.com/shirou/gopsutil/v3/host ../../go/pkg/mod/github.com/shirou/gopsutil/v3@v3.22.7/host/host_linux.go:98:22: undefined: sizeOfUtmp ../../go/pkg/mod/github.com/shirou/gopsutil/v3@v3.22.7/host/host_linux.go:103:14: undefined: sizeOfUtmp ../../go/pkg/mod/github.com/shirou/gopsutil/v3@v3.22.7/host/host_linux.go:105:9: undefined: utmp # go.etcd.io/bbolt ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/db.go:133:13: undeclared name maxMapSize for array length ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/db.go:422:12: undefined: maxMapSize ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/db.go:440:10: undefined: maxMapSize ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/db.go:441:8: undefined: maxMapSize ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/db.go:932:2: pos declared but not used ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/bolt_unix.go:68:15: undeclared name maxMapSize for array length ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/tx.go:532:12: undefined: maxAllocSize ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/tx.go:533:10: undefined: maxAllocSize ../../go/pkg/mod/go.etcd.io/bbolt@v1.3.6/unsafe.go:27:12: undeclared name maxAllocSize for array length |
这个问题倒是号解决,这是由于一些软件包中没有为loongarch64架构定义相关的值,简单粗暴的办法是将go/pkg/mod/github.com/shirou/gopsutil/[email protected]
目录下的host_linux_amd64.go
复制为host_linux_loong64.go
,并将go/pkg/mod/go.etcd.io/[email protected]
目录下的bolt_amd64.go
复制为bolt_loong64.go
,此时再重新执行make
或者go build -v
即可即可顺利完成编译过程,生成rclone的龙芯3A5000可执行文件,至此在龙芯3A5000上编译rclone的工作全部完成。
Comments