2003-08-20 Michael Snyder <msnyder@redhat.com>
[binutils-gdb.git] / ld / ldwrite.c
index 589b91012ca8393e685f1ba00346831d0eef06fe..7ca06226d40d535da17f2d5035d75543e9c19b26 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, 2003
    Free Software Foundation, Inc.
    Written by Steve Chamberlain sac@cygnus.com
 
@@ -29,18 +29,13 @@ 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 *));
-static asection *clone_section PARAMS ((bfd *, asection *, const char *, int *));
-static void split_sections PARAMS ((bfd *, struct bfd_link_info *));
-
 /* Build link_order structures for the BFD linker.  */
 
 static void
-build_link_order (statement)
-     lang_statement_union_type *statement;
+build_link_order (lang_statement_union_type *statement)
 {
   switch (statement->header.type)
     {
@@ -49,7 +44,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);
@@ -60,7 +55,7 @@ build_link_order (statement)
 
        link_order->type = bfd_data_link_order;
        link_order->offset = statement->data_statement.output_vma;
-       link_order->u.data.contents = (bfd_byte *) xmalloc (QUAD_SIZE);
+       link_order->u.data.contents = xmalloc (QUAD_SIZE);
 
        value = statement->data_statement.value;
 
@@ -70,24 +65,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 +90,8 @@ build_link_order (statement)
                        {
                          if (bfd_little_endian (s->the_bfd))
                            {
-                             big_endian = false;
-                             swap = true;
+                             big_endian = FALSE;
+                             swap = TRUE;
                            }
                          break;
                        }
@@ -197,9 +192,7 @@ build_link_order (statement)
        link_order->offset = rs->output_vma;
        link_order->size = bfd_get_reloc_size (rs->howto);
 
-       link_order->u.reloc.p =
-         ((struct bfd_link_order_reloc *)
-          xmalloc (sizeof (struct bfd_link_order_reloc)));
+       link_order->u.reloc.p = xmalloc (sizeof (struct bfd_link_order_reloc));
 
        link_order->u.reloc.p->reloc = rs->reloc;
        link_order->u.reloc.p->addend = rs->addend_value;
@@ -226,14 +219,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 +238,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 +270,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;
@@ -288,23 +285,13 @@ 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
    creating new output sections with all the right bits.  */
 #define TESTIT 1
 static asection *
-clone_section (abfd, s, name, count)
-     bfd *abfd;
-     asection *s;
-     const char *name;
-     int *count;
+clone_section (bfd *abfd, asection *s, const char *name, int *count)
 {
   char templ[6];
   char *sname;
@@ -318,7 +305,7 @@ clone_section (abfd, s, name, count)
   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)
+                                   sname, TRUE, TRUE, FALSE)) == NULL)
     {
       einfo (_("%F%P: clone section failed: %E\n"));
       /* Silence gcc warnings.  einfo exits, so we never reach here.  */
@@ -345,9 +332,8 @@ clone_section (abfd, s, name, count)
 }
 
 #if TESTING
-static void 
-ds (s)
-     asection *s;
+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);
@@ -365,19 +351,16 @@ ds (s)
     }
   printf ("\n");
 }
-dump (s, a1, a2)
-     char *s;
-     asection *a1;
-     asection *a2;
+
+dump (char *s, asection *a1, asection *a2)
 {
   printf ("%s\n", s);
   ds (a1);
   ds (a2);
 }
 
-static void 
-sanity_check (abfd)
-     bfd *abfd;
+static void
+sanity_check (bfd *abfd)
 {
   asection *s;
   for (s = abfd->sections; s; s = s->next)
@@ -399,10 +382,8 @@ sanity_check (abfd)
 #define dump(a, b, c)
 #endif
 
-static void 
-split_sections (abfd, info)
-     bfd *abfd;
-     struct bfd_link_info *info;
+static void
+split_sections (bfd *abfd, struct bfd_link_info *info)
 {
   asection *original_sec;
   int nsecs = abfd->section_count;
@@ -438,7 +419,7 @@ split_sections (abfd, info)
                  || info->strip == strip_some)
                thislines = sec->lineno_count;
 
-             if (info->relocateable)
+             if (info->relocatable)
                thisrelocs = sec->reloc_count;
 
              if (sec->_cooked_size != 0)
@@ -447,7 +428,7 @@ split_sections (abfd, info)
                thissize = sec->_raw_size;
 
            }
-         else if (info->relocateable
+         else if (info->relocatable
                   && (p->type == bfd_section_reloc_link_order
                       || p->type == bfd_symbol_reloc_link_order))
            thisrelocs++;
@@ -520,9 +501,11 @@ split_sections (abfd, info)
     }
   sanity_check (abfd);
 }
-/**********************************************************************/
+
+/* Call BFD to write out the linked file.  */
+
 void
-ldwrite ()
+ldwrite (void)
 {
   /* Reset error indicator, which can typically something like invalid
      format from opening up the .o files.  */
@@ -541,6 +524,6 @@ ldwrite ()
       if (bfd_get_error () != bfd_error_no_error)
        einfo (_("%F%P: final link failed: %E\n"));
       else
-       xexit(1);
+       xexit (1);
     }
 }