[binutils-gdb] elflink.c: _bfd_elf_make_dynamic_reloc_section sanity checks

Alan Modra amodra@sourceware.org
Mon Aug 17 01:24:35 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=53fd57102aa8f37fa604ef40a1f58bd86315832f

commit 53fd57102aa8f37fa604ef40a1f58bd86315832f
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Aug 6 11:15:41 2026 +0930

    elflink.c: _bfd_elf_make_dynamic_reloc_section sanity checks
    
    Add a check that the byte order for an input object needing dynamic
    relocs matches the byte order of the output.  Also free up a little
    memory if the string created by get_dynamic_reloc_section_name is
    unused.  The change in get_dynamic_reloc_section_name return value
    is to avoid a cast when calling bfd_release.
    
            * elflink.c (get_dynamic_reloc_section_name): Return char*.
            (_bfd_elf_make_dynamic_reloc_section): Sanity check that
            dynobj exists, and that relocs and byte order are as expected.
            Release name if section already exists.

Diff:
---
 bfd/elflink.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/bfd/elflink.c b/bfd/elflink.c
index e60df0475c0..5a3ee89142b 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -15522,9 +15522,9 @@ _bfd_elf_default_got_elt_size (struct bfd_link_info *info,
 
 /* Returns the name of the dynamic reloc section associated with SEC.  */
 
-static const char *
-get_dynamic_reloc_section_name (bfd *       abfd,
-				asection *  sec,
+static char *
+get_dynamic_reloc_section_name (bfd *abfd,
+				asection *sec,
 				bool is_rela)
 {
   const char *prefix = is_rela ? ".rela" : ".rel";
@@ -15561,14 +15561,28 @@ _bfd_elf_make_dynamic_reloc_section (asection *sec,
 
   if (reloc_sec == NULL)
     {
-      const char * name = get_dynamic_reloc_section_name (abfd, sec, is_rela);
+      bool known = (dynobj != NULL
+		    && (get_elf_backend_data (dynobj)
+			->relocs_compatible (dynobj->xvec, abfd->xvec)));
+      BFD_ASSERT (known);
+      if (!known
+	  || dynobj->xvec->byteorder != abfd->xvec->byteorder)
+	{
+	  _bfd_error_handler (_("%s dynamic relocs incompatible with%s%s output"),
+			      bfd_get_target (abfd),
+			      dynobj ? " " : "",
+			      dynobj ? bfd_get_target (dynobj) : "");
+	  return NULL;
+	}
 
+      char *name = get_dynamic_reloc_section_name (dynobj, sec, is_rela);
       if (name == NULL)
 	return NULL;
 
       reloc_sec = bfd_get_linker_section (dynobj, name);
-
-      if (reloc_sec == NULL)
+      if (reloc_sec != NULL)
+	bfd_release (dynobj, name);
+      else
 	{
 	  flagword flags = (SEC_HAS_CONTENTS | SEC_READONLY
 			    | SEC_IN_MEMORY | SEC_LINKER_CREATED);


More information about the Binutils-cvs mailing list