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

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