Improve relocation overflow errors on MIPS.

gold/
        * mips.cc (Mips_relocate_functions::rel26): Don't print relocation
        overflow error message.
        (Target_mips::relocate_special_relocatable): Improve relocation
        overflow error message.
        (Target_mips::Relocate::relocate): Likewise.
This commit is contained in:
Vladimir Radosavljevic 2017-03-15 15:43:25 -07:00 committed by Cary Coutant
parent 453018bf44
commit c3847462f8
2 changed files with 29 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2017-03-15 Vladimir Radosavljevic <Vladimir.Radosavljevic@imgtec.com>
* mips.cc (Mips_relocate_functions::rel26): Don't print relocation
overflow error message.
(Target_mips::relocate_special_relocatable): Improve relocation
overflow error message.
(Target_mips::Relocate::relocate): Likewise.
2017-03-15 Vladimir Radosavljevic <Vladimir.Radosavljevic@imgtec.com>
* mips.cc (symbol_refs_local): Return false if a symbol

View File

@ -4591,15 +4591,9 @@ class Mips_relocate_functions : public Relocate_functions<size, big_endian>
}
x = psymval->value(object, x) >> shift;
if (!calculate_only && !local && !gsym->is_weak_undefined())
{
if ((x >> 26) != ((address + 4) >> (26 + shift)))
{
gold_error(_("relocation truncated to fit: %u against '%s'"),
r_type, gsym->name());
return This::STATUS_OVERFLOW;
}
}
if (!calculate_only && !local && !gsym->is_weak_undefined()
&& ((x >> 26) != ((address + 4) >> (26 + shift))))
return This::STATUS_OVERFLOW;
val = Bits<32>::bit_select32(val, x, 0x03ffffff);
@ -10307,7 +10301,9 @@ Target_mips<size, big_endian>::relocate_special_relocatable(
break;
case Reloc_funcs::STATUS_OVERFLOW:
gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
_("relocation overflow"));
_("relocation overflow: "
"%u against local symbol %u in %s"),
r_type, r_sym, object->name().c_str());
break;
case Reloc_funcs::STATUS_BAD_RELOC:
gold_error_at_location(relinfo, relnum, reloc.get_r_offset(),
@ -12188,8 +12184,21 @@ Target_mips<size, big_endian>::Relocate::relocate(
case Reloc_funcs::STATUS_OKAY:
break;
case Reloc_funcs::STATUS_OVERFLOW:
gold_error_at_location(relinfo, relnum, r_offset,
_("relocation overflow"));
if (gsym == NULL)
gold_error_at_location(relinfo, relnum, r_offset,
_("relocation overflow: "
"%u against local symbol %u in %s"),
r_type, r_sym, object->name().c_str());
else if (gsym->is_defined() && gsym->source() == Symbol::FROM_OBJECT)
gold_error_at_location(relinfo, relnum, r_offset,
_("relocation overflow: "
"%u against '%s' defined in %s"),
r_type, gsym->demangled_name().c_str(),
gsym->object()->name().c_str());
else
gold_error_at_location(relinfo, relnum, r_offset,
_("relocation overflow: %u against '%s'"),
r_type, gsym->demangled_name().c_str());
break;
case Reloc_funcs::STATUS_BAD_RELOC:
gold_error_at_location(relinfo, relnum, r_offset,