From 365bf300da35c11e27bb8cdd3964f82e3d32f094 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 10 Sep 2022 12:58:44 +0930 Subject: [PATCH] PR29540, R_PPC64_NONE in .rela.dyn when linking Linux vdso PR 29540 * elf64-ppc.c (allocate_dynrelocs): Don't alloc space for relocs against discarded sections. (ppc64_elf_size_dynamic_sections): Use standard test for discarded sections. * elf32-ppc.c (allocate_dynrelocs): Don't alloc space for relocs against discarded sections. (ppc_elf_size_dynamic_sections): Use standard test for discarded sections. --- bfd/elf32-ppc.c | 16 ++++++++-------- bfd/elf64-ppc.c | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 1f77e18133a..0eebadc1e37 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5268,12 +5268,13 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* Allocate space. */ for (p = h->dyn_relocs; p != NULL; p = p->next) - { - asection *sreloc = elf_section_data (p->sec)->sreloc; - if (eh->elf.type == STT_GNU_IFUNC) - sreloc = htab->elf.irelplt; - sreloc->size += p->count * sizeof (Elf32_External_Rela); - } + if (!discarded_section (p->sec)) + { + asection *sreloc = elf_section_data (p->sec)->sreloc; + if (eh->elf.type == STT_GNU_IFUNC) + sreloc = htab->elf.irelplt; + sreloc->size += p->count * sizeof (Elf32_External_Rela); + } /* Handle PLT relocs. Done last, after dynindx has settled. We might need a PLT entry when the symbol @@ -5535,8 +5536,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd, p != NULL; p = p->next) { - if (!bfd_is_abs_section (p->sec) - && bfd_is_abs_section (p->sec->output_section)) + if (discarded_section (p->sec)) { /* Input section has been discarded, either because it is a copy of a linkonce section or due to diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index f1e482faed4..5329bb64afb 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -10000,20 +10000,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* Finally, allocate space. */ for (p = (struct ppc_dyn_relocs *) h->dyn_relocs; p != NULL; p = p->next) - { - unsigned int count; - asection *sreloc = elf_section_data (p->sec)->sreloc; - if (eh->elf.type == STT_GNU_IFUNC) - sreloc = htab->elf.irelplt; - count = p->count; - if (info->enable_dt_relr - && ((!NO_OPD_RELOCS - && ppc64_elf_section_data (p->sec)->sec_type == sec_opd) - || (eh->elf.type != STT_GNU_IFUNC - && SYMBOL_REFERENCES_LOCAL (info, h)))) - count -= p->rel_count; - sreloc->size += count * sizeof (Elf64_External_Rela); - } + if (!discarded_section (p->sec)) + { + unsigned int count; + asection *sreloc = elf_section_data (p->sec)->sreloc; + if (eh->elf.type == STT_GNU_IFUNC) + sreloc = htab->elf.irelplt; + count = p->count; + if (info->enable_dt_relr + && ((!NO_OPD_RELOCS + && ppc64_elf_section_data (p->sec)->sec_type == sec_opd) + || (eh->elf.type != STT_GNU_IFUNC + && SYMBOL_REFERENCES_LOCAL (info, h)))) + count -= p->rel_count; + sreloc->size += count * sizeof (Elf64_External_Rela); + } } /* We might need a PLT entry when the symbol @@ -10248,8 +10249,7 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd, for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) { - if (!bfd_is_abs_section (p->sec) - && bfd_is_abs_section (p->sec->output_section)) + if (discarded_section (p->sec)) { /* Input section has been discarded, either because it is a copy of a linkonce section or due to -- 2.30.2