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