* ldlang.c (lang_add_section): Don't twidlle SEC_EXCLUDE here.
authorAlan Modra <amodra@gmail.com>
Fri, 28 May 2004 05:42:30 +0000 (05:42 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 28 May 2004 05:42:30 +0000 (05:42 +0000)
(output_section_callback): Nor SEC_KEEP here.
(gc_section_callback): Twiddle SEC_EXCLUDE here.
(lang_gc_wild): Delete.  Fold into..
(lang_gc_sections_1): ..here.  Only call bfd_gc_sections when garbage
collecting.
(lang_process): Always call lang_gc_sections.
(lang_place_orphans): Handle SEC_EXCLUDE sections.
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Remove
SEC_EXCLUDE code.

ld/ChangeLog
ld/emultempl/elf32.em
ld/ldlang.c

index b0b7158..5dc4903 100644 (file)
@@ -1,3 +1,16 @@
+2004-05-28  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (lang_add_section): Don't twidlle SEC_EXCLUDE here.
+       (output_section_callback): Nor SEC_KEEP here.
+       (gc_section_callback): Twiddle SEC_EXCLUDE here.
+       (lang_gc_wild): Delete.  Fold into..
+       (lang_gc_sections_1): ..here.  Only call bfd_gc_sections when garbage
+       collecting.
+       (lang_process): Always call lang_gc_sections.
+       (lang_place_orphans): Handle SEC_EXCLUDE sections.
+       * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Remove
+       SEC_EXCLUDE code.
+
 2004-05-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Clear
index 9950649..2039846 100644 (file)
@@ -1182,16 +1182,6 @@ gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s)
 #define HAVE_SECTION(hold, name) \
 (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL)
 
-  if (link_info.relocatable && (s->flags & SEC_DEBUGGING) == 0)
-    s->flags &= ~SEC_EXCLUDE;
-
-  if ((s->flags & SEC_EXCLUDE) != 0)
-    {
-      if (s->output_section == NULL)
-       s->output_section = bfd_abs_section_ptr;
-      return TRUE;
-    }
-
   place = NULL;
   if ((s->flags & SEC_ALLOC) == 0)
     ;
index b4c2559..991a647 100644 (file)
@@ -1089,23 +1089,9 @@ lang_add_section (lang_statement_list_type *ptr,
                  lang_output_section_statement_type *output,
                  lang_input_statement_type *file)
 {
-  flagword flags;
+  flagword flags = section->flags;
   bfd_boolean discard;
 
-  flags = bfd_get_section_flags (section->owner, section);
-
-  /* SEC_EXCLUDE is ignored when doing a relocatable link, except in
-     the special case of debug info.  (See bfd/stabs.c)  */
-  if (link_info.relocatable && (flags & SEC_DEBUGGING) == 0)
-    {
-      flags &= ~SEC_EXCLUDE;
-
-      /* Write the modified flag back, to simplify later linker
-        code.  */
-      if (section->owner != NULL)
-       bfd_set_section_flags (section->owner, section, flags);
-    }
-
   /* Discard sections marked with SEC_EXCLUDE.  */
   discard = (flags & SEC_EXCLUDE) != 0;
 
@@ -1349,11 +1335,6 @@ output_section_callback (lang_wild_statement_type *ptr,
   if (unique_section_p (section))
     return;
 
-  /* If the wild pattern was marked KEEP, the member sections
-     should be as well.  */
-  if (ptr->keep_sections)
-    section->flags |= SEC_KEEP;
-
   before = wild_sort (ptr, sec, file, section);
 
   /* Here BEFORE points to the lang_input_section which
@@ -4029,9 +4010,10 @@ lang_place_orphans (void)
                 around for a sensible place for it to go.  */
 
              if (file->just_syms_flag)
-               {
-                 abort ();
-               }
+               abort ();
+
+             if ((s->flags & SEC_EXCLUDE) != 0)
+               s->output_section = bfd_abs_section_ptr;
              else if (strcmp (s->name, "COMMON") == 0)
                {
                  /* This is a lonely common section which must have
@@ -4271,8 +4253,7 @@ lang_reset_memory_regions (void)
     o->_raw_size = 0;
 }
 
-/* If the wild pattern was marked KEEP, the member sections
-   should be as well.  */
+/* Worker for lang_gc_sections_1.  */
 
 static void
 gc_section_callback (lang_wild_statement_type *ptr,
@@ -4281,18 +4262,18 @@ gc_section_callback (lang_wild_statement_type *ptr,
                     lang_input_statement_type *file ATTRIBUTE_UNUSED,
                     void *data ATTRIBUTE_UNUSED)
 {
+  /* SEC_EXCLUDE is ignored when doing a relocatable link, except in
+     the special case of debug info.  (See bfd/stabs.c)
+     Twiddle the flag here, to simplify later linker code.  */
+  if (link_info.relocatable && (section->flags & SEC_DEBUGGING) == 0)
+    section->flags &= ~SEC_EXCLUDE;
+
+  /* If the wild pattern was marked KEEP, the member sections
+     should be as well.  */
   if (ptr->keep_sections)
     section->flags |= SEC_KEEP;
 }
 
-/* Handle a wild statement, marking it against GC.  */
-
-static void
-lang_gc_wild (lang_wild_statement_type *s)
-{
-  walk_wild (s, gc_section_callback, NULL);
-}
-
 /* Iterate over sections marking them against GC.  */
 
 static void
@@ -4303,7 +4284,7 @@ lang_gc_sections_1 (lang_statement_union_type *s)
       switch (s->header.type)
        {
        case lang_wild_statement_enum:
-         lang_gc_wild (&s->wild_statement);
+         walk_wild (&s->wild_statement, gc_section_callback, NULL);
          break;
        case lang_constructors_statement_enum:
          lang_gc_sections_1 (constructor_list.head);
@@ -4347,7 +4328,8 @@ lang_gc_sections (void)
        }
     }
 
-  bfd_gc_sections (output_bfd, &link_info);
+  if (command_line.gc_sections)
+    bfd_gc_sections (output_bfd, &link_info);
 }
 
 void
@@ -4395,8 +4377,7 @@ lang_process (void)
   ldctor_build_sets ();
 
   /* Remove unreferenced sections if asked to.  */
-  if (command_line.gc_sections)
-    lang_gc_sections ();
+  lang_gc_sections ();
 
   /* Size up the common data.  */
   lang_common ();