From d0ecdcddc363ad7f05fc50cf1eee4028fa7f8964 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 15 Apr 2021 01:33:13 +0930 Subject: [PATCH] Make objcopy -p work when an output file is specified 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 | 7 +++++++ binutils/objcopy.c | 13 ++++++------- binutils/rename.c | 15 +++++++++------ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b109e3e5c2a..f8a74d14620 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2021-04-15 Alan Modra + + 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 PR binutils/27708 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; } -- 2.30.2