xref: /relibc/src/ld_so/callbacks.rs (revision 3e49323a3a6dfa3deebd56bb84059bdd9c7d6247)
1 use super::linker::{Linker, Symbol, DSO};
2 use alloc::boxed::Box;
3 use goblin::error::Result;
4 
5 pub struct LinkerCallbacks {
6     pub unload: Box<dyn Fn(&mut Linker, usize)>,
7     pub load_library: Box<dyn Fn(&mut Linker, Option<&str>) -> Result<usize>>,
8     pub link:
9         Box<dyn Fn(&mut Linker, Option<&str>, Option<DSO>, Option<usize>) -> Result<Option<usize>>>,
10     pub get_sym: Box<dyn Fn(&Linker, &str, Option<usize>) -> Option<Symbol>>,
11     pub run_init: Box<dyn Fn(&Linker, Option<usize>) -> Result<()>>,
12     pub run_fini: Box<dyn Fn(&Linker, Option<usize>) -> Result<()>>,
13 }
14 
15 impl LinkerCallbacks {
16     pub fn new() -> LinkerCallbacks {
17         LinkerCallbacks {
18             unload: Box::new(unload),
19             load_library: Box::new(load_library),
20             link: Box::new(link),
21             get_sym: Box::new(get_sym),
22             run_init: Box::new(run_init),
23             run_fini: Box::new(run_fini),
24         }
25     }
26 }
27 
28 fn unload(linker: &mut Linker, libspace: usize) {
29     linker.unload(libspace)
30 }
31 
32 fn load_library(linker: &mut Linker, name: Option<&str>) -> Result<usize> {
33     linker.load_library(name)
34 }
35 
36 fn link(
37     linker: &mut Linker,
38     primary_opt: Option<&str>,
39     dso: Option<DSO>,
40     libspace: Option<usize>,
41 ) -> Result<Option<usize>> {
42     linker.link(primary_opt, dso, libspace)
43 }
44 
45 fn get_sym(linker: &Linker, name: &str, libspace: Option<usize>) -> Option<Symbol> {
46     linker.get_sym(name, libspace)
47 }
48 fn run_init(linker: &Linker, libspace: Option<usize>) -> Result<()> {
49     linker.run_init(libspace)
50 }
51 fn run_fini(linker: &Linker, libspace: Option<usize>) -> Result<()> {
52     linker.run_fini(libspace)
53 }
54