From 5b7b7d6e05dc23db02e401ec9fdf6d38cacafc41 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 6 May 2011 14:57:58 +0000 Subject: [PATCH] * layout.cc (Layout::layout): If the output section flags change, update the ordering. --- gold/ChangeLog | 5 +++++ gold/layout.cc | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/gold/ChangeLog b/gold/ChangeLog index 94c19bc582f..f198b806cd9 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2011-05-06 Ian Lance Taylor + + * layout.cc (Layout::layout): If the output section flags change, + update the ordering. + 2011-04-25 Cary Coutant * incremental-dump.cc (dump_incremental_inputs): Print local diff --git a/gold/layout.cc b/gold/layout.cc index e3972040b6c..66d30d9ee80 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -944,8 +944,21 @@ Layout::layout(Sized_relobj* object, unsigned int shndx, // FIXME: Handle SHF_LINK_ORDER somewhere. + elfcpp::Elf_Xword orig_flags = os->flags(); + *off = os->add_input_section(this, object, shndx, name, shdr, reloc_shndx, this->script_options_->saw_sections_clause()); + + // If the flags changed, we may have to change the order. + if ((orig_flags & elfcpp::SHF_ALLOC) != 0) + { + orig_flags &= (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR); + elfcpp::Elf_Xword new_flags = + os->flags() & (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR); + if (orig_flags != new_flags) + os->set_order(this->default_section_order(os, false)); + } + this->have_added_input_section_ = true; return os; -- 2.30.2