diff --git a/gold/ChangeLog b/gold/ChangeLog index e11419847fc..d824511082d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2016-02-06 Cary Coutant + + * x86_64.cc (X86_64_relocate_functions::pcrela32_check): Fix x32 + overflow checking when symbol value + addend < 0. + 2016-02-06 Cary Coutant PR gold/19577 diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 494b312d516..b0780af1001 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -3385,8 +3385,17 @@ class X86_64_relocate_functions : public Relocate_functions { typedef typename elfcpp::Swap<32, false>::Valtype Valtype; Valtype* wv = reinterpret_cast(view); - typename elfcpp::Elf_types<64>::Elf_Addr value = - psymval->value(object, addend) - address; + typename elfcpp::Elf_types<64>::Elf_Addr value; + if (addend >= 0) + value = psymval->value(object, addend); + else + { + // For negative addends, get the symbol value without + // the addend, then add the addend using 64-bit arithmetic. + value = psymval->value(object, 0); + value += addend; + } + value -= address; elfcpp::Swap<32, false>::writeval(wv, value); return (Bits<32>::has_overflow(value) ? Base::RELOC_OVERFLOW : Base::RELOC_OK);