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;