summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas K. Hüttel <dilfridge@gentoo.org>2020-05-19 23:33:48 +0300
committerAndreas K. Hüttel <dilfridge@gentoo.org>2020-05-19 23:33:48 +0300
commitd7ce6bd337e14c5d92e68dabdf6e52966072d299 (patch)
treec5e84658565bb26de9afb63ffff74131fc72e2d4
downloadbinutils-patches-d7ce6bd337e14c5d92e68dabdf6e52966072d299.tar.gz
binutils-patches-d7ce6bd337e14c5d92e68dabdf6e52966072d299.tar.bz2
binutils-patches-d7ce6bd337e14c5d92e68dabdf6e52966072d299.zip
Add files from Gentoo binutils repo, tag gentoo/binutils-9999-6
Signed-off-by: Andreas K. Hüttel <dilfridge@gentoo.org>
-rw-r--r--0000-Gentoo-Git-is-development12
-rw-r--r--9999-Gentoo-We-make-a-release12
-rw-r--r--9999/0001-Gentoo-ld-always-warn-about-textrels-in-files.patch30
-rw-r--r--9999/0002-Gentoo-Add-an-option-no-warn-shared-textrel-self-exp.patch66
-rw-r--r--9999/0003-Gentoo-gold-ld-add-support-for-poisoned-system-direc.patch331
-rw-r--r--9999/0004-Gentoo-libiberty-install-PIC-version-of-libiberty.a.patch34
-rw-r--r--9999/0005-Gentoo-opcodes-link-against-libbfd.la-for-rpath-deps.patch49
-rw-r--r--9999/0006-Gentoo-Pass-hash-style-sysv-to-ld-in-its-testsuite.patch807
-rw-r--r--9999/0007-Gentoo-Pass-no-warn-shared-textrel-to-ld-in-its-test.patch47
-rw-r--r--9999/0008-Gentoo-Restore-TEXTREL-warnings-for-non-shared-objec.patch34
-rw-r--r--9999/0009-Gentoo-Fix-test-for-precise-textrel-warning-message-.patch24
-rw-r--r--9999/0010-Gentoo-Fix-textrel-warning-format-test.patch22
-rw-r--r--9999/0011-Gentoo-add-with-extra-soversion-suffix-option.patch141
-rw-r--r--9999/0012-no-patch-Gentoo-Add-patch-tarball-generation-script.patch217
-rw-r--r--9999/0013-Gentoo-ld-enable-new-dtags-by-default-for-linux-gnu-.patch49
-rw-r--r--9999/0014-Gentoo-Remove-block-mistakenly-duplicated-in-1222895.patch777
-rw-r--r--9999/0015-Gentoo-Adapt-generic-test-library-to-our-linker-sett.patch26
-rw-r--r--9999/0016-Gentoo-Fix-regexp-of-hilarious-ld-detection-heuristi.patch30
-rw-r--r--README.Gentoo.patches31
-rwxr-xr-xmake-tarball.sh118
20 files changed, 2857 insertions, 0 deletions
diff --git a/0000-Gentoo-Git-is-development b/0000-Gentoo-Git-is-development
new file mode 100644
index 0000000..2b9482d
--- /dev/null
+++ b/0000-Gentoo-Git-is-development
@@ -0,0 +1,12 @@
+Gentoo: Git is development
+
+--- a/bfd/development.sh
++++ b/bfd/development.sh
+@@ -16,5 +16,5 @@
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ # Controls whether to enable development-mode features by default.
+-development=false
++development=true
+
+
diff --git a/9999-Gentoo-We-make-a-release b/9999-Gentoo-We-make-a-release
new file mode 100644
index 0000000..fea66d9
--- /dev/null
+++ b/9999-Gentoo-We-make-a-release
@@ -0,0 +1,12 @@
+Gentoo: We make a release, so switch development flag off
+
+--- a/bfd/development.sh
++++ b/bfd/development.sh
+@@ -16,5 +16,5 @@
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ # Controls whether to enable development-mode features by default.
+-development=true
++development=false
+
+
diff --git a/9999/0001-Gentoo-ld-always-warn-about-textrels-in-files.patch b/9999/0001-Gentoo-ld-always-warn-about-textrels-in-files.patch
new file mode 100644
index 0000000..83377a5
--- /dev/null
+++ b/9999/0001-Gentoo-ld-always-warn-about-textrels-in-files.patch
@@ -0,0 +1,30 @@
+From 5e2144e41600a83f6127eb44d739ed170d78ac7f Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Mon, 16 May 2005 22:10:19 -0400
+Subject: [PATCH 01/16] Gentoo: ld: always warn about textrels in files
+
+textrels are bad for forcing copy-on-write (this affects everyone), and for
+security/runtime code generation, this affects security ppl. But in either
+case, it doesn't matter who needs textrels, it's the very fact that they're
+needed at all.
+
+(cherry picked from commit cd6411ad57aab78686f67cbbc1ed70ee810ad335)
+---
+ ld/ldmain.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/ld/ldmain.c b/ld/ldmain.c
+index 04a3f7a511..c3f473f661 100644
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -299,6 +299,7 @@ main (int argc, char **argv)
+ link_info.dynamic_undefined_weak = -1;
+ link_info.pei386_auto_import = -1;
+ link_info.spare_dynamic_tags = 5;
++ link_info.warn_shared_textrel = TRUE;
+ link_info.path_separator = ':';
+ #ifdef DEFAULT_FLAG_COMPRESS_DEBUG
+ link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
+--
+2.26.2
+
diff --git a/9999/0002-Gentoo-Add-an-option-no-warn-shared-textrel-self-exp.patch b/9999/0002-Gentoo-Add-an-option-no-warn-shared-textrel-self-exp.patch
new file mode 100644
index 0000000..7786ab3
--- /dev/null
+++ b/9999/0002-Gentoo-Add-an-option-no-warn-shared-textrel-self-exp.patch
@@ -0,0 +1,66 @@
+From 19ecd671bddd33f3afff169f26c55101c90c4afc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 3 Jun 2018 21:12:16 +0200
+Subject: [PATCH 02/16] Gentoo: Add an option --no-warn-shared-textrel
+ (self-explanatory)
+
+---
+ ld/ld.texi | 4 ++++
+ ld/ldlex.h | 1 +
+ ld/lexsup.c | 6 ++++++
+ 3 files changed, 11 insertions(+)
+
+diff --git a/ld/ld.texi b/ld/ld.texi
+index 4dc78e65fa..621d05dc05 100644
+--- a/ld/ld.texi
++++ b/ld/ld.texi
+@@ -2408,6 +2408,10 @@ the section (@pxref{SECTIONS}).
+ @item --warn-shared-textrel
+ Warn if the linker adds a DT_TEXTREL to a shared object.
+
++@kindex --no-warn-shared-textrel
++@item --no-warn-shared-textrel
++Do not warn if the linker adds a DT_TEXTREL to a shared object.
++
+ @kindex --warn-alternate-em
+ @item --warn-alternate-em
+ Warn if an object has alternate ELF machine code.
+diff --git a/ld/ldlex.h b/ld/ldlex.h
+index 22b928d2d9..aeaea4dfee 100644
+--- a/ld/ldlex.h
++++ b/ld/ldlex.h
+@@ -131,6 +131,7 @@ enum option_values
+ OPTION_WARN_UNRESOLVED_SYMBOLS,
+ OPTION_ERROR_UNRESOLVED_SYMBOLS,
+ OPTION_WARN_SHARED_TEXTREL,
++ OPTION_NO_WARN_SHARED_TEXTREL,
+ OPTION_WARN_ALTERNATE_EM,
+ OPTION_REDUCE_MEMORY_OVERHEADS,
+ #ifdef ENABLE_PLUGINS
+diff --git a/ld/lexsup.c b/ld/lexsup.c
+index c02041d5f1..c5edc25793 100644
+--- a/ld/lexsup.c
++++ b/ld/lexsup.c
+@@ -519,6 +519,9 @@ static const struct ld_option ld_options[] =
+ { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL},
+ '\0', NULL, N_("Warn if shared object has DT_TEXTREL"),
+ TWO_DASHES },
++ { {"no-warn-shared-textrel", no_argument, NULL, OPTION_NO_WARN_SHARED_TEXTREL},
++ '\0', NULL, N_("Do not warn if shared object has DT_TEXTREL"),
++ TWO_DASHES },
+ { {"warn-alternate-em", no_argument, NULL, OPTION_WARN_ALTERNATE_EM},
+ '\0', NULL, N_("Warn if an object has alternate ELF machine code"),
+ TWO_DASHES },
+@@ -1449,6 +1452,9 @@ parse_args (unsigned argc, char **argv)
+ case OPTION_WARN_SHARED_TEXTREL:
+ link_info.warn_shared_textrel = TRUE;
+ break;
++ case OPTION_NO_WARN_SHARED_TEXTREL:
++ link_info.warn_shared_textrel = FALSE;
++ break;
+ case OPTION_WARN_ALTERNATE_EM:
+ link_info.warn_alternate_em = TRUE;
+ break;
+--
+2.26.2
+
diff --git a/9999/0003-Gentoo-gold-ld-add-support-for-poisoned-system-direc.patch b/9999/0003-Gentoo-gold-ld-add-support-for-poisoned-system-direc.patch
new file mode 100644
index 0000000..3349c0e
--- /dev/null
+++ b/9999/0003-Gentoo-gold-ld-add-support-for-poisoned-system-direc.patch
@@ -0,0 +1,331 @@
+From c251ab646d98b3f0e8f8b1ae5e94c672325477e2 Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Tue, 10 Oct 2017 22:53:53 +0200
+Subject: [PATCH 03/16] Gentoo: gold/ld: add support for poisoned system
+ directories
+
+This is based on the old CodeSourcery patch written by Joseph Myers to add
+support to the link for detecting & rejecting bad -L paths when using a
+cross-compiler. The differences here:
+* The command line flags are always available.
+* We can turn on & off the warning via the command line.
+* The configure option controls the default warning behavior.
+* Add support for gold.
+
+It is not currently upstream, nor has it been submitted at all. There are
+no plans to do so currently either.
+
+BUG=chromium:488360
+TEST=`cbuildbot chromiumos-sdk` passes # tests arm/amd64/mipsel/x86
+TEST=`cbuildbot panther_moblab-full whirlwind-release` pass
+TEST=`cbuildbot {x32,arm64}-generic-full` has no new failures
+TEST=x86_64-cros-linux-gnu-ld throws warnings when using -L/lib (gold & bfd)
+
+Reviewed-on: https://chromium-review.googlesource.com/272083
+(cherry picked from commit f92dbf35c00ab13cee36f6be8ae5ca46454d9000)
+---
+ gold/options.cc | 33 +++++++++++++++++++++++++++++++++
+ gold/options.h | 7 +++++++
+ ld/config.in | 3 +++
+ ld/configure | 14 ++++++++++++++
+ ld/configure.ac | 10 ++++++++++
+ ld/ld.h | 7 +++++++
+ ld/ld.texi | 18 ++++++++++++++++++
+ ld/ldfile.c | 20 ++++++++++++++++++++
+ ld/ldlex.h | 3 +++
+ ld/ldmain.c | 7 +++++++
+ ld/lexsup.c | 24 ++++++++++++++++++++++++
+ 11 files changed, 146 insertions(+)
+
+diff --git a/gold/options.cc b/gold/options.cc
+index 94867b361a..704d5d089e 100644
+--- a/gold/options.cc
++++ b/gold/options.cc
+@@ -1290,6 +1290,39 @@ 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");
++ // TODO: This check is disabled for now due to a bunch of packages that
++ // use libtool and relink with -L/usr/lib paths (albeit after the right
++ // sysroot path). Once those are fixed we can enable.
++ // We also need to adjust it so it only rejects one or two levels deep.
++ // Gcc's internal paths also live below /usr/lib.
++ // http://crbug.com/488360
++ // 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());
++ }
++ }
++
+ // Now that we've normalized the options, check for contradictory ones.
+ if (this->shared() && this->is_static())
+ gold_fatal(_("-shared and -static are incompatible"));
+diff --git a/gold/options.h b/gold/options.h
+index b2059d984c..b60f802754 100644
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -1375,6 +1375,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"));
+diff --git a/ld/config.in b/ld/config.in
+index d93c9b0830..5da2742bea 100644
+--- a/ld/config.in
++++ b/ld/config.in
+@@ -31,6 +31,9 @@
+ language is requested. */
+ #undef ENABLE_NLS
+
++/* Define to warn for use of native system library directories */
++#undef ENABLE_POISON_SYSTEM_DIRECTORIES
++
+ /* Additional extension a shared object might have. */
+ #undef EXTRA_SHLIB_EXTENSION
+
+diff --git a/ld/configure b/ld/configure
+index e1dbc95747..460078f6e8 100755
+--- a/ld/configure
++++ b/ld/configure
+@@ -826,6 +826,7 @@ with_lib_path
+ enable_targets
+ enable_64_bit_bfd
+ with_sysroot
++enable_poison_system_directories
+ enable_gold
+ enable_got
+ enable_compressed_debug_sections
+@@ -1491,6 +1492,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)
++ --enable-poison-system-directories
++ warn for use of native system library directories
+ --enable-gold[=ARG] build gold [ARG={default,yes,no}]
+ --enable-got=<type> GOT handling scheme (target, single, negative,
+ multigot)
+@@ -15809,7 +15812,18 @@ else
+ fi
+
+
++# Check whether --enable-poison-system-directories was given.
++if test "${enable_poison_system_directories+set}" = set; then :
++ enableval=$enable_poison_system_directories;
++else
++ enable_poison_system_directories=no
++fi
++
++if test "x${enable_poison_system_directories}" = "xyes"; then
+
++$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
++
++fi
+
+ # Check whether --enable-got was given.
+ if test "${enable_got+set}" = set; then :
+diff --git a/ld/configure.ac b/ld/configure.ac
+index b5e849d84a..22e022ec03 100644
+--- a/ld/configure.ac
++++ b/ld/configure.ac
+@@ -94,6 +94,16 @@ AC_SUBST(use_sysroot)
+ AC_SUBST(TARGET_SYSTEM_ROOT)
+ AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)
+
++AC_ARG_ENABLE([poison-system-directories],
++ AS_HELP_STRING([--enable-poison-system-directories],
++ [warn for use of native system library directories]),,
++ [enable_poison_system_directories=no])
++if test "x${enable_poison_system_directories}" = "xyes"; then
++ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
++ [1],
++ [Define to warn for use of native system library directories])
++fi
++
+ 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 --git a/ld/ld.h b/ld/ld.h
+index 71fd781267..a6ea2ae69e 100644
+--- a/ld/ld.h
++++ b/ld/ld.h
+@@ -166,6 +166,13 @@ typedef struct
+ in the linker script. */
+ bfd_boolean force_group_allocation;
+
++ /* 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. */
++ bfd_boolean error_poison_system_directories;
++
+ /* Big or little endian as set on command line. */
+ enum endian_enum endian;
+
+diff --git a/ld/ld.texi b/ld/ld.texi
+index 621d05dc05..cbbbc687d0 100644
+--- a/ld/ld.texi
++++ b/ld/ld.texi
+@@ -2609,6 +2609,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 --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
++libraries for the target system rather than the host.
++
++@kindex --error-poison-system-directories
++@item --error-poison-system-directories
++Give an error instead of a warning for @option{-L} options using
++system directories when cross linking.
+ @end table
+
+ @c man end
+diff --git a/ld/ldfile.c b/ld/ldfile.c
+index 53112c8694..eb357e66a9 100644
+--- a/ld/ldfile.c
++++ b/ld/ldfile.c
+@@ -117,6 +117,26 @@ ldfile_add_library_path (const char *name, bfd_boolean cmdline)
+ new_dirs->name = concat (ld_sysroot, name + strlen ("$SYSROOT"), (const char *) NULL);
+ else
+ new_dirs->name = xstrdup (name);
++
++ if (command_line.warn_poison_system_directories
++ && (!strncmp (name, "/lib", 4)
++ /* TODO: This check is disabled for now due to a bunch of packages that
++ * use libtool and relink with -L/usr/lib paths (albeit after the right
++ * sysroot path). Once those are fixed we can enable.
++ * We also need to adjust it so it only rejects one or two levels deep.
++ * Gcc's internal paths also live below /usr/lib.
++ * http://crbug.com/488360 */
++ /* || !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 --git a/ld/ldlex.h b/ld/ldlex.h
+index aeaea4dfee..b8d43da37f 100644
+--- a/ld/ldlex.h
++++ b/ld/ldlex.h
+@@ -142,6 +142,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_DISABLE_MULTIPLE_DEFS_ABS,
+diff --git a/ld/ldmain.c b/ld/ldmain.c
+index c3f473f661..c45012dbbd 100644
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -273,6 +273,13 @@ main (int argc, char **argv)
+ command_line.warn_mismatch = TRUE;
+ command_line.warn_search_mismatch = TRUE;
+ command_line.check_section_addresses = -1;
++ command_line.warn_poison_system_directories =
++#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
++ TRUE;
++#else
++ FALSE;
++#endif
++ command_line.error_poison_system_directories = FALSE;
+
+ /* We initialize DEMANGLING based on the environment variable
+ COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the
+diff --git a/ld/lexsup.c b/ld/lexsup.c
+index c5edc25793..c20c0bb0d8 100644
+--- a/ld/lexsup.c
++++ b/ld/lexsup.c
+@@ -540,6 +540,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},
++ '\0', NULL, N_("Give an error for -L options using system directories"),
++ TWO_DASHES },
+ { {"push-state", no_argument, NULL, OPTION_PUSH_STATE},
+ '\0', NULL, N_("Push state of flags governing input file handling"),
+ TWO_DASHES },
+@@ -1563,6 +1575,18 @@ parse_args (unsigned argc, char **argv)
+ }
+ 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),
+--
+2.26.2
+
diff --git a/9999/0004-Gentoo-libiberty-install-PIC-version-of-libiberty.a.patch b/9999/0004-Gentoo-libiberty-install-PIC-version-of-libiberty.a.patch
new file mode 100644
index 0000000..54e5fdf
--- /dev/null
+++ b/9999/0004-Gentoo-libiberty-install-PIC-version-of-libiberty.a.patch
@@ -0,0 +1,34 @@
+From c11463f5dbeb53c2a600a5b4a3982368ad149ba1 Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Fri, 7 Jan 2005 00:15:53 -0500
+Subject: [PATCH 04/16] Gentoo: libiberty: install PIC version of libiberty.a
+
+This will install a PIC version of libiberty.a by overwriting the non-PIC
+version of libiberty.a while compiling. We do this because there is no
+shared version of libiberty for random apps to link against which means if
+someone wants to use this in a shared library or PIE, they're out of luck.
+It's arguable whether people should be able to use this in a shared lib,
+but usage in PIE should be fine. You could argue that this penalizes the
+non-PIE users, but the counter point is that people using this library in
+general are fairly low, and we'd rather have things work for all of them.
+
+(cherry picked from commit 112aff9ad3e2675556370c4281117a6df0a879d9)
+---
+ libiberty/Makefile.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in
+index d6b302e02f..8d84a09f1d 100644
+--- a/libiberty/Makefile.in
++++ b/libiberty/Makefile.in
+@@ -256,6 +256,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS)
+ $(AR) $(AR_FLAGS) $(TARGETLIB) \
+ $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \
+ $(RANLIB) $(TARGETLIB); \
++ cp $(TARGETLIB) ../ ; \
+ cd ..; \
+ else true; fi; \
+ if [ x"$(NOASANFLAG)" != x ]; then \
+--
+2.26.2
+
diff --git a/9999/0005-Gentoo-opcodes-link-against-libbfd.la-for-rpath-deps.patch b/9999/0005-Gentoo-opcodes-link-against-libbfd.la-for-rpath-deps.patch
new file mode 100644
index 0000000..2ec1013
--- /dev/null
+++ b/9999/0005-Gentoo-opcodes-link-against-libbfd.la-for-rpath-deps.patch
@@ -0,0 +1,49 @@
+From b4c9e06c3fb0ede497bcc51dde6c9756efe124ad Mon Sep 17 00:00:00 2001
+From: Mike Frysinger <vapier@gentoo.org>
+Date: Tue, 5 Jul 2016 20:24:00 +0545
+Subject: [PATCH 05/16] Gentoo: opcodes: link against libbfd.la for rpath deps
+
+The reason opcodes doesn't link against libbfd.la is to workaround a
+libtool bug where it uses installed -L paths ahead of DESTDIR paths.
+The downside is that the library itself lacks rpath tags to find the
+right version of libbfd.so.
+
+Since Gentoo has patched the libtool bug for a while, we don't need
+the workaround. Use the .la file so we get the rpath tags.
+
+URL: https://bugs.gentoo.org/563934
+(cherry picked from commit 662586237b0b00ee881e79b56f6234ff36e8bfe6)
+---
+ opcodes/configure | 2 +-
+ opcodes/configure.ac | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/opcodes/configure b/opcodes/configure
+index 42be5febad..7b8ee51cc3 100755
+--- a/opcodes/configure
++++ b/opcodes/configure
+@@ -12797,7 +12797,7 @@ if test "$enable_shared" = "yes"; then
+ SHARED_LIBADD="-Wl,`pwd`/../bfd/.libs/libbfd.sl ${SHARED_LIBADD}"
+ ;;
+ *)
+- SHARED_LIBADD="-Wl,`pwd`/../bfd/.libs/libbfd.so ${SHARED_LIBADD}"
++ SHARED_LIBADD="../bfd/libbfd.la ${SHARED_LIBADD}"
+ ;;
+ esac
+ SHARED_DEPENDENCIES="../bfd/libbfd.la"
+diff --git a/opcodes/configure.ac b/opcodes/configure.ac
+index 00be9c88be..b7a511ac58 100644
+--- a/opcodes/configure.ac
++++ b/opcodes/configure.ac
+@@ -188,7 +188,7 @@ changequote([,])dnl
+ SHARED_LIBADD="-Wl,`pwd`/../bfd/.libs/libbfd.sl ${SHARED_LIBADD}"
+ ;;
+ *)
+- SHARED_LIBADD="-Wl,`pwd`/../bfd/.libs/libbfd.so ${SHARED_LIBADD}"
++ SHARED_LIBADD="../bfd/libbfd.la ${SHARED_LIBADD}"
+ ;;
+ esac
+ SHARED_DEPENDENCIES="../bfd/libbfd.la"
+--
+2.26.2
+
diff --git a/9999/0006-Gentoo-Pass-hash-style-sysv-to-ld-in-its-testsuite.patch b/9999/0006-Gentoo-Pass-hash-style-sysv-to-ld-in-its-testsuite.patch
new file mode 100644
index 0000000..30f207b
--- /dev/null
+++ b/9999/0006-Gentoo-Pass-hash-style-sysv-to-ld-in-its-testsuite.patch
@@ -0,0 +1,807 @@
+From 65535cdfae964cce89a7c03ad720f80c61e09217 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Wed, 18 Oct 2017 00:44:49 +0200
+Subject: [PATCH 06/16] Gentoo: Pass --hash-style=sysv to ld in its testsuite
+
+---
+ ld/testsuite/lib/ld-lib.exp | 769 +++++++++++++++++++++++++++++++++++-
+ 1 file changed, 767 insertions(+), 2 deletions(-)
+
+diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
+index 015eda6eb9..853a4d87e6 100644
+--- a/ld/testsuite/lib/ld-lib.exp
++++ b/ld/testsuite/lib/ld-lib.exp
+@@ -165,7 +165,7 @@ proc default_ld_relocate { ld target objects } {
+ global HOSTING_EMU
+
+ remote_file host delete $target
+- return [run_host_cmd_yesno "$ld" "$HOSTING_EMU -o $target -r $objects"]
++ return [run_host_cmd_yesno "$ld" "$HOSTING_EMU --hash-style=sysv -o $target -r $objects"]
+ }
+
+ # Check to see if ld is being invoked with a non-endian output format
+@@ -196,8 +196,20 @@ proc default_ld_link { ld target objects } {
+ set flags [big_or_little_endian]
+ }
+
++ # Hilariously, this procedure is called sometimes with $CC and sometimes
++ # with $ld as parameter. If we want to change the default behaviour, we
++ # need to take the different option formats into account.
++ # We check the $ld parameter for
++ # - .*ld/ld-new -> we're working with the new linker
++ # - otherwise -> we're likely working with the system compiler
++ if {[regexp {ld/ld-new$} $ld]} {
++ set gentoosysv "--hash-style=sysv"
++ } else {
++ set gentoosysv "-Wl,--hash-style=sysv"
++ }
++
+ remote_file host delete $target
+- set exec_output [run_host_cmd "$ld" "$flags -o $target $objects"]
++ set exec_output [run_host_cmd "$ld" "$gentoosysv $flags -o $target $objects"]
+ set exec_output [prune_warnings $exec_output]
+
+ # We don't care if we get a warning about a non-existent start
+@@ -409,6 +421,759 @@ proc ld_link_defsyms {} {
+ return $flags
+ }
+
++# run_dump_test FILE (optional:) EXTRA_OPTIONS
++# Copied from gas testsuite, tweaked and further extended.
++#
++# Assemble a .s file, then run some utility on it and check the output.
++#
++# There should be an assembly language file named FILE.s in the test
++# suite directory, and a pattern file called FILE.d. `run_dump_test'
++# will assemble FILE.s, run some tool like `objdump', `objcopy', or
++# `nm' on the .o file to produce textual output, and then analyze that
++# with regexps. The FILE.d file specifies what program to run, and
++# what to expect in its output.
++#
++# The FILE.d file begins with zero or more option lines, which specify
++# flags to pass to the assembler, the program to run to dump the
++# assembler's output, and the options it wants. The option lines have
++# the syntax:
++#
++# # OPTION: VALUE
++#
++# OPTION is the name of some option, like "name" or "objdump", and
++# VALUE is OPTION's value. The valid options are described below.
++# Whitespace is ignored everywhere, except within VALUE. The option
++# list ends with the first line that doesn't match the above syntax
++# (hmm, not great for error detection).
++#
++# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
++# two-element lists. The first element of each is an option name, and
++# the second additional arguments to be added on to the end of the
++# option list as given in FILE.d. (If omitted, no additional options
++# are added.)
++#
++# The interesting options are:
++#
++# name: TEST-NAME
++# The name of this test, passed to DejaGNU's `pass' and `fail'
++# commands. If omitted, this defaults to FILE, the root of the
++# .s and .d files' names.
++#
++# as: FLAGS
++# When assembling, pass FLAGS to the assembler.
++# If assembling several files, you can pass different assembler
++# options in the "source" directives. See below.
++#
++# ld: FLAGS
++# Link assembled files using FLAGS, in the order of the "source"
++# directives, when using multiple files.
++#
++# ld_after_inputfiles: FLAGS
++# Similar to "ld", but put after all input files.
++#
++# objcopy_objects: FLAGS
++# Run objcopy with the specified flags after assembling any source
++# that has the special marker RUN_OBJCOPY in the source specific
++# flags.
++#
++# objcopy_linked_file: FLAGS
++# Run objcopy on the linked file with the specified flags.
++# This lets you transform the linked file using objcopy, before the
++# result is analyzed by an analyzer program specified below (which
++# may in turn *also* be objcopy).
++#
++# PROG: PROGRAM-NAME
++# The name of the program to run to analyze the .o file produced
++# by the assembler or the linker output. This can be omitted;
++# run_dump_test will guess which program to run by seeing which of
++# the flags options below is present.
++#
++# readelf: FLAGS
++# objdump: FLAGS
++# nm: FLAGS
++# objcopy: FLAGS
++# Use the specified program to analyze the assembler or linker
++# output file, and pass it FLAGS, in addition to the output name.
++# Note that they are run with LC_ALL=C in the environment to give
++# consistent sorting of symbols.
++#
++# source: SOURCE [FLAGS]
++# Assemble the file SOURCE.s using the flags in the "as" directive
++# and the (optional) FLAGS. If omitted, the source defaults to
++# FILE.s.
++# This is useful if several .d files want to share a .s file.
++# More than one "source" directive can be given, which is useful
++# when testing linking.
++#
++# dump: DUMP
++# Match against DUMP.d. If omitted, this defaults to FILE.d. This
++# is useful if several .d files differ by options only. Options are
++# always read from FILE.d.
++#
++# xfail: TARGET
++# The test is expected to fail on TARGET. This may occur more than
++# once.
++#
++# target: TARGET
++# Only run the test for TARGET.
++# You may provide target name "cfi" for any target supporting the
++# CFI statements. You may provide target name "shared" for any
++# target supporting shared libraries. Otherwise TARGET is called
++# as a TCL procedure if surrounded by square brackets, or passed
++# to "istarget" if not.
++# This may occur more than once; the target being tested must match
++# at least one. Otherwise the test will be marked unsupported.
++#
++# alltargets: TARGET
++# Only run the test for TARGET.
++# The syntax for TARGET is as with 'target'.
++# This may occur more than once; the target being tested must match
++# all of them. Otherwise the test will be marked unsupported.
++#
++# notarget: TARGET
++# Do not run the test for TARGET.
++# The syntax for TARGET is as with 'target'.
++# This may occur more than once; the target being tested must not
++# match any of them. Otherwise the test will be marked unsupported.
++#
++# skip: TARGET
++# anyskip: TARGET
++# noskip: TARGET
++# These are exactly the same as "notarget", "alltargets" and
++# "target" respectively, except that they do nothing at all if the
++# check fails. They should only be used in groups, to construct a
++# single test which is run on all targets but with variant options
++# or expected output on some targets. (For example, see
++# gas/arm/inst.d and gas/arm/wince_inst.d.)
++#
++# error: REGEX
++# An error with message matching REGEX must be emitted for the test
++# to pass. The PROG, readelf, objdump, nm and objcopy options have
++# no meaning and need not be supplied if this is present. Multiple
++# "error" directives append to the expected linker error message.
++#
++# error_output: FILE
++# Means the same as 'error', except the regular expression lines
++# are contains in FILE.
++#
++# warning: REGEX
++# Expect a linker warning matching REGEX. It is an error to issue
++# both "error" and "warning". Multiple "warning" directives
++# append to the expected linker warning message.
++#
++# warning_output: FILE
++# Means the same as 'warning', except the regular expression
++# lines are contains in FILE.
++#
++# map: FILE
++# Adding this option will cause the linker to generate a linker
++# map file, using the -Map=MAPFILE command line option. If
++# there is no -Map=MAPFILE in the 'ld: FLAGS' then one will be
++# added to the linker command line. The contents of the
++# generated MAPFILE are then compared against the regexp lines
++# in FILE using `regexp_diff' (see below for details).
++#
++# Each option may occur at most once unless otherwise mentioned.
++#
++# After the option lines come regexp lines. `run_dump_test' calls
++# `regexp_diff' to compare the output of the dumping tool against the
++# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp;
++# see further comments there.
++#
++proc run_dump_test { name {extra_options {}} } {
++ global subdir srcdir
++ global OBJDUMP NM AS OBJCOPY READELF LD
++ global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS LDFLAGS
++ global host_triplet runtests
++ global env verbose
++ global ld_elf_shared_opt
++
++ if { [is_elf_format] && [check_shared_lib_support] } {
++ set ld_extra_opt "$ld_elf_shared_opt"
++ } else {
++ set ld_extra_opt ""
++ }
++
++ if [string match "*/*" $name] {
++ set file $name
++ set name [file tail $name]
++ } else {
++ set file "$srcdir/$subdir/$name"
++ }
++
++ if ![runtest_file_p $runtests $name] then {
++ return
++ }
++
++ set opt_array [slurp_options "${file}.d"]
++ if { $opt_array == -1 } {
++ perror "error reading options from $file.d"
++ unresolved $subdir/$name
++ return
++ }
++ set dumpfile tmpdir/dump.out
++ set run_ld 0
++ set run_objcopy 0
++ set objfile_names {}
++ set opts(as) {}
++ set opts(ld) {}
++ set opts(ld_after_inputfiles) {}
++ set opts(xfail) {}
++ set opts(target) {}
++ set opts(alltargets) {}
++ set opts(notarget) {}
++ set opts(skip) {}
++ set opts(anyskip) {}
++ set opts(noskip) {}
++ set opts(objdump) {}
++ set opts(nm) {}
++ set opts(objcopy) {}
++ set opts(readelf) {}
++ set opts(name) {}
++ set opts(PROG) {}
++ set opts(source) {}
++ set opts(dump) {}
++ set opts(error) {}
++ set opts(warning) {}
++ set opts(error_output) {}
++ set opts(warning_output) {}
++ set opts(objcopy_linked_file) {}
++ set opts(objcopy_objects) {}
++ set opts(map) {}
++
++ foreach i $opt_array {
++ set opt_name [lindex $i 0]
++ set opt_val [lindex $i 1]
++ if ![info exists opts($opt_name)] {
++ perror "unknown option $opt_name in file $file.d"
++ unresolved $subdir/$name
++ return
++ }
++
++ switch -- $opt_name {
++ xfail {}
++ target {}
++ alltargets {}
++ notarget {}
++ skip {}
++ anyskip {}
++ noskip {}
++ warning {}
++ error {}
++ source {
++ # Move any source-specific as-flags to a separate list to
++ # simplify processing.
++ if { [llength $opt_val] > 1 } {
++ lappend asflags [lrange $opt_val 1 end]
++ set opt_val [lindex $opt_val 0]
++ } else {
++ lappend asflags {}
++ }
++
++ # Create the object file name based on nothing but the source
++ # file name.
++ set new_objfile \
++ [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]].o]
++ # But, sometimes, we have the exact same source filename in
++ # different directories (foo/src.s bar/src.s) which would lead
++ # us to try and create two src.o files. We detect this
++ # conflict here, and instead create src.o and src1.o.
++ set j 0
++ while { [lsearch $objfile_names $new_objfile] != -1 } {
++ incr j
++ set new_objfile \
++ [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]]${j}.o]
++ }
++ lappend objfile_names $new_objfile
++ }
++ default {
++ if [string length $opts($opt_name)] {
++ perror "option $opt_name multiply set in $file.d"
++ unresolved $subdir/$name
++ return
++ }
++
++ # A single "# ld:" with no options should do the right thing.
++ if { $opt_name == "ld" } {
++ set run_ld 1
++ }
++ # Likewise objcopy_linked_file.
++ if { $opt_name == "objcopy_linked_file" } {
++ set run_objcopy 1
++ }
++ }
++ }
++ if { $opt_name == "as" || $opt_name == "ld" } {
++ set opt_val [subst $opt_val]
++ }
++
++ # Append differently whether it's a message (without space) or
++ # an option or list (with space).
++ switch -- $opt_name {
++ warning -
++ error {
++ append opts($opt_name) $opt_val
++ }
++ default {
++ set opts($opt_name) [concat $opts($opt_name) $opt_val]
++ }
++ }
++ }
++
++ foreach i $extra_options {
++ set opt_name [lindex $i 0]
++ set opt_val [lindex $i 1]
++ if ![info exists opts($opt_name)] {
++ perror "unknown option $opt_name given in extra_opts"
++ unresolved $subdir/$name
++ return
++ }
++ # Add extra option to end of existing option, adding space
++ # if necessary.
++ if { ![regexp "warning|error" $opt_name]
++ && [string length $opts($opt_name)] } {
++ append opts($opt_name) " "
++ }
++ append opts($opt_name) $opt_val
++ }
++
++ foreach opt { as ld } {
++ regsub {\[big_or_little_endian\]} $opts($opt) \
++ [big_or_little_endian] opts($opt)
++ }
++
++ if { $opts(name) == "" } {
++ set testname "$subdir/$name"
++ } else {
++ set testname $opts(name)
++ }
++
++ # Decide early whether we should run the test for this target.
++ if { [llength $opts(noskip)] > 0 } {
++ set targmatch 0
++ foreach targ $opts(noskip) {
++ if [match_target $targ] {
++ set targmatch 1
++ break
++ }
++ }
++ if { $targmatch == 0 } {
++ return
++ }
++ }
++ foreach targ $opts(anyskip) {
++ if ![match_target $targ] {
++ return
++ }
++ }
++ foreach targ $opts(skip) {
++ if [match_target $targ] {
++ return
++ }
++ }
++ if { [llength $opts(target)] > 0 } {
++ set targmatch 0
++ foreach targ $opts(target) {
++ if [match_target $targ] {
++ set targmatch 1
++ break
++ }
++ }
++ if { $targmatch == 0 } {
++ unsupported $testname
++ return
++ }
++ }
++ foreach targ $opts(alltargets) {
++ if ![match_target $targ] {
++ unsupported $testname
++ return
++ }
++ }
++ foreach targ $opts(notarget) {
++ if [match_target $targ] {
++ unsupported $testname
++ return
++ }
++ }
++
++ set program ""
++ # It's meaningless to require an output-testing method when we
++ # expect an error.
++ if { $opts(error) == "" && $opts(error_output) == "" } {
++ if {$opts(PROG) != ""} {
++ switch -- $opts(PROG) {
++ objdump { set program objdump }
++ nm { set program nm }
++ objcopy { set program objcopy }
++ readelf { set program readelf }
++ default
++ { perror "unrecognized program option $opts(PROG) in $file.d"
++ unresolved $testname
++ return }
++ }
++ } else {
++ # Guess which program to run, by seeing which option was specified.
++ foreach p {objdump objcopy nm readelf} {
++ if {$opts($p) != ""} {
++ if {$program != ""} {
++ perror "ambiguous dump program in $file.d"
++ unresolved $testname
++ return
++ } else {
++ set program $p
++ }
++ }
++ }
++ }
++ if { $program == "" \
++ && $opts(map) == "" \
++ && $opts(warning) == "" \
++ && $opts(warning_output) == "" \
++ && $opts(error) == "" \
++ && $opts(error_output) == "" } {
++ perror "dump program unspecified in $file.d"
++ unresolved $testname
++ return
++ }
++ }
++
++ if { $opts(source) == "" } {
++ set sourcefiles [list ${file}.s]
++ set asflags [list ""]
++ set objfile_names [list tmpdir/[file tail ${file}].o]
++ } else {
++ set sourcefiles {}
++ foreach sf $opts(source) {
++ if { [string match "/*" $sf] } {
++ lappend sourcefiles "$sf"
++ } else {
++ lappend sourcefiles "$srcdir/$subdir/$sf"
++ }
++ }
++ }
++
++ if { $opts(dump) == "" } {
++ set dfile ${file}.d
++ } else {
++ set dfile $srcdir/$subdir/$opts(dump)
++ }
++
++ # Time to setup xfailures.
++ foreach targ $opts(xfail) {
++ setup_xfail $targ
++ }
++
++ # Assemble each file.
++ set objfiles {}
++ for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
++ set sourcefile [lindex $sourcefiles $i]
++ set sourceasflags [lindex $asflags $i]
++ set run_objcopy_objects 0
++
++ if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
++ set run_objcopy_objects 1
++ }
++ regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
++
++ set objfile [lindex $objfile_names $i]
++ catch "exec rm -f $objfile" exec_output
++ lappend objfiles $objfile
++ set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
++
++ send_log "$cmd\n"
++ set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
++ remote_upload host "ld.tmp"
++ set comp_output [prune_warnings [file_contents "ld.tmp"]]
++ remote_file host delete "ld.tmp"
++ remote_file build delete "ld.tmp"
++
++ if { [lindex $cmdret 0] != 0 || ![string match "" $comp_output] } then {
++ send_log -- "$comp_output\n"
++ verbose "$comp_output" 3
++
++ set exitstat "succeeded"
++ if { $cmdret != 0 } { set exitstat "failed" }
++ verbose -log "$exitstat with: <$comp_output>"
++ fail $testname
++ return
++ }
++
++ if { $run_objcopy_objects } {
++ set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
++
++ send_log "$cmd\n"
++ set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
++ "" "/dev/null" "objcopy.tmp"]
++ remote_upload host "objcopy.tmp"
++ set comp_output [prune_warnings [file_contents "objcopy.tmp"]]
++ remote_file host delete "objcopy.tmp"
++ remote_file build delete "objcopy.tmp"
++
++ if { [lindex $cmdret 0] != 0 \
++ || ![string match "" $comp_output] } {
++ send_log -- "$comp_output\n"
++ verbose "$comp_output" 3
++
++ set exitstat "succeeded"
++ if { $cmdret != 0 } { set exitstat "failed" }
++ verbose -log "$exitstat with: <$comp_output>"
++ fail $testname
++ return
++ }
++ }
++ }
++
++ if { (($opts(warning) != "") && ($opts(error) != "")) \
++ || (($opts(warning) != "") && ($opts(error_output) != "")) \
++ || (($opts(warning) != "") && ($opts(warning_output) != "")) \
++ || (($opts(error) != "") && ($opts(warning_output) != "")) \
++ || (($opts(error) != "") && ($opts(error_output) != "")) \
++ || (($opts(warning_output) != "") && ($opts(error_output) != "")) } {
++ perror "$testname: bad mix of warning, error, warning_output, and error_output test-directives"
++ unresolved $testname
++ return
++ }
++
++ set check_ld(source) ""
++ set check_ld(terminal) 0
++ if { $opts(error) != "" \
++ || $opts(warning) != "" \
++ || $opts(error_output) != "" \
++ || $opts(warning_output) != "" } {
++
++ if { $opts(error) != "" || $opts(error_output) != "" } {
++ set check_ld(terminal) 1
++ } else {
++ set check_ld(terminal) 0
++ }
++
++ if { $opts(error) != "" || $opts(warning) != "" } {
++ set check_ld(source) "regex"
++ if { $opts(error) != "" } {
++ set check_ld(regex) $opts(error)
++ } else {
++ set check_ld(regex) $opts(warning)
++ }
++ } else {
++ set check_ld(source) "file"
++ if { $opts(error_output) != "" } {
++ set check_ld(file) $opts(error_output)
++ } else {
++ set check_ld(file) $opts(warning_output)
++ }
++ }
++ }
++
++ # Perhaps link the file(s).
++ if { $run_ld } {
++ set objfile "tmpdir/dump"
++ catch "exec rm -f $objfile" exec_output
++
++ # Add -L$srcdir/$subdir so that the linker command can use
++ # linker scripts in the source directory.
++ set cmd "$LD --hash-style=sysv $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
++ $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
++
++ # If needed then check for, or add a -Map option.
++ set mapfile ""
++ if { $opts(map) != "" } then {
++ if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
++ # Found existing mapfile option
++ verbose -log "Existing mapfile '$mapfile' found"
++ } else {
++ # No mapfile option.
++ set mapfile "tmpdir/dump.map"
++ verbose -log "Adding mapfile '$mapfile'"
++ set cmd "$cmd -Map=$mapfile"
++ }
++ }
++
++ send_log "$cmd\n"
++ set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
++ remote_upload host "ld.tmp"
++ set comp_output [file_contents "ld.tmp"]
++ remote_file host delete "ld.tmp"
++ remote_file build delete "ld.tmp"
++ set cmdret [lindex $cmdret 0]
++
++ if { $cmdret == 0 && $run_objcopy } {
++ set infile $objfile
++ set objfile "tmpdir/dump1"
++ remote_file host delete $objfile
++
++ # Note that we don't use OBJCOPYFLAGS here; any flags must be
++ # explicitly specified.
++ set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
++
++ send_log "$cmd\n"
++ set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
++ remote_upload host "ld.tmp"
++ append comp_output [file_contents "ld.tmp"]
++ remote_file host delete "ld.tmp"
++ remote_file build delete "ld.tmp"
++ set cmdret [lindex $cmdret 0]
++ }
++
++ regsub "\n$" $comp_output "" comp_output
++ if { $cmdret != 0 || $comp_output != "" || $check_ld(source) != "" } then {
++ set exitstat "succeeded"
++ if { $cmdret != 0 } { set exitstat "failed" }
++
++ if { $check_ld(source) == "regex" } {
++ verbose -log "$exitstat with: <$comp_output>, expected: <$check_ld(regex)>"
++ } elseif { $check_ld(source) == "file" } {
++ verbose -log "$exitstat with: <$comp_output>, expected in file $check_ld(file)"
++ set_file_contents "tmpdir/ld.messages" "$comp_output"
++ } else {
++ verbose -log "$exitstat with: <$comp_output>, no expected output"
++ }
++ send_log -- "$comp_output\n"
++ verbose "$comp_output" 3
++
++ if { (($check_ld(source) == "") == ($comp_output == "")) \
++ && (($cmdret == 0) == ($check_ld(terminal) == 0)) \
++ && ((($check_ld(source) == "regex") \
++ && ($check_ld(regex) == "") == ($comp_output == "") \
++ && [regexp -- $check_ld(regex) $comp_output]) \
++ || (($check_ld(source) == "file") \
++ && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$check_ld(file)"]))) } {
++ # We have the expected output from ld.
++ if { $check_ld(terminal) || $program == "" } {
++ pass $testname
++ return
++ }
++ } else {
++ fail $testname
++ return
++ }
++ }
++
++ if { $opts(map) != "" } then {
++ # Check the map file matches.
++ set map_pattern_file $srcdir/$subdir/$opts(map)
++ verbose -log "Compare '$mapfile' against '$map_pattern_file'"
++ if { [regexp_diff $mapfile $map_pattern_file] } then {
++ fail "$testname (map file check)"
++ } else {
++ pass "$testname (map file check)"
++ }
++
++ if { $program == "" } then {
++ return
++ }
++ }
++ } else {
++ set objfile [lindex $objfiles 0]
++ }
++
++ # We must not have expected failure if we get here.
++ if { $opts(error) != "" } {
++ fail $testname
++ return
++ }
++
++ set progopts1 $opts($program)
++ eval set progopts \$[string toupper $program]FLAGS
++ eval set binary \$[string toupper $program]
++
++ if { ![is_remote host] && [which $binary] == 0 } {
++ untested $testname
++ return
++ }
++
++ if { $progopts1 == "" } { set $progopts1 "-r" }
++ verbose "running $binary $progopts $progopts1" 3
++
++ # Objcopy, unlike the other two, won't send its output to stdout,
++ # so we have to run it specially.
++ set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
++ if { $program == "objcopy" } {
++ set cmd "$binary $progopts $progopts1 $objfile $dumpfile"
++ }
++
++ # Ensure consistent sorting of symbols
++ if {[info exists env(LC_ALL)]} {
++ set old_lc_all $env(LC_ALL)
++ }
++ set env(LC_ALL) "C"
++ send_log "$cmd\n"
++ set cmdret [remote_exec host [concat sh -c [list "$cmd 2>ld.tmp"]] "" "/dev/null"]
++ set cmdret [lindex $cmdret 0]
++ remote_upload host "ld.tmp"
++ set comp_output [prune_warnings [file_contents "ld.tmp"]]
++ remote_file host delete "ld.tmp"
++ remote_file build delete "ld.tmp"
++ if {[info exists old_lc_all]} {
++ set env(LC_ALL) $old_lc_all
++ } else {
++ unset env(LC_ALL)
++ }
++ if { $cmdret != 0 || $comp_output != "" } {
++ send_log "exited abnormally with $cmdret, output:$comp_output\n"
++ fail $testname
++ return
++ }
++
++ if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
++ if { [regexp_diff $dumpfile "${dfile}"] } then {
++ fail $testname
++ if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
++ return
++ }
++
++ pass $testname
++}
++
++proc slurp_options { file } {
++ # If options_regsub(foo) is set to {a b}, then the contents of a
++ # "#foo:" line will have regsub -all applied to replace a with b.
++ global options_regsub
++
++ if [catch { set f [open $file r] } x] {
++ #perror "couldn't open `$file': $x"
++ perror "$x"
++ return -1
++ }
++ set opt_array {}
++ # whitespace expression
++ set ws {[ ]*}
++ set nws {[^ ]*}
++ # whitespace is ignored anywhere except within the options list;
++ # option names are alphabetic plus underscore only.
++ set pat "^#${ws}(\[a-zA-Z_\]*)$ws:${ws}(.*)$ws\$"
++ while { [gets $f line] != -1 } {
++ set line [string trim $line]
++ # Whitespace here is space-tab.
++ if [regexp $pat $line xxx opt_name opt_val] {
++ # match!
++ if [info exists options_regsub($opt_name)] {
++ set subst $options_regsub($opt_name)
++ regsub -all -- [lindex $subst 0] $opt_val [lindex $subst 1] \
++ opt_val
++ }
++ lappend opt_array [list $opt_name $opt_val]
++ } else {
++ break
++ }
++ }
++ close $f
++ return $opt_array
++}
++
++proc file_contents { filename } {
++ set file [open $filename r]
++ set contents [read $file]
++ close $file
++ return $contents
++}
++
++proc set_file_contents { filename contents } {
++ set file [open $filename w]
++ puts $file "$contents"
++ close $file
++}
++
+ # Create an archive using ar
+ #
+ proc ar_simple_create { ar aropts target objects } {
+--
+2.26.2
+
diff --git a/9999/0007-Gentoo-Pass-no-warn-shared-textrel-to-ld-in-its-test.patch b/9999/0007-Gentoo-Pass-no-warn-shared-textrel-to-ld-in-its-test.patch
new file mode 100644
index 0000000..74f96cf
--- /dev/null
+++ b/9999/0007-Gentoo-Pass-no-warn-shared-textrel-to-ld-in-its-test.patch
@@ -0,0 +1,47 @@
+From 221b8f6dfdfcb5e9d04069fdc2fb1aa6a881cb60 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 3 Jun 2018 21:40:36 +0200
+Subject: [PATCH 07/16] Gentoo: Pass --no-warn-shared-textrel to ld in its
+ testsuite
+
+---
+ ld/testsuite/lib/ld-lib.exp | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
+index 853a4d87e6..ec123e2fc1 100644
+--- a/ld/testsuite/lib/ld-lib.exp
++++ b/ld/testsuite/lib/ld-lib.exp
+@@ -165,7 +165,7 @@ proc default_ld_relocate { ld target objects } {
+ global HOSTING_EMU
+
+ remote_file host delete $target
+- return [run_host_cmd_yesno "$ld" "$HOSTING_EMU --hash-style=sysv -o $target -r $objects"]
++ return [run_host_cmd_yesno "$ld" "$HOSTING_EMU --hash-style=sysv --no-warn-shared-textrel -o $target -r $objects"]
+ }
+
+ # Check to see if ld is being invoked with a non-endian output format
+@@ -203,9 +203,9 @@ proc default_ld_link { ld target objects } {
+ # - .*ld/ld-new -> we're working with the new linker
+ # - otherwise -> we're likely working with the system compiler
+ if {[regexp {ld/ld-new$} $ld]} {
+- set gentoosysv "--hash-style=sysv"
++ set gentoosysv "--hash-style=sysv --no-warn-shared-textrel"
+ } else {
+- set gentoosysv "-Wl,--hash-style=sysv"
++ set gentoosysv "-Wl,--hash-style=sysv -Wl,--no-warn-shared-textrel"
+ }
+
+ remote_file host delete $target
+@@ -972,7 +972,7 @@ proc run_dump_test { name {extra_options {}} } {
+
+ # Add -L$srcdir/$subdir so that the linker command can use
+ # linker scripts in the source directory.
+- set cmd "$LD --hash-style=sysv $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
++ set cmd "$LD --hash-style=sysv --no-warn-shared-textrel $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
+ $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
+
+ # If needed then check for, or add a -Map option.
+--
+2.26.2
+
diff --git a/9999/0008-Gentoo-Restore-TEXTREL-warnings-for-non-shared-objec.patch b/9999/0008-Gentoo-Restore-TEXTREL-warnings-for-non-shared-objec.patch
new file mode 100644
index 0000000..e54ccd1
--- /dev/null
+++ b/9999/0008-Gentoo-Restore-TEXTREL-warnings-for-non-shared-objec.patch
@@ -0,0 +1,34 @@
+From 3439646abc93066af8cc651940f30fd0f9b99760 Mon Sep 17 00:00:00 2001
+From: Sergei Trofimovich <slyfox@gentoo.org>
+Date: Thu, 1 Mar 2018 12:35:03 +0100
+Subject: [PATCH 08/16] Gentoo: Restore TEXTREL warnings for non-shared objects
+
+---
+ bfd/elflink.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/bfd/elflink.c b/bfd/elflink.c
+index 90ada7a1cc..b4636885aa 100644
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -12934,7 +12934,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
+ goto error_return;
+
+ /* Check for DT_TEXTREL (late, in case the backend removes it). */
+- if (((info->warn_shared_textrel && bfd_link_pic (info))
++ if ((info->warn_shared_textrel
+ || info->error_textrel)
+ && (o = bfd_get_linker_section (dynobj, ".dynamic")) != NULL)
+ {
+@@ -12955,7 +12955,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
+ (_("%P%X: read-only segment has dynamic relocations\n"));
+ else
+ info->callbacks->einfo
+- (_("%P: warning: creating a DT_TEXTREL in a shared object\n"));
++ (_("%P: warning: creating a DT_TEXTREL in object\n"));
+ break;
+ }
+ }
+--
+2.26.2
+
diff --git a/9999/0009-Gentoo-Fix-test-for-precise-textrel-warning-message-.patch b/9999/0009-Gentoo-Fix-test-for-precise-textrel-warning-message-.patch
new file mode 100644
index 0000000..e87a82d
--- /dev/null
+++ b/9999/0009-Gentoo-Fix-test-for-precise-textrel-warning-message-.patch
@@ -0,0 +1,24 @@
+From 61cc50292e7cc3f8871946f0720ff039ddf7a2be Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 3 Jun 2018 22:36:40 +0200
+Subject: [PATCH 09/16] Gentoo: Fix test for precise textrel warning message,
+ after non-shared object change
+
+(Broken by "Gentoo: Restore TEXTREL warnings for non-shared objects")
+---
+ ld/testsuite/ld-i386/warn1.d | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ld/testsuite/ld-i386/warn1.d b/ld/testsuite/ld-i386/warn1.d
+index 3c78f31efd..3319308d33 100644
+--- a/ld/testsuite/ld-i386/warn1.d
++++ b/ld/testsuite/ld-i386/warn1.d
+@@ -1,4 +1,4 @@
+ #name: --warn-shared-textrel --fatal-warnings
+ #as: --32
+ #ld: -shared -melf_i386 --warn-shared-textrel --fatal-warnings
+-#error: .*warning: creating a DT_TEXTREL in a shared object
++#error: .*warning: creating a DT_TEXTREL in object.
+--
+2.26.2
+
diff --git a/9999/0010-Gentoo-Fix-textrel-warning-format-test.patch b/9999/0010-Gentoo-Fix-textrel-warning-format-test.patch
new file mode 100644
index 0000000..f29ae7f
--- /dev/null
+++ b/9999/0010-Gentoo-Fix-textrel-warning-format-test.patch
@@ -0,0 +1,22 @@
+From fab9a66210e065ff5a14d4bc70841406cdecc62e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Mon, 16 Jul 2018 12:20:37 +0200
+Subject: [PATCH 10/16] Gentoo: Fix textrel warning format test
+
+---
+ ld/testsuite/ld-i386/warn1.d | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ld/testsuite/ld-i386/warn1.d b/ld/testsuite/ld-i386/warn1.d
+index 3319308d33..49bcb5171f 100644
+--- a/ld/testsuite/ld-i386/warn1.d
++++ b/ld/testsuite/ld-i386/warn1.d
+@@ -1,4 +1,4 @@
+ #name: --warn-shared-textrel --fatal-warnings
+ #as: --32
+ #ld: -shared -melf_i386 --warn-shared-textrel --fatal-warnings
+-#error: .*warning: creating a DT_TEXTREL in object.
++#error: .*warning: creating a DT_TEXTREL in object
+--
+2.26.2
+
diff --git a/9999/0011-Gentoo-add-with-extra-soversion-suffix-option.patch b/9999/0011-Gentoo-add-with-extra-soversion-suffix-option.patch
new file mode 100644
index 0000000..cc9f0cc
--- /dev/null
+++ b/9999/0011-Gentoo-add-with-extra-soversion-suffix-option.patch
@@ -0,0 +1,141 @@
+From f1d34965ce140071bb77313bbca01914ace59e27 Mon Sep 17 00:00:00 2001
+From: Sergei Trofimovich <slyfox@gentoo.org>
+Date: Wed, 12 Sep 2018 23:44:29 +0100
+Subject: [PATCH 11/16] Gentoo: add --with-extra-soversion-suffix= option
+
+--with-extra-soversion-suffix= will allow Gentoo to
+distinct libbfd.so and libopcodes.so to have more precise
+SONAME.
+
+Today --enable-targets=all and --enable-64-bit-bfd change
+libbfd.so ABI:
+--enable-targets=all adds new symbols to the library
+--enable-64-bit-bfd modifies BFD_ARCH_SIZE default and
+changes sizes of integer parameters and fields to most
+APIs.
+
+--with-extra-soversion-suffix= will allow Gentoo to inject
+additional keys into SONAME to indicate ABI change and avoid
+hard to diagnose crashes when user reinstalls libbfd.so
+built with different flags (see https://bugs.gentoo.org/663690).
+
+Bug: https://bugs.gentoo.org/666100
+Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
+---
+ bfd/Makefile.am | 5 +++++
+ bfd/Makefile.in | 4 ++++
+ bfd/configure | 13 +++++++++++++
+ bfd/configure.ac | 7 +++++++
+ 4 files changed, 29 insertions(+)
+
+diff --git a/bfd/Makefile.am b/bfd/Makefile.am
+index b6088a3c4a..3f5cf81ca4 100644
+--- a/bfd/Makefile.am
++++ b/bfd/Makefile.am
+@@ -59,6 +59,8 @@ bfdinclude_HEADERS += $(INCDIR)/plugin-api.h
+ LIBDL = @lt_cv_dlopen_libs@
+ endif
+
++EXTRA_SOVERSION_SUFFIX = @EXTRA_SOVERSION_SUFFIX@
++
+ # bfd.h goes here, for now
+ BFD_H = bfd.h
+
+@@ -958,6 +960,9 @@ bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in
+ bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\
+ bfd_soversion="$(VERSION).$${bfd_version_date}" ;\
+ fi ;\
++ if test x"$(EXTRA_SOVERSION_SUFFIX)" != x ; then \
++ bfd_soversion="$${bfd_soversion}.$(EXTRA_SOVERSION_SUFFIX)" ;\
++ fi ;\
+ $(SED) -e "s,@bfd_version@,$$bfd_version," \
+ -e "s,@bfd_version_string@,$$bfd_version_string," \
+ -e "s,@bfd_version_package@,$$bfd_version_package," \
+diff --git a/bfd/Makefile.in b/bfd/Makefile.in
+index dd3474d92b..911232212b 100644
+--- a/bfd/Makefile.in
++++ b/bfd/Makefile.in
+@@ -318,6 +318,7 @@ ECHO_T = @ECHO_T@
+ EGREP = @EGREP@
+ EXEEXT = @EXEEXT@
+ EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@
++EXTRA_SOVERSION_SUFFIX = @EXTRA_SOVERSION_SUFFIX@
+ FGREP = @FGREP@
+ GENCAT = @GENCAT@
+ GMSGFMT = @GMSGFMT@
+@@ -2071,6 +2072,9 @@ bfdver.h: $(srcdir)/version.h $(srcdir)/development.sh $(srcdir)/Makefile.in
+ bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\
+ bfd_soversion="$(VERSION).$${bfd_version_date}" ;\
+ fi ;\
++ if test x"$(EXTRA_SOVERSION_SUFFIX)" != x ; then \
++ bfd_soversion="$${bfd_soversion}.$(EXTRA_SOVERSION_SUFFIX)" ;\
++ fi ;\
+ $(SED) -e "s,@bfd_version@,$$bfd_version," \
+ -e "s,@bfd_version_string@,$$bfd_version_string," \
+ -e "s,@bfd_version_package@,$$bfd_version_package," \
+diff --git a/bfd/configure b/bfd/configure
+index 59b867bbbf..fa34069f2a 100755
+--- a/bfd/configure
++++ b/bfd/configure
+@@ -696,6 +696,7 @@ WARN_CFLAGS
+ REPORT_BUGS_TEXI
+ REPORT_BUGS_TO
+ PKGVERSION
++EXTRA_SOVERSION_SUFFIX
+ DEBUGDIR
+ PLUGINS_FALSE
+ PLUGINS_TRUE
+@@ -833,6 +834,7 @@ enable_secureplt
+ enable_separate_code
+ enable_leading_mingw64_underscores
+ with_separate_debug_dir
++with_extra_soversion_suffix
+ with_pkgversion
+ with_bugurl
+ enable_werror
+@@ -1508,6 +1510,8 @@ Optional Packages:
+ --with-separate-debug-dir=DIR
+ Look for global separate debug info in DIR
+ [[default=LIBDIR/debug]]
++ --with-extra-soversion-suffix=SUFFIX
++ Append '.SUFFIX' to SONAME [default=]
+ --with-pkgversion=PKG Use PKG in the version string in place of "GNU
+ Binutils"
+ --with-bugurl=URL Direct users to URL to report a bug
+@@ -12516,6 +12520,15 @@ fi
+
+
+
++EXTRA_SOVERSION_SUFFIX=
++
++# Check whether --with-extra-soversion-suffix was given.
++if test "${with_extra_soversion_suffix+set}" = set; then :
++ withval=$with_extra_soversion_suffix; EXTRA_SOVERSION_SUFFIX="${withval}"
++fi
++
++
++
+
+
+ # Check whether --with-pkgversion was given.
+diff --git a/bfd/configure.ac b/bfd/configure.ac
+index 0528e54c3b..50b2b4e06e 100644
+--- a/bfd/configure.ac
++++ b/bfd/configure.ac
+@@ -133,6 +133,13 @@ AC_ARG_WITH(separate-debug-dir,
+ [DEBUGDIR="${withval}"])
+ AC_SUBST(DEBUGDIR)
+
++EXTRA_SOVERSION_SUFFIX=
++AC_ARG_WITH(extra-soversion-suffix,
++ AS_HELP_STRING([--with-extra-soversion-suffix=SUFFIX],
++ [Append '.SUFFIX' to SONAME [[default=]]]),
++[EXTRA_SOVERSION_SUFFIX="${withval}"])
++AC_SUBST(EXTRA_SOVERSION_SUFFIX)
++
+ ACX_PKGVERSION([GNU Binutils])
+ ACX_BUGURL([http://www.sourceware.org/bugzilla/])
+
+--
+2.26.2
+
diff --git a/9999/0012-no-patch-Gentoo-Add-patch-tarball-generation-script.patch b/9999/0012-no-patch-Gentoo-Add-patch-tarball-generation-script.patch
new file mode 100644
index 0000000..a60bb9c
--- /dev/null
+++ b/9999/0012-no-patch-Gentoo-Add-patch-tarball-generation-script.patch
@@ -0,0 +1,217 @@
+From 7343f154ae6bc08bd2c3c051f039824af3d917e5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Wed, 11 Oct 2017 21:56:53 +0200
+Subject: [PATCH 12/16] [no patch] Gentoo: Add patch tarball generation script
+
+(cherry picked from commit 90427abb2aac0cc4ebcb73397cc3ad574c6fec5d)
+---
+ scripts/gentoo/0000-Gentoo-Git-is-development | 12 ++
+ scripts/gentoo/9999-Gentoo-We-make-a-release | 12 ++
+ scripts/gentoo/README.Gentoo.patches | 31 +++++
+ scripts/gentoo/make-tarball.sh | 118 ++++++++++++++++++
+ 4 files changed, 173 insertions(+)
+ create mode 100644 scripts/gentoo/0000-Gentoo-Git-is-development
+ create mode 100644 scripts/gentoo/9999-Gentoo-We-make-a-release
+ create mode 100644 scripts/gentoo/README.Gentoo.patches
+ create mode 100755 scripts/gentoo/make-tarball.sh
+
+diff --git a/scripts/gentoo/0000-Gentoo-Git-is-development b/scripts/gentoo/0000-Gentoo-Git-is-development
+new file mode 100644
+index 0000000000..2b9482d033
+--- /dev/null
++++ b/scripts/gentoo/0000-Gentoo-Git-is-development
+@@ -0,0 +1,12 @@
++Gentoo: Git is development
++
++--- a/bfd/development.sh
+++++ b/bfd/development.sh
++@@ -16,5 +16,5 @@
++ # along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++ # Controls whether to enable development-mode features by default.
++-development=false
+++development=true
++
++
+diff --git a/scripts/gentoo/9999-Gentoo-We-make-a-release b/scripts/gentoo/9999-Gentoo-We-make-a-release
+new file mode 100644
+index 0000000000..fea66d97b4
+--- /dev/null
++++ b/scripts/gentoo/9999-Gentoo-We-make-a-release
+@@ -0,0 +1,12 @@
++Gentoo: We make a release, so switch development flag off
++
++--- a/bfd/development.sh
+++++ b/bfd/development.sh
++@@ -16,5 +16,5 @@
++ # along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++ # Controls whether to enable development-mode features by default.
++-development=true
+++development=false
++
++
+diff --git a/scripts/gentoo/README.Gentoo.patches b/scripts/gentoo/README.Gentoo.patches
+new file mode 100644
+index 0000000000..504dc67127
+--- /dev/null
++++ b/scripts/gentoo/README.Gentoo.patches
+@@ -0,0 +1,31 @@
++ ============
++ === What ===
++ ============
++
++Gentoo patchsets for binutils are maintained as vendor branches of the upstream
++binutils-glb git repository. From there, we bundle all the commits into a tarball
++and distribute it via our public mirroring system.
++
++If you want specific info about a patch (like what it does or whose great idea
++it was to change the code), read the patch! We try to fill out the commit
++messages with useful info such as what it does, why it's needed, bug reports,
++original creators, etc...
++
++ =============
++ === Where ===
++ =============
++
++Currently, https://github.com/gentoo/binutils-gdb
++
++ ===========
++ === How ===
++ ===========
++
++The patch naming convention is precisely as generated by "git format-patch".
++
++All patches should apply with -p1 (so they can be used both with the legacy
++epatch function and the new, more strict eapply function).
++
++Commits where the commit message starts with "[no patch]" will not be included
++in the patch tarball. This is useful for changes to the tarball generation
++script, or for the addition of extra files that are not patches.
+diff --git a/scripts/gentoo/make-tarball.sh b/scripts/gentoo/make-tarball.sh
+new file mode 100755
+index 0000000000..575f48bf6a
+--- /dev/null
++++ b/scripts/gentoo/make-tarball.sh
+@@ -0,0 +1,118 @@
++#!/bin/bash
++
++PN="binutils"
++PV=$1
++pver=$2
++
++if [[ -z ${PV} ]] ; then
++ echo "Usage: $0 binutils-version patchset-version-to-be-created"
++ echo "Please read the script before trying to use it :)"
++ exit 1
++fi
++
++# check that we're in the root of a binutils-gdb git repo
++
++if [[ ! -f COPYING.LIBGLOSS ]] || [[ ! -d .git ]] ; then
++ echo "Error: You need to call this script in the main directory of a Gentoo binutils-gdb git clone"
++ exit 1
++fi
++
++# check that we're on a branch gentoo/${PV}
++
++mybranchinfo=$(git status --porcelain -b|grep '^##')
++mybranch=$(echo ${mybranchinfo}|sed -e 's:^## ::' -e 's:\.\.\..*$::')
++if [[ ! "gentoo/binutils-${PV}" == "${mybranch}" ]] ; then
++ echo "Error: Your git repository is on the incorrect branch ${mybranch}; should be gentoo/binutils-${PV}"
++ exit 1
++fi
++
++# check that the working directory is clean
++
++mystatusinfo=$(git status --porcelain)
++if [[ ! -z "${mystatusinfo}" ]] ; then
++ echo "Error: Your working directory is not clean"
++ exit 1
++fi
++
++# check if the tag already exists
++
++mytaginfo=$(git tag -l|grep "gentoo/binutils-${PV}-${pver}")
++if [[ ! -z "${mytaginfo}" ]] ; then
++ echo "Error: A tag corresponding to this patch level already exists (gentoo/binutils-${PV}-${pver})"
++ exit 1
++fi
++
++# luckily binutils git has no /tmp dir and no tar.xz files, but let's better check and be pathologically careful
++
++if [[ -e tmp ]] || [[ -e ${PN}-${PV}-patches-${pver}.tar.xz ]] ; then
++ echo "Error: tmp or ${PN}-${PV}-patches-${pver}.tar.xz exists in git"
++ exit 1
++fi
++rm -rf tmp
++rm -f ${PN}-${PV}-*.tar.bz2
++
++for myname in 0*.patch ; do
++ if [[ -e "${myname}" ]]; then
++ echo "Error: ${myname} exists in git"
++ exit 1
++ fi
++done
++rm -f 0*.patch
++
++# check if we have to override the upstream tag
++
++mytaginfo=$(git tag -l|grep "gentoo/binutils-${PV}-upstream")
++if [[ ! -z "${mytaginfo}" ]] ; then
++ starttag="gentoo/binutils-${PV}-upstream"
++else
++ starttag="binutils-${PV//./_}"
++fi
++if [[ "${PV}" == "9999" ]]; then
++ starttag="master"
++fi
++echo "Starting from tag ${starttag}"
++
++mkdir -p tmp/patch
++
++# copy README.Gentoo.patches
++
++cp scripts/gentoo/README.Gentoo.patches tmp/ || exit 1
++
++# create and rename patches
++
++git format-patch ${starttag}..HEAD > /dev/null || exit 1
++
++# remove all patches where the summary line starts with:
++# - [no-tarball]: not related to upstream tarball
++# - [no-patch]: not related to upstream patches
++# - "Automatic date update in version.in": daily bumps
++rm -f 0???-no-tarball-*.patch
++rm -f 0???-no-patch-*.patch
++rm -f 0???-Automatic-date-update-in-version.in.patch
++
++for myname in 0*.patch ; do
++ mv ${myname} tmp/patch/ || exit 1
++done
++
++# add the extra patch if needed
++
++if [[ "${PV}" != "9999" ]]; then
++ cp scripts/gentoo/0000-Gentoo-Git-is-development tmp/patch/0000-Gentoo-Git-is-development.patch || exit 1
++ cp scripts/gentoo/9999-Gentoo-We-make-a-release tmp/patch/9999-Gentoo-We-make-a-release.patch || exit 1
++fi
++
++# add a history file
++
++git log --stat --decorate ${starttag}..HEAD > tmp/patch/README.history || exit 1
++
++# package everything up
++
++tar -Jcf ${PN}-${PV}-patches-${pver}.tar.xz \
++ -C tmp patch README.Gentoo.patches || exit 1
++rm -r tmp
++
++du -b *.tar.xz
++
++# tag the commit
++
++git tag -s -m "Gentoo patchset binutils-${PV}-${pver}" "gentoo/binutils-${PV}-${pver}"
+--
+2.26.2
+
diff --git a/9999/0013-Gentoo-ld-enable-new-dtags-by-default-for-linux-gnu-.patch b/9999/0013-Gentoo-ld-enable-new-dtags-by-default-for-linux-gnu-.patch
new file mode 100644
index 0000000..713a0a9
--- /dev/null
+++ b/9999/0013-Gentoo-ld-enable-new-dtags-by-default-for-linux-gnu-.patch
@@ -0,0 +1,49 @@
+From 14ba11502cbc93e938e0b43e9648aedb7462ddeb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 13 Oct 2019 05:25:28 +0200
+Subject: [PATCH 13/16] Gentoo: ld: enable new dtags by default for linux/gnu
+ targets
+
+Original author: Mike Frysinger <vapier@gentoo.org>
+
+The "new" dtags options have been around for 14+ years now, so for Linux
+and GNU targets, enable them by default.
+
+2012-01-21 Mike Frysinger <vapier@gentoo.org>
+
+ * emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Set
+ link_info.new_dtags to TRUE for linux/gnu targets.
+ * NEWS: Mention new dtags default.
+
+2013-01-22 Roland McGrath <mcgrathr@google.com>
+
+ * emultempl/elf32.em (gld${EMULATION_NAME}_before_parse): Set
+ new_dtags to TRUE for *-*-nacl* targets.
+---
+ ld/emultempl/elf.em | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em
+index eac2ce2f4c..7f92134070 100644
+--- a/ld/emultempl/elf.em
++++ b/ld/emultempl/elf.em
+@@ -81,6 +81,16 @@ gld${EMULATION_NAME}_before_parse (void)
+ input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
+ config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
+ config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
++EOF
++
++case ${target} in
++ *-*-linux-* | *-*-k*bsd*-* | *-*-gnu* | *-*-nacl*)
++ fragment <<EOF
++ link_info.new_dtags = TRUE;
++EOF
++ ;;
++esac
++fragment <<EOF
+ link_info.check_relocs_after_open_input = TRUE;
+ link_info.relro = DEFAULT_LD_Z_RELRO;
+ link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
+--
+2.26.2
+
diff --git a/9999/0014-Gentoo-Remove-block-mistakenly-duplicated-in-1222895.patch b/9999/0014-Gentoo-Remove-block-mistakenly-duplicated-in-1222895.patch
new file mode 100644
index 0000000..20dbdd1
--- /dev/null
+++ b/9999/0014-Gentoo-Remove-block-mistakenly-duplicated-in-1222895.patch
@@ -0,0 +1,777 @@
+From e54cd834e32160ac588add78a2990648328c2f06 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 10 May 2020 20:13:43 +0300
+Subject: [PATCH 14/16] Gentoo: Remove block mistakenly duplicated in
+ 1222895ec55f34a97fb2cbcd80d421e24308f618
+
+---
+ ld/testsuite/lib/ld-lib.exp | 753 ------------------------------------
+ 1 file changed, 753 deletions(-)
+
+diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
+index ec123e2fc1..ae72f21d72 100644
+--- a/ld/testsuite/lib/ld-lib.exp
++++ b/ld/testsuite/lib/ld-lib.exp
+@@ -421,759 +421,6 @@ proc ld_link_defsyms {} {
+ return $flags
+ }
+
+-# run_dump_test FILE (optional:) EXTRA_OPTIONS
+-# Copied from gas testsuite, tweaked and further extended.
+-#
+-# Assemble a .s file, then run some utility on it and check the output.
+-#
+-# There should be an assembly language file named FILE.s in the test
+-# suite directory, and a pattern file called FILE.d. `run_dump_test'
+-# will assemble FILE.s, run some tool like `objdump', `objcopy', or
+-# `nm' on the .o file to produce textual output, and then analyze that
+-# with regexps. The FILE.d file specifies what program to run, and
+-# what to expect in its output.
+-#
+-# The FILE.d file begins with zero or more option lines, which specify
+-# flags to pass to the assembler, the program to run to dump the
+-# assembler's output, and the options it wants. The option lines have
+-# the syntax:
+-#
+-# # OPTION: VALUE
+-#
+-# OPTION is the name of some option, like "name" or "objdump", and
+-# VALUE is OPTION's value. The valid options are described below.
+-# Whitespace is ignored everywhere, except within VALUE. The option
+-# list ends with the first line that doesn't match the above syntax
+-# (hmm, not great for error detection).
+-#
+-# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
+-# two-element lists. The first element of each is an option name, and
+-# the second additional arguments to be added on to the end of the
+-# option list as given in FILE.d. (If omitted, no additional options
+-# are added.)
+-#
+-# The interesting options are:
+-#
+-# name: TEST-NAME
+-# The name of this test, passed to DejaGNU's `pass' and `fail'
+-# commands. If omitted, this defaults to FILE, the root of the
+-# .s and .d files' names.
+-#
+-# as: FLAGS
+-# When assembling, pass FLAGS to the assembler.
+-# If assembling several files, you can pass different assembler
+-# options in the "source" directives. See below.
+-#
+-# ld: FLAGS
+-# Link assembled files using FLAGS, in the order of the "source"
+-# directives, when using multiple files.
+-#
+-# ld_after_inputfiles: FLAGS
+-# Similar to "ld", but put after all input files.
+-#
+-# objcopy_objects: FLAGS
+-# Run objcopy with the specified flags after assembling any source
+-# that has the special marker RUN_OBJCOPY in the source specific
+-# flags.
+-#
+-# objcopy_linked_file: FLAGS
+-# Run objcopy on the linked file with the specified flags.
+-# This lets you transform the linked file using objcopy, before the
+-# result is analyzed by an analyzer program specified below (which
+-# may in turn *also* be objcopy).
+-#
+-# PROG: PROGRAM-NAME
+-# The name of the program to run to analyze the .o file produced
+-# by the assembler or the linker output. This can be omitted;
+-# run_dump_test will guess which program to run by seeing which of
+-# the flags options below is present.
+-#
+-# readelf: FLAGS
+-# objdump: FLAGS
+-# nm: FLAGS
+-# objcopy: FLAGS
+-# Use the specified program to analyze the assembler or linker
+-# output file, and pass it FLAGS, in addition to the output name.
+-# Note that they are run with LC_ALL=C in the environment to give
+-# consistent sorting of symbols.
+-#
+-# source: SOURCE [FLAGS]
+-# Assemble the file SOURCE.s using the flags in the "as" directive
+-# and the (optional) FLAGS. If omitted, the source defaults to
+-# FILE.s.
+-# This is useful if several .d files want to share a .s file.
+-# More than one "source" directive can be given, which is useful
+-# when testing linking.
+-#
+-# dump: DUMP
+-# Match against DUMP.d. If omitted, this defaults to FILE.d. This
+-# is useful if several .d files differ by options only. Options are
+-# always read from FILE.d.
+-#
+-# xfail: TARGET
+-# The test is expected to fail on TARGET. This may occur more than
+-# once.
+-#
+-# target: TARGET
+-# Only run the test for TARGET.
+-# You may provide target name "cfi" for any target supporting the
+-# CFI statements. You may provide target name "shared" for any
+-# target supporting shared libraries. Otherwise TARGET is called
+-# as a TCL procedure if surrounded by square brackets, or passed
+-# to "istarget" if not.
+-# This may occur more than once; the target being tested must match
+-# at least one. Otherwise the test will be marked unsupported.
+-#
+-# alltargets: TARGET
+-# Only run the test for TARGET.
+-# The syntax for TARGET is as with 'target'.
+-# This may occur more than once; the target being tested must match
+-# all of them. Otherwise the test will be marked unsupported.
+-#
+-# notarget: TARGET
+-# Do not run the test for TARGET.
+-# The syntax for TARGET is as with 'target'.
+-# This may occur more than once; the target being tested must not
+-# match any of them. Otherwise the test will be marked unsupported.
+-#
+-# skip: TARGET
+-# anyskip: TARGET
+-# noskip: TARGET
+-# These are exactly the same as "notarget", "alltargets" and
+-# "target" respectively, except that they do nothing at all if the
+-# check fails. They should only be used in groups, to construct a
+-# single test which is run on all targets but with variant options
+-# or expected output on some targets. (For example, see
+-# gas/arm/inst.d and gas/arm/wince_inst.d.)
+-#
+-# error: REGEX
+-# An error with message matching REGEX must be emitted for the test
+-# to pass. The PROG, readelf, objdump, nm and objcopy options have
+-# no meaning and need not be supplied if this is present. Multiple
+-# "error" directives append to the expected linker error message.
+-#
+-# error_output: FILE
+-# Means the same as 'error', except the regular expression lines
+-# are contains in FILE.
+-#
+-# warning: REGEX
+-# Expect a linker warning matching REGEX. It is an error to issue
+-# both "error" and "warning". Multiple "warning" directives
+-# append to the expected linker warning message.
+-#
+-# warning_output: FILE
+-# Means the same as 'warning', except the regular expression
+-# lines are contains in FILE.
+-#
+-# map: FILE
+-# Adding this option will cause the linker to generate a linker
+-# map file, using the -Map=MAPFILE command line option. If
+-# there is no -Map=MAPFILE in the 'ld: FLAGS' then one will be
+-# added to the linker command line. The contents of the
+-# generated MAPFILE are then compared against the regexp lines
+-# in FILE using `regexp_diff' (see below for details).
+-#
+-# Each option may occur at most once unless otherwise mentioned.
+-#
+-# After the option lines come regexp lines. `run_dump_test' calls
+-# `regexp_diff' to compare the output of the dumping tool against the
+-# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp;
+-# see further comments there.
+-#
+-proc run_dump_test { name {extra_options {}} } {
+- global subdir srcdir
+- global OBJDUMP NM AS OBJCOPY READELF LD
+- global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS LDFLAGS
+- global host_triplet runtests
+- global env verbose
+- global ld_elf_shared_opt
+-
+- if { [is_elf_format] && [check_shared_lib_support] } {
+- set ld_extra_opt "$ld_elf_shared_opt"
+- } else {
+- set ld_extra_opt ""
+- }
+-
+- if [string match "*/*" $name] {
+- set file $name
+- set name [file tail $name]
+- } else {
+- set file "$srcdir/$subdir/$name"
+- }
+-
+- if ![runtest_file_p $runtests $name] then {
+- return
+- }
+-
+- set opt_array [slurp_options "${file}.d"]
+- if { $opt_array == -1 } {
+- perror "error reading options from $file.d"
+- unresolved $subdir/$name
+- return
+- }
+- set dumpfile tmpdir/dump.out
+- set run_ld 0
+- set run_objcopy 0
+- set objfile_names {}
+- set opts(as) {}
+- set opts(ld) {}
+- set opts(ld_after_inputfiles) {}
+- set opts(xfail) {}
+- set opts(target) {}
+- set opts(alltargets) {}
+- set opts(notarget) {}
+- set opts(skip) {}
+- set opts(anyskip) {}
+- set opts(noskip) {}
+- set opts(objdump) {}
+- set opts(nm) {}
+- set opts(objcopy) {}
+- set opts(readelf) {}
+- set opts(name) {}
+- set opts(PROG) {}
+- set opts(source) {}
+- set opts(dump) {}
+- set opts(error) {}
+- set opts(warning) {}
+- set opts(error_output) {}
+- set opts(warning_output) {}
+- set opts(objcopy_linked_file) {}
+- set opts(objcopy_objects) {}
+- set opts(map) {}
+-
+- foreach i $opt_array {
+- set opt_name [lindex $i 0]
+- set opt_val [lindex $i 1]
+- if ![info exists opts($opt_name)] {
+- perror "unknown option $opt_name in file $file.d"
+- unresolved $subdir/$name
+- return
+- }
+-
+- switch -- $opt_name {
+- xfail {}
+- target {}
+- alltargets {}
+- notarget {}
+- skip {}
+- anyskip {}
+- noskip {}
+- warning {}
+- error {}
+- source {
+- # Move any source-specific as-flags to a separate list to
+- # simplify processing.
+- if { [llength $opt_val] > 1 } {
+- lappend asflags [lrange $opt_val 1 end]
+- set opt_val [lindex $opt_val 0]
+- } else {
+- lappend asflags {}
+- }
+-
+- # Create the object file name based on nothing but the source
+- # file name.
+- set new_objfile \
+- [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]].o]
+- # But, sometimes, we have the exact same source filename in
+- # different directories (foo/src.s bar/src.s) which would lead
+- # us to try and create two src.o files. We detect this
+- # conflict here, and instead create src.o and src1.o.
+- set j 0
+- while { [lsearch $objfile_names $new_objfile] != -1 } {
+- incr j
+- set new_objfile \
+- [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]]${j}.o]
+- }
+- lappend objfile_names $new_objfile
+- }
+- default {
+- if [string length $opts($opt_name)] {
+- perror "option $opt_name multiply set in $file.d"
+- unresolved $subdir/$name
+- return
+- }
+-
+- # A single "# ld:" with no options should do the right thing.
+- if { $opt_name == "ld" } {
+- set run_ld 1
+- }
+- # Likewise objcopy_linked_file.
+- if { $opt_name == "objcopy_linked_file" } {
+- set run_objcopy 1
+- }
+- }
+- }
+- if { $opt_name == "as" || $opt_name == "ld" } {
+- set opt_val [subst $opt_val]
+- }
+-
+- # Append differently whether it's a message (without space) or
+- # an option or list (with space).
+- switch -- $opt_name {
+- warning -
+- error {
+- append opts($opt_name) $opt_val
+- }
+- default {
+- set opts($opt_name) [concat $opts($opt_name) $opt_val]
+- }
+- }
+- }
+-
+- foreach i $extra_options {
+- set opt_name [lindex $i 0]
+- set opt_val [lindex $i 1]
+- if ![info exists opts($opt_name)] {
+- perror "unknown option $opt_name given in extra_opts"
+- unresolved $subdir/$name
+- return
+- }
+- # Add extra option to end of existing option, adding space
+- # if necessary.
+- if { ![regexp "warning|error" $opt_name]
+- && [string length $opts($opt_name)] } {
+- append opts($opt_name) " "
+- }
+- append opts($opt_name) $opt_val
+- }
+-
+- foreach opt { as ld } {
+- regsub {\[big_or_little_endian\]} $opts($opt) \
+- [big_or_little_endian] opts($opt)
+- }
+-
+- if { $opts(name) == "" } {
+- set testname "$subdir/$name"
+- } else {
+- set testname $opts(name)
+- }
+-
+- # Decide early whether we should run the test for this target.
+- if { [llength $opts(noskip)] > 0 } {
+- set targmatch 0
+- foreach targ $opts(noskip) {
+- if [match_target $targ] {
+- set targmatch 1
+- break
+- }
+- }
+- if { $targmatch == 0 } {
+- return
+- }
+- }
+- foreach targ $opts(anyskip) {
+- if ![match_target $targ] {
+- return
+- }
+- }
+- foreach targ $opts(skip) {
+- if [match_target $targ] {
+- return
+- }
+- }
+- if { [llength $opts(target)] > 0 } {
+- set targmatch 0
+- foreach targ $opts(target) {
+- if [match_target $targ] {
+- set targmatch 1
+- break
+- }
+- }
+- if { $targmatch == 0 } {
+- unsupported $testname
+- return
+- }
+- }
+- foreach targ $opts(alltargets) {
+- if ![match_target $targ] {
+- unsupported $testname
+- return
+- }
+- }
+- foreach targ $opts(notarget) {
+- if [match_target $targ] {
+- unsupported $testname
+- return
+- }
+- }
+-
+- set program ""
+- # It's meaningless to require an output-testing method when we
+- # expect an error.
+- if { $opts(error) == "" && $opts(error_output) == "" } {
+- if {$opts(PROG) != ""} {
+- switch -- $opts(PROG) {
+- objdump { set program objdump }
+- nm { set program nm }
+- objcopy { set program objcopy }
+- readelf { set program readelf }
+- default
+- { perror "unrecognized program option $opts(PROG) in $file.d"
+- unresolved $testname
+- return }
+- }
+- } else {
+- # Guess which program to run, by seeing which option was specified.
+- foreach p {objdump objcopy nm readelf} {
+- if {$opts($p) != ""} {
+- if {$program != ""} {
+- perror "ambiguous dump program in $file.d"
+- unresolved $testname
+- return
+- } else {
+- set program $p
+- }
+- }
+- }
+- }
+- if { $program == "" \
+- && $opts(map) == "" \
+- && $opts(warning) == "" \
+- && $opts(warning_output) == "" \
+- && $opts(error) == "" \
+- && $opts(error_output) == "" } {
+- perror "dump program unspecified in $file.d"
+- unresolved $testname
+- return
+- }
+- }
+-
+- if { $opts(source) == "" } {
+- set sourcefiles [list ${file}.s]
+- set asflags [list ""]
+- set objfile_names [list tmpdir/[file tail ${file}].o]
+- } else {
+- set sourcefiles {}
+- foreach sf $opts(source) {
+- if { [string match "/*" $sf] } {
+- lappend sourcefiles "$sf"
+- } else {
+- lappend sourcefiles "$srcdir/$subdir/$sf"
+- }
+- }
+- }
+-
+- if { $opts(dump) == "" } {
+- set dfile ${file}.d
+- } else {
+- set dfile $srcdir/$subdir/$opts(dump)
+- }
+-
+- # Time to setup xfailures.
+- foreach targ $opts(xfail) {
+- setup_xfail $targ
+- }
+-
+- # Assemble each file.
+- set objfiles {}
+- for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
+- set sourcefile [lindex $sourcefiles $i]
+- set sourceasflags [lindex $asflags $i]
+- set run_objcopy_objects 0
+-
+- if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
+- set run_objcopy_objects 1
+- }
+- regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
+-
+- set objfile [lindex $objfile_names $i]
+- catch "exec rm -f $objfile" exec_output
+- lappend objfiles $objfile
+- set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
+-
+- send_log "$cmd\n"
+- set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
+- remote_upload host "ld.tmp"
+- set comp_output [prune_warnings [file_contents "ld.tmp"]]
+- remote_file host delete "ld.tmp"
+- remote_file build delete "ld.tmp"
+-
+- if { [lindex $cmdret 0] != 0 || ![string match "" $comp_output] } then {
+- send_log -- "$comp_output\n"
+- verbose "$comp_output" 3
+-
+- set exitstat "succeeded"
+- if { $cmdret != 0 } { set exitstat "failed" }
+- verbose -log "$exitstat with: <$comp_output>"
+- fail $testname
+- return
+- }
+-
+- if { $run_objcopy_objects } {
+- set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
+-
+- send_log "$cmd\n"
+- set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
+- "" "/dev/null" "objcopy.tmp"]
+- remote_upload host "objcopy.tmp"
+- set comp_output [prune_warnings [file_contents "objcopy.tmp"]]
+- remote_file host delete "objcopy.tmp"
+- remote_file build delete "objcopy.tmp"
+-
+- if { [lindex $cmdret 0] != 0 \
+- || ![string match "" $comp_output] } {
+- send_log -- "$comp_output\n"
+- verbose "$comp_output" 3
+-
+- set exitstat "succeeded"
+- if { $cmdret != 0 } { set exitstat "failed" }
+- verbose -log "$exitstat with: <$comp_output>"
+- fail $testname
+- return
+- }
+- }
+- }
+-
+- if { (($opts(warning) != "") && ($opts(error) != "")) \
+- || (($opts(warning) != "") && ($opts(error_output) != "")) \
+- || (($opts(warning) != "") && ($opts(warning_output) != "")) \
+- || (($opts(error) != "") && ($opts(warning_output) != "")) \
+- || (($opts(error) != "") && ($opts(error_output) != "")) \
+- || (($opts(warning_output) != "") && ($opts(error_output) != "")) } {
+- perror "$testname: bad mix of warning, error, warning_output, and error_output test-directives"
+- unresolved $testname
+- return
+- }
+-
+- set check_ld(source) ""
+- set check_ld(terminal) 0
+- if { $opts(error) != "" \
+- || $opts(warning) != "" \
+- || $opts(error_output) != "" \
+- || $opts(warning_output) != "" } {
+-
+- if { $opts(error) != "" || $opts(error_output) != "" } {
+- set check_ld(terminal) 1
+- } else {
+- set check_ld(terminal) 0
+- }
+-
+- if { $opts(error) != "" || $opts(warning) != "" } {
+- set check_ld(source) "regex"
+- if { $opts(error) != "" } {
+- set check_ld(regex) $opts(error)
+- } else {
+- set check_ld(regex) $opts(warning)
+- }
+- } else {
+- set check_ld(source) "file"
+- if { $opts(error_output) != "" } {
+- set check_ld(file) $opts(error_output)
+- } else {
+- set check_ld(file) $opts(warning_output)
+- }
+- }
+- }
+-
+- # Perhaps link the file(s).
+- if { $run_ld } {
+- set objfile "tmpdir/dump"
+- catch "exec rm -f $objfile" exec_output
+-
+- # Add -L$srcdir/$subdir so that the linker command can use
+- # linker scripts in the source directory.
+- set cmd "$LD --hash-style=sysv --no-warn-shared-textrel $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
+- $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
+-
+- # If needed then check for, or add a -Map option.
+- set mapfile ""
+- if { $opts(map) != "" } then {
+- if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
+- # Found existing mapfile option
+- verbose -log "Existing mapfile '$mapfile' found"
+- } else {
+- # No mapfile option.
+- set mapfile "tmpdir/dump.map"
+- verbose -log "Adding mapfile '$mapfile'"
+- set cmd "$cmd -Map=$mapfile"
+- }
+- }
+-
+- send_log "$cmd\n"
+- set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
+- remote_upload host "ld.tmp"
+- set comp_output [file_contents "ld.tmp"]
+- remote_file host delete "ld.tmp"
+- remote_file build delete "ld.tmp"
+- set cmdret [lindex $cmdret 0]
+-
+- if { $cmdret == 0 && $run_objcopy } {
+- set infile $objfile
+- set objfile "tmpdir/dump1"
+- remote_file host delete $objfile
+-
+- # Note that we don't use OBJCOPYFLAGS here; any flags must be
+- # explicitly specified.
+- set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
+-
+- send_log "$cmd\n"
+- set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
+- remote_upload host "ld.tmp"
+- append comp_output [file_contents "ld.tmp"]
+- remote_file host delete "ld.tmp"
+- remote_file build delete "ld.tmp"
+- set cmdret [lindex $cmdret 0]
+- }
+-
+- regsub "\n$" $comp_output "" comp_output
+- if { $cmdret != 0 || $comp_output != "" || $check_ld(source) != "" } then {
+- set exitstat "succeeded"
+- if { $cmdret != 0 } { set exitstat "failed" }
+-
+- if { $check_ld(source) == "regex" } {
+- verbose -log "$exitstat with: <$comp_output>, expected: <$check_ld(regex)>"
+- } elseif { $check_ld(source) == "file" } {
+- verbose -log "$exitstat with: <$comp_output>, expected in file $check_ld(file)"
+- set_file_contents "tmpdir/ld.messages" "$comp_output"
+- } else {
+- verbose -log "$exitstat with: <$comp_output>, no expected output"
+- }
+- send_log -- "$comp_output\n"
+- verbose "$comp_output" 3
+-
+- if { (($check_ld(source) == "") == ($comp_output == "")) \
+- && (($cmdret == 0) == ($check_ld(terminal) == 0)) \
+- && ((($check_ld(source) == "regex") \
+- && ($check_ld(regex) == "") == ($comp_output == "") \
+- && [regexp -- $check_ld(regex) $comp_output]) \
+- || (($check_ld(source) == "file") \
+- && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$check_ld(file)"]))) } {
+- # We have the expected output from ld.
+- if { $check_ld(terminal) || $program == "" } {
+- pass $testname
+- return
+- }
+- } else {
+- fail $testname
+- return
+- }
+- }
+-
+- if { $opts(map) != "" } then {
+- # Check the map file matches.
+- set map_pattern_file $srcdir/$subdir/$opts(map)
+- verbose -log "Compare '$mapfile' against '$map_pattern_file'"
+- if { [regexp_diff $mapfile $map_pattern_file] } then {
+- fail "$testname (map file check)"
+- } else {
+- pass "$testname (map file check)"
+- }
+-
+- if { $program == "" } then {
+- return
+- }
+- }
+- } else {
+- set objfile [lindex $objfiles 0]
+- }
+-
+- # We must not have expected failure if we get here.
+- if { $opts(error) != "" } {
+- fail $testname
+- return
+- }
+-
+- set progopts1 $opts($program)
+- eval set progopts \$[string toupper $program]FLAGS
+- eval set binary \$[string toupper $program]
+-
+- if { ![is_remote host] && [which $binary] == 0 } {
+- untested $testname
+- return
+- }
+-
+- if { $progopts1 == "" } { set $progopts1 "-r" }
+- verbose "running $binary $progopts $progopts1" 3
+-
+- # Objcopy, unlike the other two, won't send its output to stdout,
+- # so we have to run it specially.
+- set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
+- if { $program == "objcopy" } {
+- set cmd "$binary $progopts $progopts1 $objfile $dumpfile"
+- }
+-
+- # Ensure consistent sorting of symbols
+- if {[info exists env(LC_ALL)]} {
+- set old_lc_all $env(LC_ALL)
+- }
+- set env(LC_ALL) "C"
+- send_log "$cmd\n"
+- set cmdret [remote_exec host [concat sh -c [list "$cmd 2>ld.tmp"]] "" "/dev/null"]
+- set cmdret [lindex $cmdret 0]
+- remote_upload host "ld.tmp"
+- set comp_output [prune_warnings [file_contents "ld.tmp"]]
+- remote_file host delete "ld.tmp"
+- remote_file build delete "ld.tmp"
+- if {[info exists old_lc_all]} {
+- set env(LC_ALL) $old_lc_all
+- } else {
+- unset env(LC_ALL)
+- }
+- if { $cmdret != 0 || $comp_output != "" } {
+- send_log "exited abnormally with $cmdret, output:$comp_output\n"
+- fail $testname
+- return
+- }
+-
+- if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
+- if { [regexp_diff $dumpfile "${dfile}"] } then {
+- fail $testname
+- if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
+- return
+- }
+-
+- pass $testname
+-}
+-
+-proc slurp_options { file } {
+- # If options_regsub(foo) is set to {a b}, then the contents of a
+- # "#foo:" line will have regsub -all applied to replace a with b.
+- global options_regsub
+-
+- if [catch { set f [open $file r] } x] {
+- #perror "couldn't open `$file': $x"
+- perror "$x"
+- return -1
+- }
+- set opt_array {}
+- # whitespace expression
+- set ws {[ ]*}
+- set nws {[^ ]*}
+- # whitespace is ignored anywhere except within the options list;
+- # option names are alphabetic plus underscore only.
+- set pat "^#${ws}(\[a-zA-Z_\]*)$ws:${ws}(.*)$ws\$"
+- while { [gets $f line] != -1 } {
+- set line [string trim $line]
+- # Whitespace here is space-tab.
+- if [regexp $pat $line xxx opt_name opt_val] {
+- # match!
+- if [info exists options_regsub($opt_name)] {
+- set subst $options_regsub($opt_name)
+- regsub -all -- [lindex $subst 0] $opt_val [lindex $subst 1] \
+- opt_val
+- }
+- lappend opt_array [list $opt_name $opt_val]
+- } else {
+- break
+- }
+- }
+- close $f
+- return $opt_array
+-}
+-
+-proc file_contents { filename } {
+- set file [open $filename r]
+- set contents [read $file]
+- close $file
+- return $contents
+-}
+-
+-proc set_file_contents { filename contents } {
+- set file [open $filename w]
+- puts $file "$contents"
+- close $file
+-}
+-
+ # Create an archive using ar
+ #
+ proc ar_simple_create { ar aropts target objects } {
+--
+2.26.2
+
diff --git a/9999/0015-Gentoo-Adapt-generic-test-library-to-our-linker-sett.patch b/9999/0015-Gentoo-Adapt-generic-test-library-to-our-linker-sett.patch
new file mode 100644
index 0000000..8ac5654
--- /dev/null
+++ b/9999/0015-Gentoo-Adapt-generic-test-library-to-our-linker-sett.patch
@@ -0,0 +1,26 @@
+From 782c17148cc2a663778c03bb6f78412e79593df4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 10 May 2020 20:24:33 +0300
+Subject: [PATCH 15/16] Gentoo: Adapt generic test library to our linker
+ settings
+
+---
+ binutils/testsuite/lib/binutils-common.exp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
+index b9e3c6d817..bb4ef987b3 100644
+--- a/binutils/testsuite/lib/binutils-common.exp
++++ b/binutils/testsuite/lib/binutils-common.exp
+@@ -1125,7 +1125,7 @@ proc run_dump_test { name {extra_options {}} } {
+
+ # Add -L$srcdir/$subdir so that the linker command can use
+ # linker scripts in the source directory.
+- set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
++ set cmd "$LD --hash-style=sysv --no-warn-shared-textrel $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
+ $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
+
+ # If needed then check for, or add a -Map option.
+--
+2.26.2
+
diff --git a/9999/0016-Gentoo-Fix-regexp-of-hilarious-ld-detection-heuristi.patch b/9999/0016-Gentoo-Fix-regexp-of-hilarious-ld-detection-heuristi.patch
new file mode 100644
index 0000000..be9f677
--- /dev/null
+++ b/9999/0016-Gentoo-Fix-regexp-of-hilarious-ld-detection-heuristi.patch
@@ -0,0 +1,30 @@
+From 6e0ff9dfef58d03eacc05ef381ef1d5fc7ad072d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 10 May 2020 20:59:05 +0300
+Subject: [PATCH 16/16] Gentoo: Fix regexp of hilarious ld detection heuristic
+
+The new linker used to be called as "ld/ld-new" but is now called as "./ld-new"
+Test for just "ld-new" and hope that the compiler binary never looks like this.
+---
+ ld/testsuite/lib/ld-lib.exp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp
+index ae72f21d72..0b945b539d 100644
+--- a/ld/testsuite/lib/ld-lib.exp
++++ b/ld/testsuite/lib/ld-lib.exp
+@@ -200,9 +200,9 @@ proc default_ld_link { ld target objects } {
+ # with $ld as parameter. If we want to change the default behaviour, we
+ # need to take the different option formats into account.
+ # We check the $ld parameter for
+- # - .*ld/ld-new -> we're working with the new linker
++ # - ld-new -> we're working with the new linker
+ # - otherwise -> we're likely working with the system compiler
+- if {[regexp {ld/ld-new$} $ld]} {
++ if {[regexp {ld-new$} $ld]} {
+ set gentoosysv "--hash-style=sysv --no-warn-shared-textrel"
+ } else {
+ set gentoosysv "-Wl,--hash-style=sysv -Wl,--no-warn-shared-textrel"
+--
+2.26.2
+
diff --git a/README.Gentoo.patches b/README.Gentoo.patches
new file mode 100644
index 0000000..504dc67
--- /dev/null
+++ b/README.Gentoo.patches
@@ -0,0 +1,31 @@
+ ============
+ === What ===
+ ============
+
+Gentoo patchsets for binutils are maintained as vendor branches of the upstream
+binutils-glb git repository. From there, we bundle all the commits into a tarball
+and distribute it via our public mirroring system.
+
+If you want specific info about a patch (like what it does or whose great idea
+it was to change the code), read the patch! We try to fill out the commit
+messages with useful info such as what it does, why it's needed, bug reports,
+original creators, etc...
+
+ =============
+ === Where ===
+ =============
+
+Currently, https://github.com/gentoo/binutils-gdb
+
+ ===========
+ === How ===
+ ===========
+
+The patch naming convention is precisely as generated by "git format-patch".
+
+All patches should apply with -p1 (so they can be used both with the legacy
+epatch function and the new, more strict eapply function).
+
+Commits where the commit message starts with "[no patch]" will not be included
+in the patch tarball. This is useful for changes to the tarball generation
+script, or for the addition of extra files that are not patches.
diff --git a/make-tarball.sh b/make-tarball.sh
new file mode 100755
index 0000000..575f48b
--- /dev/null
+++ b/make-tarball.sh
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+PN="binutils"
+PV=$1
+pver=$2
+
+if [[ -z ${PV} ]] ; then
+ echo "Usage: $0 binutils-version patchset-version-to-be-created"
+ echo "Please read the script before trying to use it :)"
+ exit 1
+fi
+
+# check that we're in the root of a binutils-gdb git repo
+
+if [[ ! -f COPYING.LIBGLOSS ]] || [[ ! -d .git ]] ; then
+ echo "Error: You need to call this script in the main directory of a Gentoo binutils-gdb git clone"
+ exit 1
+fi
+
+# check that we're on a branch gentoo/${PV}
+
+mybranchinfo=$(git status --porcelain -b|grep '^##')
+mybranch=$(echo ${mybranchinfo}|sed -e 's:^## ::' -e 's:\.\.\..*$::')
+if [[ ! "gentoo/binutils-${PV}" == "${mybranch}" ]] ; then
+ echo "Error: Your git repository is on the incorrect branch ${mybranch}; should be gentoo/binutils-${PV}"
+ exit 1
+fi
+
+# check that the working directory is clean
+
+mystatusinfo=$(git status --porcelain)
+if [[ ! -z "${mystatusinfo}" ]] ; then
+ echo "Error: Your working directory is not clean"
+ exit 1
+fi
+
+# check if the tag already exists
+
+mytaginfo=$(git tag -l|grep "gentoo/binutils-${PV}-${pver}")
+if [[ ! -z "${mytaginfo}" ]] ; then
+ echo "Error: A tag corresponding to this patch level already exists (gentoo/binutils-${PV}-${pver})"
+ exit 1
+fi
+
+# luckily binutils git has no /tmp dir and no tar.xz files, but let's better check and be pathologically careful
+
+if [[ -e tmp ]] || [[ -e ${PN}-${PV}-patches-${pver}.tar.xz ]] ; then
+ echo "Error: tmp or ${PN}-${PV}-patches-${pver}.tar.xz exists in git"
+ exit 1
+fi
+rm -rf tmp
+rm -f ${PN}-${PV}-*.tar.bz2
+
+for myname in 0*.patch ; do
+ if [[ -e "${myname}" ]]; then
+ echo "Error: ${myname} exists in git"
+ exit 1
+ fi
+done
+rm -f 0*.patch
+
+# check if we have to override the upstream tag
+
+mytaginfo=$(git tag -l|grep "gentoo/binutils-${PV}-upstream")
+if [[ ! -z "${mytaginfo}" ]] ; then
+ starttag="gentoo/binutils-${PV}-upstream"
+else
+ starttag="binutils-${PV//./_}"
+fi
+if [[ "${PV}" == "9999" ]]; then
+ starttag="master"
+fi
+echo "Starting from tag ${starttag}"
+
+mkdir -p tmp/patch
+
+# copy README.Gentoo.patches
+
+cp scripts/gentoo/README.Gentoo.patches tmp/ || exit 1
+
+# create and rename patches
+
+git format-patch ${starttag}..HEAD > /dev/null || exit 1
+
+# remove all patches where the summary line starts with:
+# - [no-tarball]: not related to upstream tarball
+# - [no-patch]: not related to upstream patches
+# - "Automatic date update in version.in": daily bumps
+rm -f 0???-no-tarball-*.patch
+rm -f 0???-no-patch-*.patch
+rm -f 0???-Automatic-date-update-in-version.in.patch
+
+for myname in 0*.patch ; do
+ mv ${myname} tmp/patch/ || exit 1
+done
+
+# add the extra patch if needed
+
+if [[ "${PV}" != "9999" ]]; then
+ cp scripts/gentoo/0000-Gentoo-Git-is-development tmp/patch/0000-Gentoo-Git-is-development.patch || exit 1
+ cp scripts/gentoo/9999-Gentoo-We-make-a-release tmp/patch/9999-Gentoo-We-make-a-release.patch || exit 1
+fi
+
+# add a history file
+
+git log --stat --decorate ${starttag}..HEAD > tmp/patch/README.history || exit 1
+
+# package everything up
+
+tar -Jcf ${PN}-${PV}-patches-${pver}.tar.xz \
+ -C tmp patch README.Gentoo.patches || exit 1
+rm -r tmp
+
+du -b *.tar.xz
+
+# tag the commit
+
+git tag -s -m "Gentoo patchset binutils-${PV}-${pver}" "gentoo/binutils-${PV}-${pver}"