PR gold/12893
authorIan Lance Taylor <ian@airs.com>
Fri, 17 Jun 2011 13:31:33 +0000 (13:31 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 17 Jun 2011 13:31:33 +0000 (13:31 +0000)
* resolve.cc (Symbol_table::resolve): Don't give an error if a
symbol is redefined with the exact same object and value.

gold/ChangeLog
gold/resolve.cc

index 0501ec3fc7f8524e9bffbe9eaebeefab9d11c2a4..4a072a80396e7a0c8006608985a850b90a14caaa 100644 (file)
@@ -1,3 +1,9 @@
+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
index fd0fea6b13a5b4005a2ae30c1e39cb4d3c1bdb30..71d51097351e4e9fd9dbdbc1fdd1c2aa73d0a3f3 100644 (file)
@@ -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)