PR gold/12525
authorIan Lance Taylor <ian@airs.com>
Sat, 2 Jul 2011 05:30:00 +0000 (05:30 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 2 Jul 2011 05:30:00 +0000 (05:30 +0000)
PR gold/12952
* resolve.cc (Symbol::override_base_with_special): Don't override
the version if the overriding symbol has a different name.
* dynobj.cc (Versions::add_def): Add dynpool parameter.  Change
all callers.  If we give an error about an undefined version,
define the base version if necessary.
* dynobj.h (class Versions): Update declaration.
* testsuite/weak_alias_test_5.cc: New file.
* testsuite/weak_alias_test.script: New file.
* testsuite/weak_alias_test_main.cc: Check that versioned_symbol
and versioned_alias have the right value, and call t2.
* testsuite/Makefile.am (weak_alias_test_DEPENDENCIES): Add
weak_alias_test_5.so.
(weak_alias_test_LDADD): Likewise.
(weak_alias_test_5_pic.o, weak_alias_test_5.so): New targets.
* testsuite/Makefile.in: Rebuild.

gold/ChangeLog
gold/dynobj.cc
gold/dynobj.h
gold/resolve.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/weak_alias_test.script [new file with mode: 0644]
gold/testsuite/weak_alias_test_5.cc [new file with mode: 0644]
gold/testsuite/weak_alias_test_main.cc

index a744cfa5f72d0ca8586910b8b704ba1e3387d74c..28ade01341b7012dd4910e0ec2b287dc5f27e30f 100644 (file)
@@ -1,3 +1,23 @@
+2011-07-01  Ian Lance Taylor  <iant@google.com>
+
+       PR gold/12525
+       PR gold/12952
+       * resolve.cc (Symbol::override_base_with_special): Don't override
+       the version if the overriding symbol has a different name.
+       * dynobj.cc (Versions::add_def): Add dynpool parameter.  Change
+       all callers.  If we give an error about an undefined version,
+       define the base version if necessary.
+       * dynobj.h (class Versions): Update declaration.
+       * testsuite/weak_alias_test_5.cc: New file.
+       * testsuite/weak_alias_test.script: New file.
+       * testsuite/weak_alias_test_main.cc: Check that versioned_symbol
+       and versioned_alias have the right value, and call t2.
+       * testsuite/Makefile.am (weak_alias_test_DEPENDENCIES): Add
+       weak_alias_test_5.so.
+       (weak_alias_test_LDADD): Likewise.
+       (weak_alias_test_5_pic.o, weak_alias_test_5.so): New targets.
+       * testsuite/Makefile.in: Rebuild.
+
 2011-07-01  Ian Lance Taylor  <iant@google.com>
 
        PR gold/12525
index 8ddb3f7f4e03b017501f6c8a5d2c5b5c9818a548..4404a35dd484e209dc3aa9ccf6f63bb264cda295 100644 (file)
@@ -1,6 +1,6 @@
 // dynobj.cc -- dynamic object support 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.
@@ -1483,7 +1483,7 @@ Versions::record_version(const Symbol_table* symtab,
   if (!sym->is_from_dynobj() && !sym->is_copied_from_dynobj())
     {
       if (parameters->options().shared())
-        this->add_def(sym, version, version_key);
+        this->add_def(dynpool, sym, version, version_key);
     }
   else
     {
@@ -1496,7 +1496,7 @@ Versions::record_version(const Symbol_table* symtab,
 // We've found a symbol SYM defined in version VERSION.
 
 void
-Versions::add_def(const Symbol* sym, const char* version,
+Versions::add_def(Stringpool* dynpool, const Symbol* sym, const char* version,
                  Stringpool::Key version_key)
 {
   Key k(version_key, 0);
@@ -1520,8 +1520,12 @@ Versions::add_def(const Symbol* sym, const char* version,
       // find a definition of a symbol with a version which is not
       // in the version script.
       if (parameters->options().shared())
-       gold_error(_("symbol %s has undefined version %s"),
-                  sym->demangled_name().c_str(), version);
+       {
+         gold_error(_("symbol %s has undefined version %s"),
+                    sym->demangled_name().c_str(), version);
+         if (this->needs_base_version_)
+           this->define_base_version(dynpool);
+       }
       else
        // We only insert a base version for shared library.
        gold_assert(!this->needs_base_version_);
index 1f3243f25d9f1e7b927efbe9560c3194d81c436a..186b67cf7ecfbd07840ab6525cd49d2f28c7fccc 100644 (file)
@@ -599,7 +599,8 @@ class Versions
 
   // Handle a symbol SYM defined with version VERSION.
   void
-  add_def(const Symbol* sym, const char* version, Stringpool::Key);
+  add_def(Stringpool*, const Symbol* sym, const char* version,
+         Stringpool::Key);
 
   // Add a reference to version NAME in file FILENAME.
   void
index 71d51097351e4e9fd9dbdbc1fdd1c2aa73d0a3f3..8850a3d46aa14bd215798380a41be387c71c344e 100644 (file)
@@ -887,7 +887,8 @@ Symbol_table::should_override_with_special(const Symbol* to, Defined defined)
 void
 Symbol::override_base_with_special(const Symbol* from)
 {
-  gold_assert(this->name_ == from->name_ || this->has_alias());
+  bool same_name = this->name_ == from->name_;
+  gold_assert(same_name || this->has_alias());
 
   this->source_ = from->source_;
   switch (from->source_)
@@ -909,7 +910,8 @@ Symbol::override_base_with_special(const Symbol* from)
       break;
     }
 
-  this->override_version(from->version_);
+  if (same_name)
+    this->override_version(from->version_);
   this->type_ = from->type_;
   this->binding_ = from->binding_;
   this->override_visibility(from->visibility_);
index 31b39be2ee5e3ad9df3333b538b9be1013d1b8e2..2b90057c17361293a3670d04c1611bcbf6ea65b5 100644 (file)
@@ -631,11 +631,11 @@ check_PROGRAMS += weak_alias_test
 weak_alias_test_SOURCES = weak_alias_test_main.cc
 weak_alias_test_DEPENDENCIES = \
        gcctestdir/ld weak_alias_test_1.so weak_alias_test_2.so \
-       weak_alias_test_3.o weak_alias_test_4.so
+       weak_alias_test_3.o weak_alias_test_4.so weak_alias_test_5.so
 weak_alias_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
 weak_alias_test_LDADD = \
        weak_alias_test_1.so weak_alias_test_2.so weak_alias_test_3.o \
-       weak_alias_test_4.so
+       weak_alias_test_4.so weak_alias_test_5.so
 weak_alias_test_1_pic.o: weak_alias_test_1.cc
        $(CXXCOMPILE) -c -fpic -o $@ $<
 weak_alias_test_1.so: weak_alias_test_1_pic.o gcctestdir/ld
@@ -650,6 +650,11 @@ weak_alias_test_4_pic.o: weak_alias_test_4.cc
        $(CXXCOMPILE) -c -fpic -o $@ $<
 weak_alias_test_4.so: weak_alias_test_4_pic.o gcctestdir/ld
        $(CXXLINK) -Bgcctestdir/ -shared weak_alias_test_4_pic.o
+weak_alias_test_5_pic.o: weak_alias_test_5.cc
+       $(CXXCOMPILE) -c -fpic -o $@ $<
+weak_alias_test_5.so: weak_alias_test_5_pic.o $(srcdir)/weak_alias_test.script gcctestdir/ld
+       $(CXXLINK) -Bgcctestdir/ -shared weak_alias_test_5_pic.o \
+               -Wl,--version-script,$(srcdir)/weak_alias_test.script
 
 check_SCRIPTS += weak_plt.sh
 check_PROGRAMS += weak_plt
index f48a9b1414b8ba4c8f0d8dc386061d19bb2fb48b..2dab4c3a95989390b0e37db2e90ec2badbda7963 100644 (file)
@@ -2077,12 +2077,12 @@ LDADD = libgoldtest.a ../libgold.a ../../libiberty/libiberty.a $(LIBINTL) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_SOURCES = weak_alias_test_main.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_DEPENDENCIES = \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ gcctestdir/ld weak_alias_test_1.so weak_alias_test_2.so \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_alias_test_3.o weak_alias_test_4.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_alias_test_3.o weak_alias_test_4.so weak_alias_test_5.so
 
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_LDADD = \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_alias_test_1.so weak_alias_test_2.so weak_alias_test_3.o \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_alias_test_4.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_alias_test_4.so weak_alias_test_5.so
 
 @GCC_TRUE@@NATIVE_LINKER_TRUE@copy_test_SOURCES = copy_test.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@copy_test_DEPENDENCIES = gcctestdir/ld copy_test_1.so copy_test_2.so
@@ -4169,6 +4169,11 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_4.so: weak_alias_test_4_pic.o gcctestdir/ld
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared weak_alias_test_4_pic.o
+@GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_5_pic.o: weak_alias_test_5.cc
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@weak_alias_test_5.so: weak_alias_test_5_pic.o $(srcdir)/weak_alias_test.script gcctestdir/ld
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared weak_alias_test_5_pic.o \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@         -Wl,--version-script,$(srcdir)/weak_alias_test.script
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_plt_main_pic.o: weak_plt_main.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
 @GCC_TRUE@@NATIVE_LINKER_TRUE@weak_plt: weak_plt_main_pic.o gcctestdir/ld
diff --git a/gold/testsuite/weak_alias_test.script b/gold/testsuite/weak_alias_test.script
new file mode 100644 (file)
index 0000000..1911631
--- /dev/null
@@ -0,0 +1,8 @@
+VER1 {
+  global:
+    versioned_symbol;
+};
+VER2 {
+  global:
+    versioned_alias;
+};
diff --git a/gold/testsuite/weak_alias_test_5.cc b/gold/testsuite/weak_alias_test_5.cc
new file mode 100644 (file)
index 0000000..df48092
--- /dev/null
@@ -0,0 +1,39 @@
+// weak_alias_test_5.cc -- test versioned weak aliases for gold
+
+// Copyright 2011 Free Software Foundation, Inc.
+// Written by Ian Lance Taylor <iant@google.com>.
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// Define a versioned symbol.
+int versioned_symbol = 1;
+__asm__(".symver versioned_symbol,versioned_symbol@@VER1");
+
+// Define a weak alias for the versioned symbol, with a different version.
+extern int versioned_alias __attribute__ ((weak, alias("versioned_symbol")));
+__asm__(".symver versioned_alias,versioned_alias@@VER2");
+
+bool
+t2()
+{
+  if (versioned_symbol != 1)
+    return false;
+  if (versioned_alias != 1)
+    return false;
+  return true;
+}
index 070eb2f65cd21def7bb357137526c4c393e3d991..e3f86207e6aac772f27b4c91c162a7126a55f6e2 100644 (file)
@@ -39,7 +39,12 @@ int weak_aliased_2 = 6;
 extern int strong_aliased_3;
 extern int weak_aliased_4;
 
+// Defined in weak_alias_test_5.cc
+extern int versioned_symbol;
+extern int versioned_alias;
+
 extern bool t1();
+extern bool t2();
 
 int
 main()
@@ -64,4 +69,12 @@ main()
 
   // Make sure the symbols look right from a shared library.
   assert(t1());
+
+  // versioned_symbol comes from weak_alias_test_5.cc.
+  assert(versioned_symbol == 1);
+  // So does versioned_alias.
+  assert(versioned_alias == 1);
+
+  // Make sure the versioned symbols look right from a shared library.
+  assert(t2());
 }