summaryrefslogtreecommitdiff
path: root/gcc/collect2.c
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2012-05-04 08:05:52 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2012-05-04 08:05:52 +0000
commit9178a345850d1c35cc1fe2bed529a8a0029c4251 (patch)
tree9b72ad775413c2a0a25e1d2594e350d5480b8620 /gcc/collect2.c
parentb50ff8bbb379d7be46b3e516e02e4c9ed08d3c14 (diff)
downloadgcc-9178a345850d1c35cc1fe2bed529a8a0029c4251.tar.gz
collect2.c (may_unlink_output_file): New global.
* collect2.c (may_unlink_output_file): New global. (maybe_unlink): Honor it. * collect2.h: Add extern for it. * tlink.c (do_tlink): Set it to true if the link succeeded. From-SVN: r187148
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r--gcc/collect2.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c
index a52e95a64e2..d0166a5b5af 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -237,6 +237,12 @@ static const char *target_system_root = TARGET_SYSTEM_ROOT;
static const char *target_system_root = "";
#endif
+/* Whether we may unlink the output file, which should be set as soon as we
+ know we have successfully produced it. This is typically useful to prevent
+ blindly attempting to unlink a read-only output that the target linker
+ would leave untouched. */
+bool may_unlink_output_file = false;
+
/* Structure to hold all the directories in which to search for files to
execute. */
@@ -2095,15 +2101,22 @@ fork_execute (const char *prog, char **argv)
do_wait (prog, pex);
}
-/* Unlink a file unless we are debugging. */
+/* Unlink FILE unless we are debugging or this is the output_file
+ and we may not unlink it. */
static void
maybe_unlink (const char *file)
{
- if (!debug)
- unlink_if_ordinary (file);
- else
- notice ("[Leaving %s]\n", file);
+ if (debug)
+ {
+ notice ("[Leaving %s]\n", file);
+ return;
+ }
+
+ if (file == output_file && !may_unlink_output_file)
+ return;
+
+ unlink_if_ordinary (file);
}
/* Call maybe_unlink on the NULL-terminated list, FILE_LIST. */