From d7ce6bd337e14c5d92e68dabdf6e52966072d299 Mon Sep 17 00:00:00 2001 From: "Andreas K. Hüttel" Date: Tue, 19 May 2020 23:33:48 +0300 Subject: Add files from Gentoo binutils repo, tag gentoo/binutils-9999-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andreas K. Hüttel --- ...oo-ld-always-warn-about-textrels-in-files.patch | 30 + ...an-option-no-warn-shared-textrel-self-exp.patch | 66 ++ ...-ld-add-support-for-poisoned-system-direc.patch | 331 +++++++++ ...iberty-install-PIC-version-of-libiberty.a.patch | 34 + ...des-link-against-libbfd.la-for-rpath-deps.patch | 49 ++ ...ss-hash-style-sysv-to-ld-in-its-testsuite.patch | 807 +++++++++++++++++++++ ...-no-warn-shared-textrel-to-ld-in-its-test.patch | 47 ++ ...ore-TEXTREL-warnings-for-non-shared-objec.patch | 34 + ...test-for-precise-textrel-warning-message-.patch | 24 + ...10-Gentoo-Fix-textrel-warning-format-test.patch | 22 + ...oo-add-with-extra-soversion-suffix-option.patch | 141 ++++ ...entoo-Add-patch-tarball-generation-script.patch | 217 ++++++ ...nable-new-dtags-by-default-for-linux-gnu-.patch | 49 ++ ...ve-block-mistakenly-duplicated-in-1222895.patch | 777 ++++++++++++++++++++ ...t-generic-test-library-to-our-linker-sett.patch | 26 + ...regexp-of-hilarious-ld-detection-heuristi.patch | 30 + 16 files changed, 2684 insertions(+) create mode 100644 9999/0001-Gentoo-ld-always-warn-about-textrels-in-files.patch create mode 100644 9999/0002-Gentoo-Add-an-option-no-warn-shared-textrel-self-exp.patch create mode 100644 9999/0003-Gentoo-gold-ld-add-support-for-poisoned-system-direc.patch create mode 100644 9999/0004-Gentoo-libiberty-install-PIC-version-of-libiberty.a.patch create mode 100644 9999/0005-Gentoo-opcodes-link-against-libbfd.la-for-rpath-deps.patch create mode 100644 9999/0006-Gentoo-Pass-hash-style-sysv-to-ld-in-its-testsuite.patch create mode 100644 9999/0007-Gentoo-Pass-no-warn-shared-textrel-to-ld-in-its-test.patch create mode 100644 9999/0008-Gentoo-Restore-TEXTREL-warnings-for-non-shared-objec.patch create mode 100644 9999/0009-Gentoo-Fix-test-for-precise-textrel-warning-message-.patch create mode 100644 9999/0010-Gentoo-Fix-textrel-warning-format-test.patch create mode 100644 9999/0011-Gentoo-add-with-extra-soversion-suffix-option.patch create mode 100644 9999/0012-no-patch-Gentoo-Add-patch-tarball-generation-script.patch create mode 100644 9999/0013-Gentoo-ld-enable-new-dtags-by-default-for-linux-gnu-.patch create mode 100644 9999/0014-Gentoo-Remove-block-mistakenly-duplicated-in-1222895.patch create mode 100644 9999/0015-Gentoo-Adapt-generic-test-library-to-our-linker-sett.patch create mode 100644 9999/0016-Gentoo-Fix-regexp-of-hilarious-ld-detection-heuristi.patch (limited to '9999') 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 +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?= +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 +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 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::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= 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 +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 +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?= +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?= +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 +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?= +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?= +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 +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 +--- + 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?= +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 . ++ ++ # 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 . ++ ++ # 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?= +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 + +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 + + * 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 + + * 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 < +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?= +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?= +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 + -- cgit v1.2.3-65-gdbad