diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs
index 69ba71448fda97e96631bbfaacf46f7ef7cd649e..004d3a232b492487bc6b611ce11f72e719638f2c 100644
--- a/src/ld_so/linker.rs
+++ b/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);