golang插件如何验证软件包的版本?
我尝试使用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
插件时总是出现运行时错误。打开
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
?在这里,添加链接中可能包含的其他信息非常重要。因为链接的答案会随着时间的推移而中断。谢谢