Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/bfd.c bfd/bfd.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/bfd.c	2013-05-14 16:39:24.681717759 +0100
Nick Clifton d43b72
--- bfd/bfd.c	2013-05-14 16:40:06.988718932 +0100
Nick Clifton d43b72
*************** CODE_FRAGMENT
Nick Clifton d43b72
*** 43,48 ****
Nick Clifton d43b72
--- 43,56 ----
Nick Clifton d43b72
  .    both_direction = 3
Nick Clifton d43b72
  .  };
Nick Clifton d43b72
  .
Nick Clifton d43b72
+ .enum bfd_lto_object_type
Nick Clifton d43b72
+ .  {
Nick Clifton d43b72
+ .    lto_non_object,
Nick Clifton d43b72
+ .    lto_non_ir_object,
Nick Clifton d43b72
+ .    lto_ir_object,
Nick Clifton d43b72
+ .    lto_mixed_object
Nick Clifton d43b72
+ .  };
Nick Clifton d43b72
+ .
Nick Clifton d43b72
  .struct bfd
Nick Clifton d43b72
  .{
Nick Clifton d43b72
  .  {* A unique identifier of the BFD  *}
Nick Clifton d43b72
*************** CODE_FRAGMENT
Nick Clifton d43b72
*** 190,195 ****
Nick Clifton d43b72
--- 198,206 ----
Nick Clifton d43b72
  .  {* The last section on the section list.  *}
Nick Clifton d43b72
  .  struct bfd_section *section_last;
Nick Clifton d43b72
  .
Nick Clifton d43b72
+ .  {* The object-only section on the section list.  *}
Nick Clifton d43b72
+ .  struct bfd_section *object_only_section;
Nick Clifton d43b72
+ .
Nick Clifton d43b72
  .  {* The number of sections.  *}
Nick Clifton d43b72
  .  unsigned int section_count;
Nick Clifton d43b72
  .
Nick Clifton d43b72
*************** CODE_FRAGMENT
Nick Clifton d43b72
*** 308,313 ****
Nick Clifton d43b72
--- 319,327 ----
Nick Clifton d43b72
  .  {* Set if only required symbols should be added in the link hash table for
Nick Clifton d43b72
  .     this object.  Used by VMS linkers.  *}
Nick Clifton d43b72
  .  unsigned int selective_search : 1;
Nick Clifton d43b72
+ .
Nick Clifton d43b72
+ .  {* LTO object type.  *}
Nick Clifton d43b72
+ .  unsigned int lto_type : 2;
Nick Clifton d43b72
  .};
Nick Clifton d43b72
  .
Nick Clifton d43b72
  */
Nick Clifton d43b72
*************** bfd_demangle (bfd *abfd, const char *nam
Nick Clifton d43b72
*** 2026,2028 ****
Nick Clifton d43b72
--- 2040,2075 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    return res;
Nick Clifton d43b72
  }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /*
Nick Clifton d43b72
+ FUNCTION
Nick Clifton d43b72
+ 	bfd_group_signature
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ SYNOPSIS
Nick Clifton d43b72
+ 	asymbol *bfd_group_signature (asection *group, asymbol **isympp);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ DESCRIPTION
Nick Clifton d43b72
+ 	Return a pointer to the symbol used as a signature for GROUP.
Nick Clifton d43b72
+ */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ asymbol *
Nick Clifton d43b72
+ bfd_group_signature (asection *group, asymbol **isympp)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   bfd *abfd = group->owner;
Nick Clifton d43b72
+   Elf_Internal_Shdr *ghdr;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
Nick Clifton d43b72
+     return NULL;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ghdr = &elf_section_data (group)->this_hdr;
Nick Clifton d43b72
+   if (ghdr->sh_link < elf_numsections (abfd))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
Nick Clifton d43b72
+       Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (symhdr->sh_type == SHT_SYMTAB
Nick Clifton d43b72
+ 	  && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
Nick Clifton d43b72
+ 	return isympp[ghdr->sh_info - 1];
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   return NULL;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/bfd-in2.h bfd/bfd-in2.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/bfd-in2.h	2013-05-14 16:39:24.640717758 +0100
Nick Clifton d43b72
--- bfd/bfd-in2.h	2013-05-14 16:42:03.217722154 +0100
Nick Clifton d43b72
*************** struct bfd_section *bfd_create_gnu_debug
Nick Clifton d43b72
*** 1050,1055 ****
Nick Clifton d43b72
--- 1050,1058 ----
Nick Clifton d43b72
  bfd_boolean bfd_fill_in_gnu_debuglink_section
Nick Clifton d43b72
     (bfd *abfd, struct bfd_section *sect, const char *filename);
Nick Clifton d43b72
  
Nick Clifton d43b72
+ const char *bfd_extract_object_only_section
Nick Clifton d43b72
+    (bfd *abfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* Extracted from libbfd.c.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  /* Byte swapping macros for user section data.  */
Nick Clifton d43b72
*************** extern asection std_section[4];
Nick Clifton d43b72
*** 1594,1599 ****
Nick Clifton d43b72
--- 1597,1605 ----
Nick Clifton d43b72
    || ((SEC) == bfd_com_section_ptr)            \
Nick Clifton d43b72
    || ((SEC) == bfd_ind_section_ptr))
Nick Clifton d43b72
  
Nick Clifton d43b72
+ /* GNU object-only section name.  */
Nick Clifton d43b72
+ #define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only"
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* Macros to handle insertion and deletion of a bfd's sections.  These
Nick Clifton d43b72
     only handle the list pointers, ie. do not adjust section_count,
Nick Clifton d43b72
     target_index etc.  */
Nick Clifton d43b72
*************** enum bfd_direction
Nick Clifton d43b72
*** 5681,5686 ****
Nick Clifton d43b72
--- 5687,5700 ----
Nick Clifton d43b72
      both_direction = 3
Nick Clifton d43b72
    };
Nick Clifton d43b72
  
Nick Clifton d43b72
+ enum bfd_lto_object_type
Nick Clifton d43b72
+   {
Nick Clifton d43b72
+     lto_non_object,
Nick Clifton d43b72
+     lto_non_ir_object,
Nick Clifton d43b72
+     lto_ir_object,
Nick Clifton d43b72
+     lto_mixed_object
Nick Clifton d43b72
+   };
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  struct bfd
Nick Clifton d43b72
  {
Nick Clifton d43b72
    /* A unique identifier of the BFD  */
Nick Clifton d43b72
*************** struct bfd
Nick Clifton d43b72
*** 5828,5833 ****
Nick Clifton d43b72
--- 5842,5850 ----
Nick Clifton d43b72
    /* The last section on the section list.  */
Nick Clifton d43b72
    struct bfd_section *section_last;
Nick Clifton d43b72
  
Nick Clifton d43b72
+   /* The object-only section on the section list.  */
Nick Clifton d43b72
+   struct bfd_section *object_only_section;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    /* The number of sections.  */
Nick Clifton d43b72
    unsigned int section_count;
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** struct bfd
Nick Clifton d43b72
*** 5946,5951 ****
Nick Clifton d43b72
--- 5963,5971 ----
Nick Clifton d43b72
    /* Set if only required symbols should be added in the link hash table for
Nick Clifton d43b72
       this object.  Used by VMS linkers.  */
Nick Clifton d43b72
    unsigned int selective_search : 1;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* LTO object type.  */
Nick Clifton d43b72
+   unsigned int lto_type : 2;
Nick Clifton d43b72
  };
Nick Clifton d43b72
  
Nick Clifton d43b72
  typedef enum bfd_error
Nick Clifton d43b72
*************** void bfd_emul_set_commonpagesize (const
Nick Clifton d43b72
*** 6167,6172 ****
Nick Clifton d43b72
--- 6187,6194 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
  char *bfd_demangle (bfd *, const char *, int);
Nick Clifton d43b72
  
Nick Clifton d43b72
+ asymbol *bfd_group_signature (asection *group, asymbol **isympp);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* Extracted from archive.c.  */
Nick Clifton d43b72
  symindex bfd_get_next_mapent
Nick Clifton d43b72
     (bfd *abfd, symindex previous, carsym **sym);
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/elf.c bfd/elf.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/elf.c	2013-05-14 16:39:25.317717777 +0100
Nick Clifton d43b72
--- bfd/elf.c	2013-05-14 16:40:06.993718932 +0100
Nick Clifton d43b72
*************** static const struct bfd_elf_special_sect
Nick Clifton d43b72
*** 2092,2097 ****
Nick Clifton d43b72
--- 2092,2098 ----
Nick Clifton d43b72
    { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS,      SHF_ALLOC + SHF_WRITE },
Nick Clifton d43b72
    { STRING_COMMA_LEN (".gnu.lto_"),       -1, SHT_PROGBITS,    SHF_EXCLUDE },
Nick Clifton d43b72
    { STRING_COMMA_LEN (".got"),             0, SHT_PROGBITS,    SHF_ALLOC + SHF_WRITE },
Nick Clifton d43b72
+   { STRING_COMMA_LEN (".gnu_object_only"), 0, SHT_GNU_OBJECT_ONLY, SHF_EXCLUDE },
Nick Clifton d43b72
    { STRING_COMMA_LEN (".gnu.version"),     0, SHT_GNU_versym,  0 },
Nick Clifton d43b72
    { STRING_COMMA_LEN (".gnu.version_d"),   0, SHT_GNU_verdef,  0 },
Nick Clifton d43b72
    { STRING_COMMA_LEN (".gnu.version_r"),   0, SHT_GNU_verneed, 0 },
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/elflink.c bfd/elflink.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/elflink.c	2013-05-14 16:39:25.280717776 +0100
Nick Clifton d43b72
--- bfd/elflink.c	2013-05-14 16:40:06.997718932 +0100
Nick Clifton d43b72
*************** elf_link_add_archive_symbols (bfd *abfd,
Nick Clifton d43b72
*** 5127,5132 ****
Nick Clifton d43b72
--- 5127,5135 ----
Nick Clifton d43b72
  	     something wrong with the archive.  */
Nick Clifton d43b72
  	  if (element->archive_pass != 0)
Nick Clifton d43b72
  	    {
Nick Clifton d43b72
+ 	      /* Don't load the IR archive member twice.  */
Nick Clifton d43b72
+ 	      if (element->lto_type == lto_ir_object)
Nick Clifton d43b72
+ 		continue;
Nick Clifton d43b72
  	      bfd_set_error (bfd_error_bad_value);
Nick Clifton d43b72
  	      goto error_return;
Nick Clifton d43b72
  	    }
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/format.c bfd/format.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/format.c	2013-05-14 16:39:24.265717748 +0100
Nick Clifton d43b72
--- bfd/format.c	2013-05-14 16:40:07.006718933 +0100
Nick Clifton d43b72
*************** bfd_check_format (bfd *abfd, bfd_format
Nick Clifton d43b72
*** 95,100 ****
Nick Clifton d43b72
--- 95,127 ----
Nick Clifton d43b72
    return bfd_check_format_matches (abfd, format, NULL);
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
+ /* Set lto_type in ABFD.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ bfd_set_lto_type (bfd *abfd)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   if (abfd->format == bfd_object
Nick Clifton d43b72
+       && abfd->lto_type == lto_non_object
Nick Clifton d43b72
+       && (abfd->flags & (DYNAMIC | EXEC_P)) == 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       asection *sec;
Nick Clifton d43b72
+       enum bfd_lto_object_type type = lto_non_ir_object;
Nick Clifton d43b72
+       for (sec = abfd->sections; sec != NULL; sec = sec->next)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  if (strcmp (sec->name, GNU_OBJECT_ONLY_SECTION_NAME) == 0)
Nick Clifton d43b72
+ 	    {
Nick Clifton d43b72
+ 	      type = lto_mixed_object;
Nick Clifton d43b72
+ 	      abfd->object_only_section = sec;
Nick Clifton d43b72
+ 	      break;
Nick Clifton d43b72
+ 	    }
Nick Clifton d43b72
+ 	  else if (type != lto_ir_object
Nick Clifton d43b72
+ 		   && strncmp (sec->name, ".gnu.lto_", 9) == 0)
Nick Clifton d43b72
+ 	    type = lto_ir_object;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       abfd->lto_type = type;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton 5b79e0
  struct bfd_preserve
Nick Clifton 5b79e0
  {
Nick Clifton 5b79e0
    void *marker;
Nick Clifton d43b72
*************** bfd_check_format_matches (bfd *abfd, bfd
Nick Clifton d43b72
*** 136,142 ****
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (abfd->format != bfd_unknown)
Nick Clifton d43b72
!     return abfd->format == format;
Nick Clifton d43b72
  
Nick Clifton 5b79e0
    if (matching != NULL || *bfd_associated_vector != NULL)
Nick Clifton 5b79e0
      {
Nick Clifton d43b72
--- 163,172 ----
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (abfd->format != bfd_unknown)
Nick Clifton d43b72
!     {
Nick Clifton d43b72
!       bfd_set_lto_type (abfd);
Nick Clifton d43b72
!       return abfd->format == format;
Nick Clifton d43b72
!     }
Nick Clifton d43b72
  
Nick Clifton 5b79e0
    if (matching != NULL || *bfd_associated_vector != NULL)
Nick Clifton 5b79e0
      {
Nick Clifton d43b72
*************** bfd_check_format_matches (bfd *abfd, bfd
Nick Clifton d43b72
*** 322,327 ****
Nick Clifton d43b72
--- 352,360 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
        if (matching_vector)
Nick Clifton d43b72
  	free (matching_vector);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       bfd_set_lto_type (abfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  
Nick Clifton 5b79e0
        /* File position has moved, BTW.  */
Nick Clifton 5b79e0
        return TRUE;
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/opncls.c bfd/opncls.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/opncls.c	2013-05-14 16:39:23.701717732 +0100
Nick Clifton d43b72
--- bfd/opncls.c	2013-05-14 16:40:07.008718933 +0100
Nick Clifton d43b72
*************** bfd_fill_in_gnu_debuglink_section (bfd *
Nick Clifton d43b72
*** 1569,1571 ****
Nick Clifton d43b72
--- 1569,1637 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    return TRUE;
Nick Clifton d43b72
  }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /*
Nick Clifton d43b72
+ FUNCTION
Nick Clifton d43b72
+ 	bfd_extract_object_only_section
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ SYNOPSIS
Nick Clifton d43b72
+ 	const char *bfd_extract_object_only_section
Nick Clifton d43b72
+ 	  (bfd *abfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ DESCRIPTION
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	Takes a @var{ABFD} and extract the .gnu_object_only section into
Nick Clifton d43b72
+ 	a temporary file.
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ RETURNS
Nick Clifton d43b72
+ 	The name of the temporary file is returned if all is ok.
Nick Clifton d43b72
+ 	Otherwise <<NULL>> is returned and bfd_error is set.
Nick Clifton d43b72
+ */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ const char *
Nick Clifton d43b72
+ bfd_extract_object_only_section (bfd *abfd)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   asection *sec = abfd->object_only_section;
Nick Clifton d43b72
+   const char *name;
Nick Clifton d43b72
+   FILE *file;
Nick Clifton d43b72
+   bfd_byte *memhunk = NULL;
Nick Clifton d43b72
+   size_t off, size;
Nick Clifton d43b72
+   bfd_error_type err;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Get a temporary object-only file.  */
Nick Clifton d43b72
+   name = make_temp_file (".obj-only.o");
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Open the object-only file.  */
Nick Clifton d43b72
+   file = real_fopen (name, FOPEN_WB);
Nick Clifton d43b72
+   if (!bfd_get_full_section_contents (abfd, sec, &memhunk))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_get_error ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ loser:
Nick Clifton d43b72
+       free (memhunk);
Nick Clifton d43b72
+       fclose (file);
Nick Clifton d43b72
+       unlink (name);
Nick Clifton d43b72
+       bfd_set_error (err);
Nick Clifton d43b72
+       return NULL;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   off = 0;
Nick Clifton d43b72
+   size = sec->size;
Nick Clifton d43b72
+   while (off != size)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       size_t written, nwrite = size - off;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       written = fwrite (memhunk + off, 1, nwrite, file);
Nick Clifton d43b72
+       if (written < nwrite && ferror (file))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  err = bfd_error_system_call;
Nick Clifton d43b72
+ 	  goto loser;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       off += written;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   free (memhunk);
Nick Clifton d43b72
+   fclose (file);
Nick Clifton d43b72
+   return name;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/plugin.c bfd/plugin.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/plugin.c	2013-05-14 16:39:25.137717772 +0100
Nick Clifton d43b72
--- bfd/plugin.c	2013-05-14 16:40:07.010718933 +0100
Nick Clifton d43b72
*************** register_claim_file (ld_plugin_claim_fil
Nick Clifton d43b72
*** 130,135 ****
Nick Clifton d43b72
--- 130,268 ----
Nick Clifton d43b72
    return LDPS_OK;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
+ static asection bfd_plugin_fake_text_section
Nick Clifton d43b72
+   = BFD_FAKE_SECTION (bfd_plugin_fake_text_section, 0, 0, ".text", 0);
Nick Clifton d43b72
+ static asection bfd_plugin_fake_common_section
Nick Clifton d43b72
+   = BFD_FAKE_SECTION (bfd_plugin_fake_common_section, SEC_IS_COMMON, 0,
Nick Clifton d43b72
+ 		      NULL, 0);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Get symbols from object only section.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ bfd_plugin_get_symbols_in_object_only (bfd *abfd)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
Nick Clifton d43b72
+   const char *object_only_file;
Nick Clifton d43b72
+   bfd *nbfd;
Nick Clifton d43b72
+   long storage;
Nick Clifton d43b72
+   long object_only_nsyms, added_nsyms, i;
Nick Clifton d43b72
+   asymbol **object_only_syms, **added_syms;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   plugin_data->object_only_syms = NULL;
Nick Clifton d43b72
+   plugin_data->object_only_nsyms = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (abfd->sections == NULL && abfd->my_archive == NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       nbfd = bfd_openr (abfd->filename, NULL);
Nick Clifton d43b72
+       if (nbfd == NULL || !bfd_check_format (nbfd, bfd_object))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  (*_bfd_error_handler)
Nick Clifton d43b72
+ 	    (_("%s: failed to open to extract object only section: %s"),
Nick Clifton d43b72
+ 	     abfd->filename, bfd_errmsg (bfd_get_error ()));
Nick Clifton d43b72
+ 	  bfd_close (nbfd);
Nick Clifton d43b72
+ 	  return;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       if (!bfd_check_format (abfd, bfd_object))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  (*_bfd_error_handler)
Nick Clifton d43b72
+ 	    (_("%B: invalid file to extract object only section: %s"),
Nick Clifton d43b72
+ 	     abfd, bfd_errmsg (bfd_get_error ()));
Nick Clifton d43b72
+ 	  return;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       nbfd = abfd;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (nbfd->lto_type == lto_mixed_object
Nick Clifton d43b72
+       && (nbfd->flags & HAS_SYMS) != 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       object_only_file = bfd_extract_object_only_section (nbfd);
Nick Clifton d43b72
+       if (object_only_file == NULL)
Nick Clifton d43b72
+ 	(*_bfd_error_handler)
Nick Clifton d43b72
+ 	  (_("%B: failed to extract object only section: %s"),
Nick Clifton d43b72
+ 	   abfd, bfd_errmsg (bfd_get_error ()));
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
+     object_only_file = NULL;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Close the new bfd we just opened.  */
Nick Clifton d43b72
+   if (nbfd != abfd)
Nick Clifton d43b72
+     bfd_close (nbfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Return if there is no object only section or there is no
Nick Clifton d43b72
+      symbol in object only section.  */
Nick Clifton d43b72
+   if (!object_only_file)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Open the file containing object only section.  */
Nick Clifton d43b72
+   nbfd = bfd_openr (object_only_file, NULL);
Nick Clifton d43b72
+   if (!bfd_check_format (nbfd, bfd_object))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       (*_bfd_error_handler)
Nick Clifton d43b72
+ 	(_("%B: failed to open object only section: %s"),
Nick Clifton d43b72
+ 	 abfd, bfd_errmsg (bfd_get_error ()));
Nick Clifton d43b72
+       goto quit;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   storage = bfd_get_symtab_upper_bound (nbfd);
Nick Clifton d43b72
+   if (storage <= 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       if (storage < 0)
Nick Clifton d43b72
+ 	(*_bfd_error_handler)
Nick Clifton d43b72
+ 	  (_("%B: failed to get symbol table in object only section: %s"),
Nick Clifton d43b72
+ 	   abfd, bfd_errmsg (bfd_get_error ()));
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       goto quit;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   object_only_syms = (asymbol **) bfd_malloc (storage);
Nick Clifton d43b72
+   object_only_nsyms = bfd_canonicalize_symtab (nbfd, object_only_syms);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* FIXME: We waste some spaces if not all symbols are copied.  */
Nick Clifton d43b72
+   added_syms = (asymbol **) bfd_alloc (abfd, storage);
Nick Clifton d43b72
+   added_nsyms = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Copy only global symbols from object only section.  */
Nick Clifton d43b72
+   for (i = 0; i < object_only_nsyms; i++)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       asection *sec = object_only_syms[i]->section;
Nick Clifton d43b72
+       flagword flags = object_only_syms[i]->flags;
Nick Clifton d43b72
+       asymbol *s;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (bfd_is_com_section (sec))
Nick Clifton d43b72
+ 	sec = &bfd_plugin_fake_common_section;
Nick Clifton d43b72
+       else if (bfd_is_und_section (sec))
Nick Clifton d43b72
+ 	;
Nick Clifton d43b72
+       else if ((flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0)
Nick Clifton d43b72
+ 	sec = &bfd_plugin_fake_text_section;
Nick Clifton d43b72
+       else
Nick Clifton d43b72
+ 	continue;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       s = bfd_alloc (abfd, sizeof (asymbol)); 
Nick Clifton d43b72
+       BFD_ASSERT (s);
Nick Clifton d43b72
+       added_syms[added_nsyms++] = s;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       s->section = sec;
Nick Clifton d43b72
+       s->the_bfd = abfd;
Nick Clifton d43b72
+       s->name = xstrdup (object_only_syms[i]->name);
Nick Clifton d43b72
+       s->value = 0;
Nick Clifton d43b72
+       s->flags = flags;
Nick Clifton d43b72
+       s->udata.p = NULL;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   plugin_data->object_only_syms = added_syms;
Nick Clifton d43b72
+   plugin_data->object_only_nsyms = added_nsyms;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   free (object_only_syms);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ quit:
Nick Clifton d43b72
+   /* Close and remove the object only section file.  */
Nick Clifton d43b72
+   bfd_close (nbfd);
Nick Clifton d43b72
+   unlink (object_only_file);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  static enum ld_plugin_status
Nick Clifton d43b72
  add_symbols (void * handle,
Nick Clifton d43b72
  	     int nsyms,
Nick Clifton d43b72
*************** add_symbols (void * handle,
Nick Clifton d43b72
*** 142,148 ****
Nick Clifton d43b72
    plugin_data->nsyms = nsyms;
Nick Clifton d43b72
    plugin_data->syms = syms;
Nick Clifton d43b72
  
Nick Clifton d43b72
!   if (nsyms != 0)
Nick Clifton d43b72
      abfd->flags |= HAS_SYMS;
Nick Clifton d43b72
  
Nick Clifton d43b72
    abfd->tdata.plugin_data = plugin_data;
Nick Clifton d43b72
--- 275,283 ----
Nick Clifton d43b72
    plugin_data->nsyms = nsyms;
Nick Clifton d43b72
    plugin_data->syms = syms;
Nick Clifton d43b72
  
Nick Clifton d43b72
!   bfd_plugin_get_symbols_in_object_only (abfd);
Nick Clifton d43b72
! 
Nick Clifton d43b72
!   if ((nsyms + plugin_data->object_only_nsyms) != 0)
Nick Clifton d43b72
      abfd->flags |= HAS_SYMS;
Nick Clifton d43b72
  
Nick Clifton d43b72
    abfd->tdata.plugin_data = plugin_data;
Nick Clifton d43b72
*************** static long
Nick Clifton d43b72
*** 389,395 ****
Nick Clifton d43b72
  bfd_plugin_get_symtab_upper_bound (bfd *abfd)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
Nick Clifton d43b72
!   long nsyms = plugin_data->nsyms;
Nick Clifton d43b72
  
Nick Clifton d43b72
    BFD_ASSERT (nsyms >= 0);
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 524,531 ----
Nick Clifton d43b72
  bfd_plugin_get_symtab_upper_bound (bfd *abfd)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
Nick Clifton d43b72
!   /* Add symbols from object only section.  */
Nick Clifton d43b72
!   long nsyms = plugin_data->nsyms + plugin_data->object_only_nsyms;
Nick Clifton d43b72
  
Nick Clifton d43b72
    BFD_ASSERT (nsyms >= 0);
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** bfd_plugin_canonicalize_symtab (bfd *abf
Nick Clifton d43b72
*** 423,434 ****
Nick Clifton d43b72
    struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
Nick Clifton d43b72
    long nsyms = plugin_data->nsyms;
Nick Clifton d43b72
    const struct ld_plugin_symbol *syms = plugin_data->syms;
Nick Clifton d43b72
!   static asection fake_section;
Nick Clifton d43b72
!   static asection fake_common_section;
Nick Clifton d43b72
!   int i;
Nick Clifton d43b72
! 
Nick Clifton d43b72
!   fake_section.name = ".text";
Nick Clifton d43b72
!   fake_common_section.flags = SEC_IS_COMMON;
Nick Clifton d43b72
  
Nick Clifton d43b72
    for (i = 0; i < nsyms; i++)
Nick Clifton d43b72
      {
Nick Clifton d43b72
--- 559,565 ----
Nick Clifton d43b72
    struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
Nick Clifton d43b72
    long nsyms = plugin_data->nsyms;
Nick Clifton d43b72
    const struct ld_plugin_symbol *syms = plugin_data->syms;
Nick Clifton d43b72
!   int i, j;
Nick Clifton d43b72
  
Nick Clifton d43b72
    for (i = 0; i < nsyms; i++)
Nick Clifton d43b72
      {
Nick Clifton d43b72
*************** bfd_plugin_canonicalize_symtab (bfd *abf
Nick Clifton d43b72
*** 441,450 ****
Nick Clifton d43b72
        s->name = syms[i].name;
Nick Clifton d43b72
        s->value = 0;
Nick Clifton d43b72
        s->flags = convert_flags (&syms[i]);
Nick Clifton d43b72
        switch (syms[i].def)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
  	case LDPK_COMMON:
Nick Clifton d43b72
! 	  s->section = &fake_common_section;
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	case LDPK_UNDEF:
Nick Clifton d43b72
  	case LDPK_WEAKUNDEF:
Nick Clifton d43b72
--- 572,582 ----
Nick Clifton d43b72
        s->name = syms[i].name;
Nick Clifton d43b72
        s->value = 0;
Nick Clifton d43b72
        s->flags = convert_flags (&syms[i]);
Nick Clifton d43b72
+       s->udata.p = NULL;
Nick Clifton d43b72
        switch (syms[i].def)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
  	case LDPK_COMMON:
Nick Clifton d43b72
! 	  s->section = &bfd_plugin_fake_common_section;
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	case LDPK_UNDEF:
Nick Clifton d43b72
  	case LDPK_WEAKUNDEF:
Nick Clifton d43b72
*************** bfd_plugin_canonicalize_symtab (bfd *abf
Nick Clifton d43b72
*** 452,466 ****
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	case LDPK_DEF:
Nick Clifton d43b72
  	case LDPK_WEAKDEF:
Nick Clifton d43b72
! 	  s->section = &fake_section;
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	default:
Nick Clifton d43b72
  	  BFD_ASSERT (0);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
- 
Nick Clifton d43b72
-       s->udata.p = (void *) &syms[i];
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
    return nsyms;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 584,601 ----
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	case LDPK_DEF:
Nick Clifton d43b72
  	case LDPK_WEAKDEF:
Nick Clifton d43b72
! 	  s->section = &bfd_plugin_fake_text_section;
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
  	default:
Nick Clifton d43b72
  	  BFD_ASSERT (0);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
+   /* Copy symbols from object only section.  */
Nick Clifton d43b72
+   nsyms += plugin_data->object_only_nsyms;
Nick Clifton d43b72
+   for (j = 0; j < plugin_data->object_only_nsyms; j++, i++)
Nick Clifton d43b72
+     alocation[i] = plugin_data->object_only_syms[j];
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    return nsyms;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/plugin.h bfd/plugin.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/plugin.h	2013-05-14 16:39:25.481717782 +0100
Nick Clifton d43b72
--- bfd/plugin.h	2013-05-14 16:40:07.010718933 +0100
Nick Clifton d43b72
*************** typedef struct plugin_data_struct
Nick Clifton d43b72
*** 30,35 ****
Nick Clifton d43b72
--- 30,37 ----
Nick Clifton d43b72
  {
Nick Clifton d43b72
    int nsyms;
Nick Clifton d43b72
    const struct ld_plugin_symbol *syms;
Nick Clifton d43b72
+   int object_only_nsyms;
Nick Clifton d43b72
+   asymbol **object_only_syms;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  plugin_data_struct;
Nick Clifton d43b72
  
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/bfd/section.c bfd/section.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/bfd/section.c	2013-05-14 16:39:26.180717801 +0100
Nick Clifton d43b72
--- bfd/section.c	2013-05-14 16:43:06.082723897 +0100
Nick Clifton d43b72
*************** CODE_FRAGMENT
Nick Clifton d43b72
*** 571,576 ****
Nick Clifton d43b72
--- 571,579 ----
Nick Clifton d43b72
  .  || ((SEC) == bfd_com_section_ptr)		\
Nick Clifton d43b72
  .  || ((SEC) == bfd_ind_section_ptr))
Nick Clifton d43b72
  .
Nick Clifton d43b72
+ .{* GNU object-only section name.  *}
Nick Clifton d43b72
+ .#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only"
Nick Clifton d43b72
+ .
Nick Clifton d43b72
  .{* Macros to handle insertion and deletion of a bfd's sections.  These
Nick Clifton d43b72
  .   only handle the list pointers, ie. do not adjust section_count,
Nick Clifton d43b72
  .   target_index etc.  *}
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/binutils/objcopy.c binutils/objcopy.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/binutils/objcopy.c	2013-05-14 16:39:36.214718079 +0100
Nick Clifton d43b72
--- binutils/objcopy.c	2013-05-14 16:45:04.631727183 +0100
Nick Clifton d43b72
*************** is_specified_symbol (const char *name, h
Nick Clifton d43b72
*** 943,972 ****
Nick Clifton d43b72
    return htab_find (htab, name) != NULL;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
- /* Return a pointer to the symbol used as a signature for GROUP.  */
Nick Clifton d43b72
- 
Nick Clifton d43b72
- static asymbol *
Nick Clifton d43b72
- group_signature (asection *group)
Nick Clifton d43b72
- {
Nick Clifton d43b72
-   bfd *abfd = group->owner;
Nick Clifton d43b72
-   Elf_Internal_Shdr *ghdr;
Nick Clifton d43b72
- 
Nick Clifton d43b72
-   if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
Nick Clifton d43b72
-     return NULL;
Nick Clifton d43b72
- 
Nick Clifton d43b72
-   ghdr = &elf_section_data (group)->this_hdr;
Nick Clifton d43b72
-   if (ghdr->sh_link < elf_numsections (abfd))
Nick Clifton d43b72
-     {
Nick Clifton d43b72
-       const struct elf_backend_data *bed = get_elf_backend_data (abfd);
Nick Clifton d43b72
-       Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
Nick Clifton d43b72
- 
Nick Clifton d43b72
-       if (symhdr->sh_type == SHT_SYMTAB
Nick Clifton d43b72
- 	  && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
Nick Clifton d43b72
- 	return isympp[ghdr->sh_info - 1];
Nick Clifton d43b72
-     }
Nick Clifton d43b72
-   return NULL;
Nick Clifton d43b72
- }
Nick Clifton d43b72
- 
Nick Clifton d43b72
  /* Return TRUE if the section is a DWO section.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  static bfd_boolean
Nick Clifton d43b72
--- 943,948 ----
Nick Clifton d43b72
*************** is_strip_section (bfd *abfd ATTRIBUTE_UN
Nick Clifton d43b72
*** 1034,1040 ****
Nick Clifton d43b72
        /* PR binutils/3181
Nick Clifton d43b72
  	 If we are going to strip the group signature symbol, then
Nick Clifton d43b72
  	 strip the group section too.  */
Nick Clifton d43b72
!       gsym = group_signature (sec);
Nick Clifton d43b72
        if (gsym != NULL)
Nick Clifton d43b72
  	gname = gsym->name;
Nick Clifton d43b72
        else
Nick Clifton d43b72
--- 1010,1016 ----
Nick Clifton d43b72
        /* PR binutils/3181
Nick Clifton d43b72
  	 If we are going to strip the group signature symbol, then
Nick Clifton d43b72
  	 strip the group section too.  */
Nick Clifton d43b72
!       gsym = bfd_group_signature (sec, isympp);
Nick Clifton d43b72
        if (gsym != NULL)
Nick Clifton d43b72
  	gname = gsym->name;
Nick Clifton d43b72
        else
Nick Clifton d43b72
*************** setup_section (bfd *ibfd, sec_ptr isecti
Nick Clifton d43b72
*** 2633,2639 ****
Nick Clifton d43b72
  
Nick Clifton d43b72
    if ((isection->flags & SEC_GROUP) != 0)
Nick Clifton d43b72
      {
Nick Clifton d43b72
!       asymbol *gsym = group_signature (isection);
Nick Clifton d43b72
  
Nick Clifton d43b72
        if (gsym != NULL)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
--- 2609,2615 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    if ((isection->flags & SEC_GROUP) != 0)
Nick Clifton d43b72
      {
Nick Clifton d43b72
!       asymbol *gsym = bfd_group_signature (isection, isympp);
Nick Clifton d43b72
  
Nick Clifton d43b72
        if (gsym != NULL)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/binutils/readelf.c binutils/readelf.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/binutils/readelf.c	2013-05-14 16:39:35.668718064 +0100
Nick Clifton d43b72
--- binutils/readelf.c	2013-05-14 16:40:07.022718933 +0100
Nick Clifton d43b72
*************** get_section_type_name (unsigned int sh_t
Nick Clifton d43b72
*** 3101,3106 ****
Nick Clifton d43b72
--- 3101,3107 ----
Nick Clifton d43b72
      case 0x7ffffffd:		return "AUXILIARY";
Nick Clifton d43b72
      case 0x7fffffff:		return "FILTER";
Nick Clifton d43b72
      case SHT_GNU_LIBLIST:	return "GNU_LIBLIST";
Nick Clifton d43b72
+     case SHT_GNU_OBJECT_ONLY:	return "GNU_OBJECT_ONLY";
Nick Clifton d43b72
  
Nick Clifton d43b72
      default:
Nick Clifton d43b72
        if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/include/bfdlink.h include/bfdlink.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/include/bfdlink.h	2013-05-14 16:39:19.745717623 +0100
Nick Clifton d43b72
--- include/bfdlink.h	2013-05-14 16:40:07.023718933 +0100
Nick Clifton d43b72
*************** struct bfd_link_info
Nick Clifton d43b72
*** 380,385 ****
Nick Clifton d43b72
--- 380,391 ----
Nick Clifton d43b72
    /* TRUE if ok to have multiple definition.  */
Nick Clifton d43b72
    unsigned int allow_multiple_definition: 1;
Nick Clifton d43b72
  
Nick Clifton d43b72
+   /* TRUE if .gnu_object_only section should be created.  */
Nick Clifton d43b72
+   unsigned int emit_gnu_object_only: 1;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* TRUE if .gnu_object_only section is being created.  */
Nick Clifton d43b72
+   unsigned int emitting_gnu_object_only: 1;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    /* TRUE if ok to have version with no definition.  */
Nick Clifton d43b72
    unsigned int allow_undefined_version: 1;
Nick Clifton d43b72
  
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/include/elf/common.h include/elf/common.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/include/elf/common.h	2013-05-14 16:39:19.628717619 +0100
Nick Clifton d43b72
--- include/elf/common.h	2013-05-14 16:40:07.023718933 +0100
Nick Clifton d43b72
***************
Nick Clifton d43b72
*** 472,477 ****
Nick Clifton d43b72
--- 472,478 ----
Nick Clifton d43b72
  #define SHT_GNU_ATTRIBUTES 0x6ffffff5	/* Object attributes */
Nick Clifton d43b72
  #define SHT_GNU_HASH	0x6ffffff6	/* GNU style symbol hash table */
Nick Clifton d43b72
  #define SHT_GNU_LIBLIST	0x6ffffff7	/* List of prelink dependencies */
Nick Clifton d43b72
+ #define SHT_GNU_OBJECT_ONLY 0x6ffffff8	/* Object only */
Nick Clifton d43b72
  
Nick Clifton d43b72
  /* The next three section types are defined by Solaris, and are named
Nick Clifton d43b72
     SHT_SUNW*.  We use them in GNU code, so we also define SHT_GNU*
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/emultempl/alphaelf.em ld/emultempl/alphaelf.em
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/emultempl/alphaelf.em	2013-05-14 16:39:37.461718114 +0100
Nick Clifton d43b72
--- ld/emultempl/alphaelf.em	2013-05-14 16:40:07.030718933 +0100
Nick Clifton d43b72
*************** alpha_finish (void)
Nick Clifton d43b72
*** 100,106 ****
Nick Clifton d43b72
    if (limit_32bit)
Nick Clifton d43b72
      elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT;
Nick Clifton d43b72
  
Nick Clifton d43b72
!   finish_default ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  EOF
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 100,106 ----
Nick Clifton d43b72
    if (limit_32bit)
Nick Clifton d43b72
      elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT;
Nick Clifton d43b72
  
Nick Clifton d43b72
!   gld${EMULATION_NAME}_finish ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  EOF
Nick Clifton d43b72
  
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/emultempl/armelf.em ld/emultempl/armelf.em
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/emultempl/armelf.em	2013-05-14 16:39:37.458718114 +0100
Nick Clifton d43b72
--- ld/emultempl/armelf.em	2013-05-14 16:40:07.033718933 +0100
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_after_allocation (v
Nick Clifton d43b72
*** 366,372 ****
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    struct bfd_link_hash_entry * h;
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 366,372 ----
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! arm_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    struct bfd_link_hash_entry * h;
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
*** 389,395 ****
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
!   finish_default ();
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (thumb_entry_symbol)
Nick Clifton d43b72
      {
Nick Clifton d43b72
--- 389,395 ----
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
!   gld${EMULATION_NAME}_finish ();
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (thumb_entry_symbol)
Nick Clifton d43b72
      {
Nick Clifton d43b72
*************** LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=
Nick Clifton d43b72
*** 690,693 ****
Nick Clifton d43b72
  LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
Nick Clifton d43b72
  
Nick Clifton d43b72
  # Call the extra arm-elf function
Nick Clifton d43b72
! LDEMUL_FINISH=gld${EMULATION_NAME}_finish
Nick Clifton d43b72
--- 690,693 ----
Nick Clifton d43b72
  LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse
Nick Clifton d43b72
  
Nick Clifton d43b72
  # Call the extra arm-elf function
Nick Clifton d43b72
! LDEMUL_FINISH=arm_finish
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/emultempl/elf32.em ld/emultempl/elf32.em
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/emultempl/elf32.em	2013-05-14 16:39:37.465718114 +0100
Nick Clifton d43b72
--- ld/emultempl/elf32.em	2013-05-14 16:40:07.035718933 +0100
Nick Clifton d43b72
*************** static void gld${EMULATION_NAME}_before_
Nick Clifton d43b72
*** 68,73 ****
Nick Clifton d43b72
--- 68,74 ----
Nick Clifton d43b72
  static void gld${EMULATION_NAME}_after_allocation (void);
Nick Clifton d43b72
  static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan
Nick Clifton d43b72
    (asection *, const char *, int);
Nick Clifton d43b72
+ static void gld${EMULATION_NAME}_finish (void);
Nick Clifton d43b72
  EOF
Nick Clifton d43b72
  
Nick Clifton d43b72
  if [ "x${USE_LIBPATH}" = xyes ] ; then
Nick Clifton d43b72
*************** output_rel_find (asection *sec, int isdy
Nick Clifton d43b72
*** 1764,1769 ****
Nick Clifton d43b72
--- 1765,1772 ----
Nick Clifton d43b72
    return last;
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
+ static int orphan_init_done = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* Place an orphan section.  We use this to put random SHF_ALLOC
Nick Clifton d43b72
     sections in the right segment.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_place_orphan (asect
Nick Clifton d43b72
*** 1772,1778 ****
Nick Clifton d43b72
  				   const char *secname,
Nick Clifton d43b72
  				   int constraint)
Nick Clifton d43b72
  {
Nick Clifton d43b72
!   static struct orphan_save hold[] =
Nick Clifton d43b72
      {
Nick Clifton d43b72
        { ".text",
Nick Clifton d43b72
  	SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
Nick Clifton d43b72
--- 1775,1781 ----
Nick Clifton d43b72
  				   const char *secname,
Nick Clifton d43b72
  				   int constraint)
Nick Clifton d43b72
  {
Nick Clifton d43b72
!   static struct orphan_save orig_hold[] =
Nick Clifton d43b72
      {
Nick Clifton d43b72
        { ".text",
Nick Clifton d43b72
  	SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_place_orphan (asect
Nick Clifton d43b72
*** 1799,1804 ****
Nick Clifton d43b72
--- 1802,1808 ----
Nick Clifton d43b72
  	SEC_HAS_CONTENTS,
Nick Clifton d43b72
  	0, 0, 0, 0 },
Nick Clifton d43b72
      };
Nick Clifton d43b72
+   static struct orphan_save hold[ARRAY_SIZE (orig_hold)];
Nick Clifton d43b72
    enum orphan_save_index
Nick Clifton d43b72
      {
Nick Clifton d43b72
        orphan_text = 0,
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_place_orphan (asect
Nick Clifton d43b72
*** 1810,1816 ****
Nick Clifton d43b72
        orphan_sdata,
Nick Clifton d43b72
        orphan_nonalloc
Nick Clifton d43b72
      };
Nick Clifton d43b72
-   static int orphan_init_done = 0;
Nick Clifton d43b72
    struct orphan_save *place;
Nick Clifton d43b72
    lang_output_section_statement_type *after;
Nick Clifton d43b72
    lang_output_section_statement_type *os;
Nick Clifton d43b72
--- 1814,1819 ----
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_place_orphan (asect
Nick Clifton d43b72
*** 1887,1901 ****
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (!orphan_init_done)
Nick Clifton d43b72
      {
Nick Clifton d43b72
!       struct orphan_save *ho;
Nick Clifton d43b72
  
Nick Clifton d43b72
        for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
Nick Clifton d43b72
  	if (ho->name != NULL)
Nick Clifton d43b72
  	  {
Nick Clifton d43b72
  	    ho->os = lang_output_section_find (ho->name);
Nick Clifton d43b72
  	    if (ho->os != NULL && ho->os->flags == 0)
Nick Clifton d43b72
  	      ho->os->flags = ho->flags;
Nick Clifton d43b72
  	  }
Nick Clifton d43b72
        orphan_init_done = 1;
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 1890,1911 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (!orphan_init_done)
Nick Clifton d43b72
      {
Nick Clifton d43b72
!       struct orphan_save *ho, *horig;
Nick Clifton d43b72
  
Nick Clifton d43b72
        for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
Nick Clifton d43b72
+       for (ho = hold, horig = orig_hold;
Nick Clifton d43b72
+ 	   ho < hold + ARRAY_SIZE (hold);
Nick Clifton d43b72
+ 	   ++ho, ++horig)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  *ho = *horig;
Nick Clifton d43b72
+ 	  if (ho->name != NULL)
Nick Clifton d43b72
  	if (ho->name != NULL)
Nick Clifton d43b72
  	  {
Nick Clifton d43b72
  	    ho->os = lang_output_section_find (ho->name);
Nick Clifton d43b72
  	    if (ho->os != NULL && ho->os->flags == 0)
Nick Clifton d43b72
  	      ho->os->flags = ho->flags;
Nick Clifton d43b72
  	  }
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
        orphan_init_done = 1;
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_place_orphan (asect
Nick Clifton d43b72
*** 1965,1970 ****
Nick Clifton d43b72
--- 1975,2001 ----
Nick Clifton d43b72
  EOF
Nick Clifton d43b72
  fi
Nick Clifton d43b72
  
Nick Clifton d43b72
+ fragment <
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Final emulation specific call.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+ EOF
Nick Clifton d43b72
+ if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
Nick Clifton d43b72
+ fragment <
Nick Clifton d43b72
+   /* Support the object-only output.  */
Nick Clifton d43b72
+   if (link_info.emit_gnu_object_only)
Nick Clifton d43b72
+     orphan_init_done = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ EOF
Nick Clifton d43b72
+ fi
Nick Clifton d43b72
+ fragment <
Nick Clifton d43b72
+   finish_default ();
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ EOF
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then
Nick Clifton d43b72
  fragment <
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** struct ld_emulation_xfer_struct ld_${EMU
Nick Clifton d43b72
*** 2497,2503 ****
Nick Clifton d43b72
    ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
Nick Clifton d43b72
    "${EMULATION_NAME}",
Nick Clifton d43b72
    "${OUTPUT_FORMAT}",
Nick Clifton d43b72
!   ${LDEMUL_FINISH-finish_default},
Nick Clifton d43b72
    ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
Nick Clifton d43b72
    ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
Nick Clifton d43b72
    ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
Nick Clifton d43b72
--- 2528,2534 ----
Nick Clifton d43b72
    ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
Nick Clifton d43b72
    "${EMULATION_NAME}",
Nick Clifton d43b72
    "${OUTPUT_FORMAT}",
Nick Clifton d43b72
!   ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
Nick Clifton d43b72
    ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
Nick Clifton d43b72
    ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
Nick Clifton d43b72
    ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/emultempl/ppc64elf.em ld/emultempl/ppc64elf.em
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/emultempl/ppc64elf.em	2013-05-14 16:39:37.454718113 +0100
Nick Clifton d43b72
--- ld/emultempl/ppc64elf.em	2013-05-14 16:40:07.044718934 +0100
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_after_allocation (v
Nick Clifton d43b72
*** 533,539 ****
Nick Clifton d43b72
  /* Final emulation specific call.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    /* e_entry on PowerPC64 points to the function descriptor for
Nick Clifton d43b72
       _start.  If _start is missing, default to the first function
Nick Clifton d43b72
--- 533,539 ----
Nick Clifton d43b72
  /* Final emulation specific call.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! ppc_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    /* e_entry on PowerPC64 points to the function descriptor for
Nick Clifton d43b72
       _start.  If _start is missing, default to the first function
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
*** 565,571 ****
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
    ppc64_elf_restore_symbols (&link_info);
Nick Clifton d43b72
!   finish_default ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 565,571 ----
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
    ppc64_elf_restore_symbols (&link_info);
Nick Clifton d43b72
!   gld${EMULATION_NAME}_finish ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LI
Nick Clifton d43b72
*** 867,872 ****
Nick Clifton d43b72
  #
Nick Clifton d43b72
  LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
Nick Clifton d43b72
  LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
Nick Clifton d43b72
! LDEMUL_FINISH=gld${EMULATION_NAME}_finish
Nick Clifton d43b72
  LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
Nick Clifton d43b72
  LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern
Nick Clifton d43b72
--- 867,872 ----
Nick Clifton d43b72
  #
Nick Clifton d43b72
  LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
Nick Clifton d43b72
  LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
Nick Clifton d43b72
! LDEMUL_FINISH=ppc_finish
Nick Clifton d43b72
  LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
Nick Clifton d43b72
  LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/emultempl/spuelf.em ld/emultempl/spuelf.em
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/emultempl/spuelf.em	2013-05-14 16:39:37.453718113 +0100
Nick Clifton d43b72
--- ld/emultempl/spuelf.em	2013-05-14 16:40:07.045718934 +0100
Nick Clifton d43b72
*************** spu_elf_relink (void)
Nick Clifton d43b72
*** 416,422 ****
Nick Clifton d43b72
  /* Final emulation specific call.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    if (is_spu_target ())
Nick Clifton d43b72
      {
Nick Clifton d43b72
--- 416,422 ----
Nick Clifton d43b72
  /* Final emulation specific call.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  static void
Nick Clifton d43b72
! spu_finish (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
    if (is_spu_target ())
Nick Clifton d43b72
      {
Nick Clifton d43b72
*************** gld${EMULATION_NAME}_finish (void)
Nick Clifton d43b72
*** 432,438 ****
Nick Clifton d43b72
  	einfo ("%P: --auto-overlay ignored with zero local store range\n");
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
!   finish_default ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  static char *
Nick Clifton d43b72
--- 432,438 ----
Nick Clifton d43b72
  	einfo ("%P: --auto-overlay ignored with zero local store range\n");
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
!   gld${EMULATION_NAME}_finish ();
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
  static char *
Nick Clifton d43b72
*************** PARSE_AND_LIST_ARGS_CASES='
Nick Clifton d43b72
*** 832,836 ****
Nick Clifton d43b72
  
Nick Clifton d43b72
  LDEMUL_AFTER_OPEN=spu_after_open
Nick Clifton d43b72
  LDEMUL_BEFORE_ALLOCATION=spu_before_allocation
Nick Clifton d43b72
! LDEMUL_FINISH=gld${EMULATION_NAME}_finish
Nick Clifton d43b72
  LDEMUL_CHOOSE_TARGET=gld${EMULATION_NAME}_choose_target
Nick Clifton d43b72
--- 832,836 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
  LDEMUL_AFTER_OPEN=spu_after_open
Nick Clifton d43b72
  LDEMUL_BEFORE_ALLOCATION=spu_before_allocation
Nick Clifton d43b72
! LDEMUL_FINISH=spu_finish
Nick Clifton d43b72
  LDEMUL_CHOOSE_TARGET=gld${EMULATION_NAME}_choose_target
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldfile.c ld/ldfile.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldfile.c	2013-05-14 16:39:37.164718105 +0100
Nick Clifton d43b72
--- ld/ldfile.c	2013-05-14 16:40:07.046718934 +0100
Nick Clifton d43b72
*************** success:
Nick Clifton d43b72
*** 319,325 ****
Nick Clifton d43b72
--- 319,327 ----
Nick Clifton d43b72
  	  plugin_maybe_claim (&file, entry);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
+     cmdline_check_object_only_section (entry->the_bfd, FALSE);
Nick Clifton d43b72
  
Nick Clifton d43b72
    /* It opened OK, the format checked out, and the plugins have had
Nick Clifton d43b72
       their chance to claim it, so this is success.  */
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldlang.c ld/ldlang.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldlang.c	2013-05-14 16:39:39.704718176 +0100
Nick Clifton d43b72
--- ld/ldlang.c	2013-05-14 17:03:54.030758491 +0100
Nick Clifton d43b72
***************
Nick Clifton d43b72
*** 38,43 ****
Nick Clifton d43b72
--- 38,44 ----
Nick Clifton d43b72
  #include "ldctor.h"
Nick Clifton d43b72
  #include "ldfile.h"
Nick Clifton d43b72
  #include "ldemul.h"
Nick Clifton d43b72
+ #include "ldwrite.h"
Nick Clifton d43b72
  #include "fnmatch.h"
Nick Clifton d43b72
  #include "demangle.h"
Nick Clifton d43b72
  #include "hashtab.h"
Nick Clifton d43b72
***************
Nick Clifton d43b72
*** 46,51 ****
Nick Clifton d43b72
--- 47,55 ----
Nick Clifton d43b72
  #include "plugin.h"
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
  
Nick Clifton d43b72
+ /* FIXME: Put it here to avoid NAME conflict from ldgram.h.  */
Nick Clifton d43b72
+ #include "elf-bfd.h"
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  #ifndef offsetof
Nick Clifton d43b72
  #define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER))
Nick Clifton d43b72
  #endif
Nick Clifton d43b72
*************** static struct bfd_hash_table lang_define
Nick Clifton d43b72
*** 69,74 ****
Nick Clifton d43b72
--- 73,81 ----
Nick Clifton d43b72
  static lang_statement_list_type *stat_save[10];
Nick Clifton d43b72
  static lang_statement_list_type **stat_save_ptr = &stat_save[0];
Nick Clifton d43b72
  static struct unique_sections *unique_section_list;
Nick Clifton d43b72
+ static cmdline_list_type cmdline_object_only_file_list;
Nick Clifton d43b72
+ static cmdline_list_type cmdline_object_only_archive_list;
Nick Clifton d43b72
+ static cmdline_list_type cmdline_temp_object_only_list;
Nick Clifton d43b72
  
Nick Clifton d43b72
  /* Forward declarations.  */
Nick Clifton d43b72
  static void exp_init_os (etree_type *);
Nick Clifton d43b72
*************** static void lang_record_phdrs (void);
Nick Clifton d43b72
*** 89,94 ****
Nick Clifton d43b72
--- 96,105 ----
Nick Clifton d43b72
  static void lang_do_version_exports_section (void);
Nick Clifton d43b72
  static void lang_finalize_version_expr_head
Nick Clifton d43b72
    (struct bfd_elf_version_expr_head *);
Nick Clifton d43b72
+ static void cmdline_lists_init (void);
Nick Clifton d43b72
+ static void cmdline_get_object_only_input_files (void);
Nick Clifton d43b72
+ static void print_cmdline_list (cmdline_union_type *);
Nick Clifton d43b72
+ static bfd_boolean cmdline_on_object_only_archive_list_p (bfd *);
Nick Clifton d43b72
  
Nick Clifton d43b72
  /* Exported variables.  */
Nick Clifton d43b72
  const char *output_target;
Nick Clifton d43b72
*************** output_section_statement_table_free (voi
Nick Clifton d43b72
*** 1204,1217 ****
Nick Clifton d43b72
  /* Build enough state so that the parser can build its tree.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  void
Nick Clifton d43b72
! lang_init (void)
Nick Clifton d43b72
  {
Nick Clifton d43b72
!   obstack_begin (&stat_obstack, 1000);
Nick Clifton d43b72
  
Nick Clifton d43b72
    stat_ptr = &statement_list;
Nick Clifton d43b72
  
Nick Clifton d43b72
    output_section_statement_table_init ();
Nick Clifton d43b72
  
Nick Clifton d43b72
    lang_list_init (stat_ptr);
Nick Clifton d43b72
  
Nick Clifton d43b72
    lang_list_init (&input_file_chain);
Nick Clifton d43b72
--- 1215,1231 ----
Nick Clifton d43b72
  /* Build enough state so that the parser can build its tree.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
  void
Nick Clifton d43b72
! lang_init (bfd_boolean object_only)
Nick Clifton d43b72
  {
Nick Clifton d43b72
!   if (!object_only)
Nick Clifton d43b72
!     obstack_begin (&stat_obstack, 1000);
Nick Clifton d43b72
  
Nick Clifton d43b72
    stat_ptr = &statement_list;
Nick Clifton d43b72
  
Nick Clifton d43b72
    output_section_statement_table_init ();
Nick Clifton d43b72
  
Nick Clifton d43b72
+   cmdline_lists_init ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    lang_list_init (stat_ptr);
Nick Clifton d43b72
  
Nick Clifton d43b72
    lang_list_init (&input_file_chain);
Nick Clifton d43b72
*************** lang_init (void)
Nick Clifton d43b72
*** 1230,1239 ****
Nick Clifton d43b72
       simpler to re-use working machinery than using a linked list in terms
Nick Clifton d43b72
       of code-complexity here in ld, besides the initialization which just
Nick Clifton d43b72
       looks like other code here.  */
Nick Clifton d43b72
!   if (!bfd_hash_table_init_n (&lang_definedness_table,
Nick Clifton d43b72
! 			      lang_definedness_newfunc,
Nick Clifton d43b72
! 			      sizeof (struct lang_definedness_hash_entry),
Nick Clifton d43b72
! 			      3))
Nick Clifton d43b72
      einfo (_("%P%F: can not create hash table: %E\n"));
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 1244,1254 ----
Nick Clifton d43b72
       simpler to re-use working machinery than using a linked list in terms
Nick Clifton d43b72
       of code-complexity here in ld, besides the initialization which just
Nick Clifton d43b72
       looks like other code here.  */
Nick Clifton d43b72
!   if (!object_only
Nick Clifton d43b72
!       && !bfd_hash_table_init_n (&lang_definedness_table,
Nick Clifton d43b72
! 				 lang_definedness_newfunc,
Nick Clifton d43b72
! 				 sizeof (struct lang_definedness_hash_entry),
Nick Clifton d43b72
! 				 3))
Nick Clifton d43b72
      einfo (_("%P%F: can not create hash table: %E\n"));
Nick Clifton d43b72
  }
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** load_symbols (lang_input_statement_type
Nick Clifton d43b72
*** 2769,2774 ****
Nick Clifton d43b72
--- 2784,2795 ----
Nick Clifton d43b72
  		  loaded = FALSE;
Nick Clifton d43b72
  		}
Nick Clifton d43b72
  
Nick Clifton d43b72
+ 	      if (link_info.emitting_gnu_object_only)
Nick Clifton d43b72
+ 		{
Nick Clifton d43b72
+ 		  if (!cmdline_on_object_only_archive_list_p (member))
Nick Clifton d43b72
+ 		    continue;
Nick Clifton d43b72
+ 		}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  	      subsbfd = member;
Nick Clifton d43b72
  	      if (!(*link_info.callbacks
Nick Clifton d43b72
  		    ->add_archive_element) (&link_info, member,
Nick Clifton d43b72
*************** lang_process (void)
Nick Clifton d43b72
*** 6659,6665 ****
Nick Clifton d43b72
--- 6680,6716 ----
Nick Clifton d43b72
  	  open_input_bfds (statement_list.head, OPEN_BFD_RESCAN);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
+     if (link_info.relocatable)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       /* Check if .gnu_object_only section should be created.  */
Nick Clifton d43b72
+       bfd *p;
Nick Clifton d43b72
+       int object_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       object_type = 0;
Nick Clifton d43b72
+       for (p = link_info.input_bfds; p != (bfd *) NULL; p = p->link_next)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  object_type |= 1 << p->lto_type;
Nick Clifton d43b72
+ 	  if ((object_type & (1 << lto_mixed_object)) != 0
Nick Clifton d43b72
+ 	      || ((object_type
Nick Clifton d43b72
+ 		   & (1 << lto_non_ir_object
Nick Clifton d43b72
+ 		      | 1 << lto_ir_object))
Nick Clifton d43b72
+ 		  == (1 << lto_non_ir_object | 1 << lto_ir_object)))
Nick Clifton d43b72
+ 	    {
Nick Clifton d43b72
+ 	      link_info.emit_gnu_object_only = TRUE;
Nick Clifton d43b72
+ 	      break;
Nick Clifton d43b72
+ 	    }
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (trace_files
Nick Clifton d43b72
+ 	  && (cmdline_object_only_file_list.head
Nick Clifton d43b72
+ 	      || cmdline_object_only_archive_list.head))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  print_cmdline_list (cmdline_object_only_file_list.head);
Nick Clifton d43b72
+ 	  print_cmdline_list (cmdline_object_only_archive_list.head);
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
  
Nick Clifton d43b72
    link_info.gc_sym_list = &entry_symbol;
Nick Clifton d43b72
    if (entry_symbol.name == NULL)
Nick Clifton d43b72
*************** lang_ld_feature (char *str)
Nick Clifton d43b72
*** 8059,8061 ****
Nick Clifton d43b72
--- 8111,9071 ----
Nick Clifton d43b72
        p = q;
Nick Clifton d43b72
      }
Nick Clifton d43b72
  }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ cmdline_lists_init (void)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_object_only_file_list.tail
Nick Clifton d43b72
+     = &cmdline_object_only_file_list.head;
Nick Clifton d43b72
+   cmdline_object_only_archive_list.tail
Nick Clifton d43b72
+     = &cmdline_object_only_archive_list.head;
Nick Clifton d43b72
+   cmdline_temp_object_only_list.tail
Nick Clifton d43b72
+     = &cmdline_temp_object_only_list.head;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Allocate an item with TYPE and DATA.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static cmdline_union_type *
Nick Clifton d43b72
+ cmdline_list_new (cmdline_enum_type type, void *data)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *new_opt;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   new_opt = (cmdline_union_type *) stat_alloc (sizeof (*new_opt));
Nick Clifton d43b72
+   new_opt->header.type = type;
Nick Clifton d43b72
+   switch (type)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+     default:
Nick Clifton d43b72
+       break;
Nick Clifton d43b72
+     case cmdline_is_file_enum:
Nick Clifton d43b72
+       new_opt->file.filename = (const char *) data;
Nick Clifton d43b72
+       break;
Nick Clifton d43b72
+     case cmdline_is_bfd_enum:
Nick Clifton d43b72
+       new_opt->abfd.abfd = (bfd *) data;
Nick Clifton d43b72
+       break;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   return new_opt;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Append an item with TYPE and DATA to LIST.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ cmdline_list_append (cmdline_list_type *list, cmdline_enum_type type,
Nick Clifton d43b72
+ 		     void *data)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *new_opt = cmdline_list_new (type, data);
Nick Clifton d43b72
+   new_opt->header.next = NULL;
Nick Clifton d43b72
+   *list->tail = new_opt;
Nick Clifton d43b72
+   list->tail = &new_opt->header.next;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ print_cmdline_list (cmdline_union_type *c)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   for (; c != NULL; c = c->header.next)
Nick Clifton d43b72
+     switch (c->header.type)
Nick Clifton d43b72
+       {
Nick Clifton d43b72
+       default:
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+       case cmdline_is_file_enum:
Nick Clifton d43b72
+ 	info_msg (" %s", c->file.filename);
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+       case cmdline_is_bfd_enum:
Nick Clifton d43b72
+ 	info_msg (" [%B]", c->abfd.abfd);
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+       }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   info_msg ("\n");
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Return TRUE if ABFD is on cmdline_object_only_archive_list.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static bfd_boolean
Nick Clifton d43b72
+ cmdline_on_object_only_archive_list_p (bfd *abfd)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *c, *next;
Nick Clifton d43b72
+   bfd *archive, *obfd, *oarchive;
Nick Clifton d43b72
+   ufile_ptr origin = abfd->origin;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   archive = bfd_my_archive (abfd);
Nick Clifton d43b72
+   for (c = cmdline_object_only_archive_list.head; c != NULL; c = next)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       if (c->header.type != cmdline_is_bfd_enum)
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       next = c->header.next;
Nick Clifton d43b72
+       obfd = c->abfd.abfd;
Nick Clifton d43b72
+       oarchive = bfd_my_archive (obfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       /* The list is grouped by archive file name and sorted by member
Nick Clifton d43b72
+ 	 origin.  */
Nick Clifton d43b72
+       if (strcmp (archive->filename, oarchive->filename) != 0)
Nick Clifton d43b72
+ 	continue;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (origin == obfd->origin)
Nick Clifton d43b72
+ 	return TRUE;
Nick Clifton d43b72
+       else if (origin < obfd->origin)
Nick Clifton d43b72
+ 	return FALSE;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   return FALSE;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Append an item with TYPE and DATA to cmdline_object_only_file_list
Nick Clifton d43b72
+    or cmdline_object_only_archive_list if needed.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ cmdline_object_only_list_append (cmdline_enum_type type, void *data)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *c;
Nick Clifton d43b72
+   cmdline_union_type *new_opt, *next, **prev;
Nick Clifton d43b72
+   bfd *abfd, *archive;
Nick Clifton d43b72
+   bfd *obfd, *oarchive;
Nick Clifton d43b72
+   bfd *nbfd, *narchive;
Nick Clifton d43b72
+   ufile_ptr origin, norigin;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Put it on cmdline_object_only_file_list if it isn't an archive
Nick Clifton d43b72
+      member.  */
Nick Clifton d43b72
+   switch (type)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+     default:
Nick Clifton d43b72
+       abort ();
Nick Clifton d43b72
+     case cmdline_is_bfd_enum:
Nick Clifton d43b72
+       abfd = (bfd *) data;
Nick Clifton d43b72
+       archive = bfd_my_archive (abfd);
Nick Clifton d43b72
+       if (archive)
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+     case cmdline_is_file_enum:
Nick Clifton d43b72
+       cmdline_list_append (&cmdline_object_only_file_list, type, data);
Nick Clifton d43b72
+       return;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Put archive member on cmdline_object_only_archive_list and sort
Nick Clifton d43b72
+      the list by archive name and archive member origin.  */
Nick Clifton d43b72
+   new_opt = (cmdline_union_type *) stat_alloc (sizeof (*new_opt));
Nick Clifton d43b72
+   new_opt->header.type = cmdline_is_bfd_enum;
Nick Clifton d43b72
+   new_opt->header.next = NULL;
Nick Clifton d43b72
+   new_opt->abfd.abfd = (bfd *) data;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   c = cmdline_object_only_archive_list.head;
Nick Clifton d43b72
+   if (c == NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       cmdline_object_only_archive_list.head = new_opt;
Nick Clifton d43b72
+       cmdline_object_only_archive_list.tail = &new_opt->header.next;
Nick Clifton d43b72
+       return;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   prev = NULL;
Nick Clifton d43b72
+   origin = abfd->origin;
Nick Clifton d43b72
+   for (; c != NULL; c = next)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       if (c->header.type != cmdline_is_bfd_enum)
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       next = c->header.next;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       obfd = c->abfd.abfd;
Nick Clifton d43b72
+       oarchive = bfd_my_archive (obfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (strcmp (archive->filename, oarchive->filename) == 0)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  bfd_boolean after;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  if (origin < obfd->origin)
Nick Clifton d43b72
+ 	    {
Nick Clifton d43b72
+ 	      /* Insert it before the current.  */
Nick Clifton d43b72
+ 	      new_opt->header.next = c;
Nick Clifton d43b72
+ 	      if (prev)
Nick Clifton d43b72
+ 		*prev = new_opt;
Nick Clifton d43b72
+ 	      else
Nick Clifton d43b72
+ 		cmdline_object_only_archive_list.head = new_opt;
Nick Clifton d43b72
+ 	      return;
Nick Clifton d43b72
+ 	    }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  after = TRUE;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  /* Check origin.  */
Nick Clifton d43b72
+ 	  while (next)
Nick Clifton d43b72
+ 	    {
Nick Clifton d43b72
+ 	      if (next->header.type != cmdline_is_bfd_enum)
Nick Clifton d43b72
+ 		abort ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	      nbfd = next->abfd.abfd;
Nick Clifton d43b72
+ 	      norigin = nbfd->origin;
Nick Clifton d43b72
+ 	      if (origin > norigin)
Nick Clifton d43b72
+ 		{
Nick Clifton d43b72
+ 		  /* Insert it after NEXT.  */
Nick Clifton d43b72
+ 		  break;
Nick Clifton d43b72
+ 		}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	      narchive = bfd_my_archive (nbfd);
Nick Clifton d43b72
+ 	      if (strcmp (archive->filename, narchive->filename) != 0)
Nick Clifton d43b72
+ 		{
Nick Clifton d43b72
+ 		  /* Insert it befor NEXT.  */
Nick Clifton d43b72
+ 		  after = FALSE;
Nick Clifton d43b72
+ 		  break;
Nick Clifton d43b72
+ 		}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	      c = next;
Nick Clifton d43b72
+ 	      next = next->header.next;
Nick Clifton d43b72
+ 	    }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  if (after && next)
Nick Clifton d43b72
+ 	    {
Nick Clifton d43b72
+ 	      c = next;
Nick Clifton d43b72
+ 	      next = next->header.next;
Nick Clifton d43b72
+ 	    }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  if (*cmdline_object_only_archive_list.tail == c->header.next)
Nick Clifton d43b72
+ 	    cmdline_object_only_archive_list.tail
Nick Clifton d43b72
+ 	      = &new_opt->header.next;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  prev = &c->header.next;
Nick Clifton d43b72
+ 	  new_opt->header.next = next;
Nick Clifton d43b72
+ 	  *prev = new_opt;
Nick Clifton d43b72
+ 	  return;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       prev = &c->header.next;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   *cmdline_object_only_archive_list.tail = new_opt;
Nick Clifton d43b72
+   cmdline_object_only_archive_list.tail = &new_opt->header.next;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ cmdline_get_object_only_input_files (void)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *c, *next;
Nick Clifton d43b72
+   bfd *abfd, *archive;
Nick Clifton d43b72
+   bfd *nbfd, *narchive;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Add files first.  */
Nick Clifton d43b72
+   for (c = cmdline_object_only_file_list.head;
Nick Clifton d43b72
+        c != NULL; c = c->header.next)
Nick Clifton d43b72
+     switch (c->header.type)
Nick Clifton d43b72
+       {
Nick Clifton d43b72
+       default:
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+       case cmdline_is_file_enum:
Nick Clifton d43b72
+ 	lang_add_input_file (c->file.filename,
Nick Clifton d43b72
+ 			     lang_input_file_is_file_enum, NULL);
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+       case cmdline_is_bfd_enum:
Nick Clifton d43b72
+ 	abfd = c->abfd.abfd;
Nick Clifton d43b72
+ 	if (bfd_my_archive (abfd))
Nick Clifton d43b72
+ 	  abort ();
Nick Clifton d43b72
+ 	lang_add_input_file (abfd->filename,
Nick Clifton d43b72
+ 			     lang_input_file_is_file_enum, NULL);
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+       }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Add archive members next.  */
Nick Clifton d43b72
+   for (c = cmdline_object_only_archive_list.head; c != NULL; c = next)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       if (c->header.type != cmdline_is_bfd_enum)
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       next = c->header.next;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       abfd = c->abfd.abfd;
Nick Clifton d43b72
+       archive = bfd_my_archive (abfd);
Nick Clifton d43b72
+    
Nick Clifton d43b72
+       /* Add the first archive of the archive member group.  */
Nick Clifton d43b72
+       lang_add_input_file (archive->filename,
Nick Clifton d43b72
+ 			   lang_input_file_is_file_enum, NULL);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       /* Skip the rest members in the archive member group.  */
Nick Clifton d43b72
+       do
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  if (!next)
Nick Clifton d43b72
+ 	    break;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  if (next->header.type != cmdline_is_bfd_enum)
Nick Clifton d43b72
+ 	    abort ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ 	  next = next->header.next;
Nick Clifton d43b72
+ 	  if (!next)
Nick Clifton d43b72
+ 	    break;
Nick Clifton d43b72
+ 	  nbfd = next->abfd.abfd;
Nick Clifton d43b72
+ 	  narchive = bfd_my_archive (nbfd);
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       while (strcmp (archive->filename, narchive->filename) == 0);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ struct cmdline_arg
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   bfd *obfd;
Nick Clifton d43b72
+   asymbol **isympp;
Nick Clifton d43b72
+   int status;
Nick Clifton d43b72
+ };
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Create a section in OBFD with the same
Nick Clifton d43b72
+    name and attributes as ISECTION in IBFD.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ setup_section (bfd *ibfd, sec_ptr isection, void *p)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   struct cmdline_arg *arg = (struct cmdline_arg *) p;
Nick Clifton d43b72
+   bfd *obfd = arg->obfd;
Nick Clifton d43b72
+   asymbol **isympp = arg->isympp;
Nick Clifton d43b72
+   const char *name = isection->name;
Nick Clifton d43b72
+   sec_ptr osection;
Nick Clifton d43b72
+   const char *err;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Skip the object-only section.  */
Nick Clifton d43b72
+   if (ibfd->object_only_section == isection)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* If we have already failed earlier on, do not keep on generating
Nick Clifton d43b72
+      complaints now.  */
Nick Clifton d43b72
+   if (arg->status)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   osection = bfd_make_section_anyway_with_flags (obfd, name,
Nick Clifton d43b72
+ 						 isection->flags);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (osection == NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("failed to create output section");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   osection->size = isection->size;
Nick Clifton d43b72
+   osection->vma = isection->vma;
Nick Clifton d43b72
+   osection->lma = isection->lma;
Nick Clifton d43b72
+   osection->alignment_power = isection->alignment_power;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Copy merge entity size.  */
Nick Clifton d43b72
+   osection->entsize = isection->entsize;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* This used to be mangle_section; we do here to avoid using
Nick Clifton d43b72
+      bfd_get_section_by_name since some formats allow multiple
Nick Clifton d43b72
+      sections with the same name.  */
Nick Clifton d43b72
+   isection->output_section = osection;
Nick Clifton d43b72
+   isection->output_offset = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if ((isection->flags & SEC_GROUP) != 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       asymbol *gsym = bfd_group_signature (isection, isympp);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (gsym != NULL)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  gsym->flags |= BSF_KEEP;
Nick Clifton d43b72
+ 	  if (ibfd->xvec->flavour == bfd_target_elf_flavour)
Nick Clifton d43b72
+ 	    elf_group_id (isection) = gsym;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Allow the BFD backend to copy any private data it understands
Nick Clifton d43b72
+      from the input section to the output section.  */
Nick Clifton d43b72
+   if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("failed to copy private data");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* All went well.  */
Nick Clifton d43b72
+   return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ loser:
Nick Clifton d43b72
+   arg->status = 1;
Nick Clifton d43b72
+   einfo (_("%P%F: setup_section: %s: %s\n"), err, name);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Copy the data of input section ISECTION of IBFD
Nick Clifton d43b72
+    to an output section with the same name in OBFD.
Nick Clifton d43b72
+    If stripping then don't copy any relocation info.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ copy_section (bfd *ibfd, sec_ptr isection, void *p)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   struct cmdline_arg *arg = (struct cmdline_arg *) p;
Nick Clifton d43b72
+   bfd *obfd = arg->obfd;
Nick Clifton d43b72
+   asymbol **isympp = arg->isympp;
Nick Clifton d43b72
+   arelent **relpp;
Nick Clifton d43b72
+   long relcount;
Nick Clifton d43b72
+   sec_ptr osection;
Nick Clifton d43b72
+   bfd_size_type size;
Nick Clifton d43b72
+   long relsize;
Nick Clifton d43b72
+   flagword flags;
Nick Clifton d43b72
+   const char *err;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Skip the object-only section.  */
Nick Clifton d43b72
+   if (ibfd->object_only_section == isection)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* If we have already failed earlier on, do not keep on generating
Nick Clifton d43b72
+      complaints now.  */
Nick Clifton d43b72
+   if (arg->status)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   flags = bfd_get_section_flags (ibfd, isection);
Nick Clifton d43b72
+   if ((flags & SEC_GROUP) != 0)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   osection = isection->output_section;
Nick Clifton d43b72
+   size = bfd_get_section_size (isection);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (size == 0 || osection == 0)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   relsize = bfd_get_reloc_upper_bound (ibfd, isection);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (relsize < 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       /* Do not complain if the target does not support relocations.  */
Nick Clifton d43b72
+       if (relsize == -1
Nick Clifton d43b72
+ 	  && bfd_get_error () == bfd_error_invalid_operation)
Nick Clifton d43b72
+ 	relsize = 0;
Nick Clifton d43b72
+       else
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+ 	  goto loser;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (relsize == 0)
Nick Clifton d43b72
+     bfd_set_reloc (obfd, osection, NULL, 0);
Nick Clifton d43b72
+   else
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       relpp = (arelent **) xmalloc (relsize);
Nick Clifton d43b72
+       relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
Nick Clifton d43b72
+       if (relcount < 0)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  err = _("relocation count is negative");
Nick Clifton d43b72
+ 	  goto loser;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       bfd_set_reloc (obfd, osection,
Nick Clifton d43b72
+ 		     relcount == 0 ? NULL : relpp, relcount);
Nick Clifton d43b72
+       if (relcount == 0)
Nick Clifton d43b72
+ 	free (relpp);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       bfd_byte *memhunk = NULL;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+ 	  goto loser;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+ 	  goto loser;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       free (memhunk);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* All went well.  */
Nick Clifton d43b72
+   return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ loser:
Nick Clifton d43b72
+   einfo (_("%P%F: copy_section: %s: %s\n"), err, isection->name);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ /* Open the temporary bfd created in the same directory as PATH.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static bfd *
Nick Clifton d43b72
+ cmdline_fopen_temp (const char *path, const char *target,
Nick Clifton d43b72
+ 		    const char *mode)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+ #define template "ldXXXXXX"
Nick Clifton d43b72
+   const char *slash = strrchr (path, '/');
Nick Clifton d43b72
+   char *tmpname;
Nick Clifton d43b72
+   size_t len;
Nick Clifton d43b72
+   int fd;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ #ifdef HAVE_DOS_BASED_FILE_SYSTEM
Nick Clifton d43b72
+   {
Nick Clifton d43b72
+     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
Nick Clifton d43b72
+     char *bslash = strrchr (path, '\\');
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+     if (slash == NULL || (bslash != NULL && bslash > slash))
Nick Clifton d43b72
+       slash = bslash;
Nick Clifton d43b72
+     if (slash == NULL && path[0] != '\0' && path[1] == ':')
Nick Clifton d43b72
+       slash = path + 1;
Nick Clifton d43b72
+   }
Nick Clifton d43b72
+ #endif
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (slash != (char *) NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       len = slash - path;
Nick Clifton d43b72
+       tmpname = (char *) xmalloc (len + sizeof (template) + 2);
Nick Clifton d43b72
+       memcpy (tmpname, path, len);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ #ifdef HAVE_DOS_BASED_FILE_SYSTEM
Nick Clifton d43b72
+       /* If tmpname is "X:", appending a slash will make it a root
Nick Clifton d43b72
+ 	 directory on drive X, which is NOT the same as the current
Nick Clifton d43b72
+ 	 directory on drive X.  */
Nick Clifton d43b72
+       if (len == 2 && tmpname[1] == ':')
Nick Clifton d43b72
+ 	tmpname[len++] = '.';
Nick Clifton d43b72
+ #endif
Nick Clifton d43b72
+       tmpname[len++] = '/';
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       tmpname = (char *) xmalloc (sizeof (template));
Nick Clifton d43b72
+       len = 0;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   memcpy (tmpname + len, template, sizeof (template));
Nick Clifton d43b72
+ #undef template
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ #ifdef HAVE_MKSTEMP
Nick Clifton d43b72
+   fd = mkstemp (tmpname);
Nick Clifton d43b72
+ #else
Nick Clifton d43b72
+   tmpname = mktemp (tmpname);
Nick Clifton d43b72
+   if (tmpname == NULL)
Nick Clifton d43b72
+     return NULL;
Nick Clifton d43b72
+   fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
Nick Clifton d43b72
+ #endif
Nick Clifton d43b72
+   if (fd == -1)
Nick Clifton d43b72
+     return NULL;
Nick Clifton d43b72
+   return bfd_fopen (tmpname, target, mode, fd);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Add the object-only section.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static void
Nick Clifton d43b72
+ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   bfd_vma start;
Nick Clifton d43b72
+   flagword flags;
Nick Clifton d43b72
+   enum bfd_architecture iarch;
Nick Clifton d43b72
+   unsigned int imach;
Nick Clifton d43b72
+   long symcount;
Nick Clifton d43b72
+   long symsize;
Nick Clifton d43b72
+   asymbol **isympp = NULL;
Nick Clifton d43b72
+   asymbol **osympp = NULL;
Nick Clifton d43b72
+   bfd *obfd = NULL, *ibfd;
Nick Clifton d43b72
+   const char *err;
Nick Clifton d43b72
+   struct arg
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       bfd *obfd;
Nick Clifton d43b72
+       asymbol **isympp;
Nick Clifton d43b72
+       int status;
Nick Clifton d43b72
+     } arg;
Nick Clifton d43b72
+   char **matching;
Nick Clifton d43b72
+   const char *ofilename = NULL;
Nick Clifton d43b72
+   asection *sec;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ibfd = bfd_openr (output_filename, output_target);
Nick Clifton d43b72
+   if (!ibfd)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (!bfd_check_format_matches (ibfd, bfd_object, &matching))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   obfd = cmdline_fopen_temp (output_filename, output_target, "w");
Nick Clifton d43b72
+   if (!obfd)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   ofilename = bfd_get_filename (obfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (!bfd_set_format (obfd, bfd_object))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Copy the start address, flags and architecture of input file to
Nick Clifton d43b72
+      output file.  */
Nick Clifton d43b72
+   flags = bfd_get_file_flags (ibfd);
Nick Clifton d43b72
+   start = bfd_get_start_address (ibfd);
Nick Clifton d43b72
+   iarch = bfd_get_arch (ibfd);
Nick Clifton d43b72
+   imach = bfd_get_mach (ibfd);
Nick Clifton d43b72
+   if (!bfd_set_start_address (obfd, start)
Nick Clifton d43b72
+       || !bfd_set_file_flags (obfd, flags)
Nick Clifton d43b72
+       || !bfd_set_arch_mach (obfd, iarch, imach))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 	
Nick Clifton d43b72
+   symsize = bfd_get_symtab_upper_bound (ibfd);
Nick Clifton d43b72
+   if (symsize < 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   isympp = (asymbol **) xmalloc (symsize);
Nick Clifton d43b72
+   symcount = bfd_canonicalize_symtab (ibfd, isympp);
Nick Clifton d43b72
+   if (symcount < 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = bfd_errmsg (bfd_get_error ());
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   arg.obfd = obfd;
Nick Clifton d43b72
+   arg.isympp = isympp;
Nick Clifton d43b72
+   arg.status = 0;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* BFD mandates that all output sections be created and sizes set before
Nick Clifton d43b72
+      any output is done.  Thus, we traverse all sections multiple times.  */
Nick Clifton d43b72
+   bfd_map_over_sections (ibfd, setup_section, &arg;;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (arg.status)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("error setting up sections");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Allow the BFD backend to copy any private data it understands
Nick Clifton d43b72
+      from the input section to the output section.  */
Nick Clifton d43b72
+   if (! bfd_copy_private_header_data (ibfd, obfd))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("error copying private header data");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Create the object-only section.  */
Nick Clifton d43b72
+   sec = bfd_make_section_with_flags (obfd,
Nick Clifton d43b72
+ 				     GNU_OBJECT_ONLY_SECTION_NAME,
Nick Clifton d43b72
+ 				     (SEC_HAS_CONTENTS
Nick Clifton d43b72
+ 				      | SEC_READONLY
Nick Clifton d43b72
+ 				      | SEC_DATA
Nick Clifton d43b72
+ 				      | SEC_LINKER_CREATED));
Nick Clifton d43b72
+   if (sec == NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("can't create object-only section");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (! bfd_set_section_size (obfd, sec, size))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("can't set object-only section size");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (ibfd->object_only_section)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       /* Filter out the object-only section symbol.  */
Nick Clifton d43b72
+       long src_count = 0, dst_count = 0;
Nick Clifton d43b72
+       asymbol **from, **to;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       osympp = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
Nick Clifton d43b72
+       from = isympp;
Nick Clifton d43b72
+       to = osympp;
Nick Clifton d43b72
+       for (; src_count < symcount; src_count++)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  asymbol *sym = from[src_count];
Nick Clifton d43b72
+ 	  if (bfd_get_section (sym) != ibfd->object_only_section)
Nick Clifton d43b72
+ 	    to[dst_count++] = sym;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       to[dst_count] = NULL;
Nick Clifton d43b72
+       symcount = dst_count;
Nick Clifton d43b72
+       bfd_set_symtab (obfd, osympp, symcount);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
+     bfd_set_symtab (obfd, isympp, symcount);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* This has to happen after the symbol table has been set.  */
Nick Clifton d43b72
+   bfd_map_over_sections (ibfd, copy_section, &arg;;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (arg.status)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("error copying sections");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Copy the object-only section to the output.  */
Nick Clifton d43b72
+   if (! bfd_set_section_contents (obfd, sec, contents, 0, size))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("error adding object-only section");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Allow the BFD backend to copy any private data it understands
Nick Clifton d43b72
+      from the input BFD to the output BFD.  This is done last to
Nick Clifton d43b72
+      permit the routine to look at the filtered symbol table, which is
Nick Clifton d43b72
+      important for the ECOFF code at least.  */
Nick Clifton d43b72
+   if (! bfd_copy_private_bfd_data (ibfd, obfd))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       err = _("error copying private BFD data");
Nick Clifton d43b72
+       goto loser;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (!bfd_close (obfd))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       unlink (ofilename);
Nick Clifton d43b72
+       einfo (_("%P%F: failed to finish output with object-only section\n"));
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Must be freed after bfd_close ().  */
Nick Clifton d43b72
+   free (isympp);
Nick Clifton d43b72
+   if (osympp)
Nick Clifton d43b72
+     free (osympp);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (rename (ofilename, output_filename))
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       unlink (ofilename);
Nick Clifton d43b72
+       einfo (_("%P%F: failed to rename output with object-only section\n"));
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ loser:
Nick Clifton d43b72
+   if (isympp)
Nick Clifton d43b72
+     free (isympp);
Nick Clifton d43b72
+   if (osympp)
Nick Clifton d43b72
+     free (osympp);
Nick Clifton d43b72
+   if (obfd)
Nick Clifton d43b72
+     bfd_close (obfd);
Nick Clifton d43b72
+   if (ofilename)
Nick Clifton d43b72
+     unlink (ofilename);
Nick Clifton d43b72
+   einfo (_("%P%F: failed to add object-only section: %s\n"), err);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Emit the final output with object-only section.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ void
Nick Clifton d43b72
+ cmdline_emit_object_only_section (void)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   const char *saved_output_filename = output_filename;
Nick Clifton d43b72
+   int fd;
Nick Clifton d43b72
+   size_t size, off;
Nick Clifton d43b72
+   bfd_byte *contents;
Nick Clifton d43b72
+   struct stat st;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Get a temporary object-only file.  */
Nick Clifton d43b72
+   output_filename = make_temp_file (".obj-only.o");
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   had_output_filename = FALSE;
Nick Clifton d43b72
+   link_info.input_bfds = NULL;
Nick Clifton d43b72
+   link_info.input_bfds_tail = &link_info.input_bfds;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   lang_init (TRUE);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ld_parse_linker_script ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Set up the object-only output. */
Nick Clifton d43b72
+   lang_final ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Open the object-only file for output.  */
Nick Clifton d43b72
+   lang_for_each_statement (ldlang_open_output);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ldemul_create_output_section_statements ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (!bfd_section_already_linked_table_init ())
Nick Clifton d43b72
+     einfo (_("%P%F: Failed to create hash table\n"));
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Call cmdline_on_object_only_archive_list_p to check which member
Nick Clifton d43b72
+      should be loaded.  */
Nick Clifton d43b72
+   input_flags.whole_archive = TRUE;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Set it to avoid adding more to cmdline lists.  */
Nick Clifton d43b72
+   link_info.emitting_gnu_object_only = TRUE;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   cmdline_get_object_only_input_files ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   open_input_bfds (statement_list.head, FALSE);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ldemul_after_open ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   bfd_section_already_linked_table_free ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Make sure that we're not mixing architectures.  We call this
Nick Clifton d43b72
+      after all the input files have been opened, but before we do any
Nick Clifton d43b72
+      other processing, so that any operations merge_private_bfd_data
Nick Clifton d43b72
+      does on the output file will be known during the rest of the
Nick Clifton d43b72
+      link.  */
Nick Clifton d43b72
+   lang_check ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Size up the common data.  */
Nick Clifton d43b72
+   lang_common ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Update wild statements.  */
Nick Clifton d43b72
+   update_wild_statements (statement_list.head);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Run through the contours of the script and attach input sections
Nick Clifton d43b72
+      to the correct output sections.  */
Nick Clifton d43b72
+   map_input_to_output_sections (statement_list.head, NULL, NULL);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Find any sections not attached explicitly and handle them.  */
Nick Clifton d43b72
+   lang_place_orphans ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Do anything special before sizing sections.  This is where ELF
Nick Clifton d43b72
+      and other back-ends size dynamic sections.  */
Nick Clifton d43b72
+   ldemul_before_allocation ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Size up the sections.  */
Nick Clifton d43b72
+   lang_size_sections (NULL, ! RELAXATION_ENABLED);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* See if anything special should be done now we know how big
Nick Clifton d43b72
+      everything is.  This is where relaxation is done.  */
Nick Clifton d43b72
+   ldemul_after_allocation ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   ldemul_finish ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Make sure that the section addresses make sense.  */
Nick Clifton d43b72
+   if (command_line.check_section_addresses)
Nick Clifton d43b72
+     lang_check_section_addresses ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   lang_end ();
Nick Clifton d43b72
+   
Nick Clifton d43b72
+   ldwrite ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   lang_finish ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (! bfd_close (link_info.output_bfd))
Nick Clifton d43b72
+     einfo (_("%P%F:%s: final close failed on object-only output: %E\n"),
Nick Clifton d43b72
+ 	   output_filename);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Read in the object-only file.  */
Nick Clifton d43b72
+   fd = open (output_filename, O_RDONLY | O_BINARY);
Nick Clifton d43b72
+   if (fd < 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       bfd_set_error (bfd_error_system_call);
Nick Clifton d43b72
+       einfo (_("%P%F:%s: cannot open object-only output: %E"),
Nick Clifton d43b72
+ 	     output_filename);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Get the object-only file size.  */
Nick Clifton d43b72
+   if (fstat (fd, &st) != 0)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       bfd_set_error (bfd_error_system_call);
Nick Clifton d43b72
+       einfo (_("%P%F:%s: cannot stat object-only output: %E"),
Nick Clifton d43b72
+ 	     output_filename);
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   size = st.st_size;
Nick Clifton d43b72
+   off = 0;
Nick Clifton d43b72
+   contents = (bfd_byte *) xmalloc (size);
Nick Clifton d43b72
+   while (off != size)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       ssize_t got;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       got = read (fd, contents + off, size - off);
Nick Clifton d43b72
+       if (got < 0)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  bfd_set_error (bfd_error_system_call);
Nick Clifton d43b72
+ 	  einfo (_("%P%F:%s: read failed on object-only output: %E"),
Nick Clifton d43b72
+ 		 output_filename);
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       off += got;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   close (fd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* Remove the temporary object-only file.  */ 
Nick Clifton d43b72
+   unlink (output_filename);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   output_filename = saved_output_filename;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   cmdline_add_object_only_section (contents, size);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   free (contents);
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Extract the object-only section.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ static const char *
Nick Clifton d43b72
+ cmdline_extract_object_only_section (bfd *abfd)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   const char *name = bfd_extract_object_only_section (abfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (name == NULL)
Nick Clifton d43b72
+     einfo (_("%P%F: cannot extract object-only section from %B: %E"),
Nick Clifton d43b72
+ 	   abfd);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* It should be removed after it is done.  */
Nick Clifton d43b72
+   cmdline_list_append (&cmdline_temp_object_only_list,
Nick Clifton d43b72
+ 		       cmdline_is_file_enum, (void *) name);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   return name;
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Check and handle the object-only section.   */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ void
Nick Clifton d43b72
+ cmdline_check_object_only_section (bfd *abfd, bfd_boolean lto)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   const char *filename;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (link_info.emitting_gnu_object_only
Nick Clifton d43b72
+       || abfd->format != bfd_object)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   if (lto)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       /* For LTO link, we only need to extract object-only section
Nick Clifton d43b72
+ 	 from the mixed object, add it to input, and put it on LTO
Nick Clifton d43b72
+ 	 claimed output.  */
Nick Clifton d43b72
+       switch (abfd->lto_type)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	default:
Nick Clifton d43b72
+ 	  abort ();
Nick Clifton d43b72
+ 	case lto_mixed_object:
Nick Clifton d43b72
+ 	  filename = cmdline_extract_object_only_section (abfd);
Nick Clifton d43b72
+ 	  lang_add_input_file (filename,
Nick Clifton d43b72
+ 			       lang_input_file_is_file_enum, NULL);
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+ 	case lto_non_ir_object:
Nick Clifton d43b72
+ 	case lto_ir_object:
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+   else if (link_info.relocatable)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       /* For non-LTO relocatable link, we need to append non-IR object
Nick Clifton d43b72
+ 	 file and the object file in object-only section to the object
Nick Clifton d43b72
+ 	 only list.  */
Nick Clifton d43b72
+       switch (abfd->lto_type)
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	default:
Nick Clifton d43b72
+ 	  abort ();
Nick Clifton d43b72
+ 	case lto_mixed_object:
Nick Clifton d43b72
+ 	  filename = cmdline_extract_object_only_section (abfd);
Nick Clifton d43b72
+ 	  cmdline_object_only_list_append (cmdline_is_file_enum,
Nick Clifton d43b72
+ 					  (void *) filename);
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+ 	case lto_non_ir_object:
Nick Clifton d43b72
+ 	  cmdline_object_only_list_append (cmdline_is_bfd_enum, abfd);
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+ 	case lto_ir_object:
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Remove temporary object-only files.  */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ void
Nick Clifton d43b72
+ cmdline_remove_object_only_files (void)
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *c;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ #ifdef ENABLE_PLUGINS
Nick Clifton d43b72
+   if (plugin_save_temps)
Nick Clifton d43b72
+     return;
Nick Clifton d43b72
+ #endif
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   c = cmdline_temp_object_only_list.head;
Nick Clifton d43b72
+   for (; c != NULL; c = c->header.next)
Nick Clifton d43b72
+     switch (c->header.type)
Nick Clifton d43b72
+       {
Nick Clifton d43b72
+       default:
Nick Clifton d43b72
+ 	abort ();
Nick Clifton d43b72
+       case cmdline_is_file_enum:
Nick Clifton d43b72
+ 	unlink (c->file.filename);
Nick Clifton d43b72
+ 	break;
Nick Clifton d43b72
+       }
Nick Clifton d43b72
+ }
Nick Clifton d43b72
+
Nick Clifton d43b72
+
Nick Clifton d43b72
+ 
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldlang.h ld/ldlang.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldlang.h	2013-05-14 16:39:36.861718097 +0100
Nick Clifton d43b72
--- ld/ldlang.h	2013-05-14 16:40:07.053718934 +0100
Nick Clifton d43b72
*************** extern lang_statement_list_type input_fi
Nick Clifton d43b72
*** 488,494 ****
Nick Clifton d43b72
  extern int lang_statement_iteration;
Nick Clifton d43b72
  
Nick Clifton d43b72
  extern void lang_init
Nick Clifton d43b72
!   (void);
Nick Clifton d43b72
  extern void lang_finish
Nick Clifton d43b72
    (void);
Nick Clifton d43b72
  extern lang_memory_region_type * lang_memory_region_lookup
Nick Clifton d43b72
--- 488,494 ----
Nick Clifton d43b72
  extern int lang_statement_iteration;
Nick Clifton d43b72
  
Nick Clifton d43b72
  extern void lang_init
Nick Clifton d43b72
!   (bfd_boolean);
Nick Clifton d43b72
  extern void lang_finish
Nick Clifton d43b72
    (void);
Nick Clifton d43b72
  extern lang_memory_region_type * lang_memory_region_lookup
Nick Clifton d43b72
*************** ldlang_override_segment_assignment
Nick Clifton d43b72
*** 664,667 ****
Nick Clifton d43b72
--- 664,708 ----
Nick Clifton d43b72
  extern void
Nick Clifton d43b72
  lang_ld_feature (char *);
Nick Clifton d43b72
  
Nick Clifton d43b72
+ typedef enum
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_is_file_enum,
Nick Clifton d43b72
+   cmdline_is_bfd_enum
Nick Clifton d43b72
+ } cmdline_enum_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ typedef struct cmdline_header_struct
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   union cmdline_union *next;
Nick Clifton d43b72
+   cmdline_enum_type type;
Nick Clifton d43b72
+ } cmdline_header_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ typedef struct cmdline_file_struct
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_header_type header;
Nick Clifton d43b72
+   const char *filename;
Nick Clifton d43b72
+ } cmdline_file_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ typedef struct cmdline_bfd_struct
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_header_type header;
Nick Clifton d43b72
+   bfd *abfd;
Nick Clifton d43b72
+ } cmdline_bfd_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ typedef union cmdline_union
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_header_type header;
Nick Clifton d43b72
+   cmdline_file_type file;
Nick Clifton d43b72
+   cmdline_bfd_type abfd;
Nick Clifton d43b72
+ } cmdline_union_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ typedef struct cmdline_list
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   cmdline_union_type *head;
Nick Clifton d43b72
+   cmdline_union_type **tail;
Nick Clifton d43b72
+ } cmdline_list_type;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ extern void cmdline_emit_object_only_section (void);
Nick Clifton d43b72
+ extern void cmdline_check_object_only_section (bfd *, bfd_boolean);
Nick Clifton d43b72
+ extern void cmdline_remove_object_only_files (void);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  #endif
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldlex.h ld/ldlex.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldlex.h	2013-05-14 16:39:39.789718178 +0100
Nick Clifton d43b72
--- ld/ldlex.h	2013-05-14 16:47:18.651730898 +0100
Nick Clifton d43b72
*************** enum option_values
Nick Clifton d43b72
*** 133,138 ****
Nick Clifton d43b72
--- 133,139 ----
Nick Clifton d43b72
  #ifdef ENABLE_PLUGINS
Nick Clifton d43b72
    OPTION_PLUGIN,
Nick Clifton d43b72
    OPTION_PLUGIN_OPT,
Nick Clifton d43b72
+   OPTION_PLUGIN_SAVE_TEMPS,
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
    OPTION_DEFAULT_SCRIPT,
Nick Clifton d43b72
    OPTION_PRINT_OUTPUT_FORMAT,
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldmain.c ld/ldmain.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldmain.c	2013-05-14 16:39:36.862718097 +0100
Nick Clifton d43b72
--- ld/ldmain.c	2013-05-14 16:40:07.055718934 +0100
Nick Clifton d43b72
*************** main (int argc, char **argv)
Nick Clifton d43b72
*** 219,224 ****
Nick Clifton d43b72
--- 219,227 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    xatexit (ld_cleanup);
Nick Clifton d43b72
  
Nick Clifton d43b72
+   /* Remove temporary object-only files.  */
Nick Clifton d43b72
+   xatexit (cmdline_remove_object_only_files);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    /* Set up the sysroot directory.  */
Nick Clifton d43b72
    ld_sysroot = get_sysroot (argc, argv);
Nick Clifton d43b72
    if (*ld_sysroot)
Nick Clifton d43b72
*************** main (int argc, char **argv)
Nick Clifton d43b72
*** 295,301 ****
Nick Clifton d43b72
    default_target = ldemul_choose_target (argc, argv);
Nick Clifton d43b72
    config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
Nick Clifton d43b72
    config.commonpagesize = bfd_emul_get_commonpagesize (default_target);
Nick Clifton d43b72
!   lang_init ();
Nick Clifton d43b72
    ldemul_before_parse ();
Nick Clifton d43b72
    lang_has_input_file = FALSE;
Nick Clifton d43b72
    parse_args (argc, argv);
Nick Clifton d43b72
--- 298,304 ----
Nick Clifton d43b72
    default_target = ldemul_choose_target (argc, argv);
Nick Clifton d43b72
    config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
Nick Clifton d43b72
    config.commonpagesize = bfd_emul_get_commonpagesize (default_target);
Nick Clifton d43b72
!   lang_init (FALSE);
Nick Clifton d43b72
    ldemul_before_parse ();
Nick Clifton d43b72
    lang_has_input_file = FALSE;
Nick Clifton d43b72
    parse_args (argc, argv);
Nick Clifton d43b72
*************** main (int argc, char **argv)
Nick Clifton d43b72
*** 310,343 ****
Nick Clifton d43b72
  
Nick Clifton d43b72
    ldemul_set_symbols ();
Nick Clifton d43b72
  
Nick Clifton d43b72
!   /* If we have not already opened and parsed a linker script,
Nick Clifton d43b72
!      try the default script from command line first.  */
Nick Clifton d43b72
!   if (saved_script_handle == NULL
Nick Clifton d43b72
!       && command_line.default_script != NULL)
Nick Clifton d43b72
!     {
Nick Clifton d43b72
!       ldfile_open_command_file (command_line.default_script);
Nick Clifton d43b72
!       parser_input = input_script;
Nick Clifton d43b72
!       yyparse ();
Nick Clifton d43b72
!     }
Nick Clifton d43b72
! 
Nick Clifton d43b72
!   /* If we have not already opened and parsed a linker script
Nick Clifton d43b72
!      read the emulation's appropriate default script.  */
Nick Clifton d43b72
!   if (saved_script_handle == NULL)
Nick Clifton d43b72
!     {
Nick Clifton d43b72
!       int isfile;
Nick Clifton d43b72
!       char *s = ldemul_get_script (&isfile);
Nick Clifton d43b72
! 
Nick Clifton d43b72
!       if (isfile)
Nick Clifton d43b72
! 	ldfile_open_default_command_file (s);
Nick Clifton d43b72
!       else
Nick Clifton d43b72
! 	{
Nick Clifton d43b72
! 	  lex_string = s;
Nick Clifton d43b72
! 	  lex_redirect (s, _("built in linker script"), 1);
Nick Clifton d43b72
! 	}
Nick Clifton d43b72
!       parser_input = input_script;
Nick Clifton d43b72
!       yyparse ();
Nick Clifton d43b72
!       lex_string = NULL;
Nick Clifton d43b72
!     }
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (verbose)
Nick Clifton d43b72
      {
Nick Clifton d43b72
--- 313,319 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    ldemul_set_symbols ();
Nick Clifton d43b72
  
Nick Clifton d43b72
!   ld_parse_linker_script ();
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (verbose)
Nick Clifton d43b72
      {
Nick Clifton d43b72
*************** main (int argc, char **argv)
Nick Clifton d43b72
*** 444,449 ****
Nick Clifton d43b72
--- 420,427 ----
Nick Clifton d43b72
        if (! bfd_close (link_info.output_bfd))
Nick Clifton d43b72
  	einfo (_("%F%B: final close failed: %E\n"), link_info.output_bfd);
Nick Clifton d43b72
  
Nick Clifton d43b72
+       link_info.output_bfd = NULL;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
        /* If the --force-exe-suffix is enabled, and we're making an
Nick Clifton d43b72
  	 executable file and it doesn't end in .exe, copy it to one
Nick Clifton d43b72
  	 which does.  */
Nick Clifton d43b72
*************** main (int argc, char **argv)
Nick Clifton d43b72
*** 490,495 ****
Nick Clifton d43b72
--- 468,476 ----
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
  
Nick Clifton d43b72
+   if (link_info.emit_gnu_object_only)
Nick Clifton d43b72
+     cmdline_emit_object_only_section ();
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    END_PROGRESS (program_name);
Nick Clifton d43b72
  
Nick Clifton d43b72
    if (config.stats)
Nick Clifton d43b72
*************** add_archive_element (struct bfd_link_inf
Nick Clifton d43b72
*** 779,785 ****
Nick Clifton d43b72
--- 760,768 ----
Nick Clifton d43b72
  	    }
Nick Clifton d43b72
  	}
Nick Clifton d43b72
      }
Nick Clifton d43b72
+   else
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
+     cmdline_check_object_only_section (input->the_bfd, FALSE);
Nick Clifton d43b72
  
Nick Clifton d43b72
    ldlang_add_file (input);
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** warning_callback (struct bfd_link_info *
Nick Clifton d43b72
*** 1152,1158 ****
Nick Clifton d43b72
      einfo ("%P: %s%s\n", _("warning: "), warning);
Nick Clifton d43b72
    else if (symbol == NULL)
Nick Clifton d43b72
      einfo ("%B: %s%s\n", abfd, _("warning: "), warning);
Nick Clifton d43b72
!   else
Nick Clifton d43b72
      {
Nick Clifton d43b72
        struct warning_callback_info cinfo;
Nick Clifton d43b72
  
Nick Clifton d43b72
--- 1135,1141 ----
Nick Clifton d43b72
      einfo ("%P: %s%s\n", _("warning: "), warning);
Nick Clifton d43b72
    else if (symbol == NULL)
Nick Clifton d43b72
      einfo ("%B: %s%s\n", abfd, _("warning: "), warning);
Nick Clifton d43b72
!   else if ((abfd->flags & BFD_PLUGIN) == 0)
Nick Clifton d43b72
      {
Nick Clifton d43b72
        struct warning_callback_info cinfo;
Nick Clifton d43b72
  
Nick Clifton d43b72
*************** notice (struct bfd_link_info *info,
Nick Clifton d43b72
*** 1459,1461 ****
Nick Clifton d43b72
--- 1442,1479 ----
Nick Clifton d43b72
  
Nick Clifton d43b72
    return TRUE;
Nick Clifton d43b72
  }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ /* Parse the linker script.   */
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+ void
Nick Clifton d43b72
+ ld_parse_linker_script ()
Nick Clifton d43b72
+ {
Nick Clifton d43b72
+   /* If we have not already opened and parsed a linker script,
Nick Clifton d43b72
+      try the default script from command line first.  */
Nick Clifton d43b72
+   if (saved_script_handle == NULL
Nick Clifton d43b72
+       && command_line.default_script != NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       ldfile_open_command_file (command_line.default_script);
Nick Clifton d43b72
+       parser_input = input_script;
Nick Clifton d43b72
+       yyparse ();
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+   /* If we have not already opened and parsed a linker script
Nick Clifton d43b72
+      read the emulation's appropriate default script.  */
Nick Clifton d43b72
+   if (saved_script_handle == NULL)
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       int isfile;
Nick Clifton d43b72
+       char *s = ldemul_get_script (&isfile);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
+       if (isfile)
Nick Clifton d43b72
+ 	ldfile_open_default_command_file (s);
Nick Clifton d43b72
+       else
Nick Clifton d43b72
+ 	{
Nick Clifton d43b72
+ 	  lex_string = s;
Nick Clifton d43b72
+ 	  lex_redirect (s, _("built in linker script"), 1);
Nick Clifton d43b72
+ 	}
Nick Clifton d43b72
+       parser_input = input_script;
Nick Clifton d43b72
+       yyparse ();
Nick Clifton d43b72
+       lex_string = NULL;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ }
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/ldmain.h ld/ldmain.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/ldmain.h	2013-05-14 16:39:39.810718179 +0100
Nick Clifton d43b72
--- ld/ldmain.h	2013-05-14 16:40:07.055718934 +0100
Nick Clifton d43b72
*************** extern void add_ysym (const char *);
Nick Clifton d43b72
*** 43,46 ****
Nick Clifton d43b72
--- 43,48 ----
Nick Clifton 5b79e0
  extern void add_ignoresym (struct bfd_link_info *, const char *);
Nick Clifton d43b72
  extern void add_keepsyms_file (const char *);
Nick Clifton d43b72
  
Nick Clifton d43b72
+ extern void ld_parse_linker_script (void);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  #endif
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/lexsup.c ld/lexsup.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/lexsup.c	2013-05-14 16:39:36.709718093 +0100
Nick Clifton d43b72
--- ld/lexsup.c	2013-05-14 16:40:07.058718934 +0100
Nick Clifton d43b72
*************** static const struct ld_option ld_options
Nick Clifton d43b72
*** 168,173 ****
Nick Clifton d43b72
--- 168,176 ----
Nick Clifton d43b72
      '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH },
Nick Clifton d43b72
    { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT},
Nick Clifton d43b72
      '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH },
Nick Clifton d43b72
+   { {"plugin-save-temps", no_argument, NULL, OPTION_PLUGIN_SAVE_TEMPS},
Nick Clifton d43b72
+     '\0', NULL, N_("Store plugin intermediate files permanently"),
Nick Clifton d43b72
+     ONE_DASH },
Nick Clifton d43b72
    { {"flto", optional_argument, NULL, OPTION_IGNORE},
Nick Clifton d43b72
      '\0', NULL, N_("Ignored for GCC LTO option compatibility"),
Nick Clifton d43b72
      ONE_DASH },
Nick Clifton d43b72
*************** parse_args (unsigned argc, char **argv)
Nick Clifton d43b72
*** 958,963 ****
Nick Clifton d43b72
--- 961,969 ----
Nick Clifton d43b72
  	  if (plugin_opt_plugin_arg (optarg))
Nick Clifton d43b72
  	    einfo(_("%P%F: bad -plugin-opt option\n"));
Nick Clifton d43b72
  	  break;
Nick Clifton d43b72
+ 	case OPTION_PLUGIN_SAVE_TEMPS:
Nick Clifton d43b72
+ 	  plugin_save_temps = TRUE;
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
  #endif /* ENABLE_PLUGINS */
Nick Clifton d43b72
  	case 'q':
Nick Clifton d43b72
  	  link_info.emitrelocations = TRUE;
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/plugin.c ld/plugin.c
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/plugin.c	2013-05-14 16:39:37.435718113 +0100
Nick Clifton d43b72
--- ld/plugin.c	2013-05-14 16:48:59.039733681 +0100
Nick Clifton d43b72
***************
Nick Clifton d43b72
*** 39,44 ****
Nick Clifton d43b72
--- 39,47 ----
Nick Clifton d43b72
  /* Report plugin symbols.  */
Nick Clifton d43b72
  bfd_boolean report_plugin_symbols;
Nick Clifton d43b72
  
Nick Clifton d43b72
+ /* Store plugin intermediate files permanently.  */
Nick Clifton d43b72
+ bfd_boolean plugin_save_temps;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* The suffix to append to the name of the real (claimed) object file
Nick Clifton d43b72
     when generating a dummy BFD to hold the IR symbols sent from the
Nick Clifton d43b72
     plugin.  For cosmetic use only; appears in maps, crefs etc.  */
Nick Clifton d43b72
*************** plugin_opt_plugin_arg (const char *arg)
Nick Clifton d43b72
*** 217,222 ****
Nick Clifton d43b72
--- 220,236 ----
Nick Clifton d43b72
    if (!last_plugin)
Nick Clifton d43b72
      return set_plugin_error (_("<no plugin>"));
Nick Clifton d43b72
  
Nick Clifton d43b72
+   /* Ignore -pass-through= from GCC driver.  */
Nick Clifton d43b72
+   if (*arg == '-')
Nick Clifton d43b72
+     {
Nick Clifton d43b72
+       const char *p;
Nick Clifton d43b72
+       for (p = arg + 1; p; p++)
Nick Clifton d43b72
+ 	if (*p != '-')
Nick Clifton d43b72
+ 	  break;
Nick Clifton d43b72
+       if (strncmp (p, "pass-through=", 13) == 0)
Nick Clifton d43b72
+ 	return 0;
Nick Clifton d43b72
+     }
Nick Clifton d43b72
+ 
Nick Clifton d43b72
    newarg = xmalloc (sizeof *newarg);
Nick Clifton d43b72
    newarg->arg = arg;
Nick Clifton d43b72
    newarg->next = NULL;
Nick Clifton d43b72
*************** plugin_maybe_claim (struct ld_plugin_inp
Nick Clifton d43b72
*** 876,881 ****
Nick Clifton d43b72
--- 890,898 ----
Nick Clifton d43b72
    close (file->fd);
Nick Clifton d43b72
    if (claimed)
Nick Clifton d43b72
      {
Nick Clifton d43b72
+       /* Check object only section.  */
Nick Clifton d43b72
+       cmdline_check_object_only_section (entry->the_bfd, TRUE);
Nick Clifton d43b72
+ 
Nick Clifton d43b72
        /* Discard the real file's BFD and substitute the dummy one.  */
Nick Clifton d43b72
  
Nick Clifton d43b72
        /* BFD archive handling caches elements so we can't call
Nick Clifton d43b72
*************** plugin_call_cleanup (void)
Nick Clifton d43b72
*** 929,942 ****
Nick Clifton d43b72
      {
Nick Clifton d43b72
        if (curplug->cleanup_handler && !curplug->cleanup_done)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
! 	  enum ld_plugin_status rv;
Nick Clifton d43b72
! 	  curplug->cleanup_done = TRUE;
Nick Clifton d43b72
! 	  called_plugin = curplug;
Nick Clifton d43b72
! 	  rv = (*curplug->cleanup_handler) ();
Nick Clifton d43b72
! 	  called_plugin = NULL;
Nick Clifton d43b72
! 	  if (rv != LDPS_OK)
Nick Clifton d43b72
! 	    info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
Nick Clifton d43b72
! 		      curplug->name, rv);
Nick Clifton d43b72
  	  dlclose (curplug->dlhandle);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
        curplug = curplug->next;
Nick Clifton d43b72
--- 946,962 ----
Nick Clifton d43b72
      {
Nick Clifton d43b72
        if (curplug->cleanup_handler && !curplug->cleanup_done)
Nick Clifton d43b72
  	{
Nick Clifton d43b72
! 	  if (!plugin_save_temps)
Nick Clifton d43b72
! 	    {
Nick Clifton d43b72
! 	      enum ld_plugin_status rv;
Nick Clifton d43b72
! 	      curplug->cleanup_done = TRUE;
Nick Clifton d43b72
! 	      called_plugin = curplug;
Nick Clifton d43b72
! 	      rv = (*curplug->cleanup_handler) ();
Nick Clifton d43b72
! 	      called_plugin = NULL;
Nick Clifton d43b72
! 	      if (rv != LDPS_OK)
Nick Clifton d43b72
! 		info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"),
Nick Clifton d43b72
! 			  curplug->name, rv);
Nick Clifton d43b72
! 	    }
Nick Clifton d43b72
  	  dlclose (curplug->dlhandle);
Nick Clifton d43b72
  	}
Nick Clifton d43b72
        curplug = curplug->next;
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/plugin.h ld/plugin.h
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/plugin.h	2013-05-14 16:39:39.705718176 +0100
Nick Clifton d43b72
--- ld/plugin.h	2013-05-14 16:40:07.059718934 +0100
Nick Clifton d43b72
***************
Nick Clifton d43b72
*** 24,29 ****
Nick Clifton d43b72
--- 24,32 ----
Nick Clifton d43b72
  /* Report plugin symbols.  */
Nick Clifton d43b72
  extern bfd_boolean report_plugin_symbols;
Nick Clifton d43b72
  
Nick Clifton d43b72
+ /* Store plugin intermediate files permanently.  */
Nick Clifton d43b72
+ extern bfd_boolean plugin_save_temps;
Nick Clifton d43b72
+ 
Nick Clifton d43b72
  /* Set at all symbols read time, to avoid recursively offering the plugin
Nick Clifton d43b72
     its own newly-added input files and libs to claim.  */
Nick Clifton d43b72
  extern bfd_boolean no_more_claiming;
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/armbpabi.sc ld/scripttempl/armbpabi.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/armbpabi.sc	2013-05-14 16:39:39.758718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/armbpabi.sc	2013-05-14 16:54:15.657742458 +0100
Nick Clifton d43b72
*************** INTERP=".interp       0 : { *(.interp) }
Nick Clifton d43b72
*** 30,36 ****
Nick Clifton d43b72
  PLT=".plt          ${RELOCATING-0} : { *(.plt) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
--- 30,36 ----
Nick Clifton d43b72
  PLT=".plt          ${RELOCATING-0} : { *(.plt) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf32sh-symbian.sc ld/scripttempl/elf32sh-symbian.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/elf32sh-symbian.sc	2013-05-14 16:39:39.759718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/elf32sh-symbian.sc	2013-05-14 16:40:07.062718934 +0100
Nick Clifton d43b72
*************** fi
Nick Clifton d43b72
*** 83,89 ****
Nick Clifton d43b72
      PLT=".plt            : { *(.plt) } :dynamic :dyn"
Nick Clifton d43b72
  DYNAMIC=".dynamic        : { *(.dynamic) } :dynamic :dyn"
Nick Clifton d43b72
   RODATA=".rodata    ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive)  *(.gnu.lto_*) }"
Nick Clifton d43b72
  test -z "$GOT" && GOT=".got          ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn"
Nick Clifton d43b72
  INIT_ARRAY=".init_array   ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
--- 83,89 ----
Nick Clifton d43b72
      PLT=".plt            : { *(.plt) } :dynamic :dyn"
Nick Clifton d43b72
  DYNAMIC=".dynamic        : { *(.dynamic) } :dynamic :dyn"
Nick Clifton d43b72
   RODATA=".rodata    ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive)  *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  test -z "$GOT" && GOT=".got          ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn"
Nick Clifton d43b72
  INIT_ARRAY=".init_array   ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf64hppa.sc ld/scripttempl/elf64hppa.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/elf64hppa.sc	2013-05-14 16:39:39.733718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/elf64hppa.sc	2013-05-14 16:55:16.076744133 +0100
Nick Clifton d43b72
*************** fi
Nick Clifton d43b72
*** 127,133 ****
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
--- 127,133 ----
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf.sc ld/scripttempl/elf.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/elf.sc	2013-05-14 16:39:39.755718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/elf.sc	2013-05-14 16:54:44.618743261 +0100
Nick Clifton d43b72
*************** RELA_IPLT=".rela.iplt    ${RELOCATING-0}
Nick Clifton d43b72
*** 158,164 ****
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".${RODATA_NAME}       ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".${SBSS_NAME}         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
--- 158,164 ----
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".${RODATA_NAME}       ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".${SBSS_NAME}         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elfxtensa.sc ld/scripttempl/elfxtensa.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/elfxtensa.sc	2013-05-14 16:39:39.754718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/elfxtensa.sc	2013-05-14 16:55:44.908744932 +0100
Nick Clifton d43b72
*************** fi
Nick Clifton d43b72
*** 140,146 ****
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
Nick Clifton d43b72
  INIT_LIT=".init.literal 0 : { *(.init.literal)	}"
Nick Clifton d43b72
  INIT=".init         0 : { *(.init)		}"
Nick Clifton d43b72
  FINI_LIT=".fini.literal 0 : { *(.fini.literal)	}"
Nick Clifton d43b72
--- 140,146 ----
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  INIT_LIT=".init.literal 0 : { *(.init.literal)	}"
Nick Clifton d43b72
  INIT=".init         0 : { *(.init)		}"
Nick Clifton d43b72
  FINI_LIT=".fini.literal 0 : { *(.fini.literal)	}"
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/mep.sc ld/scripttempl/mep.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/mep.sc	2013-05-14 16:39:39.755718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/mep.sc	2013-05-14 16:56:08.605745589 +0100
Nick Clifton d43b72
*************** fi
Nick Clifton d43b72
*** 114,120 ****
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
--- 114,120 ----
Nick Clifton d43b72
  DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
Nick Clifton d43b72
  RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
Nick Clifton d43b72
  DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
Nick Clifton d43b72
! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }"
Nick Clifton d43b72
  if test -z "${NO_SMALL_DATA}"; then
Nick Clifton d43b72
    SBSS=".sbss         ${RELOCATING-0} :
Nick Clifton d43b72
    {
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/pep.sc ld/scripttempl/pep.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/pep.sc	2013-05-14 16:39:39.755718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/pep.sc	2013-05-14 16:40:07.064718934 +0100
Nick Clifton d43b72
*************** SECTIONS
Nick Clifton d43b72
*** 154,159 ****
Nick Clifton d43b72
--- 154,160 ----
Nick Clifton d43b72
      *(.drectve)
Nick Clifton d43b72
      ${RELOCATING+ *(.note.GNU-stack)}
Nick Clifton d43b72
      ${RELOCATING+ *(.gnu.lto_*)}
Nick Clifton d43b72
+     ${RELOCATING+ *(.gnu_object_only)}
Nick Clifton d43b72
    }
Nick Clifton d43b72
  
Nick Clifton d43b72
    .idata ${RELOCATING+BLOCK(__section_alignment__)} :
Nick Clifton d43b72
diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/pe.sc ld/scripttempl/pe.sc
Nick Clifton d43b72
*** ../binutils-2.23.2.orig/ld/scripttempl/pe.sc	2013-05-14 16:39:39.758718177 +0100
Nick Clifton d43b72
--- ld/scripttempl/pe.sc	2013-05-14 16:40:07.064718934 +0100
Nick Clifton d43b72
*************** SECTIONS
Nick Clifton d43b72
*** 148,153 ****
Nick Clifton d43b72
--- 148,154 ----
Nick Clifton d43b72
      *(.drectve)
Nick Clifton d43b72
      ${RELOCATING+ *(.note.GNU-stack)}
Nick Clifton d43b72
      ${RELOCATING+ *(.gnu.lto_*)}
Nick Clifton d43b72
+     ${RELOCATING+ *(.gnu_object_only)}
Nick Clifton d43b72
    }
Nick Clifton d43b72
  
Nick Clifton d43b72
    .idata ${RELOCATING+BLOCK(__section_alignment__)} :