# dyn-loader
Dynamic library loader with **dyn-fat-pointer-bridge** for loading Rust trait objects
from `.so`/`.dylib` plugin files.
- **DynLib**: wraps `libloading::Library` with `Arc` for 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<T>**: safe, cloneable handle over an `AbiStableDynRef`.
- **DynPlugin<T>**: loaded plugin holding a `SafeArcDyn<T>` that dereferences
to `&T` for 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`)
```rust,ignore
use dyn_loader::{AbiStableDynRef, SafeArcDyn};
use std::sync::Arc;
#[no_mangle]
pub extern "C" fn core_ast_transform_entry() -> AbiStableDynRef {
SafeArcDyn::from_arc(Arc::new(MyTransform) as Arc<dyn Transform>).into_abi()
}
```
### Host side
```rust,ignore
use dyn_loader::DynPlugin;
let plugin = DynPlugin::<dyn Transform>::load(
"libmy_transform.so",
b"core_ast_transform_entry\0",
)?;
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