* layout.cc (Layout::layout_eh_frame): Mark a writable .eh_frame
authorIan Lance Taylor <ian@airs.com>
Mon, 10 Jan 2011 21:57:31 +0000 (21:57 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 10 Jan 2011 21:57:31 +0000 (21:57 +0000)
section as relro.
(Layout::set_segment_offsets): Reset increase_relro before calling
set_section_addresses a second time.

gold/ChangeLog
gold/layout.cc

index ef9771f2e8d5820be66f32275fa38ea2ee3f9e67..a1207cfae51f85ddbc34db5aa77a05b2f20c11ac 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-10  Ian Lance Taylor  <iant@google.com>
+
+       * layout.cc (Layout::layout_eh_frame): Mark a writable .eh_frame
+       section as relro.
+       (Layout::set_segment_offsets): Reset increase_relro before calling
+       set_section_addresses a second time.
+
 2011-01-04  Cary Coutant  <ccoutant@google.com>
 
        * script-sections.cc (Sort_output_sections::operator()): Sort TLS
index 9bf9a9f7325ff9d2d3fc714ec6508343ba58a54d..63b9e0d852f1c4d379abaf0a6d142132f4a355a6 100644 (file)
@@ -1,6 +1,6 @@
 // layout.cc -- lay out output file sections for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -912,6 +912,10 @@ Layout::layout_eh_frame(Sized_relobj<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();
+
       // We found a .eh_frame section we are going to optimize, so now
       // we can add the set of optimized sections to the output
       // section.  We need to postpone adding this until we've found a
@@ -2722,6 +2726,12 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
                  addr = align_address(addr, (*p)->maximum_alignment());
                  off = orig_off + ((addr - orig_addr) & (abi_pagesize - 1));
                  off = align_file_offset(off, addr, abi_pagesize);
+
+                 increase_relro = this->increase_relro_;
+                 if (this->script_options_->saw_sections_clause())
+                   increase_relro = 0;
+                 has_relro = false;
+
                  new_addr = (*p)->set_section_addresses(this, true, addr,
                                                         &increase_relro,
                                                         &has_relro,