aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2014-11-21 12:12:30 -0800
committerH.J. Lu <hjl.tools@gmail.com>2014-11-21 12:12:30 -0800
commit5974eba65b82912621ac68f2c0ff844efbd02b25 (patch)
treee316477af87e27e9c8fec008709b5327b6371be2
parent9d585188889de38c7191976051d9acdd8d57cbbf (diff)
downloadgdb-5974eba65b82912621ac68f2c0ff844efbd02b25.zip
gdb-5974eba65b82912621ac68f2c0ff844efbd02b25.tar.gz
gdb-5974eba65b82912621ac68f2c0ff844efbd02b25.tar.bz2
Optimize PC-relative offset overflow check
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Optimize PC-relative offset overflow check.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-x86-64.c8
2 files changed, 7 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a9e6787..1f5ad55 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Optimize
+ PC-relative offset overflow check.
+
2014-11-21 Alexander Cherepanov <cherepan@mccme.ru>
PR binutils/17512
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 432ab58..c64ff4f 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);