插件:在发生不匹配时报告用于构建插件的Go版本

az31mfrm  于 3个月前  发布在  Go
关注(0)|答案(3)|浏览(36)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.21.1 linux/amd64

这个问题在最新版本中是否会重现?

Y

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/mfreeman/.cache/go-build'
GOENV='/home/mfreeman/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOOS='linux'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.21.1'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build4277136579=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

go build -buildmode=plugin -o ./handler.so ./main.go

然后当我尝试用另一个程序使用它时:
2023/09/29 02:11:29 main.go:26:插件错误:插件是用google.golang.org/protobuf/internal/pragma包的另一个版本构建的。

你期望看到什么?

它应该告诉我不同版本是什么,这样我就可以匹配它。

你看到了什么?

除了一个不太有用的信息告诉我我使用了错误的版本,但没有告诉我正确的版本应该是什么之外,什么都没有。

af7jpaap

af7jpaap1#

你可以运行go version -m handler.sogo version -m <main_executable>来查找版本以及它们之间的差异。这有帮助吗?

kqlmhetl

kqlmhetl2#

我正在处理一个黑盒情况,我没有访问加载我的共享库的程序,我能看到的只是版本不匹配...。

在2023年9月29日星期五上午10:48,cherrymui ***@***.***>写道:你可以运行go version -m handler.so和go version -m <main_executable>来查找版本以及它们之间的差异。这有帮助吗?——直接回复此电子邮件,查看GitHub上的<#63290 (comment)>,或者取消订阅< https://github.com/notifications/unsubscribe-auth/AAN4Z2TGR36GF4NP2QRNJJTX43UVHANCNFSM6AAAAAA5L2FRQE >。你收到这封邮件是因为你创建了这个线程。消息ID:***@***.***>

jljoyd4f

jljoyd4f3#

你可以运行 go version -m handler.sogo version -m <main_executable> 来查找版本以及它们之间的差异。这有帮助吗?

恐怕在 therearesome 的情况下,go version -m 无法提供帮助。

├── go.mod
├── go.sum
├── main.go
├── plugin
│   ├── go.mod
│   ├── go.sum
│   ├── myplugin.so
│   └── vendor
└── vendor
    ├── golang.org
    └── modules.txt

plugin/myplugin.go :

package main

import (
	"fmt"

	_ "golang.org/x/xerrors"
)

var ExportedVariable int = 42

func ExportedFunction() {
	fmt.Println("Hello from the plugin!")
}

main.go :

package main

import (
	"fmt"
	"plugin"

	_ "golang.org/x/xerrors"
)

func main() {
	p, err := plugin.Open("plugin/myplugin.so")
	if err != nil {
		fmt.Println("Error opening plugin:", err)
		return
	}

	exportedVar, err := p.Lookup("ExportedVariable")
	if err != nil {
		fmt.Println("Error looking up variable:", err)
		return
	}

	varValue, ok := exportedVar.(*int)
	if !ok {
		fmt.Println("Error getting variable value")
		return
	}

	fmt.Println("Exported variable:", *varValue)

	exportedFunc, err := p.Lookup("ExportedFunction")
	if err != nil {
		fmt.Println("Error looking up function:", err)
		return
	}

	exportedFunc.(func())()
}

构建插件:

$ cd plugin
$ go build -buildmode=plugin -mod=vendor -o myplugin.so myplugin.go

构建主程序:

$ cd ..
$ go build -mod=vendor -o main main.go
$ ./main
Error opening plugin: plugin.Open("plugin/myplugin"): plugin was built with a different version of package golang.org/x/xerrors/internal
$ go version -m plugin/myplugin.so
plugin/myplugin.so: devel go1.22-5873bd1d7e Mon Oct 16 03:29:27 2023 +0000
        path    command-line-arguments
        dep     golang.org/x/xerrors    v0.0.0-20231012003039-104605ab7028      h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
        build   -buildmode=plugin
        build   -compiler=gc
        build   CGO_ENABLED=1
        build   CGO_CFLAGS=
        build   CGO_CPPFLAGS=
        build   CGO_CXXFLAGS=
        build   CGO_LDFLAGS=
        build   GOARCH=arm64
        build   GOOS=darwin
        
$ go version -m main
main: devel go1.22-5873bd1d7e Mon Oct 16 03:29:27 2023 +0000
        path    command-line-arguments
        dep     golang.org/x/xerrors    v0.0.0-20231012003039-104605ab7028      h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
        build   -buildmode=exe
        build   -compiler=gc
        build   CGO_ENABLED=1
        build   CGO_CFLAGS=
        build   CGO_CPPFLAGS=
        build   CGO_CXXFLAGS=
        build   CGO_LDFLAGS=
        build   GOARCH=arm64
        build   GOOS=darwin

它应该告诉我不同的版本是什么,这样我就可以进行匹配。
根本原因可能是其他东西:完整的文件路径、构建标志等,而不是包版本。此外,我不确定我们能否知道不同的版本是什么。我在这里尝试做一些更改:

diff --git a/src/runtime/plugin.go b/src/runtime/plugin.go
index 40dfefde17..33022c60f2 100644
--- a/src/runtime/plugin.go
+++ b/src/runtime/plugin.go
@@ -51,7 +51,7 @@ func plugin_lastmoduleinit() (path string, syms map[string]any, initTasks []*ini
        for _, pkghash := range md.pkghashes {
                if pkghash.linktimehash != *pkghash.runtimehash {
                        md.bad = true
-                       return "", nil, nil, "plugin was built with a different version of package " + pkghash.modulename
+                       return "", nil, nil, "plugin was built with a different version of package " + pkghash.modulename + ": got " + *pkghash.runtimehash + ", want " + pkghash.linktimehash
                }
        }

但我得到的是类似这样的东西:

Error opening plugin: plugin.Open("plugin/myplugin"): plugin was built with a different version of package golang.org/x/xerrors/internal: got %uV�┌, ┬▒┼├ NWIꘓ├

相关问题