forked from ports/contrib
63 lines
1.6 KiB
Diff
63 lines
1.6 KiB
Diff
Following the logic of the binutils change upstream (the addition of the
|
||
new unlink_if_ordinary() function), we update collect2 so that it will
|
||
only unlink files if they are 'ordinary' (in other words, a regular file
|
||
or a symlink).
|
||
|
||
This allows us to do fun things like `gcc test.c -o /dev/null` and not
|
||
have to worry about the toolchain doing unlink(/dev/null) on us (cause
|
||
that sucks huge wang). For example, this is common on a parisc/mips
|
||
machine:
|
||
# gcc test.c -o /dev/null
|
||
/usr/hppa2.0-unknown-linux-gnu/bin/ld: final link failed: Nonrepresentable section on output
|
||
collect2: ld returned 1 exit status
|
||
# ls /dev/null
|
||
ls: /dev/null: No such file or directory
|
||
|
||
http://bugs.gentoo.org/show_bug.cgi?id=79836
|
||
|
||
--- gcc/gcc/collect2.c
|
||
+++ gcc/gcc/collect2.c
|
||
@@ -34,6 +34,12 @@
|
||
#if ! defined( SIGCHLD ) && defined( SIGCLD )
|
||
# define SIGCHLD SIGCLD
|
||
#endif
|
||
+#ifdef HAVE_UNISTD_H
|
||
+#include <unistd.h>
|
||
+#endif
|
||
+#if HAVE_SYS_STAT_H
|
||
+#include <sys/stat.h>
|
||
+#endif
|
||
|
||
#ifdef vfork /* Autoconf may define this to fork for us. */
|
||
# define VFORK_STRING "fork"
|
||
@@ -1574,14 +1603,24 @@
|
||
do_wait (prog);
|
||
}
|
||
|
||
-/* Unlink a file unless we are debugging. */
|
||
-
|
||
+/* Unlink a file unless we are debugging or file is not normal. */
|
||
+#ifndef S_ISLNK
|
||
+#ifdef S_IFLNK
|
||
+#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||
+#else
|
||
+#define S_ISLNK(m) 0
|
||
+#define lstat stat
|
||
+#endif
|
||
+#endif
|
||
static void
|
||
maybe_unlink (const char *file)
|
||
{
|
||
- if (!debug)
|
||
- unlink (file);
|
||
- else
|
||
+ if (!debug) {
|
||
+ struct stat st;
|
||
+ if (lstat (file, &st) == 0
|
||
+ && (S_ISREG (st.st_mode) || S_ISLNK (st.st_mode)))
|
||
+ unlink (file);
|
||
+ } else
|
||
notice ("[Leaving %s]\n", file);
|
||
}
|
||
|