+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.
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)
}
gold_assert(node->is_leaf() && node->name() == "S");
+ this->uses_symbol_ = true;
delete root_node;
}
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
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
// 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: