A 2011 change to collect2 to use the standard diagnostics
infrastructure broke collect2's cleanup of temp files when an error
occurs.  This prototype of a patch implements the minimal conversion
of collect2 to use atexit().

If this is the right direction, all calls to collect_exit() can be
converted to exit().

Thanks, David

        PR driver/57652
        * collect2.c (collect_atexit): New.
        (collect_exit): Directly call exit.
        (main): Register collect_atexit with atexit.

Index: collect2.c
===================================================================
--- collect2.c  (revision 200180)
+++ collect2.c  (working copy)
@@ -367,7 +367,7 @@
 /* Delete tempfiles and exit function.  */

 void
-collect_exit (int status)
+collect_atexit (void)
 {
   if (c_file != 0 && c_file[0])
     maybe_unlink (c_file);
@@ -395,12 +395,16 @@
       maybe_unlink (lderrout);
     }

-  if (status != 0 && output_file != 0 && output_file[0])
+  if (output_file != 0 && output_file[0])
     maybe_unlink (output_file);

   if (response_file)
     maybe_unlink (response_file);
+}

+void
+collect_exit (int status)
+{
   exit (status);
 }

@@ -970,6 +974,9 @@
   signal (SIGCHLD, SIG_DFL);
 #endif

+  if (atexit (collect_atexit) != 0)
+    fatal_error ("atexit failed");
+
   /* Unlock the stdio streams.  */
   unlock_std_streams ();

Reply via email to