Make objcopy -p work when an output file is specified
authorAlan Modra <amodra@gmail.com>
Wed, 14 Apr 2021 16:03:13 +0000 (01:33 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 15 Apr 2021 04:46:55 +0000 (14:16 +0930)
More fallout from the PR27456 fixes.

PR 27456
* rename.c (smart_rename): When TO and FROM are equal, just set
file timestamp.
* objcopy.c (strip_main, copy_main): Always call smart_rename.

binutils/ChangeLog
binutils/objcopy.c
binutils/rename.c

index b109e3e5c2a71c8239c5a391cfce1f2878af24db..f8a74d14620e3deb1de94acd2a7247f601842fb9 100644 (file)
@@ -1,3 +1,10 @@
+2021-04-15  Alan Modra  <amodra@gmail.com>
+
+       PR 27456
+       * rename.c (smart_rename): When TO and FROM are equal, just set
+       file timestamp.
+       * objcopy.c (strip_main, copy_main): Always call smart_rename.
+
 2021-04-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR binutils/27708
index 3b6a7e501697858a05a4ba8b4af23cd506abca1e..946802ebb78831e6463315d2bbcf7f57cf643b34 100644 (file)
@@ -4864,10 +4864,9 @@ strip_main (int argc, char *argv[])
                 output_target, NULL);
       if (status == 0)
        {
-         if (output_file != tmpname)
-           status = smart_rename (tmpname,
-                                  output_file ? output_file : argv[i],
-                                  copyfd, &statbuf, preserve_dates) != 0;
+         const char *oname = output_file ? output_file : argv[i];
+         status = smart_rename (tmpname, oname, copyfd,
+                                &statbuf, preserve_dates) != 0;
          if (status == 0)
            status = hold_status;
        }
@@ -5949,9 +5948,9 @@ copy_main (int argc, char *argv[])
             output_target, input_arch);
   if (status == 0)
     {
-      if (tmpname != output_filename)
-       status = smart_rename (tmpname, input_filename, copyfd,
-                              &statbuf, preserve_dates) != 0;
+      const char *oname = output_filename ? output_filename : input_filename;
+      status = smart_rename (tmpname, oname, copyfd,
+                            &statbuf, preserve_dates) != 0;
     }
   else
     {
index 9746ef394e16a5d6910754c7929a0811723ddf96..969acc12b30600f6bc5825678a4716e39d61d91f 100644 (file)
@@ -129,16 +129,19 @@ int
 smart_rename (const char *from, const char *to, int fromfd,
              struct stat *target_stat, bool preserve_dates)
 {
-  int ret;
+  int ret = 0;
 
-  ret = simple_copy (fromfd, to, target_stat);
-  if (ret != 0)
-    non_fatal (_("unable to copy file '%s'; reason: %s"),
-              to, strerror (errno));
+  if (to != from)
+    {
+      ret = simple_copy (fromfd, to, target_stat);
+      if (ret != 0)
+       non_fatal (_("unable to copy file '%s'; reason: %s"),
+                  to, strerror (errno));
+      unlink (from);
+    }
 
   if (preserve_dates)
     set_times (to, target_stat);
-  unlink (from);
 
   return ret;
 }