尝试
Xray v1.7.5要求go 1.20,所以首先需要检查自己的go版本:go version
,如果版本低于1.20则需要先升级go。
wget https://github.com/XTLS/Xray-core/archive/refs/tags/v1.7.5.tar.gz
tar xzf v1.7.5.tar.gz
cd Xray-core-1.7.5/
# https://github.com/XTLS/Xray-core#linux--macos
go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
会报错:
# github.com/refraction-networking/utls/cpu
../../go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/cpu_loong64.go:10:7: CacheLineSize redeclared in this block
../../go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/cpu.go:20:5: other declaration of CacheLineSize
../../go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/cpu.go:15:30: undeclared name CacheLinePadSize for array length
../../go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/cpu.go:20:29: undefined: CacheLinePadSize
../../go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/cpu.go:123:2: undefined: doinit
这表明utls@v1.2.2这个包不支持loong64。
分析
理论上utls v1.1.5以后就已经支持了loong64才对:https://github.com/refraction-networking/utls/releases/tag/v1.1.5,但可能是后续无人维护导致loong64又不受支持了。我们进去看看:
cd ~/go/pkg/mod/github.com/refraction-networking/utls@v1.2.2-0.20230207151345-a75a4b484849/cpu/
cpu_loong64.go
:
package cpu
const CacheLineSize = 64
func initOptions() {
}
对比cpu_x86.go
:
package cpu
const CacheLinePadSize = 64
...
func doinit() {
我们可以看到它确实是少了个叫做CacheLinePadSize
的变量以及叫doinit
的函数。但是它们应该怎么设置呢?经过一番搜索,我发现了cpu_loong64.go
的最新版本:https://cs.opensource.google/go/go/+/refs/tags/go1.20.5:src/internal/cpu/cpu_loong64.go
所以只需要把cpu_loong64.go
改成这样就可以了:
//go:build loong64
// +build loong64
package cpu
const CacheLinePadSize = 64
func doinit() {}
这个go自带的package cpu
是internal package,外部包是不能使用的:https://stackoverflow.com/questions/46377604/cannot-find-package-internal-cpu-error-in-go。这也就是为什么utls的作者需要将cpu
目录拷贝出来自己维护了。(Update: 好像golang把这个cpu包导出了:<golang.org/x/sys/cpu>)。
修复
我们先把utls clone下来:
git clone https://github.com/refraction-networking/utls
cd utls
git checkout v1.2.2
cd cpu
然后把里面的cpu_loong64.go
的内容替换为:https://cs.opensource.google/go/go/+/refs/tags/go1.20.5:src/internal/cpu/cpu_loong64.go
然后编辑Xray-core-1.7.5/go.mod
,在最后加上:
replace github.com/refraction-networking/utls => 修改过后的utls本地路径
然后go mod tidy
,再重新编译就可以了:
go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
参考:https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/
Update: 作者已经决定用golang的cpu包了:https://github.com/refraction-networking/utls/pull/195