load/
load.rs

1use std::{collections::HashMap, ffi::CStr};
2use windows_elf_loader::WinElfLoader;
3
4fn main() {
5    extern "sysv64" fn print(s: *const i8) {
6        let s = unsafe { CStr::from_ptr(s).to_str().unwrap() };
7        println!("{}", s);
8    }
9    // Symbols required by dynamic library liba.so
10    let mut map = HashMap::new();
11    map.insert("print", print as _);
12    let pre_find = |name: &str| -> Option<*const ()> { map.get(name).copied() };
13    let mut loader: WinElfLoader = WinElfLoader::new();
14    // Load and relocate dynamic library liba.so
15    let liba = loader
16        .load_file(r".\crates\windows-elf-loader\example_dylib\liba.so")
17        .unwrap()
18        .easy_relocate([], &pre_find)
19        .unwrap();
20    // Call function a in liba.so
21    let f = unsafe { liba.get::<extern "sysv64" fn() -> i32>("a").unwrap() };
22    println!("{}", f());
23}