xhd2015/xgo

是不是不可以和sonic一起使用

Closed this issue · 14 comments

感谢反馈,请问下你用的是Go版本是多少?在什么操作系统上?sonic的版本是多少呢?

我看了下,应该是sonic库的internal/rt这个包只支持amd64导致的:

git clone --depth=1 https://github.com/bytedance/sonic
cd sonic
mkdir -p ./internal/rt_main
cat > ./internal/rt_main/main.go <<'EOF'
package main

import "github.com/bytedance/sonic/internal/rt"

func main() {
	rt.StartProf()
}
EOF

GOARCH=arm64 go build -o /dev/null ./internal/rt_main

Error:

# github.com/bytedance/sonic/internal/ir_main
main.main: relocation target github.com/bytedance/sonic/internal/rt.StartProf not defined

感谢反馈,请问下你用的是Go版本是多少?在什么操作系统上?sonic的版本是多少呢?

go版本:1.21.6
sonic版本:v1.11.3
操作系统:MacOS13,M2芯片
运行命令: xgo test -v -run TestXXX

可以使用 GOARCH=amd64 xgo test -v -run 运行,将架构切换到amd64就能正常运行了,跟在ARM架构上运行gomonkey类似。

可以使用 GOARCH=amd64 xgo test -v -run 运行,将架构切换到amd64就能正常运行了,跟在ARM架构上运行gomonkey类似。

@GaoHaHa-IronMan 这个问题与xgo没有关系,你用go test也会有这个问题。

根本原因是sonic这个包只支持amd64。

你测试的代码有吗,为什么会引用到github.com/bytedance/sonic/internal/rt这个包呢?

可以使用 GOARCH=amd64 xgo test -v -run 运行,将架构切换到amd64就能正常运行了,跟在ARM架构上运行gomonkey类似。

@GaoHaHa-IronMan 这个问题与xgo没有关系,你用go test也会有这个问题。

根本原因是sonic这个包只支持amd64。

你测试的代码有吗,为什么会引用到github.com/bytedance/sonic/internal/rt这个包呢?

使用go test没有问题,测试代码里没用sonic但是我的业务代码里使用了sonic,使用的方法也只是Unmarshal和Marshal方法而已,没有直接引入github.com/bytedance/sonic/internal/rt这个包。Marshal和Unmarshal方法所在文件里有引入github.com/bytedance/sonic/internal/rt这个包。

可以使用 GOARCH=amd64 xgo test -v -run 运行,将架构切换到amd64就能正常运行了,跟在ARM架构上运行gomonkey类似。

@GaoHaHa-IronMan 这个问题与xgo没有关系,你用go test也会有这个问题。
根本原因是sonic这个包只支持amd64。
你测试的代码有吗,为什么会引用到github.com/bytedance/sonic/internal/rt这个包呢?

使用go test没有问题,测试代码里没用sonic但是我的业务代码里使用了sonic,使用的方法也只是Unmarshal和Marshal方法而已,没有直接引入github.com/bytedance/sonic/internal/rt这个包。Marshal和Unmarshal方法所在文件里有引入github.com/bytedance/sonic/internal/rt这个包。

@GaoHaHa-IronMan 有没有一小段代码可以贴出来看看👀, 我没有arm机器,不好构造这个用例

可以使用 GOARCH=amd64 xgo test -v -run 运行,将架构切换到amd64就能正常运行了,跟在ARM架构上运行gomonkey类似。

@GaoHaHa-IronMan 这个问题与xgo没有关系,你用go test也会有这个问题。
根本原因是sonic这个包只支持amd64。
你测试的代码有吗,为什么会引用到github.com/bytedance/sonic/internal/rt这个包呢?

使用go test没有问题,测试代码里没用sonic但是我的业务代码里使用了sonic,使用的方法也只是Unmarshal和Marshal方法而已,没有直接引入github.com/bytedance/sonic/internal/rt这个包。Marshal和Unmarshal方法所在文件里有引入github.com/bytedance/sonic/internal/rt这个包。

@GaoHaHa-IronMan 有没有一小段代码可以贴出来看看👀, 我没有arm机器,不好构造这个用例

main_test.txt
main.txt
这两个文件改下后缀名,然后使用xgo test -v -run TestUserHandler_CreateUser就能复现了。

Thanks, 我测试一下

@GaoHaHa-IronMan 通过CI发现确实有这个问题,👍

https://github.com/xhd2015/xgo/pull/201/checks

image

我尽快解决一下

@GaoHaHa-IronMan 不过sonic确实不支持arm64, 用go运行的时候, 可以看到有这个warning
image

应该与这两个空函数声明有关:
https://github.com/bytedance/sonic/blob/c3fa2d31b8f6d07e8abd81317fc7350e40a34b46/internal/rt/gcwb.go#L104

func StopProf()
func StartProf()

xgo可能没有正确处理函数体为空的情况。

我将会提2个issue:

  • xgo: 修复空函数的情况
  • sonic: 将这两个函数移动到对应的amd64专有文件中

@GaoHaHa-IronMan xgo v1.0.40修复了这个bug,感谢反馈,参见:https://github.com/xhd2015/xgo/releases/tag/v1.0.40

升级:

# update xgo
go install github.com/xhd2015/xgo/cmd/xgo@v1.0.40

# update dependency
go get github.com/xhd2015/xgo/runtime@v1.0.40

@GaoHaHa-IronMan xgo v1.0.40修复了这个bug,感谢反馈,参见:https://github.com/xhd2015/xgo/releases/tag/v1.0.40

升级:

# update xgo
go install github.com/xhd2015/xgo/cmd/xgo@v1.0.40

# update dependency
go get github.com/xhd2015/xgo/runtime@v1.0.40

试了确实可以了。牛🐮