AArch64: When DF_BIND_NOW don't use TLSDESC GOT value.
authorTamar Christina <tamar.christina@arm.com>
Thu, 11 Apr 2019 10:27:28 +0000 (11:27 +0100)
committerTamar Christina <tamar.christina@arm.com>
Thu, 11 Apr 2019 10:30:03 +0000 (11:30 +0100)
When using DF_BIND_NOW on AArch64 we don't reserve the GOT slot for a TLSDESC,
but we still emitted DT_TLSDESC_GOT and DT_TLSDESC_PLT.  This caused random
memory corruption as the "special" value of (bfd_vma)-1 would be set for
dt_tlsdesc_got.

Since we don't have a value of dt_tlsdesc_got I also don't emit DT_TLSDESC_PLT
now becuase it would point to an incomplete PLT. To be able to write the PLT
entry DT_TLSDESC_GOT is needed and since we don't have one we can't write the
PLT entry either.

It is my understanding that GLIBC doesn't need these two entries when not lazy
loading.  Conversely AArch32 does not reserve neither the GOT not the PLT slot
when doing DF_BIND_NOW.

AArch32 does not need these checks because these values are initialized to 0
and so the if (...) checks don't pass, but on AArch64 these are initialized
to (bfd_vma)-1 and thus we need some extra checks.

bfd/ChangeLog:

PR ld/24302
* elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Don't emit
DT_TLSDESC_GOT and DT_TLSDESC_PLT when DF_BIND_NOW.
(elfNN_aarch64_finish_dynamic_sections): Don't write PLT if DF_BIND_NOW.

ld/ChangeLog:

PR ld/24302
* testsuite/ld-aarch64/aarch64-elf.exp: Add new test.
* testsuite/ld-aarch64/tls-relax-gdesc-le-now.d: New test.

bfd/ChangeLog
bfd/elfnn-aarch64.c
ld/ChangeLog
ld/testsuite/ld-aarch64/aarch64-elf.exp
ld/testsuite/ld-aarch64/tls-relax-gdesc-le-now.d [new file with mode: 0644]

index 03cab045da6bce1c6b3cf1e9bc85603a7b3f897c..022e7c3f0834b6af0b62fa0fbf55f765f96c4afa 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-11  Tamar Christina  <tamar.christina@arm.com>
+
+       PR ld/24302
+       * elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Don't emit
+       DT_TLSDESC_GOT and DT_TLSDESC_PLT when DF_BIND_NOW.
+       (elfNN_aarch64_finish_dynamic_sections): Don't write PLT if DF_BIND_NOW.
+
 2019-04-10  Michael Forney  <mforney@mforney.org>
 
        PR 24427
index 57a723d547734b4a4b5074fb7c90811e9bd56184..9d4df11f9d42c39fad5742f92a5edb561e809259 100644 (file)
@@ -9064,13 +9064,13 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
       if (htab->root.splt->size == 0)
        htab->root.splt->size += htab->plt_header_size;
 
-      htab->tlsdesc_plt = htab->root.splt->size;
-      htab->root.splt->size += htab->tlsdesc_plt_entry_size;
-
       /* If we're not using lazy TLS relocations, don't generate the
-        GOT entry required.  */
+        GOT and PLT entry required.  */
       if (!(info->flags & DF_BIND_NOW))
        {
+         htab->tlsdesc_plt = htab->root.splt->size;
+         htab->root.splt->size += htab->tlsdesc_plt_entry_size;
+
          htab->dt_tlsdesc_got = htab->root.sgot->size;
          htab->root.sgot->size += GOT_ENTRY_SIZE;
        }
@@ -9174,6 +9174,7 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
            return FALSE;
 
          if (htab->tlsdesc_plt
+             && !(info->flags & DF_BIND_NOW)
              && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
                  || !add_dynamic_entry (DT_TLSDESC_GOT, 0)))
            return FALSE;
@@ -9686,6 +9687,7 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
 
            case DT_TLSDESC_GOT:
              s = htab->root.sgot;
+             BFD_ASSERT (htab->dt_tlsdesc_got != (bfd_vma)-1);
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset
                + htab->dt_tlsdesc_got;
              break;
@@ -9705,8 +9707,9 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
        this_hdr.sh_entsize = htab->plt_entry_size;
 
 
-      if (htab->tlsdesc_plt)
+      if (htab->tlsdesc_plt && !(info->flags & DF_BIND_NOW))
        {
+         BFD_ASSERT (htab->dt_tlsdesc_got != (bfd_vma)-1);
          bfd_put_NN (output_bfd, (bfd_vma) 0,
                      htab->root.sgot->contents + htab->dt_tlsdesc_got);
 
index 4abb467e59b61d3556a1c7030937587818366a1d..e63f2be17891081833b30e8f6b7de1e5ccf01fd7 100644 (file)
@@ -1,3 +1,9 @@
+2019-04-11  Tamar Christina  <tamar.christina@arm.com>
+
+       PR ld/24302
+       * testsuite/ld-aarch64/aarch64-elf.exp: Add new test.
+       * testsuite/ld-aarch64/tls-relax-gdesc-le-now.d: New test.
+
 2019-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        * scripttempl/elf.sc (CREATE_PIC): New.  Set for CREATE_SHLIB or
index ba3ce36191f49b2ce25880b7a61408b6e8875884..e69aedd0d4d1b434b659a9d426cf86c528610608 100644 (file)
@@ -256,6 +256,7 @@ run_dump_test "tls-relax-all-ilp32"
 run_dump_test "tls-relax-gd-le"
 run_dump_test "tls-relax-gd-le-ilp32"
 run_dump_test "tls-relax-gdesc-le"
+run_dump_test "tls-relax-gdesc-le-now"
 run_dump_test "tls-relax-gdesc-le-ilp32"
 run_dump_test "tls-relax-gd-ie"
 run_dump_test "tls-relax-gd-ie-ilp32"
diff --git a/ld/testsuite/ld-aarch64/tls-relax-gdesc-le-now.d b/ld/testsuite/ld-aarch64/tls-relax-gdesc-le-now.d
new file mode 100644 (file)
index 0000000..f1565e9
--- /dev/null
@@ -0,0 +1,19 @@
+#source: tls-relax-gdesc-le.s
+#ld: -shared -z now
+#readelf: -dr
+#...
+ 0x.+ \(STRTAB\)   \s+0x.+
+ 0x.+ \(SYMTAB\)   \s+0x.+
+ 0x.+ \(STRSZ\)    \s+.+ \(bytes\)
+ 0x.+ \(SYMENT\)   \s+.+ \(bytes\)
+ 0x.+ \(PLTGOT\)   \s+0x.+
+ 0x.+ \(PLTRELSZ\) \s+.+ \(bytes\)
+ 0x.+ \(PLTREL\)   \s+RELA
+ 0x.+ \(JMPREL\)   \s+0x.+
+ 0x.+ \(BIND_NOW\) \s+
+ 0x.+ \(FLAGS_1\)  \s+   Flags: NOW
+ 0x.+ \(NULL\)     \s+   0x0
+
+Relocation section '\.rela\.plt' at offset .+ contains 1 entry:
+  Offset          Info           Type           Sym\. Value    Sym\. Name \+ Addend
+.+  .+ R_AARCH64_TLSDESC                    0
This page took 0.032168 seconds and 4 git commands to generate.