* ldlang.c (insert_os_after): Don't tie assignments to non-alloc
authorAlan Modra <amodra@gmail.com>
Sat, 11 Jul 2009 00:10:29 +0000 (00:10 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 11 Jul 2009 00:10:29 +0000 (00:10 +0000)
output sections.

ld/ChangeLog
ld/ldlang.c

index 8ffee592315dd296f72dcc9c7eac98c04d38c8bd..5d877ec236ccbfd15d4b90f8459598e338bfa628 100644 (file)
@@ -1,3 +1,8 @@
+2009-07-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (insert_os_after): Don't tie assignments to non-alloc
+       output sections.
+
 2009-07-10  Alan Modra  <amodra@bigpond.net.au>
 
        * emultempl/ppc32elf.em (ppc_before_allocation): Turn on
index dda2f22a201c81f4a4b3290b263a8d6f86406560..c10bbeac467871905ddcfdf760bcb7cc40652947 100644 (file)
@@ -1615,10 +1615,12 @@ output_prev_sec_find (lang_output_section_statement_type *os)
    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.  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.  */
+   are assumed to belong to it, except in two cases;  The first
+   assignment to dot, and assignments before non-alloc sections.
+   Otherwise we might put an orphan before . = . + SIZEOF_HEADERS or
+   similar assignments that set the initial address, or we might
+   insert non-alloc note sections among assignments setting end of
+   image symbols.  */
 
 static lang_statement_union_type **
 insert_os_after (lang_output_section_statement_type *after)
@@ -1662,7 +1664,12 @@ insert_os_after (lang_output_section_statement_type *after)
          continue;
        case lang_output_section_statement_enum:
          if (assign != NULL)
-           where = assign;
+           {
+             asection *s = (*where)->output_section_statement.bfd_section;
+
+             if (s == NULL || (s->flags & SEC_ALLOC) != 0)
+               where = assign;
+           }
          break;
        case lang_input_statement_enum:
        case lang_address_statement_enum: