48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
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
|
|
}
|