PR gold/12745
authorIan Lance Taylor <ian@airs.com>
Sat, 18 Jun 2011 22:29:14 +0000 (22:29 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 18 Jun 2011 22:29:14 +0000 (22:29 +0000)
* layout.cc (Layout::layout_eh_frame): Correct handling of
writable .eh_frame section.

gold/ChangeLog
gold/layout.cc

index 4a072a8..e4c6287 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-18  Ian Lance Taylor  <iant@google.com>
+
+       PR gold/12745
+       * layout.cc (Layout::layout_eh_frame): Correct handling of
+       writable .eh_frame section.
+
 2011-06-17  Ian Lance Taylor  <iant@google.com>
 
        PR gold/12893
index 114fa26..a3e60d5 100644 (file)
@@ -1140,6 +1140,8 @@ Layout::layout_eh_frame(Sized_relobj_file<size, big_endian>* 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<size, big_endian>* 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<size, big_endian>* 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;