1From 863f1f9dc78839ecd021b2cb01d501e8c9e00ef7 Mon Sep 17 00:00:00 2001 2From: 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 28index a75b44ee47e..d15105a73f3 100644 29--- 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 43index 048bf52e8c2..4f973f7906a 100644 44--- a/gcc/config.in 45+++ b/gcc/config.in 46@@ -230,6 +230,16 @@ 47 #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 64index 7218b0c331a..d7445339f9a 100755 65--- a/gcc/configure 66+++ b/gcc/configure 67@@ -1019,6 +1019,7 @@ enable_maintainer_mode 68 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 75@@ -1781,6 +1782,8 @@ Optional Features: 76 --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 84@@ -31932,6 +31935,22 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then : 85 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 108index 49f043ed29b..fe488f2232b 100644 109--- a/gcc/configure.ac 110+++ b/gcc/configure.ac 111@@ -7393,6 +7393,22 @@ AC_ARG_ENABLE(version-specific-runtime-libs, 112 [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 135index 35508efb4ef..40f798eac78 100644 136--- 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 146@@ -7728,6 +7729,14 @@ made up of data only and thus requires no special treatment. But, for 147 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 162index 0af888c7d78..b047fc31c2f 100644 163--- 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 227