diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 57a723d547734b4a4b5074fb7c90811e9bd56184..9d4df11f9d42c39fad5742f92a5edb561e809259 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -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); diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index ba3ce36191f49b2ce25880b7a61408b6e8875884..e69aedd0d4d1b434b659a9d426cf86c528610608 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -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 index 0000000000000000000000000000000000000000..82f2d0852389bf1a95a196b9e9813d27b4792dd8 --- /dev/null +++ b/ld/testsuite/ld-aarch64/tls-relax-gdesc-le-now.d @@ -0,0 +1,22 @@ +#source: tls-relax-gdesc-le.s +#ld: -shared -z now +#readelf: -dr + +Dynamic section at offset 0x1c8 contains 12 entries: + Tag Type Name/Value + 0x0000000000000004 \(HASH\) 0x120 + 0x0000000000000005 \(STRTAB\) 0x168 + 0x0000000000000006 \(SYMTAB\) 0x138 + 0x000000000000000a \(STRSZ\) 8 \(bytes\) + 0x000000000000000b \(SYMENT\) 24 \(bytes\) + 0x0000000000000003 \(PLTGOT\) 0x102e0 + 0x0000000000000002 \(PLTRELSZ\) 24 \(bytes\) + 0x0000000000000014 \(PLTREL\) RELA + 0x0000000000000017 \(JMPREL\) 0x170 + 0x0000000000000018 \(BIND_NOW\) + 0x000000006ffffffb \(FLAGS_1\) Flags: NOW + 0x0000000000000000 \(NULL\) 0x0 + +Relocation section '\.rela\.plt' at offset 0x170 contains 1 entry: + Offset Info Type Sym\. Value Sym\. Name \+ Addend +0000000102f8 000000000407 R_AARCH64_TLSDESC 0