This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: Don't crash overriding with versioned alias


One of the issues in PR 12525 is about a weak alias S1 to a symbol S2,
where both S1 and S2 are versioned symbols, and the versions are
different.  Instead of handling this correctly, gold was crashing.  This
patch fixes the problem and includes a test case.  The change to
dynobj.cc fixes a case where gold was crashing in an erroneous case; I
noticed this while trying to track down the real problem.  Committed to
mainline.

Ian


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.


Index: dynobj.cc
===================================================================
RCS file: /cvs/src/src/gold/dynobj.cc,v
retrieving revision 1.62
diff -u -p -r1.62 dynobj.cc
--- dynobj.cc	12 Apr 2011 00:44:47 -0000	1.62
+++ dynobj.cc	2 Jul 2011 05:25:11 -0000
@@ -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_ta
   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_ta
 // 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, con
       // 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: dynobj.h
===================================================================
RCS file: /cvs/src/src/gold/dynobj.h,v
retrieving revision 1.45
diff -u -p -r1.45 dynobj.h
--- dynobj.h	2 Jun 2011 13:43:21 -0000	1.45
+++ dynobj.h	2 Jul 2011 05:25:11 -0000
@@ -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: resolve.cc
===================================================================
RCS file: /cvs/src/src/gold/resolve.cc,v
retrieving revision 1.60
diff -u -p -r1.60 resolve.cc
--- resolve.cc	17 Jun 2011 13:31:33 -0000	1.60
+++ resolve.cc	2 Jul 2011 05:25:12 -0000
@@ -887,7 +887,8 @@ Symbol_table::should_override_with_speci
 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
       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: testsuite/Makefile.am
===================================================================
RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v
retrieving revision 1.170
diff -u -p -r1.170 Makefile.am
--- testsuite/Makefile.am	2 Jul 2011 00:39:13 -0000	1.170
+++ testsuite/Makefile.am	2 Jul 2011 05:25:12 -0000
@@ -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
 	$(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: testsuite/weak_alias_test.script
===================================================================
RCS file: testsuite/weak_alias_test.script
diff -N testsuite/weak_alias_test.script
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/weak_alias_test.script	2 Jul 2011 05:25:13 -0000
@@ -0,0 +1,8 @@
+VER1 {
+  global:
+    versioned_symbol;
+};
+VER2 {
+  global:
+    versioned_alias;
+};
Index: testsuite/weak_alias_test_5.cc
===================================================================
RCS file: testsuite/weak_alias_test_5.cc
diff -N testsuite/weak_alias_test_5.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/weak_alias_test_5.cc	2 Jul 2011 05:25:13 -0000
@@ -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: testsuite/weak_alias_test_main.cc
===================================================================
RCS file: /cvs/src/src/gold/testsuite/weak_alias_test_main.cc,v
retrieving revision 1.1
diff -u -p -r1.1 weak_alias_test_main.cc
--- testsuite/weak_alias_test_main.cc	9 Apr 2008 22:45:08 -0000	1.1
+++ testsuite/weak_alias_test_main.cc	2 Jul 2011 05:25:13 -0000
@@ -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());
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]