Sfoglia il codice sorgente

R_X86_64_TPOFF64 does not require symbol, allow it to be unset

Jeremy Soller 3 anni fa
parent
commit
ecd934951d
1 ha cambiato i file con 8 aggiunte e 4 eliminazioni
  1. 8 4
      src/ld_so/linker.rs

+ 8 - 4
src/ld_so/linker.rs

@@ -398,10 +398,14 @@ impl Linker {
                         set_u64((b + a) as u64);
                     }
                     reloc::R_X86_64_TPOFF64 => {
-                        let sym = symbol
-                            .as_ref()
-                            .expect("R_X86_64_TPOFF64 called without valid symbol");
-                        set_u64((sym.value + a).wrapping_sub(t) as u64);
+                        if rel.r_sym > 0 {
+                            let sym = symbol
+                                .as_ref()
+                                .expect("R_X86_64_TPOFF64 called without valid symbol");
+                            set_u64((sym.value + a).wrapping_sub(t) as u64);
+                        } else {
+                            set_u64(a.wrapping_sub(t) as u64);
+                        }
                     }
                     reloc::R_X86_64_IRELATIVE => unsafe {
                         let f: unsafe extern "C" fn() -> u64 = transmute(b + a);