diff --git a/src/ld_so/callbacks.rs b/src/ld_so/callbacks.rs new file mode 100644 index 0000000000000000000000000000000000000000..22c6920ad194c16bf124ef089befcb343b9c6f26 --- /dev/null +++ b/src/ld_so/callbacks.rs @@ -0,0 +1,53 @@ +use super::linker::{Linker, DSO}; +use alloc::boxed::Box; +use goblin::error::Result; + +pub struct LinkerCallbacks { + pub unload: Box<dyn Fn(&mut Linker, usize)>, + pub load_library: Box<dyn Fn(&mut Linker, &str) -> Result<usize>>, + pub link: + Box<dyn Fn(&mut Linker, Option<&str>, Option<DSO>, Option<usize>) -> Result<Option<usize>>>, + pub get_sym: Box<dyn Fn(&Linker, &str, Option<usize>) -> Option<usize>>, + pub run_init: Box<dyn Fn(&Linker, Option<usize>) -> Result<()>>, + pub run_fini: Box<dyn Fn(&Linker, Option<usize>) -> Result<()>>, +} + +impl LinkerCallbacks { + pub fn new() -> LinkerCallbacks { + LinkerCallbacks { + unload: Box::new(unload), + load_library: Box::new(load_library), + link: Box::new(link), + get_sym: Box::new(get_sym), + run_init: Box::new(run_init), + run_fini: Box::new(run_fini), + } + } +} + +fn unload(linker: &mut Linker, libspace: usize) { + linker.unload(libspace) +} + +fn load_library(linker: &mut Linker, name: &str) -> Result<usize> { + linker.load_library(name) +} + +fn link( + linker: &mut Linker, + primary_opt: Option<&str>, + dso: Option<DSO>, + libspace: Option<usize>, +) -> Result<Option<usize>> { + linker.link(primary_opt, dso, libspace) +} + +fn get_sym(linker: &Linker, name: &str, libspace: Option<usize>) -> Option<usize> { + linker.get_sym(name, libspace) +} +fn run_init(linker: &Linker, libspace: Option<usize>) -> Result<()> { + linker.run_init(libspace) +} +fn run_fini(linker: &Linker, libspace: Option<usize>) -> Result<()> { + linker.run_fini(libspace) +} diff --git a/src/ld_so/mod.rs b/src/ld_so/mod.rs index e6857e96be2f46fe640388c7182c07563ea9035d..efaf6bc5e98dfd9c0d0e980213513e929d769e57 100644 --- a/src/ld_so/mod.rs +++ b/src/ld_so/mod.rs @@ -5,12 +5,12 @@ use crate::start::Stack; pub const PAGE_SIZE: usize = 4096; mod access; +pub mod callbacks; pub mod debug; mod library; pub mod linker; pub mod start; pub mod tcb; - pub fn static_init(sp: &'static Stack) { let mut phdr_opt = None; let mut phent_opt = None;