From: Maciej W. Rozycki Date: Tue, 9 Dec 2025 12:38:52 +0000 (+0000) Subject: BFD: Unify relocation error reporting X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8eeed95625ab7283032ed73e8866ace82daf30aa;p=thirdparty%2Fbinutils-gdb.git BFD: Unify relocation error reporting 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. --- diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index b20269b077b..d201e8d5de8 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -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; } } diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index acfc659773d..07616acccd5 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -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; } } } diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index bf2ee4801bb..4db3cfb5fe9 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -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; } } } diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 6a2eff436a7..c22665935c9 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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, */ \ diff --git a/bfd/reloc.c b/bfd/reloc.c index 45ba8612e97..112f3439c70 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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,