[PATCH v2 01/10] BFD: Unify relocation error reporting

Maciej W. Rozycki macro@orcam.me.uk
Wed Nov 5 02:46:34 GMT 2025


A couple of targets use virtually the same code for error reporting in 
relocation processing.  Merge the copies, removing small discrepancies 
such as a fallback call to `abort' for NDS32 targets as per PR 17512, 
and factor out for backends to use.
---
New change in v2.
---
 bfd/coff-alpha.c  |   41 +---------------
 bfd/elf32-nds32.c |   39 +--------------
 bfd/elfxx-mips.c  |   55 +---------------------
 bfd/libbfd.h      |    8 +++
 bfd/reloc.c       |  134 +++++++++++++++++++++++++++++++++---------------------
 5 files changed, 103 insertions(+), 174 deletions(-)

binutils-bfd-link-reloc-error.diff
Index: binutils-gdb/bfd/coff-alpha.c
===================================================================
--- binutils-gdb.orig/bfd/coff-alpha.c
+++ binutils-gdb/bfd/coff-alpha.c
@@ -1154,43 +1154,10 @@ alpha_ecoff_get_relocated_section_conten
 
       if (r != bfd_reloc_ok)
 	{
-	  switch (r)
-	    {
-	    case bfd_reloc_undefined:
-	      (*link_info->callbacks->undefined_symbol)
-		(link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
-		 input_bfd, input_section, rel->address, true);
-	      break;
-	    case bfd_reloc_dangerous:
-	      (*link_info->callbacks->reloc_dangerous)
-		(link_info, err, input_bfd, input_section, rel->address);
-	      break;
-	    case bfd_reloc_overflow:
-	      (*link_info->callbacks->reloc_overflow)
-		(link_info, NULL, bfd_asymbol_name (*rel->sym_ptr_ptr),
-		 rel->howto->name, rel->addend, input_bfd,
-		 input_section, rel->address);
-	      break;
-	    case bfd_reloc_outofrange:
-	      (*link_info->callbacks->einfo)
-		/* xgettext:c-format */
-		(_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
-		 input_bfd, input_section, rel);
-	      goto error_return;
-	    case bfd_reloc_notsupported:
-	      (*link_info->callbacks->einfo)
-		/* xgettext:c-format */
-		(_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
-		 input_bfd, input_section, rel);
-	      goto error_return;
-	    default:
-	      (*link_info->callbacks->einfo)
-		/* xgettext:c-format */
-		(_("%X%P: %pB(%pA): relocation \"%pR\""
-		   " returns an unrecognized value %x\n"),
-		 input_bfd, input_section, rel, r);
-	      break;
-	    }
+	  _bfd_link_reloc_status_error (abfd, link_info, input_section,
+					rel, err, r);
+	  if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
+	    goto error_return;
 	}
     }
 
Index: binutils-gdb/bfd/elf32-nds32.c
===================================================================
--- binutils-gdb.orig/bfd/elf32-nds32.c
+++ binutils-gdb/bfd/elf32-nds32.c
@@ -13162,41 +13162,10 @@ nds32_elf_get_relocated_section_contents
 
 	  if (r != bfd_reloc_ok)
 	    {
-	      switch (r)
-		{
-		case bfd_reloc_undefined:
-		  (*link_info->callbacks->undefined_symbol)
-		    (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     input_bfd, input_section, (*parent)->address, true);
-		  break;
-		case bfd_reloc_dangerous:
-		  BFD_ASSERT (error_message != NULL);
-		  (*link_info->callbacks->reloc_dangerous)
-		    (link_info, error_message,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_overflow:
-		  (*link_info->callbacks->reloc_overflow)
-		    (link_info, NULL,
-		     bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     (*parent)->howto->name, (*parent)->addend,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_outofrange:
-		  /* PR ld/13730:
-		     This error can result when processing some partially
-		     complete binaries.  Do not abort, but issue an error
-		     message instead.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
-		     abfd, input_section, * parent);
-		  goto error_return;
-
-		default:
-		  abort ();
-		  break;
-		}
+	      _bfd_link_reloc_status_error (abfd, link_info, input_section,
+					    *parent, error_message, r);
+	      if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
+		goto error_return;
 	    }
 	}
     }
Index: binutils-gdb/bfd/elfxx-mips.c
===================================================================
--- binutils-gdb.orig/bfd/elfxx-mips.c
+++ binutils-gdb/bfd/elfxx-mips.c
@@ -13569,57 +13569,10 @@ _bfd_elf_mips_get_relocated_section_cont
 
 	  if (r != bfd_reloc_ok)
 	    {
-	      switch (r)
-		{
-		case bfd_reloc_undefined:
-		  (*link_info->callbacks->undefined_symbol)
-		    (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     input_bfd, input_section, (*parent)->address, true);
-		  break;
-		case bfd_reloc_dangerous:
-		  BFD_ASSERT (error_message != NULL);
-		  (*link_info->callbacks->reloc_dangerous)
-		    (link_info, error_message,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_overflow:
-		  (*link_info->callbacks->reloc_overflow)
-		    (link_info, NULL,
-		     bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     (*parent)->howto->name, (*parent)->addend,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_outofrange:
-		  /* PR ld/13730:
-		     This error can result when processing some partially
-		     complete binaries.  Do not abort, but issue an error
-		     message instead.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
-		     abfd, input_section, * parent);
-		  goto error_return;
-
-		case bfd_reloc_notsupported:
-		  /* PR ld/17512
-		     This error can result when processing a corrupt binary.
-		     Do not abort.  Issue an error message instead.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
-		     abfd, input_section, * parent);
-		  goto error_return;
-
-		default:
-		  /* PR 17512; file: 90c2a92e.
-		     Report unexpected results, without aborting.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"),
-		     abfd, input_section, * parent, r);
-		  break;
-		}
-
+	      _bfd_link_reloc_status_error (abfd, link_info, input_section,
+					    *parent, error_message, r);
+	      if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
+		goto error_return;
 	    }
 	}
     }
Index: binutils-gdb/bfd/libbfd.h
===================================================================
--- binutils-gdb.orig/bfd/libbfd.h
+++ binutils-gdb/bfd/libbfd.h
@@ -3644,6 +3644,14 @@ bool _bfd_unrecognized_reloc
     sec_ptr section,
     unsigned int r_type) ATTRIBUTE_HIDDEN;
 
+void _bfd_link_reloc_status_error
+   (bfd *abfd,
+    struct bfd_link_info *link_info,
+    asection *input_section,
+    arelent *reloc_entry,
+    char *error_message,
+    bfd_reloc_status_type r) ATTRIBUTE_HIDDEN;
+
 /* Extracted from section.c.  */
 #define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS)                   \
   /* name, next, prev, id,  section_id, index, flags, user_set_vma, */ \
Index: binutils-gdb/bfd/reloc.c
===================================================================
--- binutils-gdb.orig/bfd/reloc.c
+++ binutils-gdb/bfd/reloc.c
@@ -8570,57 +8570,10 @@ bfd_generic_get_relocated_section_conten
 
 	  if (r != bfd_reloc_ok)
 	    {
-	      switch (r)
-		{
-		case bfd_reloc_undefined:
-		  (*link_info->callbacks->undefined_symbol)
-		    (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     input_bfd, input_section, (*parent)->address, true);
-		  break;
-		case bfd_reloc_dangerous:
-		  BFD_ASSERT (error_message != NULL);
-		  (*link_info->callbacks->reloc_dangerous)
-		    (link_info, error_message,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_overflow:
-		  (*link_info->callbacks->reloc_overflow)
-		    (link_info, NULL,
-		     bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
-		     (*parent)->howto->name, (*parent)->addend,
-		     input_bfd, input_section, (*parent)->address);
-		  break;
-		case bfd_reloc_outofrange:
-		  /* PR ld/13730:
-		     This error can result when processing some partially
-		     complete binaries.  Do not abort, but issue an error
-		     message instead.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
-		     abfd, input_section, * parent);
-		  goto error_return;
-
-		case bfd_reloc_notsupported:
-		  /* PR ld/17512
-		     This error can result when processing a corrupt binary.
-		     Do not abort.  Issue an error message instead.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
-		     abfd, input_section, * parent);
-		  goto error_return;
-
-		default:
-		  /* PR 17512; file: 90c2a92e.
-		     Report unexpected results, without aborting.  */
-		  link_info->callbacks->einfo
-		    /* xgettext:c-format */
-		    (_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"),
-		     abfd, input_section, * parent, r);
-		  break;
-		}
-
+	      _bfd_link_reloc_status_error (abfd, link_info, input_section,
+					    *parent, error_message, r);
+	      if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
+		goto error_return;
 	    }
 	}
     }
@@ -8695,6 +8648,85 @@ _bfd_unrecognized_reloc (bfd * abfd, sec
   return false;
 }
 
+/*
+INTERNAL_FUNCTION
+	_bfd_link_reloc_status_error
+
+SYNOPSIS
+	void _bfd_link_reloc_status_error
+	   (bfd *abfd,
+	    struct bfd_link_info *link_info,
+	    asection *input_section,
+	    arelent *reloc_entry,
+	    char *error_message,
+	    bfd_reloc_status_type r);
+
+DESCRIPTION
+	Mark a link relocation error according to R, with a suitable
+	message as applicable.
+	Written as a function in order to reduce code duplication.
+*/
+
+void
+_bfd_link_reloc_status_error (bfd *abfd, struct bfd_link_info *link_info,
+			      asection *input_section, arelent *reloc_entry,
+			      char *error_message, bfd_reloc_status_type r)
+{
+  bfd_size_type reloc_address = reloc_entry->address;
+  bfd *input_bfd = input_section->owner;
+
+  switch (r)
+    {
+    case bfd_reloc_ok:
+      break;
+    case bfd_reloc_undefined:
+      (*link_info->callbacks->undefined_symbol)
+        (link_info, bfd_asymbol_name (*reloc_entry->sym_ptr_ptr),
+         input_bfd, input_section, reloc_address, true);
+      break;
+    case bfd_reloc_dangerous:
+      BFD_ASSERT (error_message != NULL);
+      (*link_info->callbacks->reloc_dangerous)
+        (link_info, error_message,
+         input_bfd, input_section, reloc_address);
+      break;
+    case bfd_reloc_overflow:
+      (*link_info->callbacks->reloc_overflow)
+        (link_info, NULL,
+         bfd_asymbol_name (*reloc_entry->sym_ptr_ptr),
+         reloc_entry->howto->name, reloc_entry->addend,
+         input_bfd, input_section, reloc_address);
+      break;
+    case bfd_reloc_outofrange:
+      /* PR ld/13730:
+         This error can result when processing some partially
+         complete binaries.  Do not abort, but issue an error
+         message instead.  */
+      link_info->callbacks->einfo
+        /* xgettext:c-format */
+        (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
+         abfd, input_section, reloc_entry);
+      break;
+    case bfd_reloc_notsupported:
+      /* PR ld/17512
+         This error can result when processing a corrupt binary.
+         Do not abort.  Issue an error message instead.  */
+      link_info->callbacks->einfo
+        /* xgettext:c-format */
+        (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
+         abfd, input_section, reloc_entry);
+      break;
+    default:
+      /* PR 17512; file: 90c2a92e.
+         Report unexpected results, without aborting.  */
+      link_info->callbacks->einfo
+        /* xgettext:c-format */
+        (_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"),
+         abfd, input_section, reloc_entry, r);
+      break;
+    }
+}
+
 reloc_howto_type *
 _bfd_norelocs_bfd_reloc_type_lookup
     (bfd *abfd,


More information about the Binutils mailing list