* Makefile.in (SFILES): Add cp-names.y.
[deliverable/binutils-gdb.git] / ld / ldwrite.c
index 7ca06226d40d535da17f2d5035d75543e9c19b26..56c4d0a3434c9e73793a47a282872e2bc30b9205 100644 (file)
@@ -1,6 +1,6 @@
 /* ldwrite.c -- write out the linked file
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
+   2003, 2004, 2005 Free Software Foundation, Inc.
    Written by Steve Chamberlain sac@cygnus.com
 
 This file is part of GLD, the Gnu Linker.
@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "sysdep.h"
 #include "bfdlink.h"
 #include "libiberty.h"
+#include "safe-ctype.h"
 
 #include "ld.h"
 #include "ldexp.h"
@@ -219,7 +220,8 @@ build_link_order (lang_statement_union_type *statement)
     case lang_input_section_enum:
       /* Create a new link_order in the output section with this
         attached */
-      if (!statement->input_section.ifile->just_syms_flag)
+      if (!statement->input_section.ifile->just_syms_flag
+         && (statement->input_section.section->flags & SEC_EXCLUDE) == 0)
        {
          asection *i = statement->input_section.section;
          asection *output_section = i->output_section;
@@ -240,7 +242,7 @@ build_link_order (lang_statement_union_type *statement)
                     is going to be output, we'll change it into a
                     fill.  */
                  link_order->type = bfd_data_link_order;
-                 link_order->u.data.contents = "";
+                 link_order->u.data.contents = (unsigned char *) "";
                  link_order->u.data.size = 1;
                }
              else
@@ -249,10 +251,7 @@ build_link_order (lang_statement_union_type *statement)
                  link_order->u.indirect.section = i;
                  ASSERT (i->output_section == output_section);
                }
-             if (i->_cooked_size)
-               link_order->size = i->_cooked_size;
-             else
-               link_order->size = bfd_get_section_size_before_reloc (i);
+             link_order->size = i->size;
              link_order->offset = i->output_offset;
            }
        }
@@ -285,6 +284,25 @@ build_link_order (lang_statement_union_type *statement)
     }
 }
 
+/* Return true if NAME is the name of an unsplittable section. These
+   are the stabs strings, dwarf strings.  */
+
+static bfd_boolean
+unsplittable_name (const char *name)
+{
+  if (strncmp (name, ".stab", 5) == 0)
+    {
+      /* There are several stab like string sections. We pattern match on
+        ".stab...str"  */
+      unsigned len = strlen (name);
+      if (strcmp (&name[len-3], "str") == 0)
+       return TRUE;
+    }
+  else if (strcmp (name, "$GDB_STRINGS$") == 0)
+    return TRUE;
+  return FALSE;
+}
+
 /* Wander around the input sections, make sure that
    we'll never try and create an output section with more relocs
    than will fit.. Do this by always assuming the worst case, and
@@ -293,16 +311,41 @@ build_link_order (lang_statement_union_type *statement)
 static asection *
 clone_section (bfd *abfd, asection *s, const char *name, int *count)
 {
-  char templ[6];
+  char *tname;
   char *sname;
+  unsigned int len;    
   asection *n;
   struct bfd_link_hash_entry *h;
 
-  /* Invent a section name from the first five chars of the base
-     section name and a digit suffix.  */
-  strncpy (templ, name, sizeof (templ) - 1);
-  templ[sizeof (templ) - 1] = '\0';
-  if ((sname = bfd_get_unique_section_name (abfd, templ, count)) == NULL
+  /* Invent a section name from the section name and a dotted numeric
+     suffix.   */
+  len = strlen (name);
+  tname = xmalloc (len + 1);
+  memcpy (tname, name, len + 1);
+  /* Remove a dotted number suffix, from a previous split link. */
+  while (len && ISDIGIT (tname[len-1]))
+    len--;
+  if (len > 1 && tname[len-1] == '.')
+    /* It was a dotted number. */
+    tname[len-1] = 0;
+
+  /* We want to use the whole of the original section name for the
+     split name, but coff can be restricted to 8 character names.  */
+  if (bfd_family_coff (abfd) && strlen (tname) > 5)
+    {
+      /* Some section names cannot be truncated, as the name is
+        used to locate some other section.  */
+      if (strncmp (name, ".stab", 5) == 0
+         || strcmp (name, "$GDB_SYMBOLS$") == 0)
+       {
+         einfo (_ ("%F%P: cannot create split section name for %s\n"), name);
+         /* Silence gcc warnings.  einfo exits, so we never reach here.  */
+         return NULL;
+       }
+      tname[5] = 0;
+    }
+  
+  if ((sname = bfd_get_unique_section_name (abfd, tname, count)) == NULL
       || (n = bfd_make_section_anyway (abfd, sname)) == NULL
       || (h = bfd_link_hash_lookup (link_info.hash,
                                    sname, TRUE, TRUE, FALSE)) == NULL)
@@ -311,7 +354,8 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count)
       /* Silence gcc warnings.  einfo exits, so we never reach here.  */
       return NULL;
     }
-
+  free (tname);
+  
   /* Set up section symbol.  */
   h->type = bfd_link_hash_defined;
   h->u.def.value = 0;
@@ -321,8 +365,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count)
   n->vma = s->vma;
   n->user_set_vma = s->user_set_vma;
   n->lma = s->lma;
-  n->_cooked_size = 0;
-  n->_raw_size = 0;
+  n->size = 0;
   n->output_offset = s->output_offset;
   n->output_section = n;
   n->orelocation = 0;
@@ -336,7 +379,7 @@ static void
 ds (asection *s)
 {
   struct bfd_link_order *l = s->link_order_head;
-  printf ("vma %x size %x\n", s->vma, s->_raw_size);
+  printf ("vma %x size %x\n", s->vma, s->size);
   while (l)
     {
       if (l->type == bfd_indirect_link_order)
@@ -422,10 +465,7 @@ split_sections (bfd *abfd, struct bfd_link_info *info)
              if (info->relocatable)
                thisrelocs = sec->reloc_count;
 
-             if (sec->_cooked_size != 0)
-               thissize = sec->_cooked_size;
-             else
-               thissize = sec->_raw_size;
+             thissize = sec->size;
 
            }
          else if (info->relocatable
@@ -436,7 +476,8 @@ split_sections (bfd *abfd, struct bfd_link_info *info)
          if (l != NULL
              && (thisrelocs + relocs >= config.split_by_reloc
                  || thislines + lines >= config.split_by_reloc
-                 || thissize + sec_size >= config.split_by_file))
+                 || (thissize + sec_size >= config.split_by_file))
+             && !unsplittable_name (cursor->name))
            {
              /* Create a new section and put this link order and the
                 following link orders into it.  */
@@ -459,13 +500,8 @@ split_sections (bfd *abfd, struct bfd_link_info *info)
              dump ("before snip", cursor, n);
 
              shift_offset = p->offset;
-             if (cursor->_cooked_size != 0)
-               {
-                 n->_cooked_size = cursor->_cooked_size - shift_offset;
-                 cursor->_cooked_size = shift_offset;
-               }
-             n->_raw_size = cursor->_raw_size - shift_offset;
-             cursor->_raw_size = shift_offset;
+             n->size = cursor->size - shift_offset;
+             cursor->size = shift_offset;
 
              vma += shift_offset;
              n->lma = n->vma = vma;
This page took 0.026349 seconds and 4 git commands to generate.