diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index 3f6b4d4c46b0a67e8d87c563bef38a18aaf3348c..012d6f211939e6b213e9d0bc1c2dd71078f90f8d 100644 --- a/src/ld_so/linker.rs +++ b/src/ld_so/linker.rs @@ -604,9 +604,6 @@ impl Linker { } else { false }; - if same_elf { - continue; - } let object = match lib.objects.get(*elf_name) { Some(some) => some, None => continue, @@ -627,6 +624,9 @@ impl Linker { match ph.p_type { program_header::PT_LOAD => { + if same_elf { + continue; + } let obj_data = { let range = ph.file_range(); match object.get(range.clone()) { @@ -671,9 +671,15 @@ impl Linker { } else { ph.p_memsz } as usize; - + let ptr = unsafe { + if is_pie_enabled(elf) { + mmap.as_ptr().add(ph.p_vaddr as usize) + } else { + ph.p_vaddr as *const u8 + } + }; let mut tcb_master = Master { - ptr: unsafe { mmap.as_ptr().add(ph.p_vaddr as usize - base_addr) }, + ptr: ptr, len: ph.p_filesz as usize, offset: tls_size - valign, }; diff --git a/tests/Makefile b/tests/Makefile index 77113745eb66c3f1adcd5bffa27d23edd3089b95..ff866d3f0052cc877ea754bb44d97df84f58a006 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -73,6 +73,7 @@ EXPECT_NAMES=\ time/mktime \ time/strftime \ time/time \ + tls \ unistd/access \ unistd/brk \ unistd/dup \ @@ -121,9 +122,6 @@ STATIC_ONLY_NAMES=\ # need to call fini in ld_so's _start STATIC_ONLY_NAMES+=\ destructor \ -# comparison issue -STATIC_ONLY_NAMES+=\ - tls \ # issues with linking optarg, optind etc. STATIC_ONLY_NAMES+=\ unistd/getopt \