{"record":{"id":"47305214a18009b3","repo":"gotify/server","slug":"missing-getgotifyplugininfo-symbol","errorCode":null,"errorMessage":"missing GetGotifyPluginInfo symbol","messagePattern":"missing GetGotifyPluginInfo symbol","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugin/compat/wrap.go","lineNumber":15,"sourceCode":"package compat\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"plugin\"\n\n\tpapiv1 \"github.com/gotify/plugin-api\"\n)\n\n// Wrap wraps around a raw go plugin to provide typesafe access.\nfunc Wrap(p *plugin.Plugin) (Plugin, error) {\n\tgetInfoHandle, err := p.Lookup(\"GetGotifyPluginInfo\")\n\tif err != nil {\n\t\treturn nil, errors.New(\"missing GetGotifyPluginInfo symbol\")\n\t}\n\tswitch getInfoHandle := getInfoHandle.(type) {\n\tcase func() papiv1.Info:\n\t\tv1 := PluginV1{}\n\n\t\tv1.Info = getInfoHandle()\n\t\tnewInstanceHandle, err := p.Lookup(\"NewGotifyPluginInstance\")\n\t\tif err != nil {\n\t\t\treturn nil, errors.New(\"missing NewGotifyPluginInstance symbol\")\n\t\t}\n\t\tconstructor, ok := newInstanceHandle.(func(ctx papiv1.UserContext) papiv1.Plugin)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"NewGotifyPluginInstance signature mismatch, func(ctx plugin.UserContext) plugin.Plugin expected, got %T\", newInstanceHandle)\n\t\t}\n\t\tv1.Constructor = constructor\n\t\treturn v1, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown plugin version (unrecogninzed GetGotifyPluginInfo signature %T)\", getInfoHandle)","sourceCodeStart":1,"sourceCodeEnd":33,"githubUrl":"https://github.com/gotify/server/blob/14bfc256276775c425f988d621dccfe705de18ac/plugin/compat/wrap.go#L1-L33","documentation":"Wrap() in plugin/compat/wrap.go rejects a Go plugin binary that does not export the required GetGotifyPluginInfo symbol. plugin.Plugin.Lookup returns an error when the compiled .so lacks that exported function, meaning the shared library is not a valid gotify plugin (wrong build, wrong package, or arbitrary .so file).","triggerScenarios":"Thrown at plugin/compat/wrap.go:15 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the plugin as a main package exposing func GetGotifyPluginInfo() papiv1.Info","Ensure the plugin was compiled with the exact same Go version, GOOS and GOARCH as the gotify server","Verify the file being loaded is actually a gotify plugin .so and not an unrelated shared library"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"14bfc256276775c425f988d621dccfe705de18ac","analyzedAt":"2026-09-05T12:52:36.781Z","contentChangedAt":"2026-09-05T12:52:36.781Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}