[binutils-gdb] Don't create got in bfin_relocate_section

Alan Modra via Binutils-cvs <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d88b58231ebf1d1a963bf194bf0666174b3a6547

commit d88b58231ebf1d1a963bf194bf0666174b3a6547
Author: Alan Modra <[email protected]>
Date:   Sat Apr 18 17:37:13 2026 +0930

    Don't create got in bfin_relocate_section
    
    Commit 7a84e3daf81a created .got in relocate_section which according
    to https://sourceware.org/pipermail/binutils/2008-February/055281.html
    was to "fix a crash when linking incompatible object files (normal
    vs. FD-PIC)".  I can see how that happens by inspecting the two
    check_relocs functions, and note that Bernd's change to
    merge_private_bfd_data will cause a linker error on trying to link
    incompatible ABI objects before relocate_section is reached.  However
    a user can silence the error with --no-warn-mismatch.  It is far too
    late to be creating sections in relocate_sections.  They won't be
    output.
    
            * elf32-bfin.c (bfin_relocate_section): Do not create .got
            here to avoid a segfault.  Instead report an unresolvable
            relocation error if .got has not already been created.

Diff:
---
 bfd/elf32-bfin.c | 44 +++++++++++++++++++-------------------------
 1 file changed, 19 insertions(+), 25 deletions(-)

diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
index 0b87cd92b17..940fdc8c7a9 100644
--- a/bfd/elf32-bfin.c
+++ b/bfd/elf32-bfin.c
@@ -1369,7 +1369,6 @@ bfin_relocate_section (bfd * output_bfd,
 		       Elf_Internal_Sym * local_syms,
 		       asection ** local_sections)
 {
-  bfd *dynobj;
   Elf_Internal_Shdr *symtab_hdr;
   struct elf_link_hash_entry **sym_hashes;
   bfd_vma *local_got_offsets;
@@ -1377,7 +1376,6 @@ bfin_relocate_section (bfd * output_bfd,
   Elf_Internal_Rela *rel;
   Elf_Internal_Rela *relend;
 
-  dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = &elf_symtab_hdr (input_bfd);
   sym_hashes = elf_sym_hashes (input_bfd);
   local_got_offsets = elf_local_got_offsets (input_bfd);
@@ -1462,24 +1460,19 @@ bfin_relocate_section (bfd * output_bfd,
 	  if (h != NULL
 	      && strcmp (h->root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
 	    goto do_default;
-	  /* Fall through.  */
+
 	  /* Relocation is the offset of the entry for this symbol in
 	     the global offset table.  */
+	  sgot = elf_hash_table (info)->sgot;
+	  if (sgot == NULL)
+	    {
+	      r = bfd_reloc_undefined;
+	      goto report_error;
+	    }
 
 	  {
 	    bfd_vma off;
 
-	    if (dynobj == NULL)
-	      {
-		/* Create the .got section.  */
-		elf_hash_table (info)->dynobj = dynobj = output_bfd;
-		if (!_bfd_elf_create_got_section (dynobj, info))
-		  return false;
-	      }
-
-	    sgot = elf_hash_table (info)->sgot;
-	    BFD_ASSERT (sgot != NULL);
-
 	    if (h != NULL)
 	      {
 		bool dyn;
@@ -1565,14 +1558,13 @@ bfin_relocate_section (bfd * output_bfd,
 	    /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4.  */
 	    relocation /= 4;
 	  }
-	  goto do_default;
+	  /* Fall through.  */
 
 	default:
 	do_default:
 	  r = bfin_final_link_relocate (rel, howto, input_bfd, input_section,
 					contents, address,
 					relocation, rel->r_addend);
-
 	  break;
 	}
 
@@ -1583,16 +1575,9 @@ bfin_relocate_section (bfd * output_bfd,
 	  && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic)
 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
 				      rel->r_offset) != (bfd_vma) -1)
-	{
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%pB(%pA+%#" PRIx64 "): "
-	       "unresolvable relocation against symbol `%s'"),
-	     input_bfd, input_section, (uint64_t) rel->r_offset,
-	     h->root.root.string);
-	  return false;
-	}
+	r = bfd_reloc_undefined;
 
+    report_error:
       if (r != bfd_reloc_ok)
 	{
 	  const char *name;
@@ -1614,6 +1599,15 @@ bfin_relocate_section (bfd * output_bfd,
 	    (*info->callbacks->reloc_overflow)
 	      (info, (h ? &h->root : NULL), name, howto->name,
 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
+	  else if (r == bfd_reloc_undefined)
+	    {
+	      _bfd_error_handler
+		/* xgettext:c-format */
+		(_("%pB(%pA+%#" PRIx64 "): "
+		   "unresolvable relocation against symbol `%s'"),
+		 input_bfd, input_section, (uint64_t) rel->r_offset, name);
+	      return false;
+	    }
 	  else
 	    {
 	      _bfd_error_handler
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.