]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
BFD: Unify relocation error reporting
authorMaciej W. Rozycki <macro@orcam.me.uk>
Tue, 9 Dec 2025 12:38:52 +0000 (12:38 +0000)
committerMaciej W. Rozycki <macro@orcam.me.uk>
Tue, 9 Dec 2025 12:38:52 +0000 (12:38 +0000)
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.

bfd/coff-alpha.c
bfd/elf32-nds32.c
bfd/elfxx-mips.c
bfd/libbfd.h
bfd/reloc.c

index b20269b077b4cf3dbc040a5358800038a8a34730..d201e8d5de83309d30858a0e2a3e4c25dcb58b77 100644 (file)
@@ -1154,43 +1154,10 @@ alpha_ecoff_get_relocated_section_contents (bfd *abfd,
 
       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 acfc659773d475b60c7224586617f9e37160bfa6..07616acccd5dfb3ef084f3fb963734978dd458df 100644 (file)
@@ -13162,41 +13162,10 @@ nds32_elf_get_relocated_section_contents (bfd *abfd,
 
          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 bf2ee4801bb725ca8baadd175c23357289ddb8d3..4db3cfb5fe9dd316b38d4baed807999c305e6755 100644 (file)
@@ -13570,57 +13570,10 @@ _bfd_elf_mips_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;
-
-               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 6a2eff436a77f85f209c96bcb24508b9e71ea5d8..c22665935c9ecf99c254ad3f08d2a03bd074f8af 100644 (file)
@@ -3628,6 +3628,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 45ba8612e973de148413c6c8b1f807b2982fde05..112f3439c70c0a5678f0efb82099b35857c26a46 100644 (file)
@@ -8555,57 +8555,10 @@ bfd_generic_get_relocated_section_contents (bfd *abfd,
 
          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;
            }
        }
     }
@@ -8680,6 +8633,85 @@ _bfd_unrecognized_reloc (bfd * abfd, sec_ptr section, unsigned int r_type)
   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,