diff options
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r-- | bfd/elf32-arm.c | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 1e78c7a..23c7664 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -14297,199 +14297,6 @@ elf32_arm_gc_mark_hook (asection *sec, return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } -/* Update the got entry reference counts for the section being removed. */ - -static bfd_boolean -elf32_arm_gc_sweep_hook (bfd * abfd, - struct bfd_link_info * info, - asection * sec, - const Elf_Internal_Rela * relocs) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - struct elf32_arm_link_hash_table * globals; - - if (bfd_link_relocatable (info)) - return TRUE; - - globals = elf32_arm_hash_table (info); - if (globals == NULL) - return FALSE; - - elf_section_data (sec)->local_dynrel = NULL; - - symtab_hdr = & elf_symtab_hdr (abfd); - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - - check_use_blx (globals); - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h = NULL; - struct elf32_arm_link_hash_entry *eh; - int r_type; - bfd_boolean call_reloc_p; - bfd_boolean may_become_dynamic_p; - bfd_boolean may_need_local_target_p; - union gotplt_union *root_plt; - struct arm_plt_info *arm_plt; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - 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 elf32_arm_link_hash_entry *) h; - - call_reloc_p = FALSE; - may_become_dynamic_p = FALSE; - may_need_local_target_p = FALSE; - - r_type = ELF32_R_TYPE (rel->r_info); - r_type = arm_real_reloc_type (globals, r_type); - switch (r_type) - { - case R_ARM_GOT32: - case R_ARM_GOT_PREL: - case R_ARM_TLS_GD32: - case R_ARM_TLS_IE32: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount -= 1; - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - case R_ARM_TLS_LDM32: - globals->tls_ldm_got.refcount -= 1; - break; - - case R_ARM_PC24: - case R_ARM_PLT32: - case R_ARM_CALL: - case R_ARM_JUMP24: - case R_ARM_PREL31: - case R_ARM_THM_CALL: - case R_ARM_THM_JUMP24: - case R_ARM_THM_JUMP19: - call_reloc_p = TRUE; - may_need_local_target_p = TRUE; - break; - - case R_ARM_ABS12: - if (!globals->vxworks_p) - { - may_need_local_target_p = TRUE; - break; - } - /* Fall through. */ - case R_ARM_ABS32: - case R_ARM_ABS32_NOI: - case R_ARM_REL32: - case R_ARM_REL32_NOI: - case R_ARM_MOVW_ABS_NC: - case R_ARM_MOVT_ABS: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_ABS_NC: - case R_ARM_THM_MOVT_ABS: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - /* Should the interworking branches be here also? */ - if ((bfd_link_pic (info) || globals->root.is_relocatable_executable) - && (sec->flags & SEC_ALLOC) != 0) - { - if (h == NULL - && elf32_arm_howto_from_type (r_type)->pc_relative) - { - call_reloc_p = TRUE; - may_need_local_target_p = TRUE; - } - else - may_become_dynamic_p = TRUE; - } - else - may_need_local_target_p = TRUE; - break; - - default: - break; - } - - if (may_need_local_target_p - && elf32_arm_get_plt_info (abfd, globals, eh, r_symndx, &root_plt, - &arm_plt)) - { - /* If PLT refcount book-keeping is wrong and too low, we'll - see a zero value (going to -1) for the root PLT reference - count. */ - if (root_plt->refcount >= 0) - { - BFD_ASSERT (root_plt->refcount != 0); - root_plt->refcount -= 1; - } - else - /* A value of -1 means the symbol has become local, forced - or seeing a hidden definition. Any other negative value - is an error. */ - BFD_ASSERT (root_plt->refcount == -1); - - if (!call_reloc_p) - arm_plt->noncall_refcount--; - - if (r_type == R_ARM_THM_CALL) - arm_plt->maybe_thumb_refcount--; - - if (r_type == R_ARM_THM_JUMP24 - || r_type == R_ARM_THM_JUMP19) - arm_plt->thumb_refcount--; - } - - if (may_become_dynamic_p) - { - struct elf_dyn_relocs **pp; - struct elf_dyn_relocs *p; - - if (h != NULL) - pp = &(eh->dyn_relocs); - else - { - Elf_Internal_Sym *isym; - - isym = bfd_sym_from_r_symndx (&globals->sym_cache, - abfd, r_symndx); - if (isym == NULL) - return FALSE; - pp = elf32_arm_get_local_dynreloc_list (abfd, r_symndx, isym); - if (pp == NULL) - return FALSE; - } - for (; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - /* Everything must go for SEC. */ - *pp = p->next; - break; - } - } - } - - return TRUE; -} - /* Look through the relocs for a section during the first phase. */ static bfd_boolean @@ -19400,7 +19207,6 @@ elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym) #define elf_backend_get_symbol_type elf32_arm_get_symbol_type #define elf_backend_gc_mark_hook elf32_arm_gc_mark_hook #define elf_backend_gc_mark_extra_sections elf32_arm_gc_mark_extra_sections -#define elf_backend_gc_sweep_hook elf32_arm_gc_sweep_hook #define elf_backend_check_relocs elf32_arm_check_relocs #define elf_backend_update_relocs elf32_arm_update_relocs #define elf_backend_relocate_section elf32_arm_relocate_section |