binutils: Revert apparently-broken multiple-definition support in gold.

Fixes llvm at least.
This commit is contained in:
Shea Levy 2018-03-19 11:00:41 -04:00
parent 3027bca02a
commit 1fa4b7149c
No known key found for this signature in database
GPG Key ID: 5C0BD6957D86FE27
2 changed files with 82 additions and 0 deletions

View File

@ -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" ];

View File

@ -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);