aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog5
-rw-r--r--gold/arm.cc35
2 files changed, 23 insertions, 17 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 94dfe4b..59c1ba1 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,10 @@
2010-02-02 Doug Kwan <dougkwan@google.com>
+ * arm.cc (Target_arm::relocate_section): Do view adjustment for all
+ types of relaxed input section.
+
+2010-02-02 Doug Kwan <dougkwan@google.com>
+
* Makefile.am (HFILES): Add arm-reloc-property.h.
(DEFFILES): New.
(TARGETSOURCES): Add arm-reloc-property.cc
diff --git a/gold/arm.cc b/gold/arm.cc
index b421a7f..9c1c72e 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -7916,26 +7916,27 @@ Target_arm<big_endian>::relocate_section(
typedef typename Target_arm<big_endian>::Relocate Arm_relocate;
gold_assert(sh_type == elfcpp::SHT_REL);
- Arm_input_section<big_endian>* arm_input_section =
- this->find_arm_input_section(relinfo->object, relinfo->data_shndx);
-
- // This is an ARM input section and the view covers the whole output
- // section.
- if (arm_input_section != NULL)
+ // See if we are relocating a relaxed input section. If so, the view
+ // covers the whole output section and we need to adjust accordingly.
+ if (needs_special_offset_handling)
{
- gold_assert(needs_special_offset_handling);
- Arm_address section_address = arm_input_section->address();
- section_size_type section_size = arm_input_section->data_size();
+ const Output_relaxed_input_section* poris =
+ output_section->find_relaxed_input_section(relinfo->object,
+ relinfo->data_shndx);
+ if (poris != NULL)
+ {
+ Arm_address section_address = poris->address();
+ section_size_type section_size = poris->data_size();
- gold_assert((arm_input_section->address() >= address)
- && ((arm_input_section->address()
- + arm_input_section->data_size())
- <= (address + view_size)));
+ gold_assert((section_address >= address)
+ && ((section_address + section_size)
+ <= (address + view_size)));
- off_t offset = section_address - address;
- view += offset;
- address += offset;
- view_size = section_size;
+ off_t offset = section_address - address;
+ view += offset;
+ address += offset;
+ view_size = section_size;
+ }
}
gold::relocate_section<32, big_endian, Target_arm, elfcpp::SHT_REL,