elf_loader 0.16.0

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

use elf_loader::{
    Loader, Result,
    arch::NativeArch,
    observer::{BeforeLoadEvent, LoadObserver},
    relocation::{RelocationArch, Relocator},
};

const LOADER: Loader = Loader::new();

struct PrintObserver;

impl LoadObserver for PrintObserver {
    fn on_before_load(
        &mut self,
        event: BeforeLoadEvent<'_, (), <NativeArch as RelocationArch>::Layout>,
    ) -> Result<()> {
        println!("Loading dynamic image for {}:", event.path());
        for phdr in event.phdrs() {
            println!("  Type: {:?}", phdr.program_type());
            println!("    Offset: 0x{:x}", phdr.p_offset());
            println!("    Vaddr: {}", phdr.p_vaddr());
            println!("    Filesz: 0x{:x}", phdr.p_filesz());
            println!("    Memsz: 0x{:x}", phdr.p_memsz());
            println!("    Flags: {:?}", phdr.flags());
        }
        Ok(())
    }
}

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

    let fixtures = fixture_support::ensure_all();
    let _lib = Relocator::new()
        .run(
            LOADER
                .run()
                .with_observer(PrintObserver)
                .load_dylib(fixtures.liba_str())?,
        )
        .relocate()?;
    println!("Loaded with segment hook.");

    Ok(())
}