aboutsummaryrefslogtreecommitdiff
path: root/gold/layout.cc
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2010-01-23 01:07:59 +0000
committerDoug Kwan <dougkwan@google.com>2010-01-23 01:07:59 +0000
commit8923b24c4bde41e6a15026aa1d20493fd383066c (patch)
treedfe04658736dd194c41401949bafb2afdf47dafb /gold/layout.cc
parent767acc28c194ace624485f0a907e07d1e95d4ce1 (diff)
downloadgdb-8923b24c4bde41e6a15026aa1d20493fd383066c.zip
gdb-8923b24c4bde41e6a15026aa1d20493fd383066c.tar.gz
gdb-8923b24c4bde41e6a15026aa1d20493fd383066c.tar.bz2
2010-01-22 Doug Kwan <dougkwan@google.com>
* arm.cc (Target_arm::do_relax): Record an output section for section offset adjustment it contains any stub table that has changed. * layout.cc (Layout::clean_up_after_relaxation): Adjust section offsets in an output section if necessary. * output.cc (Output_section::Output_section): Initialize section_offsets_need_adjustments_. (Output_section::add_input_section_for_script): Renamed to Output_section::add_simple_input_section. (Output_section::save_states): Add a comment. (Output_section::discard_states): New method defintion. (Output_section::adjust_section_offsets): Same. * output.h (Output_section::add_input_section_for_script): Renamed to Output_section::add_simple_input_section. (Output_section::discard_states): New method declaration. (Output_section::adjust_section_offsets): Same. (Output_section::section_offsets_need_adjustment, Output_section::set_section_offsets_need_adjustment): New method definitions. (Output_section::section_offsets_need_adjustment_): New data member. * script-sections.cc (Output_section_element_input::set_section_address): Adjust code for renaming of Output_section::add_input_section_for_script. (Orphan_output_section::set_section_address): Same.
Diffstat (limited to 'gold/layout.cc')
-rw-r--r--gold/layout.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index dc339d6..52989a5 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -1401,8 +1401,15 @@ Layout::clean_up_after_relaxation()
p != this->section_list_.end();
++p)
{
- (*p)->reset_address_and_file_offset();
(*p)->restore_states();
+
+ // If an input section changes size because of relaxation,
+ // we need to adjust the section offsets of all input sections.
+ // after such a section.
+ if ((*p)->section_offsets_need_adjustment())
+ (*p)->adjust_section_offsets();
+
+ (*p)->reset_address_and_file_offset();
}
// Reset special output object address and file offsets.