PR29540, R_PPC64_NONE in .rela.dyn when linking Linux vdso
authorAlan Modra <amodra@gmail.com>
Sat, 10 Sep 2022 03:28:44 +0000 (12:58 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 14 Sep 2022 00:49:56 +0000 (10:19 +0930)
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
bfd/elf64-ppc.c

index 1f77e18133addee44bc5df8022a552501183f024..0eebadc1e3771d577465f13d13dc177a45fa59ea 100644 (file)
@@ -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
index f1e482faed4e6e2228618ff832e639e505f42e9f..5329bb64afbc188fc6f3bf114edaa28a28ce6e48 100644 (file)
@@ -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