[PR ld/22263] aarch64: Avoid dynamic TLS relocs in PIE
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 15 Nov 2017 17:40:04 +0000 (17:40 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Mon, 27 Nov 2017 11:53:04 +0000 (11:53 +0000)
No dynamic relocs are needed for TLS defined in an executable, the
TP relative offset is known at link time.

Fixes
FAIL: Build pr22263-1

bfd/
PR ld/22263
* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Use
bfd_link_executable instead of bfd_link_pic for TLS.
(elfNN_aarch64_allocate_dynrelocs): Likewise.
(aarch64_can_relax_tls): Likewise.

bfd/ChangeLog
bfd/elfnn-aarch64.c

index 46c2a5963314d91749d3ec154db7e7a2e61afc5c..3903b1d23a0707d37a32dcd5215cb50464918566 100644 (file)
@@ -1,3 +1,11 @@
+2017-11-27  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR ld/22263
+       * elfnn-aarch64.c (elfNN_aarch64_relocate_section): Use
+       bfd_link_executable instead of bfd_link_pic for TLS.
+       (elfNN_aarch64_allocate_dynrelocs): Likewise.
+       (aarch64_can_relax_tls): Likewise.
+
 2017-11-27  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        PR ld/22269
index 7571a16ff9cae7021e616c75b243c3a5eaab35d4..ed402bb45e2232df972b6bc6a0930d38a98e7322 100644 (file)
@@ -4580,7 +4580,7 @@ aarch64_can_relax_tls (bfd *input_bfd,
   if (symbol_got_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (reloc_got_type))
     return TRUE;
 
-  if (bfd_link_pic (info))
+  if (!bfd_link_executable (info))
     return FALSE;
 
   if  (h && h->root.type == bfd_link_hash_undefweak)
@@ -6247,7 +6247,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
              indx = h && h->dynindx != -1 ? h->dynindx : 0;
 
              need_relocs =
-               (bfd_link_pic (info) || indx != 0) &&
+               (!bfd_link_executable (info) || indx != 0) &&
                (h == NULL
                 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                 || h->root.type != bfd_link_hash_undefweak);
@@ -6342,7 +6342,7 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
              indx = h && h->dynindx != -1 ? h->dynindx : 0;
 
              need_relocs =
-               (bfd_link_pic (info) || indx != 0) &&
+               (!bfd_link_executable (info) || indx != 0) &&
                (h == NULL
                 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                 || h->root.type != bfd_link_hash_undefweak);
@@ -8057,7 +8057,7 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          indx = h && h->dynindx != -1 ? h->dynindx : 0;
          if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
               || h->root.type != bfd_link_hash_undefweak)
-             && (bfd_link_pic (info)
+             && (!bfd_link_executable (info)
                  || indx != 0
                  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
            {