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

John David Anglin dave.anglin@bell.net
Thu May 7 19:00:11 GMT 2026


Tested on hppa64-hp-hpux11.11 and x86_64-pc-linux-gnu.  Committed to
master.

Dave
---

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  <danglin@gcc.gnu.org>

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 --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?.*
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20260507/2532b003/attachment.sig>


More information about the Binutils mailing list