relocate/
relocate.rs

1use std::{collections::HashMap, ffi::CStr};
2
3use windows_elf_loader::WinElfLoader;
4
5fn main() {
6    extern "sysv64" fn print(s: *const i8) {
7        let s = unsafe { CStr::from_ptr(s).to_str().unwrap() };
8        println!("{}", s);
9    }
10
11    let mut map = HashMap::new();
12    map.insert("print", print as _);
13    let pre_find = |name: &str| -> Option<*const ()> { map.get(name).copied() };
14    let mut loader = WinElfLoader::new();
15    let liba = loader
16        .load_file(r".\crates\windows-elf-loader\example_dylib\liba.so")
17        .unwrap();
18    let libb = loader
19        .load_file(r".\crates\windows-elf-loader\example_dylib\libb.so")
20        .unwrap();
21    let libc = loader
22        .load_file(r".\crates\windows-elf-loader\example_dylib\libc.so")
23        .unwrap();
24    let a = liba.easy_relocate([], &pre_find).unwrap();
25    let f = unsafe { a.get::<extern "sysv64" fn() -> i32>("a").unwrap() };
26    assert!(f() == 1);
27    let b = libb.easy_relocate([&a], &pre_find).unwrap();
28    let f = unsafe { b.get::<extern "sysv64" fn() -> i32>("b").unwrap() };
29    assert!(f() == 2);
30    let c = libc.easy_relocate([&b], &pre_find).unwrap();
31    let f = unsafe { c.get::<extern "sysv64" fn() -> i32>("c").unwrap() };
32    assert!(f() == 3);
33}