windows_elf_loader/
lib.rs1use elf_loader::{ElfDylib, Loader, mmap::MmapImpl as WindowsMmap, object::ElfBinary};
2use std::sync::Arc;
3
4pub 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}