2010-06-29 Doug Kwan <dougkwan@google.com>

* arm-reloc-property.cc (Arm_reloc_property::Arm_reloc_property):
	Initialize USE_SYMBOL_.
	* arm-reloc-property.h (Arm_reloc_property::uses_symbol): New method
	definition.
	(Arm_reloc_property::uses_symbol_): New data member declaration.
	* arm.cc (Target_arm::Relocate::relocate): Exit early if relocation
	uses symbol value and symbol is undefined but not weakly undefined.
This commit is contained in:
Doug Kwan 2010-06-30 06:41:09 +00:00
parent 3863f96c20
commit b2286c10fe
4 changed files with 27 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2010-06-29 Doug Kwan <dougkwan@google.com>
* arm-reloc-property.cc (Arm_reloc_property::Arm_reloc_property):
Initialize USE_SYMBOL_.
* arm-reloc-property.h (Arm_reloc_property::uses_symbol): New method
definition.
(Arm_reloc_property::uses_symbol_): New data member declaration.
* arm.cc (Target_arm::Relocate::relocate): Exit early if relocation
uses symbol value and symbol is undefined but not weakly undefined.
2010-06-28 Rafael Espindola <espindola@google.com>
* plugin.cc (Plugin::load): Use dlerror.

View File

@ -104,7 +104,8 @@ Arm_reloc_property::Arm_reloc_property(
relative_address_base_(RAB_NONE), is_deprecated_(is_deprecated),
is_implemented_(is_implemented), checks_overflow_(checks_overflow),
uses_got_entry_(false), uses_got_origin_(false), uses_plt_entry_(false),
uses_thumb_bit_(false), uses_symbol_base_(false), uses_addend_(false)
uses_thumb_bit_(false), uses_symbol_base_(false), uses_addend_(false),
uses_symbol_(false)
{
// Set size and alignment of static and dynamic relocations.
if (rtype == RT_STATIC)
@ -246,6 +247,7 @@ Arm_reloc_property::Arm_reloc_property(
}
gold_assert(node->is_leaf() && node->name() == "S");
this->uses_symbol_ = true;
delete root_node;
}

View File

@ -132,6 +132,11 @@ class Arm_reloc_property
uses_symbol_base() const
{ return this->uses_symbol_base_; }
// Whether relocation uses the symbol.
bool
uses_symbol() const
{ return this->uses_symbol_; }
// Return the type of relative address base or RAB_NONE if this
// is not a relative addressing relocation.
Relative_address_base
@ -273,6 +278,8 @@ class Arm_reloc_property
bool uses_symbol_base_ : 1;
// Whether this uses an addend.
bool uses_addend_ : 1;
// Whether this uses the symbol.
bool uses_symbol_ : 1;
};
// Arm_reloc_property_table. This table is used for looking up propeties

View File

@ -8410,6 +8410,13 @@ Target_arm<big_endian>::Relocate::relocate(
// be converted into an NOP.
is_weakly_undefined_without_plt = true;
}
else if (gsym->is_undefined() && reloc_property->uses_symbol())
{
// This relocation uses the symbol value but the symbol is
// undefined. Exit early and have the caller reporting an
// error.
return true;
}
else
{
// Set thumb bit if symbol: