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