asection *tsec;
char symtype;
bfd_vma toff, roff;
- enum {
- none, local, global
- } convert_mov_to_lea;
unsigned int opcode;
if (r_type != R_X86_64_GOTPCREL)
if (opcode != 0x8b)
continue;
- tsec = NULL;
- convert_mov_to_lea = none;
-
/* Get the symbol referred to by the reloc. */
if (r_symndx < symtab_hdr->sh_info)
{
Elf_Internal_Sym *isym;
- /* Silence older GCC warning. */
- h = NULL;
-
isym = bfd_sym_from_r_symndx (&htab->sym_cache,
abfd, r_symndx);
/* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation and
skip relocation against undefined symbols. */
- if (symtype != STT_GNU_IFUNC && isym->st_shndx != SHN_UNDEF)
- {
- if (isym->st_shndx == SHN_ABS)
- tsec = bfd_abs_section_ptr;
- else if (isym->st_shndx == SHN_COMMON)
- tsec = bfd_com_section_ptr;
- else if (isym->st_shndx == SHN_X86_64_LCOMMON)
- tsec = &_bfd_elf_large_com_section;
- else
- tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ if (symtype == STT_GNU_IFUNC || isym->st_shndx == SHN_UNDEF)
+ continue;
- toff = isym->st_value;
- convert_mov_to_lea = local;
- }
+ if (isym->st_shndx == SHN_ABS)
+ tsec = bfd_abs_section_ptr;
+ else if (isym->st_shndx == SHN_COMMON)
+ tsec = bfd_com_section_ptr;
+ else if (isym->st_shndx == SHN_X86_64_LCOMMON)
+ tsec = &_bfd_elf_large_com_section;
+ else
+ tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+
+ h = NULL;
+ toff = isym->st_value;
}
else
{
tsec = h->root.u.def.section;
toff = h->root.u.def.value;
symtype = h->type;
- convert_mov_to_lea = global;
}
+ else
+ continue;
}
- if (convert_mov_to_lea == none)
- continue;
-
if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
{
/* At this stage in linking, no SEC_MERGE symbol has been
changed_contents = TRUE;
changed_relocs = TRUE;
- if (convert_mov_to_lea == local)
+ if (h)
{
- if (local_got_refcounts != NULL
- && local_got_refcounts[r_symndx] > 0)
- local_got_refcounts[r_symndx] -= 1;
+ if (h->got.refcount > 0)
+ h->got.refcount -= 1;
}
else
{
- if (h->got.refcount > 0)
- h->got.refcount -= 1;
+ if (local_got_refcounts != NULL
+ && local_got_refcounts[r_symndx] > 0)
+ local_got_refcounts[r_symndx] -= 1;
}
}