{"record":{"id":"319b37593802cfd5","repo":"Pumpkin-MC/Pumpkin","slug":"missing-plugin-entrypoint","errorCode":null,"errorMessage":"Missing plugin entrypoint","messagePattern":"Missing plugin entrypoint","errorType":"error_code","errorClass":"LoaderError","httpStatus":null,"severity":"error","filePath":"crates/pumpkin/src/plugin/loader/mod.rs","lineNumber":45,"sourceCode":"    /// Check if this loader can handle the given file\n    fn can_load(&self, path: &Path) -> bool;\n\n    fn unload(&self, data: Box<dyn Any + Send + Sync>) -> PluginUnloadFuture<'_>;\n\n    /// Checks if the plugin can be safely unloaded.\n    fn can_unload(&self) -> bool;\n}\n\n/// Unified loader error type\n#[derive(Error, Debug)]\npub enum LoaderError {\n    #[error(\"Failed to load library: {0}\")]\n    LibraryLoad(String),\n\n    #[error(\"Missing plugin metadata\")]\n    MetadataMissing,\n\n    #[error(\"Missing plugin entrypoint\")]\n    EntrypointMissing,\n\n    #[error(\"Plugin initialization failed: {0}\")]\n    InitializationFailed(String),\n\n    #[error(\"Runtime error: {0}\")]\n    RuntimeError(String),\n\n    #[error(\"Invalid loader data\")]\n    InvalidLoaderData,\n\n    #[error(\n        \"Plugin was built for an incompatible API version. Please rebuild it against this Pumpkin build.\"\n    )]\n    ApiVersionMissing,\n\n    #[error(\n        \"Plugin API version mismatch (plugin {plugin_version}, server {server_version}). Please rebuild it against this Pumpkin build.\"","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin/src/plugin/loader/mod.rs#L27-L63","documentation":"This is LoaderError::EntrypointMissing. It means the plugin library loaded and metadata was found, but the expected plugin entrypoint symbol/function could not be resolved from the dynamic library. Without the entrypoint the loader cannot instantiate the plugin.","triggerScenarios":"Raised when the loader looks up the entrypoint symbol in the loaded library and it is absent — e.g. the plugin exports no entry function or it was renamed/not exported publicly.","commonSituations":"Plugin author forgot to mark the entrypoint with the required macro/export; plugin built for an older API where the entrypoint symbol name differed; LTO/stripping removing the symbol.","solutions":["Define and export the entrypoint using the current Pumpkin plugin entrypoint macro","Rebuild the plugin against the matching Pumpkin version (symbol names can change between versions)","Ensure the entrypoint function is pub and not stripped (check build profile for LTO/strip settings)","Verify with nm/objdump that the expected entrypoint symbol is present in the built library"],"exampleFix":"null","handlingStrategy":"validation","validationCode":"// verify the entrypoint symbol exists in the built library\n// nm -D target/release/libmyplugin.so | grep <entrypoint_symbol>","typeGuard":"null","tryCatchPattern":"match loader.load(path) {\n    Err(LoaderError::EntrypointMissing) => eprintln!(\"plugin exports no entrypoint; check the #[plugin] entry macro\"),\n    Ok(p) => enable(p),\n    Err(e) => return Err(e),\n}","preventionTips":["Use the current entrypoint macro from pumpkin-plugin","Avoid LTO/strip settings that remove exported symbols","Verify built libraries with nm before shipping"],"tags":["plugin","loader","entrypoint","rust","dynamic-library"],"backgroundTag":"missing-dependency","analyzedSha":"8d4639e25a57c15e47448ec327c780d41bbf2356","analyzedAt":"2026-09-09T15:32:22.916Z","contentChangedAt":"2026-09-09T15:32:22.916Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}