Make objcopy -p work when an output file is specified

Message ID 20210415044804.GP5425@bubble.grove.modra.org
State New
Headers show
Series
  • Make objcopy -p work when an output file is specified
Related show

Commit Message

Luis Machado via Binutils April 15, 2021, 4:48 a.m.
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.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 3b6a7e50169..946802ebb78 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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
     {
diff --git a/binutils/rename.c b/binutils/rename.c
index 9746ef394e1..969acc12b30 100644
--- a/binutils/rename.c
+++ b/binutils/rename.c
@@ -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;
 }