ld: Rename a file on Windows fails if target already exists

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.
Moved call to free on isympp / osympp to after bfd is closed to align
with comment earlier in the cmdline_add_object_only_section function.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
(cherry picked from commit 233cd5946413108bf4902b22a9cb23ad0a468f5e)
This commit is contained in:
Torbjörn SVENSSON
2025-07-18 17:04:09 +02:00
parent c947a34079
commit 888f048f72

View File

@@ -43,6 +43,7 @@
#include "hashtab.h"
#include "elf-bfd.h"
#include "bfdver.h"
#include <errno.h>
#if BFD_SUPPORTS_PLUGINS
#include "plugin.h"
@@ -10840,10 +10841,19 @@ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
fatal (_("%P: failed to finish output with object-only section\n"));
}
/* ibfd needs to be closed *after* obfd, otherwise ld may crash with a
segmentation fault. */
if (!bfd_close (ibfd))
einfo (_("%P%F: failed to close input\n"));
/* Must be freed after bfd_close (). */
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);
@@ -10854,10 +10864,14 @@ cmdline_add_object_only_section (bfd_byte *contents, size_t size)
return;
loser:
free (isympp);
free (osympp);
if (obfd)
bfd_close (obfd);
/* ibfd needs to be closed *after* obfd, otherwise ld may crash with a
segmentation fault. */
if (ibfd)
bfd_close (ibfd);
free (isympp);
free (osympp);
if (ofilename)
{
unlink (ofilename);