The reference manual describes the plugin public API in cppreference-style one-page-per-symbol format. The generated Doxygen tree is the exhaustive machine-produced companion — every signature, every private helper, the class / collaboration / include / call graphs. This manual is the human-written one: same symbols, the why rather than only the what.

The three modules

ModuleHeader prefixNamespaceArtefact
catalog & registrationplugin/plugin::header-only (plugin)
the loaderdso/fedem::dsolibdsold.so
signing & trustsign/fedem::signlibplugin-sign.a
#include <plugin/Plugin.hh>          // Plugin<Base>, create(), CATALOG
#include <plugin/PluginRegister.hh>  // REGISTER, REGISTER_WITH_CONFIG, ...
#include <plugin/PluginCatalog.hh>   // PluginCatalog<Base>, CREATECATALOG
#include <dso/DSOLoader.hh>          // fedem::dso::DSOLoader
#include <dso/DSOExceptions.hh>      // fedem::exception::FileNotFound, SignatureRejected
#include <sign/Verifier.hh>          // fedem::sign::Verifier, VerifyResult
#include <sign/TrustLevel.hh>        // fedem::sign::TrustLevel
#include <sign/Manifest.hh>          // fedem::sign::Manifest, ManifestData

Symbols

plugin/ — catalog & registration

SymbolKindOne-line summary
Plugin<Base>class templateCRTP base; gives Base its static create / load / catalog.
PluginCatalog<Base>class templateThread-safe map of key → Creator<Base>.
Creator<Base>class templateHolds a default and an optional config factory callable.
PluginRegisterer / macrosclass templates + macrosInsert on construction, erase on destruction.

dso/ — the loader

SymbolKindOne-line summary
DSOLoaderclass (static-only)Thread-safe dlopen wrapper; load one, a directory, or a path.
SignedLoadResultstructReturn of loadSignedloaded, soPath, trust, detail.

sign/ — signing & trust

SymbolKindOne-line summary
TrustLevelenum classTRUSTED / UNKNOWN / UNSIGNED / REJECTED.
Manifestclass (static-only)Read / write the .dso_manifest + .dso_sig ELF sections.
Verifierclass (static-only)Ed25519-verify a DSO; per-path result cache.
fedem::exception::*classesFileNotFound, SignatureRejected.

For new readers

Start with User Guide › Getting Started — it walks the whole model in one page. Then come back here for the per-symbol detail.

Design decisions worth knowing about

One catalog per Base, defined once. Plugin<Base>::catalog() is declared by the template and defined by CREATECATALOG(Base) in exactly one translation unit — the host's. Every REGISTER in every DSO resolves to that one object (via RTLD_GLOBAL). See CREATECATALOG.

Unknown key → nullptr, not an exception. A missing key almost always means a plugin DSO did not load. Genuine misuse (wrong config type) throws.

Config is type-erased through std::any. REGISTER_WITH_CONFIG stores a factory that std::any_casts to the registered Config type; a mismatch is a runtime std::bad_any_cast. There is no compile-time link between the caller's config type and the plugin's.

Handles live for the process. DSOLoader never exposes unload — see the FAQ.