From ecd934951d163b0f2e33b60350fe2445476ff0f8 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Tue, 14 Dec 2021 14:53:16 -0700
Subject: [PATCH] R_X86_64_TPOFF64 does not require symbol, allow it to be
 unset

---
 src/ld_so/linker.rs | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs
index 69ba71448..004d3a232 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);
-- 
GitLab