[binutils-gdb] hppa64 root.u.def assertions

Alan Modra amodra@sourceware.org
Wed Jan 21 22:33:18 GMT 2026


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

commit 5fbaadcf9dd7ea5e3526cc0c7f683c13d9e31bba
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Jan 21 15:27:34 2026 +1030

    hppa64 root.u.def assertions
    
    The aim here is to add assertions when root.u.def is accessed that
    the field is valid, ie. we have a bfd_link_hash_defined or
    bfd_link_hash_defweak symbol.  On doing so I found the assertion
    triggering on one of the ld undefweak tests, fixed with the
    elf64_hppa_finish_dynamic_symbol change.
    
    The patch also refactors code using text_hash_entry and
    data_hash_entry.
    
            * elf64-hppa.c (elf64_hppa_finish_dynamic_symbol): Use zero
            value for both undefined and undefweak symbols, and when
            non-pic too.  Assert when accessing root.u.def that the symbol
            is the correct type.
            (elf64_hppa_finalize_opd, elf64_hppa_finalize_dlt),
            (elf64_hppa_finalize_dynreloc): Similarly assert here.
            (elf64_hppa_finalize_dlt): Move duplicate code involving
            text_hash_entry and data_hash_entry out of conditionals.
            (elf64_hppa_finalize_dynreloc, elf_hppa_dlt_dynrel_reloc),
            (elf_hppa_final_link_relocate): Likewise.

Diff:
---
 bfd/elf64-hppa.c | 82 ++++++++++++++++++++++++++++++--------------------------
 1 file changed, 44 insertions(+), 38 deletions(-)

diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
index 2828b15add9..ca61c9c7d78 100644
--- a/bfd/elf64-hppa.c
+++ b/bfd/elf64-hppa.c
@@ -2127,10 +2127,16 @@ elf64_hppa_finish_dynamic_symbol (bfd *output_bfd,
 	 if we are creating a shared library and the symbol is
 	 still undefined, we create a dynamic relocation to fill
 	 in the correct value.  */
-      if (bfd_link_pic (info) && eh->root.type == bfd_link_hash_undefined)
+      if (eh->root.type == bfd_link_hash_undefined
+	  || eh->root.type == bfd_link_hash_undefweak)
 	value = 0;
       else
-	value = (eh->root.u.def.value + eh->root.u.def.section->vma);
+	{
+	  BFD_ASSERT (eh->root.type == bfd_link_hash_defined
+		      || eh->root.type == bfd_link_hash_defweak);
+
+	  value = eh->root.u.def.value + eh->root.u.def.section->vma;
+	}
 
       /* Fill in the entry in the procedure linkage table.
 
@@ -2262,6 +2268,9 @@ elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data)
     {
       bfd_vma value;
 
+      BFD_ASSERT (eh->root.type == bfd_link_hash_defined
+		  || eh->root.type == bfd_link_hash_defweak);
+
       value = (eh->root.u.def.value
 	       + eh->root.u.def.section->output_section->vma
 	       + eh->root.u.def.section->output_offset);
@@ -2392,27 +2401,27 @@ elf64_hppa_finalize_dlt (struct elf_link_hash_entry *eh, void *data)
       Elf_Internal_Rela rel;
       bfd_byte *loc;
       long dynindx;
+      struct elf_link_hash_entry *baseh;
       asection *sec;
       bfd_vma value, value2;
 
       if (eh->dynindx == -1)
 	{
+	  BFD_ASSERT (eh->root.type == bfd_link_hash_defined
+		      || eh->root.type == bfd_link_hash_defweak);
+
 	  value = (eh->root.u.def.value
 		   + eh->root.u.def.section->output_section->vma
 		   + eh->root.u.def.section->output_offset);
 
 	  if (eh->root.u.def.section->flags & SEC_READONLY)
-	    {
-	      sec = hppa_info->text_hash_entry->root.u.def.section;
-	      value2 = sec->output_offset + sec->output_section->vma;
-	      dynindx = hppa_info->text_hash_entry->dynindx;
-	    }
+	    baseh = hppa_info->text_hash_entry;
 	  else
-	    {
-	      sec = hppa_info->data_hash_entry->root.u.def.section;
-	      value2 = sec->output_offset + sec->output_section->vma;
-	      dynindx = hppa_info->data_hash_entry->dynindx;
-	    }
+	    baseh = hppa_info->data_hash_entry;
+
+	  sec = baseh->root.u.def.section;
+	  value2 = sec->output_offset + sec->output_section->vma;
+	  dynindx = baseh->dynindx;
 	  rel.r_addend = value - value2;
 	}
       else
@@ -2501,6 +2510,7 @@ elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
 
 	  if (eh->dynindx == -1)
 	    {
+	      struct elf_link_hash_entry *baseh;
 	      asection *sec, *sopd;
 	      bfd_vma value, value2;
 
@@ -2520,22 +2530,22 @@ elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
 		{
 		  if (discarded_section (eh->root.u.def.section))
 		    continue;
+
+		  BFD_ASSERT (eh->root.type == bfd_link_hash_defined
+			      || eh->root.type == bfd_link_hash_defweak);
+
 		  value = (eh->root.u.def.value
 			   + eh->root.u.def.section->output_section->vma
 			   + eh->root.u.def.section->output_offset);
 
 		  if (eh->root.u.def.section->flags & SEC_READONLY)
-		    {
-		      sec = hppa_info->text_hash_entry->root.u.def.section;
-		      value2 = sec->output_offset + sec->output_section->vma;
-		      dynindx = hppa_info->text_hash_entry->dynindx;
-		    }
+		    baseh = hppa_info->text_hash_entry;
 		  else
-		    {
-		      sec = hppa_info->data_hash_entry->root.u.def.section;
-		      value2 = sec->output_offset + sec->output_section->vma;
-		      dynindx = hppa_info->data_hash_entry->dynindx;
-		    }
+		    baseh = hppa_info->data_hash_entry;
+
+		  sec = baseh->root.u.def.section;
+		  value2 = sec->output_offset + sec->output_section->vma;
+		  dynindx = baseh->dynindx;
 		}
 	      rel.r_addend = value - value2;
 	    }
@@ -3302,6 +3312,7 @@ elf_hppa_dlt_dynrel_reloc (Elf_Internal_Rela *rel,
   Elf_Internal_Rela rela;
   bfd_byte *loc;
   long dynindx;
+  struct elf_link_hash_entry *baseh;
   asection *sec;
   asection *sdlt, *sdltrel;
   bfd_signed_vma addend = rel->r_addend;
@@ -3315,15 +3326,12 @@ elf_hppa_dlt_dynrel_reloc (Elf_Internal_Rela *rel,
   rela.r_offset = dlt_offset + sdlt->output_offset + sdlt->output_section->vma;
 
   if (sym_sec->flags & SEC_READONLY)
-    {
-      sec = hppa_info->text_hash_entry->root.u.def.section;
-      dynindx = hppa_info->text_hash_entry->dynindx;
-    }
+    baseh = hppa_info->text_hash_entry;
   else
-    {
-      sec = hppa_info->data_hash_entry->root.u.def.section;
-      dynindx = hppa_info->data_hash_entry->dynindx;
-    }
+    baseh = hppa_info->data_hash_entry;
+
+  sec = baseh->root.u.def.section;
+  dynindx = baseh->dynindx;
 
   /* Adjust addend using the difference of the symbol's
      location and the section symbol's address.  */
@@ -4034,6 +4042,7 @@ elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
 						     r_symndx) != -1)
 	    {
 	      bfd_vma out_off;
+	      struct elf_link_hash_entry *baseh;
 
 	      out_off = _bfd_elf_section_offset (output_bfd, info,
 						 input_section,
@@ -4048,15 +4057,12 @@ elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
 
 	      /* Select base segment.  */
 	      if (sym_sec->flags & SEC_READONLY)
-		{
-		  sec = hppa_info->text_hash_entry->root.u.def.section;
-		  dynindx = hppa_info->text_hash_entry->dynindx;
-		}
+		baseh = hppa_info->text_hash_entry;
 	      else
-		{
-		  sec = hppa_info->data_hash_entry->root.u.def.section;
-		  dynindx = hppa_info->data_hash_entry->dynindx;
-		}
+		baseh = hppa_info->data_hash_entry;
+
+	      sec = baseh->root.u.def.section;
+	      dynindx = baseh->dynindx;
 
 	      /* Adjust addend using the difference of the symbol's
 		 location and the section symbol's address.  */


More information about the Binutils-cvs mailing list