[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?.*