From 218c58318263699665bec9167d162612c81e9995 Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Wed, 3 Feb 2010 19:32:28 +0000 Subject: [PATCH] 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(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 94dfe4be4b..59c1ba1cb6 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +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. diff --git a/gold/arm.cc b/gold/arm.cc index b421a7fed7..9c1c72e7a7 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,