* config/tc-m68k.c (tc_gen_reloc <section>): Add ATTRIBUTE_UNUSED.
[deliverable/binutils-gdb.git] / ld / ldwrite.c
index 37e258030a526ec73145259bffe95cce4a181d17..cbd879dc7e8e6457558db5221f991b05fe376d6e 100644 (file)
@@ -1,5 +1,5 @@
 /* ldwrite.c -- write out the linked file
-   Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 2000
+   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002
    Free Software Foundation, Inc.
    Written by Steve Chamberlain sac@cygnus.com
 
@@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "ldlang.h"
 #include "ldwrite.h"
 #include "ldmisc.h"
-#include "ldgram.h"
+#include <ldgram.h>
 #include "ldmain.h"
 
 static void build_link_order PARAMS ((lang_statement_union_type *));
@@ -49,7 +49,7 @@ build_link_order (statement)
        asection *output_section;
        struct bfd_link_order *link_order;
        bfd_vma value;
-       boolean big_endian = false;
+       bfd_boolean big_endian = FALSE;
 
        output_section = statement->data_statement.output_section;
        ASSERT (output_section->owner == output_bfd);
@@ -70,24 +70,24 @@ build_link_order (statement)
           endianness are big endian, so we must swap here if the
           input file is little endian.  */
        if (bfd_big_endian (output_bfd))
-         big_endian = true;
+         big_endian = TRUE;
        else if (bfd_little_endian (output_bfd))
-         big_endian = false;
+         big_endian = FALSE;
        else
          {
-           boolean swap;
+           bfd_boolean swap;
 
-           swap = false;
+           swap = FALSE;
            if (command_line.endian == ENDIAN_BIG)
-             big_endian = true;
+             big_endian = TRUE;
            else if (command_line.endian == ENDIAN_LITTLE)
              {
-               big_endian = false;
-               swap = true;
+               big_endian = FALSE;
+               swap = TRUE;
              }
            else if (command_line.endian == ENDIAN_UNSET)
              {
-               big_endian = true;
+               big_endian = TRUE;
                {
                  LANG_FOR_EACH_INPUT_STATEMENT (s)
                    {
@@ -95,8 +95,8 @@ build_link_order (statement)
                        {
                          if (bfd_little_endian (s->the_bfd))
                            {
-                             big_endian = false;
-                             swap = true;
+                             big_endian = FALSE;
+                             swap = TRUE;
                            }
                          break;
                        }
@@ -226,14 +226,16 @@ build_link_order (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 == false)
+      if (!statement->input_section.ifile->just_syms_flag)
        {
          asection *i = statement->input_section.section;
          asection *output_section = i->output_section;
 
          ASSERT (output_section->owner == output_bfd);
 
-         if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
+         if ((output_section->flags & SEC_HAS_CONTENTS) != 0
+             || ((output_section->flags & SEC_LOAD) != 0
+                 && (output_section->flags & SEC_THREAD_LOCAL)))
            {
              struct bfd_link_order *link_order;
 
@@ -243,9 +245,10 @@ build_link_order (statement)
                {
                  /* We've got a never load section inside one which
                     is going to be output, we'll change it into a
-                    fill link_order */
-                 link_order->type = bfd_fill_link_order;
-                 link_order->u.fill.value = 0;
+                    fill.  */
+                 link_order->type = bfd_data_link_order;
+                 link_order->u.data.contents = "";
+                 link_order->u.data.size = 1;
                }
              else
                {
@@ -274,10 +277,11 @@ build_link_order (statement)
        if ((output_section->flags & SEC_HAS_CONTENTS) != 0)
          {
            link_order = bfd_new_link_order (output_bfd, output_section);
-           link_order->type = bfd_fill_link_order;
+           link_order->type = bfd_data_link_order;
            link_order->size = statement->padding_statement.size;
            link_order->offset = statement->padding_statement.output_offset;
-           link_order->u.fill.value = statement->padding_statement.fill;
+           link_order->u.data.contents = statement->padding_statement.fill->data;
+           link_order->u.data.size = statement->padding_statement.fill->size;
          }
       }
       break;
@@ -290,10 +294,8 @@ build_link_order (statement)
 
 /* Call BFD to write out the linked file.  */
 
-
 /**********************************************************************/
 
-
 /* 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
@@ -306,23 +308,26 @@ clone_section (abfd, s, name, count)
      const char *name;
      int *count;
 {
-  char template[6];
+  char templ[6];
   char *sname;
   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 (template, name, sizeof (template) - 1);
-  template[sizeof (template) - 1] = '\0';
-  sname = bfd_get_unique_section_name (abfd, template, count);
-
-  n = bfd_make_section_anyway (abfd, sname);
-
-  /* Create a symbol of the same name.  */
+  strncpy (templ, name, sizeof (templ) - 1);
+  templ[sizeof (templ) - 1] = '\0';
+  if ((sname = bfd_get_unique_section_name (abfd, templ, count)) == NULL
+      || (n = bfd_make_section_anyway (abfd, sname)) == NULL
+      || (h = bfd_link_hash_lookup (link_info.hash,
+                                   sname, TRUE, TRUE, FALSE)) == NULL)
+    {
+      einfo (_("%F%P: clone section failed: %E\n"));
+      /* Silence gcc warnings.  einfo exits, so we never reach here.  */
+      return NULL;
+    }
 
-  h = bfd_link_hash_lookup (link_info.hash,
-                           sname, true, true, false);
+  /* Set up section symbol.  */
   h->type = bfd_link_hash_defined;
   h->u.def.value = 0;
   h->u.def.section = n;
@@ -342,7 +347,7 @@ clone_section (abfd, s, name, count)
 }
 
 #if TESTING
-static void 
+static void
 ds (s)
      asection *s;
 {
@@ -362,6 +367,7 @@ ds (s)
     }
   printf ("\n");
 }
+
 dump (s, a1, a2)
      char *s;
      asection *a1;
@@ -372,7 +378,7 @@ dump (s, a1, a2)
   ds (a2);
 }
 
-static void 
+static void
 sanity_check (abfd)
      bfd *abfd;
 {
@@ -396,7 +402,7 @@ sanity_check (abfd)
 #define dump(a, b, c)
 #endif
 
-static void 
+static void
 split_sections (abfd, info)
      bfd *abfd;
      struct bfd_link_info *info;
@@ -517,7 +523,9 @@ split_sections (abfd, info)
     }
   sanity_check (abfd);
 }
+
 /**********************************************************************/
+
 void
 ldwrite ()
 {
@@ -536,8 +544,8 @@ ldwrite ()
         out.  */
 
       if (bfd_get_error () != bfd_error_no_error)
-       einfo (_("%F%P: final link failed: %E\n"), output_bfd);
+       einfo (_("%F%P: final link failed: %E\n"));
       else
-       xexit(1);
+       xexit (1);
     }
 }
This page took 0.025741 seconds and 4 git commands to generate.