Explorar o código

Fix TLS offsets

Jeremy Soller %!s(int64=6) %!d(string=hai) anos
pai
achega
47baf499bf
Modificáronse 1 ficheiros con 10 adicións e 3 borrados
  1. 10 3
      src/ld_so/linker.rs

+ 10 - 3
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()) {