On Jul 9, 2009, at 11:11 PM, Alan Modra wrote:
Hmm, having said all that, the following linker patch seems reasonable to me and probably won't break anything else (always some risk). Please test it for me. Index: ld/ldlang.c =================================================================== RCS file: /cvs/src/src/ld/ldlang.c,v retrieving revision 1.311 diff -u -p -r1.311 ldlang.c --- ld/ldlang.c 25 Jun 2009 13:18:46 -0000 1.311 +++ ld/ldlang.c 10 Jul 2009 04:04:57 -0000 @@ -1615,10 +1615,12 @@ output_prev_sec_find (lang_output_sectio 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_sta 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: --
This patch seems to "fix" things. - k _______________________________________________ bug-binutils mailing list [email protected] http://lists.gnu.org/mailman/listinfo/bug-binutils
