Check PC-relative offset overflow in PLT entry

PR gold/17619
	* x86_64.cc (Output_data_plt_x86_64_standard<size>::do_fill_plt_entry):
	Check PC-relative offset overflow in PLT entry.
This commit is contained in:
H.J. Lu 2014-11-18 11:34:11 -08:00
parent b2a919a82b
commit 9d58518888
2 changed files with 14 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2014-11-21 H.J. Lu <hongjiu.lu@intel.com>
PR gold/17619
* x86_64.cc (Output_data_plt_x86_64_standard<size>::do_fill_plt_entry):
Check PC-relative offset overflow in PLT entry.
2014-11-21 Alan Modra <amodra@gmail.com>
* powerpc.cc (Target_powerpc::Relocate::relocate): Correct test

View file

@ -1516,11 +1516,16 @@ Output_data_plt_x86_64_standard<size>::do_fill_plt_entry(
unsigned int plt_offset,
unsigned int plt_index)
{
// Check PC-relative offset overflow in PLT entry.
uint64_t plt_got_pcrel_offset = (got_address + got_offset
- (plt_address + plt_offset + 6));
if (Bits<32>::has_overflow(plt_got_pcrel_offset))
gold_error(_("PC-relative offset overflow in PLT entry %d"),
plt_index + 1);
memcpy(pov, plt_entry, plt_entry_size);
elfcpp::Swap_unaligned<32, false>::writeval(pov + 2,
(got_address + got_offset
- (plt_address + plt_offset
+ 6)));
plt_got_pcrel_offset);
elfcpp::Swap_unaligned<32, false>::writeval(pov + 7, plt_index);
elfcpp::Swap<32, false>::writeval(pov + 12,