From b882ce527d290779e04a08b40095c2916d20309b Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Sun, 15 Dec 2019 11:19:37 -0700
Subject: [PATCH] Fix allocation of TLS masters if main image does not require
 TLS

---
 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 fdedf2c2..75741c1c 100644
--- a/src/ld_so/linker.rs
+++ b/src/ld_so/linker.rs
@@ -220,7 +220,12 @@ impl Linker {
         // Copy data
         let mut tls_offset = tls_primary;
         let mut tcb_masters = Vec::new();
-        let mut tls_index = 0;
+        // Insert main image master
+        tcb_masters.push(Master {
+            ptr: ptr::null_mut(),
+            len: 0,
+            offset: 0,
+        });
         let mut tls_ranges = BTreeMap::new();
         for (elf_name, elf) in elfs.iter() {
             let object = match self.objects.get(*elf_name) {
@@ -299,12 +304,11 @@ impl Linker {
 
                         if *elf_name == primary {
                             tls_ranges.insert(elf_name, (0, tcb_master.range()));
-                            tcb_masters.insert(0, tcb_master);
+                            tcb_masters[0] = tcb_master;
                         } else {
                             tcb_master.offset -= tls_offset;
                             tls_offset += vsize;
-                            tls_index += 1;
-                            tls_ranges.insert(elf_name, (tls_index, tcb_master.range()));
+                            tls_ranges.insert(elf_name, (tcb_masters.len(), tcb_master.range()));
                             tcb_masters.push(tcb_master);
                         }
                     }
-- 
GitLab