1*4882a593SmuzhiyunFrom 5f62ad7ce534e3384d6ed8892614979da297bd70 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Evgeniy Didin <Evgeniy.Didin@synopsys.com> 3*4882a593SmuzhiyunDate: Mon, 14 Oct 2019 16:45:15 +0300 4*4882a593SmuzhiyunSubject: [PATCH] [PATCH] poison-system-directories 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunPatch adapted to arc-binutils-gdb-2019.09 7*4882a593SmuzhiyunSigned-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com> 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunPatch adapted to binutils 2.23.2 and extended to use 10*4882a593SmuzhiyunBR_COMPILER_PARANOID_UNSAFE_PATH by Thomas Petazzoni. 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun[Romain: rebase on top of 2.26] 13*4882a593SmuzhiyunSigned-off-by: Romain Naour <romain.naour@gmail.com> 14*4882a593Smuzhiyun[Gustavo: adapt to binutils 2.25] 15*4882a593SmuzhiyunSigned-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> 16*4882a593SmuzhiyunSigned-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar> 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunUpstream-Status: Inappropriate [distribution: codesourcery] 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunPatch originally created by Mark Hatle, forward-ported to 21*4882a593Smuzhiyunbinutils 2.21 by Scott Garman. 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunpurpose: warn for uses of system directories when cross linking 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunCode Merged from Sourcery G++ binutils 2.19 - 4.4-277 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun2008-07-02 Joseph Myers <joseph@codesourcery.com> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun ld/ 30*4882a593Smuzhiyun * ld.h (args_type): Add error_poison_system_directories. 31*4882a593Smuzhiyun * ld.texinfo (--error-poison-system-directories): Document. 32*4882a593Smuzhiyun * ldfile.c (ldfile_add_library_path): Check 33*4882a593Smuzhiyun command_line.error_poison_system_directories. 34*4882a593Smuzhiyun * ldmain.c (main): Initialize 35*4882a593Smuzhiyun command_line.error_poison_system_directories. 36*4882a593Smuzhiyun * lexsup.c (enum option_values): Add 37*4882a593Smuzhiyun OPTION_ERROR_POISON_SYSTEM_DIRECTORIES. 38*4882a593Smuzhiyun (ld_options): Add --error-poison-system-directories. 39*4882a593Smuzhiyun (parse_args): Handle new option. 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun2007-06-13 Joseph Myers <joseph@codesourcery.com> 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun ld/ 44*4882a593Smuzhiyun * config.in: Regenerate. 45*4882a593Smuzhiyun * ld.h (args_type): Add poison_system_directories. 46*4882a593Smuzhiyun * ld.texinfo (--no-poison-system-directories): Document. 47*4882a593Smuzhiyun * ldfile.c (ldfile_add_library_path): Check 48*4882a593Smuzhiyun command_line.poison_system_directories. 49*4882a593Smuzhiyun * ldmain.c (main): Initialize 50*4882a593Smuzhiyun command_line.poison_system_directories. 51*4882a593Smuzhiyun * lexsup.c (enum option_values): Add 52*4882a593Smuzhiyun OPTION_NO_POISON_SYSTEM_DIRECTORIES. 53*4882a593Smuzhiyun (ld_options): Add --no-poison-system-directories. 54*4882a593Smuzhiyun (parse_args): Handle new option. 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun2007-04-20 Joseph Myers <joseph@codesourcery.com> 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun Merge from Sourcery G++ binutils 2.17: 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun 2007-03-20 Joseph Myers <joseph@codesourcery.com> 61*4882a593Smuzhiyun Based on patch by Mark Hatle <mark.hatle@windriver.com>. 62*4882a593Smuzhiyun ld/ 63*4882a593Smuzhiyun * configure.ac (--enable-poison-system-directories): New option. 64*4882a593Smuzhiyun * configure, config.in: Regenerate. 65*4882a593Smuzhiyun * ldfile.c (ldfile_add_library_path): If 66*4882a593Smuzhiyun ENABLE_POISON_SYSTEM_DIRECTORIES defined, warn for use of /lib, 67*4882a593Smuzhiyun /usr/lib, /usr/local/lib or /usr/X11R6/lib. 68*4882a593Smuzhiyun 69*4882a593SmuzhiyunSigned-off-by: Mark Hatle <mark.hatle@windriver.com> 70*4882a593SmuzhiyunSigned-off-by: Scott Garman <scott.a.garman@intel.com> 71*4882a593Smuzhiyun--- 72*4882a593Smuzhiyun ld/config.in | 3 +++ 73*4882a593Smuzhiyun ld/configure | 14 ++++++++++++++ 74*4882a593Smuzhiyun ld/configure.ac | 10 ++++++++++ 75*4882a593Smuzhiyun ld/ld.h | 8 ++++++++ 76*4882a593Smuzhiyun ld/ld.texi | 12 ++++++++++++ 77*4882a593Smuzhiyun ld/ldfile.c | 17 +++++++++++++++++ 78*4882a593Smuzhiyun ld/ldlex.h | 2 ++ 79*4882a593Smuzhiyun ld/ldmain.c | 2 ++ 80*4882a593Smuzhiyun ld/lexsup.c | 21 +++++++++++++++++++++ 81*4882a593Smuzhiyun 9 files changed, 89 insertions(+) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyundiff --git a/ld/config.in b/ld/config.in 84*4882a593Smuzhiyunindex d93c9b08300..5da2742beac 100644 85*4882a593Smuzhiyun--- a/ld/config.in 86*4882a593Smuzhiyun+++ b/ld/config.in 87*4882a593Smuzhiyun@@ -31,6 +31,9 @@ 88*4882a593Smuzhiyun language is requested. */ 89*4882a593Smuzhiyun #undef ENABLE_NLS 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun+/* Define to warn for use of native system library directories */ 92*4882a593Smuzhiyun+#undef ENABLE_POISON_SYSTEM_DIRECTORIES 93*4882a593Smuzhiyun+ 94*4882a593Smuzhiyun /* Additional extension a shared object might have. */ 95*4882a593Smuzhiyun #undef EXTRA_SHLIB_EXTENSION 96*4882a593Smuzhiyun 97*4882a593Smuzhiyundiff --git a/ld/configure b/ld/configure 98*4882a593Smuzhiyunindex 2d6ca5c0445..563f9921f7f 100755 99*4882a593Smuzhiyun--- a/ld/configure 100*4882a593Smuzhiyun+++ b/ld/configure 101*4882a593Smuzhiyun@@ -823,6 +823,7 @@ with_lib_path 102*4882a593Smuzhiyun enable_targets 103*4882a593Smuzhiyun enable_64_bit_bfd 104*4882a593Smuzhiyun with_sysroot 105*4882a593Smuzhiyun+enable_poison_system_directories 106*4882a593Smuzhiyun enable_gold 107*4882a593Smuzhiyun enable_got 108*4882a593Smuzhiyun enable_compressed_debug_sections 109*4882a593Smuzhiyun@@ -1487,6 +1488,8 @@ Optional Features: 110*4882a593Smuzhiyun --disable-largefile omit support for large files 111*4882a593Smuzhiyun --enable-targets alternative target configurations 112*4882a593Smuzhiyun --enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes) 113*4882a593Smuzhiyun+ --enable-poison-system-directories 114*4882a593Smuzhiyun+ warn for use of native system library directories 115*4882a593Smuzhiyun --enable-gold[=ARG] build gold [ARG={default,yes,no}] 116*4882a593Smuzhiyun --enable-got=<type> GOT handling scheme (target, single, negative, 117*4882a593Smuzhiyun multigot) 118*4882a593Smuzhiyun@@ -15804,7 +15807,18 @@ else 119*4882a593Smuzhiyun fi 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun+# Check whether --enable-poison-system-directories was given. 123*4882a593Smuzhiyun+if test "${enable_poison_system_directories+set}" = set; then : 124*4882a593Smuzhiyun+ enableval=$enable_poison_system_directories; 125*4882a593Smuzhiyun+else 126*4882a593Smuzhiyun+ enable_poison_system_directories=no 127*4882a593Smuzhiyun+fi 128*4882a593Smuzhiyun+ 129*4882a593Smuzhiyun+if test "x${enable_poison_system_directories}" = "xyes"; then 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h 132*4882a593Smuzhiyun+ 133*4882a593Smuzhiyun+fi 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun # Check whether --enable-got was given. 136*4882a593Smuzhiyun if test "${enable_got+set}" = set; then : 137*4882a593Smuzhiyundiff --git a/ld/configure.ac b/ld/configure.ac 138*4882a593Smuzhiyunindex 41a51bbb7e9..dbaa98a9e17 100644 139*4882a593Smuzhiyun--- a/ld/configure.ac 140*4882a593Smuzhiyun+++ b/ld/configure.ac 141*4882a593Smuzhiyun@@ -94,6 +94,16 @@ AC_SUBST(use_sysroot) 142*4882a593Smuzhiyun AC_SUBST(TARGET_SYSTEM_ROOT) 143*4882a593Smuzhiyun AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun+AC_ARG_ENABLE([poison-system-directories], 146*4882a593Smuzhiyun+ AS_HELP_STRING([--enable-poison-system-directories], 147*4882a593Smuzhiyun+ [warn for use of native system library directories]),, 148*4882a593Smuzhiyun+ [enable_poison_system_directories=no]) 149*4882a593Smuzhiyun+if test "x${enable_poison_system_directories}" = "xyes"; then 150*4882a593Smuzhiyun+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES], 151*4882a593Smuzhiyun+ [1], 152*4882a593Smuzhiyun+ [Define to warn for use of native system library directories]) 153*4882a593Smuzhiyun+fi 154*4882a593Smuzhiyun+ 155*4882a593Smuzhiyun dnl Use --enable-gold to decide if this linker should be the default. 156*4882a593Smuzhiyun dnl "install_as_default" is set to false if gold is the default linker. 157*4882a593Smuzhiyun dnl "installed_linker" is the installed BFD linker name. 158*4882a593Smuzhiyundiff --git a/ld/ld.h b/ld/ld.h 159*4882a593Smuzhiyunindex 55078a9637b..511e9bc34b7 100644 160*4882a593Smuzhiyun--- a/ld/ld.h 161*4882a593Smuzhiyun+++ b/ld/ld.h 162*4882a593Smuzhiyun@@ -180,6 +180,14 @@ typedef struct 163*4882a593Smuzhiyun in the linker script. */ 164*4882a593Smuzhiyun bfd_boolean force_group_allocation; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun+ /* If TRUE (the default) warn for uses of system directories when 167*4882a593Smuzhiyun+ cross linking. */ 168*4882a593Smuzhiyun+ bfd_boolean poison_system_directories; 169*4882a593Smuzhiyun+ 170*4882a593Smuzhiyun+ /* If TRUE (default FALSE) give an error for uses of system 171*4882a593Smuzhiyun+ directories when cross linking instead of a warning. */ 172*4882a593Smuzhiyun+ bfd_boolean error_poison_system_directories; 173*4882a593Smuzhiyun+ 174*4882a593Smuzhiyun /* Big or little endian as set on command line. */ 175*4882a593Smuzhiyun enum endian_enum endian; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyundiff --git a/ld/ld.texi b/ld/ld.texi 178*4882a593Smuzhiyunindex fcbc335c95e..6ba7ebdb32a 100644 179*4882a593Smuzhiyun--- a/ld/ld.texi 180*4882a593Smuzhiyun+++ b/ld/ld.texi 181*4882a593Smuzhiyun@@ -2557,6 +2557,18 @@ string identifying the original linked file does not change. 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun Passing @code{none} for @var{style} disables the setting from any 184*4882a593Smuzhiyun @code{--build-id} options earlier on the command line. 185*4882a593Smuzhiyun+ 186*4882a593Smuzhiyun+@kindex --no-poison-system-directories 187*4882a593Smuzhiyun+@item --no-poison-system-directories 188*4882a593Smuzhiyun+Do not warn for @option{-L} options using system directories such as 189*4882a593Smuzhiyun+@file{/usr/lib} when cross linking. This option is intended for use 190*4882a593Smuzhiyun+in chroot environments when such directories contain the correct 191*4882a593Smuzhiyun+libraries for the target system rather than the host. 192*4882a593Smuzhiyun+ 193*4882a593Smuzhiyun+@kindex --error-poison-system-directories 194*4882a593Smuzhiyun+@item --error-poison-system-directories 195*4882a593Smuzhiyun+Give an error instead of a warning for @option{-L} options using 196*4882a593Smuzhiyun+system directories when cross linking. 197*4882a593Smuzhiyun @end table 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun @c man end 200*4882a593Smuzhiyundiff --git a/ld/ldfile.c b/ld/ldfile.c 201*4882a593Smuzhiyunindex 7f60319390e..0bcc06db964 100644 202*4882a593Smuzhiyun--- a/ld/ldfile.c 203*4882a593Smuzhiyun+++ b/ld/ldfile.c 204*4882a593Smuzhiyun@@ -116,6 +116,23 @@ ldfile_add_library_path (const char *name, bfd_boolean cmdline) 205*4882a593Smuzhiyun new_dirs->name = concat (ld_sysroot, name + strlen ("$SYSROOT"), (const char *) NULL); 206*4882a593Smuzhiyun else 207*4882a593Smuzhiyun new_dirs->name = xstrdup (name); 208*4882a593Smuzhiyun+ 209*4882a593Smuzhiyun+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES 210*4882a593Smuzhiyun+ if (command_line.poison_system_directories 211*4882a593Smuzhiyun+ && ((!strncmp (name, "/lib", 4)) 212*4882a593Smuzhiyun+ || (!strncmp (name, "/usr/lib", 8)) 213*4882a593Smuzhiyun+ || (!strncmp (name, "/usr/local/lib", 14)) 214*4882a593Smuzhiyun+ || (!strncmp (name, "/usr/X11R6/lib", 14)))) 215*4882a593Smuzhiyun+ { 216*4882a593Smuzhiyun+ if (command_line.error_poison_system_directories) 217*4882a593Smuzhiyun+ einfo (_("%X%P: error: library search path \"%s\" is unsafe for " 218*4882a593Smuzhiyun+ "cross-compilation\n"), name); 219*4882a593Smuzhiyun+ else 220*4882a593Smuzhiyun+ einfo (_("%P: warning: library search path \"%s\" is unsafe for " 221*4882a593Smuzhiyun+ "cross-compilation\n"), name); 222*4882a593Smuzhiyun+ } 223*4882a593Smuzhiyun+#endif 224*4882a593Smuzhiyun+ 225*4882a593Smuzhiyun } 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* Try to open a BFD for a lang_input_statement. */ 228*4882a593Smuzhiyundiff --git a/ld/ldlex.h b/ld/ldlex.h 229*4882a593Smuzhiyunindex 32a7a6409e8..c02b64bf92f 100644 230*4882a593Smuzhiyun--- a/ld/ldlex.h 231*4882a593Smuzhiyun+++ b/ld/ldlex.h 232*4882a593Smuzhiyun@@ -152,6 +152,8 @@ enum option_values 233*4882a593Smuzhiyun OPTION_NO_PRINT_MAP_DISCARDED, 234*4882a593Smuzhiyun OPTION_NON_CONTIGUOUS_REGIONS, 235*4882a593Smuzhiyun OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS, 236*4882a593Smuzhiyun+ OPTION_NO_POISON_SYSTEM_DIRECTORIES, 237*4882a593Smuzhiyun+ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES, 238*4882a593Smuzhiyun }; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /* The initial parser states. */ 242*4882a593Smuzhiyundiff --git a/ld/ldmain.c b/ld/ldmain.c 243*4882a593Smuzhiyunindex 34c19223137..66d2c3f4bcf 100644 244*4882a593Smuzhiyun--- a/ld/ldmain.c 245*4882a593Smuzhiyun+++ b/ld/ldmain.c 246*4882a593Smuzhiyun@@ -270,6 +270,8 @@ main (int argc, char **argv) 247*4882a593Smuzhiyun command_line.warn_mismatch = TRUE; 248*4882a593Smuzhiyun command_line.warn_search_mismatch = TRUE; 249*4882a593Smuzhiyun command_line.check_section_addresses = -1; 250*4882a593Smuzhiyun+ command_line.poison_system_directories = TRUE; 251*4882a593Smuzhiyun+ command_line.error_poison_system_directories = FALSE; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* We initialize DEMANGLING based on the environment variable 254*4882a593Smuzhiyun COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the 255*4882a593Smuzhiyundiff --git a/ld/lexsup.c b/ld/lexsup.c 256*4882a593Smuzhiyunindex 1c15ac29c0c..8b714e10a40 100644 257*4882a593Smuzhiyun--- a/ld/lexsup.c 258*4882a593Smuzhiyun+++ b/ld/lexsup.c 259*4882a593Smuzhiyun@@ -549,6 +549,14 @@ static const struct ld_option ld_options[] = 260*4882a593Smuzhiyun { {"no-print-map-discarded", no_argument, NULL, OPTION_NO_PRINT_MAP_DISCARDED}, 261*4882a593Smuzhiyun '\0', NULL, N_("Do not show discarded sections in map file output"), 262*4882a593Smuzhiyun TWO_DASHES }, 263*4882a593Smuzhiyun+ { {"no-poison-system-directories", no_argument, NULL, 264*4882a593Smuzhiyun+ OPTION_NO_POISON_SYSTEM_DIRECTORIES}, 265*4882a593Smuzhiyun+ '\0', NULL, N_("Do not warn for -L options using system directories"), 266*4882a593Smuzhiyun+ TWO_DASHES }, 267*4882a593Smuzhiyun+ { {"error-poison-system-directories", no_argument, NULL, 268*4882a593Smuzhiyun+ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES}, 269*4882a593Smuzhiyun+ '\0', NULL, N_("Give an error for -L options using system directories"), 270*4882a593Smuzhiyun+ TWO_DASHES }, 271*4882a593Smuzhiyun }; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define OPTION_COUNT ARRAY_SIZE (ld_options) 274*4882a593Smuzhiyun@@ -561,6 +569,7 @@ parse_args (unsigned argc, char **argv) 275*4882a593Smuzhiyun int ingroup = 0; 276*4882a593Smuzhiyun char *default_dirlist = NULL; 277*4882a593Smuzhiyun char *shortopts; 278*4882a593Smuzhiyun+ char *BR_paranoid_env; 279*4882a593Smuzhiyun struct option *longopts; 280*4882a593Smuzhiyun struct option *really_longopts; 281*4882a593Smuzhiyun int last_optind; 282*4882a593Smuzhiyun@@ -1549,6 +1558,14 @@ parse_args (unsigned argc, char **argv) 283*4882a593Smuzhiyun } 284*4882a593Smuzhiyun break; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun+ case OPTION_NO_POISON_SYSTEM_DIRECTORIES: 287*4882a593Smuzhiyun+ command_line.poison_system_directories = FALSE; 288*4882a593Smuzhiyun+ break; 289*4882a593Smuzhiyun+ 290*4882a593Smuzhiyun+ case OPTION_ERROR_POISON_SYSTEM_DIRECTORIES: 291*4882a593Smuzhiyun+ command_line.error_poison_system_directories = TRUE; 292*4882a593Smuzhiyun+ break; 293*4882a593Smuzhiyun+ 294*4882a593Smuzhiyun case OPTION_PUSH_STATE: 295*4882a593Smuzhiyun input_flags.pushed = xmemdup (&input_flags, 296*4882a593Smuzhiyun sizeof (input_flags), 297*4882a593Smuzhiyun@@ -1600,6 +1617,10 @@ parse_args (unsigned argc, char **argv) 298*4882a593Smuzhiyun command_line.soname = NULL; 299*4882a593Smuzhiyun } 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun+ BR_paranoid_env = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH"); 302*4882a593Smuzhiyun+ if (BR_paranoid_env && strlen(BR_paranoid_env) > 0) 303*4882a593Smuzhiyun+ command_line.error_poison_system_directories = TRUE; 304*4882a593Smuzhiyun+ 305*4882a593Smuzhiyun while (ingroup) 306*4882a593Smuzhiyun { 307*4882a593Smuzhiyun einfo (_("%P: missing --end-group; added as last command line option\n")); 308*4882a593Smuzhiyun-- 309*4882a593Smuzhiyun2.16.2 310*4882a593Smuzhiyun 311