diff options
author | Ian Lance Taylor <ian@airs.com> | 2011-06-17 13:31:33 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2011-06-17 13:31:33 +0000 |
commit | 534b4e5f33e3ca020d31835860dc6aa4943668f7 (patch) | |
tree | 34d6a5d85cc22088bb00d6f7cd636f39f91f9107 | |
parent | 10b4f10252b11483486df1be14037c1dd4c554bb (diff) | |
download | gdb-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.
-rw-r--r-- | gold/ChangeLog | 6 | ||||
-rw-r--r-- | gold/resolve.cc | 18 |
2 files changed, 22 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 0501ec3..4a072a8 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,11 @@ 2011-06-17 Ian Lance Taylor <iant@google.com> + 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. + +2011-06-17 Ian Lance Taylor <iant@google.com> + PR gold/12880 * layout.h (class Layout): Add interp_segment_ field. * layout.cc (Layout::Layout): Initialize interp_segment_ field. 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) |