[binutils-gdb] hppa64: Re-enable -gc-section support on hppa*64*-*-hpux*

John David Anglin 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=cca4420639a1390f1fb23286618efbe494987825

commit cca4420639a1390f1fb23286618efbe494987825
Author: John David Anglin <[email protected]>
Date:   Thu May 7 14:55:33 2026 -0400

    hppa64: Re-enable -gc-section support on hppa*64*-*-hpux*
    
    The previous change to elf_hppa_final_link_relocate didn't eliminate
    relocatios with invalid offsets.  Here we take a different approach
    to handle invalid offsets on hpux.  We allocate 16 bytes at the start
    of the .data section for the linker.  If we encounter a relocation
    with an invalid offset, we set the relocation's offset to the start
    of the data section.  As a result, the HP dynamic linker is happy
    and we can re-enable -gc-section support.
    
    2026-05-07  John David Anglin  <[email protected]>
    
    bfd/ChangeLog:
    
            * elf64-hppa.c (elf_hppa_final_link_relocate): Rework
            handling of relocations with invalid offsets on hpux.
            (elf_backend_can_gc_sections): Set to one on hpux.
    
    ld/ChangeLog:
    
            * emulparams/elf64hppa.sh (DATA_START_SYMBOLS): Define.
            * testsuite/ld-elf/group8a.d: Revert commit d6ce0aa3f877.
            * testsuite/ld-elf/group8b.d: Likewise.
            * testsuite/ld-elf/group9a.d: Likewise.
            * testsuite/ld-elf/group9b.d: Likewise.
            * testsuite/ld-elf/pr12851.d: Likewise.
            * testsuite/ld-elf/pr22677.d: Likewise.

Diff:
---
 bfd/elf64-hppa.c              | 38 ++++++++++++++++++++++----------------
 ld/emulparams/elf64hppa.sh    |  5 +++++
 ld/testsuite/ld-elf/group8a.d |  2 +-
 ld/testsuite/ld-elf/group8b.d |  2 +-
 ld/testsuite/ld-elf/group9a.d |  2 +-
 ld/testsuite/ld-elf/group9b.d |  2 +-
 ld/testsuite/ld-elf/pr12851.d |  2 +-
 ld/testsuite/ld-elf/pr22677.d |  2 +-
 8 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
index 4f405c32f35..8de91622465 100644
--- a/bfd/elf64-hppa.c
+++ b/bfd/elf64-hppa.c
@@ -4060,24 +4060,33 @@ elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
 						 rel->r_offset);
 	      skip = out_off == (bfd_vma) -1 || out_off == (bfd_vma) -2;
 
-	      /* If this triggers, we need to skip this relocation or
-		 output a NULL relocation.  Skipping the relocation messes
-		 up the relocation count as we can't detect this case in
-		 elf64_hppa_late_size_sections().  The HP dynamic linker
-		 doesn't like relocations with the R_PARISC_NONE type.
-		 So, we are scuppered.  We need to avoid dynamic relocations
-		 in linkonce sections that may be garbage collected.  */
-	      BFD_ASSERT (!skip || output_bfd->xvec != &hppa_elf64_vec);
-
-	      if (skip)
-		memset (&rela, 0, sizeof (rela));
-	      else
+	      /* The HP dynamic linker doesn't support relocations with
+		 the R_PARISC_NONE type.  So, we can't just output a zero
+		 relocation if we encounter an invalid offset.  We reserve
+		 16 bytes at the start of the data section that aren't
+		 used.  */
+	      if (skip && output_bfd->xvec == &hppa_elf64_vec)
+		{
+		  /* Set the relocation offset to the start of the
+		     data section.  */
+		  skip = false;
+		  baseh = hppa_info->data_hash_entry;
+		  sec = baseh->root.u.def.section;
+		  rela.r_offset = (sec->output_offset
+				   + sec->output_section->vma);
+		}
+	      else if (!skip)
 		{
 		  /* This is the output relocation offset.  */
 		  rela.r_offset = (out_off
 				   + input_section->output_offset
 				   + input_section->output_section->vma);
+		}
 
+	      if (skip)
+		memset (&rela, 0, sizeof (rela));
+	      else
+		{
 		  /* Select base segment.  */
 		  if (sym_sec->flags & SEC_READONLY)
 		    baseh = hppa_info->text_hash_entry;
@@ -4582,7 +4591,7 @@ static const struct elf_size_info hppa64_elf_size_info =
 #define elf_backend_link_output_symbol_hook \
 	elf64_hppa_link_output_symbol_hook
 
-#define elf_backend_can_gc_sections	0
+#define elf_backend_can_gc_sections	1
 #define elf_backend_want_got_plt	0
 #define elf_backend_plt_readonly	0
 #define elf_backend_want_plt_sym	0
@@ -4612,9 +4621,6 @@ static const struct elf_size_info hppa64_elf_size_info =
 #define elf_backend_special_sections	(elf64_hppa_special_sections + 1)
 #undef elf_backend_modify_segment_map
 #undef elf_backend_want_p_paddr_set_to_zero
-
-#undef elf_backend_can_gc_sections
-#define elf_backend_can_gc_sections	1
 #undef elf_backend_want_dynrelro
 #define elf_backend_want_dynrelro	1
 
diff --git a/ld/emulparams/elf64hppa.sh b/ld/emulparams/elf64hppa.sh
index 9f185ee491f..9708d172f48 100644
--- a/ld/emulparams/elf64hppa.sh
+++ b/ld/emulparams/elf64hppa.sh
@@ -101,6 +101,11 @@ OTHER_GOT_RELOC_SECTIONS="
   .rela.dlt     ${RELOCATING-0} : { *(.rela.dlt) }
   .rela.opd     ${RELOCATING-0} : { *(.rela.opd) }"
 
+# We're not actually providing a symbol anymore (due to the inability to be
+# safe in regards to shared libraries). So we just allocate the hunk of space
+# unconditionally, but do not mess around with the symbol table.
+DATA_START_SYMBOLS='. += 16;'
+
 DATA_PLT=
 PLT_BEFORE_GOT=
 
diff --git a/ld/testsuite/ld-elf/group8a.d b/ld/testsuite/ld-elf/group8a.d
index 34e17636778..09320f6cdf9 100644
--- a/ld/testsuite/ld-elf/group8a.d
+++ b/ld/testsuite/ld-elf/group8a.d
@@ -2,7 +2,7 @@
 #ld: -r --gc-sections --entry foo
 #readelf: -g --wide
 # generic linker targets don't support --gc-sections, nor do a bunch of others
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains . sections:
    \[Index\]    Name
diff --git a/ld/testsuite/ld-elf/group8b.d b/ld/testsuite/ld-elf/group8b.d
index acfbd68eb67..a3851d00529 100644
--- a/ld/testsuite/ld-elf/group8b.d
+++ b/ld/testsuite/ld-elf/group8b.d
@@ -2,7 +2,7 @@
 #ld: -r --gc-sections --entry bar
 #readelf: -g --wide
 # generic linker targets don't support --gc-sections, nor do a bunch of others
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[bar\] contains . sections:
    \[Index\]    Name
diff --git a/ld/testsuite/ld-elf/group9a.d b/ld/testsuite/ld-elf/group9a.d
index 4fb7021721b..9b481637dd5 100644
--- a/ld/testsuite/ld-elf/group9a.d
+++ b/ld/testsuite/ld-elf/group9a.d
@@ -2,7 +2,7 @@
 #ld: -r --gc-sections --entry foo
 #readelf: -g --wide
 # generic linker targets don't support --gc-sections, nor do a bunch of others
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains . sections:
    \[Index\]    Name
diff --git a/ld/testsuite/ld-elf/group9b.d b/ld/testsuite/ld-elf/group9b.d
index 08bd6138653..09cdb1f27cf 100644
--- a/ld/testsuite/ld-elf/group9b.d
+++ b/ld/testsuite/ld-elf/group9b.d
@@ -2,7 +2,7 @@
 #ld: -r --gc-sections --entry bar
 #readelf: -g --wide
 # generic linker targets don't support --gc-sections, nor do a bunch of others
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 
 COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains . sections:
    \[Index\]    Name
diff --git a/ld/testsuite/ld-elf/pr12851.d b/ld/testsuite/ld-elf/pr12851.d
index 7d606008bb1..9880e4a1ef3 100644
--- a/ld/testsuite/ld-elf/pr12851.d
+++ b/ld/testsuite/ld-elf/pr12851.d
@@ -2,7 +2,7 @@
 #source: start.s
 #ld: --gc-sections
 #readelf: -s --wide
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 # generic linker targets don't support --gc-sections, nor do a bunch of others
 
 #...
diff --git a/ld/testsuite/ld-elf/pr22677.d b/ld/testsuite/ld-elf/pr22677.d
index 4203289dead..f2f21e4c115 100644
--- a/ld/testsuite/ld-elf/pr22677.d
+++ b/ld/testsuite/ld-elf/pr22677.d
@@ -2,7 +2,7 @@
 #readelf: -S --wide
 # generic linker targets don't support --gc-sections, nor do a bunch of
 # others.
-#xfail: [is_generic] hppa*64*-*-hpux* mep-*-* mn10200-*-*
+#xfail: [is_generic] mep-*-* mn10200-*-*
 
 #...
   \[[ 0-9]+\] \.preinit_array\.01000[ \t]+PREINIT_ARRAY[ \t0-9a-f]+WA?.*
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.