Section sizing + orphan placement bugs

Alan Modra amodra@bigpond.net.au
Thu Nov 24 00:57:00 GMT 2005


On Thu, Nov 24, 2005 at 11:09:57AM +1030, Alan Modra wrote:
> On Wed, Nov 23, 2005 at 11:36:54AM -0500, Daniel Jacobowitz wrote:
> > I think the attached fix is right for that part of the bug but I'm open to
> > suggestions on how to handle SIZEOF_HEADERS.
> 
> I'll fix that bit.

Like this.

	* ldlang.c (lang_insert_orphan): Skip first assignment to dot
	in script when looking for place to insert orphan statements.

Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.208
diff -u -p -r1.208 ldlang.c
--- ld/ldlang.c	18 Nov 2005 04:12:27 -0000	1.208
+++ ld/ldlang.c	24 Nov 2005 00:54:47 -0000
@@ -1467,13 +1467,20 @@ lang_insert_orphan (asection *s,
 	    {
 	      lang_statement_union_type **where;
 	      lang_statement_union_type **assign = NULL;
+	      bfd_boolean ignore_first;
 
 	      /* Look for a suitable place for the new statement list.
 		 The idea is to skip over anything that might be inside
 		 a SECTIONS {} statement in a script, before we find
 		 another output_section_statement.  Assignments to "dot"
 		 before an output section statement are assumed to
-		 belong to it.  */
+		 belong to it.  An exception to this rule is made for
+		 the first assignment to dot, otherwise we might put an
+		 orphan before . = . + SIZEOF_HEADERS or similar
+		 assignments that set the initial address.  */
+
+	      ignore_first = after == (&lang_output_section_statement.head
+				       ->output_section_statement);
 	      for (where = &after->header.next;
 		   *where != NULL;
 		   where = &(*where)->header.next)
@@ -1487,9 +1494,11 @@ lang_insert_orphan (asection *s,
 			  ass = &(*where)->assignment_statement;
 			  if (ass->exp->type.node_class != etree_assert
 			      && ass->exp->assign.dst[0] == '.'
-			      && ass->exp->assign.dst[1] == 0)
+			      && ass->exp->assign.dst[1] == 0
+			      && !ignore_first)
 			    assign = where;
 			}
+		      ignore_first = FALSE;
 		      continue;
 		    case lang_wild_statement_enum:
 		    case lang_input_section_enum:

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre



More information about the Binutils mailing list