[AArch64] Skip IFUNC relocations in debug sections
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 17 Aug 2017 13:48:03 +0000 (14:48 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 17 Aug 2017 13:48:03 +0000 (14:48 +0100)
Skip IFUNC relocations in debug sections ignored by ld.so.
Fixes the following ld test failures on aarch64:

FAIL: Build libpr18808.so
FAIL: Build libpr18808.so_2
FAIL: Run pr18808

aborting at bfd/elfnn-aarch64.c:4986 in elf64_aarch64_final_link_relocate.

bfd/
PR ld/18808
* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Skip IFUNC
relocations in debug sections, change abort to _bfd_error_handler.

bfd/ChangeLog
bfd/elfnn-aarch64.c

index 914c10dfe99fdf0209889377f3c83a5d798428c4..e1985a44d3951f7e4cb286553f50d687cf63063f 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-17  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       PR ld/18808
+       * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Skip IFUNC
+       relocations in debug sections, change abort to _bfd_error_handler.
+
 2017-08-14  Nick Clifton  <nickc@redhat.com>
 
        PR 21957
index 0d8332e69ce847e0a190ac5cf540eb9345ddb3a0..796fe1f17678d694e33671cca5162f579f431022 100644 (file)
@@ -4981,9 +4981,27 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
       const char *name;
       bfd_vma addend = 0;
 
-      if ((input_section->flags & SEC_ALLOC) == 0
-         || h->plt.offset == (bfd_vma) -1)
-       abort ();
+      if ((input_section->flags & SEC_ALLOC) == 0)
+       {
+         /* Dynamic relocs are not propagated for SEC_DEBUGGING
+            sections because such sections are not SEC_ALLOC and
+            thus ld.so will not process them.  */
+         if ((input_section->flags & SEC_DEBUGGING) != 0)
+           return bfd_reloc_ok;
+
+         if (h->root.root.string)
+           name = h->root.root.string;
+         else
+           name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, NULL);
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
+            input_bfd, input_section, rel->r_offset, howto->name, name);
+         bfd_set_error (bfd_error_bad_value);
+         return FALSE;
+       }
+      else if (h->plt.offset == (bfd_vma) -1)
+       goto bad_ifunc_reloc;
 
       /* STT_GNU_IFUNC symbol must go through PLT.  */
       plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
@@ -4992,6 +5010,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
       switch (bfd_r_type)
        {
        default:
+bad_ifunc_reloc:
          if (h->root.root.string)
            name = h->root.root.string;
          else