aboutsummaryrefslogtreecommitdiff
path: root/gold/resolve.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2011-06-17 13:31:33 +0000
committerIan Lance Taylor <ian@airs.com>2011-06-17 13:31:33 +0000
commit534b4e5f33e3ca020d31835860dc6aa4943668f7 (patch)
tree34d6a5d85cc22088bb00d6f7cd636f39f91f9107 /gold/resolve.cc
parent10b4f10252b11483486df1be14037c1dd4c554bb (diff)
downloadgdb-534b4e5f33e3ca020d31835860dc6aa4943668f7.zip
gdb-534b4e5f33e3ca020d31835860dc6aa4943668f7.tar.gz
gdb-534b4e5f33e3ca020d31835860dc6aa4943668f7.tar.bz2
PR gold/12893
* resolve.cc (Symbol_table::resolve): Don't give an error if a symbol is redefined with the exact same object and value.
Diffstat (limited to 'gold/resolve.cc')
-rw-r--r--gold/resolve.cc18
1 files changed, 16 insertions, 2 deletions
diff --git a/gold/resolve.cc b/gold/resolve.cc
index fd0fea6..71d5109 100644
--- a/gold/resolve.cc
+++ b/gold/resolve.cc
@@ -1,6 +1,6 @@
// resolve.cc -- symbol resolution for gold
-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@@ -245,6 +245,21 @@ Symbol_table::resolve(Sized_symbol<size>* to,
unsigned int orig_st_shndx,
Object* object, const char* version)
{
+ // 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
+ && is_ordinary
+ && to->is_defined()
+ && to->shndx(&to_is_ordinary) == st_shndx
+ && to_is_ordinary
+ && to->value() == sym.get_st_value())
+ return;
+
if (parameters->target().has_resolve())
{
Sized_target<size, big_endian>* sized_target;
@@ -306,7 +321,6 @@ Symbol_table::resolve(Sized_symbol<size>* to,
// inline and the other is not. (Note: not all ODR violations can
// be found this way, and not everything this finds is an ODR
// violation. But it's helpful to warn about.)
- bool to_is_ordinary;
if (parameters->options().detect_odr_violations()
&& (sym.get_st_bind() == elfcpp::STB_WEAK
|| to->binding() == elfcpp::STB_WEAK)