diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a9e6787c55..1f5ad55990 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-11-21 H.J. Lu + + * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Optimize + PC-relative offset overflow check. + 2014-11-21 Alexander Cherepanov PR binutils/17512 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 432ab58854..c64ff4f8ac 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -4749,8 +4749,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd, bfd_byte *loc; asection *plt, *gotplt, *relplt, *resolved_plt; const struct elf_backend_data *bed; - bfd_boolean gotplt_after_plt; - int32_t plt_got_pcrel_offset; + bfd_vma plt_got_pcrel_offset; /* When building a static executable, use .iplt, .igot.plt and .rela.iplt sections for STT_GNU_IFUNC symbols. */ @@ -4864,10 +4863,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd, - plt_got_insn_size); /* Check PC-relative offset overflow in PLT entry. */ - gotplt_after_plt = (gotplt->output_section->vma - > resolved_plt->output_section->vma); - if ((gotplt_after_plt && plt_got_pcrel_offset < 0) - || (!gotplt_after_plt && plt_got_pcrel_offset > 0)) + if ((plt_got_pcrel_offset + 0x80000000) > 0xffffffff) info->callbacks->einfo (_("%F%B: PC-relative offset overflow in PLT entry for `%s'\n"), output_bfd, h->root.root.string);