From 218c58318263699665bec9167d162612c81e9995 Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Wed, 3 Feb 2010 19:32:28 +0000 Subject: 2010-02-03 Doug Kwan * arm.cc (Target_arm::relocate_section): Do view adjustment for all types of relaxed input section. --- gold/ChangeLog | 5 +++++ gold/arm.cc | 35 ++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 17 deletions(-) (limited to 'gold') 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 + * arm.cc (Target_arm::relocate_section): Do view adjustment for all + types of relaxed input section. + +2010-02-02 Doug Kwan + * 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::relocate_section( typedef typename Target_arm::Relocate Arm_relocate; gold_assert(sh_type == elfcpp::SHT_REL); - Arm_input_section* 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, -- cgit v1.1