[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