1From 52676b5934ba127c3af39fc484c8236c8fa60b96 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: Inappropriate [OE configuration] 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.cc | 9 +++++++-- 24 gcc/incpath.cc | 21 +++++++++++++++++++++ 25 7 files changed, 86 insertions(+), 2 deletions(-) 26 27diff --git a/gcc/common.opt b/gcc/common.opt 28index 862c474d3c8..64c4277c991 100644 29--- a/gcc/common.opt 30+++ b/gcc/common.opt 31@@ -711,6 +711,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 4cad077bfbe..80e832fdb84 100644 44--- a/gcc/config.in 45+++ b/gcc/config.in 46@@ -236,6 +236,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 c7b26d1927d..3508be7b439 100755 65--- a/gcc/configure 66+++ b/gcc/configure 67@@ -1026,6 +1026,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@@ -1788,6 +1789,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@@ -31753,6 +31756,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 09082e8ccae..6cd01a8966b 100644 109--- a/gcc/configure.ac 110+++ b/gcc/configure.ac 111@@ -7292,6 +7292,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 de40f62e219..d6f203c8b71 100644 136--- a/gcc/doc/invoke.texi 137+++ b/gcc/doc/invoke.texi 138@@ -384,6 +384,7 @@ Objective-C and Objective-C++ Dialects}. 139 -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded 140 -Wparentheses -Wno-pedantic-ms-format 141 -Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast 142+-Wno-poison-system-directories 143 -Wno-pragmas -Wno-prio-ctor-dtor -Wredundant-decls 144 -Wrestrict -Wno-return-local-addr -Wreturn-type 145 -Wno-scalar-storage-order -Wsequence-point 146@@ -8426,6 +8427,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+@opindex Wno-poison-system-directories 151+@item -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 @opindex Wfloat-equal 159 @opindex Wno-float-equal 160 @item -Wfloat-equal 161diff --git a/gcc/gcc.cc b/gcc/gcc.cc 162index 16bb07f2cdc..5feae021545 100644 163--- a/gcc/gcc.cc 164+++ b/gcc/gcc.cc 165@@ -1146,6 +1146,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@@ -1241,8 +1243,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.cc b/gcc/incpath.cc 189index 4d44321183f..46c0d543205 100644 190--- a/gcc/incpath.cc 191+++ b/gcc/incpath.cc 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@@ -399,6 +400,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