【问题标题】:Plugin already loaded插件已加载
【发布时间】:2021-11-19 10:17:20
【问题描述】:

当我第二次加载插件时遇到这个奇怪的问题,它抛出错误

plugin.Open("/path/to/plugin"): plugin already loaded

来自documentation,它说

 Open opens a Go plugin. If a path has already been opened, then the existing *Plugin is returned. 
 It is safe for concurrent use by multiple goroutines.

但是,当我尝试多次加载插件时,情况并非如此。 Issue 提到了这一点,但建议的修复不适用于较新的版本。

可以在here找到一个最小的可重现示例

任何帮助表示赞赏:) 提前致谢

【问题讨论】:

    标签: go plugins


    【解决方案1】:

    这是问题#47298。您不能使用两个不同的 .so 名称加载完全相同的插件。

    我能想到这些可能的解决方法:

    1. 为不同的插件使用唯一的模块路径 (go.mod),并构建整个子文件夹而不是 plugin.go

      plugin1/go.mod:

      module plugin1
      . . .
      

      $ go build -buildmode=plugin -o ../driver/plugin1.so

      plugin2/go.mod:

      module plugin2
      . . .
      

      $ go build -buildmode=plugin -o ../driver/plugin2.so

    2. 从源文件(如plugin.go)构建时,插件路径是从源代码的 SHA 哈希生成的。因此,您可以在源代码中更改至少 1 个字符,您将获得不同的插件路径。

      (修改plugin.go)

      $ go build -buildmode=plugin -o ../driver/plugin1.so plugin.go

      $ readelf -aW ../driver/plugin1.so | grep PluginFunc

      - 将打印一个不同的名称,例如 plugin/unnamed-27fe628be05583084aa4668ab292c47e13b9e93d.PluginFunc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      相关资源
      最近更新 更多