diff options
author | Shea Levy <shea@shealevy.com> | 2018-03-19 11:00:41 -0400 |
---|---|---|
committer | Shea Levy <shea@shealevy.com> | 2018-03-20 17:22:10 -0400 |
commit | 1fa4b7149c0d05da44faa7b72014e4817246915f (patch) | |
tree | 27f8718c1581bdca71eaa40ebd4a37b43d9ee815 /pkgs/development/tools/misc | |
parent | 3027bca02aa2ab50393cb9a8924ad73284d2700b (diff) | |
download | nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar.gz nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar.bz2 nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar.lz nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar.xz nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.tar.zst nixlib-1fa4b7149c0d05da44faa7b72014e4817246915f.zip |
binutils: Revert apparently-broken multiple-definition support in gold.
Fixes llvm at least.
Diffstat (limited to 'pkgs/development/tools/misc')
-rw-r--r-- | pkgs/development/tools/misc/binutils/default.nix | 3 | ||||
-rw-r--r-- | pkgs/development/tools/misc/binutils/gold-symbol-visibility.patch | 79 |
2 files changed, 82 insertions, 0 deletions
diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index 830c07330524..ec0a5b4e9eb1 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -58,6 +58,9 @@ stdenv.mkDerivation rec { # override this behavior, forcing ld to search DT_RPATH even when # cross-compiling. ./always-search-rpath.patch + + # https://sourceware.org/bugzilla/show_bug.cgi?id=22868 + ./gold-symbol-visibility.patch ]; outputs = [ "out" "info" "man" ]; diff --git a/pkgs/development/tools/misc/binutils/gold-symbol-visibility.patch b/pkgs/development/tools/misc/binutils/gold-symbol-visibility.patch new file mode 100644 index 000000000000..0fb05a482d1c --- /dev/null +++ b/pkgs/development/tools/misc/binutils/gold-symbol-visibility.patch @@ -0,0 +1,79 @@ +commit 8564af037f5c4c6d2744a89497691359205b2bbc +Author: Shea Levy <shea@shealevy.com> +Date: Mon Mar 19 10:52:40 2018 -0400 + + Revert "Allow multiply-defined absolute symbols when they have the same value." + + This reverts commit 5dc824ed42cd173c1525f5abc76f4091f11a4dbc. + +diff --git a/gold/ChangeLog-2017 b/gold/ChangeLog-2017 +index b2a47710b5..d7ca1b48c0 100644 +--- a/gold/ChangeLog-2017 ++++ b/gold/ChangeLog-2017 +@@ -114,11 +114,6 @@ + (localedir): Define as @localedir@. + (gnulocaledir, gettextsrcdir): Use @datarootdir@. + +-2017-11-28 Cary Coutant <ccoutant@gmail.com> +- +- * resolve.cc (Symbol_table::resolve): Allow multiply-defined absolute +- symbols when they have the same value. +- + 2017-11-28 Cary Coutant <ccoutant@gmail.com> + + * object.h (class Sized_relobj_file): Remove discarded_eh_frame_shndx_. +diff --git a/gold/resolve.cc b/gold/resolve.cc +index 4a5784cf8b..803576bfed 100644 +--- a/gold/resolve.cc ++++ b/gold/resolve.cc +@@ -247,28 +247,18 @@ Symbol_table::resolve(Sized_symbol<size>* to, + Object* object, const char* version, + bool is_default_version) + { +- bool to_is_ordinary; +- const unsigned int to_shndx = to->shndx(&to_is_ordinary); +- + // It's possible for a symbol to be defined in an object file + // using .symver to give it a version, and for there to also be + // a linker script giving that symbol the same version. We + // don't want to give a multiple-definition error for this + // harmless redefinition. ++ bool to_is_ordinary; + if (to->source() == Symbol::FROM_OBJECT + && to->object() == object +- && to->is_defined() + && is_ordinary ++ && to->is_defined() ++ && to->shndx(&to_is_ordinary) == st_shndx + && to_is_ordinary +- && to_shndx == st_shndx +- && to->value() == sym.get_st_value()) +- return; +- +- // Likewise for an absolute symbol defined twice with the same value. +- if (!is_ordinary +- && st_shndx == elfcpp::SHN_ABS +- && !to_is_ordinary +- && to_shndx == elfcpp::SHN_ABS + && to->value() == sym.get_st_value()) + return; + +@@ -360,8 +350,8 @@ Symbol_table::resolve(Sized_symbol<size>* to, + && (sym.get_st_bind() == elfcpp::STB_WEAK + || to->binding() == elfcpp::STB_WEAK) + && orig_st_shndx != elfcpp::SHN_UNDEF ++ && to->shndx(&to_is_ordinary) != elfcpp::SHN_UNDEF + && to_is_ordinary +- && to_shndx != elfcpp::SHN_UNDEF + && sym.get_st_size() != 0 // Ignore weird 0-sized symbols. + && to->symsize() != 0 + && (sym.get_st_type() != to->type() +@@ -372,7 +362,7 @@ Symbol_table::resolve(Sized_symbol<size>* to, + { + Symbol_location fromloc + = { object, orig_st_shndx, static_cast<off_t>(sym.get_st_value()) }; +- Symbol_location toloc = { to->object(), to_shndx, ++ Symbol_location toloc = { to->object(), to->shndx(&to_is_ordinary), + static_cast<off_t>(to->value()) }; + this->candidate_odr_violations_[to->name()].insert(fromloc); + this->candidate_odr_violations_[to->name()].insert(toloc); |