From 47baf499bfb9ea6f0b0831b457e9056494844cea Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Sun, 14 Apr 2019 08:40:03 -0600
Subject: [PATCH] Fix TLS offsets

---
 src/ld_so/linker.rs | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs
index be99dc3d..40113407 100644
--- a/src/ld_so/linker.rs
+++ b/src/ld_so/linker.rs
@@ -316,6 +316,12 @@ impl Linker {
                         mmap_data.copy_from_slice(obj_data);
                     },
                     program_header::PT_TLS => {
+                        let valign = if ph.p_align > 0 {
+                            ((ph.p_memsz + (ph.p_align - 1))/ph.p_align) * ph.p_align
+                        } else {
+                            ph.p_memsz
+                        } as usize;
+
                         let obj_data = {
                             let range = ph.file_range();
                             match object.get(range.clone()) {
@@ -328,11 +334,12 @@ impl Linker {
 
                         let tls_data = {
                             let (index, start) = if *elf_name == primary {
-                                (0, tls.len() - tls_primary)
+                                (0, tls.len() - valign)
                             } else {
-                                tls_offset += obj_data.len();
+                                let start = tls.len() - (tls_offset + valign);
+                                tls_offset += vsize;
                                 tls_index += 1;
-                                (tls_index, tls.len() - tls_offset)
+                                (tls_index, start)
                             };
                             let range = start..start + obj_data.len();
                             match tls.get_mut(range.clone()) {
-- 
GitLab