* ldlang.c (lang_insert_orphan): Add __start_<section> symbol
authorAlan Modra <amodra@gmail.com>
Thu, 14 May 2009 02:21:45 +0000 (02:21 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 14 May 2009 02:21:45 +0000 (02:21 +0000)
assignment inside output section statement.  Ensure only one
set of symbols per output section.
* emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Add non-
dollar sections before dollar sections.  Correct add_child
list insertion.
* emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.

ld/ChangeLog
ld/emultempl/pe.em
ld/emultempl/pep.em
ld/ldlang.c

index 2f937b88766a118ab1162d6ed75c40d4ef1fdc9f..cdde909200886cb1703b73180a7dba03915c4c90 100644 (file)
@@ -1,3 +1,13 @@
+2009-05-14  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (lang_insert_orphan): Add __start_<section> symbol
+       assignment inside output section statement.  Ensure only one
+       set of symbols per output section.
+       * emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Add non-
+       dollar sections before dollar sections.  Correct add_child
+       list insertion.
+       * emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
+
 2009-05-05  Paul Brook  <paul@codesourcery.com>
 
        * emultempl/armelf.em (compare_output_sec_vma): New function.
index 2bfd5faf733e5c4aa0f37ddc059210a08db67655..30f86194c2e8914c677e3e87b83fa749278bfed8 100644 (file)
@@ -1771,6 +1771,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
   char *dollar = NULL;
   lang_output_section_statement_type *os;
   lang_statement_list_type add_child;
+  lang_statement_union_type **pl;
 
   /* Look through the script to see where to place this section.  */
   if (!link_info.relocatable
@@ -1876,47 +1877,29 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
                               &add_child);
     }
 
-  {
-    lang_statement_union_type **pl = &os->children.head;
-
-    if (dollar != NULL)
-      {
-       bfd_boolean found_dollar;
-
-       /* The section name has a '\$'.  Sort it with the other '\$'
-          sections.  */
-       found_dollar = FALSE;
-       for ( ; *pl != NULL; pl = &(*pl)->header.next)
-         {
-           lang_input_section_type *ls;
-           const char *lname;
+  /* If the section name has a '\$', sort it with the other '\$'
+     sections.  */
+  for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
+    {
+      lang_input_section_type *ls;
+      const char *lname;
 
-           if ((*pl)->header.type != lang_input_section_enum)
-             continue;
+      if ((*pl)->header.type != lang_input_section_enum)
+       continue;
 
-           ls = &(*pl)->input_section;
+      ls = &(*pl)->input_section;
 
-           lname = bfd_get_section_name (ls->section->owner, ls->section);
-           if (strchr (lname, '\$') == NULL)
-             {
-               if (found_dollar)
-                 break;
-             }
-           else
-             {
-               found_dollar = TRUE;
-               if (strcmp (orig_secname, lname) < 0)
-                 break;
-             }
-         }
-      }
+      lname = bfd_get_section_name (ls->section->owner, ls->section);
+      if (strchr (lname, '\$') != NULL
+         && (dollar == NULL || strcmp (orig_secname, lname) < 0))
+       break;
+    }
 
-    if (add_child.head != NULL)
-      {
-       add_child.head->header.next = *pl;
-       *pl = add_child.head;
-      }
-  }
+  if (add_child.head != NULL)
+    {
+      *add_child.tail = *pl;
+      *pl = add_child.head;
+    }
 
   return os;
 }
index 9c79e5acfdb33998370a3fd498876067d829b61b..f8556189cd37aa53c968ed2e33ce9df75b049b17 100644 (file)
@@ -1546,6 +1546,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
   char *dollar = NULL;
   lang_output_section_statement_type *os;
   lang_statement_list_type add_child;
+  lang_statement_union_type **pl;
 
   /* Look through the script to see where to place this section.  */
   if (!link_info.relocatable
@@ -1651,47 +1652,29 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
                               &add_child);
     }
 
-  {
-    lang_statement_union_type **pl = &os->children.head;
-
-    if (dollar != NULL)
-      {
-       bfd_boolean found_dollar;
-
-       /* The section name has a '\$'.  Sort it with the other '\$'
-          sections.  */
-       found_dollar = FALSE;
-       for ( ; *pl != NULL; pl = &(*pl)->header.next)
-         {
-           lang_input_section_type *ls;
-           const char *lname;
+  /* If the section name has a '\$', sort it with the other '\$'
+     sections.  */
+  for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
+    {
+      lang_input_section_type *ls;
+      const char *lname;
 
-           if ((*pl)->header.type != lang_input_section_enum)
-             continue;
+      if ((*pl)->header.type != lang_input_section_enum)
+       continue;
 
-           ls = &(*pl)->input_section;
+      ls = &(*pl)->input_section;
 
-           lname = bfd_get_section_name (ls->section->owner, ls->section);
-           if (strchr (lname, '\$') == NULL)
-             {
-               if (found_dollar)
-                 break;
-             }
-           else
-             {
-               found_dollar = TRUE;
-               if (strcmp (orig_secname, lname) < 0)
-                 break;
-             }
-         }
-      }
+      lname = bfd_get_section_name (ls->section->owner, ls->section);
+      if (strchr (lname, '\$') != NULL
+         && (dollar == NULL || strcmp (orig_secname, lname) < 0))
+       break;
+    }
 
-    if (add_child.head != NULL)
-      {
-       add_child.head->header.next = *pl;
-       *pl = add_child.head;
-      }
-  }
+  if (add_child.head != NULL)
+    {
+      *add_child.tail = *pl;
+      *pl = add_child.head;
+    }
 
   return os;
 }
index 230994a90e5105e0acc4dcacc505b9f50c316b44..65e092bb1928b672284fbf34f7634fbbd2a7ad93 100644 (file)
@@ -1668,8 +1668,16 @@ lang_insert_orphan (asection *s,
       push_stat_ptr (&add);
     }
 
+  if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
+    address = exp_intop (0);
+
+  os_tail = ((lang_output_section_statement_type **)
+            lang_output_section_statement.tail);
+  os = lang_enter_output_section_statement (secname, address, 0, NULL, NULL,
+                                           NULL, constraint);
+
   ps = NULL;
-  if (config.build_constructors)
+  if (config.build_constructors && *os_tail == os)
     {
       /* If the name of the section is representable in C, then create
         symbols to mark the start and the end of the section.  */
@@ -1688,26 +1696,19 @@ lang_insert_orphan (asection *s,
                              exp_intop ((bfd_vma) 1 << s->alignment_power));
          lang_add_assignment (exp_assop ('=', ".", e_align));
          lang_add_assignment (exp_provide (symname,
-                                           exp_nameop (NAME, "."),
+                                           exp_unop (ABSOLUTE,
+                                                     exp_nameop (NAME, ".")),
                                            FALSE));
        }
     }
 
-  if (link_info.relocatable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
-    address = exp_intop (0);
-
-  os_tail = ((lang_output_section_statement_type **)
-            lang_output_section_statement.tail);
-  os = lang_enter_output_section_statement (secname, address, 0, NULL, NULL,
-                                           NULL, constraint);
-
   if (add_child == NULL)
     add_child = &os->children;
   lang_add_section (add_child, s, os);
 
   lang_leave_output_section_statement (0, "*default*", NULL, NULL);
 
-  if (config.build_constructors && *ps == '\0')
+  if (ps != NULL && *ps == '\0')
     {
       char *symname;