Example usage of the lucet-runtime
crate.
The following Rust code loads a WebAssembly module compiled using lucetc-wasi
and calls its
main()
function.
.cargo/config
:
These flags must be set in order to have symbols from the runtime properly exported.
[build]
rustflags = ["-C", "link-args=-rdynamic"]
Cargo.toml
:
[package]
name = "lucet-runtime-example"
version = "0.1.0"
edition = "2018"
[dependencies]
lucet-runtime = { path = "../../lucet-runtime" }
lucet-wasi = { path = "../../lucet-wasi" }
# or, if compiling against released crates.io versions:
# lucet-runtime = "0.5.1"
# lucet-wasi = "0.5.1"
src/main.rs
:
use lucet_runtime::{DlModule, Limits, MmapRegion, Region};
use lucet_wasi::WasiCtxBuilder;
fn main() {
// ensure the WASI symbols are exported from the final executable
lucet_wasi::export_wasi_funcs();
// load the compiled Lucet module
let dl_module = DlModule::load("example.so").unwrap();
// create a new memory region with default limits on heap and stack size
let region = MmapRegion::create(1, &Limits::default()).unwrap();
// instantiate the module in the memory region
let mut instance = region.new_instance(dl_module).unwrap();
// prepare the WASI context, inheriting stdio handles from the host executable
let wasi_ctx = WasiCtxBuilder::new().inherit_stdio().build().unwrap();
instance.insert_embed_ctx(wasi_ctx);
// run the WASI main function
instance.run("main", &[]).unwrap();
}