diff options
-rw-r--r-- | gold/ChangeLog | 10 | ||||
-rw-r--r-- | gold/arm-reloc-property.cc | 4 | ||||
-rw-r--r-- | gold/arm-reloc-property.h | 7 | ||||
-rw-r--r-- | gold/arm.cc | 7 |
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: |