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 if only TLS symbol is undefined


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.


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();

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