[PATCH] ld/PE: don't emit relocations for weak absolute symbols

Jan Beulich jbeulich@suse.com
Mon Aug 18 12:52:06 GMT 2025


First we should check the flag alone, not the entire flags value
matching BSF_WEAK. And then using "else if()" is inappropriate here: A
weak symbol can very well also be absolute, and hence wouldn't want a
relocation emitted despite being defined.

--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -1652,9 +1652,8 @@ generate_reloc (bfd *abfd, struct bfd_li
 		  const struct bfd_link_hash_entry *blhe
 		    = bfd_wrapped_link_hash_lookup (abfd, info, sym->name,
 						    false, false, false);
-
 		  /* Don't create relocs for undefined weak symbols.  */
-		  if (sym->flags == BSF_WEAK)
+		  if (sym->flags & BSF_WEAK)
 		    {
 		      if (blhe && blhe->type == bfd_link_hash_undefweak)
 			{
@@ -1679,7 +1678,7 @@ generate_reloc (bfd *abfd, struct bfd_li
 			continue;
 		    }
 		  /* Nor for Dwarf FDE references to discarded sections.  */
-		  else if (bfd_is_abs_section (sym->section->output_section))
+		  if (bfd_is_abs_section (sym->section->output_section))
 		    {
 		      /* We only ignore relocs from .eh_frame sections, as
 			 they are discarded by the final link rather than
@@ -1688,10 +1687,10 @@ generate_reloc (bfd *abfd, struct bfd_li
 			continue;
 		    }
 		  /* Nor for absolute symbols.  */
-		  else if (blhe && ldexp_is_final_sym_absolute (blhe)
-			   && (!blhe->linker_def
-			       || (strcmp (sym->name, "__image_base__")
-				   && strcmp (sym->name, U ("__ImageBase")))))
+		  if (blhe && ldexp_is_final_sym_absolute (blhe)
+		      && (!blhe->linker_def
+			  || (strcmp (sym->name, "__image_base__")
+			      && strcmp (sym->name, U ("__ImageBase")))))
 		    continue;
 
 		  reloc_data[total_relocs].vma = sec_vma + relocs[i]->address;


More information about the Binutils mailing list