@@ -1,3 +1,11 @@
+Updates by Mike Frysinger <vapier@chromium.org>:
+* The command line flags are always available.
+* The flag names are tweaked slightly to match existing flag standards.
+* We can turn on & off the warning via the command line.
+* The configure option controls the default warning behavior.
+* Add support for gold.
+Signed-off-by: Mike Frysinger <vapier@chromium.org>
+
Patch adapted to binutils 2.23.2 and extended to use
BR_COMPILER_PARANOID_UNSAFE_PATH by Thomas Petazzoni.
@@ -59,9 +67,60 @@ Code Merged from Sourcery G++ binutils 2.19 - 4.4-277
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Scott Garman <scott.a.garman@intel.com>
-diff -Nura a/ld/config.in b/ld/config.in
---- a/ld/config.in 2014-10-14 04:32:04.000000000 -0300
-+++ b/ld/config.in 2014-12-24 08:07:28.997918918 -0300
+--- a/gold/options.cc
++++ b/gold/options.cc
+@@ -1201,6 +1201,33 @@ General_options::finalize()
+ // in the path, as appropriate.
+ this->add_sysroot();
+
++ // Now check if library_path is poisoned.
++ if (this->warn_poison_system_directories())
++ {
++ std::vector<std::string> bad_paths;
++
++ bad_paths.push_back("/lib");
++ bad_paths.push_back("/usr/lib");
++ bad_paths.push_back("/usr/local/lib");
++ bad_paths.push_back("/usr/X11R6/lib");
++
++ for (std::vector<std::string>::const_iterator b = bad_paths.begin();
++ b != bad_paths.end();
++ ++b)
++ for (Dir_list::iterator p = this->library_path_.value.begin();
++ p != this->library_path_.value.end();
++ ++p)
++ if (!p->name().compare(0, b->size(), *b))
++ {
++ if (this->error_poison_system_directories())
++ gold_fatal(_("library search path \"%s\" is unsafe for "
++ "cross-compilation"), p->name().c_str());
++ else
++ gold_warning(_("library search path \"%s\" is unsafe for "
++ "cross-compilation"), p->name().c_str());
++ }
++ }
++
+ // --dynamic-list overrides -Bsymbolic and -Bsymbolic-functions.
+ if (this->have_dynamic_list())
+ {
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -1206,6 +1206,13 @@ class General_options
+ DEFINE_bool(warn_multiple_gp, options::TWO_DASHES, '\0', false,
+ N_("Ignored"), NULL);
+
++ DEFINE_bool(warn_poison_system_directories, options::TWO_DASHES, '\0', false,
++ N_("Warn for -L options using system directories"),
++ N_("Do not warn for -L options using system directories"));
++ DEFINE_bool(error_poison_system_directories, options::TWO_DASHES, '\0', false,
++ N_("Give an error for -L options using system directories"),
++ NULL);
++
+ DEFINE_bool(warn_search_mismatch, options::TWO_DASHES, '\0', true,
+ N_("Warn when skipping an incompatible library"),
+ N_("Don't warn when skipping an incompatible library"));
+--- a/ld/config.in
++++ b/ld/config.in
@@ -11,6 +11,9 @@
language is requested. */
#undef ENABLE_NLS
@@ -72,10 +131,9 @@ diff -Nura a/ld/config.in b/ld/config.in
/* Additional extension a shared object might have. */
#undef EXTRA_SHLIB_EXTENSION
-diff -Nura a/ld/configure b/ld/configure
---- a/ld/configure 2014-12-23 11:22:07.000000000 -0300
-+++ b/ld/configure 2014-12-24 08:07:29.002919088 -0300
-@@ -783,6 +783,7 @@
+--- a/ld/configure
++++ b/ld/configure
+@@ -774,6 +774,7 @@ with_lib_path
enable_targets
enable_64_bit_bfd
with_sysroot
@@ -83,7 +141,7 @@ diff -Nura a/ld/configure b/ld/configure
enable_gold
enable_got
enable_werror
-@@ -1439,6 +1440,8 @@
+@@ -1429,6 +1430,8 @@ Optional Features:
--disable-largefile omit support for large files
--enable-targets alternative target configurations
--enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes)
@@ -92,7 +150,7 @@ diff -Nura a/ld/configure b/ld/configure
--enable-gold[=ARG] build gold [ARG={default,yes,no}]
--enable-got=<type> GOT handling scheme (target, single, negative,
multigot)
-@@ -15487,7 +15490,18 @@
+@@ -4339,7 +4342,18 @@ else
fi
@@ -111,10 +169,9 @@ diff -Nura a/ld/configure b/ld/configure
# Check whether --enable-got was given.
if test "${enable_got+set}" = set; then :
-diff -Nura a/ld/configure.ac b/ld/configure.ac
---- a/ld/configure.ac 2014-10-14 04:32:04.000000000 -0300
-+++ b/ld/configure.ac 2014-12-24 08:07:29.002919088 -0300
-@@ -94,6 +94,16 @@
+--- a/ld/configure.ac
++++ b/ld/configure.ac
+@@ -87,6 +87,16 @@ AC_SUBST(use_sysroot)
AC_SUBST(TARGET_SYSTEM_ROOT)
AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)
@@ -131,43 +188,37 @@ diff -Nura a/ld/configure.ac b/ld/configure.ac
dnl Use --enable-gold to decide if this linker should be the default.
dnl "install_as_default" is set to false if gold is the default linker.
dnl "installed_linker" is the installed BFD linker name.
-diff -Nura a/ld/ldfile.c b/ld/ldfile.c
---- a/ld/ldfile.c 2014-10-14 04:32:04.000000000 -0300
-+++ b/ld/ldfile.c 2014-12-24 08:07:29.002919088 -0300
-@@ -114,6 +114,23 @@
+--- a/ld/ldfile.c
++++ b/ld/ldfile.c
+@@ -116,6 +116,20 @@ ldfile_add_library_path (const char *name, bfd_boolean cmdline)
new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
else
new_dirs->name = xstrdup (name);
+
-+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
-+ if (command_line.poison_system_directories
-+ && ((!strncmp (name, "/lib", 4))
-+ || (!strncmp (name, "/usr/lib", 8))
-+ || (!strncmp (name, "/usr/local/lib", 14))
-+ || (!strncmp (name, "/usr/X11R6/lib", 14))))
-+ {
-+ if (command_line.error_poison_system_directories)
-+ einfo (_("%X%P: error: library search path \"%s\" is unsafe for "
-+ "cross-compilation\n"), name);
-+ else
-+ einfo (_("%P: warning: library search path \"%s\" is unsafe for "
-+ "cross-compilation\n"), name);
-+ }
-+#endif
-+
++ if (command_line.warn_poison_system_directories
++ && (!strncmp (name, "/lib", 4)
++ || !strncmp (name, "/usr/lib", 8)
++ || !strncmp (name, "/usr/local/lib", 14)
++ || !strncmp (name, "/usr/X11R6/lib", 14)))
++ {
++ if (command_line.error_poison_system_directories)
++ einfo (_("%X%P: error: library search path \"%s\" is unsafe for "
++ "cross-compilation\n"), name);
++ else
++ einfo (_("%P: warning: library search path \"%s\" is unsafe for "
++ "cross-compilation\n"), name);
++ }
}
/* Try to open a BFD for a lang_input_statement. */
-diff -Nura a/ld/ld.h b/ld/ld.h
---- a/ld/ld.h 2014-10-14 04:32:04.000000000 -0300
-+++ b/ld/ld.h 2014-12-24 08:07:29.003919122 -0300
-@@ -161,6 +161,14 @@
+--- a/ld/ld.h
++++ b/ld/ld.h
+@@ -180,6 +180,13 @@ typedef struct {
/* If TRUE we'll just print the default output on stdout. */
bfd_boolean print_output_format;
-+ /* If TRUE (the default) warn for uses of system directories when
-+ cross linking. */
-+ bfd_boolean poison_system_directories;
++ /* If TRUE warn for uses of system directories when cross linking. */
++ bfd_boolean warn_poison_system_directories;
+
+ /* If TRUE (default FALSE) give an error for uses of system
+ directories when cross linking instead of a warning. */
@@ -176,40 +227,55 @@ diff -Nura a/ld/ld.h b/ld/ld.h
/* Big or little endian as set on command line. */
enum endian_enum endian;
-diff -Nura a/ld/ldlex.h b/ld/ldlex.h
---- a/ld/ldlex.h 2014-11-04 06:54:41.000000000 -0300
-+++ b/ld/ldlex.h 2014-12-24 08:09:47.477644294 -0300
-@@ -140,6 +140,8 @@
+--- a/ld/ldlex.h
++++ b/ld/ldlex.h
+@@ -138,6 +138,9 @@ enum option_values
+ OPTION_PRINT_OUTPUT_FORMAT,
+ OPTION_PRINT_SYSROOT,
OPTION_IGNORE_UNRESOLVED_SYMBOL,
++ OPTION_WARN_POISON_SYSTEM_DIRECTORIES,
++ OPTION_NO_WARN_POISON_SYSTEM_DIRECTORIES,
++ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES,
OPTION_PUSH_STATE,
OPTION_POP_STATE,
-+ OPTION_NO_POISON_SYSTEM_DIRECTORIES,
-+ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES,
};
-
- /* The initial parser states. */
-diff -Nura a/ld/ldmain.c b/ld/ldmain.c
---- a/ld/ldmain.c 2014-10-14 04:32:04.000000000 -0300
-+++ b/ld/ldmain.c 2014-12-24 08:07:29.003919122 -0300
-@@ -266,6 +266,8 @@
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -266,6 +266,19 @@ main (int argc, char **argv)
command_line.warn_mismatch = TRUE;
command_line.warn_search_mismatch = TRUE;
command_line.check_section_addresses = -1;
-+ command_line.poison_system_directories = TRUE;
++ command_line.warn_poison_system_directories =
++#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
++ TRUE;
++#else
++ FALSE;
++#endif
+ command_line.error_poison_system_directories = FALSE;
++
++ {
++ const char *BR_paranoid_env = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
++ if (BR_paranoid_env && strlen(BR_paranoid_env) > 0)
++ command_line.error_poison_system_directories = TRUE;
++ }
/* We initialize DEMANGLING based on the environment variable
COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the
-diff -Nura a/ld/ld.texinfo b/ld/ld.texinfo
---- a/ld/ld.texinfo 2014-12-23 05:47:10.000000000 -0300
-+++ b/ld/ld.texinfo 2014-12-24 08:07:29.005919191 -0300
-@@ -2212,6 +2212,18 @@
+--- a/ld/ld.texinfo
++++ b/ld/ld.texinfo
+@@ -2175,6 +2175,24 @@ string identifying the original linked file does not change.
Passing @code{none} for @var{style} disables the setting from any
@code{--build-id} options earlier on the command line.
+
-+@kindex --no-poison-system-directories
-+@item --no-poison-system-directories
++@kindex --warn-poison-system-directories
++@item --warn-poison-system-directories
++Warn for @option{-L} options using system directories such as
++@file{/usr/lib} when cross linking. This option is intended for use
++in environments that want to detect and reject incorrect link settings.
++
++@kindex --no-warn-poison-system-directories
++@item --no-warn-poison-system-directories
+Do not warn for @option{-L} options using system directories such as
+@file{/usr/lib} when cross linking. This option is intended for use
+in chroot environments when such directories contain the correct
@@ -222,55 +288,43 @@ diff -Nura a/ld/ld.texinfo b/ld/ld.texinfo
@end table
@c man end
-diff -Nura a/ld/lexsup.c b/ld/lexsup.c
---- a/ld/lexsup.c 2014-11-04 06:54:41.000000000 -0300
-+++ b/ld/lexsup.c 2014-12-24 08:48:50.136583414 -0300
-@@ -513,6 +513,14 @@
- { {"pop-state", no_argument, NULL, OPTION_POP_STATE},
- '\0', NULL, N_("Pop state of flags governing input file handling"),
- TWO_DASHES },
-+ { {"no-poison-system-directories", no_argument, NULL,
-+ OPTION_NO_POISON_SYSTEM_DIRECTORIES},
+--- a/ld/lexsup.c
++++ b/ld/lexsup.c
+@@ -507,6 +507,18 @@ static const struct ld_option ld_options[] =
+ OPTION_IGNORE_UNRESOLVED_SYMBOL},
+ '\0', N_("SYMBOL"),
+ N_("Unresolved SYMBOL will not cause an error or warning"), TWO_DASHES },
++ { {"warn-poison-system-directories", no_argument, NULL,
++ OPTION_WARN_POISON_SYSTEM_DIRECTORIES},
++ '\0', NULL, N_("Warn for -L options using system directories"),
++ TWO_DASHES },
++ { {"no-warn-poison-system-directories", no_argument, NULL,
++ OPTION_NO_WARN_POISON_SYSTEM_DIRECTORIES},
+ '\0', NULL, N_("Do not warn for -L options using system directories"),
+ TWO_DASHES },
+ { {"error-poison-system-directories", no_argument, NULL,
-+ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES},
++ OPTION_ERROR_POISON_SYSTEM_DIRECTORIES},
+ '\0', NULL, N_("Give an error for -L options using system directories"),
+ TWO_DASHES },
- };
-
- #define OPTION_COUNT ARRAY_SIZE (ld_options)
-@@ -525,6 +533,7 @@
- int ingroup = 0;
- char *default_dirlist = NULL;
- char *shortopts;
-+ char *BR_paranoid_env;
- struct option *longopts;
- struct option *really_longopts;
- int last_optind;
-@@ -1458,6 +1467,14 @@
+ { {"push-state", no_argument, NULL, OPTION_PUSH_STATE},
+ '\0', NULL, N_("Push state of flags governing input file handling"),
+ TWO_DASHES },
+@@ -1442,6 +1454,18 @@ parse_args (unsigned argc, char **argv)
+ einfo (_("%P%X: --hash-size needs a numeric argument\n"));
}
break;
-
-+ case OPTION_NO_POISON_SYSTEM_DIRECTORIES:
-+ command_line.poison_system_directories = FALSE;
-+ break;
+
-+ case OPTION_ERROR_POISON_SYSTEM_DIRECTORIES:
-+ command_line.error_poison_system_directories = TRUE;
-+ break;
++ case OPTION_WARN_POISON_SYSTEM_DIRECTORIES:
++ command_line.warn_poison_system_directories = TRUE;
++ break;
+
++ case OPTION_NO_WARN_POISON_SYSTEM_DIRECTORIES:
++ command_line.warn_poison_system_directories = FALSE;
++ break;
++
++ case OPTION_ERROR_POISON_SYSTEM_DIRECTORIES:
++ command_line.error_poison_system_directories = TRUE;
++ break;
+
case OPTION_PUSH_STATE:
input_flags.pushed = xmemdup (&input_flags,
- sizeof (input_flags),
-@@ -1483,6 +1500,10 @@
- command_line.soname = NULL;
- }
-
-+ BR_paranoid_env = getenv("BR_COMPILER_PARANOID_UNSAFE_PATH");
-+ if (BR_paranoid_env && strlen(BR_paranoid_env) > 0)
-+ command_line.error_poison_system_directories = TRUE;
-+
- while (ingroup)
- {
- lang_leave_group ();