From 911a5072375a58fb7fd1394dc913a9b315db22a6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 18 Jun 2011 22:29:14 +0000 Subject: [PATCH] PR gold/12745 * layout.cc (Layout::layout_eh_frame): Correct handling of writable .eh_frame section. --- gold/ChangeLog | 6 ++++++ gold/layout.cc | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 4a072a80396..e4c6287593f 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2011-06-18 Ian Lance Taylor + + PR gold/12745 + * layout.cc (Layout::layout_eh_frame): Correct handling of + writable .eh_frame section. + 2011-06-17 Ian Lance Taylor PR gold/12893 diff --git a/gold/layout.cc b/gold/layout.cc index 114fa262bb8..a3e60d52d18 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -1140,6 +1140,8 @@ Layout::layout_eh_frame(Sized_relobj_file* object, gold_assert(this->eh_frame_section_ == os); + elfcpp::Elf_Xword orig_flags = os->flags(); + if (!parameters->incremental() && this->eh_frame_data_->add_ehframe_input_section(object, symbols, @@ -1153,8 +1155,12 @@ Layout::layout_eh_frame(Sized_relobj_file* object, os->update_flags_for_input_section(shdr.get_sh_flags()); // A writable .eh_frame section is a RELRO section. - if ((shdr.get_sh_flags() & elfcpp::SHF_WRITE) != 0) - os->set_is_relro(); + if ((orig_flags & (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR)) + != (os->flags() & (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR))) + { + os->set_is_relro(); + os->set_order(ORDER_RELRO); + } // We found a .eh_frame section we are going to optimize, so now // we can add the set of optimized sections to the output @@ -1176,6 +1182,10 @@ Layout::layout_eh_frame(Sized_relobj_file* object, *off = os->add_input_section(this, object, shndx, name, shdr, reloc_shndx, saw_sections_clause); this->have_added_input_section_ = true; + + if ((orig_flags & (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR)) + != (os->flags() & (elfcpp::SHF_WRITE | elfcpp::SHF_EXECINSTR))) + os->set_order(this->default_section_order(os, false)); } return os; -- 2.30.2