PR ld/22909 amendment; don't xfail ld-elf/pr19539.d for cris*-*-*.
[deliverable/binutils-gdb.git] / ld / ldwrite.c
index 7eb8b2b01d3f6b03ca0eed85a36b5a9041d59b18..5624dfdf4c0a5c22232c9facba346af624efcb45 100644 (file)
@@ -1,6 +1,5 @@
 /* ldwrite.c -- write out the linked file
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
-   2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 Free Software Foundation, Inc.
    Written by Steve Chamberlain sac@cygnus.com
 
    This file is part of the GNU Binutils.
@@ -24,6 +23,7 @@
 #include "bfd.h"
 #include "bfdlink.h"
 #include "libiberty.h"
+#include "ctf-api.h"
 #include "safe-ctype.h"
 
 #include "ld.h"
@@ -46,14 +46,18 @@ build_link_order (lang_statement_union_type *statement)
        asection *output_section;
        struct bfd_link_order *link_order;
        bfd_vma value;
-       bfd_boolean big_endian = FALSE;
 
        output_section = statement->data_statement.output_section;
        ASSERT (output_section->owner == link_info.output_bfd);
 
+       if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
+             || ((output_section->flags & SEC_LOAD) != 0
+                 && (output_section->flags & SEC_THREAD_LOCAL))))
+         break;
+
        link_order = bfd_new_link_order (link_info.output_bfd, output_section);
        if (link_order == NULL)
-         einfo (_("%P%F: bfd_new_link_order failed\n"));
+         einfo (_("%F%P: bfd_new_link_order failed\n"));
 
        link_order->type = bfd_data_link_order;
        link_order->offset = statement->data_statement.output_offset;
@@ -61,74 +65,38 @@ build_link_order (lang_statement_union_type *statement)
 
        value = statement->data_statement.value;
 
-       /* If the endianness of the output BFD is not known, then we
-          base the endianness of the data on the first input file.
-          By convention, the bfd_put routines for an unknown
+       /* By convention, the bfd_put routines for an unknown
           endianness are big endian, so we must swap here if the
-          input file is little endian.  */
-       if (bfd_big_endian (link_info.output_bfd))
-         big_endian = TRUE;
-       else if (bfd_little_endian (link_info.output_bfd))
-         big_endian = FALSE;
-       else
+          input is little endian.  */
+       if (!bfd_big_endian (link_info.output_bfd)
+           && !bfd_little_endian (link_info.output_bfd)
+           && !link_info.big_endian)
          {
-           bfd_boolean swap;
-
-           swap = FALSE;
-           if (command_line.endian == ENDIAN_BIG)
-             big_endian = TRUE;
-           else if (command_line.endian == ENDIAN_LITTLE)
-             {
-               big_endian = FALSE;
-               swap = TRUE;
-             }
-           else if (command_line.endian == ENDIAN_UNSET)
-             {
-               big_endian = TRUE;
-               {
-                 LANG_FOR_EACH_INPUT_STATEMENT (s)
-                   {
-                     if (s->the_bfd != NULL)
-                       {
-                         if (bfd_little_endian (s->the_bfd))
-                           {
-                             big_endian = FALSE;
-                             swap = TRUE;
-                           }
-                         break;
-                       }
-                   }
-               }
-             }
+           bfd_byte buffer[8];
 
-           if (swap)
+           switch (statement->data_statement.type)
              {
-               bfd_byte buffer[8];
-
-               switch (statement->data_statement.type)
+             case QUAD:
+             case SQUAD:
+               if (sizeof (bfd_vma) >= QUAD_SIZE)
                  {
-                 case QUAD:
-                 case SQUAD:
-                   if (sizeof (bfd_vma) >= QUAD_SIZE)
-                     {
-                       bfd_putl64 (value, buffer);
-                       value = bfd_getb64 (buffer);
-                       break;
-                     }
-                   /* Fall through.  */
-                 case LONG:
-                   bfd_putl32 (value, buffer);
-                   value = bfd_getb32 (buffer);
-                   break;
-                 case SHORT:
-                   bfd_putl16 (value, buffer);
-                   value = bfd_getb16 (buffer);
+                   bfd_putl64 (value, buffer);
+                   value = bfd_getb64 (buffer);
                    break;
-                 case BYTE:
-                   break;
-                 default:
-                   abort ();
                  }
+               /* Fall through.  */
+             case LONG:
+               bfd_putl32 (value, buffer);
+               value = bfd_getb32 (buffer);
+               break;
+             case SHORT:
+               bfd_putl16 (value, buffer);
+               value = bfd_getb16 (buffer);
+               break;
+             case BYTE:
+               break;
+             default:
+               abort ();
              }
          }
 
@@ -152,10 +120,10 @@ build_link_order (lang_statement_union_type *statement)
                  high = (bfd_vma) -1;
                bfd_put_32 (link_info.output_bfd, high,
                            (link_order->u.data.contents
-                            + (big_endian ? 0 : 4)));
+                            + (link_info.big_endian ? 0 : 4)));
                bfd_put_32 (link_info.output_bfd, value,
                            (link_order->u.data.contents
-                            + (big_endian ? 4 : 0)));
+                            + (link_info.big_endian ? 4 : 0)));
              }
            link_order->size = QUAD_SIZE;
            break;
@@ -177,6 +145,7 @@ build_link_order (lang_statement_union_type *statement)
          default:
            abort ();
          }
+       link_order->u.data.size = link_order->size;
       }
       break;
 
@@ -191,15 +160,20 @@ build_link_order (lang_statement_union_type *statement)
        output_section = rs->output_section;
        ASSERT (output_section->owner == link_info.output_bfd);
 
+       if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
+             || ((output_section->flags & SEC_LOAD) != 0
+                 && (output_section->flags & SEC_THREAD_LOCAL))))
+         break;
+
        link_order = bfd_new_link_order (link_info.output_bfd, output_section);
        if (link_order == NULL)
-         einfo (_("%P%F: bfd_new_link_order failed\n"));
+         einfo (_("%F%P: bfd_new_link_order failed\n"));
 
        link_order->offset = rs->output_offset;
        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));
+         xmalloc (sizeof (struct bfd_link_order_reloc));
 
        link_order->u.reloc.p->reloc = rs->reloc;
        link_order->u.reloc.p->addend = rs->addend_value;
@@ -229,40 +203,41 @@ build_link_order (lang_statement_union_type *statement)
           attached */
        asection *i = statement->input_section.section;
 
-       if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
+       if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
            && (i->flags & SEC_EXCLUDE) == 0)
          {
            asection *output_section = i->output_section;
+           struct bfd_link_order *link_order;
 
            ASSERT (output_section->owner == link_info.output_bfd);
 
-           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;
+           if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
+                 || ((output_section->flags & SEC_LOAD) != 0
+                     && (output_section->flags & SEC_THREAD_LOCAL))))
+             break;
 
-               link_order = bfd_new_link_order (link_info.output_bfd,
-                                                output_section);
+           link_order = bfd_new_link_order (link_info.output_bfd,
+                                            output_section);
+           if (link_order == NULL)
+             einfo (_("%F%P: bfd_new_link_order failed\n"));
 
-               if (i->flags & SEC_NEVER_LOAD)
-                 {
-                   /* We've got a never load section inside one which
-                      is going to be output, we'll change it into a
-                      fill.  */
-                   link_order->type = bfd_data_link_order;
-                   link_order->u.data.contents = (unsigned char *) "";
-                   link_order->u.data.size = 1;
-                 }
-               else
-                 {
-                   link_order->type = bfd_indirect_link_order;
-                   link_order->u.indirect.section = i;
-                   ASSERT (i->output_section == output_section);
-                 }
-               link_order->size = i->size;
-               link_order->offset = i->output_offset;
+           if ((i->flags & SEC_NEVER_LOAD) != 0
+               && (i->flags & SEC_DEBUGGING) == 0)
+             {
+               /* We've got a never load section inside one which is
+                  going to be output, we'll change it into a fill.  */
+               link_order->type = bfd_data_link_order;
+               link_order->u.data.contents = (unsigned char *) "";
+               link_order->u.data.size = 1;
+             }
+           else
+             {
+               link_order->type = bfd_indirect_link_order;
+               link_order->u.indirect.section = i;
+               ASSERT (i->output_section == output_section);
              }
+           link_order->size = i->size;
+           link_order->offset = i->output_offset;
          }
       }
       break;
@@ -276,19 +251,21 @@ build_link_order (lang_statement_union_type *statement)
        output_section = statement->padding_statement.output_section;
        ASSERT (statement->padding_statement.output_section->owner
                == link_info.output_bfd);
-       if (((output_section->flags & SEC_HAS_CONTENTS) != 0
-            || ((output_section->flags & SEC_LOAD) != 0
-                && (output_section->flags & SEC_THREAD_LOCAL)))
-           && (output_section->flags & SEC_NEVER_LOAD) == 0)
-         {
-           link_order = bfd_new_link_order (link_info.output_bfd,
-                                            output_section);
-           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.data.contents = statement->padding_statement.fill->data;
-           link_order->u.data.size = statement->padding_statement.fill->size;
-         }
+
+       if (!((output_section->flags & SEC_HAS_CONTENTS) != 0
+             || ((output_section->flags & SEC_LOAD) != 0
+                 && (output_section->flags & SEC_THREAD_LOCAL))))
+         break;
+
+       link_order = bfd_new_link_order (link_info.output_bfd,
+                                        output_section);
+       if (link_order == NULL)
+         einfo (_("%F%P: bfd_new_link_order failed\n"));
+       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.data.contents = statement->padding_statement.fill->data;
+       link_order->u.data.size = statement->padding_statement.fill->size;
       }
       break;
 
@@ -327,7 +304,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count)
 {
   char *tname;
   char *sname;
-  unsigned int len;    
+  unsigned int len;
   asection *n;
   struct bfd_link_hash_entry *h;
 
@@ -400,13 +377,9 @@ ds (asection *s)
   while (l)
     {
       if (l->type == bfd_indirect_link_order)
-       {
-         printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
-       }
+       printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename);
       else
-       {
-         printf (_("%8x something else\n"), l->offset);
-       }
+       printf (_("%8x something else\n"), l->offset);
       l = l->next;
     }
   printf ("\n");
@@ -479,13 +452,13 @@ split_sections (bfd *abfd, struct bfd_link_info *info)
                  || info->strip == strip_some)
                thislines = sec->lineno_count;
 
-             if (info->relocatable)
+             if (bfd_link_relocatable (info))
                thisrelocs = sec->reloc_count;
 
              thissize = sec->size;
 
            }
-         else if (info->relocatable
+         else if (bfd_link_relocatable (info)
                   && (p->type == bfd_section_reloc_link_order
                       || p->type == bfd_symbol_reloc_link_order))
            thisrelocs++;
@@ -563,6 +536,7 @@ ldwrite (void)
   /* Reset error indicator, which can typically something like invalid
      format from opening up the .o files.  */
   bfd_set_error (bfd_error_no_error);
+  lang_clear_os_map ();
   lang_for_each_statement (build_link_order);
 
   if (config.split_by_reloc != (unsigned) -1
This page took 0.028031 seconds and 4 git commands to generate.