bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: binutils 2.19 issue with kernel link


From: Kumar Gala
Subject: Re: binutils 2.19 issue with kernel link
Date: Fri, 10 Jul 2009 10:34:35 -0500


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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]