diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index 7a06e290a966..d2b5f6e7ea3a 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -70,6 +70,11 @@ stdenv.mkDerivation { # https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=956ea65cd707707c0f725930214cbc781367a831 ./bfd-elf-Dont-read-non-existing-secondary-relocs.patch + # Fix building plv8’s v8. + # https://github.com/NixOS/nixpkgs/issues/134190 + # Obtained from: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=586e30940e640f67bd55bd72e1d1355a4faf8079 + ./gold-Update-GNU_PROPERTY_X86_XXX-macros.patch + ./CVE-2020-35448.patch ] ++ lib.optional stdenv.targetPlatform.isiOS ./support-ios.patch ++ # This patch was suggested by Nick Clifton to fix diff --git a/pkgs/development/tools/misc/binutils/gold-Update-GNU_PROPERTY_X86_XXX-macros.patch b/pkgs/development/tools/misc/binutils/gold-Update-GNU_PROPERTY_X86_XXX-macros.patch new file mode 100644 index 000000000000..c4eef87a0c8d --- /dev/null +++ b/pkgs/development/tools/misc/binutils/gold-Update-GNU_PROPERTY_X86_XXX-macros.patch @@ -0,0 +1,292 @@ +From 586e30940e640f67bd55bd72e1d1355a4faf8079 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" +Date: Tue, 13 Oct 2020 05:20:49 -0700 +Subject: [PATCH] gold: Update GNU_PROPERTY_X86_XXX macros + +This patch updates GNU_PROPERTY_X86_XXX macros for gold: + +1. GNU_PROPERTY_X86_UINT32_AND_XXX: A 4-byte unsigned integer property. +A bit is set if it is set in all relocatable inputs: + + #define GNU_PROPERTY_X86_UINT32_AND_LO 0xc0000002 + #define GNU_PROPERTY_X86_UINT32_AND_HI 0xc0007fff + +2. GNU_PROPERTY_X86_UINT32_OR_XXX: A 4-byte unsigned integer property. +A bit is set if it is set in any relocatable inputs: + + #define GNU_PROPERTY_X86_UINT32_OR_LO 0xc0008000 + #define GNU_PROPERTY_X86_UINT32_OR_HI 0xc000ffff + +3. GNU_PROPERTY_X86_UINT32_OR_AND_XXX: A 4-byte unsigned integer property. +A bit is set if it is set in any relocatable inputs and the property is +present in all relocatable inputs: + + #define GNU_PROPERTY_X86_UINT32_OR_AND_LO 0xc0010000 + #define GNU_PROPERTY_X86_UINT32_OR_AND_HI 0xc0017fff + +4. GNU_PROPERTY_X86_FEATURE_2_NEEDED, GNU_PROPERTY_X86_FEATURE_2_USED +and GNU_PROPERTY_X86_FEATURE_2_XXX bits. + +GNU_PROPERTY_X86_FEATURE_1_AND is unchanged. GNU_PROPERTY_X86_ISA_1_USED +and GNU_PROPERTY_X86_ISA_1_NEEDED are updated to better support targeted +processors since GNU_PROPERTY_X86_ISA_1_?86 aren't isn't very useful. +A new set of GNU_PROPERTY_X86_ISA_1_XXX bits are defined. The previous +GNU_PROPERTY_X86_ISA_1_XXX macros are deprecated and renamed to +GNU_PROPERTY_X86_COMPAT_ISA_1_XXX and GNU_PROPERTY_X86_COMPAT_2_ISA_1_XXX. + +elfcpp/ + + * elfcpp.h (GNU_PROPERTY_X86_ISA_1_USED): Renamed to ... + (GNU_PROPERTY_X86_COMPAT_ISA_1_USED): This. + (GNU_PROPERTY_X86_ISA_1_NEEDED): Renamed to ... + (GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED): This. + (GNU_PROPERTY_X86_UINT32_AND_LO): New. + (GNU_PROPERTY_X86_UINT32_AND_HI): Likewise. + (GNU_PROPERTY_X86_UINT32_OR_LO): Likewise. + (GNU_PROPERTY_X86_UINT32_OR_HI): Likewise. + (GNU_PROPERTY_X86_UINT32_OR_AND_LO): Likewise. + (GNU_PROPERTY_X86_UINT32_OR_AND_HI): Likewise. + (GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): New. + (GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED): Likewise. + (GNU_PROPERTY_X86_FEATURE_1_AND): Updated to + (GNU_PROPERTY_X86_UINT32_AND_LO + 0). + (GNU_PROPERTY_X86_ISA_1_NEEDED): New. Defined to + GNU_PROPERTY_X86_UINT32_OR_LO + 2. + (GNU_PROPERTY_X86_FEATURE_2_NEEDED): New. Defined to + (GNU_PROPERTY_X86_UINT32_OR_LO + 1). + (GNU_PROPERTY_X86_ISA_1_USED): New. Defined to + GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2. + (GNU_PROPERTY_X86_FEATURE_2_USED): New. Defined to + (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1). + +gold/ + + * x86_64.cc (Target_x86_64::Target_x86_64): Initialize + feature_2_used_, feature_2_needed_ and object_feature_2_used_. + (Target_x86_64::feature_2_used_): New data member. + (Target_x86_64::feature_2_needed_): Likewise. + (Target_x86_64::object_isa_1_used_): Likewise. + (Target_x86_64::record_gnu_property): Support + GNU_PROPERTY_X86_COMPAT_ISA_1_USED, + GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED, + GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED, + GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED, + GNU_PROPERTY_X86_FEATURE_2_USED and + GNU_PROPERTY_X86_FEATURE_2_NEEDED. + (Target_x86_64::merge_gnu_properties): Merge FEATURE_2_USED bits. + Initialize object_feature_2_used_. + (Target_x86_64::do_finalize_gnu_properties): Support + GNU_PROPERTY_X86_FEATURE_2_USED and + GNU_PROPERTY_X86_FEATURE_2_NEEDED. + * testsuite/gnu_property_a.S (GNU_PROPERTY_X86_ISA_1_USED): Set + to 0xc0010002. + (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002. + * testsuite/gnu_property_b.S (GNU_PROPERTY_X86_ISA_1_USED): Set + to 0xc0010002. + (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002. + * testsuite/gnu_property_c.S (GNU_PROPERTY_X86_ISA_1_USED): Set + to 0xc0010002. + (GNU_PROPERTY_X86_ISA_1_NEEDED): Set to 0xc0008002. + * testsuite/gnu_property_test.sh: Updated. +--- + elfcpp/ChangeLog | [omitted] + elfcpp/elfcpp.h | 18 ++++++++++++--- + gold/ChangeLog | [omitted] + gold/testsuite/gnu_property_a.S | 4 ++-- + gold/testsuite/gnu_property_b.S | 4 ++-- + gold/testsuite/gnu_property_c.S | 4 ++-- + gold/testsuite/gnu_property_test.sh | 4 ++-- + gold/x86_64.cc | 34 +++++++++++++++++++++++++++-- + 8 files changed, 110 insertions(+), 13 deletions(-) + +diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h +index 65d803c00e2..4b6ff94a654 100644 +--- a/elfcpp/elfcpp.h ++++ b/elfcpp/elfcpp.h +@@ -1013,9 +1013,21 @@ enum + GNU_PROPERTY_STACK_SIZE = 1, + GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2, + GNU_PROPERTY_LOPROC = 0xc0000000, +- GNU_PROPERTY_X86_ISA_1_USED = 0xc0000000, +- GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0000001, +- GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002, ++ GNU_PROPERTY_X86_COMPAT_ISA_1_USED = 0xc0000000, ++ GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED = 0xc0000001, ++ GNU_PROPERTY_X86_UINT32_AND_LO = 0xc0000002, ++ GNU_PROPERTY_X86_UINT32_AND_HI = 0xc0007fff, ++ GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000, ++ GNU_PROPERTY_X86_UINT32_OR_HI = 0xc000ffff, ++ GNU_PROPERTY_X86_UINT32_OR_AND_LO = 0xc0010000, ++ GNU_PROPERTY_X86_UINT32_OR_AND_HI = 0xc0017fff, ++ GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 0, ++ GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0, ++ GNU_PROPERTY_X86_FEATURE_1_AND = GNU_PROPERTY_X86_UINT32_AND_LO + 0, ++ GNU_PROPERTY_X86_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 2, ++ GNU_PROPERTY_X86_FEATURE_2_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 1, ++ GNU_PROPERTY_X86_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2, ++ GNU_PROPERTY_X86_FEATURE_2_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1, + GNU_PROPERTY_HIPROC = 0xdfffffff, + GNU_PROPERTY_LOUSER = 0xe0000000, + GNU_PROPERTY_HIUSER = 0xffffffff +diff --git a/gold/testsuite/gnu_property_a.S b/gold/testsuite/gnu_property_a.S +index 463bc8e52fe..5fbbbc9c4bb 100644 +--- a/gold/testsuite/gnu_property_a.S ++++ b/gold/testsuite/gnu_property_a.S +@@ -1,8 +1,8 @@ + #define NT_GNU_PROPERTY_TYPE_0 5 + + #define GNU_PROPERTY_STACK_SIZE 1 +-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 +-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 ++#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002 ++#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002 + #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 + + #if __SIZEOF_PTRDIFF_T__ == 8 +diff --git a/gold/testsuite/gnu_property_b.S b/gold/testsuite/gnu_property_b.S +index 0c0c038ead1..7028f73d7ab 100644 +--- a/gold/testsuite/gnu_property_b.S ++++ b/gold/testsuite/gnu_property_b.S +@@ -2,8 +2,8 @@ + + #define GNU_PROPERTY_STACK_SIZE 1 + #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 +-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 +-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 ++#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002 ++#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002 + #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 + + #if __SIZEOF_PTRDIFF_T__ == 8 +diff --git a/gold/testsuite/gnu_property_c.S b/gold/testsuite/gnu_property_c.S +index ace159a9a9d..c8cbd8bce28 100644 +--- a/gold/testsuite/gnu_property_c.S ++++ b/gold/testsuite/gnu_property_c.S +@@ -2,8 +2,8 @@ + + #define GNU_PROPERTY_STACK_SIZE 1 + #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 +-#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 +-#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 ++#define GNU_PROPERTY_X86_ISA_1_USED 0xc0010002 ++#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0008002 + #define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 + + #if __SIZEOF_PTRDIFF_T__ == 8 +diff --git a/gold/testsuite/gnu_property_test.sh b/gold/testsuite/gnu_property_test.sh +index 1806d3474cc..a4096005b78 100755 +--- a/gold/testsuite/gnu_property_test.sh ++++ b/gold/testsuite/gnu_property_test.sh +@@ -77,8 +77,8 @@ check_count gnu_property_test.stdout "^ NOTE" 2 + + check gnu_property_test.stdout "stack size: 0x111100" + check gnu_property_test.stdout "no copy on protected" +-check gnu_property_test.stdout "x86 ISA used: i486, SSE2, SSE4_2, AVX512CD" +-check gnu_property_test.stdout "x86 ISA needed: i486, SSE2, SSE4_2, AVX512CD" ++check gnu_property_test.stdout "x86 ISA used: x86-64-v2, , , " ++check gnu_property_test.stdout "x86 ISA needed: x86-64-v2, , , " + check gnu_property_test.stdout "x86 feature: IBT" + + exit 0 +diff --git a/gold/x86_64.cc b/gold/x86_64.cc +index 9cb2cf0a322..378bac16f78 100644 +--- a/gold/x86_64.cc ++++ b/gold/x86_64.cc +@@ -706,8 +706,9 @@ class Target_x86_64 : public Sized_target + rela_irelative_(NULL), copy_relocs_(elfcpp::R_X86_64_COPY), + got_mod_index_offset_(-1U), tlsdesc_reloc_info_(), + tls_base_symbol_defined_(false), isa_1_used_(0), isa_1_needed_(0), +- feature_1_(0), object_isa_1_used_(0), object_feature_1_(0), +- seen_first_object_(false) ++ feature_1_(0), feature_2_used_(0), feature_2_needed_(0), ++ object_isa_1_used_(0), object_feature_1_(0), ++ object_feature_2_used_(0), seen_first_object_(false) + { } + + // Hook for a new output section. +@@ -1382,6 +1383,8 @@ class Target_x86_64 : public Sized_target + uint32_t isa_1_used_; + uint32_t isa_1_needed_; + uint32_t feature_1_; ++ uint32_t feature_2_used_; ++ uint32_t feature_2_needed_; + // Target-specific properties from the current object. + // These bits get ORed into ISA_1_USED_ after all properties for the object + // have been processed. But if either is all zeroes (as when the property +@@ -1391,6 +1394,7 @@ class Target_x86_64 : public Sized_target + // These bits get ANDed into FEATURE_1_ after all properties for the object + // have been processed. + uint32_t object_feature_1_; ++ uint32_t object_feature_2_used_; + // Whether we have seen our first object, for use in initializing FEATURE_1_. + bool seen_first_object_; + }; +@@ -1594,9 +1598,15 @@ Target_x86_64::record_gnu_property( + + switch (pr_type) + { ++ case elfcpp::GNU_PROPERTY_X86_COMPAT_ISA_1_USED: ++ case elfcpp::GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED: ++ case elfcpp::GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED: ++ case elfcpp::GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED: + case elfcpp::GNU_PROPERTY_X86_ISA_1_USED: + case elfcpp::GNU_PROPERTY_X86_ISA_1_NEEDED: + case elfcpp::GNU_PROPERTY_X86_FEATURE_1_AND: ++ case elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED: ++ case elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED: + if (pr_datasz != 4) + { + gold_warning(_("%s: corrupt .note.gnu.property section " +@@ -1625,6 +1635,12 @@ Target_x86_64::record_gnu_property( + // If we see multiple feature props in one object, OR them together. + this->object_feature_1_ |= val; + break; ++ case elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED: ++ this->object_feature_2_used_ |= val; ++ break; ++ case elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED: ++ this->feature_2_needed_ |= val; ++ break; + } + } + +@@ -1642,15 +1658,23 @@ Target_x86_64::merge_gnu_properties(const Object*) + else if (this->isa_1_used_ != 0) + this->isa_1_used_ |= this->object_isa_1_used_; + this->feature_1_ &= this->object_feature_1_; ++ // If any object is missing the FEATURE_2_USED property, we must ++ // omit it from the output file. ++ if (this->object_feature_2_used_ == 0) ++ this->feature_2_used_ = 0; ++ else if (this->feature_2_used_ != 0) ++ this->feature_2_used_ |= this->object_feature_2_used_; + } + else + { + this->isa_1_used_ = this->object_isa_1_used_; + this->feature_1_ = this->object_feature_1_; ++ this->feature_2_used_ = this->object_feature_2_used_; + this->seen_first_object_ = true; + } + this->object_isa_1_used_ = 0; + this->object_feature_1_ = 0; ++ this->object_feature_2_used_ = 0; + } + + static inline void +@@ -1676,6 +1700,12 @@ Target_x86_64::do_finalize_gnu_properties(Layout* layout) const + if (this->feature_1_ != 0) + add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_1_AND, + this->feature_1_); ++ if (this->feature_2_used_ != 0) ++ add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_2_USED, ++ this->feature_2_used_); ++ if (this->feature_2_needed_ != 0) ++ add_property(layout, elfcpp::GNU_PROPERTY_X86_FEATURE_2_NEEDED, ++ this->feature_2_needed_); + } + + // Write the first three reserved words of the .got.plt section. +-- +2.27.0 +