Nick Clifton 488c47
diff -rup binutils.orig/bfd/elf32-i386.c binutils-2.29/bfd/elf32-i386.c
Nick Clifton 488c47
--- binutils.orig/bfd/elf32-i386.c	2018-03-09 15:45:28.758238880 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elf32-i386.c	2018-03-09 15:47:19.000943106 +0000
Nick Clifton 488c47
@@ -4097,6 +4097,10 @@ elf_i386_relocate_section (bfd *output_b
Nick Clifton 488c47
 
Nick Clifton 488c47
 	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
 	    {
Nick Clifton 488c47
+	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
Nick Clifton 488c47
+	         STT_GNU_IFUNC symbol as STT_FUNC.  */
Nick Clifton 488c47
+	      if (elf_section_type (input_section) == SHT_NOTE)
Nick Clifton 488c47
+		goto skip_ifunc;
Nick Clifton 488c47
 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
Nick Clifton 488c47
 		 sections because such sections are not SEC_ALLOC and
Nick Clifton 488c47
 		 thus ld.so will not process them.  */
Nick Clifton 488c47
@@ -4318,6 +4322,7 @@ do_ifunc_pointer:
Nick Clifton 488c47
 	    }
Nick Clifton 488c47
 	}
Nick Clifton 488c47
 
Nick Clifton 488c47
+    skip_ifunc:
Nick Clifton 488c47
       resolved_to_zero = (eh != NULL
Nick Clifton 488c47
 			  && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
Nick Clifton 488c47
 							      eh->has_got_reloc,
Nick Clifton 488c47
diff -rup binutils.orig/bfd/elf32-s390.c binutils-2.29/bfd/elf32-s390.c
Nick Clifton 488c47
--- binutils.orig/bfd/elf32-s390.c	2018-03-09 15:45:28.775238681 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elf32-s390.c	2018-03-09 15:47:50.219576165 +0000
Nick Clifton 488c47
@@ -2770,6 +2770,9 @@ elf_s390_relocate_section (bfd *output_b
Nick Clifton 488c47
 	case R_390_8:
Nick Clifton 488c47
 	case R_390_16:
Nick Clifton 488c47
 	case R_390_32:
Nick Clifton 488c47
+	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
+	    break;
Nick Clifton 488c47
+
Nick Clifton 488c47
 	  if (h != NULL
Nick Clifton 488c47
 	      && s390_is_ifunc_symbol_p (h)
Nick Clifton 488c47
 	      && h->def_regular)
Nick Clifton 488c47
@@ -2831,9 +2834,6 @@ elf_s390_relocate_section (bfd *output_b
Nick Clifton 488c47
 		}
Nick Clifton 488c47
 	    }
Nick Clifton 488c47
 
Nick Clifton 488c47
-	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
-	    break;
Nick Clifton 488c47
-
Nick Clifton 488c47
 	  if ((bfd_link_pic (info)
Nick Clifton 488c47
 	       && (h == NULL
Nick Clifton 488c47
 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
Nick Clifton 488c47
diff -rup binutils.orig/bfd/elf64-s390.c binutils-2.29/bfd/elf64-s390.c
Nick Clifton 488c47
--- binutils.orig/bfd/elf64-s390.c	2018-03-09 15:45:28.779238634 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elf64-s390.c	2018-03-09 15:48:30.734099969 +0000
Nick Clifton 488c47
@@ -2737,6 +2737,9 @@ elf_s390_relocate_section (bfd *output_b
Nick Clifton 488c47
 	case R_390_32:
Nick Clifton 488c47
 	case R_390_64:
Nick Clifton 488c47
 
Nick Clifton 488c47
+	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
+	    break;
Nick Clifton 488c47
+
Nick Clifton 488c47
 	  if (h != NULL
Nick Clifton 488c47
 	      && s390_is_ifunc_symbol_p (h)
Nick Clifton 488c47
 	      && h->def_regular)
Nick Clifton 488c47
@@ -2799,9 +2802,6 @@ elf_s390_relocate_section (bfd *output_b
Nick Clifton 488c47
 		}
Nick Clifton 488c47
 	    }
Nick Clifton 488c47
 
Nick Clifton 488c47
-	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
-	    break;
Nick Clifton 488c47
-
Nick Clifton 488c47
 	  if ((bfd_link_pic (info)
Nick Clifton 488c47
 	       && (h == NULL
Nick Clifton 488c47
 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
Nick Clifton 488c47
diff -rup binutils.orig/bfd/elf64-x86-64.c binutils-2.29/bfd/elf64-x86-64.c
Nick Clifton 488c47
--- binutils.orig/bfd/elf64-x86-64.c	2018-03-09 15:45:28.772238716 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elf64-x86-64.c	2018-03-09 15:48:59.184765567 +0000
Nick Clifton 488c47
@@ -4426,6 +4426,10 @@ elf_x86_64_relocate_section (bfd *output
Nick Clifton 488c47
 
Nick Clifton 488c47
 	  if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
 	    {
Nick Clifton 488c47
+	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
Nick Clifton 488c47
+	         STT_GNU_IFUNC symbol as STT_FUNC.  */
Nick Clifton 488c47
+	      if (elf_section_type (input_section) == SHT_NOTE)
Nick Clifton 488c47
+		goto skip_ifunc;
Nick Clifton 488c47
 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
Nick Clifton 488c47
 		 sections because such sections are not SEC_ALLOC and
Nick Clifton 488c47
 		 thus ld.so will not process them.  */
Nick Clifton 488c47
@@ -4651,6 +4655,7 @@ do_ifunc_pointer:
Nick Clifton 488c47
 	    }
Nick Clifton 488c47
 	}
Nick Clifton 488c47
 
Nick Clifton 488c47
+    skip_ifunc:
Nick Clifton 488c47
       resolved_to_zero = (eh != NULL
Nick Clifton 488c47
 			  && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
Nick Clifton 488c47
 							      eh->has_got_reloc,
Nick Clifton 488c47
diff -rup binutils.orig/bfd/elfnn-aarch64.c binutils-2.29/bfd/elfnn-aarch64.c
Nick Clifton 488c47
--- binutils.orig/bfd/elfnn-aarch64.c	2018-03-09 15:45:28.768238763 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elfnn-aarch64.c	2018-03-09 15:53:05.151874514 +0000
Nick Clifton 488c47
@@ -4981,6 +4981,20 @@ elfNN_aarch64_final_link_relocate (reloc
Nick Clifton 488c47
       const char *name;
Nick Clifton 488c47
       bfd_vma addend = 0;
Nick Clifton 488c47
 
Nick Clifton 488c47
+      if ((input_section->flags & SEC_ALLOC) == 0)
Nick Clifton 488c47
+	{
Nick Clifton 488c47
+	  /* If this is a SHT_NOTE section without SHF_ALLOC, treat
Nick Clifton 488c47
+	     STT_GNU_IFUNC symbol as STT_FUNC.  */
Nick Clifton 488c47
+	  if (elf_section_type (input_section) == SHT_NOTE)
Nick Clifton 488c47
+	    goto skip_ifunc;
Nick Clifton 488c47
+
Nick Clifton 488c47
+	  /* Dynamic relocs are not propagated for SEC_DEBUGGING
Nick Clifton 488c47
+	     sections because such sections are not SEC_ALLOC and
Nick Clifton 488c47
+	     thus ld.so will not process them.  */
Nick Clifton 488c47
+	  if ((input_section->flags & SEC_DEBUGGING) != 0)
Nick Clifton 488c47
+	    return bfd_reloc_ok;
Nick Clifton 488c47
+	}
Nick Clifton 488c47
+
Nick Clifton 488c47
       if ((input_section->flags & SEC_ALLOC) == 0
Nick Clifton 488c47
 	  || h->plt.offset == (bfd_vma) -1)
Nick Clifton 488c47
 	abort ();
Nick Clifton 488c47
@@ -5157,6 +5171,7 @@ elfNN_aarch64_final_link_relocate (reloc
Nick Clifton 488c47
 	}
Nick Clifton 488c47
     }
Nick Clifton 488c47
 
Nick Clifton 488c47
+ skip_ifunc:
Nick Clifton 488c47
   switch (bfd_r_type)
Nick Clifton 488c47
     {
Nick Clifton 488c47
     case BFD_RELOC_AARCH64_NONE:
Nick Clifton 488c47
diff -rup binutils.orig/bfd/elfxx-sparc.c binutils-2.29/bfd/elfxx-sparc.c
Nick Clifton 488c47
--- binutils.orig/bfd/elfxx-sparc.c	2018-03-09 15:45:28.767238774 +0000
Nick Clifton 488c47
+++ binutils-2.29/bfd/elfxx-sparc.c	2018-03-09 15:53:51.395330976 +0000
Nick Clifton 488c47
@@ -3203,7 +3203,13 @@ _bfd_sparc_elf_relocate_section (bfd *ou
Nick Clifton 488c47
 
Nick Clifton 488c47
 	  if ((input_section->flags & SEC_ALLOC) == 0
Nick Clifton 488c47
 	      || h->plt.offset == (bfd_vma) -1)
Nick Clifton 488c47
-	    abort ();
Nick Clifton 488c47
+	    {
Nick Clifton 488c47
+	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
Nick Clifton 488c47
+	         STT_GNU_IFUNC symbol as STT_FUNC.  */
Nick Clifton 488c47
+	      if (elf_section_type (input_section) == SHT_NOTE)
Nick Clifton 488c47
+		goto skip_ifunc;
Nick Clifton 488c47
+	      abort ();
Nick Clifton 488c47
+	    }
Nick Clifton 488c47
 
Nick Clifton 488c47
 	  plt_sec = htab->elf.splt;
Nick Clifton 488c47
 	  if (! plt_sec)
Nick Clifton 488c47
@@ -3307,6 +3313,7 @@ _bfd_sparc_elf_relocate_section (bfd *ou
Nick Clifton 488c47
 	    }
Nick Clifton 488c47
 	}
Nick Clifton 488c47
 
Nick Clifton 488c47
+    skip_ifunc:
Nick Clifton 488c47
       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
Nick Clifton 488c47
       resolved_to_zero = (eh != NULL
Nick Clifton 488c47
                           && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));