diff options
Diffstat (limited to 'plugincheck/check.go')
| -rw-r--r-- | plugincheck/check.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/plugincheck/check.go b/plugincheck/check.go new file mode 100644 index 0000000..8d3b683 --- /dev/null +++ b/plugincheck/check.go @@ -0,0 +1,47 @@ +package plugincheck + +import ( + "debug/buildinfo" + "errors" + "fmt" + "runtime/debug" +) + +// CheckPluginCompatibility verifies that the plugin .so file was built +// with the same Go version and dependency versions as the host binary. +func CheckPluginCompatibility(pluginPath string) error { + pluginInfo, err := buildinfo.ReadFile(pluginPath) + if err != nil { + return fmt.Errorf("failed to read plugin build info: %w", err) + } + + mainInfo, ok := debug.ReadBuildInfo() + if !ok { + return errors.New("failed to read main binary build info") + } + + if pluginInfo.GoVersion != mainInfo.GoVersion { + return fmt.Errorf("Go version mismatch: plugin=%s, host=%s", + pluginInfo.GoVersion, mainInfo.GoVersion) + } + + // Create a map of main binary dependencies for quick lookup + hostDeps := make(map[string]string) + for _, dep := range mainInfo.Deps { + hostDeps[dep.Path] = dep.Version + } + + // Compare plugin dependencies + for _, dep := range pluginInfo.Deps { + hostVer, ok := hostDeps[dep.Path] + if !ok { + return fmt.Errorf("dependency %s not found in host binary", dep.Path) + } + if dep.Version != hostVer { + return fmt.Errorf("dependency version mismatch for %s: plugin=%s, host=%s", + dep.Path, dep.Version, hostVer) + } + } + + return nil +} |
