๐ฌ Dolphin
A lightweight and safe Rust FFI library for dynamically loading and invoking functions from shared libraries (.dll, .so, .dylib). Dolphin provides a simple interface to call native C functions from any compiled library at runtime.
Features
- ๐ Dynamic Loading - Load functions from any shared library at runtime
- ๐ Safe API - Wraps unsafe FFI calls in a safe, ergonomic interface
- โก Performance - Pre-load function addresses for zero-overhead repeated calls
- ๐ฏ Flexible - Pass any data type including primitives, strings, and complex structs
- ๐ Cross-Platform - Works on Windows (
.dll), Linux (.so), and macOS (.dylib)
Installation
Add Dolphin to your Cargo.toml:
[]
= "0.2.1"
Quick Start
Simple Usage
use load_and_invoke;
High-Performance Pattern (Pre-loading)
For repeated calls, pre-load the function once and reuse the address:
use ;
Working with Structs
use load_and_invoke;
API Overview
Core Functions
-
load(library_path, function_name)- Load a function and return its address- Returns:
Option<usize>- The function address if found
- Returns:
-
invoke(address, arguments)- Call a pre-loaded function- Returns:
Result<(), String>- Success or error message
- Returns:
-
load_and_invoke(library_path, function_name, arguments)- Load and call in one step- Returns:
Result<(), String>- Success or error message
- Returns:
C Function Requirements
C functions must follow this signature:
void
The data pointer contains the serialized arguments, and len is the byte count.
Example C Library
void
void
Compile it:
# macOS
# Linux
# Windows
Examples
The repository includes comprehensive examples:
# Clone the repository
# Build C examples
&& &&
# Run examples
Use Cases
- Plugin Systems - Dynamically load and execute plugins at runtime
- C Library Integration - Call C libraries without compile-time linking
- Hot Reloading - Reload functions without restarting your application
- Language Interop - Bridge Rust with C, C++, or any C-compatible library
- Legacy Code - Interface with existing native libraries
Performance
Dolphin is designed for performance:
- Zero overhead for pre-loaded functions
- No runtime dependencies beyond
libloading - Minimal allocations - Direct memory operations
- Efficient - Function addresses are simple integers
Benchmark comparison:
load_and_invoke: ~1-2ยตs per call (includes library loading)load+invoke: ~50-100ns per call (pre-loaded)
Safety
While FFI is inherently unsafe, Dolphin provides guardrails:
- โ Validates function addresses before calling
- โ
Returns
Resulttypes for error handling - โ Safe wrapper API around unsafe operations
- โ ๏ธ User must ensure correct function signatures
- โ ๏ธ User must ensure data layout matches C expectations
Platform Support
| Platform | Library Format | Tested |
|---|---|---|
| macOS | .dylib |
โ |
| Linux | .so |
โ |
| Windows | .dll |
โ |
Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
Built with:
libloading- Cross-platform dynamic library loading
Links
- Repository: https://github.com/Logan-Garrett/dolphin
- Documentation: https://docs.rs/dolphin
- Crates.io: https://crates.io/crates/dolphin
Made with ๐ฌ by Logan Garrett
cargo test # Run basic tests cargo test -- --ignored # Run integration tests (requires gcc) cargo test -- --include-ignored # Run all tests