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()) {