summaryrefslogtreecommitdiff
path: root/plugincheck/check.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugincheck/check.go')
-rw-r--r--plugincheck/check.go47
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
+}