【问题标题】:How does golang plugin verify version of packages?golang 插件如何验证包的版本?
【发布时间】:2017-10-31 12:57:49
【问题描述】:

我正在尝试使用 golang 插件,但在调用 plugin.Open 时总是出现运行时错误。

plugin.Open: plugin was built with a different version of package

我确定插件是用相同的代码构建的。现在我完全被错误信息弄糊涂了。

这些验证机制是如何工作的?

【问题讨论】:

  • 链接器看到 abi 更改。这些模块通过哈希进行比较,因此您只会知道它们不匹配,但两个构建之间有些不同。
  • 同时确保你使用最新的 Go 1.9.2 来编译你的插件和你的主应用程序。在以前的版本中存在一个错误(有关详细信息,请参阅go/issues/20248)。
  • @icza 我已经将我的编译器版本更新到 1.9.2 并重新编译了所有代码。错误仍然存​​在...
  • @Artish 那么也许你可以发一个minimal reproducible example

标签: go plugins


【解决方案1】:

src/runtime/plugin.go:

for _, pkghash := range md.pkghashes {
    if pkghash.linktimehash != *pkghash.runtimehash {
        md.bad = true
        return "", nil, "plugin was built with a different version of package " + pkghash.modulename
    }
}

【讨论】:

  • 感谢您的回答@peterSO。你能描述如何计算linktimehash&runtimehash吗?
【解决方案2】:

为了将来参考,这些哈希值在这里计算:https://golang.org/src/cmd/link/internal/ld/lib.go?h=genhash#L807 它似乎读取包的二进制输出,因此任何对二进制代码有任何影响的东西都可以考虑在内。

【讨论】:

  • 您好,添加链接中可能包含的其他信息很重要。因为链接的答案会随着时间的推移而中断。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多