public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* gold patch committed: Don't crash if only TLS symbol is undefined
@ 2011-07-09  5:11 Ian Lance Taylor
  0 siblings, 0 replies; only message in thread
From: Ian Lance Taylor @ 2011-07-09  5:11 UTC (permalink / raw)
  To: binutils

[-- Attachment #1: Type: text/plain, Size: 582 bytes --]

This gold patch slightly extends the last patch to avoid crashing if the
only TLS symbol in the link is an undefined reference.  Committed to
mainline.

Ian


2011-07-08  Ian Lance Taylor  <iant@google.com>

	PR gold/11317
	* target-reloc.h (issue_undefined_symbol_error): New inline
	function, broken out of relocate_section.
	(relocate_section): Call issue_undefined_symbol_error.
	* i386.cc (Target_i386::Relocate::relocate_tls): Don't crash if
	there is no TLS segment if we are about to issue an undefined
	symbol error.
	* x86_64.cc (Target_x86_64::relocate_tls): Likewise.



[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 8952 bytes --]

Index: i386.cc
===================================================================
RCS file: /cvs/src/src/gold/i386.cc,v
retrieving revision 1.137
diff -u -p -r1.137 i386.cc
--- i386.cc	8 Jul 2011 23:49:11 -0000	1.137
+++ i386.cc	9 Jul 2011 00:45:11 -0000
@@ -2640,7 +2640,8 @@ Target_i386::Relocate::relocate_tls(cons
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_gd_to_le(relinfo, relnum, tls_segment,
@@ -2670,7 +2671,8 @@ Target_i386::Relocate::relocate_tls(cons
 	    {
 	      if (tls_segment == NULL)
 		{
-		  gold_assert(parameters->errors()->error_count() > 0);
+		  gold_assert(parameters->errors()->error_count() > 0
+			      || issue_undefined_symbol_error(gsym));
 		  return;
 		}
 	      this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
@@ -2697,7 +2699,8 @@ Target_i386::Relocate::relocate_tls(cons
         {
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_desc_gd_to_le(relinfo, relnum, tls_segment,
@@ -2736,7 +2739,8 @@ Target_i386::Relocate::relocate_tls(cons
 	    {
 	      if (tls_segment == NULL)
 		{
-		  gold_assert(parameters->errors()->error_count() > 0);
+		  gold_assert(parameters->errors()->error_count() > 0
+			      || issue_undefined_symbol_error(gsym));
 		  return;
 		}
 	      this->tls_desc_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
@@ -2772,7 +2776,8 @@ Target_i386::Relocate::relocate_tls(cons
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_ld_to_le(relinfo, relnum, tls_segment, rel, r_type,
@@ -2807,7 +2812,8 @@ Target_i386::Relocate::relocate_tls(cons
 	    {
 	      if (tls_segment == NULL)
 		{
-		  gold_assert(parameters->errors()->error_count() > 0);
+		  gold_assert(parameters->errors()->error_count() > 0
+			      || issue_undefined_symbol_error(gsym));
 		  return;
 		}
 	      value -= tls_segment->memsz();
@@ -2823,7 +2829,8 @@ Target_i386::Relocate::relocate_tls(cons
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  Target_i386::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment,
@@ -2871,7 +2878,8 @@ Target_i386::Relocate::relocate_tls(cons
         {
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
           value -= tls_segment->memsz();
@@ -2886,7 +2894,8 @@ Target_i386::Relocate::relocate_tls(cons
         {
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
           value = tls_segment->memsz() - value;
Index: target-reloc.h
===================================================================
RCS file: /cvs/src/src/gold/target-reloc.h,v
retrieving revision 1.47
diff -u -p -r1.47 target-reloc.h
--- target-reloc.h	24 May 2011 21:41:10 -0000	1.47
+++ target-reloc.h	9 Jul 2011 00:45:11 -0000
@@ -1,6 +1,6 @@
 // target-reloc.h -- target specific relocation support  -*- 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.
@@ -169,6 +169,22 @@ visibility_error(const Symbol* sym)
 	     v, sym->name());
 }
 
+// Return true if we are should issue an error saying that SYM is an
+// undefined symbol.  This is called if there is a relocation against
+// SYM.
+
+inline bool
+issue_undefined_symbol_error(const Symbol* sym)
+{
+  return (sym != NULL
+	  && (sym->is_undefined() || sym->is_placeholder())
+	  && sym->binding() != elfcpp::STB_WEAK
+	  && !sym->is_defined_in_discarded_section()
+	  && !parameters->target().is_defined_by_abi(sym)
+	  && (!parameters->options().shared()
+	      || parameters->options().defs()));
+}
+
 // This function implements the generic part of relocation processing.
 // The template parameter Relocate must be a class type which provides
 // a single function, relocate(), which implements the machine
@@ -344,13 +360,7 @@ relocate_section(
 	  continue;
 	}
 
-      if (sym != NULL
-	  && (sym->is_undefined() || sym->is_placeholder())
-	  && sym->binding() != elfcpp::STB_WEAK
-	  && !is_defined_in_discarded_section
-          && !target->is_defined_by_abi(sym)
-	  && (!parameters->options().shared()       // -shared
-              || parameters->options().defs()))     // -z defs
+      if (issue_undefined_symbol_error(sym))
 	gold_undefined_symbol_at_location(sym, relinfo, i, offset);
       else if (sym != NULL
 	       && sym->visibility() != elfcpp::STV_DEFAULT
Index: x86_64.cc
===================================================================
RCS file: /cvs/src/src/gold/x86_64.cc,v
retrieving revision 1.135
diff -u -p -r1.135 x86_64.cc
--- x86_64.cc	8 Jul 2011 23:49:11 -0000	1.135
+++ x86_64.cc	9 Jul 2011 00:45:11 -0000
@@ -3112,7 +3112,8 @@ Target_x86_64::Relocate::relocate_tls(co
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_gd_to_le(relinfo, relnum, tls_segment,
@@ -3142,7 +3143,8 @@ Target_x86_64::Relocate::relocate_tls(co
             {
 	      if (tls_segment == NULL)
 		{
-		  gold_assert(parameters->errors()->error_count() > 0);
+		  gold_assert(parameters->errors()->error_count() > 0
+			      || issue_undefined_symbol_error(gsym));
 		  return;
 		}
               value = target->got_plt_section()->address() + got_offset;
@@ -3175,7 +3177,8 @@ Target_x86_64::Relocate::relocate_tls(co
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_desc_gd_to_le(relinfo, relnum, tls_segment,
@@ -3214,7 +3217,8 @@ Target_x86_64::Relocate::relocate_tls(co
             {
 	      if (tls_segment == NULL)
 		{
-		  gold_assert(parameters->errors()->error_count() > 0);
+		  gold_assert(parameters->errors()->error_count() > 0
+			      || issue_undefined_symbol_error(gsym));
 		  return;
 		}
               value = target->got_plt_section()->address() + got_offset;
@@ -3250,7 +3254,8 @@ Target_x86_64::Relocate::relocate_tls(co
         {
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  this->tls_ld_to_le(relinfo, relnum, tls_segment, rela, r_type,
@@ -3284,7 +3289,8 @@ Target_x86_64::Relocate::relocate_tls(co
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  value -= tls_segment->memsz();
@@ -3298,7 +3304,8 @@ Target_x86_64::Relocate::relocate_tls(co
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  value -= tls_segment->memsz();
@@ -3311,7 +3318,8 @@ Target_x86_64::Relocate::relocate_tls(co
 	{
 	  if (tls_segment == NULL)
 	    {
-	      gold_assert(parameters->errors()->error_count() > 0);
+	      gold_assert(parameters->errors()->error_count() > 0
+			  || issue_undefined_symbol_error(gsym));
 	      return;
 	    }
 	  Target_x86_64::Relocate::tls_ie_to_le(relinfo, relnum, tls_segment,
@@ -3350,7 +3358,8 @@ Target_x86_64::Relocate::relocate_tls(co
     case elfcpp::R_X86_64_TPOFF32:          // Local-exec
       if (tls_segment == NULL)
 	{
-	  gold_assert(parameters->errors()->error_count() > 0);
+	  gold_assert(parameters->errors()->error_count() > 0
+		      || issue_undefined_symbol_error(gsym));
 	  return;
 	}
       value -= tls_segment->memsz();

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-07-09  0:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-09  5:11 gold patch committed: Don't crash if only TLS symbol is undefined Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).