* section.c (_bfd_strip_section_from_output): Remove unnecessary
authorAlan Modra <amodra@gmail.com>
Thu, 4 Jul 2002 14:40:25 +0000 (14:40 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 4 Jul 2002 14:40:25 +0000 (14:40 +0000)
link order code.  Don't actually remove the output section here;
Just set a flag for the linker to do so.
* elflink.c (_bfd_elf_link_renumber_dynsyms): Test for removed
sections when setting up output section dynsyms.

bfd/ChangeLog
bfd/elflink.c
bfd/section.c

index e1cb88f02b4ac69279aa22ff4df6cd27f5c7b947..3fe196659e975bc7a944e6d4689aae4ff2691cae 100644 (file)
@@ -1,3 +1,11 @@
+2002-07-04  Alan Modra  <amodra@bigpond.net.au>
+
+       * section.c (_bfd_strip_section_from_output):  Remove unnecessary
+       link order code.  Don't actually remove the output section here;
+       Just set a flag for the linker to do so.
+       * elflink.c (_bfd_elf_link_renumber_dynsyms): Test for removed
+       sections when setting up output section dynsyms.
+
 2002-07-04  Alan Modra  <amodra@bigpond.net.au>
 
        * elflink.h (elf_link_add_object_symbols): Revert 1999-09-02 hpux
index 25a519308d43a31c728f5849d32620239af4008c..c32ff1c3cb65db1a8ee8a255da3dcd403c62b6ce 100644 (file)
@@ -357,7 +357,8 @@ _bfd_elf_link_renumber_dynsyms (output_bfd, info)
     {
       asection *p;
       for (p = output_bfd->sections; p ; p = p->next)
-       elf_section_data (p)->dynindx = ++dynsymcount;
+       if ((p->flags & SEC_EXCLUDE) == 0)
+         elf_section_data (p)->dynindx = ++dynsymcount;
     }
 
   if (elf_hash_table (info)->dynlocal)
index f3937896e6b553f1a09e749675ad1d3b92bbe726..51b21c70fbbf2f65b4bfce57889621f50324b7b8 100644 (file)
@@ -1301,80 +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->flags |= SEC_EXCLUDE;
-           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;
 }
 
 /*