#reference #pointers #static #distributed #serde

sys relative

A type to wrap vtable references such that they can be safely sent between other processes running the same binary

9 releases

0.2.2 Nov 21, 2019
0.2.1 Oct 31, 2019
0.1.5 Aug 10, 2019
0.1.4 Jul 31, 2019
0.1.0 Jul 21, 2018

#1582 in Encoding

Download history 118/week @ 2023-12-09 142/week @ 2023-12-16 108/week @ 2023-12-23 53/week @ 2023-12-30 81/week @ 2024-01-06 97/week @ 2024-01-13 87/week @ 2024-01-20 93/week @ 2024-01-27 47/week @ 2024-02-03 98/week @ 2024-02-10 205/week @ 2024-02-17 149/week @ 2024-02-24 127/week @ 2024-03-02 139/week @ 2024-03-09 122/week @ 2024-03-16 118/week @ 2024-03-23

528 downloads per month
Used in 10 crates (via serde_traitobject)

MIT/Apache

16KB
257 lines

relative

Crates.io MIT / Apache 2.0 licensed Build Status

Docs

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"

License

Licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.6–1.5MB
~27K SLoC