Blob Blame History Raw
--- binutils.orig/bfd/elf-bfd.h	2021-09-20 16:06:58.320914954 +0100
+++ binutils-2.30/bfd/elf-bfd.h	2021-09-20 16:26:11.307770371 +0100
@@ -180,6 +180,8 @@ struct elf_link_hash_entry
   /* Symbol has a non-weak reference from a non-shared object (other than
      the object in which it is defined).  */
   unsigned int ref_regular_nonweak : 1;
+  /* Symbol has a non-weak reference from a LTO IR object file.  */
+  unsigned int ref_ir_nonweak : 1;
   /* Dynamic symbol has been adjustd.  */
   unsigned int dynamic_adjusted : 1;
   /* Symbol needs a copy reloc.  */
--- binutils.orig/bfd/elflink.c	2021-09-29 14:36:01.294185139 +0100
+++ binutils-2.30/bfd/elflink.c	2021-09-29 14:39:08.113874485 +0100
@@ -4663,7 +4663,12 @@ error_free_dyn:
 
 	  /* Plugin symbols aren't normal.  Don't set def/ref flags.  */
 	  if ((abfd->flags & BFD_PLUGIN) != 0)
-	    ;
+	    {
+	      /* Except for this flag to track nonweak references.  */
+	      if (!definition
+		  && bind != STB_WEAK)
+		h->ref_ir_nonweak = 1;
+	    }
 	  else if (!dynamic)
 	    {
 	      if (! definition)
@@ -4906,11 +4911,13 @@ error_free_dyn:
 	  if (!add_needed
 	      && matched
 	      && definition
+	      && h->root.type != bfd_link_hash_indirect
 	      && ((dynsym
 		   && h->ref_regular_nonweak)
 		  || (old_bfd != NULL
 		      && (old_bfd->flags & BFD_PLUGIN) != 0
-		      && bind != STB_WEAK)
+		      && h->ref_ir_nonweak
+		      && !info->lto_all_symbols_read)
 		  || (h->ref_dynamic_nonweak
 		      && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0
 		      && !on_needed_list (elf_dt_name (abfd),