Check branch displacement overflow in x86-64 PLT entry
Displacement of branch to PLT0 in x86-64 PLT entry is signed 32-bit. This patch adds a sanity check. We will only see the failure when PLT size is > 2GB. * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Check branch displacement overflow in PLT entry.
This commit is contained in:
parent
84429e27c8
commit
35a14c6b54
|
@ -1,3 +1,8 @@
|
|||
2014-11-22 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Check
|
||||
branch displacement overflow in PLT entry.
|
||||
|
||||
2014-11-21 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR binutils/17512
|
||||
|
|
|
@ -4906,11 +4906,19 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
|
|||
/* Don't fill PLT entry for static executables. */
|
||||
if (plt == htab->elf.splt)
|
||||
{
|
||||
bfd_vma plt0_offset = h->plt.offset + plt_plt_insn_end;
|
||||
|
||||
/* Put relocation index. */
|
||||
bfd_put_32 (output_bfd, plt_index,
|
||||
plt->contents + h->plt.offset + abed->plt_reloc_offset);
|
||||
/* Put offset for jmp .PLT0. */
|
||||
bfd_put_32 (output_bfd, - (h->plt.offset + plt_plt_insn_end),
|
||||
|
||||
/* Put offset for jmp .PLT0 and check for overflow. We don't
|
||||
check relocation index for overflow since branch displacement
|
||||
will overflow first. */
|
||||
if (plt0_offset > 0x80000000)
|
||||
info->callbacks->einfo (_("%F%B: branch displacement overflow in PLT entry for `%s'\n"),
|
||||
output_bfd, h->root.root.string);
|
||||
bfd_put_32 (output_bfd, - plt0_offset,
|
||||
plt->contents + h->plt.offset + plt_plt_offset);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue