Fixes PR 17994 - which reported that dlltool was not deleting temporary files if...
authorNick Clifton <nickc@redhat.com>
Thu, 5 Mar 2015 15:13:08 +0000 (15:13 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 5 Mar 2015 15:13:08 +0000 (15:13 +0000)
PR binutils/17994
* dlltool.c (temp_file_to_remove): New local array.
(unlink_temp_files): New functions - unlinks any file in the
temp_file_to_remove array, unless dotdeltemps is set.
(gen_exp_file): Add temp files to array.
(make_head): Likewise.
(make_delay_head): Likewise.
(make_tail): Likewise.
(gen_lib_file): Call unlink_temp_files.

binutils/ChangeLog
binutils/dlltool.c

index 0772916..6b28bf9 100644 (file)
@@ -1,3 +1,15 @@
+2015-03-05  Nick Clifton  <nickc@redhat.com>
+
+       PR binutils/17994
+       * dlltool.c (temp_file_to_remove): New local array.
+       (unlink_temp_files): New functions - unlinks any file in the
+       temp_file_to_remove array, unless dotdeltemps is set.
+       (gen_exp_file): Add temp files to array.
+       (make_head): Likewise.
+       (make_delay_head): Likewise.
+       (make_tail): Likewise.
+       (gen_lib_file): Call unlink_temp_files.
+
 2015-02-28  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * objcopy.c (update_sections): New list.
index b5b3aff..be08227 100644 (file)
@@ -1994,6 +1994,31 @@ assemble_file (const char * source, const char * dest)
   run (as_name, cmd);
 }
 
+static const char * temp_file_to_remove[5];
+#define TEMP_EXPORT_FILE 0
+#define TEMP_HEAD_FILE   1
+#define TEMP_TAIL_FILE   2
+#define TEMP_HEAD_O_FILE 3
+#define TEMP_TAIL_O_FILE 4
+
+static void
+unlink_temp_files (void)
+{
+  unsigned i;
+
+  if (dontdeltemps > 0)
+    return;
+
+  for (i = 0; i < ARRAY_SIZE (temp_file_to_remove); i++)
+    {
+      if (temp_file_to_remove[i])
+       {
+         unlink (temp_file_to_remove[i]);
+         temp_file_to_remove[i] = NULL;
+       }
+    }
+}
+
 static void
 gen_exp_file (void)
 {
@@ -2010,6 +2035,8 @@ gen_exp_file (void)
     /* xgettext:c-format */
     fatal (_("Unable to open temporary assembler file: %s"), TMP_ASM);
 
+  temp_file_to_remove[TEMP_EXPORT_FILE] = TMP_ASM;
+  
   /* xgettext:c-format */
   inform (_("Opened temporary file: %s"), TMP_ASM);
 
@@ -2146,7 +2173,6 @@ gen_exp_file (void)
        }
     }
 
-
   /* Add to the output file a way of getting to the exported names
      without using the import library.  */
   if (add_indirect)
@@ -2234,7 +2260,10 @@ gen_exp_file (void)
   assemble_file (TMP_ASM, exp_name);
 
   if (dontdeltemps == 0)
-    unlink (TMP_ASM);
+    {
+      temp_file_to_remove[TEMP_EXPORT_FILE] = NULL;
+      unlink (TMP_ASM);
+    }
 
   inform (_("Generated exports file"));
 }
@@ -2939,6 +2968,8 @@ make_head (void)
       return NULL;
     }
 
+  temp_file_to_remove[TEMP_HEAD_FILE] = TMP_HEAD_S;
+
   fprintf (f, "%s IMAGE_IMPORT_DESCRIPTOR\n", ASM_C);
   fprintf (f, "\t.section\t.idata$2\n");
 
@@ -3000,6 +3031,7 @@ make_head (void)
     fatal (_("failed to open temporary head file: %s: %s"),
           TMP_HEAD_O, bfd_get_errmsg ());
 
+  temp_file_to_remove[TEMP_HEAD_O_FILE] = TMP_HEAD_O;
   return abfd;
 }
 
@@ -3015,6 +3047,8 @@ make_delay_head (void)
       return NULL;
     }
 
+  temp_file_to_remove[TEMP_HEAD_FILE] = TMP_HEAD_S;
+
   /* Output the __tailMerge__xxx function */
   fprintf (f, "%s Import trampoline\n", ASM_C);
   fprintf (f, "\t.section\t.text\n");
@@ -3083,6 +3117,7 @@ make_delay_head (void)
     fatal (_("failed to open temporary head file: %s: %s"),
           TMP_HEAD_O, bfd_get_errmsg ());
 
+  temp_file_to_remove[TEMP_HEAD_O_FILE] = TMP_HEAD_O;
   return abfd;
 }
 
@@ -3098,6 +3133,8 @@ make_tail (void)
       return NULL;
     }
 
+  temp_file_to_remove[TEMP_TAIL_FILE] = TMP_TAIL_S;
+
   if (!no_idata4)
     {
       fprintf (f, "\t.section\t.idata$4\n");
@@ -3154,6 +3191,7 @@ make_tail (void)
     fatal (_("failed to open temporary tail file: %s: %s"),
           TMP_TAIL_O, bfd_get_errmsg ());
 
+  temp_file_to_remove[TEMP_TAIL_O_FILE] = TMP_TAIL_O;
   return abfd;
 }
 
@@ -3179,6 +3217,8 @@ gen_lib_file (int delay)
   /* xgettext:c-format */
   inform (_("Creating library file: %s"), imp_name);
 
+  xatexit (unlink_temp_files);
+  
   bfd_set_format (outarch, bfd_archive);
   outarch->has_armap = 1;
   outarch->is_thin_archive = 0;
@@ -3248,13 +3288,7 @@ gen_lib_file (int delay)
     }
 
   /* Delete all the temp files.  */
-  if (dontdeltemps == 0)
-    {
-      unlink (TMP_HEAD_O);
-      unlink (TMP_HEAD_S);
-      unlink (TMP_TAIL_O);
-      unlink (TMP_TAIL_S);
-    }
+  unlink_temp_files ();
 
   if (dontdeltemps < 2)
     {