diff --git a/src/ld_so/callbacks.rs b/src/ld_so/callbacks.rs new file mode 100644 index 0000000000..22c6920ad1 --- /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, + pub load_library: Box Result>, + pub link: + Box, Option, Option) -> Result>>, + pub get_sym: Box) -> Option>, + pub run_init: Box) -> Result<()>>, + pub run_fini: Box) -> 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 { + linker.load_library(name) +} + +fn link( + linker: &mut Linker, + primary_opt: Option<&str>, + dso: Option, + libspace: Option, +) -> Result> { + linker.link(primary_opt, dso, libspace) +} + +fn get_sym(linker: &Linker, name: &str, libspace: Option) -> Option { + linker.get_sym(name, libspace) +} +fn run_init(linker: &Linker, libspace: Option) -> Result<()> { + linker.run_init(libspace) +} +fn run_fini(linker: &Linker, libspace: Option) -> Result<()> { + linker.run_fini(libspace) +} diff --git a/src/ld_so/mod.rs b/src/ld_so/mod.rs index e6857e96be..efaf6bc5e9 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;