[PR ld/22269] aarch64: Handle local undefined weak symbols
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 15 Nov 2017 15:56:30 +0000 (15:56 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Mon, 27 Nov 2017 11:49:53 +0000 (11:49 +0000)
With static pie linking undefined weak symbols are forced to resolve locally
to 0, so no GOT setup is needed in elfNN_aarch64_finish_dynamic_symbol,
which previously failed for these symbols.

The failure caused the unhelpful error message:
"ld: final link failed: Nonrepresentable section on output"

bfd/
PR ld/22269
* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Use
UNDEFWEAK_NO_DYNAMIC_RELOC to avoid dynamic GOT relocs.
(elfNN_aarch64_allocate_dynrelocs): Likewise.

bfd/ChangeLog
bfd/elfnn-aarch64.c

index 0395dcf6ccabfddac5aef757348925f57efec742..46c2a5963314d91749d3ec154db7e7a2e61afc5c 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-27  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR ld/22269
+       * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Use
+       UNDEFWEAK_NO_DYNAMIC_RELOC to avoid dynamic GOT relocs.
+       (elfNN_aarch64_allocate_dynrelocs): Likewise.
+
 2017-11-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR binutils/22444
index 45218843d5cc3fdb270e86646edb44029e0a82d6..7571a16ff9cae7021e616c75b243c3a5eaab35d4 100644 (file)
@@ -8022,7 +8022,10 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
               || h->root.type != bfd_link_hash_undefweak)
              && (bfd_link_pic (info)
-                 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
+                 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
+             /* Undefined weak symbol in static PIE resolves to 0 without
+                any dynamic relocations.  */
+             && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
            {
              htab->root.srelgot->size += RELOC_SIZE (htab);
            }
@@ -8824,7 +8827,10 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd,
     }
 
   if (h->got.offset != (bfd_vma) - 1
-      && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL)
+      && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL
+      /* Undefined weak symbol in static PIE resolves to 0 without
+        any dynamic relocations.  */
+      && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
     {
       Elf_Internal_Rela rela;
       bfd_byte *loc;
This page took 0.029056 seconds and 4 git commands to generate.