Skip to main content

relocate/
relocate.rs

1use std::ffi::CStr;
2
3use elf_loader::image::{ModuleHandle, SyntheticModule, SyntheticSymbol};
4use windows_elf_loader::WinElfLoader;
5
6fn main() {
7    extern "sysv64" fn print(s: *const i8) {
8        let s = unsafe { CStr::from_ptr(s).to_str().unwrap() };
9        println!("{}", s);
10    }
11
12    let host = ModuleHandle::from(SyntheticModule::new(
13        "__host",
14        [SyntheticSymbol::function("print", print as *const ())],
15    ));
16    let mut loader = WinElfLoader::new();
17    let liba = loader
18        .load_file(r".\crates\windows-elf-loader\example_dylib\liba.so")
19        .unwrap()
20        .relocator()
21        .scope([host.clone()])
22        .relocate()
23        .unwrap();
24    let libb = loader
25        .load_file(r".\crates\windows-elf-loader\example_dylib\libb.so")
26        .unwrap()
27        .relocator()
28        .scope([host.clone(), ModuleHandle::from(&liba)])
29        .relocate()
30        .unwrap();
31    let libc = loader
32        .load_file(r".\crates\windows-elf-loader\example_dylib\libc.so")
33        .unwrap()
34        .relocator()
35        .scope([host.clone(), ModuleHandle::from(&libb)])
36        .relocate()
37        .unwrap();
38    let f = unsafe { liba.get::<extern "sysv64" fn() -> i32>("a").unwrap() };
39    assert!(f() == 1);
40    let f = unsafe { libb.get::<extern "sysv64" fn() -> i32>("b").unwrap() };
41    assert!(f() == 2);
42    let f = unsafe { libc.get::<extern "sysv64" fn() -> i32>("c").unwrap() };
43    assert!(f() == 3);
44}