From 9d585188889de38c7191976051d9acdd8d57cbbf Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 18 Nov 2014 11:34:11 -0800 Subject: [PATCH] Check PC-relative offset overflow in PLT entry PR gold/17619 * x86_64.cc (Output_data_plt_x86_64_standard::do_fill_plt_entry): Check PC-relative offset overflow in PLT entry. --- gold/ChangeLog | 6 ++++++ gold/x86_64.cc | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 66c7fca..73e601d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2014-11-21 H.J. Lu + + PR gold/17619 + * x86_64.cc (Output_data_plt_x86_64_standard::do_fill_plt_entry): + Check PC-relative offset overflow in PLT entry. + 2014-11-21 Alan Modra * powerpc.cc (Target_powerpc::Relocate::relocate): Correct test diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 1fb601d..4baa2bf 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1516,11 +1516,16 @@ Output_data_plt_x86_64_standard::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, -- 2.7.4