Re: [PATCH] x86: Improve relocation error reporting

"H.J. Lu" <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Message-ID <CAMe9rOook8W2CkPBbJe6bKbpkobjjFT_zc+xshrXJdjO9fxHoA@mail.gmail.com>
On Tue, Aug 4, 2026 at 11:36 AM H.J. Lu <[email protected]> wrote:
>
> 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' is 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.
>
>

This is the patch I am checking in.

-- 
H.J.
0001-x86-Improve-relocation-error-reporting.patch (text/x-patch, 3.8 KB)
From 283d3198beda5110a8417fd09b336a34bbd2705c Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Fri, 31 Jul 2026 05:47:15 +0800
Subject: [PATCH] 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 <[email protected]>
---
 bfd/elf32-i386.c   |  9 ++++-----
 bfd/elf64-x86-64.c |  9 ++++-----
 bfd/elfxx-x86.c    | 31 +++++++++++++++++++++++++++++++
 bfd/elfxx-x86.h    |  4 ++++
 4 files changed, 43 insertions(+), 10 deletions(-)

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 *,
-- 
2.55.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.