Blame SOURCES/binutils-ld-ir-plugin.patch

447fbd
diff -rup binutils.orig/bfd/elflink.c binutils-2.35.2/bfd/elflink.c
447fbd
--- binutils.orig/bfd/elflink.c	2022-11-28 16:10:23.919422266 +0000
447fbd
+++ binutils-2.35.2/bfd/elflink.c	2022-11-28 16:14:24.308499080 +0000
447fbd
@@ -1260,14 +1260,25 @@ _bfd_elf_merge_symbol (bfd *abfd,
447fbd
       olddyn = (oldsec->symbol->flags & BSF_DYNAMIC) != 0;
447fbd
     }
447fbd
 
447fbd
-  /* Handle a case where plugin_notice won't be called and thus won't
447fbd
-     set the non_ir_ref flags on the first pass over symbols.  */
447fbd
   if (oldbfd != NULL
447fbd
-      && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN)
447fbd
-      && newdyn != olddyn)
447fbd
+      && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN))
447fbd
     {
447fbd
-      h->root.non_ir_ref_dynamic = TRUE;
447fbd
-      hi->root.non_ir_ref_dynamic = TRUE;
447fbd
+      if (newdyn != olddyn)
447fbd
+	{
447fbd
+	  /* Handle a case where plugin_notice won't be called and thus
447fbd
+	     won't set the non_ir_ref flags on the first pass over
447fbd
+	     symbols.  */
447fbd
+	  h->root.non_ir_ref_dynamic = TRUE;
447fbd
+	  hi->root.non_ir_ref_dynamic = TRUE;
447fbd
+	}
447fbd
+
447fbd
+      if ((oldbfd->flags & BFD_PLUGIN) != 0
447fbd
+	  && hi->root.type == bfd_link_hash_indirect)
447fbd
+	{
447fbd
+	  /* Change indirect symbol from IR to undefined.  */
447fbd
+	  hi->root.type = bfd_link_hash_undefined;
447fbd
+	  hi->root.u.undef.abfd = oldbfd;
447fbd
+	}
447fbd
     }
447fbd
 
447fbd
   /* NEWDEF and OLDDEF indicate whether the new or old symbol,
447fbd
diff -rup binutils.orig/bfd/linker.c binutils-2.35.2/bfd/linker.c
447fbd
--- binutils.orig/bfd/linker.c	2022-11-28 16:10:23.822422639 +0000
447fbd
+++ binutils-2.35.2/bfd/linker.c	2022-11-28 16:13:28.709712603 +0000
447fbd
@@ -1672,7 +1672,7 @@ _bfd_generic_link_add_one_symbol (struct
447fbd
 	case MIND:
447fbd
 	  /* Multiple indirect symbols.  This is OK if they both point
447fbd
 	     to the same symbol.  */
447fbd
-	  if (strcmp (h->u.i.link->root.string, string) == 0)
447fbd
+	  if (string != NULL && strcmp (h->u.i.link->root.string, string) == 0)
447fbd
 	    break;
447fbd
 	  /* Fall through.  */
447fbd
 	case MDEF:
447fbd
--- binutils.orig/bfd/elflink.c	2023-01-10 15:47:50.062668055 +0000
447fbd
+++ binutils-2.35.2/bfd/elflink.c	2023-01-10 15:47:59.554659559 +0000
447fbd
@@ -1271,8 +1271,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
447fbd
 	  h->root.non_ir_ref_dynamic = TRUE;
447fbd
 	  hi->root.non_ir_ref_dynamic = TRUE;
447fbd
 	}
447fbd
-
447fbd
-      if ((oldbfd->flags & BFD_PLUGIN) != 0
447fbd
+      else if ((oldbfd->flags & BFD_PLUGIN) != 0
447fbd
 	  && hi->root.type == bfd_link_hash_indirect)
447fbd
 	{
447fbd
 	  /* Change indirect symbol from IR to undefined.  */