From edb3e23311b9cd667898e625b07f5dbeb43e30e3 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sat, 16 Aug 2025 16:23:08 -0500 Subject: fixes to test plugins by os.Exec() --- plugincheck/check.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 plugincheck/check.go (limited to 'plugincheck') 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 +} -- cgit v1.2.3