This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: Implement -n and -N


I committed this patch to implement -n and -N for gold.  This is
pretty straightforward.

Ian


2008-07-22  Ian Lance Taylor  <iant@google.com>

	* options.h (class General_options): Define -n/--nmagic and
	-N/--omagic.
	* options.cc (General_options::finalize): For -n/--nmagic or
	-N/--omagic, set -static.
	* layout.cc (Layout::attach_allocated_section_to_segment): If
	-N/--omagic, don't put read-only and read-write sections in
	different segments.
	(Layout::find_first_load_seg): If -N/--omagic, don't insist on
	finding a read-only segment.
	(Layout::set_segment_offsets): If -N/--omagic or -n/--nmagic,
	don't set the minimum segment alignment to the common page size,
	and don't set the file offset to the address modulo the page size.
	* script-sections.cc (Script_sections::create_segments): If
	-n/--omagic, don't put read-only and read-write sections in
	different segments.


Index: layout.cc
===================================================================
RCS file: /cvs/src/src/gold/layout.cc,v
retrieving revision 1.108
diff -p -u -r1.108 layout.cc
--- layout.cc	10 Jul 2008 23:01:19 -0000	1.108
+++ layout.cc	22 Jul 2008 22:57:22 -0000
@@ -865,7 +865,8 @@ Layout::attach_allocated_section_to_segm
        ++p)
     {
       if ((*p)->type() == elfcpp::PT_LOAD
-          && ((*p)->flags() & elfcpp::PF_W) == (seg_flags & elfcpp::PF_W))
+	  && (parameters->options().omagic()
+	      || ((*p)->flags() & elfcpp::PF_W) == (seg_flags & elfcpp::PF_W)))
         {
           // If -Tbss was specified, we need to separate the data
           // and BSS segments.
@@ -1108,7 +1109,8 @@ Layout::find_first_load_seg()
     {
       if ((*p)->type() == elfcpp::PT_LOAD
 	  && ((*p)->flags() & elfcpp::PF_R) != 0
-	  && ((*p)->flags() & elfcpp::PF_W) == 0)
+	  && (parameters->options().omagic()
+	      || ((*p)->flags() & elfcpp::PF_W) == 0))
 	return *p;
     }
 
@@ -1769,20 +1771,26 @@ Layout::set_segment_offsets(const Target
 
 	  uint64_t aligned_addr = 0;
 	  uint64_t abi_pagesize = target->abi_pagesize();
+	  uint64_t common_pagesize = target->common_pagesize();
 
-	  // FIXME: This should depend on the -n and -N options.
-	  (*p)->set_minimum_p_align(target->common_pagesize());
+	  if (!parameters->options().nmagic()
+	      && !parameters->options().omagic())
+	    (*p)->set_minimum_p_align(common_pagesize);
 
 	  if (are_addresses_set)
 	    {
-	      // Adjust the file offset to the same address modulo the
-	      // page size.
-	      uint64_t unsigned_off = off;
-	      uint64_t aligned_off = ((unsigned_off & ~(abi_pagesize - 1))
-				      | (addr & (abi_pagesize - 1)));
-	      if (aligned_off < unsigned_off)
-		aligned_off += abi_pagesize;
-	      off = aligned_off;
+	      if (!parameters->options().nmagic()
+		  && !parameters->options().omagic())
+		{
+		  // Adjust the file offset to the same address modulo
+		  // the page size.
+		  uint64_t unsigned_off = off;
+		  uint64_t aligned_off = ((unsigned_off & ~(abi_pagesize - 1))
+					  | (addr & (abi_pagesize - 1)));
+		  if (aligned_off < unsigned_off)
+		    aligned_off += abi_pagesize;
+		  off = aligned_off;
+		}
 	    }
 	  else
 	    {
@@ -1817,7 +1825,6 @@ Layout::set_segment_offsets(const Target
 
 	  if (!are_addresses_set && aligned_addr != addr)
 	    {
-	      uint64_t common_pagesize = target->common_pagesize();
 	      uint64_t first_off = (common_pagesize
 				    - (aligned_addr
 				       & (common_pagesize - 1)));
Index: options.cc
===================================================================
RCS file: /cvs/src/src/gold/options.cc,v
retrieving revision 1.74
diff -p -u -r1.74 options.cc
--- options.cc	28 May 2008 20:48:16 -0000	1.74
+++ options.cc	22 Jul 2008 22:57:22 -0000
@@ -706,6 +706,10 @@ General_options::finalize()
       this->set_user_set_Map();
     }
 
+  // Using -n or -N implies -static.
+  if (this->nmagic() || this->omagic())
+    this->set_static(true);
+
   // If --thread_count is specified, it applies to
   // --thread-count-{initial,middle,final}, though it doesn't override
   // them.
Index: options.h
===================================================================
RCS file: /cvs/src/src/gold/options.h,v
retrieving revision 1.81
diff -p -u -r1.81 options.h
--- options.h	22 Jul 2008 22:08:43 -0000	1.81
+++ options.h	22 Jul 2008 22:57:22 -0000
@@ -659,6 +659,12 @@ class General_options
   DEFINE_string(Map, options::ONE_DASH, '\0', NULL, N_("Write map file"),
 		N_("MAPFILENAME"));
 
+  DEFINE_bool(nmagic, options::TWO_DASHES, 'n', false,
+	      N_("Do not page align data"), NULL);
+  DEFINE_bool(omagic, options::EXACTLY_TWO_DASHES, 'N', false,
+	      N_("Do not page align data, do not make text readonly"),
+	      N_("Page align data, make text readonly"));
+
   DEFINE_enable(new_dtags, options::EXACTLY_TWO_DASHES, '\0', false,
 		N_("Enable use of DT_RUNPATH and DT_FLAGS"),
 		N_("Disable use of DT_RUNPATH and DT_FLAGS"));
Index: script-sections.cc
===================================================================
RCS file: /cvs/src/src/gold/script-sections.cc,v
retrieving revision 1.15
diff -p -u -r1.15 script-sections.cc
--- script-sections.cc	18 Jun 2008 04:15:52 -0000	1.15
+++ script-sections.cc	22 Jul 2008 22:57:22 -0000
@@ -2657,7 +2657,8 @@ Script_sections::create_segments(Layout*
 	  need_new_segment = true;
 	}
       else if (is_current_seg_readonly
-	       && ((*p)->flags() & elfcpp::SHF_WRITE) != 0)
+	       && ((*p)->flags() & elfcpp::SHF_WRITE) != 0
+	       && !parameters->options().omagic())
 	{
 	  // Don't put a writable section in the same segment as a
 	  // non-writable section.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]