* ldlang.c (lang_insert_orphan): Skip first assignment to dot
authorAlan Modra <amodra@gmail.com>
Thu, 24 Nov 2005 00:58:28 +0000 (00:58 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 24 Nov 2005 00:58:28 +0000 (00:58 +0000)
in script when looking for place to insert orphan statements.

ld/ChangeLog
ld/ldlang.c

index 8a31f7c..977af6f 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-24  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (lang_insert_orphan): Skip first assignment to dot
+       in script when looking for place to insert orphan statements.
+
 2005-11-18  Alan Modra  <amodra@bigpond.net.au>
 
        * emulparams/elf64ppc.sh (.tocbss): Use new section alignment scheme.
@@ -15,7 +20,7 @@
        * Makefile.in: Regenerated.
        * ld.texinfo: Include configdoc.texi and ldver.texi in man pages.
        Add @file documentation.
-       
+
 2005-11-17  Alan Modra  <amodra@bigpond.net.au>
 
        * ldlang.h (lang_input_section_type): Remove "ifile" field.
index cba7179..119fb7a 100644 (file)
@@ -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: