From 79f265745a4266ee98ab201ca6aaa639bcca9350 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Fri, 28 Feb 2020 19:33:20 -0700 Subject: [PATCH] Fix redox ld_so --- src/ld_so/linker.rs | 12 ++++++++---- src/ld_so/start.rs | 21 +++++++++------------ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index 1512a7f6f..dd3961128 100644 --- a/src/ld_so/linker.rs +++ b/src/ld_so/linker.rs @@ -41,7 +41,8 @@ pub struct Linker { pub globals: BTreeMap<String, usize>, /// Loaded library in-memory data mmaps: BTreeMap<String, &'static mut [u8]>, - verbose: bool + verbose: bool, + tls_index_offset: usize, } impl Linker { @@ -51,7 +52,8 @@ impl Linker { objects: BTreeMap::new(), globals: BTreeMap::new(), mmaps: BTreeMap::new(), - verbose: verbose + verbose, + tls_index_offset: 0, } } @@ -329,14 +331,14 @@ impl Linker { ); } if Some(*elf_name) == primary_opt { - tls_ranges.insert(elf_name.to_string(), (0, tcb_master.range())); + tls_ranges.insert(elf_name.to_string(), (self.tls_index_offset, tcb_master.range())); tcb_masters[0] = tcb_master; } else { tcb_master.offset -= tls_offset; tls_offset += vsize; tls_ranges.insert( elf_name.to_string(), - (tcb_masters.len(), tcb_master.range()), + (self.tls_index_offset + tcb_masters.len(), tcb_master.range()), ); tcb_masters.push(tcb_master); } @@ -346,6 +348,8 @@ impl Linker { } } + self.tls_index_offset += tcb_masters.len(); + // Set master images for TLS and copy TLS data if let Some(ref mut tcb) = tcb_opt { unsafe { diff --git a/src/ld_so/start.rs b/src/ld_so/start.rs index a55abdac2..03e9abf65 100644 --- a/src/ld_so/start.rs +++ b/src/ld_so/start.rs @@ -121,11 +121,11 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) -> (argv, envs, auxv) }; - let img_entry = *auxv.get(&AT_ENTRY).unwrap_or_else(|| { - eprintln!("failed to find AT_ENTRY"); - unistd::_exit(1); - loop {} - }); + let is_manual = if let Some(img_entry) = auxv.get(&AT_ENTRY) { + *img_entry == ld_entry + } else { + true + }; // Some variables that will be overridden by environment and auxiliary vectors let library_path = match envs.get("LD_LIBRARY_PATH") { @@ -133,10 +133,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) -> None => "/lib", }; - let path; - - let is_manual = img_entry == ld_entry; - if is_manual { + let path = if is_manual { // ld.so is run directly by user and not via execve() or similar systemcall println!("argv: {:#?}", argv); println!("envs: {:#?}", envs); @@ -148,10 +145,10 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) -> loop {} } unsafe { adjust_stack(sp) }; - path = &argv[1]; + &argv[1] } else { - path = &argv[0]; - } + &argv[0] + }; let mut linker = Linker::new(library_path, is_manual); match linker.load(&path, &path) { -- GitLab