Expand description
A type to wrap vtable references such that they can be safely sent between other processes running the same binary.
References are adjusted relative to a base when (de)serialised, which is what enables it to work across binaries that are dynamically loaded at different addresses under multiple invocations.
It being the same binary is checked by serialising the
build_id
alongside the relative pointer, which
is validated at deserialisation.
§Example
§Local process
use std::{fmt::Display, mem::transmute, raw::TraitObject};
let mut x: Box<dyn Display> = Box::new("hello world");
let x_ptr: *mut dyn Display = &mut *x;
let x_ptr: TraitObject = unsafe { transmute(x_ptr) };
let relative = unsafe { Vtable::<dyn Display>::from(&*x_ptr.vtable) };
// send `relative` to remote...
§Remote process
// receive `relative`
let x: Box<&str> = Box::new("goodbye world");
let x_ptr = Box::into_raw(x);
let y_ptr = TraitObject { data: x_ptr.cast(), vtable: relative.to() as *const () as *mut () };
let y_ptr: *mut dyn Display = unsafe { transmute(y_ptr) };
let y: Box<dyn Display> = unsafe { Box::from_raw(y_ptr) };
println!("{}", y);
// prints "goodbye world"
Structs§
- Wraps
&'static
references to vtables such that they can be safely sent between other processes running the same binary.