diff options
Diffstat (limited to 'bfd/elf32-ppc.c')
-rw-r--r-- | bfd/elf32-ppc.c | 177 |
1 files changed, 0 insertions, 177 deletions
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 8b32b970cc7..bd29377fe69 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5064,182 +5064,6 @@ ppc_elf_gc_mark_hook (asection *sec, return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } - -/* Update the got, plt and dynamic reloc reference counts for the - section being removed. */ - -static bfd_boolean -ppc_elf_gc_sweep_hook (bfd *abfd, - struct bfd_link_info *info, - asection *sec, - const Elf_Internal_Rela *relocs) -{ - struct ppc_elf_link_hash_table *htab; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - asection *got2; - - if (bfd_link_relocatable (info)) - return TRUE; - - if ((sec->flags & SEC_ALLOC) == 0) - return TRUE; - - elf_section_data (sec)->local_dynrel = NULL; - - htab = ppc_elf_hash_table (info); - symtab_hdr = &elf_symtab_hdr (abfd); - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - got2 = bfd_get_section_by_name (abfd, ".got2"); - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - enum elf_ppc_reloc_type r_type; - struct elf_link_hash_entry *h = NULL; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - struct elf_dyn_relocs **pp, *p; - struct ppc_elf_link_hash_entry *eh; - - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - eh = (struct ppc_elf_link_hash_entry *) h; - - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - /* Everything must go for SEC. */ - *pp = p->next; - break; - } - } - - r_type = ELF32_R_TYPE (rel->r_info); - if (!htab->is_vxworks - && h == NULL - && local_got_refcounts != NULL - && (!bfd_link_pic (info) - || is_branch_reloc (r_type))) - { - struct plt_entry **local_plt = (struct plt_entry **) - (local_got_refcounts + symtab_hdr->sh_info); - char *local_got_tls_masks = (char *) - (local_plt + symtab_hdr->sh_info); - if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0) - { - struct plt_entry **ifunc = local_plt + r_symndx; - bfd_vma addend = 0; - struct plt_entry *ent; - - if (r_type == R_PPC_PLTREL24 && bfd_link_pic (info)) - addend = rel->r_addend; - ent = find_plt_ent (ifunc, got2, addend); - if (ent->plt.refcount > 0) - ent->plt.refcount -= 1; - continue; - } - } - - switch (r_type) - { - case R_PPC_GOT_TLSLD16: - case R_PPC_GOT_TLSLD16_LO: - case R_PPC_GOT_TLSLD16_HI: - case R_PPC_GOT_TLSLD16_HA: - case R_PPC_GOT_TLSGD16: - case R_PPC_GOT_TLSGD16_LO: - case R_PPC_GOT_TLSGD16_HI: - case R_PPC_GOT_TLSGD16_HA: - case R_PPC_GOT_TPREL16: - case R_PPC_GOT_TPREL16_LO: - case R_PPC_GOT_TPREL16_HI: - case R_PPC_GOT_TPREL16_HA: - case R_PPC_GOT_DTPREL16: - case R_PPC_GOT_DTPREL16_LO: - case R_PPC_GOT_DTPREL16_HI: - case R_PPC_GOT_DTPREL16_HA: - case R_PPC_GOT16: - case R_PPC_GOT16_LO: - case R_PPC_GOT16_HI: - case R_PPC_GOT16_HA: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount--; - if (!bfd_link_pic (info)) - { - struct plt_entry *ent; - - ent = find_plt_ent (&h->plt.plist, NULL, 0); - if (ent != NULL && ent->plt.refcount > 0) - ent->plt.refcount -= 1; - } - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx]--; - } - break; - - case R_PPC_REL24: - case R_PPC_REL14: - case R_PPC_REL14_BRTAKEN: - case R_PPC_REL14_BRNTAKEN: - case R_PPC_REL32: - if (h == NULL || h == htab->elf.hgot) - break; - /* Fall through. */ - - case R_PPC_ADDR32: - case R_PPC_ADDR24: - case R_PPC_ADDR16: - case R_PPC_ADDR16_LO: - case R_PPC_ADDR16_HI: - case R_PPC_ADDR16_HA: - case R_PPC_ADDR14: - case R_PPC_ADDR14_BRTAKEN: - case R_PPC_ADDR14_BRNTAKEN: - case R_PPC_UADDR32: - case R_PPC_UADDR16: - if (bfd_link_pic (info)) - break; - /* Fall through. */ - - case R_PPC_PLT32: - case R_PPC_PLTREL24: - case R_PPC_PLTREL32: - case R_PPC_PLT16_LO: - case R_PPC_PLT16_HI: - case R_PPC_PLT16_HA: - if (h != NULL) - { - bfd_vma addend = 0; - struct plt_entry *ent; - - if (r_type == R_PPC_PLTREL24 && bfd_link_pic (info)) - addend = rel->r_addend; - ent = find_plt_ent (&h->plt.plist, got2, addend); - if (ent != NULL && ent->plt.refcount > 0) - ent->plt.refcount -= 1; - } - break; - - default: - break; - } - } - return TRUE; -} /* Set plt output section type, htab->tls_get_addr, and call the generic ELF tls_setup function. */ @@ -10950,7 +10774,6 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, #define elf_backend_object_p ppc_elf_object_p #define elf_backend_gc_mark_hook ppc_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook ppc_elf_gc_sweep_hook #define elf_backend_section_from_shdr ppc_elf_section_from_shdr #define elf_backend_relocate_section ppc_elf_relocate_section #define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections |