* emultempl/elf32.em (output_prev_sec_find): New.
authorJakub Jelinek <jakub@redhat.com>
Fri, 13 Jul 2001 07:25:18 +0000 (07:25 +0000)
committerJakub Jelinek <jakub@redhat.com>
Fri, 13 Jul 2001 07:25:18 +0000 (07:25 +0000)
(place_orphan): Use it.

ld/ChangeLog
ld/emultempl/elf32.em

index 13bde3069b7e014b428db29720cf0807ff25460b..d86e38351b4c0ad0fa1af49ac6549f9fd41b88d4 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-13  Jakub Jelinek  <jakub@redhat.com>
+
+       * emultempl/elf32.em (output_prev_sec_find): New.
+       (place_orphan): Use it.
+
 2001-07-11  H.J. Lu  <hjl@gnu.org>
 
        * ldmain.c (main): Fix typos in the last change.
index a3e08c1198294745e086d05ce5e793a85fe8c949..67e0d250b22a9f162155934c4bf017071451766d 100644 (file)
@@ -1006,6 +1006,35 @@ EOF
 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
 cat >>e${EMULATION_NAME}.c <<EOF
 
+/* Find the last output section before given output statement.
+   Used by place_orphan.  */
+
+static asection *
+output_prev_sec_find (os)
+     lang_output_section_statement_type *os;
+{
+  asection *s = (asection *) NULL;
+  lang_statement_union_type *u;
+  lang_output_section_statement_type *lookup;
+
+  for (u = lang_output_section_statement.head;
+       u != (lang_statement_union_type *) NULL;
+       u = lookup->next)
+    {
+      lookup = &u->output_section_statement;
+      if (lookup == os)
+       break;
+      if (lookup->bfd_section != NULL)
+       s = lookup->bfd_section;
+    }
+
+  if (u == NULL)
+    return NULL;
+
+  return s;
+}
+
+
 /* Place an orphan section.  We use this to put random SHF_ALLOC
    sections in the right segment.  */
 
@@ -1192,12 +1221,16 @@ gld${EMULATION_NAME}_place_orphan (file, s)
 
   if (place != NULL)
     {
-      asection *snew, **pps;
+      asection *snew, **pps, *bfd_section;
 
       snew = os->bfd_section;
+      bfd_section = place->os->bfd_section;
+      if (place->section == NULL && bfd_section == NULL)
+       bfd_section = output_prev_sec_find (place->os);
+
       if (place->section != NULL
-         || (place->os->bfd_section != NULL
-             && place->os->bfd_section != snew))
+         || (bfd_section != NULL
+             && bfd_section != snew))
        {
          /* Shuffle the section to make the output file look neater.
             This is really only cosmetic.  */
@@ -1206,15 +1239,15 @@ gld${EMULATION_NAME}_place_orphan (file, s)
 #if 0
              /* Finding the end of the list is a little tricky.  We
                 make a wild stab at it by comparing section flags.  */
-             flagword first_flags = place->os->bfd_section->flags;
-             for (pps = &place->os->bfd_section->next;
+             flagword first_flags = bfd_section->flags;
+             for (pps = &bfd_section->next;
                   *pps != NULL && (*pps)->flags == first_flags;
                   pps = &(*pps)->next)
                ;
              place->section = pps;
 #else
              /* Put orphans after the first section on the list.  */
-             place->section = &place->os->bfd_section->next;
+             place->section = &bfd_section->next;
 #endif
            }