[PATCH] ld: Rename a file on Windows fails if target already exists
Torbjörn SVENSSON
torbjorn.svensson@foss.st.com
Fri Jul 18 15:20:14 GMT 2025
Ok for trunk?
@Nick: Is this something that should be considered for 2.45 branch?
--
To rename a file on Windows, the target name cannot exist. Removing file
prior to renaming ensures this is handled.
To remove a file on Windows, the file cannot be open. Closing the bfd
handle ensures this is handled.
Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
---
ld/ldlang.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/ld/ldlang.c b/ld/ldlang.c
index d4b4ef2f29b..ffc3362db29 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -10834,6 +10834,11 @@ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
goto loser;
}
+ if (!bfd_close (ibfd))
+ {
+ einfo (_("%P%F: failed to close input\n"));
+ }
+
if (!bfd_close (obfd))
{
unlink (ofilename);
@@ -10844,6 +10849,12 @@ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
free (isympp);
free (osympp);
+ /* Must unlink to ensure rename works on Windows. */
+ if (unlink (output_filename) && errno != ENOENT)
+ {
+ einfo (_("%P%F: failed to unlink %s\n"), output_filename);
+ }
+
if (rename (ofilename, output_filename))
{
unlink (ofilename);
@@ -10856,6 +10867,8 @@ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
loser:
free (isympp);
free (osympp);
+ if (ibfd)
+ bfd_close (ibfd);
if (obfd)
bfd_close (obfd);
if (ofilename)
--
2.25.1
More information about the Binutils
mailing list