This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: Don't crash if only TLS symbol is undefined
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Fri, 08 Jul 2011 17:47:57 -0700
- Subject: 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();