diff options
author | Doug Kwan <dougkwan@google.com> | 2010-02-02 00:25:57 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-02-02 00:25:57 +0000 |
commit | 546c74577f9ddfeb870b518f3c1d32e71bed52be (patch) | |
tree | aac5de7101f45e40c8767415959513580ec9855c /gold/arm.cc | |
parent | 54c4e2c2dcf7dba4c248b474cf1b3ba3ba8a37d7 (diff) | |
download | gdb-546c74577f9ddfeb870b518f3c1d32e71bed52be.zip gdb-546c74577f9ddfeb870b518f3c1d32e71bed52be.tar.gz gdb-546c74577f9ddfeb870b518f3c1d32e71bed52be.tar.bz2 |
2010-02-01 Doug Kwan <dougkwan@google.com>
* arm.cc (Arm_exidx_fixup::Arm_exidx_fixup): Initialize
first_output_text_section_.
(Arm_exidx_fixup::first_output_text_section): New method definition.
(Arm_exidx_fixup::first_output_text_section_): New data member.
(Arm_exidx_fixup::process_exidx_section): Record the first text
output section seen.
(Arm_output_section::fix_exidx_coverage): Set correct linked section
and entsize in output section header.
Diffstat (limited to 'gold/arm.cc')
-rw-r--r-- | gold/arm.cc | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/gold/arm.cc b/gold/arm.cc index 90deaa6..89a4149 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -1210,7 +1210,7 @@ class Arm_exidx_fixup Arm_exidx_fixup(Output_section* exidx_output_section) : exidx_output_section_(exidx_output_section), last_unwind_type_(UT_NONE), last_inlined_entry_(0), last_input_section_(NULL), - section_offset_map_(NULL) + section_offset_map_(NULL), first_output_text_section_(NULL) { } ~Arm_exidx_fixup() @@ -1231,6 +1231,12 @@ class Arm_exidx_fixup void add_exidx_cantunwind_as_needed(); + // Return the output section for the text section which is linked to the + // first exidx input in output. + Output_section* + first_output_text_section() const + { return this->first_output_text_section_; } + private: // Copying is not allowed. Arm_exidx_fixup(const Arm_exidx_fixup&); @@ -1273,6 +1279,9 @@ class Arm_exidx_fixup const Arm_exidx_input_section* last_input_section_; // Section offset map created in process_exidx_section. Arm_exidx_section_offset_map* section_offset_map_; + // Output section for the text section which is linked to the first exidx + // input in output. + Output_section* first_output_text_section_; }; // Arm output section class. This is defined mainly to add a number of @@ -5159,6 +5168,17 @@ Arm_exidx_fixup::process_exidx_section( this->section_offset_map_ = NULL; this->last_input_section_ = exidx_input_section; + // Set the first output text section so that we can link the EXIDX output + // section to it. Ignore any EXIDX input section that is completely merged. + if (this->first_output_text_section_ == NULL + && deleted_bytes != section_size) + { + unsigned int link = exidx_input_section->link(); + Output_section* os = relobj->output_section(link); + gold_assert(os != NULL); + this->first_output_text_section_ = os; + } + return deleted_bytes; } @@ -5547,6 +5567,11 @@ Arm_output_section<big_endian>::fix_exidx_coverage( } } + // Link exidx output section to the first seen output section and + // set correct entry size. + this->set_link_section(exidx_fixup.first_output_text_section()); + this->set_entsize(8); + // Make changes permanent. this->save_states(); this->set_section_offsets_need_adjustment(); |