When the assembler reports that the input and output are the same, report the file...
authorRobert Yang <liezhi.yang@windriver.com>
Tue, 14 Aug 2018 11:22:35 +0000 (12:22 +0100)
committerNick Clifton <nickc@redhat.com>
Tue, 14 Aug 2018 11:22:35 +0000 (12:22 +0100)
* as.c (main): Improve check for input file matching output file.

gas/ChangeLog
gas/as.c

index b61b995503609ecc112113ebd2828c8d91cee443..5adf8cbbb69966677d8d9327550ee9a5cb929d54 100644 (file)
@@ -1,3 +1,7 @@
+2018-08-14  Robert Yang  <liezhi.yang@windriver.com>
+
+       * as.c (main): Improve check for input file matching output file.
+
 2018-08-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/tc-i386.c (cpu_arch): Add .cmov and .fxsr.
index b2a908a2f755384f8529a7acf30e9fa8c92ffb62..3105d068c48c1fb0bea4c0859f8190e333727ed3 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1259,14 +1259,27 @@ main (int argc, char ** argv)
        {
          struct stat sib;
 
-         if (stat (argv[i], &sib) == 0)
+         /* Check that the input file and output file are different.  */
+         if (stat (argv[i], &sib) == 0
+             && sib.st_ino == sob.st_ino
+             /* POSIX emulating systems may support stat() but if the
+                underlying file system does not support a file serial number
+                of some kind then they will return 0 for the inode.  So
+                two files with an inode of 0 may not actually be the same.
+                On real POSIX systems no ordinary file will ever have an
+                inode of 0.  */
+             && sib.st_ino != 0
+             /* Different files may have the same inode number if they
+                reside on different devices, so check the st_dev field as
+                well.  */
+             && sib.st_dev == sob.st_dev)
            {
-             if (sib.st_ino == sob.st_ino && sib.st_ino != 0)
-               {
-                 /* Don't let as_fatal remove the output file!  */
-                 out_file_name = NULL;
-                 as_fatal (_("The input and output files must be distinct"));
-               }
+             const char *saved_out_file_name = out_file_name;
+
+             /* Don't let as_fatal remove the output file!  */
+             out_file_name = NULL;
+             as_fatal (_("The input '%s' and output '%s' files are the same"),
+                       argv[i], saved_out_file_name);
            }
        }
     }