2000-04-03 H.J. Lu <hjl@gnu.org>
authorIan Lance Taylor <ian@airs.com>
Mon, 3 Apr 2000 19:19:11 +0000 (19:19 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 3 Apr 2000 19:19:11 +0000 (19:19 +0000)
* cache.c (bfd_open_file): Unlink the output file only if
it has none zero size.

bfd/ChangeLog
bfd/cache.c

index 85f0981..552b888 100644 (file)
@@ -1,3 +1,8 @@
+2000-04-03  H.J. Lu  <hjl@gnu.org>
+
+       * cache.c (bfd_open_file): Unlink the output file only if
+       it has none zero size.
+
 2000-04-01  Ken Block USG  <block@zk3.dec.com>
 
        * elf64-alpha.c (elf64_alpha_relocate_section): Don't emit
index b28de4b..ad3140e 100644 (file)
@@ -285,10 +285,25 @@ bfd_open_file (abfd)
        }
       else
        {
-         /* Create the file.  Unlink it first, for the convenience of
-             operating systems which worry about overwriting running
-             binaries.  */
-         unlink (abfd->filename);
+         /* Create the file.
+
+            Some operating systems won't let us overwrite a running
+            binary.  For them, we want to unlink the file first.
+
+            However, gcc 2.95 will create temporary files using
+            O_EXCL and tight permissions to prevent other users from
+            substituting other .o files during the compilation.  gcc
+            will then tell the assembler to use the newly created
+            file as an output file.  If we unlink the file here, we
+            open a brief window when another user could still
+            substitute a file.
+
+            So we unlink the output file if and only if it has
+            non-zero size.  */
+         struct stat s;
+
+         if (stat (abfd->filename, &s) == 0 && s.st_size != 0)
+           unlink (abfd->filename);
          abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WB);
          abfd->opened_once = true;
        }