[PATCH v4] ld: Rename a file on Windows fails if target already exists
Maciej W. Rozycki
macro@orcam.me.uk
Thu Jul 31 22:16:51 GMT 2025
On Tue, 22 Jul 2025, Torbjorn SVENSSON wrote:
> > Okay for master (iirc Nick gave his okay for the branch already) with a
> > few more cosmetics done:
>
> Fixed the cosmetics and pushed as 233cd5946413108bf4902b22a9cb23ad0a468f5e to
> master and 888f048f72609f716dfc6da21f766c22e5866fad to binutils-2_45 branch.
This went through the whole review cycle while I was away and I had no
opportunity to object.
Nobody has raised the concern about losing the filesystem atomicity of
rename(2) with this change, which is a regression on POSIX systems. I'd
expect a failure to rename a file for any reason to retain any original
file.
With this change in place the original file will be lost if the call to
unlink(2) has succeeded, but the following call to rename(2) has not,
which is a functional regression. There's hardly any more irritating
behaviour, as far as I'm concerned, than losing a preexisting file when a
command has failed to produce its output. And I do believe the use of
rename(2) is there to prevent exactly that from happening.
It seems to me that this Windows quirk of rename(2) ought to be handled
by a portability layer, perhaps gnulib, by simulating POSIX semantics on
the Windows host only, such as by giving any existing file a temporary
name and either deleting it or renaming back depending on the success or
the failure of the intended call to rename(2).
Of course it wouldn't give filesystem atomicity on Windows, but there is
none anyway, not at least with this system call, and it wouldn't regress
proper POSIX systems and would fulfil the principle of least surprise on
Windows as well (and work everywhere rather than this specific code path
only).
I have no concerns as to closing the original file/BFD, which also means
these should have been two separate changes, as they address a different
issue each.
Maciej
More information about the Binutils
mailing list