blob: d19cefbdf922c015c79660eab6935e555f571c26 [file] [log] [blame]
Patrick Williams2194f502022-10-16 14:26:09 -05001From 863f1f9dc78839ecd021b2cb01d501e8c9e00ef7 Mon Sep 17 00:00:00 2001
Brad Bishopbec4ebc2022-08-03 09:55:16 -04002From: Khem Raj <raj.khem@gmail.com>
3Date: Mon, 8 Mar 2021 16:04:20 -0800
4Subject: [PATCH] gcc: poison-system-directories
5
6Add /sw/include and /opt/include based on the original
7zecke-no-host-includes.patch patch. The original patch checked for
8/usr/include, /sw/include and /opt/include and then triggered a failure and
9aborted.
10
11Instead, we add the two missing items to the current scan. If the user
12wants this to be a failure, they can add "-Werror=poison-system-directories".
13
14Upstream-Status: Pending
15Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
16Signed-off-by: Khem Raj <raj.khem@gmail.com>
17---
18 gcc/common.opt | 4 ++++
19 gcc/config.in | 10 ++++++++++
20 gcc/configure | 19 +++++++++++++++++++
21 gcc/configure.ac | 16 ++++++++++++++++
22 gcc/doc/invoke.texi | 9 +++++++++
23 gcc/gcc.c | 9 +++++++--
24 gcc/incpath.c | 21 +++++++++++++++++++++
25 7 files changed, 86 insertions(+), 2 deletions(-)
26
27diff --git a/gcc/common.opt b/gcc/common.opt
Patrick Williams2194f502022-10-16 14:26:09 -050028index a75b44ee47e..d15105a73f3 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -040029--- a/gcc/common.opt
30+++ b/gcc/common.opt
31@@ -683,6 +683,10 @@ Wreturn-local-addr
32 Common Var(warn_return_local_addr) Init(1) Warning
33 Warn about returning a pointer/reference to a local or temporary variable.
34
35+Wpoison-system-directories
36+Common Var(flag_poison_system_directories) Init(1) Warning
37+Warn for -I and -L options using system directories if cross compiling
38+
39 Wshadow
40 Common Var(warn_shadow) Warning
41 Warn when one variable shadows another. Same as -Wshadow=global.
42diff --git a/gcc/config.in b/gcc/config.in
Patrick Williams2194f502022-10-16 14:26:09 -050043index 048bf52e8c2..4f973f7906a 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -040044--- a/gcc/config.in
45+++ b/gcc/config.in
Patrick Williams2194f502022-10-16 14:26:09 -050046@@ -230,6 +230,16 @@
Brad Bishopbec4ebc2022-08-03 09:55:16 -040047 #endif
48
49
50+/* Define to warn for use of native system header directories */
51+#ifndef USED_FOR_TARGET
52+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
53+#endif
54+/* Define to warn for use of native system header directories */
55+#ifndef USED_FOR_TARGET
56+#undef POISON_BY_DEFAULT
57+#endif
58+
59+
60 /* Define if you want all operations on RTL (the basic data structure of the
61 optimizer and back end) to be checked for dynamic type safety at runtime.
62 This is quite expensive. */
63diff --git a/gcc/configure b/gcc/configure
Patrick Williams2194f502022-10-16 14:26:09 -050064index 7218b0c331a..d7445339f9a 100755
Brad Bishopbec4ebc2022-08-03 09:55:16 -040065--- a/gcc/configure
66+++ b/gcc/configure
Patrick Williams2194f502022-10-16 14:26:09 -050067@@ -1019,6 +1019,7 @@ enable_maintainer_mode
Brad Bishopbec4ebc2022-08-03 09:55:16 -040068 enable_link_mutex
69 enable_link_serialization
70 enable_version_specific_runtime_libs
71+enable_poison_system_directories
72 enable_plugin
73 enable_host_shared
74 enable_libquadmath_support
Patrick Williams2194f502022-10-16 14:26:09 -050075@@ -1781,6 +1782,8 @@ Optional Features:
Brad Bishopbec4ebc2022-08-03 09:55:16 -040076 --enable-version-specific-runtime-libs
77 specify that runtime libraries should be installed
78 in a compiler-specific directory
79+ --enable-poison-system-directories
80+ warn for use of native system header directories
81 --enable-plugin enable plugin support
82 --enable-host-shared build host code as shared libraries
83 --disable-libquadmath-support
Patrick Williams2194f502022-10-16 14:26:09 -050084@@ -31932,6 +31935,22 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
Brad Bishopbec4ebc2022-08-03 09:55:16 -040085 fi
86
87
88+# Check whether --enable-poison-system-directories was given.
89+if test "${enable_poison_system_directories+set}" = set; then :
90+ enableval=$enable_poison_system_directories;
91+else
92+ enable_poison_system_directories=no
93+fi
94+
95+if test "x${enable_poison_system_directories}" != "xno"; then
96+
97+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
98+if test "$enable_poison_system_directories" = "error"; then
99+$as_echo "#define POISON_BY_DEFAULT 1" >>confdefs.h
100+fi
101+
102+fi
103+
104 # Substitute configuration variables
105
106
107diff --git a/gcc/configure.ac b/gcc/configure.ac
Patrick Williams2194f502022-10-16 14:26:09 -0500108index 49f043ed29b..fe488f2232b 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400109--- a/gcc/configure.ac
110+++ b/gcc/configure.ac
Patrick Williams2194f502022-10-16 14:26:09 -0500111@@ -7393,6 +7393,22 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400112 [specify that runtime libraries should be
113 installed in a compiler-specific directory])])
114
115+AC_ARG_ENABLE([poison-system-directories],
116+ AS_HELP_STRING([--enable-poison-system-directories],
117+ [warn for use of native system header directories (no/yes/error)]),,
118+ [enable_poison_system_directories=no])
119+AC_MSG_NOTICE([poisoned directories $enable_poison_system_directories])
120+if test "x${enable_poison_system_directories}" != "xno"; then
121+ AC_MSG_NOTICE([poisoned directories enabled])
122+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
123+ [1],
124+ [Define to warn for use of native system header directories])
125+ if test $enable_poison_system_directories = "error"; then
126+ AC_MSG_NOTICE([poisoned directories are fatal])
127+ AC_DEFINE([POISON_BY_DEFAULT], [1], [Define to make poison warnings errors])
128+ fi
129+fi
130+
131 # Substitute configuration variables
132 AC_SUBST(subdirs)
133 AC_SUBST(srcdir)
134diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
Patrick Williams2194f502022-10-16 14:26:09 -0500135index 35508efb4ef..40f798eac78 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400136--- a/gcc/doc/invoke.texi
137+++ b/gcc/doc/invoke.texi
138@@ -369,6 +369,7 @@ Objective-C and Objective-C++ Dialects}.
139 -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded @gol
140 -Wparentheses -Wno-pedantic-ms-format @gol
141 -Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast @gol
142+-Wno-poison-system-directories @gol
143 -Wno-pragmas -Wno-prio-ctor-dtor -Wredundant-decls @gol
144 -Wrestrict -Wno-return-local-addr -Wreturn-type @gol
145 -Wno-scalar-storage-order -Wsequence-point @gol
Patrick Williams2194f502022-10-16 14:26:09 -0500146@@ -7728,6 +7729,14 @@ made up of data only and thus requires no special treatment. But, for
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400147 most targets, it is made up of code and thus requires the stack to be
148 made executable in order for the program to work properly.
149
150+@item -Wno-poison-system-directories
151+@opindex Wno-poison-system-directories
152+Do not warn for @option{-I} or @option{-L} options using system
153+directories such as @file{/usr/include} when cross compiling. This
154+option is intended for use in chroot environments when such
155+directories contain the correct headers and libraries for the target
156+system rather than the host.
157+
158 @item -Wfloat-equal
159 @opindex Wfloat-equal
160 @opindex Wno-float-equal
161diff --git a/gcc/gcc.c b/gcc/gcc.c
Patrick Williams2194f502022-10-16 14:26:09 -0500162index 0af888c7d78..b047fc31c2f 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -0400163--- a/gcc/gcc.c
164+++ b/gcc/gcc.c
165@@ -1152,6 +1152,8 @@ proper position among the other output files. */
166 "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
167 "%X %{o*} %{e*} %{N} %{n} %{r}\
168 %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
169+ %{Wno-poison-system-directories:--no-poison-system-directories} \
170+ %{Werror=poison-system-directories:--error-poison-system-directories} \
171 %{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
172 VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
173 %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
174@@ -1247,8 +1249,11 @@ static const char *cpp_unique_options =
175 static const char *cpp_options =
176 "%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
177 %{f*} %{g*:%{%:debug-level-gt(0):%{g*}\
178- %{!fno-working-directory:-fworking-directory}}} %{O*}\
179- %{undef} %{save-temps*:-fpch-preprocess}";
180+ %{!fno-working-directory:-fworking-directory}}} %{O*}"
181+#ifdef POISON_BY_DEFAULT
182+ " -Werror=poison-system-directories"
183+#endif
184+ " %{undef} %{save-temps*:-fpch-preprocess}";
185
186 /* Pass -d* flags, possibly modifying -dumpdir, -dumpbase et al.
187
188diff --git a/gcc/incpath.c b/gcc/incpath.c
189index 446d280321d..fbfc0ce03b8 100644
190--- a/gcc/incpath.c
191+++ b/gcc/incpath.c
192@@ -26,6 +26,7 @@
193 #include "intl.h"
194 #include "incpath.h"
195 #include "cppdefault.h"
196+#include "diagnostic-core.h"
197
198 /* Microsoft Windows does not natively support inodes.
199 VMS has non-numeric inodes. */
200@@ -395,6 +396,26 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
201 }
202 fprintf (stderr, _("End of search list.\n"));
203 }
204+
205+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
206+ if (flag_poison_system_directories)
207+ {
208+ struct cpp_dir *p;
209+
210+ for (p = heads[INC_QUOTE]; p; p = p->next)
211+ {
212+ if ((!strncmp (p->name, "/usr/include", 12))
213+ || (!strncmp (p->name, "/usr/local/include", 18))
214+ || (!strncmp (p->name, "/usr/X11R6/include", 18))
215+ || (!strncmp (p->name, "/sw/include", 11))
216+ || (!strncmp (p->name, "/opt/include", 12)))
217+ warning (OPT_Wpoison_system_directories,
218+ "include location \"%s\" is unsafe for "
219+ "cross-compilation",
220+ p->name);
221+ }
222+ }
223+#endif
224 }
225
226 /* Use given -I paths for #include "..." but not #include <...>, and