daily update
[deliverable/binutils-gdb.git] / bfd / section.c
index 96130b9d3fb2a3e6d2e5b130ad8da75b0f51ec26..51b21c70fbbf2f65b4bfce57889621f50324b7b8 100644 (file)
@@ -798,7 +798,7 @@ bfd_get_unique_section_name (abfd, templat, count)
   sname = bfd_malloc ((bfd_size_type) len + 8);
   if (sname == NULL)
     return NULL;
-  strcpy (sname, templat);
+  memcpy (sname, templat, len);
   num = 1;
   if (count != NULL)
     num = *count;
@@ -1301,79 +1301,40 @@ SYNOPSIS
 
 DESCRIPTION
        Remove @var{section} from the output.  If the output section
-       becomes empty, remove it from the output bfd.  @var{info} may
-       be NULL; if it is not, it is used to decide whether the output
-       section is empty.
+       becomes empty, remove it from the output bfd.
+
+       This function won't actually do anything except twiddle flags
+       if called too late in the linking process, when it's not safe
+       to remove sections.
 */
 void
 _bfd_strip_section_from_output (info, s)
      struct bfd_link_info *info;
      asection *s;
 {
-  asection **spp, *os;
-  struct bfd_link_order *p, *pp;
-  boolean keep_os;
+  asection *os;
+  asection *is;
+  bfd *abfd;
 
-  /* Excise the input section from the link order.
+  s->flags |= SEC_EXCLUDE;
 
-     FIXME: For all calls that I can see to this function, the link
-     orders have not yet been set up.  So why are we checking them? --
-     Ian */
+  /* If the section wasn't assigned to an output section, or the
+     section has been discarded by the linker script, there's nothing
+     more to do.  */
   os = s->output_section;
-
-  /* Handle a section that wasn't output.  */
-  if (os == NULL)
+  if (os == NULL || os->owner == NULL)
     return;
 
-  for (p = os->link_order_head, pp = NULL; p != NULL; pp = p, p = p->next)
-    if (p->type == bfd_indirect_link_order
-       && p->u.indirect.section == s)
-      {
-       if (pp)
-         pp->next = p->next;
-       else
-         os->link_order_head = p->next;
-       if (!p->next)
-         os->link_order_tail = pp;
-       break;
-      }
-
-  keep_os = os->link_order_head != NULL;
-
-  if (! keep_os && info != NULL)
-    {
-      bfd *abfd;
-      for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
-       {
-         asection *is;
-         for (is = abfd->sections; is != NULL; is = is->next)
-           {
-             if (is != s && is->output_section == os
-                 && (is->flags & SEC_EXCLUDE) == 0)
-               break;
-           }
-         if (is != NULL)
-           break;
-       }
-      if (abfd != NULL)
-       keep_os = true;
-    }
+  /* If the output section has other (non-excluded) input sections, we
+     can't remove it.  */
+  for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
+    for (is = abfd->sections; is != NULL; is = is->next)
+      if (is->output_section == os && (is->flags & SEC_EXCLUDE) == 0)
+       return;
 
-  /* If the output section is empty, remove it too.  Careful about sections
-     that have been discarded in the link script -- they are mapped to
-     bfd_abs_section, which has no owner.  */
-  if (!keep_os && os->owner != NULL)
-    {
-      for (spp = &os->owner->sections; *spp; spp = &(*spp)->next)
-       if (*spp == os)
-         {
-           bfd_section_list_remove (os->owner, spp);
-           os->owner->section_count--;
-           break;
-         }
-    }
-
-  s->flags |= SEC_EXCLUDE;
+  /* If the output section is empty, flag it for removal too.
+     See ldlang.c:strip_excluded_output_sections for the action.  */
+  os->flags |= SEC_EXCLUDE;
 }
 
 /*
This page took 0.025012 seconds and 4 git commands to generate.