* dwarf2.h: Mention the location of the DWARF3 spec on the web.
[deliverable/binutils-gdb.git] / binutils / objcopy.c
index ef57c2bf4ae045d9670b0355e9f3c149afa5256e..b89de4656193cbb458483eed4995b2f64515d14f 100644 (file)
@@ -7,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -64,7 +64,10 @@ section_rename;
 /* List of sections to be renamed.  */
 static section_rename *section_rename_list;
 
-#define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
+#define RETURN_NONFATAL(bfd) \
+  do { \
+    status = 1; bfd_nonfatal_message (NULL, bfd, NULL, NULL); return; \
+  } while (0)
 
 static asymbol **isympp = NULL;        /* Input symbols.  */
 static asymbol **osympp = NULL;        /* Output symbols that survive stripping.  */
@@ -910,8 +913,7 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
 {
   asymbol **from = isyms, **to = osyms;
   long src_count = 0, dst_count = 0;
-  int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC))
-                   == HAS_RELOC;
+  int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
 
   for (; src_count < symcount; src_count++)
     {
@@ -1071,7 +1073,7 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
            }
 
          if (!undefined
-             && (flags & BSF_LOCAL) 
+             && (flags & BSF_LOCAL)
              && is_specified_symbol (name, globalize_specific_list))
            {
              sym->flags &= ~ BSF_LOCAL;
@@ -1214,7 +1216,7 @@ add_redefine_syms_file (const char *filename)
          if (buf[0] != '\0')
            redefine_list_append (filename, &buf[0], &buf[outsym_off]);
 
-         lineno++;     
+         lineno++;
          len = 0;
          outsym_off = 0;
          if (c == EOF)
@@ -1255,7 +1257,7 @@ copy_unknown_object (bfd *ibfd, bfd *obfd)
 
   if (bfd_stat_arch_elt (ibfd, &buf) != 0)
     {
-      bfd_nonfatal (bfd_get_archive_filename (ibfd));
+      bfd_nonfatal_message (bfd_get_archive_filename (ibfd), NULL, NULL, NULL);
       return FALSE;
     }
 
@@ -1288,7 +1290,8 @@ copy_unknown_object (bfd *ibfd, bfd *obfd)
       if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
          != (bfd_size_type) tocopy)
        {
-         bfd_nonfatal (bfd_get_archive_filename (ibfd));
+         bfd_nonfatal_message (bfd_get_archive_filename (ibfd),
+                               NULL, NULL, NULL);
          free (cbuf);
          return FALSE;
        }
@@ -1296,7 +1299,7 @@ copy_unknown_object (bfd *ibfd, bfd *obfd)
       if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
          != (bfd_size_type) tocopy)
        {
-         bfd_nonfatal (bfd_get_filename (obfd));
+         bfd_nonfatal_message (NULL, obfd, NULL, NULL);
          free (cbuf);
          return FALSE;
        }
@@ -1333,7 +1336,7 @@ copy_object (bfd *ibfd, bfd *obfd)
 
   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
     {
-      bfd_nonfatal (bfd_get_filename (obfd));
+      bfd_nonfatal_message (NULL, obfd, NULL, NULL);
       return FALSE;
     }
 
@@ -1367,7 +1370,8 @@ copy_object (bfd *ibfd, bfd *obfd)
       if (!bfd_set_start_address (obfd, start)
          || !bfd_set_file_flags (obfd, flags))
        {
-         bfd_nonfatal (bfd_get_archive_filename (ibfd));
+         bfd_nonfatal_message (bfd_get_archive_filename (ibfd),
+                               NULL, NULL, NULL);
          return FALSE;
        }
     }
@@ -1391,7 +1395,7 @@ copy_object (bfd *ibfd, bfd *obfd)
 
   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
     {
-      bfd_nonfatal (bfd_get_archive_filename (ibfd));
+      bfd_nonfatal_message (bfd_get_archive_filename (ibfd), NULL, NULL, NULL);
       return FALSE;
     }
 
@@ -1407,7 +1411,7 @@ copy_object (bfd *ibfd, bfd *obfd)
   symsize = bfd_get_symtab_upper_bound (ibfd);
   if (symsize < 0)
     {
-      bfd_nonfatal (bfd_get_archive_filename (ibfd));
+      bfd_nonfatal_message (bfd_get_archive_filename (ibfd), NULL, NULL, NULL);
       return FALSE;
     }
 
@@ -1415,7 +1419,7 @@ copy_object (bfd *ibfd, bfd *obfd)
   symcount = bfd_canonicalize_symtab (ibfd, isympp);
   if (symcount < 0)
     {
-      bfd_nonfatal (bfd_get_filename (ibfd));
+      bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
       return FALSE;
     }
 
@@ -1446,7 +1450,8 @@ copy_object (bfd *ibfd, bfd *obfd)
             error codes, so check for the most likely user error first.  */
          if (bfd_get_section_by_name (obfd, padd->name))
            {
-             non_fatal (_("can't add section '%s' - it already exists!"), padd->name);
+             bfd_nonfatal_message (NULL, obfd, NULL,
+                                _("can't add section '%s'"), padd->name);
              return FALSE;
            }
          else
@@ -1454,15 +1459,16 @@ copy_object (bfd *ibfd, bfd *obfd)
              padd->section = bfd_make_section_with_flags (obfd, padd->name, flags);
              if (padd->section == NULL)
                {
-                 non_fatal (_("can't create section `%s': %s"),
-                            padd->name, bfd_errmsg (bfd_get_error ()));
+                 bfd_nonfatal_message (NULL, obfd, NULL,
+                                       _("can't create section `%s'"),
+                                       padd->name);
                  return FALSE;
                }
            }
 
          if (! bfd_set_section_size (obfd, padd->section, padd->size))
            {
-             bfd_nonfatal (bfd_get_filename (obfd));
+             bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
              return FALSE;
            }
 
@@ -1472,7 +1478,7 @@ copy_object (bfd *ibfd, bfd *obfd)
                if (! bfd_set_section_vma (obfd, padd->section,
                                           pset->vma_val))
                  {
-                   bfd_nonfatal (bfd_get_filename (obfd));
+                   bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
                    return FALSE;
                  }
 
@@ -1484,7 +1490,7 @@ copy_object (bfd *ibfd, bfd *obfd)
                      (obfd, padd->section,
                       bfd_section_alignment (obfd, padd->section)))
                    {
-                     bfd_nonfatal (bfd_get_filename (obfd));
+                     bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
                      return FALSE;
                    }
                }
@@ -1499,7 +1505,9 @@ copy_object (bfd *ibfd, bfd *obfd)
 
       if (gnu_debuglink_section == NULL)
        {
-         bfd_nonfatal (gnu_debuglink_filename);
+         bfd_nonfatal_message (NULL, obfd, NULL,
+                               _("cannot create debug link section `%s'"),
+                               gnu_debuglink_filename);
          return FALSE;
        }
 
@@ -1590,9 +1598,8 @@ copy_object (bfd *ibfd, bfd *obfd)
                  if (! bfd_set_section_size (obfd, osections[i],
                                              size + (gap_stop - gap_start)))
                    {
-                     non_fatal (_("Can't fill gap after %s: %s"),
-                                bfd_get_section_name (obfd, osections[i]),
-                                bfd_errmsg (bfd_get_error ()));
+                     bfd_nonfatal_message (NULL, obfd, osections[i],
+                                           _("Can't fill gap after section"));
                      status = 1;
                      break;
                    }
@@ -1615,9 +1622,8 @@ copy_object (bfd *ibfd, bfd *obfd)
              if (! bfd_set_section_size (obfd, osections[c - 1],
                                          pad_to - lma))
                {
-                 non_fatal (_("Can't add padding to %s: %s"),
-                            bfd_get_section_name (obfd, osections[c - 1]),
-                            bfd_errmsg (bfd_get_error ()));
+                 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
+                                       _("can't add padding"));
                  status = 1;
                }
              else
@@ -1696,7 +1702,7 @@ copy_object (bfd *ibfd, bfd *obfd)
          if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
                                          0, padd->size))
            {
-             bfd_nonfatal (bfd_get_filename (obfd));
+             bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
              return FALSE;
            }
        }
@@ -1707,7 +1713,9 @@ copy_object (bfd *ibfd, bfd *obfd)
       if (! bfd_fill_in_gnu_debuglink_section
          (obfd, gnu_debuglink_section, gnu_debuglink_filename))
        {
-         bfd_nonfatal (gnu_debuglink_filename);
+         bfd_nonfatal_message (NULL, obfd, NULL,
+                               _("cannot fill debug link section `%s'"),
+                               gnu_debuglink_filename);
          return FALSE;
        }
     }
@@ -1746,7 +1754,7 @@ copy_object (bfd *ibfd, bfd *obfd)
                  if (! bfd_set_section_contents (obfd, osections[i], buf,
                                                  off, now))
                    {
-                     bfd_nonfatal (bfd_get_filename (obfd));
+                     bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
                      return FALSE;
                    }
 
@@ -1766,16 +1774,10 @@ copy_object (bfd *ibfd, bfd *obfd)
      from the input BFD to the output BFD.  This is done last to
      permit the routine to look at the filtered symbol table, which is
      important for the ECOFF code at least.  */
-  if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
-      && strip_symbols == STRIP_NONDEBUG)
-    /* Do not copy the private data when creating an ELF format
-       debug info file.  We do not want the program headers.  */
-    ;
-  else if (! bfd_copy_private_bfd_data (ibfd, obfd))
-    {
-      non_fatal (_("%s: error copying private BFD data: %s"),
-                bfd_get_filename (obfd),
-                bfd_errmsg (bfd_get_error ()));
+  if (! bfd_copy_private_bfd_data (ibfd, obfd))
+    {
+      bfd_nonfatal_message (NULL, obfd, NULL,
+                           _("error copying private BFD data"));
       return FALSE;
     }
 
@@ -1834,7 +1836,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
   this_element = bfd_openr_next_archived_file (ibfd, NULL);
 
   if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
-    RETURN_NONFATAL (bfd_get_filename (obfd));
+    RETURN_NONFATAL (obfd);
 
   while (!status && this_element != NULL)
     {
@@ -1891,7 +1893,11 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
            output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
 
          if (output_bfd == NULL)
-           RETURN_NONFATAL (output_name);
+           {
+             bfd_nonfatal_message (output_name, NULL, NULL, NULL);
+             status = 1;
+             return;
+           }
 
          delete = ! copy_object (this_element, output_bfd);
 
@@ -1900,7 +1906,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
            {
              if (!bfd_close (output_bfd))
                {
-                 bfd_nonfatal (bfd_get_filename (output_bfd));
+                 bfd_nonfatal_message (NULL, output_bfd, NULL, NULL);
                  /* Error in new object file. Don't change archive.  */
                  status = 1;
                }
@@ -1910,15 +1916,16 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
        }
       else
        {
-         non_fatal (_("Unable to recognise the format of the input file `%s'"),
-                    bfd_get_archive_filename (this_element));
+         bfd_nonfatal_message (bfd_get_archive_filename (this_element),
+                               NULL, NULL,
+                               _("Unable to recognise the format of file"));
 
          output_bfd = bfd_openw (output_name, output_target);
 copy_unknown_element:
          delete = !copy_unknown_object (this_element, output_bfd);
          if (!bfd_close_all_done (output_bfd))
            {
-             bfd_nonfatal (bfd_get_filename (output_bfd));
+             bfd_nonfatal_message (NULL, output_bfd, NULL, NULL);
              /* Error in new object file. Don't change archive.  */
              status = 1;
            }
@@ -1940,7 +1947,7 @@ copy_unknown_element:
          l->obfd = output_bfd;
 
          *ptr = output_bfd;
-         ptr = &output_bfd->next;
+         ptr = &output_bfd->archive_next;
 
          last_element = this_element;
 
@@ -1952,10 +1959,10 @@ copy_unknown_element:
   *ptr = NULL;
 
   if (!bfd_close (obfd))
-    RETURN_NONFATAL (bfd_get_filename (obfd));
+    RETURN_NONFATAL (obfd);
 
   if (!bfd_close (ibfd))
-    RETURN_NONFATAL (bfd_get_filename (ibfd));
+    RETURN_NONFATAL (obfd);
 
   /* Delete all the files that we opened.  */
   for (l = list; l != NULL; l = l->next)
@@ -1991,7 +1998,11 @@ copy_file (const char *input_filename, const char *output_filename,
      non-object file, failures are nonfatal.  */
   ibfd = bfd_openr (input_filename, input_target);
   if (ibfd == NULL)
-    RETURN_NONFATAL (input_filename);
+    {
+      bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
+      status = 1;
+      return;
+    }
 
   if (bfd_check_format (ibfd, bfd_archive))
     {
@@ -2010,7 +2021,11 @@ copy_file (const char *input_filename, const char *output_filename,
 
       obfd = bfd_openw (output_filename, output_target);
       if (obfd == NULL)
-       RETURN_NONFATAL (output_filename);
+       {
+         bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
+         status = 1;
+         return;
+       }
 
       copy_archive (ibfd, obfd, output_target, force_output_target);
     }
@@ -2026,17 +2041,20 @@ copy_file (const char *input_filename, const char *output_filename,
 
       obfd = bfd_openw (output_filename, output_target);
       if (obfd == NULL)
-       RETURN_NONFATAL (output_filename);
+       {
+         bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
+         status = 1;
+         return;
+       }
 
       if (! copy_object (ibfd, obfd))
        status = 1;
 
       if (!bfd_close (obfd))
-       RETURN_NONFATAL (output_filename);
+       RETURN_NONFATAL (obfd);
 
       if (!bfd_close (ibfd))
-       RETURN_NONFATAL (input_filename);
-
+       RETURN_NONFATAL (ibfd);
     }
   else
     {
@@ -2056,7 +2074,7 @@ copy_file (const char *input_filename, const char *output_filename,
       if (obj_error != core_error)
        bfd_set_error (obj_error);
 
-      bfd_nonfatal (input_filename);
+      bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
 
       if (obj_error == bfd_error_file_ambiguously_recognized)
        {
@@ -2135,24 +2153,18 @@ find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
 static void
 setup_bfd_headers (bfd *ibfd, bfd *obfd)
 {
-  const char *err;
-
   /* Allow the BFD backend to copy any private data it understands
      from the input section to the output section.  */
   if (! bfd_copy_private_header_data (ibfd, obfd))
     {
-      err = _("private header data");
-      goto loser;
+      status = 1;
+      bfd_nonfatal_message (NULL, ibfd, NULL,
+                           _("error in private h       eader data"));
+      return;
     }
 
   /* All went well.  */
   return;
-
-loser:
-  non_fatal (_("%s: error in %s: %s"),
-            bfd_get_filename (ibfd),
-            err, bfd_errmsg (bfd_get_error ()));
-  status = 1;
 }
 
 /* Create a section in OBFD with the same
@@ -2171,6 +2183,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
   const char *err;
   const char * name;
   char *prefix = NULL;
+  bfd_boolean make_nobits;
 
   if (is_strip_section (ibfd, isection))
     return;
@@ -2199,23 +2212,36 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       name = n;
     }
 
+  make_nobits = FALSE;
   if (p != NULL && p->set_flags)
     flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
-  else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0)
-    flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+  else if (strip_symbols == STRIP_NONDEBUG
+          && (flags & SEC_ALLOC) != 0
+          && (ibfd->xvec->flavour != bfd_target_elf_flavour
+              || elf_section_type (isection) != SHT_NOTE))
+    {
+      flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+      if (obfd->xvec->flavour == bfd_target_elf_flavour)
+       {
+         make_nobits = TRUE;
+
+         /* Twiddle the input section flags so that it seems to
+            elf.c:copy_private_bfd_data that section flags have not
+            changed between input and output sections.  This hack
+            prevents wholesale rewriting of the program headers.  */
+         isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
+       }
+    }
 
   osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
 
   if (osection == NULL)
     {
-      err = _("making");
+      err = _("failed to create output section");
       goto loser;
     }
 
-  if (strip_symbols == STRIP_NONDEBUG
-      && obfd->xvec->flavour == bfd_target_elf_flavour
-      && (flags & SEC_ALLOC) != 0
-      && (p == NULL || !p->set_flags))
+  if (make_nobits)
     elf_section_type (osection) = SHT_NOBITS;
 
   size = bfd_section_size (ibfd, isection);
@@ -2225,7 +2251,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
     size = 0;
   if (! bfd_set_section_size (obfd, osection, size))
     {
-      err = _("size");
+      err = _("failed to set size");
       goto loser;
     }
 
@@ -2239,7 +2265,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
 
   if (! bfd_set_section_vma (obfd, osection, extract_symbol ? 0 : vma))
     {
-      err = _("vma");
+      err = _("failed to set vma");
       goto loser;
     }
 
@@ -2264,7 +2290,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
                                  osection,
                                  bfd_section_alignment (ibfd, isection)))
     {
-      err = _("alignment");
+      err = _("failed to set alignment");
       goto loser;
     }
 
@@ -2284,14 +2310,9 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
 
   /* Allow the BFD backend to copy any private data it understands
      from the input section to the output section.  */
-  if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
-      && strip_symbols == STRIP_NONDEBUG)
-    /* Do not copy the private data when creating an ELF format
-       debug info file.  We do not want the program headers.  */
-    ;
-  else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
-    {
-      err = _("private data");
+  if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
+    {
+      err = _("failed to copy private data");
       goto loser;
     }
   else if ((isection->flags & SEC_GROUP) != 0)
@@ -2306,11 +2327,8 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
   return;
 
 loser:
-  non_fatal (_("%s: section `%s': error in %s: %s"),
-            bfd_get_filename (ibfd),
-            bfd_section_name (ibfd, isection),
-            err, bfd_errmsg (bfd_get_error ()));
   status = 1;
+  bfd_nonfatal_message (NULL, obfd, osection, err);
 }
 
 /* Copy the data of input section ISECTION of IBFD
@@ -2362,7 +2380,11 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
          if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
            relsize = 0;
          else
-           RETURN_NONFATAL (bfd_get_filename (ibfd));
+           {
+             status = 1;
+             bfd_nonfatal_message (NULL, ibfd, isection, NULL);
+             return;
+           }
        }
     }
 
@@ -2373,7 +2395,12 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       relpp = xmalloc (relsize);
       relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
       if (relcount < 0)
-       RETURN_NONFATAL (bfd_get_filename (ibfd));
+       {
+         status = 1;
+         bfd_nonfatal_message (NULL, ibfd, isection,
+                               _("relocation count is negative"));
+         return;
+       }
 
       if (strip_symbols == STRIP_ALL)
        {
@@ -2407,7 +2434,11 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
       void *memhunk = xmalloc (size);
 
       if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
-       RETURN_NONFATAL (bfd_get_filename (ibfd));
+       {
+         status = 1;
+         bfd_nonfatal_message (NULL, ibfd, isection, NULL);
+         return;
+       }
 
       if (reverse_bytes)
        {
@@ -2450,8 +2481,11 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
        }
 
       if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
-       RETURN_NONFATAL (bfd_get_filename (obfd));
-
+       {
+         status = 1;
+         bfd_nonfatal_message (NULL, obfd, osection, NULL);
+         return;
+       }
       free (memhunk);
     }
   else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
@@ -2466,7 +2500,11 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
 
       memset (memhunk, 0, size);
       if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
-       RETURN_NONFATAL (bfd_get_filename (obfd));
+       {
+         status = 1;
+         bfd_nonfatal_message (NULL, obfd, osection, NULL);
+         return;
+       }
       free (memhunk);
     }
 }
@@ -2607,9 +2645,8 @@ write_debugging_info (bfd *obfd, void *dhandle,
          || ! bfd_set_section_alignment (obfd, stabsec, 2)
          || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
        {
-         non_fatal (_("%s: can't create debugging section: %s"),
-                    bfd_get_filename (obfd),
-                    bfd_errmsg (bfd_get_error ()));
+         bfd_nonfatal_message (NULL, obfd, NULL,
+                               _("can't create debugging section"));
          return FALSE;
        }
 
@@ -2621,17 +2658,17 @@ write_debugging_info (bfd *obfd, void *dhandle,
          || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
                                         stringsize))
        {
-         non_fatal (_("%s: can't set debugging section contents: %s"),
-                    bfd_get_filename (obfd),
-                    bfd_errmsg (bfd_get_error ()));
+         bfd_nonfatal_message (NULL, obfd, NULL,
+                               _("can't set debugging section contents"));
          return FALSE;
        }
 
       return TRUE;
     }
 
-  non_fatal (_("%s: don't know how to write debugging information for %s"),
-            bfd_get_filename (obfd), bfd_get_target (obfd));
+  bfd_nonfatal_message (NULL, obfd, NULL,
+                       _("don't know how to write debugging information for %s"),
+            bfd_get_target (obfd));
   return FALSE;
 }
 
@@ -2729,7 +2766,7 @@ strip_main (int argc, char *argv[])
       display_info ();
       return 0;
     }
+
   if (show_version)
     print_version ("strip");
 
@@ -2764,15 +2801,15 @@ strip_main (int argc, char *argv[])
           It has already been checked in get_file_size().  */
        stat (argv[i], &statbuf);
 
-      if (output_file != NULL)
-       tmpname = output_file;
-      else
+      if (output_file == NULL || strcmp (argv[i], output_file) == 0)
        tmpname = make_tempname (argv[i]);
+      else
+       tmpname = output_file;
 
       if (tmpname == NULL)
        {
-         non_fatal (_("could not create temporary file to hold stripped copy of '%s'"),
-                    argv[i]);
+         bfd_nonfatal_message (argv[i], NULL, NULL,
+                               _("could not create temporary file to hold stripped copy"));
          status = 1;
          continue;
        }
@@ -2783,13 +2820,14 @@ strip_main (int argc, char *argv[])
        {
          if (preserve_dates)
            set_times (tmpname, &statbuf);
-         if (output_file == NULL)
-           smart_rename (tmpname, argv[i], preserve_dates);
+         if (output_file != tmpname)
+           smart_rename (tmpname, output_file ? output_file : argv[i],
+                         preserve_dates);
          status = hold_status;
        }
       else
        unlink_if_ordinary (tmpname);
-      if (output_file == NULL)
+      if (output_file != tmpname)
        free (tmpname);
     }
 
@@ -2802,6 +2840,7 @@ copy_main (int argc, char *argv[])
   char * binary_architecture = NULL;
   char *input_filename = NULL;
   char *output_filename = NULL;
+  char *tmpname;
   char *input_target = NULL;
   char *output_target = NULL;
   bfd_boolean show_version = FALSE;
@@ -3340,7 +3379,7 @@ copy_main (int argc, char *argv[])
       display_info ();
       return 0;
     }
+
   if (show_version)
     print_version ("objcopy");
 
@@ -3392,32 +3431,24 @@ copy_main (int argc, char *argv[])
   /* If there is no destination file, or the source and destination files
      are the same, then create a temp and rename the result into the input.  */
   if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
-    {
-      char *tmpname = make_tempname (input_filename);
+    tmpname = make_tempname (input_filename);
+  else
+    tmpname = output_filename;
 
-      if (tmpname == NULL)
-       fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
-              input_filename, strerror (errno));
+  if (tmpname == NULL)
+    fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
+          input_filename, strerror (errno));
 
-      copy_file (input_filename, tmpname, input_target, output_target);
-      if (status == 0)
-       {
-         if (preserve_dates)
-           set_times (tmpname, &statbuf);
-         smart_rename (tmpname, input_filename, preserve_dates);
-       }
-      else
-       unlink (tmpname);
-    }
-  else
+  copy_file (input_filename, tmpname, input_target, output_target);
+  if (status == 0)
     {
-      copy_file (input_filename, output_filename, input_target, output_target);
-
-      if (status == 0 && preserve_dates)
-       set_times (output_filename, &statbuf);
-      else if (status != 0)
-       unlink_if_ordinary (output_filename);
+      if (preserve_dates)
+       set_times (tmpname, &statbuf);
+      if (tmpname != output_filename)
+       smart_rename (tmpname, input_filename, preserve_dates);
     }
+  else
+    unlink_if_ordinary (tmpname);
 
   if (change_warn)
     {
This page took 0.033944 seconds and 4 git commands to generate.