golang插件如何验证软件包的版本?

golang插件如何验证软件包的版本?,go,plugins,Go,Plugins,我尝试使用golang插件,调用插件时总是出现运行时错误。打开 plugin.Open:插件是用不同版本的软件包构建的 我确信这个插件是用同样的代码构建的。现在我完全被错误信息弄糊涂了 这些验证机制是如何工作的 src/runtime/plugin.go: for _, pkghash := range md.pkghashes { if pkghash.linktimehash != *pkghash.runtimehash { md.bad = true

我尝试使用golang插件,调用
插件时总是出现运行时错误。打开

plugin.Open:插件是用不同版本的软件包构建的

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


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

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
    }
}

为供将来参考,这些散列计算如下:
它似乎读取包的二进制输出,因此任何对二进制代码有任何影响的内容都可以考虑进去。

链接器看到abi更改。模块通过散列进行比较,因此您只能知道它们不匹配,但两个版本之间存在差异。另外,请确保您使用最新的Go 1.9.2来编译插件和主应用程序。在以前的版本中有一个bug(有关详细信息,请参阅)。@icza我已经将编译器版本更新到1.9.2,并重新编译了所有代码。错误仍然存在…@Artish然后也许你可以发布一个。谢谢你的回答@peterSO。您能否描述如何计算
linktimehash
&
runtimehash
?在这里,添加链接中可能包含的其他信息非常重要。因为链接的答案会随着时间的推移而中断。谢谢