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: Fix race condition


Until now gold released local symbol information after doing all
relocations.  However, when I added support for STT_GNU_IFUNC, it became
possible for there to be an IRELATIVE relocation referring to the value
of a local symbol, which requires the value of the local symbol when
writing out the relocation.  That was not a problem in the normal
unthreaded mode, because the relocations would be written out before the
local values were discarded.  When threading, though, there is no
required ordering between these operations, so it was possible for gold
to attempt to fetch the local symbol value after it had been released,
leading to an assertion failure.  Ths patch fixes the problem by simply
not freeing the local symbol information.  Committed to mainline and
2.21 branch.

Ian


2011-02-09  Ian Lance Taylor  <iant@google.com>

	PR gold/12316
	* object.h (class Sized_relobj): Remove clear_local_symbols.
	* reloc.cc (Sized_relobj::do_relocate): Don't call
	clear_local_symbols.


Index: object.h
===================================================================
RCS file: /cvs/src/src/gold/object.h,v
retrieving revision 1.104
diff -u -r1.104 object.h
--- object.h	14 Dec 2010 19:03:30 -0000	1.104
+++ object.h	10 Feb 2011 01:11:03 -0000
@@ -1,6 +1,6 @@
 // object.h -- support for an object file for linking in gold  -*- C++ -*-
 
-// 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.
@@ -2165,15 +2165,6 @@
 		      Output_symtab_xindex*,
 		      Output_symtab_xindex*);
 
-  // Clear the local symbol information.
-  void
-  clear_local_symbols()
-  {
-    this->local_values_.clear();
-    this->local_got_offsets_.clear();
-    this->local_plt_offsets_.clear();
-  }
-
   // Record a mapping from discarded section SHNDX to the corresponding
   // kept section.
   void
Index: reloc.cc
===================================================================
RCS file: /cvs/src/src/gold/reloc.cc,v
retrieving revision 1.62
diff -u -r1.62 reloc.cc
--- reloc.cc	14 Dec 2010 19:03:30 -0000	1.62
+++ reloc.cc	10 Feb 2011 01:11:03 -0000
@@ -1,6 +1,6 @@
 // reloc.cc -- relocate input files 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.
@@ -685,9 +685,6 @@
   // Write out the local symbols.
   this->write_local_symbols(of, layout->sympool(), layout->dynpool(),
 			    layout->symtab_xindex(), layout->dynsym_xindex());
-
-  // We should no longer need the local symbol values.
-  this->clear_local_symbols();
 }
 
 // Sort a Read_multiple vector by file offset.

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