aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/binutils/binutils/aarch64-tls.patch
blob: 6b123ac5156ebc0cfc9dbddf6d3502ec84683d9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
Building WebKit on an aarch64 host will fail:

gold/ld-new: internal error in relocate_tls, at ../../binutils/gold/aarch64.cc:7418

This was a binutils bug, so backport the fix.

https://sourceware.org/bugzilla/show_bug.cgi?id=19353

Upstream-Status: Backport
Signed-off-by: Ross Burton <ross.burton@intel.com>

From d21f123b0ead1806416cf0dafae12bec4cca8920 Mon Sep 17 00:00:00 2001
From: Cary Coutant <ccoutant@gmail.com>
Date: Mon, 11 Jan 2016 23:57:44 -0800
Subject: [PATCH] Fix internal error when applying TLSDESC relocations with no TLS segment.

gold/
	PR gold/19353
	* aarch64.cc (Target_aarch64::relocate_tls): Don't insist that
	we have a TLS segment for GD-to-IE optimization.
	* i386.cc (Target_i386::tls_gd_to_ie): Remove tls_segment parameter.
	Adjust all calls.
	(Target_i386::tls_desc_gd_to_ie): Likewise.
	(Target_i386::relocate_tls): Don't insist that we have a TLS segment
	for TLSDESC GD-to-IE optimizations.
	* x86_64.cc (Target_x86_64::tls_gd_to_ie): Remove tls_segment parameter.
	Adjust all calls.
	(Target_x86_64::tls_desc_gd_to_ie): Likewise.
	(Target_x86_64::relocate_tls): Don't insist that we have a TLS segment
	for TLSDESC GD-to-IE optimizations.
---
 gold/ChangeLog  |   16 ++++++++++++++++
 gold/aarch64.cc |    6 ------
 gold/i386.cc    |   14 ++------------
 gold/x86_64.cc  |   14 ++------------
 4 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index 20f2f4f..5ad061b 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -7422,12 +7422,6 @@ Target_aarch64<size, big_endian>::Relocate::relocate_tls(
 	      }
 	    if (tlsopt == tls::TLSOPT_TO_IE)
 	      {
-		if (tls_segment == NULL)
-		  {
-		    gold_assert(parameters->errors()->error_count() > 0
-				|| issue_undefined_symbol_error(gsym));
-		    return aarch64_reloc_funcs::STATUS_BAD_RELOC;
-		  }
 		return tls_desc_gd_to_ie(relinfo, target, rela, r_type,
 					 view, psymval, got_entry_address,
 					 address);
diff --git a/gold/i386.cc b/gold/i386.cc
index 82886d4..a7168a8 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -668,7 +668,6 @@ class Target_i386 : public Sized_target<32, false>
     // Do a TLS General-Dynamic to Initial-Exec transition.
     inline void
     tls_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
-		 Output_segment* tls_segment,
 		 const elfcpp::Rel<32, false>&, unsigned int r_type,
 		 elfcpp::Elf_types<32>::Elf_Addr value,
 		 unsigned char* view,
@@ -687,7 +686,6 @@ class Target_i386 : public Sized_target<32, false>
     // transition.
     inline void
     tls_desc_gd_to_ie(const Relocate_info<32, false>*, size_t relnum,
-		      Output_segment* tls_segment,
 		      const elfcpp::Rel<32, false>&, unsigned int r_type,
 		      elfcpp::Elf_types<32>::Elf_Addr value,
 		      unsigned char* view,
@@ -3054,7 +3052,7 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
 	    }
 	  if (optimized_type == tls::TLSOPT_TO_IE)
 	    {
-	      this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
+	      this->tls_gd_to_ie(relinfo, relnum, rel, r_type,
 				 got_offset, view, view_size);
 	      break;
 	    }
@@ -3116,13 +3114,7 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
 	    }
 	  if (optimized_type == tls::TLSOPT_TO_IE)
 	    {
-	      if (tls_segment == NULL)
-		{
-		  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,
+	      this->tls_desc_gd_to_ie(relinfo, relnum, rel, r_type,
 				      got_offset, view, view_size);
 	      break;
 	    }
@@ -3354,7 +3346,6 @@ Target_i386::Relocate::tls_gd_to_le(const Relocate_info<32, false>* relinfo,
 inline void
 Target_i386::Relocate::tls_gd_to_ie(const Relocate_info<32, false>* relinfo,
 				    size_t relnum,
-				    Output_segment*,
 				    const elfcpp::Rel<32, false>& rel,
 				    unsigned int,
 				    elfcpp::Elf_types<32>::Elf_Addr value,
@@ -3449,7 +3440,6 @@ inline void
 Target_i386::Relocate::tls_desc_gd_to_ie(
     const Relocate_info<32, false>* relinfo,
     size_t relnum,
-    Output_segment*,
     const elfcpp::Rel<32, false>& rel,
     unsigned int r_type,
     elfcpp::Elf_types<32>::Elf_Addr value,
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 3cfc064..4ad5afc 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -816,7 +816,6 @@ class Target_x86_64 : public Sized_target<size, false>
     // Do a TLS General-Dynamic to Initial-Exec transition.
     inline void
     tls_gd_to_ie(const Relocate_info<size, false>*, size_t relnum,
-		 Output_segment* tls_segment,
 		 const elfcpp::Rela<size, false>&, unsigned int r_type,
 		 typename elfcpp::Elf_types<size>::Elf_Addr value,
 		 unsigned char* view,
@@ -835,7 +834,6 @@ class Target_x86_64 : public Sized_target<size, false>
     // Do a TLSDESC-style General-Dynamic to Initial-Exec transition.
     inline void
     tls_desc_gd_to_ie(const Relocate_info<size, false>*, size_t relnum,
-		      Output_segment* tls_segment,
 		      const elfcpp::Rela<size, false>&, unsigned int r_type,
 		      typename elfcpp::Elf_types<size>::Elf_Addr value,
 		      unsigned char* view,
@@ -3733,7 +3731,7 @@ Target_x86_64<size>::Relocate::relocate_tls(
 	  if (optimized_type == tls::TLSOPT_TO_IE)
 	    {
 	      value = target->got_plt_section()->address() + got_offset;
-	      this->tls_gd_to_ie(relinfo, relnum, tls_segment, rela, r_type,
+	      this->tls_gd_to_ie(relinfo, relnum, rela, r_type,
 				 value, view, address, view_size);
 	      break;
 	    }
@@ -3800,14 +3798,8 @@ Target_x86_64<size>::Relocate::relocate_tls(
 	    }
 	  if (optimized_type == tls::TLSOPT_TO_IE)
 	    {
-	      if (tls_segment == NULL)
-		{
-		  gold_assert(parameters->errors()->error_count() > 0
-			      || issue_undefined_symbol_error(gsym));
-		  return;
-		}
 	      value = target->got_plt_section()->address() + got_offset;
-	      this->tls_desc_gd_to_ie(relinfo, relnum, tls_segment,
+	      this->tls_desc_gd_to_ie(relinfo, relnum,
 				      rela, r_type, value, view, address,
 				      view_size);
 	      break;
@@ -3973,7 +3965,6 @@ inline void
 Target_x86_64<size>::Relocate::tls_gd_to_ie(
     const Relocate_info<size, false>* relinfo,
     size_t relnum,
-    Output_segment*,
     const elfcpp::Rela<size, false>& rela,
     unsigned int,
     typename elfcpp::Elf_types<size>::Elf_Addr value,
@@ -4085,7 +4076,6 @@ inline void
 Target_x86_64<size>::Relocate::tls_desc_gd_to_ie(
     const Relocate_info<size, false>* relinfo,
     size_t relnum,
-    Output_segment*,
     const elfcpp::Rela<size, false>& rela,
     unsigned int r_type,
     typename elfcpp::Elf_types<size>::Elf_Addr value,
-- 
1.7.1