From c1288ad0f77bf2211dc33de30fe86dd084670a15 Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Wed, 15 Oct 2025 14:29:51 -0400 Subject: [PATCH] hppa64: Fix addition of symbols to local dynamic table This fixes lookup failure in elf64_hppa_finalize_dynreloc. 2025-10-15 John David Anglin bfd/ChangeLog: * elf64-hppa.c (elf64_hppa_check_relocs): Record local dynamic symbol if a dynamic relocation is needed. (allocate_global_data_dlt) Fix typo. (allocate_dynrel_entries): Don't record symbol. (elf64_hppa_finalize_dynreloc): Assert dynindx is not -1. --- bfd/elf64-hppa.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 05bb7f125b7..74f59fa85db 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -896,6 +896,13 @@ elf64_hppa_check_relocs (bfd *abfd, sec_symndx, rel->r_offset, rel->r_addend)) goto err_out; + /* Add symbol to dynamic symbol table. */ + if (hh != NULL + && bfd_link_pic (info) + && ! (bfd_elf_link_record_local_dynamic_symbol + (info, abfd, r_symndx))) + goto err_out; + /* If we are building a shared library and we just recorded a dynamic R_PARISC_FPTR64 relocation, then make sure the section symbol for this section ends up in the dynamic @@ -903,7 +910,7 @@ elf64_hppa_check_relocs (bfd *abfd, if (bfd_link_pic (info) && dynrel_type == R_PARISC_FPTR64 && ! (bfd_elf_link_record_local_dynamic_symbol (info, abfd, sec_symndx))) - return false; + goto err_out; } } @@ -1009,7 +1016,7 @@ allocate_global_data_dlt (struct elf_link_hash_entry *eh, void *data) return true; } -/* Allocate space for a DLT.PLT entry. */ +/* Allocate space for a PLT entry. */ static bool allocate_global_data_plt (struct elf_link_hash_entry *eh, void *data) @@ -1451,16 +1458,6 @@ allocate_dynrel_entries (struct elf_link_hash_entry *eh, void *data) if (!discarded_section (hppa_info->other_rel_sec)) hppa_info->other_rel_sec->size += sizeof (Elf64_External_Rela); - - /* Make sure this symbol gets into the dynamic symbol table if - it is not already recorded. */ - if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI) - { - BFD_ASSERT (rent->sec->owner == hh->owner); - if (!bfd_elf_link_record_local_dynamic_symbol - (x->info, hh->owner, hh->sym_indx)) - return false; - } } /* Take care of the GOT and PLT relocations. */ @@ -2418,6 +2415,7 @@ elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh, else rel.r_addend = rent->addend; + BFD_ASSERT (dynindx != -1); rel.r_info = ELF64_R_INFO (dynindx, rent->type); loc = hppa_info->other_rel_sec->contents; -- 2.47.3