hppa64 root.u.def assertions
John David Anglin
dave.anglin@bell.net
Wed Jan 21 16:52:26 GMT 2026
OK.
Thanks,
Dave
On 2026-01-21 3:01 a.m., Alan Modra wrote:
> 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.
>
> OK?
>
> * 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 --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
> index c35dcf02976..66a01346a9a 100644
> --- a/bfd/elf64-hppa.c
> +++ b/bfd/elf64-hppa.c
> @@ -2125,10 +2125,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.
>
> @@ -2260,6 +2266,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);
> @@ -2390,27 +2399,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
> @@ -2499,6 +2508,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;
>
> @@ -2518,22 +2528,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;
> }
> @@ -3300,6 +3310,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;
> @@ -3313,15 +3324,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. */
> @@ -4032,6 +4040,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,
> @@ -4046,15 +4055,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. */
>
--
John David Anglin dave.anglin@bell.net
More information about the Binutils
mailing list