summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2012-09-13 14:59:10 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-09-14 09:50:30 +0100
commit97bb9c5b6776a8cf04125d9293e22d85d78ccc3b (patch)
treea66608be38c66f67694ad1f0027425c8e7d5612d /meta
parent268177e4e64525a3655094b5a835aee62acea622 (diff)
downloadpoky-97bb9c5b6776a8cf04125d9293e22d85d78ccc3b.tar.gz
binutils-2.22: Backport PR fixes from 2.22 branch
These are fixes mainly cherrypicks for mips/ppc/x86 mainly fixing PRs in ld and gold (From OE-Core rev: f098cfc24bae8e0685bcae53ea4fdc3326ddc6c4) Signed-off-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.22.inc16
-rw-r--r--meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch634
-rw-r--r--meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch46
-rw-r--r--meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch139
-rw-r--r--meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch47
-rw-r--r--meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch214
-rw-r--r--meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch1068
-rw-r--r--meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch1944
-rw-r--r--meta/recipes-devtools/binutils/binutils/0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch49
-rw-r--r--meta/recipes-devtools/binutils/binutils/0052-gas.patch83
-rw-r--r--meta/recipes-devtools/binutils/binutils/0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch176
-rw-r--r--meta/recipes-devtools/binutils/binutils/0078-PR-binutils-13622.patch48
-rw-r--r--meta/recipes-devtools/binutils/binutils/0144-timer.cc-include-unistd.h.patch32
-rw-r--r--meta/recipes-devtools/binutils/binutils/0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch169
-rw-r--r--meta/recipes-devtools/binutils/binutils/0182-PR-ld-13991.patch1617
15 files changed, 6281 insertions, 1 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.22.inc b/meta/recipes-devtools/binutils/binutils-2.22.inc
index 821cc555d0..42dc6b78b5 100644
--- a/meta/recipes-devtools/binutils/binutils-2.22.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.22.inc
@@ -1,4 +1,4 @@
1PR = "r15" 1PR = "r16"
2 2
3LIC_FILES_CHKSUM="\ 3LIC_FILES_CHKSUM="\
4 file://src-release;endline=17;md5=4830a9ef968f3b18dd5e9f2c00db2d35\ 4 file://src-release;endline=17;md5=4830a9ef968f3b18dd5e9f2c00db2d35\
@@ -32,6 +32,20 @@ SRC_URI = "\
32 file://mips64-default-ld-emulation.patch \ 32 file://mips64-default-ld-emulation.patch \
33 file://0001-PR-ld-13470.patch \ 33 file://0001-PR-ld-13470.patch \
34 file://rpath-sysroot.patch \ 34 file://rpath-sysroot.patch \
35 file://0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch \
36 file://0019-PR-ld-13468.patch \
37 file://0028-Backport-from-mainline.patch \
38 file://0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \
39 file://0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \
40 file://0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \
41 file://0038-Copy-from-mainline-to-binutils-2.22-branch.patch \
42 file://0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch \
43 file://0052-gas.patch \
44 file://0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch \
45 file://0078-PR-binutils-13622.patch \
46 file://0144-timer.cc-include-unistd.h.patch \
47 file://0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch \
48 file://0182-PR-ld-13991.patch \
35 " 49 "
36 50
37SRC_URI[md5sum] = "ee0f10756c84979622b992a4a61ea3f5" 51SRC_URI[md5sum] = "ee0f10756c84979622b992a4a61ea3f5"
diff --git a/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch b/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch
new file mode 100644
index 0000000000..1baf1e839a
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0006-mips-dis.c-print_insn_micromips-Rename-local-variabl.patch
@@ -0,0 +1,634 @@
1Upstream-Status: Backport
2
3From f72b2c498bc98f42048a3bf7f7d7891db9cabcfc Mon Sep 17 00:00:00 2001
4From: Pierre Muller <muller@ics.u-strasbg.fr>
5Date: Fri, 25 Nov 2011 16:57:32 +0000
6Subject: [PATCH 006/262] * mips-dis.c (print_insn_micromips): Rename
7 local variable iprintf to infprintf to
8 avoid shadow warning.
9
10---
11 opcodes/ChangeLog | 5 ++
12 opcodes/mips-dis.c | 188 ++++++++++++++++++++++++++--------------------------
13 2 files changed, 99 insertions(+), 94 deletions(-)
14
152011-11-25 Pierre Muller <muller@ics.u-strasbg.fr>
16
17 * mips-dis.c (print_insn_micromips): Rename local variable iprintf
18 to infprintf to avoid shadow warning.
19
20diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c
21index 4e18d8a..72285de 100644
22--- a/opcodes/mips-dis.c
23+++ b/opcodes/mips-dis.c
24@@ -2260,7 +2260,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
25 static int
26 print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
27 {
28- const fprintf_ftype iprintf = info->fprintf_func;
29+ const fprintf_ftype infprintf = info->fprintf_func;
30 const struct mips_opcode *op, *opend;
31 unsigned int lsb, msbd, msb;
32 void *is = info->stream;
33@@ -2307,7 +2307,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
34 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
35 if (status != 0)
36 {
37- iprintf (is, "micromips 0x%x", higher);
38+ infprintf (is, "micromips 0x%x", higher);
39 (*info->memory_error_func) (status, memaddr + 2, info);
40 return -1;
41 }
42@@ -2320,7 +2320,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
43 status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info);
44 if (status != 0)
45 {
46- iprintf (is, "micromips 0x%x", higher);
47+ infprintf (is, "micromips 0x%x", higher);
48 (*info->memory_error_func) (status, memaddr + 4, info);
49 return -1;
50 }
51@@ -2328,7 +2328,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
52 insn = bfd_getb16 (buffer);
53 else
54 insn = bfd_getl16 (buffer);
55- iprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
56+ infprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
57
58 info->insn_type = dis_noninsn;
59 return 6;
60@@ -2341,7 +2341,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
61 status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
62 if (status != 0)
63 {
64- iprintf (is, "micromips 0x%x", higher);
65+ infprintf (is, "micromips 0x%x", higher);
66 (*info->memory_error_func) (status, memaddr + 2, info);
67 return -1;
68 }
69@@ -2371,9 +2371,9 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
70 {
71 const char *s;
72
73- iprintf (is, "%s", op->name);
74+ infprintf (is, "%s", op->name);
75 if (op->args[0] != '\0')
76- iprintf (is, "\t");
77+ infprintf (is, "\t");
78
79 for (s = op->args; *s != '\0'; s++)
80 {
81@@ -2382,37 +2382,37 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
82 case ',':
83 case '(':
84 case ')':
85- iprintf (is, "%c", *s);
86+ infprintf (is, "%c", *s);
87 break;
88
89 case '.':
90 delta = GET_OP (insn, OFFSET10);
91 if (delta & 0x200)
92 delta |= ~0x3ff;
93- iprintf (is, "%d", delta);
94+ infprintf (is, "%d", delta);
95 break;
96
97 case '1':
98- iprintf (is, "0x%lx", GET_OP (insn, STYPE));
99+ infprintf (is, "0x%lx", GET_OP (insn, STYPE));
100 break;
101
102 case '<':
103- iprintf (is, "0x%lx", GET_OP (insn, SHAMT));
104+ infprintf (is, "0x%lx", GET_OP (insn, SHAMT));
105 break;
106
107 case '\\':
108- iprintf (is, "0x%lx", GET_OP (insn, 3BITPOS));
109+ infprintf (is, "0x%lx", GET_OP (insn, 3BITPOS));
110 break;
111
112 case '|':
113- iprintf (is, "0x%lx", GET_OP (insn, TRAP));
114+ infprintf (is, "0x%lx", GET_OP (insn, TRAP));
115 break;
116
117 case '~':
118 delta = GET_OP (insn, OFFSET12);
119 if (delta & 0x800)
120 delta |= ~0x7ff;
121- iprintf (is, "%d", delta);
122+ infprintf (is, "%d", delta);
123 break;
124
125 case 'a':
126@@ -2433,34 +2433,34 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
127 case 'r':
128 case 's':
129 case 'v':
130- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
131+ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
132 break;
133
134 case 'c':
135- iprintf (is, "0x%lx", GET_OP (insn, CODE));
136+ infprintf (is, "0x%lx", GET_OP (insn, CODE));
137 break;
138
139 case 'd':
140- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
141+ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
142 break;
143
144 case 'h':
145- iprintf (is, "0x%lx", GET_OP (insn, PREFX));
146+ infprintf (is, "0x%lx", GET_OP (insn, PREFX));
147 break;
148
149 case 'i':
150 case 'u':
151- iprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE));
152+ infprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE));
153 break;
154
155 case 'j': /* Same as i, but sign-extended. */
156 case 'o':
157 delta = (GET_OP (insn, DELTA) ^ 0x8000) - 0x8000;
158- iprintf (is, "%d", delta);
159+ infprintf (is, "%d", delta);
160 break;
161
162 case 'k':
163- iprintf (is, "0x%x", GET_OP (insn, CACHE));
164+ infprintf (is, "0x%x", GET_OP (insn, CACHE));
165 break;
166
167 case 'n':
168@@ -2472,26 +2472,26 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
169 if (s_reg_encode != 0)
170 {
171 if (s_reg_encode == 1)
172- iprintf (is, "%s", mips_gpr_names[16]);
173+ infprintf (is, "%s", mips_gpr_names[16]);
174 else if (s_reg_encode < 9)
175- iprintf (is, "%s-%s",
176+ infprintf (is, "%s-%s",
177 mips_gpr_names[16],
178 mips_gpr_names[15 + s_reg_encode]);
179 else if (s_reg_encode == 9)
180- iprintf (is, "%s-%s,%s",
181+ infprintf (is, "%s-%s,%s",
182 mips_gpr_names[16],
183 mips_gpr_names[23],
184 mips_gpr_names[30]);
185 else
186- iprintf (is, "UNKNOWN");
187+ infprintf (is, "UNKNOWN");
188 }
189
190 if (immed & 0x10) /* For ra. */
191 {
192 if (s_reg_encode == 0)
193- iprintf (is, "%s", mips_gpr_names[31]);
194+ infprintf (is, "%s", mips_gpr_names[31]);
195 else
196- iprintf (is, ",%s", mips_gpr_names[31]);
197+ infprintf (is, ",%s", mips_gpr_names[31]);
198 }
199 break;
200 }
201@@ -2504,32 +2504,32 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
202 break;
203
204 case 'q':
205- iprintf (is, "0x%lx", GET_OP (insn, CODE2));
206+ infprintf (is, "0x%lx", GET_OP (insn, CODE2));
207 break;
208
209 case 't':
210 case 'w':
211- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
212+ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
213 break;
214
215 case 'y':
216- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
217+ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
218 break;
219
220 case 'z':
221- iprintf (is, "%s", mips_gpr_names[0]);
222+ infprintf (is, "%s", mips_gpr_names[0]);
223 break;
224
225 case 'B':
226- iprintf (is, "0x%lx", GET_OP (insn, CODE10));
227+ infprintf (is, "0x%lx", GET_OP (insn, CODE10));
228 break;
229
230 case 'C':
231- iprintf (is, "0x%lx", GET_OP (insn, COPZ));
232+ infprintf (is, "0x%lx", GET_OP (insn, COPZ));
233 break;
234
235 case 'D':
236- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
237+ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
238 break;
239
240 case 'E':
241@@ -2540,7 +2540,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
242 'T' format. Therefore, until we gain understanding of
243 cp2 register names, we can simply print the register
244 numbers. */
245- iprintf (is, "$%ld", GET_OP (insn, RT));
246+ infprintf (is, "$%ld", GET_OP (insn, RT));
247 break;
248
249 case 'G':
250@@ -2559,44 +2559,44 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
251 case 0x000002fc: /* mtc0 */
252 case 0x580000fc: /* dmfc0 */
253 case 0x580002fc: /* dmtc0 */
254- iprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
255+ infprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
256 break;
257 default:
258- iprintf (is, "$%ld", GET_OP (insn, RS));
259+ infprintf (is, "$%ld", GET_OP (insn, RS));
260 break;
261 }
262 break;
263
264 case 'H':
265- iprintf (is, "%ld", GET_OP (insn, SEL));
266+ infprintf (is, "%ld", GET_OP (insn, SEL));
267 break;
268
269 case 'K':
270- iprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
271+ infprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
272 break;
273
274 case 'M':
275- iprintf (is, "$fcc%ld", GET_OP (insn, CCC));
276+ infprintf (is, "$fcc%ld", GET_OP (insn, CCC));
277 break;
278
279 case 'N':
280- iprintf (is,
281+ infprintf (is,
282 (op->pinfo & (FP_D | FP_S)) != 0
283 ? "$fcc%ld" : "$cc%ld",
284 GET_OP (insn, BCC));
285 break;
286
287 case 'R':
288- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
289+ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
290 break;
291
292 case 'S':
293 case 'V':
294- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
295+ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
296 break;
297
298 case 'T':
299- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
300+ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
301 break;
302
303 case '+':
304@@ -2606,18 +2606,18 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
305 {
306 case 'A':
307 lsb = GET_OP (insn, EXTLSB);
308- iprintf (is, "0x%x", lsb);
309+ infprintf (is, "0x%x", lsb);
310 break;
311
312 case 'B':
313 msb = GET_OP (insn, INSMSB);
314- iprintf (is, "0x%x", msb - lsb + 1);
315+ infprintf (is, "0x%x", msb - lsb + 1);
316 break;
317
318 case 'C':
319 case 'H':
320 msbd = GET_OP (insn, EXTMSBD);
321- iprintf (is, "0x%x", msbd + 1);
322+ infprintf (is, "0x%x", msbd + 1);
323 break;
324
325 case 'D':
326@@ -2637,30 +2637,30 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
327 mips_cp0sel_names_len,
328 cp0reg, sel);
329 if (n != NULL)
330- iprintf (is, "%s", n->name);
331+ infprintf (is, "%s", n->name);
332 else
333- iprintf (is, "$%d,%d", cp0reg, sel);
334+ infprintf (is, "$%d,%d", cp0reg, sel);
335 break;
336 }
337
338 case 'E':
339 lsb = GET_OP (insn, EXTLSB) + 32;
340- iprintf (is, "0x%x", lsb);
341+ infprintf (is, "0x%x", lsb);
342 break;
343
344 case 'F':
345 msb = GET_OP (insn, INSMSB) + 32;
346- iprintf (is, "0x%x", msb - lsb + 1);
347+ infprintf (is, "0x%x", msb - lsb + 1);
348 break;
349
350 case 'G':
351 msbd = GET_OP (insn, EXTMSBD) + 32;
352- iprintf (is, "0x%x", msbd + 1);
353+ infprintf (is, "0x%x", msbd + 1);
354 break;
355
356 default:
357 /* xgettext:c-format */
358- iprintf (is,
359+ infprintf (is,
360 _("# internal disassembler error, "
361 "unrecognized modifier (+%c)"),
362 *s);
363@@ -2674,111 +2674,111 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
364 switch (*s)
365 {
366 case 'a': /* global pointer. */
367- iprintf (is, "%s", mips_gpr_names[28]);
368+ infprintf (is, "%s", mips_gpr_names[28]);
369 break;
370
371 case 'b':
372 regno = micromips_to_32_reg_b_map[GET_OP (insn, MB)];
373- iprintf (is, "%s", mips_gpr_names[regno]);
374+ infprintf (is, "%s", mips_gpr_names[regno]);
375 break;
376
377 case 'c':
378 regno = micromips_to_32_reg_c_map[GET_OP (insn, MC)];
379- iprintf (is, "%s", mips_gpr_names[regno]);
380+ infprintf (is, "%s", mips_gpr_names[regno]);
381 break;
382
383 case 'd':
384 regno = micromips_to_32_reg_d_map[GET_OP (insn, MD)];
385- iprintf (is, "%s", mips_gpr_names[regno]);
386+ infprintf (is, "%s", mips_gpr_names[regno]);
387 break;
388
389 case 'e':
390 regno = micromips_to_32_reg_e_map[GET_OP (insn, ME)];
391- iprintf (is, "%s", mips_gpr_names[regno]);
392+ infprintf (is, "%s", mips_gpr_names[regno]);
393 break;
394
395 case 'f':
396 /* Save lastregno for "mt" to print out later. */
397 lastregno = micromips_to_32_reg_f_map[GET_OP (insn, MF)];
398- iprintf (is, "%s", mips_gpr_names[lastregno]);
399+ infprintf (is, "%s", mips_gpr_names[lastregno]);
400 break;
401
402 case 'g':
403 regno = micromips_to_32_reg_g_map[GET_OP (insn, MG)];
404- iprintf (is, "%s", mips_gpr_names[regno]);
405+ infprintf (is, "%s", mips_gpr_names[regno]);
406 break;
407
408 case 'h':
409 regno = micromips_to_32_reg_h_map[GET_OP (insn, MH)];
410- iprintf (is, "%s", mips_gpr_names[regno]);
411+ infprintf (is, "%s", mips_gpr_names[regno]);
412 break;
413
414 case 'i':
415 regno = micromips_to_32_reg_i_map[GET_OP (insn, MI)];
416- iprintf (is, "%s", mips_gpr_names[regno]);
417+ infprintf (is, "%s", mips_gpr_names[regno]);
418 break;
419
420 case 'j':
421- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
422+ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
423 break;
424
425 case 'l':
426 regno = micromips_to_32_reg_l_map[GET_OP (insn, ML)];
427- iprintf (is, "%s", mips_gpr_names[regno]);
428+ infprintf (is, "%s", mips_gpr_names[regno]);
429 break;
430
431 case 'm':
432 regno = micromips_to_32_reg_m_map[GET_OP (insn, MM)];
433- iprintf (is, "%s", mips_gpr_names[regno]);
434+ infprintf (is, "%s", mips_gpr_names[regno]);
435 break;
436
437 case 'n':
438 regno = micromips_to_32_reg_n_map[GET_OP (insn, MN)];
439- iprintf (is, "%s", mips_gpr_names[regno]);
440+ infprintf (is, "%s", mips_gpr_names[regno]);
441 break;
442
443 case 'p':
444 /* Save lastregno for "mt" to print out later. */
445 lastregno = GET_OP (insn, MP);
446- iprintf (is, "%s", mips_gpr_names[lastregno]);
447+ infprintf (is, "%s", mips_gpr_names[lastregno]);
448 break;
449
450 case 'q':
451 regno = micromips_to_32_reg_q_map[GET_OP (insn, MQ)];
452- iprintf (is, "%s", mips_gpr_names[regno]);
453+ infprintf (is, "%s", mips_gpr_names[regno]);
454 break;
455
456 case 'r': /* program counter. */
457- iprintf (is, "$pc");
458+ infprintf (is, "$pc");
459 break;
460
461 case 's': /* stack pointer. */
462 lastregno = 29;
463- iprintf (is, "%s", mips_gpr_names[29]);
464+ infprintf (is, "%s", mips_gpr_names[29]);
465 break;
466
467 case 't':
468- iprintf (is, "%s", mips_gpr_names[lastregno]);
469+ infprintf (is, "%s", mips_gpr_names[lastregno]);
470 break;
471
472 case 'z': /* $0. */
473- iprintf (is, "%s", mips_gpr_names[0]);
474+ infprintf (is, "%s", mips_gpr_names[0]);
475 break;
476
477 case 'A':
478 /* Sign-extend the immediate. */
479 immed = ((GET_OP (insn, IMMA) ^ 0x40) - 0x40) << 2;
480- iprintf (is, "%d", immed);
481+ infprintf (is, "%d", immed);
482 break;
483
484 case 'B':
485 immed = micromips_imm_b_map[GET_OP (insn, IMMB)];
486- iprintf (is, "%d", immed);
487+ infprintf (is, "%d", immed);
488 break;
489
490 case 'C':
491 immed = micromips_imm_c_map[GET_OP (insn, IMMC)];
492- iprintf (is, "0x%lx", immed);
493+ infprintf (is, "0x%lx", immed);
494 break;
495
496 case 'D':
497@@ -2797,50 +2797,50 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
498
499 case 'F':
500 immed = GET_OP (insn, IMMF);
501- iprintf (is, "0x%x", immed);
502+ infprintf (is, "0x%x", immed);
503 break;
504
505 case 'G':
506 immed = (insn >> MICROMIPSOP_SH_IMMG) + 1;
507 immed = (immed & MICROMIPSOP_MASK_IMMG) - 1;
508- iprintf (is, "%d", immed);
509+ infprintf (is, "%d", immed);
510 break;
511
512 case 'H':
513 immed = GET_OP (insn, IMMH) << 1;
514- iprintf (is, "%d", immed);
515+ infprintf (is, "%d", immed);
516 break;
517
518 case 'I':
519 immed = (insn >> MICROMIPSOP_SH_IMMI) + 1;
520 immed = (immed & MICROMIPSOP_MASK_IMMI) - 1;
521- iprintf (is, "%d", immed);
522+ infprintf (is, "%d", immed);
523 break;
524
525 case 'J':
526 immed = GET_OP (insn, IMMJ) << 2;
527- iprintf (is, "%d", immed);
528+ infprintf (is, "%d", immed);
529 break;
530
531 case 'L':
532 immed = GET_OP (insn, IMML);
533- iprintf (is, "%d", immed);
534+ infprintf (is, "%d", immed);
535 break;
536
537 case 'M':
538 immed = (insn >> MICROMIPSOP_SH_IMMM) - 1;
539 immed = (immed & MICROMIPSOP_MASK_IMMM) + 1;
540- iprintf (is, "%d", immed);
541+ infprintf (is, "%d", immed);
542 break;
543
544 case 'N':
545 immed = GET_OP (insn, IMMN);
546 if (immed == 0)
547- iprintf (is, "%s,%s",
548+ infprintf (is, "%s,%s",
549 mips_gpr_names[16],
550 mips_gpr_names[31]);
551 else
552- iprintf (is, "%s-%s,%s",
553+ infprintf (is, "%s-%s,%s",
554 mips_gpr_names[16],
555 mips_gpr_names[16 + immed],
556 mips_gpr_names[31]);
557@@ -2848,35 +2848,35 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
558
559 case 'O':
560 immed = GET_OP (insn, IMMO);
561- iprintf (is, "0x%x", immed);
562+ infprintf (is, "0x%x", immed);
563 break;
564
565 case 'P':
566 immed = GET_OP (insn, IMMP) << 2;
567- iprintf (is, "%d", immed);
568+ infprintf (is, "%d", immed);
569 break;
570
571 case 'Q':
572 /* Sign-extend the immediate. */
573 immed = (GET_OP (insn, IMMQ) ^ 0x400000) - 0x400000;
574 immed <<= 2;
575- iprintf (is, "%d", immed);
576+ infprintf (is, "%d", immed);
577 break;
578
579 case 'U':
580 immed = GET_OP (insn, IMMU) << 2;
581- iprintf (is, "%d", immed);
582+ infprintf (is, "%d", immed);
583 break;
584
585 case 'W':
586 immed = GET_OP (insn, IMMW) << 2;
587- iprintf (is, "%d", immed);
588+ infprintf (is, "%d", immed);
589 break;
590
591 case 'X':
592 /* Sign-extend the immediate. */
593 immed = (GET_OP (insn, IMMX) ^ 0x8) - 0x8;
594- iprintf (is, "%d", immed);
595+ infprintf (is, "%d", immed);
596 break;
597
598 case 'Y':
599@@ -2885,12 +2885,12 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
600 if (immed >= -2 && immed <= 1)
601 immed ^= 0x100;
602 immed = immed << 2;
603- iprintf (is, "%d", immed);
604+ infprintf (is, "%d", immed);
605 break;
606
607 default:
608 /* xgettext:c-format */
609- iprintf (is,
610+ infprintf (is,
611 _("# internal disassembler error, "
612 "unrecognized modifier (m%c)"),
613 *s);
614@@ -2900,7 +2900,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
615
616 default:
617 /* xgettext:c-format */
618- iprintf (is,
619+ infprintf (is,
620 _("# internal disassembler error, "
621 "unrecognized modifier (%c)"),
622 *s);
623@@ -2937,7 +2937,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
624 }
625 #undef GET_OP
626
627- iprintf (is, "0x%x", insn);
628+ infprintf (is, "0x%x", insn);
629 info->insn_type = dis_noninsn;
630
631 return length;
632--
6331.7.9.5
634
diff --git a/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch b/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch
new file mode 100644
index 0000000000..79d9f48453
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0019-PR-ld-13468.patch
@@ -0,0 +1,46 @@
1Upstream-Status: Backport
2
3From 4c362e4511c4046e230fc9e330bf086753f04338 Mon Sep 17 00:00:00 2001
4From: Alan Modra <amodra@bigpond.net.au>
5Date: Sat, 3 Dec 2011 10:29:17 +0000
6Subject: [PATCH 019/262] PR ld/13468 * elflink.c
7 (bfd_elf_final_link): Don't segfault when checking
8 for DT_TEXTREL and .dynamic does not exist.
9
10---
11 bfd/ChangeLog | 6 ++++++
12 bfd/elflink.c | 9 +++------
13 2 files changed, 9 insertions(+), 6 deletions(-)
14
15 2011-12-03 Alan Modra <amodra@gmail.com>
16
17 PR ld/13468
18 * elflink.c (bfd_elf_final_link): Don't segfault when checking
19 for DT_TEXTREL and .dynamic does not exist.
20
21diff --git a/bfd/elflink.c b/bfd/elflink.c
22index fc4266b..8556cec 100644
23--- a/bfd/elflink.c
24+++ b/bfd/elflink.c
25@@ -11188,15 +11188,12 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
26 goto error_return;
27
28 /* Check for DT_TEXTREL (late, in case the backend removes it). */
29- if ((info->warn_shared_textrel && info->shared)
30- || info->error_textrel)
31+ if (((info->warn_shared_textrel && info->shared)
32+ || info->error_textrel)
33+ && (o = bfd_get_section_by_name (dynobj, ".dynamic")) != NULL)
34 {
35 bfd_byte *dyncon, *dynconend;
36
37- /* Fix up .dynamic entries. */
38- o = bfd_get_section_by_name (dynobj, ".dynamic");
39- BFD_ASSERT (o != NULL);
40-
41 dyncon = o->contents;
42 dynconend = o->contents + o->size;
43 for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn)
44--
451.7.9.5
46
diff --git a/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch b/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch
new file mode 100644
index 0000000000..2b86b6bf3b
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0028-Backport-from-mainline.patch
@@ -0,0 +1,139 @@
1Upstream-Status: Backport
2
3From fbd07e4e15de7a81a2de7f9583fa3240302e2867 Mon Sep 17 00:00:00 2001
4From: David Daney <ddaney@avtrex.com>
5Date: Sun, 11 Dec 2011 02:28:10 +0000
6Subject: [PATCH 028/262] Backport from mainline:
7
8 2011-12-10 David Daney <david.daney@cavium.com>
9
10 * elfxx-mips.c (mips_elf_link_hash_table.rld_value): Remove.
11 (mips_elf_link_hash_table.rld_symbol): New field;
12 (MIPS_ELF_RLD_MAP_SIZE): New macro.
13 (_bfd_mips_elf_add_symbol_hook): Remember __rld_obj_head symbol
14 in rld_symbol.
15 (_bfd_mips_elf_create_dynamic_sections): Remember __rld_map symbol
16 in rld_symbol.
17 (_bfd_mips_elf_size_dynamic_sections): Set correct size for .rld_map.
18 (_bfd_mips_elf_finish_dynamic_symbol): Remove .rld_map handling.
19 (_bfd_mips_elf_finish_dynamic_sections): Use rld_symbol to
20 calculate DT_MIPS_RLD_MAP value.
21 (_bfd_mips_elf_link_hash_table_create): Initialize rld_symbol,
22 quit initializing rld_value.
23
24diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
25index 33a454d..6b908ad 100644
26--- a/bfd/elfxx-mips.c
27+++ b/bfd/elfxx-mips.c
28@@ -436,8 +436,8 @@ struct mips_elf_link_hash_table
29 entry is set to the address of __rld_obj_head as in IRIX5. */
30 bfd_boolean use_rld_obj_head;
31
32- /* This is the value of the __rld_map or __rld_obj_head symbol. */
33- bfd_vma rld_value;
34+ /* The __rld_map or __rld_obj_head symbol. */
35+ struct elf_link_hash_entry *rld_symbol;
36
37 /* This is set if we see any mips16 stub sections. */
38 bfd_boolean mips16_stubs_seen;
39@@ -768,6 +768,10 @@ static bfd *reldyn_sorting_bfd;
40 #define MIPS_ELF_GOT_SIZE(abfd) \
41 (get_elf_backend_data (abfd)->s->arch_size / 8)
42
43+/* The size of the .rld_map section. */
44+#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
45+ (get_elf_backend_data (abfd)->s->arch_size / 8)
46+
47 /* The size of a symbol-table entry. */
48 #define MIPS_ELF_SYM_SIZE(abfd) \
49 (get_elf_backend_data (abfd)->s->sizeof_sym)
50@@ -7081,6 +7085,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
51 return FALSE;
52
53 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
54+ mips_elf_hash_table (info)->rld_symbol = h;
55 }
56
57 /* If this is a mips16 text symbol, add 1 to the value to make it
58@@ -7266,6 +7271,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
59
60 if (! bfd_elf_link_record_dynamic_symbol (info, h))
61 return FALSE;
62+ mips_elf_hash_table (info)->rld_symbol = h;
63 }
64 }
65
66@@ -9027,7 +9033,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
67 {
68 /* We add a room for __rld_map. It will be filled in by the
69 rtld to contain a pointer to the _r_debug structure. */
70- s->size += 4;
71+ s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
72 }
73 else if (SGI_COMPAT (output_bfd)
74 && CONST_STRNEQ (name, ".compact_rel"))
75@@ -10030,31 +10036,6 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
76 if (IRIX_COMPAT (output_bfd) == ict_irix6)
77 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
78
79- if (! info->shared)
80- {
81- if (! mips_elf_hash_table (info)->use_rld_obj_head
82- && (strcmp (name, "__rld_map") == 0
83- || strcmp (name, "__RLD_MAP") == 0))
84- {
85- asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
86- BFD_ASSERT (s != NULL);
87- sym->st_value = s->output_section->vma + s->output_offset;
88- bfd_put_32 (output_bfd, 0, s->contents);
89- if (mips_elf_hash_table (info)->rld_value == 0)
90- mips_elf_hash_table (info)->rld_value = sym->st_value;
91- }
92- else if (mips_elf_hash_table (info)->use_rld_obj_head
93- && strcmp (name, "__rld_obj_head") == 0)
94- {
95- /* IRIX6 does not use a .rld_map section. */
96- if (IRIX_COMPAT (output_bfd) == ict_irix5
97- || IRIX_COMPAT (output_bfd) == ict_none)
98- BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
99- != NULL);
100- mips_elf_hash_table (info)->rld_value = sym->st_value;
101- }
102- }
103-
104 /* Keep dynamic MIPS16 symbols odd. This allows the dynamic linker to
105 treat MIPS16 symbols like any other. */
106 if (ELF_ST_IS_MIPS16 (sym->st_other))
107@@ -10517,7 +10498,19 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
108 break;
109
110 case DT_MIPS_RLD_MAP:
111- dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
112+ {
113+ struct elf_link_hash_entry *h;
114+ h = mips_elf_hash_table (info)->rld_symbol;
115+ if (!h)
116+ {
117+ dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
118+ swap_out_p = FALSE;
119+ break;
120+ }
121+ s = h->root.u.def.section;
122+ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
123+ + h->root.u.def.value);
124+ }
125 break;
126
127 case DT_MIPS_OPTIONS:
128@@ -12794,7 +12787,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd)
129 ret->procedure_count = 0;
130 ret->compact_rel_size = 0;
131 ret->use_rld_obj_head = FALSE;
132- ret->rld_value = 0;
133+ ret->rld_symbol = NULL;
134 ret->mips16_stubs_seen = FALSE;
135 ret->use_plts_and_copy_relocs = FALSE;
136 ret->is_vxworks = FALSE;
137--
1381.7.9.5
139
diff --git a/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
new file mode 100644
index 0000000000..a83a5979f6
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
@@ -0,0 +1,47 @@
1Upstream-Status: Backport
2
3From 97beee82f0e45e65308083a7e4cfaab57623733c Mon Sep 17 00:00:00 2001
4From: cltang <cltang>
5Date: Mon, 19 Dec 2011 10:34:15 +0000
6Subject: [PATCH 035/262] 2011-12-19 Chung-Lin Tang
7 <cltang@codesourcery.com>
8
9 Backport from mainline:
10
11 2011-12-13 Chung-Lin Tang <cltang@codesourcery.com>
12
13 * elfxx-mips.c (mips_elf_calculate_relocation): Correct
14 R_MIPS16_HI16/R_MIPS16_LO16 handling of two cleared lower bits,
15 update comments.
16
17diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
18index 6b908ad..3939183 100644
19--- a/bfd/elfxx-mips.c
20+++ b/bfd/elfxx-mips.c
21@@ -5531,10 +5531,11 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
22 12: addu $v0,$v1
23 14: move $gp,$v0
24 So the offsets of hi and lo relocs are the same, but the
25- $pc is four higher than $t9 would be, so reduce
26- both reloc addends by 4. */
27+ base $pc is that used by the ADDIUPC instruction at $t9 + 4.
28+ ADDIUPC clears the low two bits of the instruction address,
29+ so the base is ($t9 + 4) & ~3. */
30 if (r_type == R_MIPS16_HI16)
31- value = mips_elf_high (addend + gp - p - 4);
32+ value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
33 /* The microMIPS .cpload sequence uses the same assembly
34 instructions as the traditional psABI version, but the
35 incoming $t9 has the low bit set. */
36@@ -5557,7 +5558,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
37 /* See the comment for R_MIPS16_HI16 above for the reason
38 for this conditional. */
39 if (r_type == R_MIPS16_LO16)
40- value = addend + gp - p;
41+ value = addend + gp - (p & ~(bfd_vma) 0x3);
42 else if (r_type == R_MICROMIPS_LO16
43 || r_type == R_MICROMIPS_HI0_LO16)
44 value = addend + gp - p + 3;
45--
461.7.9.5
47
diff --git a/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
new file mode 100644
index 0000000000..9017c250de
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
@@ -0,0 +1,214 @@
1Upstream-Status: Backport
2
3From 26e802720ccd055d70addadbc39f4119716f8573 Mon Sep 17 00:00:00 2001
4From: cltang <cltang>
5Date: Mon, 19 Dec 2011 10:39:27 +0000
6Subject: [PATCH 036/262] 2011-12-19 Chung-Lin Tang
7 <cltang@codesourcery.com>
8
9 Backport from mainline:
10
11 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
12 Catherine Moore <clm@codesourcery.com>
13 Sandra Loosemore <sandra@codesourcery.com>
14 Richard Sandiford <rdsandiford@googlemail.com>
15
16 * elfxx-mips.c (mips_elf_local_pic_function_p): Return true when
17 H is a MIPS16 function with a kept 32-bit stub. Update comments.
18 (mips_elf_get_la25_target): New function.
19 (mips_elf_add_la25_intro): Change to use mips_elf_get_la25_target().
20 (mips_elf_add_la25_stub): Move compute of use_trampoline_p down,
21 change to use mips_elf_get_la25_target().
22 (mips_elf_relocation_needs_la25_stub): Add target_is_16_bit_code_p
23 parameter, add switch case for R_MIPS16_26.
24 (mips_elf_calculate_relocation): Redirect relocation to point to the
25 LA25 stub if it exists, instead of the MIPS16 stub. Update arguments
26 of call to mips_elf_relocation_needs_la25_stub(), don't use la25 stub
27 for mips16->mips16 calls.
28 (_bfd_mips_elf_check_relocs): Update arguments of call to
29 mips_elf_relocation_needs_la25_stub().
30 (mips_elf_create_la25_stub): Change to use mips_elf_get_la25_target().
31
32diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
33index 3939183..9f3833b 100644
34--- a/bfd/elfxx-mips.c
35+++ b/bfd/elfxx-mips.c
36@@ -1575,9 +1575,10 @@ _bfd_mips_elf_init_stubs (struct bfd_link_info *info,
37 }
38
39 /* Return true if H is a locally-defined PIC function, in the sense
40- that it might need $25 to be valid on entry. Note that MIPS16
41- functions never need $25 to be valid on entry; they set up $gp
42- using PC-relative instructions instead. */
43+ that it or its fn_stub might need $25 to be valid on entry.
44+ Note that MIPS16 functions set up $gp using PC-relative instructions,
45+ so they themselves never need $25 to be valid. Only non-MIPS16
46+ entry points are of interest here. */
47
48 static bfd_boolean
49 mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
50@@ -1586,11 +1587,32 @@ mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
51 || h->root.root.type == bfd_link_hash_defweak)
52 && h->root.def_regular
53 && !bfd_is_abs_section (h->root.root.u.def.section)
54- && !ELF_ST_IS_MIPS16 (h->root.other)
55+ && (!ELF_ST_IS_MIPS16 (h->root.other)
56+ || (h->fn_stub && h->need_fn_stub))
57 && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
58 || ELF_ST_IS_MIPS_PIC (h->root.other)));
59 }
60
61+/* Set *SEC to the input section that contains the target of STUB.
62+ Return the offset of the target from the start of that section. */
63+
64+static bfd_vma
65+mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
66+ asection **sec)
67+{
68+ if (ELF_ST_IS_MIPS16 (stub->h->root.other))
69+ {
70+ BFD_ASSERT (stub->h->need_fn_stub);
71+ *sec = stub->h->fn_stub;
72+ return 0;
73+ }
74+ else
75+ {
76+ *sec = stub->h->root.root.u.def.section;
77+ return stub->h->root.root.u.def.value;
78+ }
79+}
80+
81 /* STUB describes an la25 stub that we have decided to implement
82 by inserting an LUI/ADDIU pair before the target function.
83 Create the section and redirect the function symbol to it. */
84@@ -1615,7 +1637,7 @@ mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
85 sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
86
87 /* Create the section. */
88- input_section = stub->h->root.root.u.def.section;
89+ mips_elf_get_la25_target (stub, &input_section);
90 s = htab->add_stub_section (name, input_section,
91 input_section->output_section);
92 if (s == NULL)
93@@ -1689,12 +1711,6 @@ mips_elf_add_la25_stub (struct bfd_link_info *info,
94 bfd_vma value;
95 void **slot;
96
97- /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
98- of the section and if we would need no more than 2 nops. */
99- s = h->root.root.u.def.section;
100- value = h->root.root.u.def.value;
101- use_trampoline_p = (value != 0 || s->alignment_power > 4);
102-
103 /* Describe the stub we want. */
104 search.stub_section = NULL;
105 search.offset = 0;
106@@ -1724,6 +1740,11 @@ mips_elf_add_la25_stub (struct bfd_link_info *info,
107 *stub = search;
108 *slot = stub;
109
110+ /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
111+ of the section and if we would need no more than 2 nops. */
112+ value = mips_elf_get_la25_target (stub, &s);
113+ use_trampoline_p = (value != 0 || s->alignment_power > 4);
114+
115 h->la25_stub = stub;
116 return (use_trampoline_p
117 ? mips_elf_add_la25_trampoline (stub, info)
118@@ -4911,7 +4932,8 @@ is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
119 stub. */
120
121 static bfd_boolean
122-mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
123+mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
124+ bfd_boolean target_is_16_bit_code_p)
125 {
126 /* We specifically ignore branches and jumps from EF_PIC objects,
127 where the onus is on the compiler or programmer to perform any
128@@ -4925,7 +4947,6 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
129 {
130 case R_MIPS_26:
131 case R_MIPS_PC16:
132- case R_MIPS16_26:
133 case R_MICROMIPS_26_S1:
134 case R_MICROMIPS_PC7_S1:
135 case R_MICROMIPS_PC10_S1:
136@@ -4933,6 +4954,9 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
137 case R_MICROMIPS_PC23_S2:
138 return TRUE;
139
140+ case R_MIPS16_26:
141+ return !target_is_16_bit_code_p;
142+
143 default:
144 return FALSE;
145 }
146@@ -5193,14 +5217,28 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
147 have already noticed that we were going to need the
148 stub. */
149 if (local_p)
150- sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
151+ {
152+ sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
153+ value = 0;
154+ }
155 else
156 {
157 BFD_ASSERT (h->need_fn_stub);
158- sec = h->fn_stub;
159+ if (h->la25_stub)
160+ {
161+ /* If a LA25 header for the stub itself exists, point to the
162+ prepended LUI/ADDIU sequence. */
163+ sec = h->la25_stub->stub_section;
164+ value = h->la25_stub->offset;
165+ }
166+ else
167+ {
168+ sec = h->fn_stub;
169+ value = 0;
170+ }
171 }
172
173- symbol = sec->output_section->vma + sec->output_offset;
174+ symbol = sec->output_section->vma + sec->output_offset + value;
175 /* The target is 16-bit, but the stub isn't. */
176 target_is_16_bit_code_p = FALSE;
177 }
178@@ -5250,7 +5288,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
179 /* If this is a direct call to a PIC function, redirect to the
180 non-PIC stub. */
181 else if (h != NULL && h->la25_stub
182- && mips_elf_relocation_needs_la25_stub (input_bfd, r_type))
183+ && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
184+ target_is_16_bit_code_p))
185 symbol = (h->la25_stub->stub_section->output_section->vma
186 + h->la25_stub->stub_section->output_offset
187 + h->la25_stub->offset);
188@@ -7925,7 +7964,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
189 return FALSE;
190 }
191
192- if (h != NULL && mips_elf_relocation_needs_la25_stub (abfd, r_type))
193+ if (h != NULL
194+ && mips_elf_relocation_needs_la25_stub (abfd, r_type,
195+ ELF_ST_IS_MIPS16 (h->other)))
196 ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
197
198 switch (r_type)
199@@ -9622,9 +9663,9 @@ mips_elf_create_la25_stub (void **slot, void *data)
200 offset = stub->offset;
201
202 /* Work out the target address. */
203- target = (stub->h->root.root.u.def.section->output_section->vma
204- + stub->h->root.root.u.def.section->output_offset
205- + stub->h->root.root.u.def.value);
206+ target = mips_elf_get_la25_target (stub, &s);
207+ target += s->output_section->vma + s->output_offset;
208+
209 target_high = ((target + 0x8000) >> 16) & 0xffff;
210 target_low = (target & 0xffff);
211
212--
2131.7.9.5
214
diff --git a/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch b/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
new file mode 100644
index 0000000000..4b0caafb48
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch
@@ -0,0 +1,1068 @@
1Upstream-Status: Backport
2
3From 7e2b7154b03e4c77233171eec5cba8d113e04fea Mon Sep 17 00:00:00 2001
4From: cltang <cltang>
5Date: Mon, 19 Dec 2011 10:49:24 +0000
6Subject: [PATCH 037/262] 2011-12-19 Chung-Lin Tang
7 <cltang@codesourcery.com>
8
9 Backport from mainline:
10
11 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
12
13 gas/
14 * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
15 entries.
16 (mips16_percent_op): Add MIPS16 TLS relocation ops.
17 (md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases.
18 (s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out
19 directive string and reloc type as function parameters. Update
20 comments.
21 (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
22 (s_tprelword,s_tpreldword): New functions.
23
24 include/
25 * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
26
27 bfd/
28 * reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM,
29 BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
30 BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16,
31 BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS.
32 * bfd-in2.h (bfd_reloc_code_real): Regenerate.
33 * libbfd.h (bfd_reloc_code_real_names): Regenerate.
34 * elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_*
35 entries.
36 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
37 mappings.
38 * elfn32-mips.c (elf_mips16_howto_table_rel,
39 elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries.
40 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
41 mappings.
42 * elf64-mips.c (mips16_elf64_howto_table_rel,
43 mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries.
44 (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
45 mappings.
46 * elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p,
47 _bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations.
48 (tls_gd_reloc_p): Add R_MIPS16_TLS_GD case.
49 (tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case.
50 (tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case.
51 (mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*,
52 R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
53---
54 bfd/ChangeLog | 32 ++++++++
55 bfd/bfd-in2.h | 9 +++
56 bfd/elf32-mips.c | 114 ++++++++++++++++++++++++++
57 bfd/elf64-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
58 bfd/elfn32-mips.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++
59 bfd/elfxx-mips.c | 48 +++++++++--
60 bfd/libbfd.h | 7 ++
61 bfd/reloc.c | 17 ++++
62 gas/ChangeLog | 16 ++++
63 gas/config/tc-mips.c | 62 ++++++++++----
64 include/ChangeLog | 8 ++
65 include/elf/mips.h | 9 ++-
66 12 files changed, 739 insertions(+), 21 deletions(-)
67
68diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
69index 22fcdf6..cd90740 100644
70--- a/bfd/bfd-in2.h
71+++ b/bfd/bfd-in2.h
72@@ -2780,6 +2780,15 @@ to compensate for the borrow when the low bits are added. */
73 /* MIPS16 low 16 bits. */
74 BFD_RELOC_MIPS16_LO16,
75
76+/* MIPS16 TLS relocations */
77+ BFD_RELOC_MIPS16_TLS_GD,
78+ BFD_RELOC_MIPS16_TLS_LDM,
79+ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
80+ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
81+ BFD_RELOC_MIPS16_TLS_GOTTPREL,
82+ BFD_RELOC_MIPS16_TLS_TPREL_HI16,
83+ BFD_RELOC_MIPS16_TLS_TPREL_LO16,
84+
85 /* Relocation against a MIPS literal section. */
86 BFD_RELOC_MIPS_LITERAL,
87 BFD_RELOC_MICROMIPS_LITERAL,
88diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
89index fd3d4ba..61e8b45 100644
90--- a/bfd/elf32-mips.c
91+++ b/bfd/elf32-mips.c
92@@ -830,6 +830,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
93 0x0000ffff, /* src_mask */
94 0x0000ffff, /* dst_mask */
95 FALSE), /* pcrel_offset */
96+
97+ /* MIPS16 TLS general dynamic variable reference. */
98+ HOWTO (R_MIPS16_TLS_GD, /* type */
99+ 0, /* rightshift */
100+ 2, /* size (0 = byte, 1 = short, 2 = long) */
101+ 16, /* bitsize */
102+ FALSE, /* pc_relative */
103+ 0, /* bitpos */
104+ complain_overflow_signed, /* complain_on_overflow */
105+ _bfd_mips_elf_generic_reloc, /* special_function */
106+ "R_MIPS16_TLS_GD", /* name */
107+ TRUE, /* partial_inplace */
108+ 0x0000ffff, /* src_mask */
109+ 0x0000ffff, /* dst_mask */
110+ FALSE), /* pcrel_offset */
111+
112+ /* MIPS16 TLS local dynamic variable reference. */
113+ HOWTO (R_MIPS16_TLS_LDM, /* type */
114+ 0, /* rightshift */
115+ 2, /* size (0 = byte, 1 = short, 2 = long) */
116+ 16, /* bitsize */
117+ FALSE, /* pc_relative */
118+ 0, /* bitpos */
119+ complain_overflow_signed, /* complain_on_overflow */
120+ _bfd_mips_elf_generic_reloc, /* special_function */
121+ "R_MIPS16_TLS_LDM", /* name */
122+ TRUE, /* partial_inplace */
123+ 0x0000ffff, /* src_mask */
124+ 0x0000ffff, /* dst_mask */
125+ FALSE), /* pcrel_offset */
126+
127+ /* MIPS16 TLS local dynamic offset. */
128+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
129+ 0, /* rightshift */
130+ 2, /* size (0 = byte, 1 = short, 2 = long) */
131+ 16, /* bitsize */
132+ FALSE, /* pc_relative */
133+ 0, /* bitpos */
134+ complain_overflow_signed, /* complain_on_overflow */
135+ _bfd_mips_elf_generic_reloc, /* special_function */
136+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
137+ TRUE, /* partial_inplace */
138+ 0x0000ffff, /* src_mask */
139+ 0x0000ffff, /* dst_mask */
140+ FALSE), /* pcrel_offset */
141+
142+ /* MIPS16 TLS local dynamic offset. */
143+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
144+ 0, /* rightshift */
145+ 2, /* size (0 = byte, 1 = short, 2 = long) */
146+ 16, /* bitsize */
147+ FALSE, /* pc_relative */
148+ 0, /* bitpos */
149+ complain_overflow_signed, /* complain_on_overflow */
150+ _bfd_mips_elf_generic_reloc, /* special_function */
151+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
152+ TRUE, /* partial_inplace */
153+ 0x0000ffff, /* src_mask */
154+ 0x0000ffff, /* dst_mask */
155+ FALSE), /* pcrel_offset */
156+
157+ /* MIPS16 TLS thread pointer offset. */
158+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
159+ 0, /* rightshift */
160+ 2, /* size (0 = byte, 1 = short, 2 = long) */
161+ 16, /* bitsize */
162+ FALSE, /* pc_relative */
163+ 0, /* bitpos */
164+ complain_overflow_signed, /* complain_on_overflow */
165+ _bfd_mips_elf_generic_reloc, /* special_function */
166+ "R_MIPS16_TLS_GOTTPREL", /* name */
167+ TRUE, /* partial_inplace */
168+ 0x0000ffff, /* src_mask */
169+ 0x0000ffff, /* dst_mask */
170+ FALSE), /* pcrel_offset */
171+
172+ /* MIPS16 TLS thread pointer offset. */
173+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
174+ 0, /* rightshift */
175+ 2, /* size (0 = byte, 1 = short, 2 = long) */
176+ 16, /* bitsize */
177+ FALSE, /* pc_relative */
178+ 0, /* bitpos */
179+ complain_overflow_signed, /* complain_on_overflow */
180+ _bfd_mips_elf_generic_reloc, /* special_function */
181+ "R_MIPS16_TLS_TPREL_HI16", /* name */
182+ TRUE, /* partial_inplace */
183+ 0x0000ffff, /* src_mask */
184+ 0x0000ffff, /* dst_mask */
185+ FALSE), /* pcrel_offset */
186+
187+ /* MIPS16 TLS thread pointer offset. */
188+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
189+ 0, /* rightshift */
190+ 2, /* size (0 = byte, 1 = short, 2 = long) */
191+ 16, /* bitsize */
192+ FALSE, /* pc_relative */
193+ 0, /* bitpos */
194+ complain_overflow_signed, /* complain_on_overflow */
195+ _bfd_mips_elf_generic_reloc, /* special_function */
196+ "R_MIPS16_TLS_TPREL_LO16", /* name */
197+ TRUE, /* partial_inplace */
198+ 0x0000ffff, /* src_mask */
199+ 0x0000ffff, /* dst_mask */
200+ FALSE), /* pcrel_offset */
201 };
202
203 static reloc_howto_type elf_micromips_howto_table_rel[] =
204@@ -1796,6 +1901,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
205 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
206 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
207 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
208+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
209+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
210+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
211+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
212+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
213+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
214+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
215+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
216+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
217 };
218
219 static const struct elf_reloc_map micromips_reloc_map[] =
220diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
221index 3feb1bb..bdd0c19 100644
222--- a/bfd/elf64-mips.c
223+++ b/bfd/elf64-mips.c
224@@ -1590,6 +1590,111 @@ static reloc_howto_type mips16_elf64_howto_table_rel[] =
225 0x0000ffff, /* src_mask */
226 0x0000ffff, /* dst_mask */
227 FALSE), /* pcrel_offset */
228+
229+ /* MIPS16 TLS general dynamic variable reference. */
230+ HOWTO (R_MIPS16_TLS_GD, /* type */
231+ 0, /* rightshift */
232+ 2, /* size (0 = byte, 1 = short, 2 = long) */
233+ 16, /* bitsize */
234+ FALSE, /* pc_relative */
235+ 0, /* bitpos */
236+ complain_overflow_signed, /* complain_on_overflow */
237+ _bfd_mips_elf_generic_reloc, /* special_function */
238+ "R_MIPS16_TLS_GD", /* name */
239+ TRUE, /* partial_inplace */
240+ 0x0000ffff, /* src_mask */
241+ 0x0000ffff, /* dst_mask */
242+ FALSE), /* pcrel_offset */
243+
244+ /* MIPS16 TLS local dynamic variable reference. */
245+ HOWTO (R_MIPS16_TLS_LDM, /* type */
246+ 0, /* rightshift */
247+ 2, /* size (0 = byte, 1 = short, 2 = long) */
248+ 16, /* bitsize */
249+ FALSE, /* pc_relative */
250+ 0, /* bitpos */
251+ complain_overflow_signed, /* complain_on_overflow */
252+ _bfd_mips_elf_generic_reloc, /* special_function */
253+ "R_MIPS16_TLS_LDM", /* name */
254+ TRUE, /* partial_inplace */
255+ 0x0000ffff, /* src_mask */
256+ 0x0000ffff, /* dst_mask */
257+ FALSE), /* pcrel_offset */
258+
259+ /* MIPS16 TLS local dynamic offset. */
260+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
261+ 0, /* rightshift */
262+ 2, /* size (0 = byte, 1 = short, 2 = long) */
263+ 16, /* bitsize */
264+ FALSE, /* pc_relative */
265+ 0, /* bitpos */
266+ complain_overflow_signed, /* complain_on_overflow */
267+ _bfd_mips_elf_generic_reloc, /* special_function */
268+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
269+ TRUE, /* partial_inplace */
270+ 0x0000ffff, /* src_mask */
271+ 0x0000ffff, /* dst_mask */
272+ FALSE), /* pcrel_offset */
273+
274+ /* MIPS16 TLS local dynamic offset. */
275+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
276+ 0, /* rightshift */
277+ 2, /* size (0 = byte, 1 = short, 2 = long) */
278+ 16, /* bitsize */
279+ FALSE, /* pc_relative */
280+ 0, /* bitpos */
281+ complain_overflow_signed, /* complain_on_overflow */
282+ _bfd_mips_elf_generic_reloc, /* special_function */
283+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
284+ TRUE, /* partial_inplace */
285+ 0x0000ffff, /* src_mask */
286+ 0x0000ffff, /* dst_mask */
287+ FALSE), /* pcrel_offset */
288+
289+ /* MIPS16 TLS thread pointer offset. */
290+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
291+ 0, /* rightshift */
292+ 2, /* size (0 = byte, 1 = short, 2 = long) */
293+ 16, /* bitsize */
294+ FALSE, /* pc_relative */
295+ 0, /* bitpos */
296+ complain_overflow_signed, /* complain_on_overflow */
297+ _bfd_mips_elf_generic_reloc, /* special_function */
298+ "R_MIPS16_TLS_GOTTPREL", /* name */
299+ TRUE, /* partial_inplace */
300+ 0x0000ffff, /* src_mask */
301+ 0x0000ffff, /* dst_mask */
302+ FALSE), /* pcrel_offset */
303+
304+ /* MIPS16 TLS thread pointer offset. */
305+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
306+ 0, /* rightshift */
307+ 2, /* size (0 = byte, 1 = short, 2 = long) */
308+ 16, /* bitsize */
309+ FALSE, /* pc_relative */
310+ 0, /* bitpos */
311+ complain_overflow_signed, /* complain_on_overflow */
312+ _bfd_mips_elf_generic_reloc, /* special_function */
313+ "R_MIPS16_TLS_TPREL_HI16", /* name */
314+ TRUE, /* partial_inplace */
315+ 0x0000ffff, /* src_mask */
316+ 0x0000ffff, /* dst_mask */
317+ FALSE), /* pcrel_offset */
318+
319+ /* MIPS16 TLS thread pointer offset. */
320+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
321+ 0, /* rightshift */
322+ 2, /* size (0 = byte, 1 = short, 2 = long) */
323+ 16, /* bitsize */
324+ FALSE, /* pc_relative */
325+ 0, /* bitpos */
326+ complain_overflow_signed, /* complain_on_overflow */
327+ _bfd_mips_elf_generic_reloc, /* special_function */
328+ "R_MIPS16_TLS_TPREL_LO16", /* name */
329+ TRUE, /* partial_inplace */
330+ 0x0000ffff, /* src_mask */
331+ 0x0000ffff, /* dst_mask */
332+ FALSE), /* pcrel_offset */
333 };
334
335 static reloc_howto_type mips16_elf64_howto_table_rela[] =
336@@ -1686,6 +1791,111 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] =
337 0x0000ffff, /* src_mask */
338 0x0000ffff, /* dst_mask */
339 FALSE), /* pcrel_offset */
340+
341+ /* MIPS16 TLS general dynamic variable reference. */
342+ HOWTO (R_MIPS16_TLS_GD, /* type */
343+ 0, /* rightshift */
344+ 2, /* size (0 = byte, 1 = short, 2 = long) */
345+ 16, /* bitsize */
346+ FALSE, /* pc_relative */
347+ 0, /* bitpos */
348+ complain_overflow_signed, /* complain_on_overflow */
349+ _bfd_mips_elf_generic_reloc, /* special_function */
350+ "R_MIPS16_TLS_GD", /* name */
351+ FALSE, /* partial_inplace */
352+ 0x0000ffff, /* src_mask */
353+ 0x0000ffff, /* dst_mask */
354+ FALSE), /* pcrel_offset */
355+
356+ /* MIPS16 TLS local dynamic variable reference. */
357+ HOWTO (R_MIPS16_TLS_LDM, /* type */
358+ 0, /* rightshift */
359+ 2, /* size (0 = byte, 1 = short, 2 = long) */
360+ 16, /* bitsize */
361+ FALSE, /* pc_relative */
362+ 0, /* bitpos */
363+ complain_overflow_signed, /* complain_on_overflow */
364+ _bfd_mips_elf_generic_reloc, /* special_function */
365+ "R_MIPS16_TLS_LDM", /* name */
366+ FALSE, /* partial_inplace */
367+ 0x0000ffff, /* src_mask */
368+ 0x0000ffff, /* dst_mask */
369+ FALSE), /* pcrel_offset */
370+
371+ /* MIPS16 TLS local dynamic offset. */
372+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
373+ 0, /* rightshift */
374+ 2, /* size (0 = byte, 1 = short, 2 = long) */
375+ 16, /* bitsize */
376+ FALSE, /* pc_relative */
377+ 0, /* bitpos */
378+ complain_overflow_signed, /* complain_on_overflow */
379+ _bfd_mips_elf_generic_reloc, /* special_function */
380+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
381+ FALSE, /* partial_inplace */
382+ 0x0000ffff, /* src_mask */
383+ 0x0000ffff, /* dst_mask */
384+ FALSE), /* pcrel_offset */
385+
386+ /* MIPS16 TLS local dynamic offset. */
387+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
388+ 0, /* rightshift */
389+ 2, /* size (0 = byte, 1 = short, 2 = long) */
390+ 16, /* bitsize */
391+ FALSE, /* pc_relative */
392+ 0, /* bitpos */
393+ complain_overflow_signed, /* complain_on_overflow */
394+ _bfd_mips_elf_generic_reloc, /* special_function */
395+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
396+ FALSE, /* partial_inplace */
397+ 0x0000ffff, /* src_mask */
398+ 0x0000ffff, /* dst_mask */
399+ FALSE), /* pcrel_offset */
400+
401+ /* MIPS16 TLS thread pointer offset. */
402+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
403+ 0, /* rightshift */
404+ 2, /* size (0 = byte, 1 = short, 2 = long) */
405+ 16, /* bitsize */
406+ FALSE, /* pc_relative */
407+ 0, /* bitpos */
408+ complain_overflow_signed, /* complain_on_overflow */
409+ _bfd_mips_elf_generic_reloc, /* special_function */
410+ "R_MIPS16_TLS_GOTTPREL", /* name */
411+ FALSE, /* partial_inplace */
412+ 0x0000ffff, /* src_mask */
413+ 0x0000ffff, /* dst_mask */
414+ FALSE), /* pcrel_offset */
415+
416+ /* MIPS16 TLS thread pointer offset. */
417+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
418+ 0, /* rightshift */
419+ 2, /* size (0 = byte, 1 = short, 2 = long) */
420+ 16, /* bitsize */
421+ FALSE, /* pc_relative */
422+ 0, /* bitpos */
423+ complain_overflow_signed, /* complain_on_overflow */
424+ _bfd_mips_elf_generic_reloc, /* special_function */
425+ "R_MIPS16_TLS_TPREL_HI16", /* name */
426+ FALSE, /* partial_inplace */
427+ 0x0000ffff, /* src_mask */
428+ 0x0000ffff, /* dst_mask */
429+ FALSE), /* pcrel_offset */
430+
431+ /* MIPS16 TLS thread pointer offset. */
432+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
433+ 0, /* rightshift */
434+ 2, /* size (0 = byte, 1 = short, 2 = long) */
435+ 16, /* bitsize */
436+ FALSE, /* pc_relative */
437+ 0, /* bitpos */
438+ complain_overflow_signed, /* complain_on_overflow */
439+ _bfd_mips_elf_generic_reloc, /* special_function */
440+ "R_MIPS16_TLS_TPREL_LO16", /* name */
441+ FALSE, /* partial_inplace */
442+ 0x0000ffff, /* src_mask */
443+ 0x0000ffff, /* dst_mask */
444+ FALSE), /* pcrel_offset */
445 };
446
447 static reloc_howto_type micromips_elf64_howto_table_rel[] =
448@@ -2908,6 +3118,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
449 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
450 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
451 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
452+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
453+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
454+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
455+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
456+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
457+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
458+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
459+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
460+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
461 };
462
463 static const struct elf_reloc_map micromips_reloc_map[] =
464diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
465index 00ec8b0..2189566 100644
466--- a/bfd/elfn32-mips.c
467+++ b/bfd/elfn32-mips.c
468@@ -1555,6 +1555,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
469 0x0000ffff, /* src_mask */
470 0x0000ffff, /* dst_mask */
471 FALSE), /* pcrel_offset */
472+
473+ /* MIPS16 TLS general dynamic variable reference. */
474+ HOWTO (R_MIPS16_TLS_GD, /* type */
475+ 0, /* rightshift */
476+ 2, /* size (0 = byte, 1 = short, 2 = long) */
477+ 16, /* bitsize */
478+ FALSE, /* pc_relative */
479+ 0, /* bitpos */
480+ complain_overflow_signed, /* complain_on_overflow */
481+ _bfd_mips_elf_generic_reloc, /* special_function */
482+ "R_MIPS16_TLS_GD", /* name */
483+ TRUE, /* partial_inplace */
484+ 0x0000ffff, /* src_mask */
485+ 0x0000ffff, /* dst_mask */
486+ FALSE), /* pcrel_offset */
487+
488+ /* MIPS16 TLS local dynamic variable reference. */
489+ HOWTO (R_MIPS16_TLS_LDM, /* type */
490+ 0, /* rightshift */
491+ 2, /* size (0 = byte, 1 = short, 2 = long) */
492+ 16, /* bitsize */
493+ FALSE, /* pc_relative */
494+ 0, /* bitpos */
495+ complain_overflow_signed, /* complain_on_overflow */
496+ _bfd_mips_elf_generic_reloc, /* special_function */
497+ "R_MIPS16_TLS_LDM", /* name */
498+ TRUE, /* partial_inplace */
499+ 0x0000ffff, /* src_mask */
500+ 0x0000ffff, /* dst_mask */
501+ FALSE), /* pcrel_offset */
502+
503+ /* MIPS16 TLS local dynamic offset. */
504+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
505+ 0, /* rightshift */
506+ 2, /* size (0 = byte, 1 = short, 2 = long) */
507+ 16, /* bitsize */
508+ FALSE, /* pc_relative */
509+ 0, /* bitpos */
510+ complain_overflow_signed, /* complain_on_overflow */
511+ _bfd_mips_elf_generic_reloc, /* special_function */
512+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
513+ TRUE, /* partial_inplace */
514+ 0x0000ffff, /* src_mask */
515+ 0x0000ffff, /* dst_mask */
516+ FALSE), /* pcrel_offset */
517+
518+ /* MIPS16 TLS local dynamic offset. */
519+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
520+ 0, /* rightshift */
521+ 2, /* size (0 = byte, 1 = short, 2 = long) */
522+ 16, /* bitsize */
523+ FALSE, /* pc_relative */
524+ 0, /* bitpos */
525+ complain_overflow_signed, /* complain_on_overflow */
526+ _bfd_mips_elf_generic_reloc, /* special_function */
527+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
528+ TRUE, /* partial_inplace */
529+ 0x0000ffff, /* src_mask */
530+ 0x0000ffff, /* dst_mask */
531+ FALSE), /* pcrel_offset */
532+
533+ /* MIPS16 TLS thread pointer offset. */
534+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
535+ 0, /* rightshift */
536+ 2, /* size (0 = byte, 1 = short, 2 = long) */
537+ 16, /* bitsize */
538+ FALSE, /* pc_relative */
539+ 0, /* bitpos */
540+ complain_overflow_signed, /* complain_on_overflow */
541+ _bfd_mips_elf_generic_reloc, /* special_function */
542+ "R_MIPS16_TLS_GOTTPREL", /* name */
543+ TRUE, /* partial_inplace */
544+ 0x0000ffff, /* src_mask */
545+ 0x0000ffff, /* dst_mask */
546+ FALSE), /* pcrel_offset */
547+
548+ /* MIPS16 TLS thread pointer offset. */
549+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
550+ 0, /* rightshift */
551+ 2, /* size (0 = byte, 1 = short, 2 = long) */
552+ 16, /* bitsize */
553+ FALSE, /* pc_relative */
554+ 0, /* bitpos */
555+ complain_overflow_signed, /* complain_on_overflow */
556+ _bfd_mips_elf_generic_reloc, /* special_function */
557+ "R_MIPS16_TLS_TPREL_HI16", /* name */
558+ TRUE, /* partial_inplace */
559+ 0x0000ffff, /* src_mask */
560+ 0x0000ffff, /* dst_mask */
561+ FALSE), /* pcrel_offset */
562+
563+ /* MIPS16 TLS thread pointer offset. */
564+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
565+ 0, /* rightshift */
566+ 2, /* size (0 = byte, 1 = short, 2 = long) */
567+ 16, /* bitsize */
568+ FALSE, /* pc_relative */
569+ 0, /* bitpos */
570+ complain_overflow_signed, /* complain_on_overflow */
571+ _bfd_mips_elf_generic_reloc, /* special_function */
572+ "R_MIPS16_TLS_TPREL_LO16", /* name */
573+ TRUE, /* partial_inplace */
574+ 0x0000ffff, /* src_mask */
575+ 0x0000ffff, /* dst_mask */
576+ FALSE), /* pcrel_offset */
577 };
578
579 static reloc_howto_type elf_mips16_howto_table_rela[] =
580@@ -1651,6 +1756,111 @@ static reloc_howto_type elf_mips16_howto_table_rela[] =
581 0x0000ffff, /* src_mask */
582 0x0000ffff, /* dst_mask */
583 FALSE), /* pcrel_offset */
584+
585+ /* MIPS16 TLS general dynamic variable reference. */
586+ HOWTO (R_MIPS16_TLS_GD, /* type */
587+ 0, /* rightshift */
588+ 2, /* size (0 = byte, 1 = short, 2 = long) */
589+ 16, /* bitsize */
590+ FALSE, /* pc_relative */
591+ 0, /* bitpos */
592+ complain_overflow_signed, /* complain_on_overflow */
593+ _bfd_mips_elf_generic_reloc, /* special_function */
594+ "R_MIPS16_TLS_GD", /* name */
595+ FALSE, /* partial_inplace */
596+ 0x0000ffff, /* src_mask */
597+ 0x0000ffff, /* dst_mask */
598+ FALSE), /* pcrel_offset */
599+
600+ /* MIPS16 TLS local dynamic variable reference. */
601+ HOWTO (R_MIPS16_TLS_LDM, /* type */
602+ 0, /* rightshift */
603+ 2, /* size (0 = byte, 1 = short, 2 = long) */
604+ 16, /* bitsize */
605+ FALSE, /* pc_relative */
606+ 0, /* bitpos */
607+ complain_overflow_signed, /* complain_on_overflow */
608+ _bfd_mips_elf_generic_reloc, /* special_function */
609+ "R_MIPS16_TLS_LDM", /* name */
610+ FALSE, /* partial_inplace */
611+ 0x0000ffff, /* src_mask */
612+ 0x0000ffff, /* dst_mask */
613+ FALSE), /* pcrel_offset */
614+
615+ /* MIPS16 TLS local dynamic offset. */
616+ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
617+ 0, /* rightshift */
618+ 2, /* size (0 = byte, 1 = short, 2 = long) */
619+ 16, /* bitsize */
620+ FALSE, /* pc_relative */
621+ 0, /* bitpos */
622+ complain_overflow_signed, /* complain_on_overflow */
623+ _bfd_mips_elf_generic_reloc, /* special_function */
624+ "R_MIPS16_TLS_DTPREL_HI16", /* name */
625+ FALSE, /* partial_inplace */
626+ 0x0000ffff, /* src_mask */
627+ 0x0000ffff, /* dst_mask */
628+ FALSE), /* pcrel_offset */
629+
630+ /* MIPS16 TLS local dynamic offset. */
631+ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
632+ 0, /* rightshift */
633+ 2, /* size (0 = byte, 1 = short, 2 = long) */
634+ 16, /* bitsize */
635+ FALSE, /* pc_relative */
636+ 0, /* bitpos */
637+ complain_overflow_signed, /* complain_on_overflow */
638+ _bfd_mips_elf_generic_reloc, /* special_function */
639+ "R_MIPS16_TLS_DTPREL_LO16", /* name */
640+ FALSE, /* partial_inplace */
641+ 0x0000ffff, /* src_mask */
642+ 0x0000ffff, /* dst_mask */
643+ FALSE), /* pcrel_offset */
644+
645+ /* MIPS16 TLS thread pointer offset. */
646+ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
647+ 0, /* rightshift */
648+ 2, /* size (0 = byte, 1 = short, 2 = long) */
649+ 16, /* bitsize */
650+ FALSE, /* pc_relative */
651+ 0, /* bitpos */
652+ complain_overflow_signed, /* complain_on_overflow */
653+ _bfd_mips_elf_generic_reloc, /* special_function */
654+ "R_MIPS16_TLS_GOTTPREL", /* name */
655+ FALSE, /* partial_inplace */
656+ 0x0000ffff, /* src_mask */
657+ 0x0000ffff, /* dst_mask */
658+ FALSE), /* pcrel_offset */
659+
660+ /* MIPS16 TLS thread pointer offset. */
661+ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
662+ 0, /* rightshift */
663+ 2, /* size (0 = byte, 1 = short, 2 = long) */
664+ 16, /* bitsize */
665+ FALSE, /* pc_relative */
666+ 0, /* bitpos */
667+ complain_overflow_signed, /* complain_on_overflow */
668+ _bfd_mips_elf_generic_reloc, /* special_function */
669+ "R_MIPS16_TLS_TPREL_HI16", /* name */
670+ FALSE, /* partial_inplace */
671+ 0x0000ffff, /* src_mask */
672+ 0x0000ffff, /* dst_mask */
673+ FALSE), /* pcrel_offset */
674+
675+ /* MIPS16 TLS thread pointer offset. */
676+ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
677+ 0, /* rightshift */
678+ 2, /* size (0 = byte, 1 = short, 2 = long) */
679+ 16, /* bitsize */
680+ FALSE, /* pc_relative */
681+ 0, /* bitpos */
682+ complain_overflow_signed, /* complain_on_overflow */
683+ _bfd_mips_elf_generic_reloc, /* special_function */
684+ "R_MIPS16_TLS_TPREL_LO16", /* name */
685+ FALSE, /* partial_inplace */
686+ 0x0000ffff, /* src_mask */
687+ 0x0000ffff, /* dst_mask */
688+ FALSE), /* pcrel_offset */
689 };
690
691 static reloc_howto_type elf_micromips_howto_table_rel[] =
692@@ -2724,6 +2934,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
693 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
694 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
695 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
696+ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
697+ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
698+ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
699+ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
700+ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
701+ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
702+ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
703+ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
704+ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
705 };
706
707 static const struct elf_reloc_map micromips_reloc_map[] =
708diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
709index 9f3833b..fa906cd 100644
710--- a/bfd/elfxx-mips.c
711+++ b/bfd/elfxx-mips.c
712@@ -529,6 +529,13 @@ struct mips_htab_traverse_info
713 || r_type == R_MIPS_TLS_TPREL64 \
714 || r_type == R_MIPS_TLS_TPREL_HI16 \
715 || r_type == R_MIPS_TLS_TPREL_LO16 \
716+ || r_type == R_MIPS16_TLS_GD \
717+ || r_type == R_MIPS16_TLS_LDM \
718+ || r_type == R_MIPS16_TLS_DTPREL_HI16 \
719+ || r_type == R_MIPS16_TLS_DTPREL_LO16 \
720+ || r_type == R_MIPS16_TLS_GOTTPREL \
721+ || r_type == R_MIPS16_TLS_TPREL_HI16 \
722+ || r_type == R_MIPS16_TLS_TPREL_LO16 \
723 || r_type == R_MICROMIPS_TLS_GD \
724 || r_type == R_MICROMIPS_TLS_LDM \
725 || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
726@@ -1885,6 +1892,13 @@ mips16_reloc_p (int r_type)
727 case R_MIPS16_CALL16:
728 case R_MIPS16_HI16:
729 case R_MIPS16_LO16:
730+ case R_MIPS16_TLS_GD:
731+ case R_MIPS16_TLS_LDM:
732+ case R_MIPS16_TLS_DTPREL_HI16:
733+ case R_MIPS16_TLS_DTPREL_LO16:
734+ case R_MIPS16_TLS_GOTTPREL:
735+ case R_MIPS16_TLS_TPREL_HI16:
736+ case R_MIPS16_TLS_TPREL_LO16:
737 return TRUE;
738
739 default:
740@@ -2012,19 +2026,25 @@ micromips_branch_reloc_p (int r_type)
741 static inline bfd_boolean
742 tls_gd_reloc_p (unsigned int r_type)
743 {
744- return r_type == R_MIPS_TLS_GD || r_type == R_MICROMIPS_TLS_GD;
745+ return (r_type == R_MIPS_TLS_GD
746+ || r_type == R_MIPS16_TLS_GD
747+ || r_type == R_MICROMIPS_TLS_GD);
748 }
749
750 static inline bfd_boolean
751 tls_ldm_reloc_p (unsigned int r_type)
752 {
753- return r_type == R_MIPS_TLS_LDM || r_type == R_MICROMIPS_TLS_LDM;
754+ return (r_type == R_MIPS_TLS_LDM
755+ || r_type == R_MIPS16_TLS_LDM
756+ || r_type == R_MICROMIPS_TLS_LDM);
757 }
758
759 static inline bfd_boolean
760 tls_gottprel_reloc_p (unsigned int r_type)
761 {
762- return r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MICROMIPS_TLS_GOTTPREL;
763+ return (r_type == R_MIPS_TLS_GOTTPREL
764+ || r_type == R_MIPS16_TLS_GOTTPREL
765+ || r_type == R_MICROMIPS_TLS_GOTTPREL);
766 }
767
768 void
769@@ -5361,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
770 case R_MIPS_TLS_GD:
771 case R_MIPS_TLS_GOTTPREL:
772 case R_MIPS_TLS_LDM:
773+ case R_MIPS16_TLS_GD:
774+ case R_MIPS16_TLS_GOTTPREL:
775+ case R_MIPS16_TLS_LDM:
776 case R_MICROMIPS_TLS_GD:
777 case R_MICROMIPS_TLS_GOTTPREL:
778 case R_MICROMIPS_TLS_LDM:
779@@ -5530,6 +5553,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
780 break;
781
782 case R_MIPS_TLS_DTPREL_HI16:
783+ case R_MIPS16_TLS_DTPREL_HI16:
784 case R_MICROMIPS_TLS_DTPREL_HI16:
785 value = (mips_elf_high (addend + symbol - dtprel_base (info))
786 & howto->dst_mask);
787@@ -5538,17 +5562,22 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
788 case R_MIPS_TLS_DTPREL_LO16:
789 case R_MIPS_TLS_DTPREL32:
790 case R_MIPS_TLS_DTPREL64:
791+ case R_MIPS16_TLS_DTPREL_LO16:
792 case R_MICROMIPS_TLS_DTPREL_LO16:
793 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
794 break;
795
796 case R_MIPS_TLS_TPREL_HI16:
797+ case R_MIPS16_TLS_TPREL_HI16:
798 case R_MICROMIPS_TLS_TPREL_HI16:
799 value = (mips_elf_high (addend + symbol - tprel_base (info))
800 & howto->dst_mask);
801 break;
802
803 case R_MIPS_TLS_TPREL_LO16:
804+ case R_MIPS_TLS_TPREL32:
805+ case R_MIPS_TLS_TPREL64:
806+ case R_MIPS16_TLS_TPREL_LO16:
807 case R_MICROMIPS_TLS_TPREL_LO16:
808 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
809 break;
810@@ -5681,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
811 case R_MIPS_TLS_GOTTPREL:
812 case R_MIPS_TLS_LDM:
813 case R_MIPS_GOT_DISP:
814+ case R_MIPS16_TLS_GD:
815+ case R_MIPS16_TLS_GOTTPREL:
816+ case R_MIPS16_TLS_LDM:
817 case R_MICROMIPS_TLS_GD:
818 case R_MICROMIPS_TLS_GOTTPREL:
819 case R_MICROMIPS_TLS_LDM:
820@@ -7813,8 +7845,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
821 can_make_dynamic_p = FALSE;
822 switch (r_type)
823 {
824- case R_MIPS16_GOT16:
825- case R_MIPS16_CALL16:
826 case R_MIPS_GOT16:
827 case R_MIPS_CALL16:
828 case R_MIPS_CALL_HI16:
829@@ -7827,6 +7857,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
830 case R_MIPS_TLS_GOTTPREL:
831 case R_MIPS_TLS_GD:
832 case R_MIPS_TLS_LDM:
833+ case R_MIPS16_GOT16:
834+ case R_MIPS16_CALL16:
835+ case R_MIPS16_TLS_GOTTPREL:
836+ case R_MIPS16_TLS_GD:
837+ case R_MIPS16_TLS_LDM:
838 case R_MICROMIPS_GOT16:
839 case R_MICROMIPS_CALL16:
840 case R_MICROMIPS_CALL_HI16:
841@@ -8063,12 +8098,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
842 break;
843
844 case R_MIPS_TLS_GOTTPREL:
845+ case R_MIPS16_TLS_GOTTPREL:
846 case R_MICROMIPS_TLS_GOTTPREL:
847 if (info->shared)
848 info->flags |= DF_STATIC_TLS;
849 /* Fall through */
850
851 case R_MIPS_TLS_LDM:
852+ case R_MIPS16_TLS_LDM:
853 case R_MICROMIPS_TLS_LDM:
854 if (tls_ldm_reloc_p (r_type))
855 {
856@@ -8078,6 +8115,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
857 /* Fall through */
858
859 case R_MIPS_TLS_GD:
860+ case R_MIPS16_TLS_GD:
861 case R_MICROMIPS_TLS_GD:
862 /* This symbol requires a global offset table entry, or two
863 for TLS GD relocations. */
864diff --git a/bfd/libbfd.h b/bfd/libbfd.h
865index 200a6fa..0395ec2 100644
866--- a/bfd/libbfd.h
867+++ b/bfd/libbfd.h
868@@ -1086,6 +1086,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
869 "BFD_RELOC_MIPS16_HI16",
870 "BFD_RELOC_MIPS16_HI16_S",
871 "BFD_RELOC_MIPS16_LO16",
872+ "BFD_RELOC_MIPS16_TLS_GD",
873+ "BFD_RELOC_MIPS16_TLS_LDM",
874+ "BFD_RELOC_MIPS16_TLS_DTPREL_HI16",
875+ "BFD_RELOC_MIPS16_TLS_DTPREL_LO16",
876+ "BFD_RELOC_MIPS16_TLS_GOTTPREL",
877+ "BFD_RELOC_MIPS16_TLS_TPREL_HI16",
878+ "BFD_RELOC_MIPS16_TLS_TPREL_LO16",
879 "BFD_RELOC_MIPS_LITERAL",
880 "BFD_RELOC_MICROMIPS_LITERAL",
881 "BFD_RELOC_MICROMIPS_7_PCREL_S1",
882diff --git a/bfd/reloc.c b/bfd/reloc.c
883index 6ac7148..ef55cc3 100644
884--- a/bfd/reloc.c
885+++ b/bfd/reloc.c
886@@ -2247,6 +2247,23 @@ ENUMDOC
887 MIPS16 low 16 bits.
888
889 ENUM
890+ BFD_RELOC_MIPS16_TLS_GD
891+ENUMX
892+ BFD_RELOC_MIPS16_TLS_LDM
893+ENUMX
894+ BFD_RELOC_MIPS16_TLS_DTPREL_HI16
895+ENUMX
896+ BFD_RELOC_MIPS16_TLS_DTPREL_LO16
897+ENUMX
898+ BFD_RELOC_MIPS16_TLS_GOTTPREL
899+ENUMX
900+ BFD_RELOC_MIPS16_TLS_TPREL_HI16
901+ENUMX
902+ BFD_RELOC_MIPS16_TLS_TPREL_LO16
903+ENUMDOC
904+ MIPS16 TLS relocations
905+
906+ENUM
907 BFD_RELOC_MIPS_LITERAL
908 ENUMX
909 BFD_RELOC_MICROMIPS_LITERAL
910diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
911index 0e4c66e..0fb3a6e 100644
912--- a/gas/config/tc-mips.c
913+++ b/gas/config/tc-mips.c
914@@ -1352,6 +1352,8 @@ static void s_cprestore (int);
915 static void s_cpreturn (int);
916 static void s_dtprelword (int);
917 static void s_dtpreldword (int);
918+static void s_tprelword (int);
919+static void s_tpreldword (int);
920 static void s_gpvalue (int);
921 static void s_gpword (int);
922 static void s_gpdword (int);
923@@ -1431,6 +1433,8 @@ static const pseudo_typeS mips_pseudo_table[] =
924 {"cpreturn", s_cpreturn, 0},
925 {"dtprelword", s_dtprelword, 0},
926 {"dtpreldword", s_dtpreldword, 0},
927+ {"tprelword", s_tprelword, 0},
928+ {"tpreldword", s_tpreldword, 0},
929 {"gpvalue", s_gpvalue, 0},
930 {"gpword", s_gpword, 0},
931 {"gpdword", s_gpdword, 0},
932@@ -14040,7 +14044,14 @@ static const struct percent_op_match mips16_percent_op[] =
933 {"%gprel", BFD_RELOC_MIPS16_GPREL},
934 {"%got", BFD_RELOC_MIPS16_GOT16},
935 {"%call16", BFD_RELOC_MIPS16_CALL16},
936- {"%hi", BFD_RELOC_MIPS16_HI16_S}
937+ {"%hi", BFD_RELOC_MIPS16_HI16_S},
938+ {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
939+ {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
940+ {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
941+ {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
942+ {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
943+ {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
944+ {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
945 };
946
947
948@@ -15369,6 +15380,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
949 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
950 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
951 case BFD_RELOC_MIPS_TLS_GOTTPREL:
952+ case BFD_RELOC_MIPS_TLS_TPREL32:
953+ case BFD_RELOC_MIPS_TLS_TPREL64:
954 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
955 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
956 case BFD_RELOC_MICROMIPS_TLS_GD:
957@@ -15378,6 +15391,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
958 case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
959 case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
960 case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
961+ case BFD_RELOC_MIPS16_TLS_GD:
962+ case BFD_RELOC_MIPS16_TLS_LDM:
963+ case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
964+ case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
965+ case BFD_RELOC_MIPS16_TLS_GOTTPREL:
966+ case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
967+ case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
968 S_SET_THREAD_LOCAL (fixP->fx_addsy);
969 /* fall through */
970
971@@ -16547,12 +16567,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
972 demand_empty_rest_of_line ();
973 }
974
975-/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
976- a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
977- use in DWARF debug information. */
978+/* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
979+ pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
980+ DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
981+ debug information or MIPS16 TLS. */
982
983 static void
984-s_dtprel_internal (size_t bytes)
985+s_tls_rel_directive (const size_t bytes, const char *dirstr,
986+ bfd_reloc_code_real_type rtype)
987 {
988 expressionS ex;
989 char *p;
990@@ -16561,19 +16583,13 @@ s_dtprel_internal (size_t bytes)
991
992 if (ex.X_op != O_symbol)
993 {
994- as_bad (_("Unsupported use of %s"), (bytes == 8
995- ? ".dtpreldword"
996- : ".dtprelword"));
997+ as_bad (_("Unsupported use of %s"), dirstr);
998 ignore_rest_of_line ();
999 }
1000
1001 p = frag_more (bytes);
1002 md_number_to_chars (p, 0, bytes);
1003- fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
1004- (bytes == 8
1005- ? BFD_RELOC_MIPS_TLS_DTPREL64
1006- : BFD_RELOC_MIPS_TLS_DTPREL32));
1007-
1008+ fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
1009 demand_empty_rest_of_line ();
1010 }
1011
1012@@ -16582,7 +16598,7 @@ s_dtprel_internal (size_t bytes)
1013 static void
1014 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1015 {
1016- s_dtprel_internal (4);
1017+ s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
1018 }
1019
1020 /* Handle .dtpreldword. */
1021@@ -16590,7 +16606,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
1022 static void
1023 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
1024 {
1025- s_dtprel_internal (8);
1026+ s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
1027+}
1028+
1029+/* Handle .tprelword. */
1030+
1031+static void
1032+s_tprelword (int ignore ATTRIBUTE_UNUSED)
1033+{
1034+ s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
1035+}
1036+
1037+/* Handle .tpreldword. */
1038+
1039+static void
1040+s_tpreldword (int ignore ATTRIBUTE_UNUSED)
1041+{
1042+ s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
1043 }
1044
1045 /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
1046diff --git a/include/elf/mips.h b/include/elf/mips.h
1047index db5fa54..c2c5922 100644
1048--- a/include/elf/mips.h
1049+++ b/include/elf/mips.h
1050@@ -98,7 +98,14 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
1051 RELOC_NUMBER (R_MIPS16_CALL16, 103)
1052 RELOC_NUMBER (R_MIPS16_HI16, 104)
1053 RELOC_NUMBER (R_MIPS16_LO16, 105)
1054- FAKE_RELOC (R_MIPS16_max, 106)
1055+ RELOC_NUMBER (R_MIPS16_TLS_GD, 106)
1056+ RELOC_NUMBER (R_MIPS16_TLS_LDM, 107)
1057+ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108)
1058+ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109)
1059+ RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110)
1060+ RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111)
1061+ RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112)
1062+ FAKE_RELOC (R_MIPS16_max, 113)
1063 /* These relocations are specific to VxWorks. */
1064 RELOC_NUMBER (R_MIPS_COPY, 126)
1065 RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127)
1066--
10671.7.9.5
1068
diff --git a/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch b/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch
new file mode 100644
index 0000000000..453ef2211c
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch
@@ -0,0 +1,1944 @@
1Upstream-Status: Backport
2
3From 624da0376264205e399bc14fe2fa7b6fa659d0ee Mon Sep 17 00:00:00 2001
4From: Ian Lance Taylor <ian@airs.com>
5Date: Mon, 19 Dec 2011 21:14:39 +0000
6Subject: [PATCH 038/262] Copy from mainline to binutils 2.22 branch:
7
8 2011-12-17 Cary Coutant <ccoutant@google.com>
9
10 * dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Add casts.
11 * resolve.cc (Symbol_table::resolve): Likewise.
12 * i386.cc (Target_i386::do_code_fill): Use char constants for nop
13 arrays.
14 * x86_64.cc (Target_x86_64::do_code_fill): Likewise.
15
16 2011-10-31 Cary Coutant <ccoutant@google.com>
17
18 PR gold/13023
19 * expression.cc (Expression::eval_with_dot): Add
20 is_section_dot_assignment parameter.
21 (Expression::eval_maybe_dot): Likewise. Adjust value when rhs is
22 absolute and assigning to dot within a section.
23 * script-sections.cc
24 (Output_section_element_assignment::set_section_addresses): Pass
25 dot_section to set_if_absolute.
26 (Output_section_element_dot_assignment::finalize_symbols): Pass TRUE
27 as is_section_dot_assignment flag to eval_with_dot.
28 (Output_section_element_dot_assignment::set_section_addresses):
29 Likewise.
30 * script.cc (Symbol_assignment::set_if_absolute): Add dot_section
31 parameter. Also set value if relative to dot_section; set the
32 symbol's output_section.
33 * script.h (Expression::eval_with_dot): Add is_section_dot_assignment
34 parameter. Adjust all callers.
35 (Expression::eval_maybe_dot): Likewise.
36 (Symbol_assignment::set_if_absolute): Add dot_section parameter.
37 Adjust all callers.
38 * testsuite/script_test_2.t: Test assignment of an absolute value
39 to dot within an output section element.
40
41 2011-10-31 Cary Coutant <ccoutant@google.com>
42
43 * options.h (class General_options): Add --[no-]gnu-unique options.
44 * symtab.cc (Symbol_table::sized_write_globals): Convert
45 STB_GNU_UNIQUE to STB_GLOBAL if --no-gnu-unique.
46
47 2011-10-31 Cary Coutant <ccoutant@google.com>
48
49 PR gold/13359
50 * i386.cc (Target_i386::Relocate::relocate_tls): Remove
51 unnecessary assertion.
52 * x86_64.cc (Target_x86_64::Relocate::relocate_tls): Likewise.
53
54 2011-10-31 Sriraman Tallam <tmsriram@google.com>
55
56 * symtab.h (Symbol_table::gc_mark_symbol_for_shlib): Rename to
57 gc_mark_symbol.
58 * symtab.cc (Symbol_table::gc_mark_symbol_for_shlib): Rename to
59 gc_mark_symbol.
60 Change to just keep the section associated with symbol.
61 (Symbol_table::add_from_relobj): Mark symbols as not garbage when
62 they are externally visible and --export-dynamic is turned on.
63 (Symbol_table::gc_mark_dyn_syms): Call gc_mark_symbol.
64
65 2011-10-19 Ian Lance Taylor <iant@google.com>
66
67 PR gold/13163
68 * script-sections.cc
69 (Output_section_element_dot_assignment::needs_output_section): New
70 function.
71
72 2011-10-19 Ian Lance Taylor <iant@google.com>
73
74 PR gold/13204
75 * layout.cc (Layout::segment_precedes): Don't assert failure if a
76 --section-start option was seen.
77 * options.h (General_options::any_section_start): New function.
78
79 2011-10-18 Cary Coutant <ccoutant@google.com>
80
81 * output.cc (posix_fallocate): Return 0 on success, errno on failure.
82 (Output_file::map_no_anonymous): Check for non-zero
83 return code from posix_fallocate.
84
85 2011-10-17 Cary Coutant <ccoutant@google.com>
86
87 PR gold/13245
88 * plugin.cc (is_visible_from_outside): Check for symbols
89 referenced from dynamic objects.
90 * resolve.cc (Symbol_table::resolve): Don't count references
91 from dynamic objects as references from real ELF files.
92 * testsuite/plugin_test_2.sh: Adjust expected result.
93
94 2011-10-17 Cary Coutant <ccoutant@google.com>
95
96 * readsyms.cc (Read_symbols::run): Don't queue an unblocker
97 task for members of lib groups.
98
99 2011-10-17 Cary Coutant <ccoutant@google.com>
100
101 PR gold/13288
102 * fileread.cc (File_read::find_view): Add assert.
103 (File_read::make_view): Move bounds check (replace with assert)...
104 (File_read::find_or_make_view): ... to here.
105
106 2011-10-12 Cary Coutant <ccoutant@google.com>
107
108 * output.cc (Output_file::open_base_file): Handle case where
109 ::read returns less than requested size.
110
111 2011-10-10 Cary Coutant <ccoutant@google.com>
112
113 * incremental.cc (Sized_relobj_incr::Sized_relobj_incr):
114 Initialize defined_count_.
115 (Sized_relobj_incr::do_add_symbols): Count defined symbols.
116 (Sized_relobj_incr::do_get_global_symbol_counts): Rewrite.
117 (Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_.
118 (Sized_incr_dynobj::do_add_symbols): Count defined symbols.
119 (Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite.
120 * incremental.h (Sized_relobj_incr::defined_count_): New data
121 member.
122 (Sized_incr_dynobj::defined_count_): New data member.
123 * plugin.cc (Sized_pluginobj::do_get_global_symbol_counts):
124 Return zeroes instead of internal error.
125
126 2011-10-10 Cary Coutant <ccoutant@google.com>
127
128 PR gold/13249
129 * output.cc (Output_reloc::Output_reloc): Add use_plt_offset flag.
130 (Output_reloc::symbol_value): Return PLT offset if flag is set.
131 * output.h (class Output_reloc): Add use_plt_offset flag.
132 (Output_reloc::type_): Adjust size of bit field.
133 (Output_reloc::use_plt_offset_): New bit field.
134 (class Output_data_reloc): Adjust all calls to Output_reloc_type.
135 (Output_data_reloc::add_local_relative): (RELA only) Add use_plt_offset
136 flag. Adjust all callers.
137 * x86_64.cc (Target_x86_64::Scan::local): Check for IFUNC when
138 creating RELATIVE relocations.
139
140 2011-10-03 Diego Novillo <dnovillo@google.com>
141
142 * options.cc (parse_uint): Fix dereference of RETVAL.
143
144 2011-09-29 Cary Coutant <ccoutant@google.com>
145
146 * incremental.cc (Sized_incremental_binary::do_process_got_plt):
147 Check for NULL.
148 * symtab.cc (Symbol_table::add_from_relobj): Ignore version
149 symbols during incremental update.
150 (Symbol_table::add_from_dynobj): Likewise.
151
152 2011-09-26 Cary Coutant <ccoutant@google.com>
153
154 * gold.cc (queue_initial_tasks): Move option checks ...
155 * options.cc (General_options::finalize): ... to here. Disable
156 some options; make others fatal.
157
158 2011-09-23 Simon Baldwin <simonb@google.com>
159
160 * configure.ac: Add new --with-gold-ldadd and --with-gold-ldflags
161 configuration options.
162 * configure: Regenerate.
163 * Makefile.am: Handle GOLD_LDADD and GOLD_LDFLAGS.
164 * Makefile.in: Regenerate.
165 * testsuite/Makefile.in: Regenerate.
166---
167 gold/ChangeLog | 163 +++++++++++++++++++++++++++++++++++++++
168 gold/dwarf_reader.cc | 8 +-
169 gold/expression.cc | 45 +++++++----
170 gold/fileread.cc | 27 ++++---
171 gold/gold.cc | 55 +++++--------
172 gold/i386.cc | 87 +++++++++++----------
173 gold/incremental.cc | 50 +++++++++---
174 gold/incremental.h | 4 +
175 gold/layout.cc | 5 +-
176 gold/options.cc | 33 +++++++-
177 gold/options.h | 9 +++
178 gold/output.cc | 78 ++++++++++++-------
179 gold/output.h | 64 +++++++++------
180 gold/plugin.cc | 18 +++--
181 gold/powerpc.cc | 4 +-
182 gold/readsyms.cc | 6 +-
183 gold/resolve.cc | 6 +-
184 gold/script-sections.cc | 47 +++++++----
185 gold/script.cc | 17 ++--
186 gold/script.h | 24 ++++--
187 gold/sparc.cc | 4 +-
188 gold/symtab.cc | 65 +++++++++-------
189 gold/symtab.h | 5 +-
190 gold/testsuite/Makefile.in | 2 +
191 gold/testsuite/plugin_test_2.sh | 2 +-
192 gold/testsuite/script_test_2.t | 2 +-
193 gold/x86_64.cc | 99 ++++++++++++------------
194 27 files changed, 636 insertions(+), 293 deletions(-)
195
196diff --git a/gold/dwarf_reader.cc b/gold/dwarf_reader.cc
197index 3dc33e4..2b47a28 100644
198--- a/gold/dwarf_reader.cc
199+++ b/gold/dwarf_reader.cc
200@@ -1,6 +1,6 @@
201 // dwarf_reader.cc -- parse dwarf2/3 debug information
202
203-// Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
204+// Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
205 // Written by Ian Lance Taylor <iant@google.com>.
206
207 // This file is part of gold.
208@@ -491,8 +491,10 @@ Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr
209 && (shndx == -1U || lsm.shndx == -1U || shndx == lsm.shndx))
210 {
211 Offset_to_lineno_entry entry
212- = { lsm.address, this->current_header_index_,
213- lsm.file_num, true, lsm.line_num };
214+ = { static_cast<off_t>(lsm.address),
215+ this->current_header_index_,
216+ static_cast<unsigned int>(lsm.file_num),
217+ true, lsm.line_num };
218 std::vector<Offset_to_lineno_entry>&
219 map(this->line_number_map_[lsm.shndx]);
220 // If we see two consecutive entries with the same
221diff --git a/gold/expression.cc b/gold/expression.cc
222index e527b5e..e31c151 100644
223--- a/gold/expression.cc
224+++ b/gold/expression.cc
225@@ -1,6 +1,6 @@
226 // expression.cc -- expressions in linker scripts for gold
227
228-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
229+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
230 // Written by Ian Lance Taylor <iant@google.com>.
231
232 // This file is part of gold.
233@@ -77,7 +77,7 @@ Expression::eval(const Symbol_table* symtab, const Layout* layout,
234 bool check_assertions)
235 {
236 return this->eval_maybe_dot(symtab, layout, check_assertions,
237- false, 0, NULL, NULL, NULL);
238+ false, 0, NULL, NULL, NULL, false);
239 }
240
241 // Evaluate an expression which may refer to the dot symbol.
242@@ -87,11 +87,13 @@ Expression::eval_with_dot(const Symbol_table* symtab, const Layout* layout,
243 bool check_assertions, uint64_t dot_value,
244 Output_section* dot_section,
245 Output_section** result_section_pointer,
246- uint64_t* result_alignment_pointer)
247+ uint64_t* result_alignment_pointer,
248+ bool is_section_dot_assignment)
249 {
250 return this->eval_maybe_dot(symtab, layout, check_assertions, true,
251 dot_value, dot_section, result_section_pointer,
252- result_alignment_pointer);
253+ result_alignment_pointer,
254+ is_section_dot_assignment);
255 }
256
257 // Evaluate an expression which may or may not refer to the dot
258@@ -102,7 +104,8 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
259 bool check_assertions, bool is_dot_available,
260 uint64_t dot_value, Output_section* dot_section,
261 Output_section** result_section_pointer,
262- uint64_t* result_alignment_pointer)
263+ uint64_t* result_alignment_pointer,
264+ bool is_section_dot_assignment)
265 {
266 Expression_eval_info eei;
267 eei.symtab = symtab;
268@@ -113,14 +116,24 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
269 eei.dot_section = dot_section;
270
271 // We assume the value is absolute, and only set this to a section
272- // if we find a section relative reference.
273+ // if we find a section-relative reference.
274 if (result_section_pointer != NULL)
275 *result_section_pointer = NULL;
276 eei.result_section_pointer = result_section_pointer;
277
278 eei.result_alignment_pointer = result_alignment_pointer;
279
280- return this->value(&eei);
281+ uint64_t val = this->value(&eei);
282+
283+ // If this is an assignment to dot within a section, and the value
284+ // is absolute, treat it as a section-relative offset.
285+ if (is_section_dot_assignment && *result_section_pointer == NULL)
286+ {
287+ gold_assert(dot_section != NULL);
288+ val += dot_section->address();
289+ *result_section_pointer = dot_section;
290+ }
291+ return val;
292 }
293
294 // A number.
295@@ -257,7 +270,8 @@ class Unary_expression : public Expression
296 eei->dot_value,
297 eei->dot_section,
298 arg_section_pointer,
299- eei->result_alignment_pointer);
300+ eei->result_alignment_pointer,
301+ false);
302 }
303
304 void
305@@ -336,7 +350,8 @@ class Binary_expression : public Expression
306 eei->dot_value,
307 eei->dot_section,
308 section_pointer,
309- alignment_pointer);
310+ alignment_pointer,
311+ false);
312 }
313
314 uint64_t
315@@ -350,7 +365,8 @@ class Binary_expression : public Expression
316 eei->dot_value,
317 eei->dot_section,
318 section_pointer,
319- alignment_pointer);
320+ alignment_pointer,
321+ false);
322 }
323
324 void
325@@ -500,7 +516,8 @@ class Trinary_expression : public Expression
326 eei->dot_value,
327 eei->dot_section,
328 section_pointer,
329- NULL);
330+ NULL,
331+ false);
332 }
333
334 uint64_t
335@@ -514,7 +531,8 @@ class Trinary_expression : public Expression
336 eei->dot_value,
337 eei->dot_section,
338 section_pointer,
339- alignment_pointer);
340+ alignment_pointer,
341+ false);
342 }
343
344 uint64_t
345@@ -528,7 +546,8 @@ class Trinary_expression : public Expression
346 eei->dot_value,
347 eei->dot_section,
348 section_pointer,
349- alignment_pointer);
350+ alignment_pointer,
351+ false);
352 }
353
354 void
355diff --git a/gold/fileread.cc b/gold/fileread.cc
356index 80ddfbc..c5dc320 100644
357--- a/gold/fileread.cc
358+++ b/gold/fileread.cc
359@@ -329,6 +329,10 @@ inline File_read::View*
360 File_read::find_view(off_t start, section_size_type size,
361 unsigned int byteshift, File_read::View** vshifted) const
362 {
363+ gold_assert(start <= this->size_
364+ && (static_cast<unsigned long long>(size)
365+ <= static_cast<unsigned long long>(this->size_ - start)));
366+
367 if (vshifted != NULL)
368 *vshifted = NULL;
369
370@@ -456,16 +460,9 @@ File_read::make_view(off_t start, section_size_type size,
371 unsigned int byteshift, bool cache)
372 {
373 gold_assert(size > 0);
374-
375- // Check that start and end of the view are within the file.
376- if (start > this->size_
377- || (static_cast<unsigned long long>(size)
378- > static_cast<unsigned long long>(this->size_ - start)))
379- gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds "
380- "size of file; the file may be corrupt"),
381- this->filename().c_str(),
382- static_cast<long long>(size),
383- static_cast<long long>(start));
384+ gold_assert(start <= this->size_
385+ && (static_cast<unsigned long long>(size)
386+ <= static_cast<unsigned long long>(this->size_ - start)));
387
388 off_t poff = File_read::page_offset(start);
389
390@@ -523,6 +520,16 @@ File_read::View*
391 File_read::find_or_make_view(off_t offset, off_t start,
392 section_size_type size, bool aligned, bool cache)
393 {
394+ // Check that start and end of the view are within the file.
395+ if (start > this->size_
396+ || (static_cast<unsigned long long>(size)
397+ > static_cast<unsigned long long>(this->size_ - start)))
398+ gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds "
399+ "size of file; the file may be corrupt"),
400+ this->filename().c_str(),
401+ static_cast<long long>(size),
402+ static_cast<long long>(start));
403+
404 unsigned int byteshift;
405 if (offset == 0)
406 byteshift = 0;
407diff --git a/gold/gold.cc b/gold/gold.cc
408index 12f25b7..693ff79 100644
409--- a/gold/gold.cc
410+++ b/gold/gold.cc
411@@ -197,46 +197,29 @@ queue_initial_tasks(const General_options& options,
412 // For incremental links, the base output file.
413 Incremental_binary* ibase = NULL;
414
415- if (parameters->incremental())
416- {
417- if (options.relocatable())
418- gold_error(_("incremental linking is incompatible with -r"));
419- if (options.emit_relocs())
420- gold_error(_("incremental linking is incompatible with --emit-relocs"));
421- if (options.gc_sections())
422- gold_error(_("incremental linking is incompatible with --gc-sections"));
423- if (options.icf_enabled())
424- gold_error(_("incremental linking is incompatible with --icf"));
425- if (options.has_plugins())
426- gold_error(_("incremental linking is incompatible with --plugin"));
427- if (strcmp(options.compress_debug_sections(), "none") != 0)
428- gold_error(_("incremental linking is incompatible with "
429- "--compress-debug-sections"));
430-
431- if (parameters->incremental_update())
432+ if (parameters->incremental_update())
433+ {
434+ Output_file* of = new Output_file(options.output_file_name());
435+ if (of->open_base_file(options.incremental_base(), true))
436 {
437- Output_file* of = new Output_file(options.output_file_name());
438- if (of->open_base_file(options.incremental_base(), true))
439- {
440- ibase = open_incremental_binary(of);
441- if (ibase != NULL
442- && ibase->check_inputs(cmdline, layout->incremental_inputs()))
443- ibase->init_layout(layout);
444- else
445- {
446- delete ibase;
447- ibase = NULL;
448- of->close();
449- }
450- }
451- if (ibase == NULL)
452+ ibase = open_incremental_binary(of);
453+ if (ibase != NULL
454+ && ibase->check_inputs(cmdline, layout->incremental_inputs()))
455+ ibase->init_layout(layout);
456+ else
457 {
458- if (set_parameters_incremental_full())
459- gold_info(_("linking with --incremental-full"));
460- else
461- gold_fallback(_("restart link with --incremental-full"));
462+ delete ibase;
463+ ibase = NULL;
464+ of->close();
465 }
466 }
467+ if (ibase == NULL)
468+ {
469+ if (set_parameters_incremental_full())
470+ gold_info(_("linking with --incremental-full"));
471+ else
472+ gold_fallback(_("restart link with --incremental-full"));
473+ }
474 }
475
476 // Read the input files. We have to add the symbols to the symbol
477diff --git a/gold/i386.cc b/gold/i386.cc
478index 445bc68..efb6248 100644
479--- a/gold/i386.cc
480+++ b/gold/i386.cc
481@@ -2709,12 +2709,6 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
482 }
483 if (optimized_type == tls::TLSOPT_TO_IE)
484 {
485- if (tls_segment == NULL)
486- {
487- gold_assert(parameters->errors()->error_count() > 0
488- || issue_undefined_symbol_error(gsym));
489- return;
490- }
491 this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
492 got_offset, view, view_size);
493 break;
494@@ -3480,42 +3474,51 @@ Target_i386::do_code_fill(section_size_type length) const
495 }
496
497 // Nop sequences of various lengths.
498- const char nop1[1] = { 0x90 }; // nop
499- const char nop2[2] = { 0x66, 0x90 }; // xchg %ax %ax
500- const char nop3[3] = { 0x8d, 0x76, 0x00 }; // leal 0(%esi),%esi
501- const char nop4[4] = { 0x8d, 0x74, 0x26, 0x00}; // leal 0(%esi,1),%esi
502- const char nop5[5] = { 0x90, 0x8d, 0x74, 0x26, // nop
503- 0x00 }; // leal 0(%esi,1),%esi
504- const char nop6[6] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
505- 0x00, 0x00 };
506- const char nop7[7] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi
507- 0x00, 0x00, 0x00 };
508- const char nop8[8] = { 0x90, 0x8d, 0xb4, 0x26, // nop
509- 0x00, 0x00, 0x00, 0x00 }; // leal 0L(%esi,1),%esi
510- const char nop9[9] = { 0x89, 0xf6, 0x8d, 0xbc, // movl %esi,%esi
511- 0x27, 0x00, 0x00, 0x00, // leal 0L(%edi,1),%edi
512- 0x00 };
513- const char nop10[10] = { 0x8d, 0x76, 0x00, 0x8d, // leal 0(%esi),%esi
514- 0xbc, 0x27, 0x00, 0x00, // leal 0L(%edi,1),%edi
515- 0x00, 0x00 };
516- const char nop11[11] = { 0x8d, 0x74, 0x26, 0x00, // leal 0(%esi,1),%esi
517- 0x8d, 0xbc, 0x27, 0x00, // leal 0L(%edi,1),%edi
518- 0x00, 0x00, 0x00 };
519- const char nop12[12] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
520- 0x00, 0x00, 0x8d, 0xbf, // leal 0L(%edi),%edi
521- 0x00, 0x00, 0x00, 0x00 };
522- const char nop13[13] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
523- 0x00, 0x00, 0x8d, 0xbc, // leal 0L(%edi,1),%edi
524- 0x27, 0x00, 0x00, 0x00,
525- 0x00 };
526- const char nop14[14] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi
527- 0x00, 0x00, 0x00, 0x8d, // leal 0L(%edi,1),%edi
528- 0xbc, 0x27, 0x00, 0x00,
529- 0x00, 0x00 };
530- const char nop15[15] = { 0xeb, 0x0d, 0x90, 0x90, // jmp .+15
531- 0x90, 0x90, 0x90, 0x90, // nop,nop,nop,...
532- 0x90, 0x90, 0x90, 0x90,
533- 0x90, 0x90, 0x90 };
534+ const char nop1[1] = { '\x90' }; // nop
535+ const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax
536+ const char nop3[3] = { '\x8d', '\x76', '\x00' }; // leal 0(%esi),%esi
537+ const char nop4[4] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi
538+ '\x00'};
539+ const char nop5[5] = { '\x90', '\x8d', '\x74', // nop
540+ '\x26', '\x00' }; // leal 0(%esi,1),%esi
541+ const char nop6[6] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
542+ '\x00', '\x00', '\x00' };
543+ const char nop7[7] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi
544+ '\x00', '\x00', '\x00',
545+ '\x00' };
546+ const char nop8[8] = { '\x90', '\x8d', '\xb4', // nop
547+ '\x26', '\x00', '\x00', // leal 0L(%esi,1),%esi
548+ '\x00', '\x00' };
549+ const char nop9[9] = { '\x89', '\xf6', '\x8d', // movl %esi,%esi
550+ '\xbc', '\x27', '\x00', // leal 0L(%edi,1),%edi
551+ '\x00', '\x00', '\x00' };
552+ const char nop10[10] = { '\x8d', '\x76', '\x00', // leal 0(%esi),%esi
553+ '\x8d', '\xbc', '\x27', // leal 0L(%edi,1),%edi
554+ '\x00', '\x00', '\x00',
555+ '\x00' };
556+ const char nop11[11] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi
557+ '\x00', '\x8d', '\xbc', // leal 0L(%edi,1),%edi
558+ '\x27', '\x00', '\x00',
559+ '\x00', '\x00' };
560+ const char nop12[12] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
561+ '\x00', '\x00', '\x00', // leal 0L(%edi),%edi
562+ '\x8d', '\xbf', '\x00',
563+ '\x00', '\x00', '\x00' };
564+ const char nop13[13] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
565+ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi
566+ '\x8d', '\xbc', '\x27',
567+ '\x00', '\x00', '\x00',
568+ '\x00' };
569+ const char nop14[14] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi
570+ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi
571+ '\x00', '\x8d', '\xbc',
572+ '\x27', '\x00', '\x00',
573+ '\x00', '\x00' };
574+ const char nop15[15] = { '\xeb', '\x0d', '\x90', // jmp .+15
575+ '\x90', '\x90', '\x90', // nop,nop,nop,...
576+ '\x90', '\x90', '\x90',
577+ '\x90', '\x90', '\x90',
578+ '\x90', '\x90', '\x90' };
579
580 const char* nops[16] = {
581 NULL,
582diff --git a/gold/incremental.cc b/gold/incremental.cc
583index b422827..75e44c5 100644
584--- a/gold/incremental.cc
585+++ b/gold/incremental.cc
586@@ -685,7 +685,7 @@ Sized_incremental_binary<size, big_endian>::do_process_got_plt(
587 gold_assert(plt_desc >= first_global && plt_desc < symtab_count);
588 Symbol* sym = this->global_symbol(plt_desc - first_global);
589 // Add the PLT entry only if the symbol is still referenced.
590- if (sym->in_reg())
591+ if (sym != NULL && sym->in_reg())
592 {
593 gold_debug(DEBUG_INCREMENTAL,
594 "PLT entry %d: %s",
595@@ -1966,8 +1966,9 @@ Sized_relobj_incr<size, big_endian>::Sized_relobj_incr(
596 input_reader_(ibase->inputs_reader().input_file(input_file_index)),
597 local_symbol_count_(0), output_local_dynsym_count_(0),
598 local_symbol_index_(0), local_symbol_offset_(0), local_dynsym_offset_(0),
599- symbols_(), incr_reloc_offset_(-1U), incr_reloc_count_(0),
600- incr_reloc_output_index_(0), incr_relocs_(NULL), local_symbols_()
601+ symbols_(), defined_count_(0), incr_reloc_offset_(-1U),
602+ incr_reloc_count_(0), incr_reloc_output_index_(0), incr_relocs_(NULL),
603+ local_symbols_()
604 {
605 if (this->input_reader_.is_in_system_directory())
606 this->set_is_in_system_directory();
607@@ -2120,6 +2121,9 @@ Sized_relobj_incr<size, big_endian>::do_add_symbols(
608
609 Symbol* res = symtab->add_from_incrobj(this, name, NULL, &sym);
610
611+ if (shndx != elfcpp::SHN_UNDEF)
612+ ++this->defined_count_;
613+
614 // If this is a linker-defined symbol that hasn't yet been defined,
615 // define it now.
616 if (input_shndx == -1U && !res->is_defined())
617@@ -2283,9 +2287,21 @@ Sized_relobj_incr<size, big_endian>::do_initialize_xindex()
618 template<int size, bool big_endian>
619 void
620 Sized_relobj_incr<size, big_endian>::do_get_global_symbol_counts(
621- const Symbol_table*, size_t*, size_t*) const
622-{
623- gold_unreachable();
624+ const Symbol_table*,
625+ size_t* defined,
626+ size_t* used) const
627+{
628+ *defined = this->defined_count_;
629+ size_t count = 0;
630+ for (typename Symbols::const_iterator p = this->symbols_.begin();
631+ p != this->symbols_.end();
632+ ++p)
633+ if (*p != NULL
634+ && (*p)->source() == Symbol::FROM_OBJECT
635+ && (*p)->object() == this
636+ && (*p)->is_defined())
637+ ++count;
638+ *used = count;
639 }
640
641 // Read the relocs.
642@@ -2579,7 +2595,7 @@ Sized_incr_dynobj<size, big_endian>::Sized_incr_dynobj(
643 : Dynobj(name, NULL), ibase_(ibase),
644 input_file_index_(input_file_index),
645 input_reader_(ibase->inputs_reader().input_file(input_file_index)),
646- symbols_()
647+ symbols_(), defined_count_(0)
648 {
649 if (this->input_reader_.is_in_system_directory())
650 this->set_is_in_system_directory();
651@@ -2677,6 +2693,7 @@ Sized_incr_dynobj<size, big_endian>::do_add_symbols(
652 // is meaningless, as long as it's not SHN_UNDEF.
653 shndx = 1;
654 v = gsym.get_st_value();
655+ ++this->defined_count_;
656 }
657
658 osym.put_st_name(0);
659@@ -2845,9 +2862,22 @@ Sized_incr_dynobj<size, big_endian>::do_initialize_xindex()
660 template<int size, bool big_endian>
661 void
662 Sized_incr_dynobj<size, big_endian>::do_get_global_symbol_counts(
663- const Symbol_table*, size_t*, size_t*) const
664-{
665- gold_unreachable();
666+ const Symbol_table*,
667+ size_t* defined,
668+ size_t* used) const
669+{
670+ *defined = this->defined_count_;
671+ size_t count = 0;
672+ for (typename Symbols::const_iterator p = this->symbols_.begin();
673+ p != this->symbols_.end();
674+ ++p)
675+ if (*p != NULL
676+ && (*p)->source() == Symbol::FROM_OBJECT
677+ && (*p)->object() == this
678+ && (*p)->is_defined()
679+ && (*p)->dynsym_index() != -1U)
680+ ++count;
681+ *used = count;
682 }
683
684 // Allocate an incremental object of the appropriate size and endianness.
685diff --git a/gold/incremental.h b/gold/incremental.h
686index e6732df..56fc52b 100644
687--- a/gold/incremental.h
688+++ b/gold/incremental.h
689@@ -1996,6 +1996,8 @@ class Sized_relobj_incr : public Sized_relobj<size, big_endian>
690 unsigned int local_dynsym_offset_;
691 // The entries in the symbol table for the external symbols.
692 Symbols symbols_;
693+ // Number of symbols defined in object file itself.
694+ size_t defined_count_;
695 // The offset of the first incremental relocation for this object.
696 unsigned int incr_reloc_offset_;
697 // The number of incremental relocations for this object.
698@@ -2127,6 +2129,8 @@ class Sized_incr_dynobj : public Dynobj
699 Input_entry_reader input_reader_;
700 // The entries in the symbol table for the external symbols.
701 Symbols symbols_;
702+ // Number of symbols defined in object file itself.
703+ size_t defined_count_;
704 };
705
706 // Allocate an incremental object of the appropriate size and endianness.
707diff --git a/gold/layout.cc b/gold/layout.cc
708index 1c32bcf..9d8a43a 100644
709--- a/gold/layout.cc
710+++ b/gold/layout.cc
711@@ -2975,8 +2975,9 @@ Layout::segment_precedes(const Output_segment* seg1,
712
713 // We shouldn't get here--we shouldn't create segments which we
714 // can't distinguish. Unless of course we are using a weird linker
715- // script.
716- gold_assert(this->script_options_->saw_phdrs_clause());
717+ // script or overlapping --section-start options.
718+ gold_assert(this->script_options_->saw_phdrs_clause()
719+ || parameters->options().any_section_start());
720 return false;
721 }
722
723diff --git a/gold/options.cc b/gold/options.cc
724index be32645..dcf6ba7 100644
725--- a/gold/options.cc
726+++ b/gold/options.cc
727@@ -198,7 +198,7 @@ parse_uint(const char* option_name, const char* arg, int* retval)
728 {
729 char* endptr;
730 *retval = strtol(arg, &endptr, 0);
731- if (*endptr != '\0' || retval < 0)
732+ if (*endptr != '\0' || *retval < 0)
733 gold_fatal(_("%s: invalid option value (expected an integer): %s"),
734 option_name, arg);
735 }
736@@ -1224,6 +1224,37 @@ General_options::finalize()
737 gold_fatal(_("Options --incremental-changed, --incremental-unchanged, "
738 "--incremental-unknown require the use of --incremental"));
739
740+ // Check for options that are not compatible with incremental linking.
741+ // Where an option can be disabled without seriously changing the semantics
742+ // of the link, we turn the option off; otherwise, we issue a fatal error.
743+
744+ if (this->incremental_mode_ != INCREMENTAL_OFF)
745+ {
746+ if (this->relocatable())
747+ gold_fatal(_("incremental linking is not compatible with -r"));
748+ if (this->emit_relocs())
749+ gold_fatal(_("incremental linking is not compatible with "
750+ "--emit-relocs"));
751+ if (this->has_plugins())
752+ gold_fatal(_("incremental linking is not compatible with --plugin"));
753+ if (this->gc_sections())
754+ {
755+ gold_warning(_("ignoring --gc-sections for an incremental link"));
756+ this->set_gc_sections(false);
757+ }
758+ if (this->icf_enabled())
759+ {
760+ gold_warning(_("ignoring --icf for an incremental link"));
761+ this->set_icf_status(ICF_NONE);
762+ }
763+ if (strcmp(this->compress_debug_sections(), "none") != 0)
764+ {
765+ gold_warning(_("ignoring --compress-debug-sections for an "
766+ "incremental link"));
767+ this->set_compress_debug_sections("none");
768+ }
769+ }
770+
771 // FIXME: we can/should be doing a lot more sanity checking here.
772 }
773
774diff --git a/gold/options.h b/gold/options.h
775index 768df9c..8876a1e 100644
776--- a/gold/options.h
777+++ b/gold/options.h
778@@ -791,6 +791,10 @@ class General_options
779 DEFINE_bool(g, options::EXACTLY_ONE_DASH, '\0', false,
780 N_("Ignored"), NULL);
781
782+ DEFINE_bool(gnu_unique, options::TWO_DASHES, '\0', true,
783+ N_("Enable STB_GNU_UNIQUE symbol binding (default)"),
784+ N_("Disable STB_GNU_UNIQUE symbol binding"));
785+
786 DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
787 N_("Set shared library name"), N_("FILENAME"));
788
789@@ -1385,6 +1389,11 @@ class General_options
790 bool
791 section_start(const char* secname, uint64_t* paddr) const;
792
793+ // Return whether any --section-start option was used.
794+ bool
795+ any_section_start() const
796+ { return !this->section_starts_.empty(); }
797+
798 enum Fix_v4bx
799 {
800 // Leave original instruction.
801diff --git a/gold/output.cc b/gold/output.cc
802index 29d8e3d..a7e1e9a 100644
803--- a/gold/output.cc
804+++ b/gold/output.cc
805@@ -119,7 +119,9 @@ extern "C" void *gold_mremap(void *, size_t, size_t, int);
806 static int
807 posix_fallocate(int o, off_t offset, off_t len)
808 {
809- return ftruncate(o, offset + len);
810+ if (ftruncate(o, offset + len) < 0)
811+ return errno;
812+ return 0;
813 }
814 #endif // !defined(HAVE_POSIX_FALLOCATE)
815
816@@ -706,7 +708,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
817 bool is_symbolless)
818 : address_(address), local_sym_index_(GSYM_CODE), type_(type),
819 is_relative_(is_relative), is_symbolless_(is_symbolless),
820- is_section_symbol_(false), shndx_(INVALID_CODE)
821+ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
822 {
823 // this->type_ is a bitfield; make sure TYPE fits.
824 gold_assert(this->type_ == type);
825@@ -727,7 +729,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
826 bool is_symbolless)
827 : address_(address), local_sym_index_(GSYM_CODE), type_(type),
828 is_relative_(is_relative), is_symbolless_(is_symbolless),
829- is_section_symbol_(false), shndx_(shndx)
830+ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
831 {
832 gold_assert(shndx != INVALID_CODE);
833 // this->type_ is a bitfield; make sure TYPE fits.
834@@ -749,10 +751,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
835 Address address,
836 bool is_relative,
837 bool is_symbolless,
838- bool is_section_symbol)
839+ bool is_section_symbol,
840+ bool use_plt_offset)
841 : address_(address), local_sym_index_(local_sym_index), type_(type),
842 is_relative_(is_relative), is_symbolless_(is_symbolless),
843- is_section_symbol_(is_section_symbol), shndx_(INVALID_CODE)
844+ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
845+ shndx_(INVALID_CODE)
846 {
847 gold_assert(local_sym_index != GSYM_CODE
848 && local_sym_index != INVALID_CODE);
849@@ -773,10 +777,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
850 Address address,
851 bool is_relative,
852 bool is_symbolless,
853- bool is_section_symbol)
854+ bool is_section_symbol,
855+ bool use_plt_offset)
856 : address_(address), local_sym_index_(local_sym_index), type_(type),
857 is_relative_(is_relative), is_symbolless_(is_symbolless),
858- is_section_symbol_(is_section_symbol), shndx_(shndx)
859+ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
860+ shndx_(shndx)
861 {
862 gold_assert(local_sym_index != GSYM_CODE
863 && local_sym_index != INVALID_CODE);
864@@ -799,7 +805,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
865 Address address)
866 : address_(address), local_sym_index_(SECTION_CODE), type_(type),
867 is_relative_(false), is_symbolless_(false),
868- is_section_symbol_(true), shndx_(INVALID_CODE)
869+ is_section_symbol_(true), use_plt_offset_(false), shndx_(INVALID_CODE)
870 {
871 // this->type_ is a bitfield; make sure TYPE fits.
872 gold_assert(this->type_ == type);
873@@ -820,7 +826,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
874 Address address)
875 : address_(address), local_sym_index_(SECTION_CODE), type_(type),
876 is_relative_(false), is_symbolless_(false),
877- is_section_symbol_(true), shndx_(shndx)
878+ is_section_symbol_(true), use_plt_offset_(false), shndx_(shndx)
879 {
880 gold_assert(shndx != INVALID_CODE);
881 // this->type_ is a bitfield; make sure TYPE fits.
882@@ -842,7 +848,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
883 Address address)
884 : address_(address), local_sym_index_(0), type_(type),
885 is_relative_(false), is_symbolless_(false),
886- is_section_symbol_(false), shndx_(INVALID_CODE)
887+ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
888 {
889 // this->type_ is a bitfield; make sure TYPE fits.
890 gold_assert(this->type_ == type);
891@@ -858,7 +864,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
892 Address address)
893 : address_(address), local_sym_index_(0), type_(type),
894 is_relative_(false), is_symbolless_(false),
895- is_section_symbol_(false), shndx_(shndx)
896+ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
897 {
898 gold_assert(shndx != INVALID_CODE);
899 // this->type_ is a bitfield; make sure TYPE fits.
900@@ -877,7 +883,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
901 Address address)
902 : address_(address), local_sym_index_(TARGET_CODE), type_(type),
903 is_relative_(false), is_symbolless_(false),
904- is_section_symbol_(false), shndx_(INVALID_CODE)
905+ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
906 {
907 // this->type_ is a bitfield; make sure TYPE fits.
908 gold_assert(this->type_ == type);
909@@ -894,7 +900,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
910 Address address)
911 : address_(address), local_sym_index_(TARGET_CODE), type_(type),
912 is_relative_(false), is_symbolless_(false),
913- is_section_symbol_(false), shndx_(shndx)
914+ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
915 {
916 gold_assert(shndx != INVALID_CODE);
917 // this->type_ is a bitfield; make sure TYPE fits.
918@@ -1121,6 +1127,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::symbol_value(
919 Sized_relobj_file<size, big_endian>* relobj =
920 this->u1_.relobj->sized_relobj();
921 gold_assert(relobj != NULL);
922+ if (this->use_plt_offset_)
923+ {
924+ uint64_t plt_address =
925+ parameters->target().plt_address_for_local(relobj, lsi);
926+ return plt_address + relobj->local_plt_offset(lsi);
927+ }
928 const Symbol_value<size>* symval = relobj->local_symbol(lsi);
929 return symval->value(relobj, addend);
930 }
931@@ -4880,17 +4892,27 @@ Output_file::open_base_file(const char* base_name, bool writable)
932 if (use_base_file)
933 {
934 this->open(s.st_size);
935- ssize_t len = ::read(o, this->base_, s.st_size);
936- if (len < 0)
937- {
938- gold_info(_("%s: read failed: %s"), base_name, strerror(errno));
939- return false;
940- }
941- if (len < s.st_size)
942- {
943- gold_info(_("%s: file too short"), base_name);
944- return false;
945- }
946+ ssize_t bytes_to_read = s.st_size;
947+ unsigned char* p = this->base_;
948+ while (bytes_to_read > 0)
949+ {
950+ ssize_t len = ::read(o, p, bytes_to_read);
951+ if (len < 0)
952+ {
953+ gold_info(_("%s: read failed: %s"), base_name, strerror(errno));
954+ return false;
955+ }
956+ if (len == 0)
957+ {
958+ gold_info(_("%s: file too short: read only %lld of %lld bytes"),
959+ base_name,
960+ static_cast<long long>(s.st_size - bytes_to_read),
961+ static_cast<long long>(s.st_size));
962+ return false;
963+ }
964+ p += len;
965+ bytes_to_read -= len;
966+ }
967 ::close(o);
968 return true;
969 }
970@@ -5052,8 +5074,12 @@ Output_file::map_no_anonymous(bool writable)
971 // output file will wind up incomplete, but we will have already
972 // exited. The alternative to fallocate would be to use fdatasync,
973 // but that would be a more significant performance hit.
974- if (writable && ::posix_fallocate(o, 0, this->file_size_) < 0)
975- gold_fatal(_("%s: %s"), this->name_, strerror(errno));
976+ if (writable)
977+ {
978+ int err = ::posix_fallocate(o, 0, this->file_size_);
979+ if (err != 0)
980+ gold_fatal(_("%s: %s"), this->name_, strerror(err));
981+ }
982
983 // Map the file into memory.
984 int prot = PROT_READ;
985diff --git a/gold/output.h b/gold/output.h
986index 1bec2c0..e2d35e2 100644
987--- a/gold/output.h
988+++ b/gold/output.h
989@@ -1033,12 +1033,14 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
990 Output_reloc(Sized_relobj<size, big_endian>* relobj,
991 unsigned int local_sym_index, unsigned int type,
992 Output_data* od, Address address, bool is_relative,
993- bool is_symbolless, bool is_section_symbol);
994+ bool is_symbolless, bool is_section_symbol,
995+ bool use_plt_offset);
996
997 Output_reloc(Sized_relobj<size, big_endian>* relobj,
998 unsigned int local_sym_index, unsigned int type,
999 unsigned int shndx, Address address, bool is_relative,
1000- bool is_symbolless, bool is_section_symbol);
1001+ bool is_symbolless, bool is_section_symbol,
1002+ bool use_plt_offset);
1003
1004 // A reloc against the STT_SECTION symbol of an output section.
1005
1006@@ -1216,7 +1218,7 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1007 // input file.
1008 unsigned int local_sym_index_;
1009 // The reloc type--a processor specific code.
1010- unsigned int type_ : 29;
1011+ unsigned int type_ : 28;
1012 // True if the relocation is a RELATIVE relocation.
1013 bool is_relative_ : 1;
1014 // True if the relocation is one which should not use
1015@@ -1224,6 +1226,10 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1016 bool is_symbolless_ : 1;
1017 // True if the relocation is against a section symbol.
1018 bool is_section_symbol_ : 1;
1019+ // True if the addend should be the PLT offset. This is used only
1020+ // for RELATIVE relocations to local symbols.
1021+ // (Used only for RELA, but stored here for space.)
1022+ bool use_plt_offset_ : 1;
1023 // If the reloc address is an input section in an object, the
1024 // section index. This is INVALID_CODE if the reloc address is
1025 // specified in some other way.
1026@@ -1268,9 +1274,10 @@ class Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1027 unsigned int local_sym_index, unsigned int type,
1028 Output_data* od, Address address,
1029 Addend addend, bool is_relative,
1030- bool is_symbolless, bool is_section_symbol)
1031+ bool is_symbolless, bool is_section_symbol,
1032+ bool use_plt_offset)
1033 : rel_(relobj, local_sym_index, type, od, address, is_relative,
1034- is_symbolless, is_section_symbol),
1035+ is_symbolless, is_section_symbol, use_plt_offset),
1036 addend_(addend)
1037 { }
1038
1039@@ -1278,9 +1285,10 @@ class Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1040 unsigned int local_sym_index, unsigned int type,
1041 unsigned int shndx, Address address,
1042 Addend addend, bool is_relative,
1043- bool is_symbolless, bool is_section_symbol)
1044+ bool is_symbolless, bool is_section_symbol,
1045+ bool use_plt_offset)
1046 : rel_(relobj, local_sym_index, type, shndx, address, is_relative,
1047- is_symbolless, is_section_symbol),
1048+ is_symbolless, is_section_symbol, use_plt_offset),
1049 addend_(addend)
1050 { }
1051
1052@@ -1571,7 +1579,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1053 Output_data* od, Address address)
1054 {
1055 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
1056- address, false, false, false));
1057+ address, false, false, false, false));
1058 }
1059
1060 void
1061@@ -1580,7 +1588,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1062 Output_data* od, unsigned int shndx, Address address)
1063 {
1064 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1065- address, false, false, false));
1066+ address, false, false, false, false));
1067 }
1068
1069 // Add a RELATIVE reloc against a local symbol.
1070@@ -1591,7 +1599,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1071 Output_data* od, Address address)
1072 {
1073 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
1074- address, true, true, false));
1075+ address, true, true, false, false));
1076 }
1077
1078 void
1079@@ -1600,7 +1608,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1080 Output_data* od, unsigned int shndx, Address address)
1081 {
1082 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1083- address, true, true, false));
1084+ address, true, true, false, false));
1085 }
1086
1087 // Add a local relocation which does not use a symbol for the relocation,
1088@@ -1612,7 +1620,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1089 Output_data* od, Address address)
1090 {
1091 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
1092- address, false, true, false));
1093+ address, false, true, false, false));
1094 }
1095
1096 void
1097@@ -1622,7 +1630,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1098 Address address)
1099 {
1100 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1101- address, false, true, false));
1102+ address, false, true, false, false));
1103 }
1104
1105 // Add a reloc against a local section symbol. This will be
1106@@ -1635,7 +1643,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1107 Output_data* od, Address address)
1108 {
1109 this->add(od, Output_reloc_type(relobj, input_shndx, type, od,
1110- address, false, false, true));
1111+ address, false, false, true, false));
1112 }
1113
1114 void
1115@@ -1644,7 +1652,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
1116 Output_data* od, unsigned int shndx, Address address)
1117 {
1118 this->add(od, Output_reloc_type(relobj, input_shndx, type, shndx,
1119- address, false, false, true));
1120+ address, false, false, true, false));
1121 }
1122
1123 // A reloc against the STT_SECTION symbol of an output section.
1124@@ -1767,7 +1775,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1125 Output_data* od, Address address, Addend addend)
1126 {
1127 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
1128- addend, false, false, false));
1129+ addend, false, false, false, false));
1130 }
1131
1132 void
1133@@ -1777,7 +1785,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1134 Addend addend)
1135 {
1136 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1137- address, addend, false, false, false));
1138+ address, addend, false, false, false,
1139+ false));
1140 }
1141
1142 // Add a RELATIVE reloc against a local symbol.
1143@@ -1785,20 +1794,23 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1144 void
1145 add_local_relative(Sized_relobj<size, big_endian>* relobj,
1146 unsigned int local_sym_index, unsigned int type,
1147- Output_data* od, Address address, Addend addend)
1148+ Output_data* od, Address address, Addend addend,
1149+ bool use_plt_offset)
1150 {
1151 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
1152- addend, true, true, false));
1153+ addend, true, true, false,
1154+ use_plt_offset));
1155 }
1156
1157 void
1158 add_local_relative(Sized_relobj<size, big_endian>* relobj,
1159 unsigned int local_sym_index, unsigned int type,
1160 Output_data* od, unsigned int shndx, Address address,
1161- Addend addend)
1162+ Addend addend, bool use_plt_offset)
1163 {
1164 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1165- address, addend, true, true, false));
1166+ address, addend, true, true, false,
1167+ use_plt_offset));
1168 }
1169
1170 // Add a local relocation which does not use a symbol for the relocation,
1171@@ -1810,7 +1822,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1172 Output_data* od, Address address, Addend addend)
1173 {
1174 this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
1175- addend, false, true, false));
1176+ addend, false, true, false, false));
1177 }
1178
1179 void
1180@@ -1820,7 +1832,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1181 Address address, Addend addend)
1182 {
1183 this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
1184- address, addend, false, true, false));
1185+ address, addend, false, true, false,
1186+ false));
1187 }
1188
1189 // Add a reloc against a local section symbol. This will be
1190@@ -1833,7 +1846,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1191 Output_data* od, Address address, Addend addend)
1192 {
1193 this->add(od, Output_reloc_type(relobj, input_shndx, type, od, address,
1194- addend, false, false, true));
1195+ addend, false, false, true, false));
1196 }
1197
1198 void
1199@@ -1843,7 +1856,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
1200 Addend addend)
1201 {
1202 this->add(od, Output_reloc_type(relobj, input_shndx, type, shndx,
1203- address, addend, false, false, true));
1204+ address, addend, false, false, true,
1205+ false));
1206 }
1207
1208 // A reloc against the STT_SECTION symbol of an output section.
1209diff --git a/gold/plugin.cc b/gold/plugin.cc
1210index 3ccd8d0..b4e68f8 100644
1211--- a/gold/plugin.cc
1212+++ b/gold/plugin.cc
1213@@ -818,7 +818,9 @@ Pluginobj::Pluginobj(const std::string& name, Input_file* input_file,
1214 }
1215
1216 // Return TRUE if a defined symbol is referenced from outside the
1217-// universe of claimed objects.
1218+// universe of claimed objects. Only references from relocatable,
1219+// non-IR (unclaimed) objects count as a reference. References from
1220+// dynamic objects count only as "visible".
1221
1222 static inline bool
1223 is_referenced_from_outside(Symbol* lsym)
1224@@ -838,6 +840,8 @@ is_referenced_from_outside(Symbol* lsym)
1225 static inline bool
1226 is_visible_from_outside(Symbol* lsym)
1227 {
1228+ if (lsym->in_dyn())
1229+ return true;
1230 if (parameters->options().export_dynamic() || parameters->options().shared())
1231 return lsym->is_externally_visible();
1232 return false;
1233@@ -1244,14 +1248,18 @@ Sized_pluginobj<size, big_endian>::do_initialize_xindex()
1234 return NULL;
1235 }
1236
1237-// Get symbol counts. Not used for plugin objects.
1238+// Get symbol counts. Don't count plugin objects; the replacement
1239+// files will provide the counts.
1240
1241 template<int size, bool big_endian>
1242 void
1243-Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(const Symbol_table*,
1244- size_t*, size_t*) const
1245+Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(
1246+ const Symbol_table*,
1247+ size_t* defined,
1248+ size_t* used) const
1249 {
1250- gold_unreachable();
1251+ *defined = 0;
1252+ *used = 0;
1253 }
1254
1255 // Get symbols. Not used for plugin objects.
1256diff --git a/gold/powerpc.cc b/gold/powerpc.cc
1257index 45783c3..62a17ca 100644
1258--- a/gold/powerpc.cc
1259+++ b/gold/powerpc.cc
1260@@ -1329,7 +1329,7 @@ Target_powerpc<size, big_endian>::Scan::local(
1261 rela_dyn->add_local_relative(object, r_sym, r_type,
1262 output_section, data_shndx,
1263 reloc.get_r_offset(),
1264- reloc.get_r_addend());
1265+ reloc.get_r_addend(), false);
1266 }
1267 }
1268 break;
1269@@ -1372,7 +1372,7 @@ Target_powerpc<size, big_endian>::Scan::local(
1270 object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off);
1271 rela_dyn->add_local_relative(object, r_sym,
1272 elfcpp::R_POWERPC_RELATIVE,
1273- got, off, 0);
1274+ got, off, 0, false);
1275 }
1276 }
1277 else
1278diff --git a/gold/readsyms.cc b/gold/readsyms.cc
1279index 1e50942..9974722 100644
1280--- a/gold/readsyms.cc
1281+++ b/gold/readsyms.cc
1282@@ -161,8 +161,10 @@ void
1283 Read_symbols::run(Workqueue* workqueue)
1284 {
1285 // If we didn't queue a new task, then we need to explicitly unblock
1286- // the token.
1287- if (!this->do_read_symbols(workqueue))
1288+ // the token. If the object is a member of a lib group, however,
1289+ // the token was already added to the list of locks for the task,
1290+ // and it will be unblocked automatically at the end of the task.
1291+ if (!this->do_read_symbols(workqueue) && this->member_ == NULL)
1292 workqueue->queue_soon(new Unblock_token(this->this_blocker_,
1293 this->next_blocker_));
1294 }
1295diff --git a/gold/resolve.cc b/gold/resolve.cc
1296index 03288ec..780038a 100644
1297--- a/gold/resolve.cc
1298+++ b/gold/resolve.cc
1299@@ -296,7 +296,7 @@ Symbol_table::resolve(Sized_symbol<size>* to,
1300
1301 // Record if we've seen this symbol in a real ELF object (i.e., the
1302 // symbol is referenced from outside the world known to the plugin).
1303- if (object->pluginobj() == NULL)
1304+ if (object->pluginobj() == NULL && !object->is_dynamic())
1305 to->set_in_real_elf();
1306
1307 // If we're processing replacement files, allow new symbols to override
1308@@ -336,9 +336,9 @@ Symbol_table::resolve(Sized_symbol<size>* to,
1309 && to->name()[0] == '_' && to->name()[1] == 'Z')
1310 {
1311 Symbol_location fromloc
1312- = { object, orig_st_shndx, sym.get_st_value() };
1313+ = { object, orig_st_shndx, static_cast<off_t>(sym.get_st_value()) };
1314 Symbol_location toloc = { to->object(), to->shndx(&to_is_ordinary),
1315- to->value() };
1316+ static_cast<off_t>(to->value()) };
1317 this->candidate_odr_violations_[to->name()].insert(fromloc);
1318 this->candidate_odr_violations_[to->name()].insert(toloc);
1319 }
1320diff --git a/gold/script-sections.cc b/gold/script-sections.cc
1321index 1fad88d..f90c0b3 100644
1322--- a/gold/script-sections.cc
1323+++ b/gold/script-sections.cc
1324@@ -680,7 +680,7 @@ class Sections_element_assignment : public Sections_element
1325 set_section_addresses(Symbol_table* symtab, Layout* layout,
1326 uint64_t* dot_value, uint64_t*, uint64_t*)
1327 {
1328- this->assignment_.set_if_absolute(symtab, layout, true, *dot_value);
1329+ this->assignment_.set_if_absolute(symtab, layout, true, *dot_value, NULL);
1330 }
1331
1332 // Print for debugging.
1333@@ -714,7 +714,7 @@ class Sections_element_dot_assignment : public Sections_element
1334 // output section definition the dot symbol is always considered
1335 // to be absolute.
1336 *dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
1337- NULL, NULL, NULL);
1338+ NULL, NULL, NULL, false);
1339 }
1340
1341 // Update the dot symbol while setting section addresses.
1342@@ -724,7 +724,7 @@ class Sections_element_dot_assignment : public Sections_element
1343 uint64_t* load_address)
1344 {
1345 *dot_value = this->val_->eval_with_dot(symtab, layout, false, *dot_value,
1346- NULL, NULL, dot_alignment);
1347+ NULL, NULL, dot_alignment, false);
1348 *load_address = *dot_value;
1349 }
1350
1351@@ -866,9 +866,11 @@ class Output_section_element_assignment : public Output_section_element
1352 void
1353 set_section_addresses(Symbol_table* symtab, Layout* layout, Output_section*,
1354 uint64_t, uint64_t* dot_value, uint64_t*,
1355- Output_section**, std::string*, Input_section_list*)
1356+ Output_section** dot_section, std::string*,
1357+ Input_section_list*)
1358 {
1359- this->assignment_.set_if_absolute(symtab, layout, true, *dot_value);
1360+ this->assignment_.set_if_absolute(symtab, layout, true, *dot_value,
1361+ *dot_section);
1362 }
1363
1364 // Print for debugging.
1365@@ -892,20 +894,28 @@ class Output_section_element_dot_assignment : public Output_section_element
1366 : val_(val)
1367 { }
1368
1369+ // An assignment to dot within an output section is enough to force
1370+ // the output section to exist.
1371+ bool
1372+ needs_output_section() const
1373+ { return true; }
1374+
1375 // Finalize the symbol.
1376 void
1377 finalize_symbols(Symbol_table* symtab, const Layout* layout,
1378 uint64_t* dot_value, Output_section** dot_section)
1379 {
1380 *dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
1381- *dot_section, dot_section, NULL);
1382+ *dot_section, dot_section, NULL,
1383+ true);
1384 }
1385
1386 // Update the dot symbol while setting section addresses.
1387 void
1388 set_section_addresses(Symbol_table* symtab, Layout* layout, Output_section*,
1389 uint64_t, uint64_t* dot_value, uint64_t*,
1390- Output_section**, std::string*, Input_section_list*);
1391+ Output_section** dot_section, std::string*,
1392+ Input_section_list*);
1393
1394 // Print for debugging.
1395 void
1396@@ -936,7 +946,8 @@ Output_section_element_dot_assignment::set_section_addresses(
1397 {
1398 uint64_t next_dot = this->val_->eval_with_dot(symtab, layout, false,
1399 *dot_value, *dot_section,
1400- dot_section, dot_alignment);
1401+ dot_section, dot_alignment,
1402+ true);
1403 if (next_dot < *dot_value)
1404 gold_error(_("dot may not move backward"));
1405 if (next_dot > *dot_value && output_section != NULL)
1406@@ -1037,7 +1048,8 @@ Output_data_expression::do_write_to_buffer(unsigned char* buf)
1407 {
1408 uint64_t val = this->val_->eval_with_dot(this->symtab_, this->layout_,
1409 true, this->dot_value_,
1410- this->dot_section_, NULL, NULL);
1411+ this->dot_section_, NULL, NULL,
1412+ false);
1413
1414 if (parameters->target().is_big_endian())
1415 this->endian_write_to_buffer<true>(val, buf);
1416@@ -1187,7 +1199,7 @@ class Output_section_element_fill : public Output_section_element
1417 Output_section* fill_section;
1418 uint64_t fill_val = this->val_->eval_with_dot(symtab, layout, false,
1419 *dot_value, *dot_section,
1420- &fill_section, NULL);
1421+ &fill_section, NULL, false);
1422 if (fill_section != NULL)
1423 gold_warning(_("fill value is not absolute"));
1424 // FIXME: The GNU linker supports fill values of arbitrary length.
1425@@ -2108,13 +2120,13 @@ Output_section_definition::finalize_symbols(Symbol_table* symtab,
1426 {
1427 address = this->address_->eval_with_dot(symtab, layout, true,
1428 *dot_value, NULL,
1429- NULL, NULL);
1430+ NULL, NULL, false);
1431 }
1432 if (this->align_ != NULL)
1433 {
1434 uint64_t align = this->align_->eval_with_dot(symtab, layout, true,
1435 *dot_value, NULL,
1436- NULL, NULL);
1437+ NULL, NULL, false);
1438 address = align_address(address, align);
1439 }
1440 *dot_value = address;
1441@@ -2303,7 +2315,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
1442 else
1443 address = this->address_->eval_with_dot(symtab, layout, true,
1444 *dot_value, NULL, NULL,
1445- dot_alignment);
1446+ dot_alignment, false);
1447 uint64_t align;
1448 if (this->align_ == NULL)
1449 {
1450@@ -2316,7 +2328,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
1451 {
1452 Output_section* align_section;
1453 align = this->align_->eval_with_dot(symtab, layout, true, *dot_value,
1454- NULL, &align_section, NULL);
1455+ NULL, &align_section, NULL, false);
1456 if (align_section != NULL)
1457 gold_warning(_("alignment of section %s is not absolute"),
1458 this->name_.c_str());
1459@@ -2401,7 +2413,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
1460 laddr = this->load_address_->eval_with_dot(symtab, layout, true,
1461 *dot_value,
1462 this->output_section_,
1463- NULL, NULL);
1464+ NULL, NULL, false);
1465 if (this->output_section_ != NULL)
1466 this->output_section_->set_load_address(laddr);
1467 }
1468@@ -2416,7 +2428,8 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
1469 Output_section* subalign_section;
1470 subalign = this->subalign_->eval_with_dot(symtab, layout, true,
1471 *dot_value, NULL,
1472- &subalign_section, NULL);
1473+ &subalign_section, NULL,
1474+ false);
1475 if (subalign_section != NULL)
1476 gold_warning(_("subalign of section %s is not absolute"),
1477 this->name_.c_str());
1478@@ -2431,7 +2444,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
1479 uint64_t fill_val = this->fill_->eval_with_dot(symtab, layout, true,
1480 *dot_value,
1481 NULL, &fill_section,
1482- NULL);
1483+ NULL, false);
1484 if (fill_section != NULL)
1485 gold_warning(_("fill of section %s is not absolute"),
1486 this->name_.c_str());
1487diff --git a/gold/script.cc b/gold/script.cc
1488index 7df0c9e..b471cf9 100644
1489--- a/gold/script.cc
1490+++ b/gold/script.cc
1491@@ -983,18 +983,20 @@ Symbol_assignment::sized_finalize(Symbol_table* symtab, const Layout* layout,
1492 uint64_t final_val = this->val_->eval_maybe_dot(symtab, layout, true,
1493 is_dot_available,
1494 dot_value, dot_section,
1495- &section, NULL);
1496+ &section, NULL, false);
1497 Sized_symbol<size>* ssym = symtab->get_sized_symbol<size>(this->sym_);
1498 ssym->set_value(final_val);
1499 if (section != NULL)
1500 ssym->set_output_section(section);
1501 }
1502
1503-// Set the symbol value if the expression yields an absolute value.
1504+// Set the symbol value if the expression yields an absolute value or
1505+// a value relative to DOT_SECTION.
1506
1507 void
1508 Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
1509- bool is_dot_available, uint64_t dot_value)
1510+ bool is_dot_available, uint64_t dot_value,
1511+ Output_section* dot_section)
1512 {
1513 if (this->sym_ == NULL)
1514 return;
1515@@ -1002,8 +1004,9 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
1516 Output_section* val_section;
1517 uint64_t val = this->val_->eval_maybe_dot(symtab, layout, false,
1518 is_dot_available, dot_value,
1519- NULL, &val_section, NULL);
1520- if (val_section != NULL)
1521+ dot_section, &val_section, NULL,
1522+ false);
1523+ if (val_section != NULL && val_section != dot_section)
1524 return;
1525
1526 if (parameters->target().get_size() == 32)
1527@@ -1026,6 +1029,8 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
1528 }
1529 else
1530 gold_unreachable();
1531+ if (val_section != NULL)
1532+ this->sym_->set_output_section(val_section);
1533 }
1534
1535 // Print for debugging.
1536@@ -1215,7 +1220,7 @@ Script_options::set_section_addresses(Symbol_table* symtab, Layout* layout)
1537 for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
1538 p != this->symbol_assignments_.end();
1539 ++p)
1540- (*p)->set_if_absolute(symtab, layout, false, 0);
1541+ (*p)->set_if_absolute(symtab, layout, false, 0, NULL);
1542
1543 return this->script_sections_.set_section_addresses(symtab, layout);
1544 }
1545diff --git a/gold/script.h b/gold/script.h
1546index 73079a4..f41f438 100644
1547--- a/gold/script.h
1548+++ b/gold/script.h
1549@@ -90,20 +90,28 @@ class Expression
1550 // the section address. If RESULT_ALIGNMENT is not NULL, this sets
1551 // *RESULT_ALIGNMENT to the alignment of the value of that alignment
1552 // is larger than *RESULT_ALIGNMENT; this will only be non-zero if
1553- // this is an ALIGN expression.
1554+ // this is an ALIGN expression. If IS_SECTION_DOT_ASSIGMENT is true,
1555+ // we are evaluating an assignment to dot within an output section,
1556+ // and an absolute value should be interpreted as an offset within
1557+ // the section.
1558 uint64_t
1559 eval_with_dot(const Symbol_table*, const Layout*, bool check_assertions,
1560 uint64_t dot_value, Output_section* dot_section,
1561- Output_section** result_section, uint64_t* result_alignment);
1562+ Output_section** result_section, uint64_t* result_alignment,
1563+ bool is_section_dot_assignment);
1564
1565 // Return the value of an expression which may or may not be
1566 // permitted to refer to the dot symbol, depending on
1567- // is_dot_available.
1568+ // is_dot_available. If IS_SECTION_DOT_ASSIGMENT is true,
1569+ // we are evaluating an assignment to dot within an output section,
1570+ // and an absolute value should be interpreted as an offset within
1571+ // the section.
1572 uint64_t
1573 eval_maybe_dot(const Symbol_table*, const Layout*, bool check_assertions,
1574 bool is_dot_available, uint64_t dot_value,
1575 Output_section* dot_section,
1576- Output_section** result_section, uint64_t* result_alignment);
1577+ Output_section** result_section, uint64_t* result_alignment,
1578+ bool is_section_dot_assignment);
1579
1580 // Print the expression to the FILE. This is for debugging.
1581 virtual void
1582@@ -339,12 +347,12 @@ class Symbol_assignment
1583 finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value,
1584 Output_section* dot_section);
1585
1586- // Set the symbol value, but only if the value is absolute. This is
1587- // used while processing a SECTIONS clause. We assume that dot is
1588- // an absolute value here. We do not check assertions.
1589+ // Set the symbol value, but only if the value is absolute or relative to
1590+ // DOT_SECTION. This is used while processing a SECTIONS clause.
1591+ // We assume that dot is an absolute value here. We do not check assertions.
1592 void
1593 set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
1594- uint64_t dot_value);
1595+ uint64_t dot_value, Output_section* dot_section);
1596
1597 const std::string&
1598 name() const
1599diff --git a/gold/sparc.cc b/gold/sparc.cc
1600index 5f67a4e..12e1dee 100644
1601--- a/gold/sparc.cc
1602+++ b/gold/sparc.cc
1603@@ -1855,7 +1855,7 @@ Target_sparc<size, big_endian>::Scan::local(
1604 rela_dyn->add_local_relative(object, r_sym, elfcpp::R_SPARC_RELATIVE,
1605 output_section, data_shndx,
1606 reloc.get_r_offset(),
1607- reloc.get_r_addend());
1608+ reloc.get_r_addend(), false);
1609 }
1610 break;
1611
1612@@ -1946,7 +1946,7 @@ Target_sparc<size, big_endian>::Scan::local(
1613 object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off);
1614 rela_dyn->add_local_relative(object, r_sym,
1615 elfcpp::R_SPARC_RELATIVE,
1616- got, off, 0);
1617+ got, off, 0, false);
1618 }
1619 }
1620 else
1621diff --git a/gold/symtab.cc b/gold/symtab.cc
1622index ff1b5ca..f0ba1d5 100644
1623--- a/gold/symtab.cc
1624+++ b/gold/symtab.cc
1625@@ -602,20 +602,16 @@ Symbol_table::gc_mark_undef_symbols(Layout* layout)
1626 }
1627
1628 void
1629-Symbol_table::gc_mark_symbol_for_shlib(Symbol* sym)
1630+Symbol_table::gc_mark_symbol(Symbol* sym)
1631 {
1632- if (!sym->is_from_dynobj()
1633- && sym->is_externally_visible())
1634+ // Add the object and section to the work list.
1635+ Relobj* obj = static_cast<Relobj*>(sym->object());
1636+ bool is_ordinary;
1637+ unsigned int shndx = sym->shndx(&is_ordinary);
1638+ if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
1639 {
1640- //Add the object and section to the work list.
1641- Relobj* obj = static_cast<Relobj*>(sym->object());
1642- bool is_ordinary;
1643- unsigned int shndx = sym->shndx(&is_ordinary);
1644- if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
1645- {
1646- gold_assert(this->gc_!= NULL);
1647- this->gc_->worklist().push(Section_id(obj, shndx));
1648- }
1649+ gold_assert(this->gc_!= NULL);
1650+ this->gc_->worklist().push(Section_id(obj, shndx));
1651 }
1652 }
1653
1654@@ -626,16 +622,7 @@ Symbol_table::gc_mark_dyn_syms(Symbol* sym)
1655 {
1656 if (sym->in_dyn() && sym->source() == Symbol::FROM_OBJECT
1657 && !sym->object()->is_dynamic())
1658- {
1659- Relobj* obj = static_cast<Relobj*>(sym->object());
1660- bool is_ordinary;
1661- unsigned int shndx = sym->shndx(&is_ordinary);
1662- if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
1663- {
1664- gold_assert(this->gc_ != NULL);
1665- this->gc_->worklist().push(Section_id(obj, shndx));
1666- }
1667- }
1668+ this->gc_mark_symbol(sym);
1669 }
1670
1671 // Make TO a symbol which forwards to FROM.
1672@@ -1143,6 +1130,14 @@ Symbol_table::add_from_relobj(
1673 bool is_default_version = false;
1674 bool is_forced_local = false;
1675
1676+ // FIXME: For incremental links, we don't store version information,
1677+ // so we need to ignore version symbols for now.
1678+ if (parameters->incremental_update() && ver != NULL)
1679+ {
1680+ namelen = ver - name;
1681+ ver = NULL;
1682+ }
1683+
1684 if (ver != NULL)
1685 {
1686 // The symbol name is of the form foo@VERSION or foo@@VERSION
1687@@ -1243,11 +1238,16 @@ Symbol_table::add_from_relobj(
1688 if (is_forced_local)
1689 this->force_local(res);
1690
1691- // If building a shared library using garbage collection, do not
1692- // treat externally visible symbols as garbage.
1693- if (parameters->options().gc_sections()
1694- && parameters->options().shared())
1695- this->gc_mark_symbol_for_shlib(res);
1696+ // Do not treat this symbol as garbage if this symbol will be
1697+ // exported to the dynamic symbol table. This is true when
1698+ // building a shared library or using --export-dynamic and
1699+ // the symbol is externally visible.
1700+ if (parameters->options().gc_sections()
1701+ && res->is_externally_visible()
1702+ && !res->is_from_dynobj()
1703+ && (parameters->options().shared()
1704+ || parameters->options().export_dynamic()))
1705+ this->gc_mark_symbol(res);
1706
1707 if (is_defined_in_discarded_section)
1708 res->set_is_defined_in_discarded_section();
1709@@ -1346,6 +1346,11 @@ Symbol_table::add_from_dynobj(
1710 return;
1711 }
1712
1713+ // FIXME: For incremental links, we don't store version information,
1714+ // so we need to ignore version symbols for now.
1715+ if (parameters->incremental_update())
1716+ versym = NULL;
1717+
1718 if (versym != NULL && versym_size / 2 < count)
1719 {
1720 dynobj->error(_("too few symbol versions"));
1721@@ -2809,6 +2814,12 @@ Symbol_table::sized_write_globals(const Stringpool* sympool,
1722 typename elfcpp::Elf_types<size>::Elf_Addr sym_value = sym->value();
1723 typename elfcpp::Elf_types<size>::Elf_Addr dynsym_value = sym_value;
1724 elfcpp::STB binding = sym->binding();
1725+
1726+ // If --no-gnu-unique is set, change STB_GNU_UNIQUE to STB_GLOBAL.
1727+ if (binding == elfcpp::STB_GNU_UNIQUE
1728+ && !parameters->options().gnu_unique())
1729+ binding = elfcpp::STB_GLOBAL;
1730+
1731 switch (sym->source())
1732 {
1733 case Symbol::FROM_OBJECT:
1734diff --git a/gold/symtab.h b/gold/symtab.h
1735index b9b9e00..427f72f 100644
1736--- a/gold/symtab.h
1737+++ b/gold/symtab.h
1738@@ -1308,10 +1308,9 @@ class Symbol_table
1739 void
1740 gc_mark_undef_symbols(Layout*);
1741
1742- // During garbage collection, this ensures externally visible symbols
1743- // are not treated as garbage while building shared objects.
1744+ // This tells garbage collection that this symbol is referenced.
1745 void
1746- gc_mark_symbol_for_shlib(Symbol* sym);
1747+ gc_mark_symbol(Symbol* sym);
1748
1749 // During garbage collection, this keeps sections that correspond to
1750 // symbols seen in dynamic objects.
1751diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
1752index 67149fb..785dcdd 100644
1753--- a/gold/testsuite/Makefile.in
1754+++ b/gold/testsuite/Makefile.in
1755@@ -1844,6 +1844,8 @@ EGREP = @EGREP@
1756 EXEEXT = @EXEEXT@
1757 GENCAT = @GENCAT@
1758 GMSGFMT = @GMSGFMT@
1759+GOLD_LDADD = @GOLD_LDADD@
1760+GOLD_LDFLAGS = @GOLD_LDFLAGS@
1761 GREP = @GREP@
1762 INCINTL = @INCINTL@
1763 INSTALL = @INSTALL@
1764diff --git a/gold/testsuite/plugin_test_2.sh b/gold/testsuite/plugin_test_2.sh
1765index a47d22a..293b1f0 100755
1766--- a/gold/testsuite/plugin_test_2.sh
1767+++ b/gold/testsuite/plugin_test_2.sh
1768@@ -45,7 +45,7 @@ check plugin_test_2.err "two_file_test_main.o: claim file hook called"
1769 check plugin_test_2.err "two_file_test_1.syms: claim file hook called"
1770 check plugin_test_2.err "two_file_test_1b.syms: claim file hook called"
1771 check plugin_test_2.err "two_file_shared_2.so: claim file hook called"
1772-check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_REG"
1773+check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_IRONLY_EXP"
1774 check plugin_test_2.err "two_file_test_1.syms: _Z2t2v: PREVAILING_DEF_REG"
1775 check plugin_test_2.err "two_file_test_1.syms: v2: RESOLVED_DYN"
1776 check plugin_test_2.err "two_file_test_1.syms: t17data: RESOLVED_DYN"
1777diff --git a/gold/testsuite/script_test_2.t b/gold/testsuite/script_test_2.t
1778index 73d39df..6a0188f 100644
1779--- a/gold/testsuite/script_test_2.t
1780+++ b/gold/testsuite/script_test_2.t
1781@@ -49,7 +49,7 @@ SECTIONS
1782 /* This should match the remaining sections. */
1783 *(.gold_test)
1784
1785- . = . + 4;
1786+ . = 60;
1787 start_data = .;
1788 BYTE(1)
1789 SHORT(2)
1790diff --git a/gold/x86_64.cc b/gold/x86_64.cc
1791index e6b0021..e7c981b 100644
1792--- a/gold/x86_64.cc
1793+++ b/gold/x86_64.cc
1794@@ -1549,7 +1549,7 @@ Target_x86_64::reserve_local_got_entry(
1795 case GOT_TYPE_STANDARD:
1796 if (parameters->options().output_is_position_independent())
1797 rela_dyn->add_local_relative(obj, r_sym, elfcpp::R_X86_64_RELATIVE,
1798- this->got_, got_offset, 0);
1799+ this->got_, got_offset, 0, false);
1800 break;
1801 case GOT_TYPE_TLS_OFFSET:
1802 rela_dyn->add_local(obj, r_sym, elfcpp::R_X86_64_TPOFF64,
1803@@ -1953,8 +1953,8 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
1804 const elfcpp::Sym<64, false>& lsym)
1805 {
1806 // A local STT_GNU_IFUNC symbol may require a PLT entry.
1807- if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC
1808- && this->reloc_needs_plt_for_ifunc(object, r_type))
1809+ bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
1810+ if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))
1811 {
1812 unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
1813 target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
1814@@ -1982,7 +1982,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
1815 elfcpp::R_X86_64_RELATIVE,
1816 output_section, data_shndx,
1817 reloc.get_r_offset(),
1818- reloc.get_r_addend());
1819+ reloc.get_r_addend(), is_ifunc);
1820 }
1821 break;
1822
1823@@ -2058,7 +2058,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
1824 // lets function pointers compare correctly with shared
1825 // libraries. Otherwise we would need an IRELATIVE reloc.
1826 bool is_new;
1827- if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC)
1828+ if (is_ifunc)
1829 is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD);
1830 else
1831 is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD);
1832@@ -2076,7 +2076,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
1833 object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
1834 rela_dyn->add_local_relative(object, r_sym,
1835 elfcpp::R_X86_64_RELATIVE,
1836- got, got_offset, 0);
1837+ got, got_offset, 0, is_ifunc);
1838 }
1839 else
1840 {
1841@@ -3181,12 +3181,6 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
1842 }
1843 if (optimized_type == tls::TLSOPT_TO_IE)
1844 {
1845- if (tls_segment == NULL)
1846- {
1847- gold_assert(parameters->errors()->error_count() > 0
1848- || issue_undefined_symbol_error(gsym));
1849- return;
1850- }
1851 value = target->got_plt_section()->address() + got_offset;
1852 this->tls_gd_to_ie(relinfo, relnum, tls_segment, rela, r_type,
1853 value, view, address, view_size);
1854@@ -3867,42 +3861,51 @@ Target_x86_64::do_code_fill(section_size_type length) const
1855 }
1856
1857 // Nop sequences of various lengths.
1858- const char nop1[1] = { 0x90 }; // nop
1859- const char nop2[2] = { 0x66, 0x90 }; // xchg %ax %ax
1860- const char nop3[3] = { 0x0f, 0x1f, 0x00 }; // nop (%rax)
1861- const char nop4[4] = { 0x0f, 0x1f, 0x40, 0x00}; // nop 0(%rax)
1862- const char nop5[5] = { 0x0f, 0x1f, 0x44, 0x00, // nop 0(%rax,%rax,1)
1863- 0x00 };
1864- const char nop6[6] = { 0x66, 0x0f, 0x1f, 0x44, // nopw 0(%rax,%rax,1)
1865- 0x00, 0x00 };
1866- const char nop7[7] = { 0x0f, 0x1f, 0x80, 0x00, // nopl 0L(%rax)
1867- 0x00, 0x00, 0x00 };
1868- const char nop8[8] = { 0x0f, 0x1f, 0x84, 0x00, // nopl 0L(%rax,%rax,1)
1869- 0x00, 0x00, 0x00, 0x00 };
1870- const char nop9[9] = { 0x66, 0x0f, 0x1f, 0x84, // nopw 0L(%rax,%rax,1)
1871- 0x00, 0x00, 0x00, 0x00,
1872- 0x00 };
1873- const char nop10[10] = { 0x66, 0x2e, 0x0f, 0x1f, // nopw %cs:0L(%rax,%rax,1)
1874- 0x84, 0x00, 0x00, 0x00,
1875- 0x00, 0x00 };
1876- const char nop11[11] = { 0x66, 0x66, 0x2e, 0x0f, // data16
1877- 0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
1878- 0x00, 0x00, 0x00 };
1879- const char nop12[12] = { 0x66, 0x66, 0x66, 0x2e, // data16; data16
1880- 0x0f, 0x1f, 0x84, 0x00, // nopw %cs:0L(%rax,%rax,1)
1881- 0x00, 0x00, 0x00, 0x00 };
1882- const char nop13[13] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
1883- 0x2e, 0x0f, 0x1f, 0x84, // nopw %cs:0L(%rax,%rax,1)
1884- 0x00, 0x00, 0x00, 0x00,
1885- 0x00 };
1886- const char nop14[14] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
1887- 0x66, 0x2e, 0x0f, 0x1f, // data16
1888- 0x84, 0x00, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
1889- 0x00, 0x00 };
1890- const char nop15[15] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
1891- 0x66, 0x66, 0x2e, 0x0f, // data16; data16
1892- 0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
1893- 0x00, 0x00, 0x00 };
1894+ const char nop1[1] = { '\x90' }; // nop
1895+ const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax
1896+ const char nop3[3] = { '\x0f', '\x1f', '\x00' }; // nop (%rax)
1897+ const char nop4[4] = { '\x0f', '\x1f', '\x40', // nop 0(%rax)
1898+ '\x00'};
1899+ const char nop5[5] = { '\x0f', '\x1f', '\x44', // nop 0(%rax,%rax,1)
1900+ '\x00', '\x00' };
1901+ const char nop6[6] = { '\x66', '\x0f', '\x1f', // nopw 0(%rax,%rax,1)
1902+ '\x44', '\x00', '\x00' };
1903+ const char nop7[7] = { '\x0f', '\x1f', '\x80', // nopl 0L(%rax)
1904+ '\x00', '\x00', '\x00',
1905+ '\x00' };
1906+ const char nop8[8] = { '\x0f', '\x1f', '\x84', // nopl 0L(%rax,%rax,1)
1907+ '\x00', '\x00', '\x00',
1908+ '\x00', '\x00' };
1909+ const char nop9[9] = { '\x66', '\x0f', '\x1f', // nopw 0L(%rax,%rax,1)
1910+ '\x84', '\x00', '\x00',
1911+ '\x00', '\x00', '\x00' };
1912+ const char nop10[10] = { '\x66', '\x2e', '\x0f', // nopw %cs:0L(%rax,%rax,1)
1913+ '\x1f', '\x84', '\x00',
1914+ '\x00', '\x00', '\x00',
1915+ '\x00' };
1916+ const char nop11[11] = { '\x66', '\x66', '\x2e', // data16
1917+ '\x0f', '\x1f', '\x84', // nopw %cs:0L(%rax,%rax,1)
1918+ '\x00', '\x00', '\x00',
1919+ '\x00', '\x00' };
1920+ const char nop12[12] = { '\x66', '\x66', '\x66', // data16; data16
1921+ '\x2e', '\x0f', '\x1f', // nopw %cs:0L(%rax,%rax,1)
1922+ '\x84', '\x00', '\x00',
1923+ '\x00', '\x00', '\x00' };
1924+ const char nop13[13] = { '\x66', '\x66', '\x66', // data16; data16; data16
1925+ '\x66', '\x2e', '\x0f', // nopw %cs:0L(%rax,%rax,1)
1926+ '\x1f', '\x84', '\x00',
1927+ '\x00', '\x00', '\x00',
1928+ '\x00' };
1929+ const char nop14[14] = { '\x66', '\x66', '\x66', // data16; data16; data16
1930+ '\x66', '\x66', '\x2e', // data16
1931+ '\x0f', '\x1f', '\x84', // nopw %cs:0L(%rax,%rax,1)
1932+ '\x00', '\x00', '\x00',
1933+ '\x00', '\x00' };
1934+ const char nop15[15] = { '\x66', '\x66', '\x66', // data16; data16; data16
1935+ '\x66', '\x66', '\x66', // data16; data16
1936+ '\x2e', '\x0f', '\x1f', // nopw %cs:0L(%rax,%rax,1)
1937+ '\x84', '\x00', '\x00',
1938+ '\x00', '\x00', '\x00' };
1939
1940 const char* nops[16] = {
1941 NULL,
1942--
19431.7.9.5
1944
diff --git a/meta/recipes-devtools/binutils/binutils/0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch b/meta/recipes-devtools/binutils/binutils/0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch
new file mode 100644
index 0000000000..657d6739eb
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch
@@ -0,0 +1,49 @@
1Upstream-Status: Backport
2
3From 80041361bf80194da35c5efb842125f3ce1d2bf2 Mon Sep 17 00:00:00 2001
4From: Joseph Myers <joseph@codesourcery.com>
5Date: Tue, 20 Dec 2011 18:00:03 +0000
6Subject: [PATCH 039/262] * emulparams/elf32bmip.sh (OTHER_SECTIONS):
7 Put .mdebug.* and .gcc_compiled_long* sections
8 at address 0.
9
10---
11 ld/ChangeLog | 5 +++++
12 ld/emulparams/elf32bmip.sh | 16 ++++++++--------
13 2 files changed, 13 insertions(+), 8 deletions(-)
14
152011-12-20 Joseph Myers <joseph@codesourcery.com>
16
17 * emulparams/elf32bmip.sh (OTHER_SECTIONS): Put .mdebug.* and
18 .gcc_compiled_long* sections at address 0.
19
20diff --git a/ld/emulparams/elf32bmip.sh b/ld/emulparams/elf32bmip.sh
21index 44a0b8a..f0fcd2c 100644
22--- a/ld/emulparams/elf32bmip.sh
23+++ b/ld/emulparams/elf32bmip.sh
24@@ -64,14 +64,14 @@ OTHER_BSS_SYMBOLS='_fbss = .;'
25 OTHER_SECTIONS='
26 .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
27 .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
28- .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) }
29- .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) }
30- .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) }
31- .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) }
32- .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) }
33- .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) }
34- .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) }
35- .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) }
36+ .mdebug.abi32 0 : { KEEP(*(.mdebug.abi32)) }
37+ .mdebug.abiN32 0 : { KEEP(*(.mdebug.abiN32)) }
38+ .mdebug.abi64 0 : { KEEP(*(.mdebug.abi64)) }
39+ .mdebug.abiO64 0 : { KEEP(*(.mdebug.abiO64)) }
40+ .mdebug.eabi32 0 : { KEEP(*(.mdebug.eabi32)) }
41+ .mdebug.eabi64 0 : { KEEP(*(.mdebug.eabi64)) }
42+ .gcc_compiled_long32 0 : { KEEP(*(.gcc_compiled_long32)) }
43+ .gcc_compiled_long64 0 : { KEEP(*(.gcc_compiled_long64)) }
44 '
45 ARCH=mips
46 MACHINE=
47--
481.7.9.5
49
diff --git a/meta/recipes-devtools/binutils/binutils/0052-gas.patch b/meta/recipes-devtools/binutils/binutils/0052-gas.patch
new file mode 100644
index 0000000000..a9bb3ac0e4
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0052-gas.patch
@@ -0,0 +1,83 @@
1Upstream-Status: Backport
2
3From e45a3a5695408d472e8f0ca6c21eb03e5fd42817 Mon Sep 17 00:00:00 2001
4From: Richard Sandiford <rsandifo@nildram.co.uk>
5Date: Sun, 8 Jan 2012 12:34:30 +0000
6Subject: [PATCH 052/262] gas/ * config/tc-mips.c (s_tls_rel_directive):
7 Call mips_clear_insn_labels.
8
9gas/testsuite/
10 * gas/mips/tls-relw.s, gas/mips/tls-relw.d: New test.
11 * gas/mips/mips.exp: Run it.
12---
13 gas/ChangeLog | 4 ++++
14 gas/config/tc-mips.c | 1 +
15 gas/testsuite/ChangeLog | 5 +++++
16 gas/testsuite/gas/mips/mips.exp | 1 +
17 gas/testsuite/gas/mips/tls-relw.d | 8 ++++++++
18 gas/testsuite/gas/mips/tls-relw.s | 12 ++++++++++++
19 6 files changed, 31 insertions(+)
20 create mode 100644 gas/testsuite/gas/mips/tls-relw.d
21 create mode 100644 gas/testsuite/gas/mips/tls-relw.s
22
232012-01-08 Richard Sandiford <rdsandiford@googlemail.com>
24
25 * config/tc-mips.c (s_tls_rel_directive): Call mips_clear_insn_labels.
26
27diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
28index 0fb3a6e..5324450 100644
29--- a/gas/config/tc-mips.c
30+++ b/gas/config/tc-mips.c
31@@ -16591,6 +16591,7 @@ s_tls_rel_directive (const size_t bytes, const char *dirstr,
32 md_number_to_chars (p, 0, bytes);
33 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
34 demand_empty_rest_of_line ();
35+ mips_clear_insn_labels ();
36 }
37
38 /* Handle .dtprelword. */
39--- a/gas/testsuite/gas/mips/mips.exp
40+++ b/gas/testsuite/gas/mips/mips.exp
41@@ -878,6 +878,7 @@ if { [istarget mips*-*-vxworks*] } {
42
43 run_list_test "tls-ill" "-32"
44 run_dump_test "tls-o32"
45+ run_dump_test "tls-relw"
46 run_dump_test "jalr2"
47
48 run_dump_test_arches "aent" [mips_arch_list_matching mips1]
49diff --git a/gas/testsuite/gas/mips/tls-relw.d b/gas/testsuite/gas/mips/tls-relw.d
50new file mode 100644
51index 0000000..bc13b43
52--- /dev/null
53+++ b/gas/testsuite/gas/mips/tls-relw.d
54@@ -0,0 +1,8 @@
55+# as: -EB
56+# objdump: -sj.data
57+
58+.*
59+
60+Contents of section \.data:
61+ 0000 00000001 00000000 00000002 00000004 ................
62+ 0010 00000000 00000003 00000010 00000000 ................
63diff --git a/gas/testsuite/gas/mips/tls-relw.s b/gas/testsuite/gas/mips/tls-relw.s
64new file mode 100644
65index 0000000..6890685
66--- /dev/null
67+++ b/gas/testsuite/gas/mips/tls-relw.s
68@@ -0,0 +1,12 @@
69+ .data
70+start:
71+ .word 1
72+a:
73+ .tprelword t1
74+ .word 2
75+ .word a-start
76+b:
77+ .dtprelword t2
78+ .word 3
79+ .word b-start
80+ .word 0
81--
821.7.9.5
83
diff --git a/meta/recipes-devtools/binutils/binutils/0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch b/meta/recipes-devtools/binutils/binutils/0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch
new file mode 100644
index 0000000000..697d70eac5
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch
@@ -0,0 +1,176 @@
1Upstream-Status: Backport
2
3From fee27086a7592c1812253e9c1c26f412dd87f3a2 Mon Sep 17 00:00:00 2001
4From: "H.J. Lu" <hjl.tools@gmail.com>
5Date: Tue, 10 Jan 2012 20:34:56 +0000
6Subject: [PATCH 055/262] Remove ABI_64_P check on R_X86_64_PCXX
7
8bfd/
9
102012-01-10 H.J. Lu <hongjiu.lu@intel.com>
11
12 PR ld/13581
13 * elf64-x86-64.c (elf_x86_64_relocate_section): Remove ABI_64_P
14 check on R_X86_64_PCXX.
15
16ld/testsuite/
17
182012-01-10 H.J. Lu <hongjiu.lu@intel.com>
19
20 PR ld/13581
21 * ld-x86-64/ilp32-4.s: New.
22 * ld-x86-64/ilp32-10.d: Likewise.
23 * ld-x86-64/ilp32-10.s: Likewise.
24
25 * ld-x86-64/ilp32-4.d: Adjusted.
26 * ld-x86-64/ilp32-5.d: Likewise.
27 * ld-x86-64/ilp32-5.s: Likewise.
28
29 * ld-x86-64/x86-64.exp: Run ilp32-10.
30---
31 bfd/ChangeLog | 7 +++++++
32 bfd/elf64-x86-64.c | 1 -
33 ld/testsuite/ChangeLog | 14 ++++++++++++++
34 ld/testsuite/ld-x86-64/ilp32-10.d | 3 +++
35 ld/testsuite/ld-x86-64/ilp32-10.s | 3 +++
36 ld/testsuite/ld-x86-64/ilp32-4.d | 32 +++++++++++++-------------------
37 ld/testsuite/ld-x86-64/ilp32-4.s | 3 +++
38 ld/testsuite/ld-x86-64/ilp32-5.d | 2 +-
39 ld/testsuite/ld-x86-64/ilp32-5.s | 2 +-
40 ld/testsuite/ld-x86-64/x86-64.exp | 1 +
41 10 files changed, 46 insertions(+), 22 deletions(-)
42 create mode 100644 ld/testsuite/ld-x86-64/ilp32-10.d
43 create mode 100644 ld/testsuite/ld-x86-64/ilp32-10.s
44 create mode 100644 ld/testsuite/ld-x86-64/ilp32-4.s
45
46diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
47index 3a2444b..bdb3ae6 100644
48--- a/bfd/elf64-x86-64.c
49+++ b/bfd/elf64-x86-64.c
50@@ -3460,7 +3460,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
51 case R_X86_64_PC16:
52 case R_X86_64_PC32:
53 if (info->shared
54- && ABI_64_P (output_bfd)
55 && (input_section->flags & SEC_ALLOC) != 0
56 && (input_section->flags & SEC_READONLY) != 0
57 && h != NULL)
58diff --git a/ld/testsuite/ld-x86-64/ilp32-10.d b/ld/testsuite/ld-x86-64/ilp32-10.d
59new file mode 100644
60index 0000000..43d9fbd
61--- /dev/null
62+++ b/ld/testsuite/ld-x86-64/ilp32-10.d
63@@ -0,0 +1,3 @@
64+#as: --x32
65+#ld: -shared -melf32_x86_64
66+#error: .*relocation R_X86_64_PC32 against undefined symbol `bar' can not be used when making a shared object; recompile with -fPIC
67diff --git a/ld/testsuite/ld-x86-64/ilp32-10.s b/ld/testsuite/ld-x86-64/ilp32-10.s
68new file mode 100644
69index 0000000..70e4a90
70--- /dev/null
71+++ b/ld/testsuite/ld-x86-64/ilp32-10.s
72@@ -0,0 +1,3 @@
73+ .globl foo
74+foo:
75+ mov bar(%rip), %rax
76diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d
77index 84dc7b2..92d8a67 100644
78--- a/ld/testsuite/ld-x86-64/ilp32-4.d
79+++ b/ld/testsuite/ld-x86-64/ilp32-4.d
80@@ -1,36 +1,30 @@
81-#source: start.s
82 #as: --x32
83 #ld: -m elf32_x86_64 -shared --no-ld-generated-unwind-info
84 #readelf: -d -S --wide
85
86-There are 10 section headers, starting at offset 0x22c:
87+There are 9 section headers, starting at offset 0x1d8:
88
89 Section Headers:
90 \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al
91 \[ 0\] NULL 00000000 000000 000000 00 0 0 0
92- \[ 1\] .hash HASH 00000094 000094 000030 04 A 2 0 4
93- \[ 2\] .dynsym DYNSYM 000000c4 0000c4 000070 10 A 3 2 4
94- \[ 3\] .dynstr STRTAB 00000134 000134 00001d 00 A 0 0 1
95- \[ 4\] .rela.dyn RELA 00000154 000154 00000c 0c A 2 0 4
96- \[ 5\] .text PROGBITS 00000160 000160 000005 00 AX 0 0 4
97- \[ 6\] .dynamic DYNAMIC 00200168 000168 000078 08 WA 3 0 4
98- \[ 7\] .shstrtab STRTAB 00000000 0001e0 00004a 00 0 0 1
99- \[ 8\] .symtab SYMTAB 00000000 0003bc 0000e0 10 9 9 4
100- \[ 9\] .strtab STRTAB 00000000 00049c 000043 00 0 0 1
101+ \[ 1\] .hash HASH 00000094 000094 00002c 04 A 2 0 4
102+ \[ 2\] .dynsym DYNSYM 000000c0 0000c0 000060 10 A 3 2 4
103+ \[ 3\] .dynstr STRTAB 00000120 000120 000019 00 A 0 0 1
104+ \[ 4\] .text PROGBITS 0000013c 00013c 000001 00 AX 0 0 4
105+ \[ 5\] .dynamic DYNAMIC 00200140 000140 000058 08 WA 3 0 4
106+ \[ 6\] .shstrtab STRTAB 00000000 000198 000040 00 0 0 1
107+ \[ 7\] .symtab SYMTAB 00000000 000340 0000c0 10 8 8 4
108+ \[ 8\] .strtab STRTAB 00000000 000400 00003f 00 0 0 1
109 Key to Flags:
110 W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), l \(large\)
111 I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
112 O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
113
114-Dynamic section at offset 0x168 contains 10 entries:
115+Dynamic section at offset 0x140 contains 6 entries:
116 Tag Type Name/Value
117 0x00000004 \(HASH\) 0x94
118- 0x00000005 \(STRTAB\) 0x134
119- 0x00000006 \(SYMTAB\) 0xc4
120- 0x0000000a \(STRSZ\) 29 \(bytes\)
121+ 0x00000005 \(STRTAB\) 0x120
122+ 0x00000006 \(SYMTAB\) 0xc0
123+ 0x0000000a \(STRSZ\) 25 \(bytes\)
124 0x0000000b \(SYMENT\) 16 \(bytes\)
125- 0x00000007 \(RELA\) 0x154
126- 0x00000008 \(RELASZ\) 12 \(bytes\)
127- 0x00000009 \(RELAENT\) 12 \(bytes\)
128- 0x00000016 \(TEXTREL\) 0x0
129 0x00000000 \(NULL\) 0x0
130diff --git a/ld/testsuite/ld-x86-64/ilp32-4.s b/ld/testsuite/ld-x86-64/ilp32-4.s
131new file mode 100644
132index 0000000..5f270c7
133--- /dev/null
134+++ b/ld/testsuite/ld-x86-64/ilp32-4.s
135@@ -0,0 +1,3 @@
136+ .globl _start
137+_start:
138+ ret
139diff --git a/ld/testsuite/ld-x86-64/ilp32-5.d b/ld/testsuite/ld-x86-64/ilp32-5.d
140index e4673e5..4870c2b 100644
141--- a/ld/testsuite/ld-x86-64/ilp32-5.d
142+++ b/ld/testsuite/ld-x86-64/ilp32-5.d
143@@ -4,5 +4,5 @@
144
145 #...
146 [0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
147-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_PC32 +[0-9a-f]+ +foo - 4
148+[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +[0-9a-f]+ +foo \+ 0
149 [0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +foo \+ 0
150diff --git a/ld/testsuite/ld-x86-64/ilp32-5.s b/ld/testsuite/ld-x86-64/ilp32-5.s
151index 0d97807..ef0c60e 100644
152--- a/ld/testsuite/ld-x86-64/ilp32-5.s
153+++ b/ld/testsuite/ld-x86-64/ilp32-5.s
154@@ -1,6 +1,6 @@
155 .globl bar
156 bar:
157- mov foo(%rip), %rax
158+ mov foo@GOTPCREL(%rip), %rax
159
160 .data
161 xxx:
162diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
163index 77b081b..44d3e07 100644
164--- a/ld/testsuite/ld-x86-64/x86-64.exp
165+++ b/ld/testsuite/ld-x86-64/x86-64.exp
166@@ -207,6 +207,7 @@ run_dump_test "ilp32-6"
167 run_dump_test "ilp32-7"
168 run_dump_test "ilp32-8"
169 run_dump_test "ilp32-9"
170+run_dump_test "ilp32-10"
171 run_dump_test "ia32-1"
172 run_dump_test "ia32-2"
173 run_dump_test "ia32-3"
174--
1751.7.9.5
176
diff --git a/meta/recipes-devtools/binutils/binutils/0078-PR-binutils-13622.patch b/meta/recipes-devtools/binutils/binutils/0078-PR-binutils-13622.patch
new file mode 100644
index 0000000000..a28fc9d8e9
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0078-PR-binutils-13622.patch
@@ -0,0 +1,48 @@
1Upstream-Status: Backport
2
3From dcf0cb6bb406708020efe2db44f53af0fe822773 Mon Sep 17 00:00:00 2001
4From: Nick Clifton <nickc@redhat.com>
5Date: Mon, 30 Jan 2012 11:35:37 +0000
6Subject: [PATCH 078/262] PR binutils/13622 * readelf.c
7 (process_section_groups): If there are no section
8 headers do not scan for section groups.
9 (process_note_sections): Likewise for note
10 sections.
11
12---
13 binutils/ChangeLog | 7 +++++++
14 binutils/readelf.c | 5 +++--
15 2 files changed, 10 insertions(+), 2 deletions(-)
16
172012-01-26 Nick Clifton <nickc@redhat.com>
18
19 PR binutils/13622
20 * readelf.c (process_section_groups): If there are no section
21 headers do not scan for section groups.
22 (process_note_sections): Likewise for note sections.
23diff --git a/binutils/readelf.c b/binutils/readelf.c
24index 9e13190..bf053d9 100644
25--- a/binutils/readelf.c
26+++ b/binutils/readelf.c
27@@ -4937,7 +4937,8 @@ process_section_groups (FILE * file)
28 if (section_headers == NULL)
29 {
30 error (_("Section headers are not available!\n"));
31- abort ();
32+ /* PR 13622: This can happen with a corrupt ELF header. */
33+ return 0;
34 }
35
36 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
37@@ -12942,7 +12943,7 @@ process_note_sections (FILE * file)
38 int res = 1;
39
40 for (i = 0, section = section_headers;
41- i < elf_header.e_shnum;
42+ i < elf_header.e_shnum && section != NULL;
43 i++, section++)
44 if (section->sh_type == SHT_NOTE)
45 res &= process_corefile_note_segment (file,
46--
471.7.9.5
48
diff --git a/meta/recipes-devtools/binutils/binutils/0144-timer.cc-include-unistd.h.patch b/meta/recipes-devtools/binutils/binutils/0144-timer.cc-include-unistd.h.patch
new file mode 100644
index 0000000000..271c513daf
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0144-timer.cc-include-unistd.h.patch
@@ -0,0 +1,32 @@
1Upstream-Status: Backport
2
3From b7578c6b7bd966b63ab1b2682fd90ed4f3a92e71 Mon Sep 17 00:00:00 2001
4From: Ian Lance Taylor <ian@airs.com>
5Date: Fri, 6 Apr 2012 17:23:58 +0000
6Subject: [PATCH 144/262] * timer.cc: #include <unistd.h>.
7
8---
9 gold/ChangeLog | 4 ++++
10 gold/timer.cc | 2 ++
11 2 files changed, 6 insertions(+)
12
132012-04-06 Ian Lance Taylor <iant@google.com>
14
15 * timer.cc: #include <unistd.h>.
16
17diff --git a/gold/timer.cc b/gold/timer.cc
18index d9b8874..44e19f5 100644
19--- a/gold/timer.cc
20+++ b/gold/timer.cc
21@@ -22,6 +22,8 @@
22
23 #include "gold.h"
24
25+#include <unistd.h>
26+
27 #ifdef HAVE_TIMES
28 #include <sys/times.h>
29 #endif
30--
311.7.9.5
32
diff --git a/meta/recipes-devtools/binutils/binutils/0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch b/meta/recipes-devtools/binutils/binutils/0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch
new file mode 100644
index 0000000000..bd1ff5bd95
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0166-2012-04-27-Doug-Kwan-dougkwan-google.com.patch
@@ -0,0 +1,169 @@
1Upstream-Status: Backport
2
3From b6db4b7975d21ec53da5975ddac021098da13bf3 Mon Sep 17 00:00:00 2001
4From: Doug Kwan <dougkwan@google.com>
5Date: Thu, 26 Apr 2012 18:08:19 +0000
6Subject: [PATCH 166/262] 2012-04-27 Doug Kwan <dougkwan@google.com>
7
8 Backport from mainline:
9
10 2012-03-16 Doug Kwan <dougkwan@google.com>
11
12 * testsuite/Makefile.am: Disable test initpri3b.
13 * testsuite/Makefile.in: Regenerate.
14
15 2012-03-14 Doug Kwan <dougkwan@google.com>
16
17 * gold/arm.cc (Target_arm::Scan::global): Generate
18 R_ARM_GLOB_DAT dynamic relocations for protected symbols in
19 shared objects.
20---
21 gold/ChangeLog | 15 +++++++++++++++
22 gold/arm.cc | 4 +++-
23 gold/testsuite/Makefile.am | 15 ++++++++++-----
24 gold/testsuite/Makefile.in | 32 +++++++++++++-------------------
25 4 files changed, 41 insertions(+), 25 deletions(-)
26
27diff --git a/gold/arm.cc b/gold/arm.cc
28index 72c3670..a1e8e4c 100644
29--- a/gold/arm.cc
30+++ b/gold/arm.cc
31@@ -8374,7 +8374,9 @@ Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
32 Reloc_section* rel_dyn = target->rel_dyn_section(layout);
33 if (gsym->is_from_dynobj()
34 || gsym->is_undefined()
35- || gsym->is_preemptible())
36+ || gsym->is_preemptible()
37+ || (gsym->visibility() == elfcpp::STV_PROTECTED
38+ && parameters->options().shared()))
39 got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
40 rel_dyn, elfcpp::R_ARM_GLOB_DAT);
41 else
42diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
43index 9b8605b..97d6457 100644
44--- a/gold/testsuite/Makefile.am
45+++ b/gold/testsuite/Makefile.am
46@@ -870,11 +870,16 @@ initpri3a_DEPENDENCIES = gcctestdir/ld
47 initpri3a_LDFLAGS = -Bgcctestdir/
48 initpri3a_LDADD =
49
50-check_PROGRAMS += initpri3b
51-initpri3b_SOURCES = initpri3.c
52-initpri3b_DEPENDENCIES = gcctestdir/ld
53-initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
54-initpri3b_LDADD =
55+# This test fails on targets not using .ctors and .dtors sections (e.g. ARM
56+# EABI). Given that gcc is moving towards using .init_array in all cases,
57+# this test is commented out. A better fix would be checking whether gcc
58+# uses .ctors or .init_array sections in configure.
59+
60+# check_PROGRAMS += initpri3b
61+# initpri3b_SOURCES = initpri3.c
62+# initpri3b_DEPENDENCIES = gcctestdir/ld
63+# initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
64+# initpri3b_LDADD =
65
66 # Test --detect-odr-violations
67 check_SCRIPTS += debug_msg.sh
68diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
69index 785dcdd..518d32b 100644
70--- a/gold/testsuite/Makefile.in
71+++ b/gold/testsuite/Makefile.in
72@@ -56,6 +56,17 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
73 @NATIVE_OR_CROSS_LINKER_TRUE@am__append_1 = object_unittest \
74 @NATIVE_OR_CROSS_LINKER_TRUE@ binary_unittest
75
76+# This test fails on targets not using .ctors and .dtors sections (e.g. ARM
77+# EABI). Given that gcc is moving towards using .init_array in all cases,
78+# this test is commented out. A better fix would be checking whether gcc
79+# uses .ctors or .init_array sections in configure.
80+
81+# check_PROGRAMS += initpri3b
82+# initpri3b_SOURCES = initpri3.c
83+# initpri3b_DEPENDENCIES = gcctestdir/ld
84+# initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
85+# initpri3b_LDADD =
86+
87 # Test --detect-odr-violations
88
89 # Similar to --detect-odr-violations: check for undefined symbols in .so's
90@@ -189,7 +200,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
91 # Test -o when emitting to a special file (such as something in /dev).
92 @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_24 = many_sections_test \
93 @GCC_TRUE@@NATIVE_LINKER_TRUE@ many_sections_r_test initpri1 \
94-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2 initpri3a initpri3b \
95+@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2 initpri3a \
96 @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile
97 @GCC_FALSE@many_sections_test_DEPENDENCIES =
98 @NATIVE_LINKER_FALSE@many_sections_test_DEPENDENCIES =
99@@ -204,8 +215,6 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
100 @NATIVE_LINKER_FALSE@initpri2_DEPENDENCIES =
101 @GCC_FALSE@initpri3a_DEPENDENCIES =
102 @NATIVE_LINKER_FALSE@initpri3a_DEPENDENCIES =
103-@GCC_FALSE@initpri3b_DEPENDENCIES =
104-@NATIVE_LINKER_FALSE@initpri3b_DEPENDENCIES =
105
106 # Check that --detect-odr-violations works with compressed debug sections.
107 @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@am__append_27 = debug_msg_cdebug.err
108@@ -712,7 +721,6 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS)
109 @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri1$(EXEEXT) \
110 @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2$(EXEEXT) \
111 @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3a$(EXEEXT) \
112-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3b$(EXEEXT) \
113 @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile$(EXEEXT)
114 @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_21 = flagstest_compress_debug_sections$(EXEEXT) \
115 @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections$(EXEEXT)
116@@ -1200,11 +1208,6 @@ initpri2_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri2_LDFLAGS) \
117 initpri3a_OBJECTS = $(am_initpri3a_OBJECTS)
118 initpri3a_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri3a_LDFLAGS) \
119 $(LDFLAGS) -o $@
120-@GCC_TRUE@@NATIVE_LINKER_TRUE@am_initpri3b_OBJECTS = \
121-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3.$(OBJEXT)
122-initpri3b_OBJECTS = $(am_initpri3b_OBJECTS)
123-initpri3b_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri3b_LDFLAGS) \
124- $(LDFLAGS) -o $@
125 @GCC_TRUE@@NATIVE_LINKER_TRUE@am_justsyms_OBJECTS = \
126 @GCC_TRUE@@NATIVE_LINKER_TRUE@ justsyms_1.$(OBJEXT)
127 justsyms_OBJECTS = $(am_justsyms_OBJECTS)
128@@ -1698,7 +1701,7 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \
129 incremental_copy_test.c incremental_test_2.c \
130 incremental_test_3.c incremental_test_4.c incremental_test_5.c \
131 incremental_test_6.c $(initpri1_SOURCES) $(initpri2_SOURCES) \
132- $(initpri3a_SOURCES) $(initpri3b_SOURCES) $(justsyms_SOURCES) \
133+ $(initpri3a_SOURCES) $(justsyms_SOURCES) \
134 $(justsyms_exec_SOURCES) $(large_SOURCES) local_labels_test.c \
135 many_sections_r_test.c $(many_sections_test_SOURCES) \
136 $(object_unittest_SOURCES) permission_test.c plugin_test_1.c \
137@@ -2281,10 +2284,6 @@ LDADD = libgoldtest.a ../libgold.a ../../libiberty/libiberty.a $(LIBINTL) \
138 @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_DEPENDENCIES = gcctestdir/ld
139 @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_LDFLAGS = -Bgcctestdir/
140 @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_LDADD =
141-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_SOURCES = initpri3.c
142-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_DEPENDENCIES = gcctestdir/ld
143-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
144-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_LDADD =
145 @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_SOURCES = ver_test_main.cc
146 @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_DEPENDENCIES = gcctestdir/ld ver_test_1.so ver_test_2.so ver_test_4.so
147 @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
148@@ -2928,9 +2927,6 @@ initpri2$(EXEEXT): $(initpri2_OBJECTS) $(initpri2_DEPENDENCIES)
149 initpri3a$(EXEEXT): $(initpri3a_OBJECTS) $(initpri3a_DEPENDENCIES)
150 @rm -f initpri3a$(EXEEXT)
151 $(initpri3a_LINK) $(initpri3a_OBJECTS) $(initpri3a_LDADD) $(LIBS)
152-initpri3b$(EXEEXT): $(initpri3b_OBJECTS) $(initpri3b_DEPENDENCIES)
153- @rm -f initpri3b$(EXEEXT)
154- $(initpri3b_LINK) $(initpri3b_OBJECTS) $(initpri3b_LDADD) $(LIBS)
155 justsyms$(EXEEXT): $(justsyms_OBJECTS) $(justsyms_DEPENDENCIES)
156 @rm -f justsyms$(EXEEXT)
157 $(justsyms_LINK) $(justsyms_OBJECTS) $(justsyms_LDADD) $(LIBS)
158@@ -3869,8 +3865,6 @@ initpri2.log: initpri2$(EXEEXT)
159 @p='initpri2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
160 initpri3a.log: initpri3a$(EXEEXT)
161 @p='initpri3a$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
162-initpri3b.log: initpri3b$(EXEEXT)
163- @p='initpri3b$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
164 flagstest_o_specialfile.log: flagstest_o_specialfile$(EXEEXT)
165 @p='flagstest_o_specialfile$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
166 flagstest_compress_debug_sections.log: flagstest_compress_debug_sections$(EXEEXT)
167--
1681.7.9.5
169
diff --git a/meta/recipes-devtools/binutils/binutils/0182-PR-ld-13991.patch b/meta/recipes-devtools/binutils/binutils/0182-PR-ld-13991.patch
new file mode 100644
index 0000000000..f4c94388c8
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0182-PR-ld-13991.patch
@@ -0,0 +1,1617 @@
1Upstream-Status: Backport
2
3From e827844b6119ff7e0c2de167f2b261c6c06226c8 Mon Sep 17 00:00:00 2001
4From: Nick Clifton <nickc@redhat.com>
5Date: Fri, 11 May 2012 12:24:12 +0000
6Subject: [PATCH 182/262] PR ld/13991 bfd/ * bfd/elf-bfd.h
7 (_bfd_elf_link_just_syms): Define as
8 _bfd_generic_link_just_syms. * bfd/elflink.c
9 (_bfd_elf_link_just_syms): Delete. *
10 bfd/linker.c (_bfd_generic_link_just_syms): Set
11 sec_info_type.
12
13 * bfd/bfd-in.h (discarded_section): Renamed from elf_discarded_section.
14 * bfd/section.c (SEC_INFO_TYPE_NONE, SEC_INFO_TYPE_STABS,
15 SEC_INFO_TYPE_MERGE, SEC_INFO_TYPE_EH_FRAME,
16 SEC_INFO_TYPE_JUST_SYMS): Renamed from corresponding ELF_INFO_TYPE.
17 * bfd/elf-eh-frame.c, * bfd/elf-m10200.c, * bfd/elf-m10300.c,
18 * bfd/elf.c, * bfd/elf32-arm.c, * bfd/elf32-avr.c, * bfd/elf32-bfin.c,
19 * bfd/elf32-cr16.c, * bfd/elf32-cr16c.c, * bfd/elf32-cris.c,
20 * bfd/elf32-crx.c, * bfd/elf32-d10v.c, * bfd/elf32-epiphany.c,
21 * bfd/elf32-fr30.c, * bfd/elf32-frv.c, * bfd/elf32-h8300.c,
22 * bfd/elf32-hppa.c, * bfd/elf32-i370.c, * bfd/elf32-i386.c,
23 * bfd/elf32-i860.c, * bfd/elf32-ip2k.c, * bfd/elf32-iq2000.c,
24 * bfd/elf32-lm32.c, * bfd/elf32-m32c.c, * bfd/elf32-m32r.c,
25 * bfd/elf32-m68hc1x.c, * bfd/elf32-m68k.c, * bfd/elf32-mcore.c,
26 * bfd/elf32-mep.c, * bfd/elf32-moxie.c, * bfd/elf32-msp430.c,
27 * bfd/elf32-mt.c, * bfd/elf32-openrisc.c, * bfd/elf32-ppc.c,
28 * bfd/elf32-rl78.c, * bfd/elf32-rx.c, * bfd/elf32-s390.c,
29 * bfd/elf32-score.c, * bfd/elf32-score7.c, * bfd/elf32-sh.c,
30 * bfd/elf32-spu.c, * bfd/elf32-tic6x.c, * bfd/elf32-tilepro.c,
31 * bfd/elf32-v850.c, * bfd/elf32-vax.c, * bfd/elf32-xc16x.c,
32 * bfd/elf32-xstormy16.c, * bfd/elf32-xtensa.c, * bfd/elf64-alpha.c,
33 * bfd/elf64-hppa.c, * bfd/elf64-ia64-vms.c, * bfd/elf64-mmix.c,
34 * bfd/elf64-ppc.c, * bfd/elf64-s390.c, * bfd/elf64-sh64.c,
35 * bfd/elf64-x86-64.c, * bfd/elflink.c, * bfd/elfnn-ia64.c,
36 * bfd/elfxx-mips.c, * bfd/elfxx-sparc.c, * bfd/elfxx-tilegx.c,
37 * bfd/reloc.c: Update all references.
38 * bfd/bfd-in2.h: Regenerate.
39 ld/
40 * ld/ldlang.c (size_input_section): Use sec_info_type rather than
41 usrdata->flags.just_syms.
42 * ld/ldwrite.c (build_link_order): Likewise.
43 * ld/emultempl/hppaelf.em (build_section_lists): Likewise.
44 * ld/emultempl/ppc64elf.em (build_toc_list): Likewise.
45 * ld/emultempl/armelf.em (build_section_lists): Likewise.
46 (after_allocation): Update for renamed sec_info_type value.
47 * ld/emultempl/tic6xdsbt.em: Likewise.
48---
49 bfd/ChangeLog | 38 +++++++++++++++++++++++++++++++++
50 bfd/bfd-in.h | 6 +++---
51 bfd/bfd-in2.h | 16 +++++++-------
52 bfd/elf-bfd.h | 3 +--
53 bfd/elf-eh-frame.c | 10 ++++-----
54 bfd/elf-m10200.c | 2 +-
55 bfd/elf-m10300.c | 4 ++--
56 bfd/elf.c | 10 ++++-----
57 bfd/elf32-arm.c | 6 +++---
58 bfd/elf32-avr.c | 2 +-
59 bfd/elf32-bfin.c | 6 +++---
60 bfd/elf32-cr16.c | 2 +-
61 bfd/elf32-cr16c.c | 2 +-
62 bfd/elf32-cris.c | 2 +-
63 bfd/elf32-crx.c | 2 +-
64 bfd/elf32-d10v.c | 2 +-
65 bfd/elf32-fr30.c | 2 +-
66 bfd/elf32-frv.c | 4 ++--
67 bfd/elf32-h8300.c | 2 +-
68 bfd/elf32-hppa.c | 2 +-
69 bfd/elf32-i370.c | 2 +-
70 bfd/elf32-i386.c | 4 ++--
71 bfd/elf32-i860.c | 2 +-
72 bfd/elf32-ip2k.c | 2 +-
73 bfd/elf32-iq2000.c | 2 +-
74 bfd/elf32-lm32.c | 6 +++---
75 bfd/elf32-m32c.c | 2 +-
76 bfd/elf32-m32r.c | 2 +-
77 bfd/elf32-m68hc1x.c | 2 +-
78 bfd/elf32-m68k.c | 2 +-
79 bfd/elf32-mcore.c | 2 +-
80 bfd/elf32-mep.c | 2 +-
81 bfd/elf32-moxie.c | 2 +-
82 bfd/elf32-msp430.c | 2 +-
83 bfd/elf32-mt.c | 2 +-
84 bfd/elf32-openrisc.c | 2 +-
85 bfd/elf32-ppc.c | 6 +++---
86 bfd/elf32-rx.c | 4 ++--
87 bfd/elf32-s390.c | 2 +-
88 bfd/elf32-score.c | 2 +-
89 bfd/elf32-score7.c | 2 +-
90 bfd/elf32-sh.c | 4 ++--
91 bfd/elf32-spu.c | 2 +-
92 bfd/elf32-tic6x.c | 2 +-
93 bfd/elf32-tilepro.c | 2 +-
94 bfd/elf32-v850.c | 2 +-
95 bfd/elf32-vax.c | 2 +-
96 bfd/elf32-xc16x.c | 2 +-
97 bfd/elf32-xstormy16.c | 2 +-
98 bfd/elf32-xtensa.c | 8 +++----
99 bfd/elf64-alpha.c | 8 +++----
100 bfd/elf64-hppa.c | 2 +-
101 bfd/elf64-mmix.c | 2 +-
102 bfd/elf64-ppc.c | 20 +++++++++---------
103 bfd/elf64-s390.c | 2 +-
104 bfd/elf64-sh64.c | 4 ++--
105 bfd/elf64-x86-64.c | 4 ++--
106 bfd/elflink.c | 51 ++++++++++++++++++---------------------------
107 bfd/elfnn-ia64.c | 6 +++---
108 bfd/elfxx-mips.c | 2 +-
109 bfd/elfxx-sparc.c | 2 +-
110 bfd/elfxx-tilegx.c | 2 +-
111 bfd/linker.c | 3 ++-
112 bfd/reloc.c | 2 +-
113 bfd/section.c | 10 ++++-----
114 ld/ChangeLog | 15 +++++++++++++
115 ld/emultempl/armelf.em | 4 ++--
116 ld/emultempl/hppaelf.em | 2 +-
117 ld/emultempl/ppc64elf.em | 4 ++--
118 ld/emultempl/tic6xdsbt.em | 2 +-
119 ld/ldlang.c | 2 +-
120 ld/ldwrite.c | 4 ++--
121 72 files changed, 199 insertions(+), 157 deletions(-)
122
123diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
124index a477b49..7c5298a 100644
125--- a/bfd/bfd-in.h
126+++ b/bfd/bfd-in.h
127@@ -295,11 +295,11 @@ typedef struct bfd_section *sec_ptr;
128 ? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
129
130 /* Return TRUE if input section SEC has been discarded. */
131-#define elf_discarded_section(sec) \
132+#define discarded_section(sec) \
133 (!bfd_is_abs_section (sec) \
134 && bfd_is_abs_section ((sec)->output_section) \
135- && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \
136- && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
137+ && (sec)->sec_info_type != SEC_INFO_TYPE_MERGE \
138+ && (sec)->sec_info_type != SEC_INFO_TYPE_JUST_SYMS)
139
140 /* Forward define. */
141 struct stat;
142diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
143index cd90740..34f9628 100644
144--- a/bfd/bfd-in2.h
145+++ b/bfd/bfd-in2.h
146@@ -302,11 +302,11 @@ typedef struct bfd_section *sec_ptr;
147 ? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
148
149 /* Return TRUE if input section SEC has been discarded. */
150-#define elf_discarded_section(sec) \
151+#define discarded_section(sec) \
152 (!bfd_is_abs_section (sec) \
153 && bfd_is_abs_section ((sec)->output_section) \
154- && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \
155- && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
156+ && (sec)->sec_info_type != SEC_INFO_TYPE_MERGE \
157+ && (sec)->sec_info_type != SEC_INFO_TYPE_JUST_SYMS)
158
159 /* Forward define. */
160 struct stat;
161@@ -1384,11 +1384,11 @@ typedef struct bfd_section
162
163 /* Type of sec_info information. */
164 unsigned int sec_info_type:3;
165-#define ELF_INFO_TYPE_NONE 0
166-#define ELF_INFO_TYPE_STABS 1
167-#define ELF_INFO_TYPE_MERGE 2
168-#define ELF_INFO_TYPE_EH_FRAME 3
169-#define ELF_INFO_TYPE_JUST_SYMS 4
170+#define SEC_INFO_TYPE_NONE 0
171+#define SEC_INFO_TYPE_STABS 1
172+#define SEC_INFO_TYPE_MERGE 2
173+#define SEC_INFO_TYPE_EH_FRAME 3
174+#define SEC_INFO_TYPE_JUST_SYMS 4
175
176 /* Nonzero if this section uses RELA relocations, rather than REL. */
177 unsigned int use_rela_p:1;
178diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
179index d6e2ab2..2cfe2ba 100644
180--- a/bfd/elf-bfd.h
181+++ b/bfd/elf-bfd.h
182@@ -1807,8 +1807,7 @@ extern void bfd_elf_set_group_contents
183 (bfd *, asection *, void *);
184 extern asection *_bfd_elf_check_kept_section
185 (asection *, struct bfd_link_info *);
186-extern void _bfd_elf_link_just_syms
187- (asection *, struct bfd_link_info *);
188+#define _bfd_elf_link_just_syms _bfd_generic_link_just_syms
189 extern void _bfd_elf_copy_link_hash_symbol_type
190 (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *);
191 extern bfd_boolean _bfd_elf_size_group_sections
192diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
193index 54142b2..7b5cf7a 100644
194--- a/bfd/elf-eh-frame.c
195+++ b/bfd/elf-eh-frame.c
196@@ -491,7 +491,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
197 return;
198
199 if (sec->size == 0
200- || sec->sec_info_type != ELF_INFO_TYPE_NONE)
201+ || sec->sec_info_type != SEC_INFO_TYPE_NONE)
202 {
203 /* This file does not contain .eh_frame information. */
204 return;
205@@ -904,7 +904,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
206 BFD_ASSERT (cie_count == num_cies);
207
208 elf_section_data (sec)->sec_info = sec_info;
209- sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
210+ sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
211 if (hdr_info->merge_cies)
212 {
213 sec_info->cies = local_cies;
214@@ -1137,7 +1137,7 @@ _bfd_elf_discard_section_eh_frame
215 struct eh_frame_hdr_info *hdr_info;
216 unsigned int ptr_size, offset;
217
218- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
219+ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
220 return FALSE;
221
222 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
223@@ -1307,7 +1307,7 @@ _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
224 struct eh_frame_sec_info *sec_info;
225 unsigned int lo, hi, mid;
226
227- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
228+ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
229 return offset;
230 sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
231
232@@ -1395,7 +1395,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
233 unsigned int ptr_size;
234 struct eh_cie_fde *ent;
235
236- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
237+ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
238 /* FIXME: octets_per_byte. */
239 return bfd_set_section_contents (abfd, sec->output_section, contents,
240 sec->output_offset, sec->size);
241diff --git a/bfd/elf-m10200.c b/bfd/elf-m10200.c
242index a38f4db..d58c75c 100644
243--- a/bfd/elf-m10200.c
244+++ b/bfd/elf-m10200.c
245@@ -401,7 +401,7 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
246 unresolved_reloc, warned);
247 }
248
249- if (sec != NULL && elf_discarded_section (sec))
250+ if (sec != NULL && discarded_section (sec))
251 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
252 rel, relend, howto, contents);
253
254diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c
255index 8276a2f..876ff4a 100644
256--- a/bfd/elf-m10300.c
257+++ b/bfd/elf-m10300.c
258@@ -1509,7 +1509,7 @@ mn10300_elf_relocate_section (bfd *output_bfd,
259 h->root.root.root.string);
260 }
261
262- if (sec != NULL && elf_discarded_section (sec))
263+ if (sec != NULL && discarded_section (sec))
264 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
265 rel, relend, howto, contents);
266
267@@ -2763,7 +2763,7 @@ mn10300_elf_relax_section (bfd *abfd,
268 isym->st_name);
269
270 if ((sym_sec->flags & SEC_MERGE)
271- && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
272+ && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
273 {
274 symval = isym->st_value;
275
276diff --git a/bfd/elf.c b/bfd/elf.c
277index aa40c33..9e23bee 100644
278--- a/bfd/elf.c
279+++ b/bfd/elf.c
280@@ -3071,7 +3071,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
281 if (link_info != NULL)
282 {
283 /* Check discarded linkonce section. */
284- if (elf_discarded_section (s))
285+ if (discarded_section (s))
286 {
287 asection *kept;
288 (*_bfd_error_handler)
289@@ -9390,7 +9390,7 @@ _bfd_elf_rela_local_sym (bfd *abfd,
290 + sym->st_value);
291 if ((sec->flags & SEC_MERGE)
292 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
293- && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
294+ && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
295 {
296 rel->r_addend =
297 _bfd_merged_section_offset (abfd, psec,
298@@ -9421,7 +9421,7 @@ _bfd_elf_rel_local_sym (bfd *abfd,
299 {
300 asection *sec = *psec;
301
302- if (sec->sec_info_type != ELF_INFO_TYPE_MERGE)
303+ if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
304 return sym->st_value + addend;
305
306 return _bfd_merged_section_offset (abfd, psec,
307@@ -9437,10 +9437,10 @@ _bfd_elf_section_offset (bfd *abfd,
308 {
309 switch (sec->sec_info_type)
310 {
311- case ELF_INFO_TYPE_STABS:
312+ case SEC_INFO_TYPE_STABS:
313 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
314 offset);
315- case ELF_INFO_TYPE_EH_FRAME:
316+ case SEC_INFO_TYPE_EH_FRAME:
317 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
318 default:
319 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
320diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
321index 1f6c1a0..9355f66 100644
322--- a/bfd/elf32-arm.c
323+++ b/bfd/elf32-arm.c
324@@ -4485,7 +4485,7 @@ cortex_a8_erratum_scan (bfd *input_bfd,
325 if (elf_section_type (section) != SHT_PROGBITS
326 || (elf_section_flags (section) & SHF_EXECINSTR) == 0
327 || (section->flags & SEC_EXCLUDE) != 0
328- || (section->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
329+ || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
330 || (section->output_section == bfd_abs_section_ptr))
331 continue;
332
333@@ -6556,7 +6556,7 @@ bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
334 if (elf_section_type (sec) != SHT_PROGBITS
335 || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
336 || (sec->flags & SEC_EXCLUDE) != 0
337- || sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
338+ || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
339 || sec->output_section == bfd_abs_section_ptr
340 || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
341 continue;
342@@ -10305,7 +10305,7 @@ elf32_arm_relocate_section (bfd * output_bfd,
343 sym_type = h->type;
344 }
345
346- if (sec != NULL && elf_discarded_section (sec))
347+ if (sec != NULL && discarded_section (sec))
348 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
349 rel, relend, howto, contents);
350
351diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
352index a7f9217..97dc268 100644
353--- a/bfd/elf32-avr.c
354+++ b/bfd/elf32-avr.c
355@@ -1189,7 +1189,7 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
356 name = h->root.root.string;
357 }
358
359- if (sec != NULL && elf_discarded_section (sec))
360+ if (sec != NULL && discarded_section (sec))
361 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
362 rel, relend, howto, contents);
363
364diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
365index b112dfc..4941f40 100644
366--- a/bfd/elf32-bfin.c
367+++ b/bfd/elf32-bfin.c
368@@ -1444,7 +1444,7 @@ bfin_relocate_section (bfd * output_bfd,
369 unresolved_reloc, warned);
370 }
371
372- if (sec != NULL && elf_discarded_section (sec))
373+ if (sec != NULL && discarded_section (sec))
374 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
375 rel, relend, howto, contents);
376
377@@ -2663,7 +2663,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
378 osec = sec;
379 }
380
381- if (sec != NULL && elf_discarded_section (sec))
382+ if (sec != NULL && discarded_section (sec))
383 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
384 rel, relend, howto, contents);
385
386@@ -4429,7 +4429,7 @@ bfinfdpic_elf_discard_info (bfd *ibfd,
387
388 /* Account for relaxation of .eh_frame section. */
389 for (s = ibfd->sections; s; s = s->next)
390- if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME)
391+ if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
392 {
393 if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed))
394 return FALSE;
395diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c
396index 0118131..38af05f 100644
397--- a/bfd/elf32-cr16.c
398+++ b/bfd/elf32-cr16.c
399@@ -1431,7 +1431,7 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
400 unresolved_reloc, warned);
401 }
402
403- if (sec != NULL && elf_discarded_section (sec))
404+ if (sec != NULL && discarded_section (sec))
405 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
406 rel, relend, howto, contents);
407
408diff --git a/bfd/elf32-cr16c.c b/bfd/elf32-cr16c.c
409index ca2d7cb..109936b 100644
410--- a/bfd/elf32-cr16c.c
411+++ b/bfd/elf32-cr16c.c
412@@ -723,7 +723,7 @@ elf32_cr16c_relocate_section (bfd *output_bfd,
413 unresolved_reloc, warned);
414 }
415
416- if (sec != NULL && elf_discarded_section (sec))
417+ if (sec != NULL && discarded_section (sec))
418 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
419 rel, relend, howto, contents);
420
421diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
422index 310f6d1..ec23f03 100644
423--- a/bfd/elf32-cris.c
424+++ b/bfd/elf32-cris.c
425@@ -1180,7 +1180,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
426 }
427 }
428
429- if (sec != NULL && elf_discarded_section (sec))
430+ if (sec != NULL && discarded_section (sec))
431 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
432 rel, relend, howto, contents);
433
434diff --git a/bfd/elf32-crx.c b/bfd/elf32-crx.c
435index d48932d..fd13447 100644
436--- a/bfd/elf32-crx.c
437+++ b/bfd/elf32-crx.c
438@@ -873,7 +873,7 @@ elf32_crx_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
439 unresolved_reloc, warned);
440 }
441
442- if (sec != NULL && elf_discarded_section (sec))
443+ if (sec != NULL && discarded_section (sec))
444 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
445 rel, relend, howto, contents);
446
447diff --git a/bfd/elf32-d10v.c b/bfd/elf32-d10v.c
448index 7d65395..e39a9b5 100644
449--- a/bfd/elf32-d10v.c
450+++ b/bfd/elf32-d10v.c
451@@ -463,7 +463,7 @@ elf32_d10v_relocate_section (bfd *output_bfd,
452 unresolved_reloc, warned);
453 }
454
455- if (sec != NULL && elf_discarded_section (sec))
456+ if (sec != NULL && discarded_section (sec))
457 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
458 rel, relend, howto, contents);
459
460diff --git a/bfd/elf32-fr30.c b/bfd/elf32-fr30.c
461index 97b0d29..57be6ae 100644
462--- a/bfd/elf32-fr30.c
463+++ b/bfd/elf32-fr30.c
464@@ -577,7 +577,7 @@ fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
465 name = h->root.root.string;
466 }
467
468- if (sec != NULL && elf_discarded_section (sec))
469+ if (sec != NULL && discarded_section (sec))
470 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
471 rel, relend, howto, contents);
472
473diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
474index 7f3c4dd..513f811 100644
475--- a/bfd/elf32-frv.c
476+++ b/bfd/elf32-frv.c
477@@ -2812,7 +2812,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
478 name = h->root.root.string;
479 }
480
481- if (sec != NULL && elf_discarded_section (sec))
482+ if (sec != NULL && discarded_section (sec))
483 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
484 rel, relend, howto, contents);
485
486@@ -5678,7 +5678,7 @@ frvfdpic_elf_discard_info (bfd *ibfd,
487
488 /* Account for relaxation of .eh_frame section. */
489 for (s = ibfd->sections; s; s = s->next)
490- if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME)
491+ if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
492 {
493 if (!_frvfdpic_check_discarded_relocs (ibfd, s, info, &changed))
494 return FALSE;
495diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c
496index 95d3983..ff1ee70 100644
497--- a/bfd/elf32-h8300.c
498+++ b/bfd/elf32-h8300.c
499@@ -460,7 +460,7 @@ elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
500 unresolved_reloc, warned);
501 }
502
503- if (sec != NULL && elf_discarded_section (sec))
504+ if (sec != NULL && discarded_section (sec))
505 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
506 rel, relend, howto, contents);
507
508diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
509index dcf6df0..044b6fa 100644
510--- a/bfd/elf32-hppa.c
511+++ b/bfd/elf32-hppa.c
512@@ -3741,7 +3741,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
513 hh = hppa_elf_hash_entry (eh);
514 }
515
516- if (sym_sec != NULL && elf_discarded_section (sym_sec))
517+ if (sym_sec != NULL && discarded_section (sym_sec))
518 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
519 rela, relend,
520 elf_hppa_howto_table + r_type,
521diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c
522index 8082927..516511f 100644
523--- a/bfd/elf32-i370.c
524+++ b/bfd/elf32-i370.c
525@@ -1138,7 +1138,7 @@ i370_elf_relocate_section (bfd *output_bfd,
526 }
527 }
528
529- if (sec != NULL && elf_discarded_section (sec))
530+ if (sec != NULL && discarded_section (sec))
531 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
532 rel, relend, howto, contents);
533
534diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
535index d518d01..b925ca6 100644
536--- a/bfd/elf32-i386.c
537+++ b/bfd/elf32-i386.c
538@@ -3178,7 +3178,7 @@ elf_i386_relocate_section (bfd *output_bfd,
539 unresolved_reloc, warned);
540 }
541
542- if (sec != NULL && elf_discarded_section (sec))
543+ if (sec != NULL && discarded_section (sec))
544 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
545 rel, relend, howto, contents);
546
547@@ -4846,7 +4846,7 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
548 + PLT_FDE_START_OFFSET);
549 }
550 if (htab->plt_eh_frame->sec_info_type
551- == ELF_INFO_TYPE_EH_FRAME)
552+ == SEC_INFO_TYPE_EH_FRAME)
553 {
554 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
555 htab->plt_eh_frame,
556diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c
557index 00c8ca7..88f4265 100644
558--- a/bfd/elf32-i860.c
559+++ b/bfd/elf32-i860.c
560@@ -1128,7 +1128,7 @@ elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
561 unresolved_reloc, warned);
562 }
563
564- if (sec != NULL && elf_discarded_section (sec))
565+ if (sec != NULL && discarded_section (sec))
566 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
567 rel, relend, howto, contents);
568
569diff --git a/bfd/elf32-ip2k.c b/bfd/elf32-ip2k.c
570index 0a251b8..43c7b1c 100644
571--- a/bfd/elf32-ip2k.c
572+++ b/bfd/elf32-ip2k.c
573@@ -1436,7 +1436,7 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
574 name = h->root.root.string;
575 }
576
577- if (sec != NULL && elf_discarded_section (sec))
578+ if (sec != NULL && discarded_section (sec))
579 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
580 rel, relend, howto, contents);
581
582diff --git a/bfd/elf32-iq2000.c b/bfd/elf32-iq2000.c
583index 63ef3dc..3954616 100644
584--- a/bfd/elf32-iq2000.c
585+++ b/bfd/elf32-iq2000.c
586@@ -633,7 +633,7 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
587 name = h->root.root.string;
588 }
589
590- if (sec != NULL && elf_discarded_section (sec))
591+ if (sec != NULL && discarded_section (sec))
592 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
593 rel, relend, howto, contents);
594
595diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c
596index 07add20..a2b1003 100644
597--- a/bfd/elf32-lm32.c
598+++ b/bfd/elf32-lm32.c
599@@ -893,7 +893,7 @@ lm32_elf_relocate_section (bfd *output_bfd,
600 name = h->root.root.string;
601 }
602
603- if (sec != NULL && elf_discarded_section (sec))
604+ if (sec != NULL && discarded_section (sec))
605 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
606 rel, relend, howto, contents);
607
608@@ -2372,7 +2372,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
609 /* Don't generate entries for weak symbols. */
610 if (!h || (h && h->root.type != bfd_link_hash_undefweak))
611 {
612- if (!elf_discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
613+ if (!discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
614 {
615 switch (ELF32_R_TYPE (internal_relocs->r_info))
616 {
617@@ -2394,7 +2394,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
618 if (!strcmp (current->name, h->root.root.string))
619 break;
620 }
621- if (!current && !elf_discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
622+ if (!current && !discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
623 {
624 /* Will this have an entry in the GOT. */
625 if (ELF32_R_TYPE (internal_relocs->r_info) == R_LM32_16_GOT)
626diff --git a/bfd/elf32-m32c.c b/bfd/elf32-m32c.c
627index cf7ad99..bcdb55d 100644
628--- a/bfd/elf32-m32c.c
629+++ b/bfd/elf32-m32c.c
630@@ -434,7 +434,7 @@ m32c_elf_relocate_section
631 }
632 }
633
634- if (sec != NULL && elf_discarded_section (sec))
635+ if (sec != NULL && discarded_section (sec))
636 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
637 rel, relend, howto, contents);
638
639diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
640index 51ef61e..b151a8a 100644
641--- a/bfd/elf32-m32r.c
642+++ b/bfd/elf32-m32r.c
643@@ -2616,7 +2616,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
644 }
645 }
646
647- if (sec != NULL && elf_discarded_section (sec))
648+ if (sec != NULL && discarded_section (sec))
649 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
650 rel, relend, howto, contents);
651
652diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c
653index 961dce4..4b9a1c0 100644
654--- a/bfd/elf32-m68hc1x.c
655+++ b/bfd/elf32-m68hc1x.c
656@@ -970,7 +970,7 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
657 is_far = (h && (h->other & STO_M68HC12_FAR));
658 }
659
660- if (sec != NULL && elf_discarded_section (sec))
661+ if (sec != NULL && discarded_section (sec))
662 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
663 rel, relend, howto, contents);
664
665diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
666index 3e9ada9..518a41a 100644
667--- a/bfd/elf32-m68k.c
668+++ b/bfd/elf32-m68k.c
669@@ -3717,7 +3717,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
670 unresolved_reloc, warned);
671 }
672
673- if (sec != NULL && elf_discarded_section (sec))
674+ if (sec != NULL && discarded_section (sec))
675 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
676 rel, relend, howto, contents);
677
678diff --git a/bfd/elf32-mcore.c b/bfd/elf32-mcore.c
679index 31cc095..02aef53 100644
680--- a/bfd/elf32-mcore.c
681+++ b/bfd/elf32-mcore.c
682@@ -466,7 +466,7 @@ mcore_elf_relocate_section (bfd * output_bfd,
683 unresolved_reloc, warned);
684 }
685
686- if (sec != NULL && elf_discarded_section (sec))
687+ if (sec != NULL && discarded_section (sec))
688 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
689 rel, relend, howto, contents);
690
691diff --git a/bfd/elf32-mep.c b/bfd/elf32-mep.c
692index 6fecb25..e5104b3 100644
693--- a/bfd/elf32-mep.c
694+++ b/bfd/elf32-mep.c
695@@ -500,7 +500,7 @@ mep_elf_relocate_section
696 name = h->root.root.string;
697 }
698
699- if (sec != NULL && elf_discarded_section (sec))
700+ if (sec != NULL && discarded_section (sec))
701 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
702 rel, relend, howto, contents);
703
704diff --git a/bfd/elf32-moxie.c b/bfd/elf32-moxie.c
705index 8463599..c340826 100644
706--- a/bfd/elf32-moxie.c
707+++ b/bfd/elf32-moxie.c
708@@ -250,7 +250,7 @@ moxie_elf_relocate_section (bfd *output_bfd,
709 name = h->root.root.string;
710 }
711
712- if (sec != NULL && elf_discarded_section (sec))
713+ if (sec != NULL && discarded_section (sec))
714 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
715 rel, relend, howto, contents);
716
717diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c
718index 9a5fb2a..2fa70d9 100644
719--- a/bfd/elf32-msp430.c
720+++ b/bfd/elf32-msp430.c
721@@ -454,7 +454,7 @@ elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
722 unresolved_reloc, warned);
723 }
724
725- if (sec != NULL && elf_discarded_section (sec))
726+ if (sec != NULL && discarded_section (sec))
727 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
728 rel, relend, howto, contents);
729
730diff --git a/bfd/elf32-mt.c b/bfd/elf32-mt.c
731index 1be5d00..b87995e 100644
732--- a/bfd/elf32-mt.c
733+++ b/bfd/elf32-mt.c
734@@ -354,7 +354,7 @@ mt_elf_relocate_section
735 name = h->root.root.string;
736 }
737
738- if (sec != NULL && elf_discarded_section (sec))
739+ if (sec != NULL && discarded_section (sec))
740 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
741 rel, relend, howto, contents);
742
743diff --git a/bfd/elf32-openrisc.c b/bfd/elf32-openrisc.c
744index ada738e..e441f4d 100644
745--- a/bfd/elf32-openrisc.c
746+++ b/bfd/elf32-openrisc.c
747@@ -373,7 +373,7 @@ openrisc_elf_relocate_section (bfd *output_bfd,
748 unresolved_reloc, warned);
749 }
750
751- if (sec != NULL && elf_discarded_section (sec))
752+ if (sec != NULL && discarded_section (sec))
753 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
754 rel, relend, howto, contents);
755
756diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
757index 574cd98..d3925af 100644
758--- a/bfd/elf32-ppc.c
759+++ b/bfd/elf32-ppc.c
760@@ -6231,7 +6231,7 @@ ppc_elf_relax_section (bfd *abfd,
761 attribute for a code section, and we are only looking at
762 branches. However, implement it correctly here as a
763 reference for other target relax_section functions. */
764- if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
765+ if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
766 {
767 /* At this stage in linking, no SEC_MERGE symbol has been
768 adjusted, so all references to such symbols need to be
769@@ -6886,7 +6886,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
770 sym_name = h->root.root.string;
771 }
772
773- if (sec != NULL && elf_discarded_section (sec))
774+ if (sec != NULL && discarded_section (sec))
775 {
776 /* For relocs against symbols from removed linkonce sections,
777 or sections discarded by a linker script, we just want the
778@@ -9054,7 +9054,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
779 BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
780 == htab->glink_eh_frame->size);
781
782- if (htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
783+ if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
784 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
785 htab->glink_eh_frame,
786 htab->glink_eh_frame->contents))
787diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c
788index f049f6e..32820b4 100644
789--- a/bfd/elf32-rx.c
790+++ b/bfd/elf32-rx.c
791@@ -510,7 +510,7 @@ rx_elf_relocate_section
792 name = h->root.root.string;
793 }
794
795- if (sec != NULL && elf_discarded_section (sec))
796+ if (sec != NULL && discarded_section (sec))
797 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
798 rel, relend, howto, contents);
799
800@@ -1588,7 +1588,7 @@ rx_offset_for_reloc (bfd * abfd,
801 if (ssec)
802 {
803 if ((ssec->flags & SEC_MERGE)
804- && ssec->sec_info_type == ELF_INFO_TYPE_MERGE)
805+ && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
806 symval = _bfd_merged_section_offset (abfd, & ssec,
807 elf_section_data (ssec)->sec_info,
808 symval);
809diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
810index 98437d0..11fb072 100644
811--- a/bfd/elf32-s390.c
812+++ b/bfd/elf32-s390.c
813@@ -2282,7 +2282,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
814 unresolved_reloc, warned);
815 }
816
817- if (sec != NULL && elf_discarded_section (sec))
818+ if (sec != NULL && discarded_section (sec))
819 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
820 rel, relend, howto, contents);
821
822diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c
823index b437624..ef849aa 100644
824--- a/bfd/elf32-score.c
825+++ b/bfd/elf32-score.c
826@@ -2672,7 +2672,7 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd,
827 }
828 }
829
830- if (sec != NULL && elf_discarded_section (sec))
831+ if (sec != NULL && discarded_section (sec))
832 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
833 rel, relend, howto, contents);
834
835diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c
836index 3e98bfc..3d228f3 100644
837--- a/bfd/elf32-score7.c
838+++ b/bfd/elf32-score7.c
839@@ -2443,7 +2443,7 @@ s7_bfd_score_elf_relocate_section (bfd *output_bfd,
840 }
841 }
842
843- if (sec != NULL && elf_discarded_section (sec))
844+ if (sec != NULL && discarded_section (sec))
845 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
846 rel, relend, howto, contents);
847
848diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
849index ca2c4af..e56c3b5 100644
850--- a/bfd/elf32-sh.c
851+++ b/bfd/elf32-sh.c
852@@ -4048,7 +4048,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
853 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
854 input_bfd, input_section, rel->r_offset));
855
856- if (sec != NULL && elf_discarded_section (sec))
857+ if (sec != NULL && discarded_section (sec))
858 /* Handled below. */
859 ;
860 else if (info->relocatable)
861@@ -4236,7 +4236,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
862 }
863 }
864
865- if (sec != NULL && elf_discarded_section (sec))
866+ if (sec != NULL && discarded_section (sec))
867 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
868 rel, relend, howto, contents);
869
870diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
871index ae3ed10..40a9da2 100644
872--- a/bfd/elf32-spu.c
873+++ b/bfd/elf32-spu.c
874@@ -4895,7 +4895,7 @@ spu_elf_relocate_section (bfd *output_bfd,
875 sym_name = h->root.root.string;
876 }
877
878- if (sec != NULL && elf_discarded_section (sec))
879+ if (sec != NULL && discarded_section (sec))
880 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
881 rel, relend, howto, contents);
882
883diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
884index 44042eb..a879d3c 100644
885--- a/bfd/elf32-tic6x.c
886+++ b/bfd/elf32-tic6x.c
887@@ -2334,7 +2334,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
888 unresolved_reloc, warned);
889 }
890
891- if (sec != NULL && elf_discarded_section (sec))
892+ if (sec != NULL && discarded_section (sec))
893 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
894 rel, relend, howto, contents);
895
896diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
897index f2aed9c..a4e565d 100644
898--- a/bfd/elf32-tilepro.c
899+++ b/bfd/elf32-tilepro.c
900@@ -2594,7 +2594,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
901 }
902 }
903
904- if (sec != NULL && elf_discarded_section (sec))
905+ if (sec != NULL && discarded_section (sec))
906 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
907 rel, relend, howto, contents);
908
909diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c
910index 9e6f77d..0fbe080 100644
911--- a/bfd/elf32-v850.c
912+++ b/bfd/elf32-v850.c
913@@ -2093,7 +2093,7 @@ v850_elf_relocate_section (bfd *output_bfd,
914 unresolved_reloc, warned);
915 }
916
917- if (sec != NULL && elf_discarded_section (sec))
918+ if (sec != NULL && discarded_section (sec))
919 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
920 rel, relend, howto, contents);
921
922diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c
923index 643381c..fc3cb7c 100644
924--- a/bfd/elf32-vax.c
925+++ b/bfd/elf32-vax.c
926@@ -1450,7 +1450,7 @@ elf_vax_relocate_section (bfd *output_bfd,
927 relocation = 0;
928 }
929
930- if (sec != NULL && elf_discarded_section (sec))
931+ if (sec != NULL && discarded_section (sec))
932 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
933 rel, relend, howto, contents);
934
935diff --git a/bfd/elf32-xc16x.c b/bfd/elf32-xc16x.c
936index 11d9840..00c7841 100644
937--- a/bfd/elf32-xc16x.c
938+++ b/bfd/elf32-xc16x.c
939@@ -381,7 +381,7 @@ elf32_xc16x_relocate_section (bfd *output_bfd,
940 unresolved_reloc, warned);
941 }
942
943- if (sec != NULL && elf_discarded_section (sec))
944+ if (sec != NULL && discarded_section (sec))
945 {
946 /* For relocs against symbols from removed linkonce sections,
947 or sections discarded by a linker script, we just want the
948diff --git a/bfd/elf32-xstormy16.c b/bfd/elf32-xstormy16.c
949index 6141783..86e1d5b 100644
950--- a/bfd/elf32-xstormy16.c
951+++ b/bfd/elf32-xstormy16.c
952@@ -825,7 +825,7 @@ xstormy16_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNU
953 unresolved_reloc, warned);
954 }
955
956- if (sec != NULL && elf_discarded_section (sec))
957+ if (sec != NULL && discarded_section (sec))
958 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
959 rel, relend, howto, contents);
960
961diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
962index c6e4fb4..5a51eae 100644
963--- a/bfd/elf32-xtensa.c
964+++ b/bfd/elf32-xtensa.c
965@@ -1712,7 +1712,7 @@ elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
966 continue;
967 for (s = abfd->sections; s != NULL; s = s->next)
968 {
969- if (! elf_discarded_section (s)
970+ if (! discarded_section (s)
971 && xtensa_is_littable_section (s)
972 && s != spltlittbl)
973 sgotloc->size += s->size;
974@@ -2656,7 +2656,7 @@ elf_xtensa_relocate_section (bfd *output_bfd,
975 sym_type = h->type;
976 }
977
978- if (sec != NULL && elf_discarded_section (sec))
979+ if (sec != NULL && discarded_section (sec))
980 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
981 rel, relend, howto, contents);
982
983@@ -8960,9 +8960,9 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
984 that here and adjust things accordingly. */
985 if (! elf_xtensa_ignore_discarded_relocs (sec)
986 && elf_xtensa_action_discarded (sec) == PRETEND
987- && sec->sec_info_type != ELF_INFO_TYPE_STABS
988+ && sec->sec_info_type != SEC_INFO_TYPE_STABS
989 && target_sec != NULL
990- && elf_discarded_section (target_sec))
991+ && discarded_section (target_sec))
992 {
993 /* It would be natural to call _bfd_elf_check_kept_section
994 here, but it's not exported from elflink.c. It's also a
995diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
996index 6076709..ddb1cd7 100644
997--- a/bfd/elf64-alpha.c
998+++ b/bfd/elf64-alpha.c
999@@ -4106,7 +4106,7 @@ elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
1000 sec = h->root.u.def.section;
1001 }
1002
1003- if (sec != NULL && elf_discarded_section (sec))
1004+ if (sec != NULL && discarded_section (sec))
1005 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1006 rel, relend,
1007 elf64_alpha_howto_table + r_type,
1008@@ -4263,7 +4263,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1009 unless it has been done already. */
1010 if ((sec->flags & SEC_MERGE)
1011 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
1012- && sec->sec_info_type == ELF_INFO_TYPE_MERGE
1013+ && sec->sec_info_type == SEC_INFO_TYPE_MERGE
1014 && gotent
1015 && !gotent->reloc_xlated)
1016 {
1017@@ -4315,7 +4315,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1018 gotent = h->got_entries;
1019 }
1020
1021- if (sec != NULL && elf_discarded_section (sec))
1022+ if (sec != NULL && discarded_section (sec))
1023 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1024 rel, relend, howto, contents);
1025
1026@@ -4717,7 +4717,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1027
1028 if (r_symndx < symtab_hdr->sh_info
1029 && sec != NULL && howto->pc_relative
1030- && elf_discarded_section (sec))
1031+ && discarded_section (sec))
1032 break;
1033
1034 if (h != NULL)
1035diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
1036index 057a92d..9d2dfcf 100644
1037--- a/bfd/elf64-hppa.c
1038+++ b/bfd/elf64-hppa.c
1039@@ -3919,7 +3919,7 @@ elf64_hppa_relocate_section (bfd *output_bfd,
1040 }
1041 }
1042
1043- if (sym_sec != NULL && elf_discarded_section (sym_sec))
1044+ if (sym_sec != NULL && discarded_section (sym_sec))
1045 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1046 rel, relend, howto, contents);
1047
1048diff --git a/bfd/elf64-mmix.c b/bfd/elf64-mmix.c
1049index ecc9ad0..9cc407f 100644
1050--- a/bfd/elf64-mmix.c
1051+++ b/bfd/elf64-mmix.c
1052@@ -1475,7 +1475,7 @@ mmix_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1053 name = h->root.root.string;
1054 }
1055
1056- if (sec != NULL && elf_discarded_section (sec))
1057+ if (sec != NULL && discarded_section (sec))
1058 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1059 rel, relend, howto, contents);
1060
1061diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
1062index 32a3430..52e9ce9 100644
1063--- a/bfd/elf64-ppc.c
1064+++ b/bfd/elf64-ppc.c
1065@@ -6852,7 +6852,7 @@ adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
1066 if (dsec == NULL)
1067 {
1068 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
1069- if (elf_discarded_section (dsec))
1070+ if (discarded_section (dsec))
1071 {
1072 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
1073 break;
1074@@ -7033,7 +7033,7 @@ ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
1075 if (sec == NULL || sec->size == 0)
1076 continue;
1077
1078- if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
1079+ if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
1080 continue;
1081
1082 if (sec->output_section == bfd_abs_section_ptr)
1083@@ -8077,8 +8077,8 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
1084 toc = bfd_get_section_by_name (ibfd, ".toc");
1085 if (toc == NULL
1086 || toc->size == 0
1087- || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
1088- || elf_discarded_section (toc))
1089+ || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
1090+ || discarded_section (toc))
1091 continue;
1092
1093 toc_relocs = NULL;
1094@@ -8091,7 +8091,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
1095 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
1096 {
1097 if (sec->reloc_count == 0
1098- || !elf_discarded_section (sec)
1099+ || !discarded_section (sec)
1100 || get_opd_info (sec)
1101 || (sec->flags & SEC_ALLOC) == 0
1102 || (sec->flags & SEC_DEBUGGING) != 0)
1103@@ -8201,7 +8201,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
1104 goto error_ret;
1105
1106 if (sym_sec == NULL
1107- || elf_discarded_section (sym_sec))
1108+ || discarded_section (sym_sec))
1109 continue;
1110
1111 if (!SYMBOL_CALLS_LOCAL (info, h))
1112@@ -8281,7 +8281,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
1113 int repeat;
1114
1115 if (sec->reloc_count == 0
1116- || elf_discarded_section (sec)
1117+ || discarded_section (sec)
1118 || get_opd_info (sec)
1119 || (sec->flags & SEC_ALLOC) == 0
1120 || (sec->flags & SEC_DEBUGGING) != 0)
1121@@ -8503,7 +8503,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
1122 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
1123 {
1124 if (sec->reloc_count == 0
1125- || elf_discarded_section (sec))
1126+ || discarded_section (sec))
1127 continue;
1128
1129 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
1130@@ -12036,7 +12036,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
1131 }
1132 h = (struct ppc_link_hash_entry *) h_elf;
1133
1134- if (sec != NULL && elf_discarded_section (sec))
1135+ if (sec != NULL && discarded_section (sec))
1136 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1137 rel, relend,
1138 ppc64_elf_howto_table[r_type],
1139@@ -13865,7 +13865,7 @@ ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
1140
1141
1142 if (htab->glink_eh_frame != NULL
1143- && htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
1144+ && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
1145 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
1146 htab->glink_eh_frame,
1147 htab->glink_eh_frame->contents))
1148diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
1149index 9884da0..e9138a6 100644
1150--- a/bfd/elf64-s390.c
1151+++ b/bfd/elf64-s390.c
1152@@ -2270,7 +2270,7 @@ elf_s390_relocate_section (bfd *output_bfd,
1153 unresolved_reloc, warned);
1154 }
1155
1156- if (sec != NULL && elf_discarded_section (sec))
1157+ if (sec != NULL && discarded_section (sec))
1158 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1159 rel, relend, howto, contents);
1160
1161diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c
1162index bbef2a2..d8f2120 100644
1163--- a/bfd/elf64-sh64.c
1164+++ b/bfd/elf64-sh64.c
1165@@ -1514,7 +1514,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1166 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
1167 input_bfd, input_section, rel->r_offset));
1168
1169- if (sec != NULL && elf_discarded_section (sec))
1170+ if (sec != NULL && discarded_section (sec))
1171 /* Handled below. */
1172 ;
1173 else if (info->relocatable)
1174@@ -1657,7 +1657,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1175 }
1176 }
1177
1178- if (sec != NULL && elf_discarded_section (sec))
1179+ if (sec != NULL && discarded_section (sec))
1180 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1181 rel, relend, howto, contents);
1182
1183diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
1184index bdb3ae6..9d826e7 100644
1185--- a/bfd/elf64-x86-64.c
1186+++ b/bfd/elf64-x86-64.c
1187@@ -3062,7 +3062,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
1188 unresolved_reloc, warned);
1189 }
1190
1191- if (sec != NULL && elf_discarded_section (sec))
1192+ if (sec != NULL && discarded_section (sec))
1193 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1194 rel, relend, howto, contents);
1195
1196@@ -4625,7 +4625,7 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
1197 + PLT_FDE_START_OFFSET);
1198 }
1199 if (htab->plt_eh_frame->sec_info_type
1200- == ELF_INFO_TYPE_EH_FRAME)
1201+ == SEC_INFO_TYPE_EH_FRAME)
1202 {
1203 if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
1204 htab->plt_eh_frame,
1205diff --git a/bfd/elflink.c b/bfd/elflink.c
1206index 8556cec..da6be48 100644
1207--- a/bfd/elflink.c
1208+++ b/bfd/elflink.c
1209@@ -1,6 +1,6 @@
1210 /* ELF linking support for BFD.
1211 Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
1212- 2005, 2006, 2007, 2008, 2009, 2010, 2011
1213+ 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
1214 Free Software Foundation, Inc.
1215
1216 This file is part of BFD, the Binary File Descriptor library.
1217@@ -937,7 +937,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
1218 /* Silently discard TLS symbols from --just-syms. There's no way to
1219 combine a static TLS block with a new TLS block for this executable. */
1220 if (ELF_ST_TYPE (sym->st_info) == STT_TLS
1221- && sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
1222+ && sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
1223 {
1224 *skip = TRUE;
1225 return TRUE;
1226@@ -2708,7 +2708,7 @@ _bfd_elf_link_sec_merge_syms (struct elf_link_hash_entry *h, void *data)
1227 if ((h->root.type == bfd_link_hash_defined
1228 || h->root.type == bfd_link_hash_defweak)
1229 && ((sec = h->root.u.def.section)->flags & SEC_MERGE)
1230- && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
1231+ && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
1232 {
1233 bfd *output_bfd = (bfd *) data;
1234
1235@@ -3499,7 +3499,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
1236 /* ld --just-symbols and dynamic objects don't mix very well.
1237 ld shouldn't allow it. */
1238 if ((s = abfd->sections) != NULL
1239- && s->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
1240+ && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
1241 abort ();
1242
1243 /* If this dynamic lib was specified on the command line with
1244@@ -3896,7 +3896,7 @@ error_free_dyn:
1245 sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1246 if (sec == NULL)
1247 sec = bfd_abs_section_ptr;
1248- else if (elf_discarded_section (sec))
1249+ else if (discarded_section (sec))
1250 {
1251 /* Symbols from discarded section are undefined. We keep
1252 its visibility. */
1253@@ -4861,7 +4861,7 @@ error_free_dyn:
1254 &string_offset))
1255 goto error_return;
1256 if (secdata->sec_info)
1257- stab->sec_info_type = ELF_INFO_TYPE_STABS;
1258+ stab->sec_info_type = SEC_INFO_TYPE_STABS;
1259 }
1260 }
1261 }
1262@@ -6644,25 +6644,14 @@ bfd_elf_size_dynsym_hash_dynstr (bfd *output_bfd, struct bfd_link_info *info)
1263 return TRUE;
1264 }
1265
1266-/* Indicate that we are only retrieving symbol values from this
1267- section. */
1268-
1269-void
1270-_bfd_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
1271-{
1272- if (is_elf_hash_table (info->hash))
1273- sec->sec_info_type = ELF_INFO_TYPE_JUST_SYMS;
1274- _bfd_generic_link_just_syms (sec, info);
1275-}
1276-
1277 /* Make sure sec_info_type is cleared if sec_info is cleared too. */
1278
1279 static void
1280 merge_sections_remove_hook (bfd *abfd ATTRIBUTE_UNUSED,
1281 asection *sec)
1282 {
1283- BFD_ASSERT (sec->sec_info_type == ELF_INFO_TYPE_MERGE);
1284- sec->sec_info_type = ELF_INFO_TYPE_NONE;
1285+ BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_MERGE);
1286+ sec->sec_info_type = SEC_INFO_TYPE_NONE;
1287 }
1288
1289 /* Finish SHF_MERGE section merging. */
1290@@ -6690,7 +6679,7 @@ _bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
1291 sec, &secdata->sec_info))
1292 return FALSE;
1293 else if (secdata->sec_info)
1294- sec->sec_info_type = ELF_INFO_TYPE_MERGE;
1295+ sec->sec_info_type = SEC_INFO_TYPE_MERGE;
1296 }
1297
1298 if (elf_hash_table (info)->merge_info != NULL)
1299@@ -8708,7 +8697,7 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
1300 else if ((h->root.type == bfd_link_hash_defined
1301 || h->root.type == bfd_link_hash_defweak)
1302 && ((finfo->info->strip_discarded
1303- && elf_discarded_section (h->root.u.def.section))
1304+ && discarded_section (h->root.u.def.section))
1305 || (h->root.u.def.section->owner != NULL
1306 && (h->root.u.def.section->owner->flags & BFD_PLUGIN) != 0)))
1307 strip = TRUE;
1308@@ -9007,8 +8996,8 @@ elf_section_ignore_discarded_relocs (asection *sec)
1309
1310 switch (sec->sec_info_type)
1311 {
1312- case ELF_INFO_TYPE_STABS:
1313- case ELF_INFO_TYPE_EH_FRAME:
1314+ case SEC_INFO_TYPE_STABS:
1315+ case SEC_INFO_TYPE_EH_FRAME:
1316 return TRUE;
1317 default:
1318 break;
1319@@ -9193,7 +9182,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
1320 *ppsection = NULL;
1321 continue;
1322 }
1323- else if (isec->sec_info_type == ELF_INFO_TYPE_MERGE
1324+ else if (isec->sec_info_type == SEC_INFO_TYPE_MERGE
1325 && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
1326 isym->st_value =
1327 _bfd_merged_section_offset (output_bfd, &isec,
1328@@ -9537,7 +9526,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
1329 {
1330 /* Complain if the definition comes from a
1331 discarded section. */
1332- if ((sec = *ps) != NULL && elf_discarded_section (sec))
1333+ if ((sec = *ps) != NULL && discarded_section (sec))
1334 {
1335 BFD_ASSERT (r_symndx != STN_UNDEF);
1336 if (action_discarded & COMPLAIN)
1337@@ -9874,19 +9863,19 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
1338 }
1339 else switch (o->sec_info_type)
1340 {
1341- case ELF_INFO_TYPE_STABS:
1342+ case SEC_INFO_TYPE_STABS:
1343 if (! (_bfd_write_section_stabs
1344 (output_bfd,
1345 &elf_hash_table (finfo->info)->stab_info,
1346 o, &elf_section_data (o)->sec_info, contents)))
1347 return FALSE;
1348 break;
1349- case ELF_INFO_TYPE_MERGE:
1350+ case SEC_INFO_TYPE_MERGE:
1351 if (! _bfd_write_merged_section (output_bfd, o,
1352 elf_section_data (o)->sec_info))
1353 return FALSE;
1354 break;
1355- case ELF_INFO_TYPE_EH_FRAME:
1356+ case SEC_INFO_TYPE_EH_FRAME:
1357 {
1358 if (! _bfd_elf_write_section_eh_frame (output_bfd, finfo->info,
1359 o, contents))
1360@@ -12415,7 +12404,7 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
1361
1362 if ((h->root.type == bfd_link_hash_defined
1363 || h->root.type == bfd_link_hash_defweak)
1364- && elf_discarded_section (h->root.u.def.section))
1365+ && discarded_section (h->root.u.def.section))
1366 return TRUE;
1367 else
1368 return FALSE;
1369@@ -12431,7 +12420,7 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
1370 /* Need to: get the symbol; get the section. */
1371 isym = &rcookie->locsyms[r_symndx];
1372 isec = bfd_section_from_elf_index (rcookie->abfd, isym->st_shndx);
1373- if (isec != NULL && elf_discarded_section (isec))
1374+ if (isec != NULL && discarded_section (isec))
1375 return TRUE;
1376 }
1377 return FALSE;
1378@@ -12482,7 +12471,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
1379 if (stab != NULL
1380 && (stab->size == 0
1381 || bfd_is_abs_section (stab->output_section)
1382- || stab->sec_info_type != ELF_INFO_TYPE_STABS))
1383+ || stab->sec_info_type != SEC_INFO_TYPE_STABS))
1384 stab = NULL;
1385
1386 if (stab == NULL
1387diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
1388index 3e2ee0b..0f6b720 100644
1389--- a/bfd/elfnn-ia64.c
1390+++ b/bfd/elfnn-ia64.c
1391@@ -530,7 +530,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
1392 symtype = h->type;
1393 }
1394
1395- if (tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
1396+ if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
1397 {
1398 /* At this stage in linking, no SEC_MERGE symbol has been
1399 adjusted, so all references to such symbols need to be
1400@@ -3861,7 +3861,7 @@ elfNN_ia64_relocate_section (bfd *output_bfd,
1401 if (!info->relocatable
1402 && (sym_sec->flags & SEC_MERGE) != 0
1403 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
1404- && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
1405+ && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
1406 {
1407 struct elfNN_ia64_local_hash_entry *loc_h;
1408
1409@@ -3919,7 +3919,7 @@ elfNN_ia64_relocate_section (bfd *output_bfd,
1410 continue;
1411 }
1412
1413- if (sym_sec != NULL && elf_discarded_section (sym_sec))
1414+ if (sym_sec != NULL && discarded_section (sym_sec))
1415 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1416 rel, relend, howto, contents);
1417
1418diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
1419index fa906cd..7911050 100644
1420--- a/bfd/elfxx-mips.c
1421+++ b/bfd/elfxx-mips.c
1422@@ -9385,7 +9385,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1423 sec = h->root.u.def.section;
1424 }
1425
1426- if (sec != NULL && elf_discarded_section (sec))
1427+ if (sec != NULL && discarded_section (sec))
1428 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1429 rel, relend, howto, contents);
1430
1431diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
1432index 9a15124..f3c631e 100644
1433--- a/bfd/elfxx-sparc.c
1434+++ b/bfd/elfxx-sparc.c
1435@@ -2970,7 +2970,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
1436 }
1437 }
1438
1439- if (sec != NULL && elf_discarded_section (sec))
1440+ if (sec != NULL && discarded_section (sec))
1441 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1442 rel, relend, howto, contents);
1443
1444diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c
1445index c484562..e1c8946 100644
1446--- a/bfd/elfxx-tilegx.c
1447+++ b/bfd/elfxx-tilegx.c
1448@@ -2908,7 +2908,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
1449 }
1450 }
1451
1452- if (sec != NULL && elf_discarded_section (sec))
1453+ if (sec != NULL && discarded_section (sec))
1454 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1455 rel, relend, howto, contents);
1456
1457diff --git a/bfd/linker.c b/bfd/linker.c
1458index 7a01e11..e5d20b2 100644
1459--- a/bfd/linker.c
1460+++ b/bfd/linker.c
1461@@ -1,6 +1,6 @@
1462 /* linker.c -- BFD linker routines
1463 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
1464- 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
1465+ 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
1466 Free Software Foundation, Inc.
1467 Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support
1468
1469@@ -810,6 +810,7 @@ void
1470 _bfd_generic_link_just_syms (asection *sec,
1471 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1472 {
1473+ sec->sec_info_type = SEC_INFO_TYPE_JUST_SYMS;
1474 sec->output_section = bfd_abs_section_ptr;
1475 sec->output_offset = sec->vma;
1476 }
1477diff --git a/bfd/reloc.c b/bfd/reloc.c
1478index ef55cc3..e3f0343 100644
1479--- a/bfd/reloc.c
1480+++ b/bfd/reloc.c
1481@@ -6235,7 +6235,7 @@ bfd_generic_get_relocated_section_contents (bfd *abfd,
1482 bfd_reloc_status_type r;
1483
1484 symbol = *(*parent)->sym_ptr_ptr;
1485- if (symbol->section && elf_discarded_section (symbol->section))
1486+ if (symbol->section && discarded_section (symbol->section))
1487 {
1488 bfd_byte *p;
1489 static reloc_howto_type none_howto
1490diff --git a/bfd/section.c b/bfd/section.c
1491index 7c1f750..e60f247 100644
1492--- a/bfd/section.c
1493+++ b/bfd/section.c
1494@@ -382,11 +382,11 @@ CODE_FRAGMENT
1495 .
1496 . {* Type of sec_info information. *}
1497 . unsigned int sec_info_type:3;
1498-.#define ELF_INFO_TYPE_NONE 0
1499-.#define ELF_INFO_TYPE_STABS 1
1500-.#define ELF_INFO_TYPE_MERGE 2
1501-.#define ELF_INFO_TYPE_EH_FRAME 3
1502-.#define ELF_INFO_TYPE_JUST_SYMS 4
1503+.#define SEC_INFO_TYPE_NONE 0
1504+.#define SEC_INFO_TYPE_STABS 1
1505+.#define SEC_INFO_TYPE_MERGE 2
1506+.#define SEC_INFO_TYPE_EH_FRAME 3
1507+.#define SEC_INFO_TYPE_JUST_SYMS 4
1508 .
1509 . {* Nonzero if this section uses RELA relocations, rather than REL. *}
1510 . unsigned int use_rela_p:1;
1511diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
1512index d29da59..7631474 100644
1513--- a/ld/emultempl/armelf.em
1514+++ b/ld/emultempl/armelf.em
1515@@ -240,7 +240,7 @@ build_section_lists (lang_statement_union_type *statement)
1516 {
1517 asection *i = statement->input_section.section;
1518
1519- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1520+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1521 && (i->flags & SEC_EXCLUDE) == 0
1522 && i->output_section != NULL
1523 && i->output_section->owner == link_info.output_bfd)
1524@@ -299,7 +299,7 @@ gld${EMULATION_NAME}_after_allocation (void)
1525 && elf_section_type (sec) == SHT_PROGBITS
1526 && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
1527 && (sec->flags & SEC_EXCLUDE) == 0
1528- && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS
1529+ && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1530 && out_sec != bfd_abs_section_ptr)
1531 {
1532 if (sec_count == list_size)
1533diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
1534index 1137ba2..6258bf4 100644
1535--- a/ld/emultempl/hppaelf.em
1536+++ b/ld/emultempl/hppaelf.em
1537@@ -229,7 +229,7 @@ build_section_lists (lang_statement_union_type *statement)
1538 {
1539 asection *i = statement->input_section.section;
1540
1541- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1542+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1543 && (i->flags & SEC_EXCLUDE) == 0
1544 && i->output_section != NULL
1545 && i->output_section->owner == link_info.output_bfd)
1546diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
1547index 92a468f..52b9f05 100644
1548--- a/ld/emultempl/ppc64elf.em
1549+++ b/ld/emultempl/ppc64elf.em
1550@@ -428,7 +428,7 @@ build_toc_list (lang_statement_union_type *statement)
1551 {
1552 asection *i = statement->input_section.section;
1553
1554- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1555+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1556 && (i->flags & SEC_EXCLUDE) == 0
1557 && i->output_section == toc_section)
1558 {
1559@@ -446,7 +446,7 @@ build_section_lists (lang_statement_union_type *statement)
1560 {
1561 asection *i = statement->input_section.section;
1562
1563- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1564+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1565 && (i->flags & SEC_EXCLUDE) == 0
1566 && i->output_section != NULL
1567 && i->output_section->owner == link_info.output_bfd)
1568diff --git a/ld/emultempl/tic6xdsbt.em b/ld/emultempl/tic6xdsbt.em
1569index e287005..fd7a12b 100644
1570--- a/ld/emultempl/tic6xdsbt.em
1571+++ b/ld/emultempl/tic6xdsbt.em
1572@@ -122,7 +122,7 @@ gld${EMULATION_NAME}_after_allocation (void)
1573 && elf_section_type (sec) == SHT_PROGBITS
1574 && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
1575 && (sec->flags & SEC_EXCLUDE) == 0
1576- && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS
1577+ && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1578 && out_sec != bfd_abs_section_ptr)
1579 {
1580 if (sec_count == list_size)
1581diff --git a/ld/ldlang.c b/ld/ldlang.c
1582index 2c56b56..7ecbae2 100644
1583--- a/ld/ldlang.c
1584+++ b/ld/ldlang.c
1585@@ -4648,7 +4648,7 @@ size_input_section
1586 lang_input_section_type *is = &((*this_ptr)->input_section);
1587 asection *i = is->section;
1588
1589- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1590+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1591 && (i->flags & SEC_EXCLUDE) == 0)
1592 {
1593 unsigned int alignment_needed;
1594diff --git a/ld/ldwrite.c b/ld/ldwrite.c
1595index b7a1469..2503d1f 100644
1596--- a/ld/ldwrite.c
1597+++ b/ld/ldwrite.c
1598@@ -1,6 +1,6 @@
1599 /* ldwrite.c -- write out the linked file
1600 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
1601- 2003, 2004, 2005, 2006, 2007, 2008, 2010
1602+ 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2012
1603 Free Software Foundation, Inc.
1604 Written by Steve Chamberlain sac@cygnus.com
1605
1606@@ -240,7 +240,7 @@ build_link_order (lang_statement_union_type *statement)
1607 attached */
1608 asection *i = statement->input_section.section;
1609
1610- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
1611+ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
1612 && (i->flags & SEC_EXCLUDE) == 0)
1613 {
1614 asection *output_section = i->output_section;
1615--
16161.7.9.5
1617