Selaa lähdekoodia

Hack to use the correct TLS size for the first TLS module

Jeremy Soller 2 vuotta sitten
vanhempi
commit
d1a86c850e
2 muutettua tiedostoa jossa 9 lisäystä ja 7 poistoa
  1. 8 0
      src/ld_so/linker.rs
  2. 1 7
      src/ld_so/start.rs

+ 8 - 0
src/ld_so/linker.rs

@@ -28,6 +28,7 @@ use super::{
     debug::{RTLDState, _dl_debug_state, _r_debug},
     dso::{is_pie_enabled, DSO},
     tcb::{round_up, Master, Tcb},
+    ExpectTlsFree,
     PATH_SEP,
 };
 
@@ -226,6 +227,13 @@ impl Linker {
         self.next_object_id += 1;
 
         if let Some(master) = tcb_master {
+            if self.next_tls_module_id == 0 {
+                // Hack to allocate TCB on the first TLS module
+                unsafe {
+                    let tcb = Tcb::new(master.offset).expect_notls("failed to allocate TCB");
+                    tcb.activate();
+                }
+            }
             self.next_tls_module_id += 1;
             self.tls_size = master.offset;
             tcb_masters.push(master);

+ 1 - 7
src/ld_so/start.rs

@@ -17,7 +17,7 @@ use crate::{
     ALLOCATOR,
 };
 
-use super::{access::accessible, debug::_r_debug, linker::Linker, tcb::Tcb, ExpectTlsFree, PATH_SEP};
+use super::{access::accessible, debug::_r_debug, linker::Linker, tcb::Tcb, PATH_SEP};
 use crate::header::sys_auxv::{AT_ENTRY, AT_PHDR};
 use goblin::elf::header::header64::SIZEOF_EHDR;
 
@@ -213,12 +213,6 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack, ld_entry: usize) ->
         }
     };
 
-    // Ensure there is a stub Tcb
-    unsafe {
-        let tcb = Tcb::new(0).expect_notls("failed to allocate TCB");
-        tcb.activate();
-    }
-
     // if we are not running in manual mode, then the main
     // program is already loaded by the kernel and we want
     // to use it. on redox, we treat it the same.