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.
This commit is contained in:
Alan Modra
2021-04-15 01:33:13 +09:30
parent ddfe525f28
commit d0ecdcddc3
3 changed files with 22 additions and 13 deletions

View 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> 2021-04-14 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/27708 PR binutils/27708

View File

@ -4864,10 +4864,9 @@ strip_main (int argc, char *argv[])
output_target, NULL); output_target, NULL);
if (status == 0) if (status == 0)
{ {
if (output_file != tmpname) const char *oname = output_file ? output_file : argv[i];
status = smart_rename (tmpname, status = smart_rename (tmpname, oname, copyfd,
output_file ? output_file : argv[i], &statbuf, preserve_dates) != 0;
copyfd, &statbuf, preserve_dates) != 0;
if (status == 0) if (status == 0)
status = hold_status; status = hold_status;
} }
@ -5949,9 +5948,9 @@ copy_main (int argc, char *argv[])
output_target, input_arch); output_target, input_arch);
if (status == 0) if (status == 0)
{ {
if (tmpname != output_filename) const char *oname = output_filename ? output_filename : input_filename;
status = smart_rename (tmpname, input_filename, copyfd, status = smart_rename (tmpname, oname, copyfd,
&statbuf, preserve_dates) != 0; &statbuf, preserve_dates) != 0;
} }
else else
{ {

View File

@ -129,16 +129,19 @@ int
smart_rename (const char *from, const char *to, int fromfd, smart_rename (const char *from, const char *to, int fromfd,
struct stat *target_stat, bool preserve_dates) struct stat *target_stat, bool preserve_dates)
{ {
int ret; int ret = 0;
ret = simple_copy (fromfd, to, target_stat); if (to != from)
if (ret != 0) {
non_fatal (_("unable to copy file '%s'; reason: %s"), ret = simple_copy (fromfd, to, target_stat);
to, strerror (errno)); if (ret != 0)
non_fatal (_("unable to copy file '%s'; reason: %s"),
to, strerror (errno));
unlink (from);
}
if (preserve_dates) if (preserve_dates)
set_times (to, target_stat); set_times (to, target_stat);
unlink (from);
return ret; return ret;
} }