windows_elf_loader/
lib.rs

1use elf_loader::{ElfDylib, Loader, mmap::MmapImpl as WindowsMmap, object::ElfBinary};
2use std::sync::Arc;
3
4/// elf loader
5pub struct WinElfLoader {
6    loader: Loader<WindowsMmap>,
7}
8
9impl WinElfLoader {
10    pub fn new() -> Self {
11        let mut loader = Loader::new();
12        let sysv_abi = Arc::new(|func: Option<fn()>, func_array: Option<&[fn()]>| {
13            func.iter()
14                .chain(func_array.unwrap_or(&[]).iter())
15                .for_each(
16                    |init| unsafe { core::mem::transmute::<_, &extern "sysv64" fn()>(init) }(),
17                );
18        });
19        loader.set_init(sysv_abi.clone());
20        loader.set_fini(sysv_abi);
21        Self { loader }
22    }
23
24    pub fn load_dylib(
25        &mut self,
26        name: &str,
27        bytes: impl AsRef<[u8]>,
28    ) -> Result<ElfDylib, elf_loader::Error> {
29        let object = ElfBinary::new(name, bytes.as_ref());
30        self.loader.load_dylib(object, Some(false))
31    }
32
33    pub fn load_file(&mut self, name: &str) -> Result<ElfDylib, elf_loader::Error> {
34        let object = elf_loader::object::ElfFile::from_path(name)?;
35        self.loader.load_dylib(object, None)
36    }
37}