1 From 2a50366ded329bfb39d387253450c9d5302c3503 Mon Sep 17 00:00:00 2001
2 From: Robert Yang <liezhi.yang@windriver.com>
3 Date: Tue, 14 Aug 2018 12:22:35 +0100
4 Subject: [PATCH] as.c: Improve check for input file matching output file.
6 When the assembler reports that the input and output are the same, report the
7 file names involved, in order to help debugging. Also do not equate two files
8 are the same if the have the same inode value but reside on different file
11 Upstream-Status: Backport
13 Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
15 gas/as.c | 27 ++++++++++++++++++++-------
16 2 files changed, 20 insertions(+), 7 deletions(-)
18 diff --git a/gas/as.c b/gas/as.c
19 index b2a908a..3105d06 100644
22 @@ -1259,14 +1259,27 @@ main (int argc, char ** argv)
26 - if (stat (argv[i], &sib) == 0)
27 + /* Check that the input file and output file are different. */
28 + if (stat (argv[i], &sib) == 0
29 + && sib.st_ino == sob.st_ino
30 + /* POSIX emulating systems may support stat() but if the
31 + underlying file system does not support a file serial number
32 + of some kind then they will return 0 for the inode. So
33 + two files with an inode of 0 may not actually be the same.
34 + On real POSIX systems no ordinary file will ever have an
37 + /* Different files may have the same inode number if they
38 + reside on different devices, so check the st_dev field as
40 + && sib.st_dev == sob.st_dev)
42 - if (sib.st_ino == sob.st_ino && sib.st_ino != 0)
44 - /* Don't let as_fatal remove the output file! */
45 - out_file_name = NULL;
46 - as_fatal (_("The input and output files must be distinct"));
48 + const char *saved_out_file_name = out_file_name;
50 + /* Don't let as_fatal remove the output file! */
51 + out_file_name = NULL;
52 + as_fatal (_("The input '%s' and output '%s' files are the same"),
53 + argv[i], saved_out_file_name);