dyn-loader
Dynamic library loader with dyn-fat-pointer-bridge for loading Rust trait objects
from .so/.dylib plugin files.
- DynLib: wraps
libloading::LibrarywithArcfor shared ownership. - AbiDynFatPtr: ABI-stable representation of a Rust fat pointer
(data ptr + vtable ptr),
#[repr(C)]. - AbiStableDynRef: fat pointer + retain/release function pointers, enabling safe cross-boundary Arc-like reference counting.
- SafeArcDyn: safe, cloneable handle over an
AbiStableDynRef. - DynPlugin: loaded plugin holding a
SafeArcDyn<T>that dereferences to&Tfor calling trait methods on the loaded object.
⚠️ IMPORTANT — ABI compatibility / compiler version alignment
You must strictly align the Rust compiler version. Every library and executable that exchanges dyn fat pointers across the boundary must be built with the exact same Rust compiler version to guarantee a stable ABI. Rust makes no ABI stability guarantees between compiler releases (vtable layout, metadata encoding, etc. may change). Mixing compiler versions between the host and plugins is undefined behavior.
Pin one toolchain (e.g. via
rust-toolchain.toml) and rebuild all crates, libs and executables together with that single version.
Usage
Plugin side (the .so/.dylib)
use ;
use Arc;
pub extern "C"
Host side
use DynPlugin;
let plugin = load?;
let transform: &dyn Transform = plugin.trait_ref;
Safety
Loading dynamic libraries and unpacking raw fat pointers is inherently unsafe.
See the # Safety sections on each API. The retain/release function pointers
give you Arc-like reference counting across the library boundary, but the
caller is still responsible for ABI compatibility (see the warning above).
License
MIT