From: H.J. Lu Date: Thu, 30 Jul 2026 21:47:15 +0000 (+0800) Subject: x86: Improve relocation error reporting X-Git-Tag: gdb-18-branchpoint~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=283d3198beda5110a8417fd09b336a34bbd2705c;p=thirdparty%2Fbinutils-gdb.git x86: Improve relocation error reporting For bfd_reloc_outofrange relocation error, instead of ld: pr34448-bug_4.o(.debug_addr+0x7f000008): reloc against `.text.get_tls': error 4 linker now reports: ld: pr34448-bug_4.o(.debug_addr+0x7f000008): relocation `R_X86_64_64' against `.text.get_tls': out of section range PR ld/34448 * elf32-i386.c (elf_i386_relocate_section): Call _bfd_x86_elf_link_report_relocation_error for relocation error. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. * elfxx-x86.c (_bfd_x86_elf_link_report_relocation_error): New. * elfxx-x86.h (_bfd_x86_elf_link_report_relocation_error): New. Signed-off-by: H.J. Lu --- diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 8ad5cb4e354..36a957d03f1 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -3648,11 +3648,10 @@ elf_i386_relocate_section (struct bfd_link_info *info, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); else { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"), - input_bfd, input_section, - (uint64_t) rel->r_offset, name, (int) r); + _bfd_x86_elf_link_report_relocation_error (input_bfd, + input_section, + name, rel, + howto, r); return false; } } diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 878feb20b85..2d40e8fc6d8 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -5152,11 +5152,10 @@ elf_x86_64_relocate_section (struct bfd_link_info *info, } else { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"), - input_bfd, input_section, - (uint64_t) rel->r_offset, name, (int) r); + _bfd_x86_elf_link_report_relocation_error (input_bfd, + input_section, + name, rel, + howto, r); return false; } } diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index e08fec52636..da5fc3886ce 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -3424,6 +3424,37 @@ _bfd_x86_elf_link_report_error bfd_set_error (bfd_error_bad_value); } +/* Report link relocation error. */ + +void +_bfd_x86_elf_link_report_relocation_error (bfd *abfd, asection *sec, + const char *name, + Elf_Internal_Rela *rel, + reloc_howto_type *howto, + bfd_reloc_status_type status) +{ + const char *error_msg; + + switch (status) + { + case bfd_reloc_outofrange: + error_msg = _("out of section range"); + break; + + case bfd_reloc_notsupported: + error_msg = _("not supported"); + break; + + default: + abort (); + } + + _bfd_error_handler + /* xgettext:c-format */ + (_("%pB(%pA+%#" PRIx64 "): relocation `%s' against `%s': %s"), + abfd, sec, (uint64_t) rel->r_offset, howto->name, name, error_msg); +} + /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */ bool diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 430d61d3097..48e8ab4ad73 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -962,6 +962,10 @@ extern void _bfd_x86_elf_link_report_error Elf_Internal_Sym *, reloc_howto_type *, enum elf_x86_error_type) ATTRIBUTE_HIDDEN; +extern void _bfd_x86_elf_link_report_relocation_error + (bfd *, asection *, const char *, Elf_Internal_Rela *, + reloc_howto_type *, bfd_reloc_status_type) ATTRIBUTE_HIDDEN; + extern bool _bfd_elf_x86_copy_special_section_fields (const bfd *, bfd *, const Elf_Internal_Shdr *,