aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/arm-reloc-property.cc4
-rw-r--r--gold/arm-reloc-property.h7
-rw-r--r--gold/arm.cc7
4 files changed, 27 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index c7f4a5f..188cb32 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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.
diff --git a/gold/arm-reloc-property.cc b/gold/arm-reloc-property.cc
index 4f8fa9e..007653c 100644
--- a/gold/arm-reloc-property.cc
+++ b/gold/arm-reloc-property.cc
@@ -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;
}
diff --git a/gold/arm-reloc-property.h b/gold/arm-reloc-property.h
index 349d862..e7d7f50 100644
--- a/gold/arm-reloc-property.h
+++ b/gold/arm-reloc-property.h
@@ -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
diff --git a/gold/arm.cc b/gold/arm.cc
index d19d04c..76d466b 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -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: