elf_loader 0.15.0

A no_std-friendly ELF loader, runtime linker, and JIT linker for Rust.
#[path = "common/mod.rs"]
mod fixture_support;

use elf_loader::{Loader, Result};

#[allow(dead_code)]
#[derive(Debug)]
struct MyContext {
    load_time: std::time::SystemTime,
    custom_id: u32,
}

impl Default for MyContext {
    fn default() -> Self {
        Self {
            load_time: std::time::SystemTime::now(),
            custom_id: 0,
        }
    }
}

fn main() -> Result<()> {
    unsafe { std::env::set_var("RUST_LOG", "trace") };
    env_logger::init();

    let mut loader = Loader::new().with_dynamic_initializer::<MyContext>(|dynamic| {
        println!("Initializing user data for: {}", dynamic.name());
        if let Some(context) = dynamic.user_data_mut() {
            context.load_time = std::time::SystemTime::now();
            context.custom_id = 42;
        }
        Ok(())
    });

    let fixtures = fixture_support::ensure_all();
    let lib = loader
        .load_dylib(fixtures.liba_str())?
        .relocator()
        .relocate()?;

    let context = lib.user_data();
    println!("Loaded {:?} with context: {:?}", lib.name(), context);

    Ok(())
}