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