diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs
index be99dc3d66cc905831b276602e7359f5df097330..40113407de7c1ad1615e94c8c90c7991c9c8de48 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()) {