2010-09-09 Rafael Espindola <espindola@google.com>
authorRafael Ávila de Espíndola <respindola@mozilla.com>
Thu, 9 Sep 2010 15:29:01 +0000 (15:29 +0000)
committerRafael Ávila de Espíndola <respindola@mozilla.com>
Thu, 9 Sep 2010 15:29:01 +0000 (15:29 +0000)
* layout.cc (Layout::attach_allocated_section_to_segment): Don't put
sections with different PF_X flags in the same segment.
(Layout::find_first_load_seg): Search all segments to find the first
one.
* options.h (rosegment): New.

gold/ChangeLog
gold/layout.cc
gold/options.h

index 0ed1a2ff918acd3f2dc4e22cc8ec4377d8e6066e..11a5c74093e1aa21bf1b6cd7773d9f15328f9448 100644 (file)
@@ -1,4 +1,12 @@
-2010-09-03  Rafael Espindola  <espindola@google.com>
+2010-09-09  Rafael Espindola  <espindola@google.com>
+
+       * layout.cc (Layout::attach_allocated_section_to_segment): Don't put
+       sections with different PF_X flags in the same segment.
+       (Layout::find_first_load_seg): Search all segments to find the first
+       one.
+       * options.h (rosegment): New.
+
+2010-09-08  Rafael Espindola  <espindola@google.com>
 
       * layout.cc (Layout::set_segment_offsets): Always advance to a new page.
 
index f0a431e75a2c62700f0b9cc4d8722ab88e8209db..b5490d665c06a9a697be18dd22529ce7392da158 100644 (file)
@@ -1171,10 +1171,11 @@ Layout::attach_allocated_section_to_segment(Output_section* os)
   bool is_address_set = parameters->options().section_start(os->name(), &addr);
 
   // In general the only thing we really care about for PT_LOAD
-  // segments is whether or not they are writable, so that is how we
-  // search for them.  Large data sections also go into their own
-  // PT_LOAD segment.  People who need segments sorted on some other
-  // basis will have to use a linker script.
+  // segments is whether or not they are writable or executable,
+  // so that is how we search for them.
+  // Large data sections also go into their own PT_LOAD segment.
+  // People who need segments sorted on some other basis will
+  // have to use a linker script.
 
   Segment_list::const_iterator p;
   for (p = this->segment_list_.begin();
@@ -1186,6 +1187,9 @@ Layout::attach_allocated_section_to_segment(Output_section* os)
       if (!parameters->options().omagic()
          && ((*p)->flags() & elfcpp::PF_W) != (seg_flags & elfcpp::PF_W))
        continue;
+      if (parameters->options().rosegment()
+          && ((*p)->flags() & elfcpp::PF_X) != (seg_flags & elfcpp::PF_X))
+        continue;
       // If -Tbss was specified, we need to separate the data and BSS
       // segments.
       if (parameters->options().user_set_Tbss())
@@ -1454,6 +1458,7 @@ Layout::define_group_signatures(Symbol_table* symtab)
 Output_segment*
 Layout::find_first_load_seg()
 {
+  Output_segment* best = NULL;
   for (Segment_list::const_iterator p = this->segment_list_.begin();
        p != this->segment_list_.end();
        ++p)
@@ -1462,8 +1467,13 @@ Layout::find_first_load_seg()
          && ((*p)->flags() & elfcpp::PF_R) != 0
          && (parameters->options().omagic()
              || ((*p)->flags() & elfcpp::PF_W) == 0))
-       return *p;
+        {
+          if (best == NULL || this->segment_precedes(*p, best))
+            best = *p;
+        }
     }
+  if (best != NULL)
+    return best;
 
   gold_assert(!this->script_options_->saw_phdrs_clause());
 
index c5e24cc1bd5629451bf1950c7148bb3549c2ffb5..c990961465bc39c88589958736b2f3f122e02942 100644 (file)
@@ -808,6 +808,10 @@ class General_options
               N_(" Only search directories specified on the command line."),
               NULL);
 
+  DEFINE_bool(rosegment, options::TWO_DASHES, '\0', false,
+              N_(" Put read-only non-executable sections in their own segment"),
+              NULL);
+
   DEFINE_string(m, options::EXACTLY_ONE_DASH, 'm', "",
                 N_("Ignored for compatibility"), N_("EMULATION"));