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}