From 701504902f6ee7676d020ab88ff69982cb7426b4 Mon Sep 17 00:00:00 2001 From: mcgrathr Date: Tue, 10 May 2016 19:22:02 -0700 Subject: [PATCH] [Backport] Update third_party/binutils to 2.26, add ICF fix This is needed to order for the build to work on Ubuntu 16.04 with Chromium's clang and binutils. Original commit message: > The new binutils 2.26 release incorporates two out of the three > fixes that we were applying to the 2.25 version. There is also > an upstream fix, that's not in 2.26, for a bug that made the > linker crash when using --icf for x86-32, which we now apply > locally so it should become safe to use gold with --icf for x86. > > BUG=610908 > R=thakis@chromium.org > > Review-Url: https://codereview.chromium.org/1950343004 --- .../binutils/Linux_ia32/binutils.tar.bz2.sha1 | 2 +- .../binutils/Linux_x64/binutils.tar.bz2.sha1 | 2 +- third_party/binutils/README.chromium | 24 +-- third_party/binutils/build-all.sh | 21 +- third_party/binutils/icf-rel.patch | 181 ++++++++++++++++++ third_party/binutils/long-plt.patch | 80 +++++--- third_party/binutils/plugin-dso-fix.patch | 97 ---------- third_party/binutils/unlock-thin.patch | 129 ------------- third_party/binutils/upload.sh | 2 +- 9 files changed, 254 insertions(+), 284 deletions(-) create mode 100644 third_party/binutils/icf-rel.patch delete mode 100644 third_party/binutils/plugin-dso-fix.patch delete mode 100644 third_party/binutils/unlock-thin.patch diff --git a/third_party/binutils/Linux_ia32/binutils.tar.bz2.sha1 b/third_party/binutils/Linux_ia32/binutils.tar.bz2.sha1 index 7a88ad3bf0fb3..7fd1a938dc3d3 100644 --- a/third_party/binutils/Linux_ia32/binutils.tar.bz2.sha1 +++ b/third_party/binutils/Linux_ia32/binutils.tar.bz2.sha1 @@ -1 +1 @@ -db44850c15da5bb295f44c295d8e5c4c97c9edec \ No newline at end of file +24f937cfdad77bdcd6ad8cacc542d806f3eb4b0f \ No newline at end of file diff --git a/third_party/binutils/Linux_x64/binutils.tar.bz2.sha1 b/third_party/binutils/Linux_x64/binutils.tar.bz2.sha1 index 7bf31702ee180..1434c33348586 100644 --- a/third_party/binutils/Linux_x64/binutils.tar.bz2.sha1 +++ b/third_party/binutils/Linux_x64/binutils.tar.bz2.sha1 @@ -1 +1 @@ -4b448a2afa4b65ffd968db57a3b233532effc88d \ No newline at end of file +d9064388bed0e7225b1366d80b59289b1509d7c2 \ No newline at end of file diff --git a/third_party/binutils/README.chromium b/third_party/binutils/README.chromium index f5b5600b4804a..a95ae3ec84b1d 100644 --- a/third_party/binutils/README.chromium +++ b/third_party/binutils/README.chromium @@ -1,6 +1,6 @@ Name: binutils URL: http://www.gnu.org/software/binutils/ -Version: 2.25 +Version: 2.26 License: GPL v2 License File: NOT_SHIPPED Security Critical: no @@ -9,29 +9,24 @@ Description: This directory contains i386 and amd64 binaries of the binutils tools (including gold linker). -They were built from binutils-2.25 using the "build-all.sh" script on a Ubuntu -Precise. +They were built from binutils-2.26 using the "build-all.sh" script on a +Ubuntu Trusty. The script creates chroots for 32bit and 64bit Ubuntu Precise and then builds binutils inside the roots. It also builds tcmalloc and links binutils with it to improve the speed of LTO. -Version 2.25 was released on Wed, 24 Dec 2014 +Version 2.26 was released on Mon, 25 Jan 2016 Local patches: - * unlock-thin.patch for http://crbug.com/453195 from upstream change - https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=2cfbf2fece582c29df348104b28677c38a8301f4 - (Landed upstream Wed, 4 Feb 2015 - should be in 2.26) - - * plugin-dso-fix.patch for http://crbug.com/453195 from upstream change - https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=3c537f7fdb11f02f7082749f3f21dfdd2c2025e8 - (Landed upstream Thu, 5 Feb 2015 - should be in 2.26) - * long-plt.patch for http://crbug.com/554017 from upstream change https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=ce3e49806d505721e0875e704de0b6fcba7660ed (Landed upstream Thu, 17 Dec 2015 - should be in 2.27) - The local patch has been backported to 2.25. The patch in the upstream - repository currently applies cleanly to the 2.26 branch. + * icf-rel.patch for https://sourceware.org/bugzilla/show_bug.cgi?id=19047 + from upstream change + https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=d114b830426300f80302ca03ff4322942f63c615 + (Landed upstream on 2.26 branch Thu, 5 May 2016, + and on trunk Fri, 5 Feb 2016 - will be in 2.27) * (build-all.sh|build-one.sh|upload.sh) scripts for building the binutils binaries and uploading them to Google storage. @@ -53,4 +48,3 @@ To upgrade binutils, use the following steps: * Commit the change See https://codereview.chromium.org/1368233002/ for an example upgrade. - diff --git a/third_party/binutils/build-all.sh b/third_party/binutils/build-all.sh index dc63683314789..b203699f24fb6 100755 --- a/third_party/binutils/build-all.sh +++ b/third_party/binutils/build-all.sh @@ -22,7 +22,7 @@ if [ ! -d "$OUTPUTDIR" ]; then fi # Download the source -VERSION=2.25 +VERSION=2.26 wget -c http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2 # Verify the signature @@ -46,19 +46,14 @@ tar jxf binutils-$VERSION.tar.bz2 # Patch the source ( cd binutils-$VERSION - echo "unlock-thin.patch" - echo "==================================" - patch -p1 < ../unlock-thin.patch - echo "----------------------------------" - echo - echo "plugin-dso-fix.patch" + echo "long-plt.patch" echo "==================================" - patch -p1 < ../plugin-dso-fix.patch + patch -p1 < ../long-plt.patch echo "----------------------------------" echo - echo "long-plt.patch" + echo "icf-rel.patch" echo "==================================" - patch -p1 < ../long-plt.patch + patch -p1 < ../icf-rel.patch echo "----------------------------------" echo ) @@ -102,7 +97,7 @@ for ARCH in i386 amd64; do ;; amd64) PREFIX="setarch linux64" - ARCHNAME=x86_64-unknown-linux-gnu + ARCHNAME=x86_64-pc-linux-gnu ;; esac echo "" @@ -117,9 +112,7 @@ for ARCH in i386 amd64; do sudo chown -R $(whoami) "$BUILDDIR/output/" # Strip the output binaries - for i in "$BUILDDIR/output/$ARCHNAME/bin/*"; do - strip $i - done + strip "$BUILDDIR/output/$ARCHNAME/bin/"* # Copy them out of the chroot cp -a "$BUILDDIR/output/$ARCHNAME" "$OUTPUTDIR" diff --git a/third_party/binutils/icf-rel.patch b/third_party/binutils/icf-rel.patch new file mode 100644 index 0000000000000..1747fccfaedb8 --- /dev/null +++ b/third_party/binutils/icf-rel.patch @@ -0,0 +1,181 @@ +commit d114b830426300f80302ca03ff4322942f63c615 +Author: Roland McGrath +Date: Thu May 5 13:12:40 2016 -0700 + + 2016-02-05 Sriraman Tallam + + PR gold/19047 + * icf.cc (get_rel_addend): New function. + (get_section_contents): Move merge section addend computation to a + new function. Ignore negative values for SHT_REL and SHT_RELA addends. + Fix bug to not read past the length of the section. + + Fix bug related to addend computation for MERGE sections. + + (cherry picked from commit 84d543b7ed93bf6511cdf45791f4f0b717dfb718) + +diff --git a/gold/ChangeLog b/gold/ChangeLog +index 92b26ba..ec8dacb 100644 +--- a/gold/ChangeLog ++++ b/gold/ChangeLog +@@ -1,3 +1,11 @@ ++2016-02-05 Sriraman Tallam ++ ++ PR gold/19047 ++ * icf.cc (get_rel_addend): New function. ++ (get_section_contents): Move merge section addend computation to a ++ new function. Ignore negative values for SHT_REL and SHT_RELA addends. ++ Fix bug to not read past the length of the section. ++ + 2015-12-17 Peter Collingbourne + + PR gold/18780 +diff --git a/gold/icf.cc b/gold/icf.cc +index 96b7f2d..663d579 100644 +--- a/gold/icf.cc ++++ b/gold/icf.cc +@@ -213,6 +213,45 @@ preprocess_for_unique_sections(const std::vector& id_section, + } + } + ++// For SHF_MERGE sections that use REL relocations, the addend is stored in ++// the text section at the relocation offset. Read the addend value given ++// the pointer to the addend in the text section and the addend size. ++// Update the addend value if a valid addend is found. ++// Parameters: ++// RELOC_ADDEND_PTR : Pointer to the addend in the text section. ++// ADDEND_SIZE : The size of the addend. ++// RELOC_ADDEND_VALUE : Pointer to the addend that is updated. ++ ++inline void ++get_rel_addend(const unsigned char* reloc_addend_ptr, ++ const unsigned int addend_size, ++ uint64_t* reloc_addend_value) ++{ ++ switch (addend_size) ++ { ++ case 0: ++ break; ++ case 1: ++ *reloc_addend_value = ++ read_from_pointer<8>(reloc_addend_ptr); ++ break; ++ case 2: ++ *reloc_addend_value = ++ read_from_pointer<16>(reloc_addend_ptr); ++ break; ++ case 4: ++ *reloc_addend_value = ++ read_from_pointer<32>(reloc_addend_ptr); ++ break; ++ case 8: ++ *reloc_addend_value = ++ read_from_pointer<64>(reloc_addend_ptr); ++ break; ++ default: ++ gold_unreachable(); ++ } ++} ++ + // This returns the buffer containing the section's contents, both + // text and relocs. Relocs are differentiated as those pointing to + // sections that could be folded and those that cannot. Only relocs +@@ -397,58 +436,36 @@ get_section_contents(bool first_iteration, + uint64_t entsize = + (it_v->first)->section_entsize(it_v->second); + long long offset = it_a->first; +- +- unsigned long long addend = it_a->second; +- // Ignoring the addend when it is a negative value. See the +- // comments in Merged_symbol_value::Value in object.h. +- if (addend < 0xffffff00) +- offset = offset + addend; +- +- // For SHT_REL relocation sections, the addend is stored in the +- // text section at the relocation offset. +- uint64_t reloc_addend_value = 0; ++ // Handle SHT_RELA and SHT_REL addends, only one of these ++ // addends exists. ++ // Get the SHT_RELA addend. For RELA relocations, we have ++ // the addend from the relocation. ++ uint64_t reloc_addend_value = it_a->second; ++ ++ // Handle SHT_REL addends. ++ // For REL relocations, we need to fetch the addend from the ++ // section contents. + const unsigned char* reloc_addend_ptr = + contents + static_cast(*it_o); +- switch(*it_addend_size) +- { +- case 0: +- { +- break; +- } +- case 1: +- { +- reloc_addend_value = +- read_from_pointer<8>(reloc_addend_ptr); +- break; +- } +- case 2: +- { +- reloc_addend_value = +- read_from_pointer<16>(reloc_addend_ptr); +- break; +- } +- case 4: +- { +- reloc_addend_value = +- read_from_pointer<32>(reloc_addend_ptr); +- break; +- } +- case 8: +- { +- reloc_addend_value = +- read_from_pointer<64>(reloc_addend_ptr); +- break; +- } +- default: +- gold_unreachable(); +- } +- offset = offset + reloc_addend_value; ++ ++ // Update the addend value with the SHT_REL addend if ++ // available. ++ get_rel_addend(reloc_addend_ptr, *it_addend_size, ++ &reloc_addend_value); ++ ++ // Ignore the addend when it is a negative value. See the ++ // comments in Merged_symbol_value::value in object.h. ++ if (reloc_addend_value < 0xffffff00) ++ offset = offset + reloc_addend_value; + + section_size_type secn_len; ++ + const unsigned char* str_contents = + (it_v->first)->section_contents(it_v->second, + &secn_len, + false) + offset; ++ gold_assert (offset < (long long) secn_len); ++ + if ((secn_flags & elfcpp::SHF_STRINGS) != 0) + { + // String merge section. +@@ -489,10 +506,14 @@ get_section_contents(bool first_iteration, + } + else + { +- // Use the entsize to determine the length. +- buffer.append(reinterpret_cast secn_len) ++ bufsize = secn_len - offset; ++ buffer.append(reinterpret_cast(str_contents), +- entsize); ++ bufsize); + } + buffer.append("@"); + } diff --git a/third_party/binutils/long-plt.patch b/third_party/binutils/long-plt.patch index 9132377efcff8..4738eea232dd3 100644 --- a/third_party/binutils/long-plt.patch +++ b/third_party/binutils/long-plt.patch @@ -1,4 +1,4 @@ -commit ee8713f5cfc38be0e92d78f2afbc77d701ef189d +commit ce3e49806d505721e0875e704de0b6fcba7660ed Author: Peter Collingbourne Date: Thu Dec 17 16:50:35 2015 -0800 @@ -20,8 +20,33 @@ Date: Thu Dec 17 16:50:35 2015 -0800 (Output_data_plt_arm_long): New class. * options.h (General_options): Define --long-plt flag. +diff --git a/gold/ChangeLog b/gold/ChangeLog +index d929cb7..07589c9 100644 +--- a/gold/ChangeLog ++++ b/gold/ChangeLog +@@ -1,3 +1,20 @@ ++2015-12-17 Peter Collingbourne ++ ++ PR gold/18780 ++ * arm.cc (Target_arm::do_make_data_plt): Choose PLT generator based ++ on value of --long-plt flag. ++ (Output_data_plt_arm_standard::do_get_plt_entry_size): Moved to ++ Output_data_plt_arm_short. ++ (Output_data_plt_arm_standard::do_fill_plt_entry): Likewise. ++ (Output_data_plt_arm_standard::plt_entry): Likewise. ++ (Output_data_plt_arm_standard::do_fill_first_plt_entry): Fix ++ variable reference. ++ (Output_data_plt_arm_short): New class. ++ (Output_data_plt_arm_short::do_fill_plt_entry): Error out on too large ++ PLT offsets instead of asserting. ++ (Output_data_plt_arm_long): New class. ++ * options.h (General_options): Define --long-plt flag. ++ + 2015-12-16 Roland McGrath + + PR ld/17473 diff --git a/gold/arm.cc b/gold/arm.cc -index 6c472bb..a10d785 100644 +index 33e8734..fc387bb 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -62,7 +62,10 @@ template @@ -36,21 +61,20 @@ index 6c472bb..a10d785 100644 template class Stub_table; -@@ -2532,7 +2535,12 @@ class Target_arm : public Sized_target<32, big_endian> - virtual Output_data_plt_arm* - do_make_data_plt(Layout* layout, Output_data_space* got_plt) +@@ -2554,7 +2557,11 @@ class Target_arm : public Sized_target<32, big_endian> + Output_data_space* got_irelative) { -- return new Output_data_plt_arm_standard(layout, got_plt); + gold_assert(got_plt != NULL && got_irelative != NULL); +- return new Output_data_plt_arm_standard( + if (parameters->options().long_plt()) + return new Output_data_plt_arm_long( -+ layout, got_plt); ++ layout, got, got_plt, got_irelative); + else + return new Output_data_plt_arm_short( -+ layout, got_plt); + layout, got, got_plt, got_irelative); } - private: -@@ -7382,29 +7390,14 @@ class Output_data_plt_arm_standard : public Output_data_plt_arm +@@ -7715,29 +7722,14 @@ class Output_data_plt_arm_standard : public Output_data_plt_arm do_first_plt_entry_offset() const { return sizeof(first_plt_entry); } @@ -80,7 +104,7 @@ index 6c472bb..a10d785 100644 }; // ARM PLTs. -@@ -7432,7 +7425,7 @@ Output_data_plt_arm_standard::do_fill_first_plt_entry( +@@ -7765,7 +7757,7 @@ Output_data_plt_arm_standard::do_fill_first_plt_entry( { // Write first PLT entry. All but the last word are constants. const size_t num_first_plt_words = (sizeof(first_plt_entry) @@ -89,19 +113,22 @@ index 6c472bb..a10d785 100644 for (size_t i = 0; i < num_first_plt_words - 1; i++) elfcpp::Swap<32, big_endian>::writeval(pov + i * 4, first_plt_entry[i]); // Last word in first PLT entry is &GOT[0] - . -@@ -7441,9 +7434,37 @@ Output_data_plt_arm_standard::do_fill_first_plt_entry( +@@ -7774,9 +7766,39 @@ Output_data_plt_arm_standard::do_fill_first_plt_entry( } // Subsequent entries in the PLT. +// This class generates short (12-byte) entries, for displacements up to 2^28. -+ -+template + + template +-const uint32_t Output_data_plt_arm_standard::plt_entry[3] = +class Output_data_plt_arm_short : public Output_data_plt_arm_standard +{ + public: + Output_data_plt_arm_short(Layout* layout, -+ Output_data_space* got_plt) -+ : Output_data_plt_arm_standard(layout, got_plt) ++ Arm_output_data_got* got, ++ Output_data_space* got_plt, ++ Output_data_space* got_irelative) ++ : Output_data_plt_arm_standard(layout, got, got_plt, got_irelative) + { } + + protected: @@ -121,14 +148,13 @@ index 6c472bb..a10d785 100644 + // Template for subsequent PLT entries. + static const uint32_t plt_entry[3]; +}; - - template --const uint32_t Output_data_plt_arm_standard::plt_entry[3] = ++ ++template +const uint32_t Output_data_plt_arm_short::plt_entry[3] = { 0xe28fc600, // add ip, pc, #0xNN00000 0xe28cca00, // add ip, ip, #0xNN000 -@@ -7452,7 +7473,7 @@ const uint32_t Output_data_plt_arm_standard::plt_entry[3] = +@@ -7785,7 +7807,7 @@ const uint32_t Output_data_plt_arm_standard::plt_entry[3] = template void @@ -137,7 +163,7 @@ index 6c472bb..a10d785 100644 unsigned char* pov, Arm_address got_address, Arm_address plt_address, -@@ -7461,8 +7482,9 @@ Output_data_plt_arm_standard::do_fill_plt_entry( +@@ -7794,8 +7816,9 @@ Output_data_plt_arm_standard::do_fill_plt_entry( { int32_t offset = ((got_address + got_offset) - (plt_address + plt_offset + 8)); @@ -148,7 +174,7 @@ index 6c472bb..a10d785 100644 uint32_t plt_insn0 = plt_entry[0] | ((offset >> 20) & 0xff); elfcpp::Swap<32, big_endian>::writeval(pov, plt_insn0); uint32_t plt_insn1 = plt_entry[1] | ((offset >> 12) & 0xff); -@@ -7471,6 +7493,66 @@ Output_data_plt_arm_standard::do_fill_plt_entry( +@@ -7804,6 +7827,68 @@ Output_data_plt_arm_standard::do_fill_plt_entry( elfcpp::Swap<32, big_endian>::writeval(pov + 8, plt_insn2); } @@ -159,8 +185,10 @@ index 6c472bb..a10d785 100644 +{ + public: + Output_data_plt_arm_long(Layout* layout, -+ Output_data_space* got_plt) -+ : Output_data_plt_arm_standard(layout, got_plt) ++ Arm_output_data_got* got, ++ Output_data_space* got_plt, ++ Output_data_space* got_irelative) ++ : Output_data_plt_arm_standard(layout, got, got_plt, got_irelative) + { } + + protected: @@ -216,10 +244,10 @@ index 6c472bb..a10d785 100644 // and adjusts them as needed. This is all specified by the arm ELF // Processor Supplement. diff --git a/gold/options.h b/gold/options.h -index cf3b705..5bd93b1e 100644 +index ffc44e6..8b5159f 100644 --- a/gold/options.h +++ b/gold/options.h -@@ -826,6 +826,10 @@ class General_options +@@ -834,6 +834,10 @@ class General_options "veneer"), NULL); diff --git a/third_party/binutils/plugin-dso-fix.patch b/third_party/binutils/plugin-dso-fix.patch deleted file mode 100644 index 558975686dce5..0000000000000 --- a/third_party/binutils/plugin-dso-fix.patch +++ /dev/null @@ -1,97 +0,0 @@ -commit 3c537f7fdb11f02f7082749f3f21dfdd2c2025e8 -Author: Peter Collingbourne -Date: Wed Feb 4 09:47:28 2015 -0800 - - Resolve forwarding symbols in plugins. - - 2015-02-04 Peter Collingbourne - - * plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve - forwarding symbols when computing symbol resolution info for plugins. - -diff --git a/gold/plugin.cc b/gold/plugin.cc -index bde8c78..68da8e3 100644 ---- a/gold/plugin.cc -+++ b/gold/plugin.cc -@@ -914,7 +914,8 @@ is_visible_from_outside(Symbol* lsym) - // Get symbol resolution info. - - ld_plugin_status --Pluginobj::get_symbol_resolution_info(int nsyms, -+Pluginobj::get_symbol_resolution_info(Symbol_table* symtab, -+ int nsyms, - ld_plugin_symbol* syms, - int version) const - { -@@ -943,6 +944,8 @@ Pluginobj::get_symbol_resolution_info(int nsyms, - { - ld_plugin_symbol* isym = &syms[i]; - Symbol* lsym = this->symbols_[i]; -+ if (lsym->is_forwarder()) -+ lsym = symtab->resolve_forwards(lsym); - ld_plugin_symbol_resolution res = LDPR_UNKNOWN; - - if (lsym->is_undefined()) -@@ -1511,14 +1514,16 @@ static enum ld_plugin_status - get_symbols(const void* handle, int nsyms, ld_plugin_symbol* syms) - { - gold_assert(parameters->options().has_plugins()); -- Object* obj = parameters->options().plugins()->object( -+ Plugin_manager* plugins = parameters->options().plugins(); -+ Object* obj = plugins->object( - static_cast(reinterpret_cast(handle))); - if (obj == NULL) - return LDPS_ERR; - Pluginobj* plugin_obj = obj->pluginobj(); - if (plugin_obj == NULL) - return LDPS_ERR; -- return plugin_obj->get_symbol_resolution_info(nsyms, syms, 1); -+ Symbol_table* symtab = plugins->symtab(); -+ return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 1); - } - - // Version 2 of the above. The only difference is that this version -@@ -1528,14 +1533,16 @@ static enum ld_plugin_status - get_symbols_v2(const void* handle, int nsyms, ld_plugin_symbol* syms) - { - gold_assert(parameters->options().has_plugins()); -- Object* obj = parameters->options().plugins()->object( -+ Plugin_manager* plugins = parameters->options().plugins(); -+ Object* obj = plugins->object( - static_cast(reinterpret_cast(handle))); - if (obj == NULL) - return LDPS_ERR; - Pluginobj* plugin_obj = obj->pluginobj(); - if (plugin_obj == NULL) - return LDPS_ERR; -- return plugin_obj->get_symbol_resolution_info(nsyms, syms, 2); -+ Symbol_table* symtab = plugins->symtab(); -+ return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 2); - } - - // Add a new (real) input file generated by a plugin. -diff --git a/gold/plugin.h b/gold/plugin.h -index ef78b84..f926879 100644 ---- a/gold/plugin.h -+++ b/gold/plugin.h -@@ -282,6 +282,10 @@ class Plugin_manager - input_objects() const - { return this->input_objects_; } - -+ Symbol_table* -+ symtab() -+ { return this->symtab_; } -+ - Layout* - layout() - { return this->layout_; } -@@ -396,7 +400,8 @@ class Pluginobj : public Object - - // Fill in the symbol resolution status for the given plugin symbols. - ld_plugin_status -- get_symbol_resolution_info(int nsyms, -+ get_symbol_resolution_info(Symbol_table* symtab, -+ int nsyms, - ld_plugin_symbol* syms, - int version) const; - diff --git a/third_party/binutils/unlock-thin.patch b/third_party/binutils/unlock-thin.patch deleted file mode 100644 index 6a4b6a7c98426..0000000000000 --- a/third_party/binutils/unlock-thin.patch +++ /dev/null @@ -1,129 +0,0 @@ -commit 2cfbf2fece582c29df348104b28677c38a8301f4 -Author: Cary Coutant -Date: Tue Feb 3 19:54:57 2015 -0800 - - Fix a file descriptor leak in gold. - - When an LTO linker plugin claims an external member of a thin archive, gold - does not properly unlock the file and make its file descriptor available for - reuse. This patch fixes the problem by modifying Archive::include_member to - unlock the object file via an RAII class instance, ensuring that it will be - unlocked no matter what path is taken through the function. - - gold/ - PR gold/15660 - * archive.cc (Thin_archive_object_unlocker): New class. - (Archive::include_member): Unlock external members of thin archives. - * testsuite/Makefile.am (plugin_test_1): Rename .syms files. - (plugin_test_2): Likewise. - (plugin_test_3): Likewise. - (plugin_test_4): Likewise. - (plugin_test_5): Likewise. - (plugin_test_6): Likewise. - (plugin_test_7): Likewise. - (plugin_test_8): Likewise. - (plugin_test_9): Likewise. - (plugin_test_10): Likewise. - (plugin_test_11): New test case. - * testsuite/Makefile.in: Regenerate. - * testsuite/plugin_test.c (claim_file_hook): Check for parallel .syms - file to decide whether to claim file. - (all_symbols_read_hook): Likewise. - * testsuite/plugin_test_1.sh: Adjust expected output. - * testsuite/plugin_test_2.sh: Likewise. - * testsuite/plugin_test_3.sh: Likewise. - * testsuite/plugin_test_6.sh: Likewise. - * testsuite/plugin_test_tls.sh: Likewise. - * testsuite/plugin_test_11.sh: New testcase. - -diff --git a/gold/archive.cc b/gold/archive.cc -index 69107f5..6d25980 100644 ---- a/gold/archive.cc -+++ b/gold/archive.cc -@@ -930,6 +930,32 @@ Archive::count_members() - return ret; - } - -+// RAII class to ensure we unlock the object if it's a member of a -+// thin archive. We can't use Task_lock_obj in Archive::include_member -+// because the object file is already locked when it's opened by -+// get_elf_object_for_member. -+ -+class Thin_archive_object_unlocker -+{ -+ public: -+ Thin_archive_object_unlocker(const Task *task, Object* obj) -+ : task_(task), obj_(obj) -+ { } -+ -+ ~Thin_archive_object_unlocker() -+ { -+ if (this->obj_->offset() == 0) -+ this->obj_->unlock(this->task_); -+ } -+ -+ private: -+ Thin_archive_object_unlocker(const Thin_archive_object_unlocker&); -+ Thin_archive_object_unlocker& operator=(const Thin_archive_object_unlocker&); -+ -+ const Task* task_; -+ Object* obj_; -+}; -+ - // Include an archive member in the link. OFF is the file offset of - // the member header. WHY is the reason we are including this member. - // Return true if we added the member or if we had an error, return -@@ -978,6 +1004,10 @@ Archive::include_member(Symbol_table* symtab, Layout* layout, - return unconfigured ? false : true; - } - -+ // If the object is an external member of a thin archive, -+ // unlock it when we're done here. -+ Thin_archive_object_unlocker unlocker(this->task_, obj); -+ - if (mapfile != NULL) - mapfile->report_include_archive_member(obj->name(), sym, why); - -@@ -991,31 +1021,21 @@ Archive::include_member(Symbol_table* symtab, Layout* layout, - - if (!input_objects->add_object(obj)) - { -- // If this is an external member of a thin archive, unlock the -- // file. -- if (obj->offset() == 0) -- obj->unlock(this->task_); - delete obj; -+ return true; - } -- else -- { -- { -- if (layout->incremental_inputs() != NULL) -- layout->incremental_inputs()->report_object(obj, 0, this, NULL); -- Read_symbols_data sd; -- obj->read_symbols(&sd); -- obj->layout(symtab, layout, &sd); -- obj->add_symbols(symtab, &sd, layout); -- } -- -- // If this is an external member of a thin archive, unlock the file -- // for the next task. -- if (obj->offset() == 0) -- obj->unlock(this->task_); - -- this->included_member_ = true; -- } -+ if (layout->incremental_inputs() != NULL) -+ layout->incremental_inputs()->report_object(obj, 0, this, NULL); -+ -+ { -+ Read_symbols_data sd; -+ obj->read_symbols(&sd); -+ obj->layout(symtab, layout, &sd); -+ obj->add_symbols(symtab, &sd, layout); -+ } - -+ this->included_member_ = true; - return true; - } - diff --git a/third_party/binutils/upload.sh b/third_party/binutils/upload.sh index 31f1a06c32eaf..d9d43cf3a88c9 100755 --- a/third_party/binutils/upload.sh +++ b/third_party/binutils/upload.sh @@ -35,7 +35,7 @@ for DIR in $1/*; do export ARCH="Linux_ia32" ;; - */x86_64-unknown-linux-gnu) + */x86_64-pc-linux-gnu) export ARCH="Linux_x64" ;;