Refactor init and fini by merging common code

This commit is contained in:
oddcoder
2020-07-04 13:40:11 +02:00
parent 6d0c9dccd5
commit b4a6a7ece5
+11 -44
View File
@@ -226,66 +226,35 @@ impl Linker {
Some(lib) => {
//TODO this is the same kind of wrong
let lib = Library::new();
self.run_init_tree(&lib, &lib.dep_tree)
self.run_tree(&lib, &lib.dep_tree, ".init_array")
}
None => {
//TODO we first need to deinitialize all the loaded libraries first!
self.run_init_tree(&self.root, &self.root.dep_tree)
self.run_tree(&self.root, &self.root.dep_tree, ".init_array")
}
}
}
fn run_init_tree(&self, lib: &Library, root: &DepTree) -> Result<()> {
for node in root.deps.iter() {
self.run_init_tree(lib, node)?;
}
if self.verbose {
println!("init {}", &root.name);
}
let mmap = match lib.mmaps.get(&root.name) {
Some(some) => some,
None => return Ok(()),
};
let elf = Elf::parse(lib.objects.get(&root.name).unwrap())?;
for section in &elf.section_headers {
let name = match elf.shdr_strtab.get(section.sh_name) {
Some(x) => match x {
Ok(y) => y,
_ => continue,
},
_ => continue,
};
if name == ".init_array" {
let addr = if is_pie_enabled(&elf) {
mmap.as_ptr() as usize + section.vm_range().start
} else {
section.vm_range().start
};
for i in (0..section.sh_size).step_by(8) {
unsafe { call_inits_finis(addr + i as usize) };
}
}
}
return Ok(());
}
pub fn run_fini(&self, libspace: Option<usize>) -> Result<()> {
match libspace {
Some(lib) => {
//TODO this is the same kind of wrong
let lib = Library::new();
self.run_fini_tree(&lib, &lib.dep_tree)
self.run_tree(&lib, &lib.dep_tree, ".fini_array")
}
None => {
//TODO we first need to deinitialize all the loaded libraries first!
self.run_fini_tree(&self.root, &self.root.dep_tree)
self.run_tree(&self.root, &self.root.dep_tree, ".fini_array")
}
}
}
fn run_fini_tree(&self, lib: &Library, root: &DepTree) -> Result<()> {
fn run_tree(&self, lib: &Library, root: &DepTree, tree_name: &str) -> Result<()> {
for node in root.deps.iter() {
self.run_tree(lib, node, tree_name)?;
}
if self.verbose {
println!("init {}", &root.name);
println!("running {} {}", tree_name, &root.name);
}
let mmap = match lib.mmaps.get(&root.name) {
Some(some) => some,
@@ -300,7 +269,7 @@ impl Linker {
},
_ => continue,
};
if name == ".fini_array" {
if name == tree_name {
let addr = if is_pie_enabled(&elf) {
mmap.as_ptr() as usize + section.vm_range().start
} else {
@@ -311,11 +280,9 @@ impl Linker {
}
}
}
for node in root.deps.iter() {
self.run_fini_tree(lib, node)?;
}
return Ok(());
}
pub fn link(
&mut self,
primary_opt: Option<&str>,