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:
parent
3863f96c20
commit
b2286c10fe
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue