elfxx-tilegx.c revision 1.1.1.4.2.2 1 /* TILE-Gx-specific support for ELF.
2 Copyright (C) 2011-2020 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/tilegx.h"
26 #include "opcode/tilegx.h"
27 #include "libiberty.h"
28 #include "elfxx-tilegx.h"
29
30 #define ABI_64_P(abfd) \
31 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
32
33 #define TILEGX_ELF_WORD_BYTES(htab) \
34 ((htab)->bytes_per_word)
35
36 /* The size of an external RELA relocation. */
37 #define TILEGX_ELF_RELA_BYTES(htab) \
38 ((htab)->bytes_per_rela)
39
40 /* Both 32-bit and 64-bit tilegx encode this in an identical manner,
41 so just take advantage of that. */
42 #define TILEGX_ELF_R_TYPE(r_info) \
43 ((r_info) & 0xFF)
44
45 #define TILEGX_ELF_R_INFO(htab, in_rel, index, type) \
46 ((htab)->r_info (in_rel, index, type))
47
48 #define TILEGX_ELF_R_SYMNDX(htab, r_info) \
49 ((htab)->r_symndx(r_info))
50
51 #define TILEGX_ELF_DTPOFF_RELOC(htab) \
52 ((htab)->dtpoff_reloc)
53
54 #define TILEGX_ELF_DTPMOD_RELOC(htab) \
55 ((htab)->dtpmod_reloc)
56
57 #define TILEGX_ELF_TPOFF_RELOC(htab) \
58 ((htab)->tpoff_reloc)
59
60 #define TILEGX_ELF_PUT_WORD(htab, bfd, val, ptr) \
61 ((htab)->put_word (bfd, val, ptr))
62
63 /* The name of the dynamic interpreter. This is put in the .interp
64 section. */
65
66 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
67 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
68
69
70 static reloc_howto_type tilegx_elf_howto_table [] =
71 {
72 /* This reloc does nothing. */
73 HOWTO (R_TILEGX_NONE, /* type */
74 0, /* rightshift */
75 3, /* size (0 = byte, 1 = short, 2 = long) */
76 0, /* bitsize */
77 FALSE, /* pc_relative */
78 0, /* bitpos */
79 complain_overflow_dont, /* complain_on_overflow */
80 bfd_elf_generic_reloc, /* special_function */
81 "R_TILEGX_NONE", /* name */
82 FALSE, /* partial_inplace */
83 0, /* src_mask */
84 0, /* dst_mask */
85 FALSE), /* pcrel_offset */
86 #ifdef BFD64
87 /* A 64 bit absolute relocation. */
88 HOWTO (R_TILEGX_64, /* type */
89 0, /* rightshift */
90 4, /* size (0 = byte, 1 = short, 2 = long) */
91 64, /* bitsize */
92 FALSE, /* pc_relative */
93 0, /* bitpos */
94 complain_overflow_dont, /* complain_on_overflow */
95 bfd_elf_generic_reloc, /* special_function */
96 "R_TILEGX_64", /* name */
97 FALSE, /* partial_inplace */
98 0, /* src_mask */
99 0xffffffffffffffffULL, /* dst_mask */
100 FALSE), /* pcrel_offset */
101 #endif
102 /* A 32 bit absolute relocation. */
103 HOWTO (R_TILEGX_32, /* type */
104 0, /* rightshift */
105 2, /* size (0 = byte, 1 = short, 2 = long) */
106 32, /* bitsize */
107 FALSE, /* pc_relative */
108 0, /* bitpos */
109 complain_overflow_dont, /* complain_on_overflow */
110 bfd_elf_generic_reloc, /* special_function */
111 "R_TILEGX_32", /* name */
112 FALSE, /* partial_inplace */
113 0, /* src_mask */
114 0xffffffff, /* dst_mask */
115 FALSE), /* pcrel_offset */
116
117 /* A 16 bit absolute relocation. */
118 HOWTO (R_TILEGX_16, /* type */
119 0, /* rightshift */
120 1, /* size (0 = byte, 1 = short, 2 = long) */
121 16, /* bitsize */
122 FALSE, /* pc_relative */
123 0, /* bitpos */
124 complain_overflow_bitfield, /* complain_on_overflow */
125 bfd_elf_generic_reloc, /* special_function */
126 "R_TILEGX_16", /* name */
127 FALSE, /* partial_inplace */
128 0, /* src_mask */
129 0xffff, /* dst_mask */
130 FALSE), /* pcrel_offset */
131
132 /* An 8 bit absolute relocation. */
133 HOWTO (R_TILEGX_8, /* type */
134 0, /* rightshift */
135 0, /* size (0 = byte, 1 = short, 2 = long) */
136 8, /* bitsize */
137 FALSE, /* pc_relative */
138 0, /* bitpos */
139 complain_overflow_unsigned, /* complain_on_overflow */
140 bfd_elf_generic_reloc, /* special_function */
141 "R_TILEGX_8", /* name */
142 FALSE, /* partial_inplace */
143 0, /* src_mask */
144 0xff, /* dst_mask */
145 FALSE), /* pcrel_offset */
146 #ifdef BFD64
147 /* A 64 bit pc-relative relocation. */
148 HOWTO (R_TILEGX_64_PCREL,/* type */
149 0, /* rightshift */
150 4, /* size (0 = byte, 1 = short, 2 = long) */
151 64, /* bitsize */
152 TRUE, /* pc_relative */
153 0, /* bitpos */
154 complain_overflow_dont, /* complain_on_overflow */
155 bfd_elf_generic_reloc, /* special_function */
156 "R_TILEGX_32_PCREL", /* name */
157 FALSE, /* partial_inplace */
158 0, /* src_mask */
159 0xffffffffffffffffULL, /* dst_mask */
160 TRUE), /* pcrel_offset */
161 #endif
162 /* A 32 bit pc-relative relocation. */
163 HOWTO (R_TILEGX_32_PCREL,/* type */
164 0, /* rightshift */
165 2, /* size (0 = byte, 1 = short, 2 = long) */
166 32, /* bitsize */
167 TRUE, /* pc_relative */
168 0, /* bitpos */
169 complain_overflow_dont, /* complain_on_overflow */
170 bfd_elf_generic_reloc, /* special_function */
171 "R_TILEGX_32_PCREL", /* name */
172 FALSE, /* partial_inplace */
173 0, /* src_mask */
174 0xffffffff, /* dst_mask */
175 TRUE), /* pcrel_offset */
176
177 /* A 16 bit pc-relative relocation. */
178 HOWTO (R_TILEGX_16_PCREL,/* type */
179 0, /* rightshift */
180 1, /* size (0 = byte, 1 = short, 2 = long) */
181 16, /* bitsize */
182 TRUE, /* pc_relative */
183 0, /* bitpos */
184 complain_overflow_signed, /* complain_on_overflow */
185 bfd_elf_generic_reloc, /* special_function */
186 "R_TILEGX_16_PCREL", /* name */
187 FALSE, /* partial_inplace */
188 0, /* src_mask */
189 0xffff, /* dst_mask */
190 TRUE), /* pcrel_offset */
191
192 /* An 8 bit pc-relative relocation. */
193 HOWTO (R_TILEGX_8_PCREL, /* type */
194 0, /* rightshift */
195 0, /* size (0 = byte, 1 = short, 2 = long) */
196 8, /* bitsize */
197 TRUE, /* pc_relative */
198 0, /* bitpos */
199 complain_overflow_signed, /* complain_on_overflow */
200 bfd_elf_generic_reloc, /* special_function */
201 "R_TILEGX_8_PCREL",/* name */
202 FALSE, /* partial_inplace */
203 0, /* src_mask */
204 0xff, /* dst_mask */
205 TRUE), /* pcrel_offset */
206
207 /* A 16 bit relocation without overflow. */
208 HOWTO (R_TILEGX_HW0, /* type */
209 0, /* rightshift */
210 1, /* size (0 = byte, 1 = short, 2 = long) */
211 16, /* bitsize */
212 FALSE, /* pc_relative */
213 0, /* bitpos */
214 complain_overflow_dont,/* complain_on_overflow */
215 bfd_elf_generic_reloc, /* special_function */
216 "R_TILEGX_HW0", /* name */
217 FALSE, /* partial_inplace */
218 0, /* src_mask */
219 0xffff, /* dst_mask */
220 FALSE), /* pcrel_offset */
221
222 /* A 16 bit relocation without overflow. */
223 HOWTO (R_TILEGX_HW1, /* type */
224 16, /* rightshift */
225 1, /* size (0 = byte, 1 = short, 2 = long) */
226 16, /* bitsize */
227 FALSE, /* pc_relative */
228 0, /* bitpos */
229 complain_overflow_dont,/* complain_on_overflow */
230 bfd_elf_generic_reloc, /* special_function */
231 "R_TILEGX_HW1", /* name */
232 FALSE, /* partial_inplace */
233 0, /* src_mask */
234 0xffff, /* dst_mask */
235 FALSE), /* pcrel_offset */
236
237 /* A 16 bit relocation without overflow. */
238 HOWTO (R_TILEGX_HW2, /* type */
239 32, /* rightshift */
240 1, /* size (0 = byte, 1 = short, 2 = long) */
241 16, /* bitsize */
242 FALSE, /* pc_relative */
243 0, /* bitpos */
244 complain_overflow_dont,/* complain_on_overflow */
245 bfd_elf_generic_reloc, /* special_function */
246 "R_TILEGX_HW2", /* name */
247 FALSE, /* partial_inplace */
248 0, /* src_mask */
249 0xffff, /* dst_mask */
250 FALSE), /* pcrel_offset */
251
252 /* A 16 bit relocation without overflow. */
253 HOWTO (R_TILEGX_HW3, /* type */
254 48, /* rightshift */
255 1, /* size (0 = byte, 1 = short, 2 = long) */
256 16, /* bitsize */
257 FALSE, /* pc_relative */
258 0, /* bitpos */
259 complain_overflow_dont,/* complain_on_overflow */
260 bfd_elf_generic_reloc, /* special_function */
261 "R_TILEGX_HW3", /* name */
262 FALSE, /* partial_inplace */
263 0, /* src_mask */
264 0xffff, /* dst_mask */
265 FALSE), /* pcrel_offset */
266
267 /* A 16 bit relocation with overflow. */
268 HOWTO (R_TILEGX_HW0_LAST, /* type */
269 0, /* rightshift */
270 1, /* size (0 = byte, 1 = short, 2 = long) */
271 16, /* bitsize */
272 FALSE, /* pc_relative */
273 0, /* bitpos */
274 complain_overflow_signed,/* complain_on_overflow */
275 bfd_elf_generic_reloc, /* special_function */
276 "R_TILEGX_HW0_LAST", /* name */
277 FALSE, /* partial_inplace */
278 0, /* src_mask */
279 0xffff, /* dst_mask */
280 FALSE), /* pcrel_offset */
281
282 /* A 16 bit relocation with overflow. */
283 HOWTO (R_TILEGX_HW1_LAST, /* type */
284 16, /* rightshift */
285 1, /* size (0 = byte, 1 = short, 2 = long) */
286 16, /* bitsize */
287 FALSE, /* pc_relative */
288 0, /* bitpos */
289 complain_overflow_signed,/* complain_on_overflow */
290 bfd_elf_generic_reloc, /* special_function */
291 "R_TILEGX_HW1_LAST", /* name */
292 FALSE, /* partial_inplace */
293 0, /* src_mask */
294 0xffff, /* dst_mask */
295 FALSE), /* pcrel_offset */
296
297 /* A 16 bit relocation with overflow. */
298 HOWTO (R_TILEGX_HW2_LAST, /* type */
299 32, /* rightshift */
300 1, /* size (0 = byte, 1 = short, 2 = long) */
301 16, /* bitsize */
302 FALSE, /* pc_relative */
303 0, /* bitpos */
304 complain_overflow_signed,/* complain_on_overflow */
305 bfd_elf_generic_reloc, /* special_function */
306 "R_TILEGX_HW2_LAST", /* name */
307 FALSE, /* partial_inplace */
308 0, /* src_mask */
309 0xffff, /* dst_mask */
310 FALSE), /* pcrel_offset */
311
312 HOWTO (R_TILEGX_COPY, /* type */
313 0, /* rightshift */
314 0, /* size (0 = byte, 1 = short, 2 = long) */
315 0, /* bitsize */
316 FALSE, /* pc_relative */
317 0, /* bitpos */
318 complain_overflow_dont, /* complain_on_overflow */
319 bfd_elf_generic_reloc, /* special_function */
320 "R_TILEGX_COPY", /* name */
321 FALSE, /* partial_inplace */
322 0, /* src_mask */
323 0, /* dst_mask */
324 TRUE), /* pcrel_offset */
325
326 HOWTO (R_TILEGX_GLOB_DAT, /* type */
327 0, /* rightshift */
328 0, /* size (0 = byte, 1 = short, 2 = long) */
329 0, /* bitsize */
330 FALSE, /* pc_relative */
331 0, /* bitpos */
332 complain_overflow_dont, /* complain_on_overflow */
333 bfd_elf_generic_reloc, /* special_function */
334 "R_TILEGX_GLOB_DAT", /* name */
335 FALSE, /* partial_inplace */
336 0, /* src_mask */
337 0, /* dst_mask */
338 TRUE), /* pcrel_offset */
339
340 HOWTO (R_TILEGX_JMP_SLOT, /* type */
341 0, /* rightshift */
342 0, /* size (0 = byte, 1 = short, 2 = long) */
343 0, /* bitsize */
344 FALSE, /* pc_relative */
345 0, /* bitpos */
346 complain_overflow_dont, /* complain_on_overflow */
347 bfd_elf_generic_reloc, /* special_function */
348 "R_TILEGX_JMP_SLOT", /* name */
349 FALSE, /* partial_inplace */
350 0, /* src_mask */
351 0, /* dst_mask */
352 TRUE), /* pcrel_offset */
353
354 HOWTO (R_TILEGX_RELATIVE, /* type */
355 0, /* rightshift */
356 0, /* size (0 = byte, 1 = short, 2 = long) */
357 0, /* bitsize */
358 FALSE, /* pc_relative */
359 0, /* bitpos */
360 complain_overflow_dont, /* complain_on_overflow */
361 bfd_elf_generic_reloc, /* special_function */
362 "R_TILEGX_RELATIVE", /* name */
363 FALSE, /* partial_inplace */
364 0, /* src_mask */
365 0, /* dst_mask */
366 TRUE), /* pcrel_offset */
367
368 HOWTO (R_TILEGX_BROFF_X1, /* type */
369 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
370 2, /* size (0 = byte, 1 = short, 2 = long) */
371 17, /* bitsize */
372 TRUE, /* pc_relative */
373 0, /* bitpos */
374 complain_overflow_signed, /* complain_on_overflow */
375 bfd_elf_generic_reloc, /* special_function */
376 "R_TILEGX_BROFF_X1", /* name */
377 FALSE, /* partial_inplace */
378 0, /* src_mask */
379 -1, /* dst_mask */
380 TRUE), /* pcrel_offset */
381
382 HOWTO (R_TILEGX_JUMPOFF_X1, /* type */
383 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
385 27, /* bitsize */
386 TRUE, /* pc_relative */
387 0, /* bitpos */
388 complain_overflow_signed,/* complain_on_overflow */
389 bfd_elf_generic_reloc, /* special_function */
390 "R_TILEGX_JUMPOFF_X1", /* name */
391 FALSE, /* partial_inplace */
392 0, /* src_mask */
393 -1, /* dst_mask */
394 TRUE), /* pcrel_offset */
395
396 HOWTO (R_TILEGX_JUMPOFF_X1_PLT, /* type */
397 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
398 2, /* size (0 = byte, 1 = short, 2 = long) */
399 27, /* bitsize */
400 TRUE, /* pc_relative */
401 0, /* bitpos */
402 complain_overflow_signed,/* complain_on_overflow */
403 bfd_elf_generic_reloc, /* special_function */
404 "R_TILEGX_JUMPOFF_X1_PLT", /* name */
405 FALSE, /* partial_inplace */
406 0, /* src_mask */
407 -1, /* dst_mask */
408 TRUE), /* pcrel_offset */
409
410 #define TILEGX_IMM_HOWTO(name, size, bitsize) \
411 HOWTO (name, 0, size, bitsize, FALSE, 0, \
412 complain_overflow_signed, bfd_elf_generic_reloc, \
413 #name, FALSE, 0, -1, FALSE)
414
415 #define TILEGX_UIMM_HOWTO(name, size, bitsize) \
416 HOWTO (name, 0, size, bitsize, FALSE, 0, \
417 complain_overflow_unsigned, bfd_elf_generic_reloc, \
418 #name, FALSE, 0, -1, FALSE)
419
420 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0, 0, 8),
421 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0, 0, 8),
422 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1, 0, 8),
423 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1, 0, 8),
424 TILEGX_IMM_HOWTO(R_TILEGX_DEST_IMM8_X1, 0, 8),
425
426 TILEGX_UIMM_HOWTO(R_TILEGX_MT_IMM14_X1, 1, 14),
427 TILEGX_UIMM_HOWTO(R_TILEGX_MF_IMM14_X1, 1, 14),
428
429 TILEGX_UIMM_HOWTO(R_TILEGX_MMSTART_X0, 0, 6),
430 TILEGX_UIMM_HOWTO(R_TILEGX_MMEND_X0, 0, 6),
431
432 TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_X0, 0, 6),
433 TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_X1, 0, 6),
434 TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_Y0, 0, 6),
435 TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_Y1, 0, 6),
436
437 #define TILEGX_IMM16_HOWTO(name, rshift) \
438 HOWTO (name, rshift, 1, 16, FALSE, 0, \
439 complain_overflow_dont, bfd_elf_generic_reloc, \
440 #name, FALSE, 0, 0xffff, FALSE)
441
442 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0, 0),
443 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0, 0),
444 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW1, 16),
445 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW1, 16),
446 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW2, 32),
447 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW2, 32),
448 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW3, 48),
449 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW3, 48),
450
451 #define TILEGX_IMM16_HOWTO_LAST(name, rshift) \
452 HOWTO (name, rshift, 1, 16, FALSE, 0, \
453 complain_overflow_signed, bfd_elf_generic_reloc, \
454 #name, FALSE, 0, 0xffff, FALSE)
455
456 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST, 0),
457 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST, 0),
458 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST, 16),
459 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST, 16),
460 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW2_LAST, 32),
461 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW2_LAST, 32),
462
463 /* PC-relative offsets. */
464
465 #define TILEGX_IMM16_HOWTO_PCREL(name, rshift) \
466 HOWTO (name, rshift, 1, 16, TRUE, 0, \
467 complain_overflow_dont, bfd_elf_generic_reloc, \
468 #name, FALSE, 0, 0xffff, TRUE)
469
470 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW0_PCREL, 0),
471 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW0_PCREL, 0),
472 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW1_PCREL, 16),
473 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW1_PCREL, 16),
474 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW2_PCREL, 32),
475 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW2_PCREL, 32),
476 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW3_PCREL, 48),
477 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW3_PCREL, 48),
478
479 #define TILEGX_IMM16_HOWTO_LAST_PCREL(name, rshift) \
480 HOWTO (name, rshift, 1, 16, TRUE, 0, \
481 complain_overflow_signed, bfd_elf_generic_reloc, \
482 #name, FALSE, 0, 0xffff, TRUE)
483
484 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 0),
485 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 0),
486 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 16),
487 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 16),
488 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 32),
489 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 32),
490
491 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_GOT, 0),
492 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_GOT, 0),
493
494 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW0_PLT_PCREL, 0),
495 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW0_PLT_PCREL, 0),
496 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW1_PLT_PCREL, 16),
497 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW1_PLT_PCREL, 16),
498 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW2_PLT_PCREL, 32),
499 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW2_PLT_PCREL, 32),
500
501 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 0),
502 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 0),
503 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 16),
504 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 16),
505
506 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW3_PLT_PCREL, 48),
507 TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW3_PLT_PCREL, 48),
508
509 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_GD, 0),
510 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_GD, 0),
511
512 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_LE, 0),
513 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_LE, 0),
514 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 0),
515 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 0),
516 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 16),
517 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 16),
518
519 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 0),
520 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 0),
521 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 16),
522 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 16),
523 EMPTY_HOWTO (90),
524 EMPTY_HOWTO (91),
525
526 #define TILEGX_IMM16_HOWTO_TLS_IE(name, rshift) \
527 HOWTO (name, rshift, 1, 16, FALSE, 0, \
528 complain_overflow_dont, bfd_elf_generic_reloc, \
529 #name, FALSE, 0, 0xffff, TRUE)
530
531 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW0_TLS_IE, 0),
532 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW0_TLS_IE, 0),
533
534 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL, 0),
535 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL, 0),
536 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL, 16),
537 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL, 16),
538 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL, 32),
539 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL, 32),
540
541 #define TILEGX_IMM16_HOWTO_LAST_TLS_IE(name, rshift) \
542 HOWTO (name, rshift, 1, 16, FALSE, 0, \
543 complain_overflow_signed, bfd_elf_generic_reloc, \
544 #name, FALSE, 0, 0xffff, TRUE)
545
546 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 0),
547 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 0),
548 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 16),
549 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 16),
550 EMPTY_HOWTO (104),
551 EMPTY_HOWTO (105),
552
553 HOWTO(R_TILEGX_TLS_DTPMOD64, 0, 0, 0, FALSE, 0, complain_overflow_dont,
554 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64",
555 FALSE, 0, 0, TRUE),
556 HOWTO(R_TILEGX_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
557 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64",
558 FALSE, 0, -1, TRUE),
559 HOWTO(R_TILEGX_TLS_TPOFF64, 0, 0, 0, FALSE, 0, complain_overflow_dont,
560 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64",
561 FALSE, 0, 0, TRUE),
562
563 HOWTO(R_TILEGX_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
564 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32",
565 FALSE, 0, 0, TRUE),
566 HOWTO(R_TILEGX_TLS_DTPOFF32, 0, 4, 32, FALSE, 0, complain_overflow_bitfield,
567 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32",
568 FALSE, 0, -1, TRUE),
569 HOWTO(R_TILEGX_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
570 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32",
571 FALSE, 0, 0, TRUE),
572
573 HOWTO (R_TILEGX_TLS_GD_CALL, /* type */
574 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
575 2, /* size (0 = byte, 1 = short, 2 = long) */
576 27, /* bitsize */
577 TRUE, /* pc_relative */
578 0, /* bitpos */
579 complain_overflow_signed,/* complain_on_overflow */
580 bfd_elf_generic_reloc, /* special_function */
581 "R_TILEGX_TLS_GD_CALL", /* name */
582 FALSE, /* partial_inplace */
583 0, /* src_mask */
584 -1, /* dst_mask */
585 TRUE), /* pcrel_offset */
586
587 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_GD_ADD, 0, 8),
588 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_GD_ADD, 0, 8),
589 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_GD_ADD, 0, 8),
590 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_GD_ADD, 0, 8),
591 TILEGX_IMM_HOWTO(R_TILEGX_TLS_IE_LOAD, 0, 8),
592 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_ADD, 0, 8),
593 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_ADD, 0, 8),
594 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_ADD, 0, 8),
595 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_ADD, 0, 8),
596 };
597
598 static reloc_howto_type tilegx_elf_howto_table2 [] =
599 {
600 /* GNU extension to record C++ vtable hierarchy */
601 HOWTO (R_TILEGX_GNU_VTINHERIT, /* type */
602 0, /* rightshift */
603 4, /* size (0 = byte, 1 = short, 2 = long) */
604 0, /* bitsize */
605 FALSE, /* pc_relative */
606 0, /* bitpos */
607 complain_overflow_dont, /* complain_on_overflow */
608 NULL, /* special_function */
609 "R_TILEGX_GNU_VTINHERIT", /* name */
610 FALSE, /* partial_inplace */
611 0, /* src_mask */
612 0, /* dst_mask */
613 FALSE), /* pcrel_offset */
614
615 /* GNU extension to record C++ vtable member usage */
616 HOWTO (R_TILEGX_GNU_VTENTRY, /* type */
617 0, /* rightshift */
618 4, /* size (0 = byte, 1 = short, 2 = long) */
619 0, /* bitsize */
620 FALSE, /* pc_relative */
621 0, /* bitpos */
622 complain_overflow_dont, /* complain_on_overflow */
623 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
624 "R_TILEGX_GNU_VTENTRY", /* name */
625 FALSE, /* partial_inplace */
626 0, /* src_mask */
627 0, /* dst_mask */
628 FALSE), /* pcrel_offset */
629
630 };
631
632 /* Map BFD reloc types to TILEGX ELF reloc types. */
634
635 typedef struct tilegx_reloc_map
636 {
637 bfd_reloc_code_real_type bfd_reloc_val;
638 unsigned int tilegx_reloc_val;
639 reloc_howto_type * table;
640 } reloc_map;
641
642 static const reloc_map tilegx_reloc_map [] =
643 {
644 #define TH_REMAP(bfd, tilegx) \
645 { bfd, tilegx, tilegx_elf_howto_table },
646
647 /* Standard relocations. */
648 TH_REMAP (BFD_RELOC_NONE, R_TILEGX_NONE)
649 TH_REMAP (BFD_RELOC_64, R_TILEGX_64)
650 TH_REMAP (BFD_RELOC_32, R_TILEGX_32)
651 TH_REMAP (BFD_RELOC_16, R_TILEGX_16)
652 TH_REMAP (BFD_RELOC_8, R_TILEGX_8)
653 TH_REMAP (BFD_RELOC_64_PCREL, R_TILEGX_64_PCREL)
654 TH_REMAP (BFD_RELOC_32_PCREL, R_TILEGX_32_PCREL)
655 TH_REMAP (BFD_RELOC_16_PCREL, R_TILEGX_16_PCREL)
656 TH_REMAP (BFD_RELOC_8_PCREL, R_TILEGX_8_PCREL)
657
658 #define SIMPLE_REMAP(t) TH_REMAP (BFD_RELOC_##t, R_##t)
659
660 /* Custom relocations. */
661 SIMPLE_REMAP (TILEGX_HW0)
662 SIMPLE_REMAP (TILEGX_HW1)
663 SIMPLE_REMAP (TILEGX_HW2)
664 SIMPLE_REMAP (TILEGX_HW3)
665 SIMPLE_REMAP (TILEGX_HW0_LAST)
666 SIMPLE_REMAP (TILEGX_HW1_LAST)
667 SIMPLE_REMAP (TILEGX_HW2_LAST)
668 SIMPLE_REMAP (TILEGX_COPY)
669 SIMPLE_REMAP (TILEGX_GLOB_DAT)
670 SIMPLE_REMAP (TILEGX_JMP_SLOT)
671 SIMPLE_REMAP (TILEGX_RELATIVE)
672 SIMPLE_REMAP (TILEGX_BROFF_X1)
673 SIMPLE_REMAP (TILEGX_JUMPOFF_X1)
674 SIMPLE_REMAP (TILEGX_JUMPOFF_X1_PLT)
675 SIMPLE_REMAP (TILEGX_IMM8_X0)
676 SIMPLE_REMAP (TILEGX_IMM8_Y0)
677 SIMPLE_REMAP (TILEGX_IMM8_X1)
678 SIMPLE_REMAP (TILEGX_IMM8_Y1)
679 SIMPLE_REMAP (TILEGX_DEST_IMM8_X1)
680 SIMPLE_REMAP (TILEGX_MT_IMM14_X1)
681 SIMPLE_REMAP (TILEGX_MF_IMM14_X1)
682 SIMPLE_REMAP (TILEGX_MMSTART_X0)
683 SIMPLE_REMAP (TILEGX_MMEND_X0)
684 SIMPLE_REMAP (TILEGX_SHAMT_X0)
685 SIMPLE_REMAP (TILEGX_SHAMT_X1)
686 SIMPLE_REMAP (TILEGX_SHAMT_Y0)
687 SIMPLE_REMAP (TILEGX_SHAMT_Y1)
688 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0)
689 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0)
690 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1)
691 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1)
692 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2)
693 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2)
694 SIMPLE_REMAP (TILEGX_IMM16_X0_HW3)
695 SIMPLE_REMAP (TILEGX_IMM16_X1_HW3)
696 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST)
697 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST)
698 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST)
699 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST)
700 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST)
701 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST)
702 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_PCREL)
703 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_PCREL)
704 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PCREL)
705 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PCREL)
706 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PCREL)
707 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PCREL)
708 SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PCREL)
709 SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PCREL)
710 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PCREL)
711 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PCREL)
712 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PCREL)
713 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PCREL)
714 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST_PCREL)
715 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST_PCREL)
716 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_GOT)
717 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_GOT)
718 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_PLT_PCREL)
719 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_PLT_PCREL)
720 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PLT_PCREL)
721 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PLT_PCREL)
722 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PLT_PCREL)
723 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PLT_PCREL)
724 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_GOT)
725 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_GOT)
726 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_GOT)
727 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_GOT)
728 SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PLT_PCREL)
729 SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PLT_PCREL)
730 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_GD)
731 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_GD)
732 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_LE)
733 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_LE)
734 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_LE)
735 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_LE)
736 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_LE)
737 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_LE)
738 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_GD)
739 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_GD)
740 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_GD)
741 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_GD)
742 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_IE)
743 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_IE)
744 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL)
745 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL)
746 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL)
747 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL)
748 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL)
749 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL)
750 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_IE)
751 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_IE)
752 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_IE)
753 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_IE)
754
755 SIMPLE_REMAP (TILEGX_TLS_DTPMOD64)
756 SIMPLE_REMAP (TILEGX_TLS_DTPOFF64)
757 SIMPLE_REMAP (TILEGX_TLS_TPOFF64)
758
759 SIMPLE_REMAP (TILEGX_TLS_DTPMOD32)
760 SIMPLE_REMAP (TILEGX_TLS_DTPOFF32)
761 SIMPLE_REMAP (TILEGX_TLS_TPOFF32)
762
763 SIMPLE_REMAP (TILEGX_TLS_GD_CALL)
764 SIMPLE_REMAP (TILEGX_IMM8_X0_TLS_GD_ADD)
765 SIMPLE_REMAP (TILEGX_IMM8_X1_TLS_GD_ADD)
766 SIMPLE_REMAP (TILEGX_IMM8_Y0_TLS_GD_ADD)
767 SIMPLE_REMAP (TILEGX_IMM8_Y1_TLS_GD_ADD)
768 SIMPLE_REMAP (TILEGX_TLS_IE_LOAD)
769 SIMPLE_REMAP (TILEGX_IMM8_X0_TLS_ADD)
770 SIMPLE_REMAP (TILEGX_IMM8_X1_TLS_ADD)
771 SIMPLE_REMAP (TILEGX_IMM8_Y0_TLS_ADD)
772 SIMPLE_REMAP (TILEGX_IMM8_Y1_TLS_ADD)
773
774 #undef SIMPLE_REMAP
775 #undef TH_REMAP
776
777 { BFD_RELOC_VTABLE_INHERIT, R_TILEGX_GNU_VTINHERIT, tilegx_elf_howto_table2 },
778 { BFD_RELOC_VTABLE_ENTRY, R_TILEGX_GNU_VTENTRY, tilegx_elf_howto_table2 },
779 };
780
781
782
783 /* TILEGX ELF linker hash entry. */
784
785 struct tilegx_elf_link_hash_entry
786 {
787 struct elf_link_hash_entry elf;
788
789 /* Track dynamic relocs copied for this symbol. */
790 struct elf_dyn_relocs *dyn_relocs;
791
792 #define GOT_UNKNOWN 0
793 #define GOT_NORMAL 1
794 #define GOT_TLS_GD 2
795 #define GOT_TLS_IE 4
796 unsigned char tls_type;
797 };
798
799 #define tilegx_elf_hash_entry(ent) \
800 ((struct tilegx_elf_link_hash_entry *)(ent))
801
802 struct _bfd_tilegx_elf_obj_tdata
803 {
804 struct elf_obj_tdata root;
805
806 /* tls_type for each local got entry. */
807 char *local_got_tls_type;
808 };
809
810 #define _bfd_tilegx_elf_tdata(abfd) \
811 ((struct _bfd_tilegx_elf_obj_tdata *) (abfd)->tdata.any)
812
813 #define _bfd_tilegx_elf_local_got_tls_type(abfd) \
814 (_bfd_tilegx_elf_tdata (abfd)->local_got_tls_type)
815
816 #define is_tilegx_elf(bfd) \
817 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
818 && elf_tdata (bfd) != NULL \
819 && elf_object_id (bfd) == TILEGX_ELF_DATA)
820
821 #include "elf/common.h"
822 #include "elf/internal.h"
823
824 struct tilegx_elf_link_hash_table
825 {
826 struct elf_link_hash_table elf;
827
828 int bytes_per_word;
829 int word_align_power;
830 int bytes_per_rela;
831 int dtpmod_reloc;
832 int dtpoff_reloc;
833 int tpoff_reloc;
834 bfd_vma (*r_info) (Elf_Internal_Rela *, bfd_vma, bfd_vma);
835 bfd_vma (*r_symndx) (bfd_vma);
836 void (*put_word) (bfd *, bfd_vma, void *);
837 const char *dynamic_interpreter;
838
839 /* Whether LE transition has been disabled for some of the
840 sections. */
841 bfd_boolean disable_le_transition;
842
843 /* Small local sym to section mapping cache. */
844 struct sym_cache sym_cache;
845 };
846
847
848 /* Get the Tile ELF linker hash table from a link_info structure. */
849 #define tilegx_elf_hash_table(p) \
850 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
851 == TILEGX_ELF_DATA ? ((struct tilegx_elf_link_hash_table *) ((p)->hash)) : NULL)
852
853 #ifdef BFD64
854 static bfd_vma
855 tilegx_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
856 bfd_vma rel_index,
857 bfd_vma type)
858 {
859 return ELF64_R_INFO (rel_index, type);
860 }
861
862 static bfd_vma
863 tilegx_elf_r_symndx_64 (bfd_vma r_info)
864 {
865 return ELF64_R_SYM (r_info);
866 }
867
868 static void
869 tilegx_put_word_64 (bfd *abfd, bfd_vma val, void *ptr)
870 {
871 bfd_put_64 (abfd, val, ptr);
872 }
873 #endif /* BFD64 */
874
875 static bfd_vma
876 tilegx_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
877 bfd_vma rel_index,
878 bfd_vma type)
879 {
880 return ELF32_R_INFO (rel_index, type);
881 }
882
883 static bfd_vma
884 tilegx_elf_r_symndx_32 (bfd_vma r_info)
885 {
886 return ELF32_R_SYM (r_info);
887 }
888
889 static void
890 tilegx_put_word_32 (bfd *abfd, bfd_vma val, void *ptr)
891 {
892 bfd_put_32 (abfd, val, ptr);
893 }
894
895 reloc_howto_type *
896 tilegx_reloc_type_lookup (bfd * abfd,
897 bfd_reloc_code_real_type code)
898 {
899 unsigned int i;
900
901 for (i = ARRAY_SIZE (tilegx_reloc_map); i--;)
902 {
903 const reloc_map * entry;
904
905 entry = tilegx_reloc_map + i;
906
907 if (entry->bfd_reloc_val == code)
908 return entry->table + (entry->tilegx_reloc_val
909 - entry->table[0].type);
910 }
911
912 /* xgettext:c-format */
913 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
914 abfd, (int) code);
915 bfd_set_error (bfd_error_bad_value);
916 return NULL;
917 }
918
919 reloc_howto_type *
920 tilegx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
921 const char *r_name)
922 {
923 unsigned int i;
924
925 for (i = 0;
926 i < (sizeof (tilegx_elf_howto_table)
927 / sizeof (tilegx_elf_howto_table[0]));
928 i++)
929 if (tilegx_elf_howto_table[i].name != NULL
930 && strcasecmp (tilegx_elf_howto_table[i].name, r_name) == 0)
931 return &tilegx_elf_howto_table[i];
932
933 return NULL;
934 }
935
936 bfd_boolean
937 tilegx_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
938 arelent *cache_ptr,
939 Elf_Internal_Rela *dst)
940 {
941 unsigned int r_type = TILEGX_ELF_R_TYPE (dst->r_info);
942
943 if (r_type <= (unsigned int) R_TILEGX_IMM8_Y1_TLS_ADD)
944 cache_ptr->howto = &tilegx_elf_howto_table [r_type];
945 else if (r_type - R_TILEGX_GNU_VTINHERIT
946 <= ((unsigned int) R_TILEGX_GNU_VTENTRY
947 - (unsigned int) R_TILEGX_GNU_VTINHERIT))
948 cache_ptr->howto
949 = &tilegx_elf_howto_table2 [r_type - R_TILEGX_GNU_VTINHERIT];
950 else
951 {
952 /* xgettext:c-format */
953 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
954 abfd, r_type);
955 bfd_set_error (bfd_error_bad_value);
956 return FALSE;
957 }
958 return TRUE;
959 }
960
961 typedef tilegx_bundle_bits (*tilegx_create_func)(int);
962
963 static const tilegx_create_func reloc_to_create_func[] =
964 {
965 /* The first twenty relocation types don't correspond to operands */
966 NULL,
967 NULL,
968 NULL,
969 NULL,
970 NULL,
971 NULL,
972 NULL,
973 NULL,
974 NULL,
975 NULL,
976 NULL,
977 NULL,
978 NULL,
979 NULL,
980 NULL,
981 NULL,
982 NULL,
983 NULL,
984 NULL,
985 NULL,
986
987 /* The remaining relocations are used for immediate operands */
988 create_BrOff_X1,
989 create_JumpOff_X1,
990 create_JumpOff_X1,
991 create_Imm8_X0,
992 create_Imm8_Y0,
993 create_Imm8_X1,
994 create_Imm8_Y1,
995 create_Dest_Imm8_X1,
996 create_MT_Imm14_X1,
997 create_MF_Imm14_X1,
998 create_BFStart_X0,
999 create_BFEnd_X0,
1000 create_ShAmt_X0,
1001 create_ShAmt_X1,
1002 create_ShAmt_Y0,
1003 create_ShAmt_Y1,
1004 create_Imm16_X0,
1005 create_Imm16_X1,
1006 create_Imm16_X0,
1007 create_Imm16_X1,
1008 create_Imm16_X0,
1009 create_Imm16_X1,
1010 create_Imm16_X0,
1011 create_Imm16_X1,
1012 create_Imm16_X0,
1013 create_Imm16_X1,
1014 create_Imm16_X0,
1015 create_Imm16_X1,
1016 create_Imm16_X0,
1017 create_Imm16_X1,
1018 create_Imm16_X0,
1019 create_Imm16_X1,
1020 create_Imm16_X0,
1021 create_Imm16_X1,
1022 create_Imm16_X0,
1023 create_Imm16_X1,
1024 create_Imm16_X0,
1025 create_Imm16_X1,
1026 create_Imm16_X0,
1027 create_Imm16_X1,
1028 create_Imm16_X0,
1029 create_Imm16_X1,
1030 create_Imm16_X0,
1031 create_Imm16_X1,
1032 create_Imm16_X0,
1033 create_Imm16_X1,
1034 create_Imm16_X0,
1035 create_Imm16_X1,
1036 create_Imm16_X0,
1037 create_Imm16_X1,
1038 create_Imm16_X0,
1039 create_Imm16_X1,
1040 create_Imm16_X0,
1041 create_Imm16_X1,
1042 create_Imm16_X0,
1043 create_Imm16_X1,
1044 create_Imm16_X0,
1045 create_Imm16_X1,
1046 create_Imm16_X0,
1047 create_Imm16_X1,
1048 create_Imm16_X0,
1049 create_Imm16_X1,
1050 create_Imm16_X0,
1051 create_Imm16_X1,
1052 create_Imm16_X0,
1053 create_Imm16_X1,
1054 create_Imm16_X0,
1055 create_Imm16_X1,
1056 create_Imm16_X0,
1057 create_Imm16_X1,
1058 NULL,
1059 NULL,
1060 create_Imm16_X0,
1061 create_Imm16_X1,
1062 create_Imm16_X0,
1063 create_Imm16_X1,
1064 create_Imm16_X0,
1065 create_Imm16_X1,
1066 create_Imm16_X0,
1067 create_Imm16_X1,
1068 create_Imm16_X0,
1069 create_Imm16_X1,
1070 create_Imm16_X0,
1071 create_Imm16_X1,
1072 };
1073
1074 static void
1075 tilegx_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
1076 {
1077 const struct elf_backend_data *bed;
1078 bfd_byte *loc;
1079
1080 bed = get_elf_backend_data (abfd);
1081 loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
1082 bed->s->swap_reloca_out (abfd, rel, loc);
1083 }
1084
1085 /* PLT/GOT stuff */
1086
1087 /* The procedure linkage table starts with the following header:
1088
1089 ld_add r28, r27, 8
1090 ld r27, r27
1091 {
1092 jr r27
1093 info 10 ## SP not offset, return PC in LR
1094 }
1095
1096 Subsequent entries are the following, jumping to the header at the end:
1097
1098 {
1099 moveli r28, <_GLOBAL_OFFSET_TABLE_ - 1f + MY_GOT_OFFSET>
1100 lnk r26
1101 }
1102 1:
1103 {
1104 moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
1105 shl16insli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
1106 }
1107 {
1108 add r28, r26, r28
1109 shl16insli r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
1110 }
1111 {
1112 add r27, r26, r27
1113 ld r28, r28
1114 info 10 ## SP not offset, return PC in LR
1115 }
1116 {
1117 shl16insli r29, zero, MY_PLT_INDEX
1118 jr r28
1119 }
1120
1121 This code sequence lets the code at at the start of the PLT determine
1122 which PLT entry was executed by examining 'r29'.
1123
1124 Note that MY_PLT_INDEX skips over the header entries, so the first
1125 actual jump table entry has index zero.
1126
1127 If the offset fits in 16 bits,
1128
1129 lnk r26
1130 1:
1131 {
1132 addli r28, r26, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
1133 moveli r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
1134 }
1135 {
1136 shl16insli r29, zero, MY_PLT_INDEX
1137 ld r28, r28
1138 }
1139 {
1140 add r27, r26, r27
1141 jr r28
1142 }
1143 info 10 ## SP not offset, return PC in LR
1144
1145 For the purpose of backtracing, the procedure linkage table ends with the
1146 following tail entry:
1147
1148 info 10 ## SP not offset, return PC in LR
1149
1150 The 32-bit versions are similar, with ld4s replacing ld, and offsets into
1151 the GOT being multiples of 4 instead of 8.
1152
1153 */
1154
1155 #define PLT_HEADER_SIZE_IN_BUNDLES 3
1156 #define PLT_ENTRY_SIZE_IN_BUNDLES 5
1157 #define PLT_TAIL_SIZE_IN_BUNDLES 1
1158
1159 #define PLT_HEADER_SIZE \
1160 (PLT_HEADER_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
1161 #define PLT_ENTRY_SIZE \
1162 (PLT_ENTRY_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
1163 #define PLT_TAIL_SIZE \
1164 (PLT_TAIL_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
1165
1166 #define GOT_ENTRY_SIZE(htab) TILEGX_ELF_WORD_BYTES (htab)
1167
1168 #define GOTPLT_HEADER_SIZE(htab) (2 * GOT_ENTRY_SIZE (htab))
1169
1170 static const bfd_byte
1171 tilegx64_plt0_entry[PLT_HEADER_SIZE] =
1172 {
1173 0x00, 0x30, 0x48, 0x51,
1174 0x6e, 0x43, 0xa0, 0x18, /* { ld_add r28, r27, 8 } */
1175 0x00, 0x30, 0xbc, 0x35,
1176 0x00, 0x40, 0xde, 0x9e, /* { ld r27, r27 } */
1177 0xff, 0xaf, 0x30, 0x40,
1178 0x60, 0x73, 0x6a, 0x28, /* { info 10 ; jr r27 } */
1179 };
1180
1181 static const bfd_byte
1182 tilegx64_long_plt_entry[PLT_ENTRY_SIZE] =
1183 {
1184 0xdc, 0x0f, 0x00, 0x10,
1185 0x0d, 0xf0, 0x6a, 0x28, /* { moveli r28, 0 ; lnk r26 } */
1186 0xdb, 0x0f, 0x00, 0x10,
1187 0x8e, 0x03, 0x00, 0x38, /* { moveli r27, 0 ; shl16insli r28, r28, 0 } */
1188 0x9c, 0xc6, 0x0d, 0xd0,
1189 0x6d, 0x03, 0x00, 0x38, /* { add r28, r26, r28 ; shl16insli r27, r27, 0 } */
1190 0x9b, 0xb6, 0xc5, 0xad,
1191 0xff, 0x57, 0xe0, 0x8e, /* { add r27, r26, r27 ; info 10 ; ld r28, r28 } */
1192 0xdd, 0x0f, 0x00, 0x70,
1193 0x80, 0x73, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; jr r28 } */
1194 };
1195
1196 static const bfd_byte
1197 tilegx64_short_plt_entry[PLT_ENTRY_SIZE] =
1198 {
1199 0x00, 0x30, 0x48, 0x51,
1200 0x0d, 0xf0, 0x6a, 0x28, /* { lnk r26 } */
1201 0x9c, 0x06, 0x00, 0x90,
1202 0xed, 0x07, 0x00, 0x00, /* { addli r28, r26, 0 ; moveli r27, 0 } */
1203 0xdd, 0x0f, 0x00, 0x70,
1204 0x8e, 0xeb, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; ld r28, r28 } */
1205 0x9b, 0xb6, 0x0d, 0x50,
1206 0x80, 0x73, 0x6a, 0x28, /* { add r27, r26, r27 ; jr r28 } */
1207 0x00, 0x30, 0x48, 0xd1,
1208 0xff, 0x57, 0x18, 0x18, /* { info 10 } */
1209 };
1210
1211 /* Reuse an existing info 10 bundle. */
1212 static const bfd_byte *const tilegx64_plt_tail_entry =
1213 &tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
1214
1215 static const bfd_byte
1216 tilegx32_plt0_entry[PLT_HEADER_SIZE] =
1217 {
1218 0x00, 0x30, 0x48, 0x51,
1219 0x6e, 0x23, 0x58, 0x18, /* { ld4s_add r28, r27, 4 } */
1220 0x00, 0x30, 0xbc, 0x35,
1221 0x00, 0x40, 0xde, 0x9c, /* { ld4s r27, r27 } */
1222 0xff, 0xaf, 0x30, 0x40,
1223 0x60, 0x73, 0x6a, 0x28, /* { info 10 ; jr r27 } */
1224 };
1225
1226 static const bfd_byte
1227 tilegx32_long_plt_entry[PLT_ENTRY_SIZE] =
1228 {
1229 0xdc, 0x0f, 0x00, 0x10,
1230 0x0d, 0xf0, 0x6a, 0x28, /* { moveli r28, 0 ; lnk r26 } */
1231 0xdb, 0x0f, 0x00, 0x10,
1232 0x8e, 0x03, 0x00, 0x38, /* { moveli r27, 0 ; shl16insli r28, r28, 0 } */
1233 0x9c, 0xc6, 0x0d, 0xd0,
1234 0x6d, 0x03, 0x00, 0x38, /* { add r28, r26, r28 ; shl16insli r27, r27, 0 } */
1235 0x9b, 0xb6, 0xc5, 0xad,
1236 0xff, 0x57, 0xe0, 0x8c, /* { add r27, r26, r27 ; info 10 ; ld4s r28, r28 } */
1237 0xdd, 0x0f, 0x00, 0x70,
1238 0x80, 0x73, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; jr r28 } */
1239 };
1240
1241 static const bfd_byte
1242 tilegx32_short_plt_entry[PLT_ENTRY_SIZE] =
1243 {
1244 0x00, 0x30, 0x48, 0x51,
1245 0x0d, 0xf0, 0x6a, 0x28, /* { lnk r26 } */
1246 0x9c, 0x06, 0x00, 0x90,
1247 0xed, 0x07, 0x00, 0x00, /* { addli r28, r26, 0 ; moveli r27, 0 } */
1248 0xdd, 0x0f, 0x00, 0x70,
1249 0x8e, 0x9b, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; ld4s r28, r28 } */
1250 0x9b, 0xb6, 0x0d, 0x50,
1251 0x80, 0x73, 0x6a, 0x28, /* { add r27, r26, r27 ; jr r28 } */
1252 0x00, 0x30, 0x48, 0xd1,
1253 0xff, 0x57, 0x18, 0x18, /* { info 10 } */
1254 };
1255
1256 /* Reuse an existing info 10 bundle. */
1257 static const bfd_byte *const tilegx32_plt_tail_entry =
1258 &tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
1259
1260 static int
1261 tilegx_plt_entry_build (bfd *output_bfd,
1262 struct tilegx_elf_link_hash_table *htab,
1263 asection *splt, asection *sgotplt,
1264 bfd_vma offset, bfd_vma *r_offset)
1265 {
1266 int plt_index = (offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
1267 int got_offset = (plt_index * GOT_ENTRY_SIZE (htab)
1268 + GOTPLT_HEADER_SIZE (htab));
1269 tilegx_bundle_bits *pc;
1270
1271 /* Compute the distance from the got entry to the lnk. */
1272 bfd_signed_vma dist_got_entry = sgotplt->output_section->vma
1273 + sgotplt->output_offset
1274 + got_offset
1275 - splt->output_section->vma
1276 - splt->output_offset
1277 - offset
1278 - TILEGX_BUNDLE_SIZE_IN_BYTES;
1279
1280 /* Compute the distance to GOTPLT[0]. */
1281 bfd_signed_vma dist_got0 = dist_got_entry - got_offset;
1282
1283 /* Check whether we can use the short plt entry with 16-bit offset. */
1284 bfd_boolean short_plt_entry =
1285 (dist_got_entry <= 0x7fff && dist_got0 >= -0x8000);
1286
1287 const tilegx_bundle_bits *plt_entry = (tilegx_bundle_bits *)
1288 (ABI_64_P (output_bfd) ?
1289 (short_plt_entry ? tilegx64_short_plt_entry : tilegx64_long_plt_entry) :
1290 (short_plt_entry ? tilegx32_short_plt_entry : tilegx32_long_plt_entry));
1291
1292 /* Copy the plt entry template. */
1293 memcpy (splt->contents + offset, plt_entry, PLT_ENTRY_SIZE);
1294
1295 /* Write the immediate offsets. */
1296 pc = (tilegx_bundle_bits *)(splt->contents + offset);
1297
1298 if (short_plt_entry)
1299 {
1300 /* { lnk r28 } */
1301 pc++;
1302
1303 /* { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; moveli r27, &GOTPLT[0] } */
1304 *pc++ |= create_Imm16_X0 (dist_got_entry)
1305 | create_Imm16_X1 (dist_got0);
1306
1307 /* { shl16insli r29, zero, MY_PLT_INDEX ; ld r28, r28 } */
1308 *pc++ |= create_Imm16_X0 (plt_index);
1309 }
1310 else
1311 {
1312 /* { moveli r28, &GOTPLT[MY_GOT_INDEX] ; lnk r26 } */
1313 *pc++ |= create_Imm16_X0 (dist_got_entry >> 16);
1314
1315 /* { moveli r27, &GOTPLT[0] ;
1316 shl16insli r28, r28, &GOTPLT[MY_GOT_INDEX] } */
1317 *pc++ |= create_Imm16_X0 (dist_got0 >> 16)
1318 | create_Imm16_X1 (dist_got_entry);
1319
1320 /* { add r28, r26, r28 ; shl16insli r27, r27, &GOTPLT[0] } */
1321 *pc++ |= create_Imm16_X1 (dist_got0);
1322
1323 /* { add r27, r26, r27 ; info 10 ; ld r28, r28 } */
1324 pc++;
1325
1326 /* { shl16insli r29, zero, MY_GOT_INDEX ; jr r28 } */
1327 *pc++ |= create_Imm16_X0 (plt_index);
1328 }
1329
1330 /* Set the relocation offset. */
1331 *r_offset = got_offset;
1332
1333 return plt_index;
1334 }
1335
1336 /* Create an entry in an TILEGX ELF linker hash table. */
1337
1338 static struct bfd_hash_entry *
1339 link_hash_newfunc (struct bfd_hash_entry *entry,
1340 struct bfd_hash_table *table, const char *string)
1341 {
1342 /* Allocate the structure if it has not already been allocated by a
1343 subclass. */
1344 if (entry == NULL)
1345 {
1346 entry =
1347 bfd_hash_allocate (table,
1348 sizeof (struct tilegx_elf_link_hash_entry));
1349 if (entry == NULL)
1350 return entry;
1351 }
1352
1353 /* Call the allocation method of the superclass. */
1354 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1355 if (entry != NULL)
1356 {
1357 struct tilegx_elf_link_hash_entry *eh;
1358
1359 eh = (struct tilegx_elf_link_hash_entry *) entry;
1360 eh->dyn_relocs = NULL;
1361 eh->tls_type = GOT_UNKNOWN;
1362 }
1363
1364 return entry;
1365 }
1366
1367 /* Create a TILEGX ELF linker hash table. */
1368
1369 struct bfd_link_hash_table *
1370 tilegx_elf_link_hash_table_create (bfd *abfd)
1371 {
1372 struct tilegx_elf_link_hash_table *ret;
1373 bfd_size_type amt = sizeof (struct tilegx_elf_link_hash_table);
1374
1375 ret = (struct tilegx_elf_link_hash_table *) bfd_zmalloc (amt);
1376 if (ret == NULL)
1377 return NULL;
1378
1379 #ifdef BFD64
1380 if (ABI_64_P (abfd))
1381 {
1382 ret->bytes_per_word = 8;
1383 ret->word_align_power = 3;
1384 ret->bytes_per_rela = sizeof (Elf64_External_Rela);
1385 ret->dtpoff_reloc = R_TILEGX_TLS_DTPOFF64;
1386 ret->dtpmod_reloc = R_TILEGX_TLS_DTPMOD64;
1387 ret->tpoff_reloc = R_TILEGX_TLS_TPOFF64;
1388 ret->r_info = tilegx_elf_r_info_64;
1389 ret->r_symndx = tilegx_elf_r_symndx_64;
1390 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1391 ret->put_word = tilegx_put_word_64;
1392 }
1393 else
1394 #endif
1395 {
1396 ret->bytes_per_word = 4;
1397 ret->word_align_power = 2;
1398 ret->bytes_per_rela = sizeof (Elf32_External_Rela);
1399 ret->dtpoff_reloc = R_TILEGX_TLS_DTPOFF32;
1400 ret->dtpmod_reloc = R_TILEGX_TLS_DTPMOD32;
1401 ret->tpoff_reloc = R_TILEGX_TLS_TPOFF32;
1402 ret->r_info = tilegx_elf_r_info_32;
1403 ret->r_symndx = tilegx_elf_r_symndx_32;
1404 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1405 ret->put_word = tilegx_put_word_32;
1406 }
1407
1408 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
1409 sizeof (struct tilegx_elf_link_hash_entry),
1410 TILEGX_ELF_DATA))
1411 {
1412 free (ret);
1413 return NULL;
1414 }
1415
1416 return &ret->elf.root;
1417 }
1418
1419 /* Create the .got section. */
1420
1421 static bfd_boolean
1422 tilegx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
1423 {
1424 flagword flags;
1425 asection *s, *s_got;
1426 struct elf_link_hash_entry *h;
1427 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1428 struct elf_link_hash_table *htab = elf_hash_table (info);
1429
1430 /* This function may be called more than once. */
1431 if (htab->sgot != NULL)
1432 return TRUE;
1433
1434 flags = bed->dynamic_sec_flags;
1435
1436 s = bfd_make_section_anyway_with_flags (abfd,
1437 (bed->rela_plts_and_copies_p
1438 ? ".rela.got" : ".rel.got"),
1439 (bed->dynamic_sec_flags
1440 | SEC_READONLY));
1441 if (s == NULL
1442 || !bfd_set_section_alignment (s, bed->s->log_file_align))
1443 return FALSE;
1444 htab->srelgot = s;
1445
1446 s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
1447 if (s == NULL
1448 || !bfd_set_section_alignment (s, bed->s->log_file_align))
1449 return FALSE;
1450 htab->sgot = s;
1451
1452 /* The first bit of the global offset table is the header. */
1453 s->size += bed->got_header_size;
1454
1455 if (bed->want_got_plt)
1456 {
1457 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
1458 if (s == NULL
1459 || !bfd_set_section_alignment (s, bed->s->log_file_align))
1460 return FALSE;
1461 htab->sgotplt = s;
1462
1463 /* Reserve room for the header. */
1464 s->size += GOTPLT_HEADER_SIZE (tilegx_elf_hash_table (info));
1465 }
1466
1467 if (bed->want_got_sym)
1468 {
1469 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
1470 section. We don't do this in the linker script because we don't want
1471 to define the symbol if we are not creating a global offset
1472 table. */
1473 h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
1474 "_GLOBAL_OFFSET_TABLE_");
1475 elf_hash_table (info)->hgot = h;
1476 if (h == NULL)
1477 return FALSE;
1478 }
1479
1480 return TRUE;
1481 }
1482
1483 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1484 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1485 hash table. */
1486
1487 bfd_boolean
1488 tilegx_elf_create_dynamic_sections (bfd *dynobj,
1489 struct bfd_link_info *info)
1490 {
1491 if (!tilegx_elf_create_got_section (dynobj, info))
1492 return FALSE;
1493
1494 return _bfd_elf_create_dynamic_sections (dynobj, info);
1495 }
1496
1497 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1498
1499 void
1500 tilegx_elf_copy_indirect_symbol (struct bfd_link_info *info,
1501 struct elf_link_hash_entry *dir,
1502 struct elf_link_hash_entry *ind)
1503 {
1504 struct tilegx_elf_link_hash_entry *edir, *eind;
1505
1506 edir = (struct tilegx_elf_link_hash_entry *) dir;
1507 eind = (struct tilegx_elf_link_hash_entry *) ind;
1508
1509 if (eind->dyn_relocs != NULL)
1510 {
1511 if (edir->dyn_relocs != NULL)
1512 {
1513 struct elf_dyn_relocs **pp;
1514 struct elf_dyn_relocs *p;
1515
1516 /* Add reloc counts against the indirect sym to the direct sym
1517 list. Merge any entries against the same section. */
1518 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1519 {
1520 struct elf_dyn_relocs *q;
1521
1522 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1523 if (q->sec == p->sec)
1524 {
1525 q->pc_count += p->pc_count;
1526 q->count += p->count;
1527 *pp = p->next;
1528 break;
1529 }
1530 if (q == NULL)
1531 pp = &p->next;
1532 }
1533 *pp = edir->dyn_relocs;
1534 }
1535
1536 edir->dyn_relocs = eind->dyn_relocs;
1537 eind->dyn_relocs = NULL;
1538 }
1539
1540 if (ind->root.type == bfd_link_hash_indirect
1541 && dir->got.refcount <= 0)
1542 {
1543 edir->tls_type = eind->tls_type;
1544 eind->tls_type = GOT_UNKNOWN;
1545 }
1546 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1547 }
1548
1549 static int
1550 tilegx_tls_translate_to_le (int r_type)
1551 {
1552 switch (r_type)
1553 {
1554 case R_TILEGX_IMM16_X0_HW0_TLS_GD:
1555 case R_TILEGX_IMM16_X0_HW0_TLS_IE:
1556 return R_TILEGX_IMM16_X0_HW0_TLS_LE;
1557
1558 case R_TILEGX_IMM16_X1_HW0_TLS_GD:
1559 case R_TILEGX_IMM16_X1_HW0_TLS_IE:
1560 return R_TILEGX_IMM16_X1_HW0_TLS_LE;
1561
1562 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
1563 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
1564 return R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE;
1565
1566 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
1567 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
1568 return R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE;
1569
1570 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
1571 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
1572 return R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE;
1573
1574 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
1575 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
1576 return R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE;
1577 }
1578 return r_type;
1579 }
1580
1581 static int
1582 tilegx_tls_translate_to_ie (int r_type)
1583 {
1584 switch (r_type)
1585 {
1586 case R_TILEGX_IMM16_X0_HW0_TLS_GD:
1587 case R_TILEGX_IMM16_X0_HW0_TLS_IE:
1588 return R_TILEGX_IMM16_X0_HW0_TLS_IE;
1589
1590 case R_TILEGX_IMM16_X1_HW0_TLS_GD:
1591 case R_TILEGX_IMM16_X1_HW0_TLS_IE:
1592 return R_TILEGX_IMM16_X1_HW0_TLS_IE;
1593
1594 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
1595 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
1596 return R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE;
1597
1598 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
1599 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
1600 return R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE;
1601
1602 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
1603 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
1604 return R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE;
1605
1606 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
1607 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
1608 return R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE;
1609 }
1610 return r_type;
1611 }
1612
1613 static int
1614 tilegx_elf_tls_transition (struct bfd_link_info *info, int r_type,
1615 int is_local, bfd_boolean disable_le_transition)
1616 {
1617 if (!bfd_link_executable (info))
1618 return r_type;
1619
1620 if (is_local && !disable_le_transition)
1621 return tilegx_tls_translate_to_le (r_type);
1622 else
1623 return tilegx_tls_translate_to_ie (r_type);
1624 }
1625
1626 /* Look through the relocs for a section during the first phase, and
1627 allocate space in the global offset table or procedure linkage
1628 table. */
1629
1630 bfd_boolean
1631 tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1632 asection *sec, const Elf_Internal_Rela *relocs)
1633 {
1634 struct tilegx_elf_link_hash_table *htab;
1635 Elf_Internal_Shdr *symtab_hdr;
1636 struct elf_link_hash_entry **sym_hashes;
1637 const Elf_Internal_Rela *rel;
1638 const Elf_Internal_Rela *rel_end;
1639 asection *sreloc;
1640 int num_relocs;
1641 bfd_boolean has_tls_gd_or_ie = FALSE, has_tls_add = FALSE;
1642
1643 if (bfd_link_relocatable (info))
1644 return TRUE;
1645
1646 htab = tilegx_elf_hash_table (info);
1647 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1648 sym_hashes = elf_sym_hashes (abfd);
1649
1650 sreloc = NULL;
1651
1652 num_relocs = sec->reloc_count;
1653
1654 BFD_ASSERT (is_tilegx_elf (abfd) || num_relocs == 0);
1655
1656 if (htab->elf.dynobj == NULL)
1657 htab->elf.dynobj = abfd;
1658
1659 rel_end = relocs + num_relocs;
1660
1661 /* Check whether to do optimization to transform TLS GD/IE
1662 referehces to TLS LE. We disable it if we're linking with old
1663 TLS code sequences that do not support such optimization. Old
1664 TLS code sequences have tls_gd_call/tls_ie_load relocations but
1665 no tls_add relocations. */
1666 for (rel = relocs; rel < rel_end && !has_tls_add; rel++)
1667 {
1668 int r_type = TILEGX_ELF_R_TYPE (rel->r_info);
1669 switch (r_type)
1670 {
1671 case R_TILEGX_TLS_GD_CALL:
1672 case R_TILEGX_TLS_IE_LOAD:
1673 has_tls_gd_or_ie = TRUE;
1674 break;
1675 case R_TILEGX_IMM8_X0_TLS_ADD:
1676 case R_TILEGX_IMM8_Y0_TLS_ADD:
1677 case R_TILEGX_IMM8_X1_TLS_ADD:
1678 case R_TILEGX_IMM8_Y1_TLS_ADD:
1679 has_tls_add = TRUE;
1680 break;
1681 }
1682 }
1683
1684 sec->sec_flg0 = (has_tls_gd_or_ie && !has_tls_add);
1685 htab->disable_le_transition |= sec->sec_flg0;
1686
1687 for (rel = relocs; rel < rel_end; rel++)
1688 {
1689 unsigned int r_type;
1690 unsigned int r_symndx;
1691 struct elf_link_hash_entry *h;
1692 int tls_type;
1693
1694 r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
1695 r_type = TILEGX_ELF_R_TYPE (rel->r_info);
1696
1697 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1698 {
1699 /* xgettext:c-format */
1700 _bfd_error_handler (_("%pB: bad symbol index: %d"),
1701 abfd, r_symndx);
1702 return FALSE;
1703 }
1704
1705 if (r_symndx < symtab_hdr->sh_info)
1706 h = NULL;
1707 else
1708 {
1709 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1710 while (h->root.type == bfd_link_hash_indirect
1711 || h->root.type == bfd_link_hash_warning)
1712 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1713 }
1714
1715 r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
1716 sec->sec_flg0);
1717 switch (r_type)
1718 {
1719 case R_TILEGX_IMM16_X0_HW0_TLS_LE:
1720 case R_TILEGX_IMM16_X1_HW0_TLS_LE:
1721 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
1722 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
1723 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
1724 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
1725 if (!bfd_link_executable (info))
1726 goto r_tilegx_plt32;
1727 break;
1728
1729 case R_TILEGX_IMM16_X0_HW0_TLS_GD:
1730 case R_TILEGX_IMM16_X1_HW0_TLS_GD:
1731 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
1732 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
1733 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
1734 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
1735 BFD_ASSERT (bfd_link_pic (info));
1736 tls_type = GOT_TLS_GD;
1737 goto have_got_reference;
1738
1739 case R_TILEGX_IMM16_X0_HW0_TLS_IE:
1740 case R_TILEGX_IMM16_X1_HW0_TLS_IE:
1741 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
1742 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
1743 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
1744 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
1745 tls_type = GOT_TLS_IE;
1746 if (!bfd_link_executable (info))
1747 info->flags |= DF_STATIC_TLS;
1748 goto have_got_reference;
1749
1750 case R_TILEGX_IMM16_X0_HW0_GOT:
1751 case R_TILEGX_IMM16_X1_HW0_GOT:
1752 case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
1753 case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
1754 case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
1755 case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
1756 tls_type = GOT_NORMAL;
1757 /* Fall Through */
1758
1759 have_got_reference:
1760 /* This symbol requires a global offset table entry. */
1761 {
1762 int old_tls_type;
1763
1764 if (h != NULL)
1765 {
1766 h->got.refcount += 1;
1767 old_tls_type = tilegx_elf_hash_entry(h)->tls_type;
1768 }
1769 else
1770 {
1771 bfd_signed_vma *local_got_refcounts;
1772
1773 /* This is a global offset table entry for a local symbol. */
1774 local_got_refcounts = elf_local_got_refcounts (abfd);
1775 if (local_got_refcounts == NULL)
1776 {
1777 bfd_size_type size;
1778
1779 size = symtab_hdr->sh_info;
1780 size *= (sizeof (bfd_signed_vma) + sizeof(char));
1781 local_got_refcounts = ((bfd_signed_vma *)
1782 bfd_zalloc (abfd, size));
1783 if (local_got_refcounts == NULL)
1784 return FALSE;
1785 elf_local_got_refcounts (abfd) = local_got_refcounts;
1786 _bfd_tilegx_elf_local_got_tls_type (abfd)
1787 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1788 }
1789 local_got_refcounts[r_symndx] += 1;
1790 old_tls_type = _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx];
1791 }
1792
1793 /* If a TLS symbol is accessed using IE at least once,
1794 there is no point to use dynamic model for it. */
1795 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1796 && (old_tls_type != GOT_TLS_GD
1797 || tls_type != GOT_TLS_IE))
1798 {
1799 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1800 tls_type = old_tls_type;
1801 else
1802 {
1803 _bfd_error_handler
1804 /* xgettext:c-format */
1805 (_("%pB: `%s' accessed both as normal and thread local symbol"),
1806 abfd, h ? h->root.root.string : "<local>");
1807 return FALSE;
1808 }
1809 }
1810
1811 if (old_tls_type != tls_type)
1812 {
1813 if (h != NULL)
1814 tilegx_elf_hash_entry (h)->tls_type = tls_type;
1815 else
1816 _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1817 }
1818 }
1819
1820 if (htab->elf.sgot == NULL)
1821 {
1822 if (!tilegx_elf_create_got_section (htab->elf.dynobj, info))
1823 return FALSE;
1824 }
1825 break;
1826
1827 case R_TILEGX_TLS_GD_CALL:
1828 if (!bfd_link_executable (info))
1829 {
1830 /* These are basically R_TILEGX_JUMPOFF_X1_PLT relocs
1831 against __tls_get_addr. */
1832 struct bfd_link_hash_entry *bh = NULL;
1833 if (! _bfd_generic_link_add_one_symbol (info, abfd,
1834 "__tls_get_addr", 0,
1835 bfd_und_section_ptr, 0,
1836 NULL, FALSE, FALSE,
1837 &bh))
1838 return FALSE;
1839 h = (struct elf_link_hash_entry *) bh;
1840 }
1841 else
1842 break;
1843 /* Fall through */
1844
1845 case R_TILEGX_JUMPOFF_X1_PLT:
1846 case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
1847 case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
1848 case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
1849 case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
1850 case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
1851 case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
1852 case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
1853 case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
1854 case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
1855 case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
1856 case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
1857 case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
1858 case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
1859 case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
1860 /* This symbol requires a procedure linkage table entry. We
1861 actually build the entry in adjust_dynamic_symbol,
1862 because this might be a case of linking PIC code without
1863 linking in any dynamic objects, in which case we don't
1864 need to generate a procedure linkage table after all. */
1865
1866 if (h != NULL)
1867 {
1868 h->needs_plt = 1;
1869 h->plt.refcount += 1;
1870 }
1871 break;
1872
1873 case R_TILEGX_64_PCREL:
1874 case R_TILEGX_32_PCREL:
1875 case R_TILEGX_16_PCREL:
1876 case R_TILEGX_8_PCREL:
1877 case R_TILEGX_IMM16_X0_HW0_PCREL:
1878 case R_TILEGX_IMM16_X1_HW0_PCREL:
1879 case R_TILEGX_IMM16_X0_HW1_PCREL:
1880 case R_TILEGX_IMM16_X1_HW1_PCREL:
1881 case R_TILEGX_IMM16_X0_HW2_PCREL:
1882 case R_TILEGX_IMM16_X1_HW2_PCREL:
1883 case R_TILEGX_IMM16_X0_HW3_PCREL:
1884 case R_TILEGX_IMM16_X1_HW3_PCREL:
1885 case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
1886 case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
1887 case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
1888 case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
1889 case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
1890 case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
1891 if (h != NULL)
1892 h->non_got_ref = 1;
1893
1894 if (h != NULL
1895 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1896 break;
1897 /* Fall through. */
1898
1899 case R_TILEGX_64:
1900 case R_TILEGX_32:
1901 case R_TILEGX_16:
1902 case R_TILEGX_8:
1903 case R_TILEGX_HW0:
1904 case R_TILEGX_HW1:
1905 case R_TILEGX_HW2:
1906 case R_TILEGX_HW3:
1907 case R_TILEGX_HW0_LAST:
1908 case R_TILEGX_HW1_LAST:
1909 case R_TILEGX_HW2_LAST:
1910 case R_TILEGX_COPY:
1911 case R_TILEGX_GLOB_DAT:
1912 case R_TILEGX_JMP_SLOT:
1913 case R_TILEGX_RELATIVE:
1914 case R_TILEGX_BROFF_X1:
1915 case R_TILEGX_JUMPOFF_X1:
1916 case R_TILEGX_IMM8_X0:
1917 case R_TILEGX_IMM8_Y0:
1918 case R_TILEGX_IMM8_X1:
1919 case R_TILEGX_IMM8_Y1:
1920 case R_TILEGX_DEST_IMM8_X1:
1921 case R_TILEGX_MT_IMM14_X1:
1922 case R_TILEGX_MF_IMM14_X1:
1923 case R_TILEGX_MMSTART_X0:
1924 case R_TILEGX_MMEND_X0:
1925 case R_TILEGX_SHAMT_X0:
1926 case R_TILEGX_SHAMT_X1:
1927 case R_TILEGX_SHAMT_Y0:
1928 case R_TILEGX_SHAMT_Y1:
1929 case R_TILEGX_IMM16_X0_HW0:
1930 case R_TILEGX_IMM16_X1_HW0:
1931 case R_TILEGX_IMM16_X0_HW1:
1932 case R_TILEGX_IMM16_X1_HW1:
1933 case R_TILEGX_IMM16_X0_HW2:
1934 case R_TILEGX_IMM16_X1_HW2:
1935 case R_TILEGX_IMM16_X0_HW3:
1936 case R_TILEGX_IMM16_X1_HW3:
1937 case R_TILEGX_IMM16_X0_HW0_LAST:
1938 case R_TILEGX_IMM16_X1_HW0_LAST:
1939 case R_TILEGX_IMM16_X0_HW1_LAST:
1940 case R_TILEGX_IMM16_X1_HW1_LAST:
1941 case R_TILEGX_IMM16_X0_HW2_LAST:
1942 case R_TILEGX_IMM16_X1_HW2_LAST:
1943 if (h != NULL)
1944 h->non_got_ref = 1;
1945
1946 r_tilegx_plt32:
1947 if (h != NULL && !bfd_link_pic (info))
1948 {
1949 /* We may need a .plt entry if the function this reloc
1950 refers to is in a shared lib. */
1951 h->plt.refcount += 1;
1952 }
1953
1954 /* If we are creating a shared library, and this is a reloc
1955 against a global symbol, or a non PC relative reloc
1956 against a local symbol, then we need to copy the reloc
1957 into the shared library. However, if we are linking with
1958 -Bsymbolic, we do not need to copy a reloc against a
1959 global symbol which is defined in an object we are
1960 including in the link (i.e., DEF_REGULAR is set). At
1961 this point we have not seen all the input files, so it is
1962 possible that DEF_REGULAR is not set now but will be set
1963 later (it is never cleared). In case of a weak definition,
1964 DEF_REGULAR may be cleared later by a strong definition in
1965 a shared library. We account for that possibility below by
1966 storing information in the relocs_copied field of the hash
1967 table entry. A similar situation occurs when creating
1968 shared libraries and symbol visibility changes render the
1969 symbol local.
1970
1971 If on the other hand, we are creating an executable, we
1972 may need to keep relocations for symbols satisfied by a
1973 dynamic library if we manage to avoid copy relocs for the
1974 symbol. */
1975 if ((bfd_link_pic (info)
1976 && (sec->flags & SEC_ALLOC) != 0
1977 && (! tilegx_elf_howto_table[r_type].pc_relative
1978 || (h != NULL
1979 && (! info->symbolic
1980 || h->root.type == bfd_link_hash_defweak
1981 || !h->def_regular))))
1982 || (!bfd_link_pic (info)
1983 && (sec->flags & SEC_ALLOC) != 0
1984 && h != NULL
1985 && (h->root.type == bfd_link_hash_defweak
1986 || !h->def_regular)))
1987 {
1988 struct elf_dyn_relocs *p;
1989 struct elf_dyn_relocs **head;
1990
1991 /* When creating a shared object, we must copy these
1992 relocs into the output file. We create a reloc
1993 section in dynobj and make room for the reloc. */
1994 if (sreloc == NULL)
1995 {
1996 sreloc = _bfd_elf_make_dynamic_reloc_section
1997 (sec, htab->elf.dynobj, htab->word_align_power, abfd,
1998 /*rela?*/ TRUE);
1999
2000 if (sreloc == NULL)
2001 return FALSE;
2002 }
2003
2004 /* If this is a global symbol, we count the number of
2005 relocations we need for this symbol. */
2006 if (h != NULL)
2007 head =
2008 &((struct tilegx_elf_link_hash_entry *) h)->dyn_relocs;
2009 else
2010 {
2011 /* Track dynamic relocs needed for local syms too.
2012 We really need local syms available to do this
2013 easily. Oh well. */
2014
2015 asection *s;
2016 void *vpp;
2017 Elf_Internal_Sym *isym;
2018
2019 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2020 abfd, r_symndx);
2021 if (isym == NULL)
2022 return FALSE;
2023
2024 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2025 if (s == NULL)
2026 s = sec;
2027
2028 vpp = &elf_section_data (s)->local_dynrel;
2029 head = (struct elf_dyn_relocs **) vpp;
2030 }
2031
2032 p = *head;
2033 if (p == NULL || p->sec != sec)
2034 {
2035 bfd_size_type amt = sizeof *p;
2036 p = ((struct elf_dyn_relocs *)
2037 bfd_alloc (htab->elf.dynobj, amt));
2038 if (p == NULL)
2039 return FALSE;
2040 p->next = *head;
2041 *head = p;
2042 p->sec = sec;
2043 p->count = 0;
2044 p->pc_count = 0;
2045 }
2046
2047 p->count += 1;
2048 if (tilegx_elf_howto_table[r_type].pc_relative)
2049 p->pc_count += 1;
2050 }
2051
2052 break;
2053
2054 case R_TILEGX_GNU_VTINHERIT:
2055 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2056 return FALSE;
2057 break;
2058
2059 case R_TILEGX_GNU_VTENTRY:
2060 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2061 return FALSE;
2062 break;
2063
2064 default:
2065 break;
2066 }
2067 }
2068
2069 return TRUE;
2070 }
2071
2072
2073 asection *
2075 tilegx_elf_gc_mark_hook (asection *sec,
2076 struct bfd_link_info *info,
2077 Elf_Internal_Rela *rel,
2078 struct elf_link_hash_entry *h,
2079 Elf_Internal_Sym *sym)
2080 {
2081 if (h != NULL)
2082 {
2083 switch (TILEGX_ELF_R_TYPE (rel->r_info))
2084 {
2085 case R_TILEGX_GNU_VTINHERIT:
2086 case R_TILEGX_GNU_VTENTRY:
2087 return NULL;
2088 }
2089 }
2090
2091 /* FIXME: The test here, in check_relocs and in relocate_section
2092 dealing with TLS optimization, ought to be !bfd_link_executable (info). */
2093 if (bfd_link_pic (info))
2094 {
2095 struct bfd_link_hash_entry *bh;
2096
2097 switch (TILEGX_ELF_R_TYPE (rel->r_info))
2098 {
2099 case R_TILEGX_TLS_GD_CALL:
2100 /* This reloc implicitly references __tls_get_addr. We know
2101 another reloc will reference the same symbol as the one
2102 on this reloc, so the real symbol and section will be
2103 gc marked when processing the other reloc. That lets
2104 us handle __tls_get_addr here. */
2105 bh = NULL;
2106 if (! _bfd_generic_link_add_one_symbol (info, sec->owner,
2107 "__tls_get_addr", 0,
2108 bfd_und_section_ptr,
2109 0, NULL, FALSE,
2110 FALSE, &bh))
2111 return NULL;
2112 h = (struct elf_link_hash_entry *) bh;
2113 BFD_ASSERT (h != NULL);
2114 h->mark = 1;
2115 if (h->is_weakalias)
2116 weakdef (h)->mark = 1;
2117 sym = NULL;
2118 }
2119 }
2120
2121 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2122 }
2123
2124 /* Find dynamic relocs for H that apply to read-only sections. */
2125
2126 static asection *
2127 readonly_dynrelocs (struct elf_link_hash_entry *h)
2128 {
2129 struct elf_dyn_relocs *p;
2130
2131 for (p = tilegx_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
2132 {
2133 asection *s = p->sec->output_section;
2134
2135 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2136 return p->sec;
2137 }
2138 return NULL;
2139 }
2140
2141 /* Adjust a symbol defined by a dynamic object and referenced by a
2142 regular object. The current definition is in some section of the
2143 dynamic object, but we're not including those sections. We have to
2144 change the definition to something the rest of the link can
2145 understand. */
2146
2147 bfd_boolean
2148 tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2149 struct elf_link_hash_entry *h)
2150 {
2151 struct tilegx_elf_link_hash_table *htab;
2152 bfd *dynobj;
2153 asection *s, *srel;
2154
2155 htab = tilegx_elf_hash_table (info);
2156 BFD_ASSERT (htab != NULL);
2157
2158 dynobj = htab->elf.dynobj;
2159
2160 /* Make sure we know what is going on here. */
2161 BFD_ASSERT (dynobj != NULL
2162 && (h->needs_plt
2163 || h->is_weakalias
2164 || (h->def_dynamic
2165 && h->ref_regular
2166 && !h->def_regular)));
2167
2168 /* If this is a function, put it in the procedure linkage table. We
2169 will fill in the contents of the procedure linkage table later
2170 (although we could actually do it here). */
2171 if (h->type == STT_FUNC || h->needs_plt)
2172 {
2173 if (h->plt.refcount <= 0
2174 || SYMBOL_CALLS_LOCAL (info, h)
2175 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2176 && h->root.type == bfd_link_hash_undefweak))
2177 {
2178 /* This case can occur if we saw a R_TILEGX_JUMPOFF_X1_PLT
2179 reloc in an input file, but the symbol was never referred
2180 to by a dynamic object, or if all references were garbage
2181 collected. In such a case, we don't actually need to build
2182 a procedure linkage table, and we can just do a
2183 R_TILEGX_JUMPOFF_X1 relocation instead. */
2184 h->plt.offset = (bfd_vma) -1;
2185 h->needs_plt = 0;
2186 }
2187
2188 return TRUE;
2189 }
2190 else
2191 h->plt.offset = (bfd_vma) -1;
2192
2193 /* If this is a weak symbol, and there is a real definition, the
2194 processor independent code will have arranged for us to see the
2195 real definition first, and we can just use the same value. */
2196 if (h->is_weakalias)
2197 {
2198 struct elf_link_hash_entry *def = weakdef (h);
2199 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2200 h->root.u.def.section = def->root.u.def.section;
2201 h->root.u.def.value = def->root.u.def.value;
2202 return TRUE;
2203 }
2204
2205 /* This is a reference to a symbol defined by a dynamic object which
2206 is not a function. */
2207
2208 /* If we are creating a shared library, we must presume that the
2209 only references to the symbol are via the global offset table.
2210 For such cases we need not do anything here; the relocations will
2211 be handled correctly by relocate_section. */
2212 if (bfd_link_pic (info))
2213 return TRUE;
2214
2215 /* If there are no references to this symbol that do not use the
2216 GOT, we don't need to generate a copy reloc. */
2217 if (!h->non_got_ref)
2218 return TRUE;
2219
2220 /* If -z nocopyreloc was given, we won't generate them either. */
2221 if (info->nocopyreloc)
2222 {
2223 h->non_got_ref = 0;
2224 return TRUE;
2225 }
2226
2227 /* If we don't find any dynamic relocs in read-only sections, then
2228 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2229 if (!readonly_dynrelocs (h))
2230 {
2231 h->non_got_ref = 0;
2232 return TRUE;
2233 }
2234
2235 /* We must allocate the symbol in our .dynbss section, which will
2236 become part of the .bss section of the executable. There will be
2237 an entry for this symbol in the .dynsym section. The dynamic
2238 object will contain position independent code, so all references
2239 from the dynamic object to this symbol will go through the global
2240 offset table. The dynamic linker will use the .dynsym entry to
2241 determine the address it must put in the global offset table, so
2242 both the dynamic object and the regular object will refer to the
2243 same memory location for the variable. */
2244
2245 /* We must generate a R_TILEGX_COPY reloc to tell the dynamic linker
2246 to copy the initial value out of the dynamic object and into the
2247 runtime process image. We need to remember the offset into the
2248 .rel.bss section we are going to use. */
2249 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2250 {
2251 s = htab->elf.sdynrelro;
2252 srel = htab->elf.sreldynrelro;
2253 }
2254 else
2255 {
2256 s = htab->elf.sdynbss;
2257 srel = htab->elf.srelbss;
2258 }
2259 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2260 {
2261 srel->size += TILEGX_ELF_RELA_BYTES (htab);
2262 h->needs_copy = 1;
2263 }
2264
2265 return _bfd_elf_adjust_dynamic_copy (info, h, s);
2266 }
2267
2268 /* Allocate space in .plt, .got and associated reloc sections for
2269 dynamic relocs. */
2270
2271 static bfd_boolean
2272 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2273 {
2274 struct bfd_link_info *info;
2275 struct tilegx_elf_link_hash_table *htab;
2276 struct tilegx_elf_link_hash_entry *eh;
2277 struct elf_dyn_relocs *p;
2278
2279 if (h->root.type == bfd_link_hash_indirect)
2280 return TRUE;
2281
2282 info = (struct bfd_link_info *) inf;
2283 htab = tilegx_elf_hash_table (info);
2284 BFD_ASSERT (htab != NULL);
2285
2286 if (htab->elf.dynamic_sections_created
2287 && h->plt.refcount > 0)
2288 {
2289 /* Make sure this symbol is output as a dynamic symbol.
2290 Undefined weak syms won't yet be marked as dynamic. */
2291 if (h->dynindx == -1
2292 && !h->forced_local)
2293 {
2294 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2295 return FALSE;
2296 }
2297
2298 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
2299 {
2300 asection *s = htab->elf.splt;
2301
2302 /* Allocate room for the header and tail. */
2303 if (s->size == 0)
2304 {
2305 s->size = PLT_ENTRY_SIZE;
2306 }
2307
2308 h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_SIZE;
2309
2310 /* If this symbol is not defined in a regular file, and we are
2311 not generating a shared library, then set the symbol to this
2312 location in the .plt. This is required to make function
2313 pointers compare as equal between the normal executable and
2314 the shared library. */
2315 if (! bfd_link_pic (info)
2316 && !h->def_regular)
2317 {
2318 h->root.u.def.section = s;
2319 h->root.u.def.value = h->plt.offset;
2320 }
2321
2322 /* Make room for this entry. */
2323 s->size += PLT_ENTRY_SIZE;
2324
2325 /* We also need to make an entry in the .got.plt section. */
2326 htab->elf.sgotplt->size += GOT_ENTRY_SIZE (htab);
2327
2328 /* We also need to make an entry in the .rela.plt section. */
2329 htab->elf.srelplt->size += TILEGX_ELF_RELA_BYTES (htab);
2330 }
2331 else
2332 {
2333 h->plt.offset = (bfd_vma) -1;
2334 h->needs_plt = 0;
2335 }
2336 }
2337 else
2338 {
2339 h->plt.offset = (bfd_vma) -1;
2340 h->needs_plt = 0;
2341 }
2342
2343 /* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
2344 requiring no TLS entry. */
2345 if (h->got.refcount > 0
2346 && !htab->disable_le_transition
2347 && bfd_link_executable (info)
2348 && h->dynindx == -1
2349 && tilegx_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
2350 h->got.offset = (bfd_vma) -1;
2351 else if (h->got.refcount > 0)
2352 {
2353 asection *s;
2354 bfd_boolean dyn;
2355 int tls_type = tilegx_elf_hash_entry(h)->tls_type;
2356
2357 /* Make sure this symbol is output as a dynamic symbol.
2358 Undefined weak syms won't yet be marked as dynamic. */
2359 if (h->dynindx == -1
2360 && !h->forced_local)
2361 {
2362 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2363 return FALSE;
2364 }
2365
2366 s = htab->elf.sgot;
2367 h->got.offset = s->size;
2368 s->size += TILEGX_ELF_WORD_BYTES (htab);
2369 /* TLS_GD entries need 2 consecutive GOT slots. */
2370 if (tls_type == GOT_TLS_GD)
2371 s->size += TILEGX_ELF_WORD_BYTES (htab);
2372 dyn = htab->elf.dynamic_sections_created;
2373 /* TLS_IE needs one dynamic relocation,
2374 TLS_GD needs two if local symbol and two if global. */
2375 if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE)
2376 htab->elf.srelgot->size += 2 * TILEGX_ELF_RELA_BYTES (htab);
2377 else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2378 bfd_link_pic (info),
2379 h))
2380 htab->elf.srelgot->size += TILEGX_ELF_RELA_BYTES (htab);
2381 }
2382 else
2383 h->got.offset = (bfd_vma) -1;
2384
2385 eh = (struct tilegx_elf_link_hash_entry *) h;
2386 if (eh->dyn_relocs == NULL)
2387 return TRUE;
2388
2389 /* In the shared -Bsymbolic case, discard space allocated for
2390 dynamic pc-relative relocs against symbols which turn out to be
2391 defined in regular objects. For the normal shared case, discard
2392 space for pc-relative relocs that have become local due to symbol
2393 visibility changes. */
2394
2395 if (bfd_link_pic (info))
2396 {
2397 if (SYMBOL_CALLS_LOCAL (info, h))
2398 {
2399 struct elf_dyn_relocs **pp;
2400
2401 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2402 {
2403 p->count -= p->pc_count;
2404 p->pc_count = 0;
2405 if (p->count == 0)
2406 *pp = p->next;
2407 else
2408 pp = &p->next;
2409 }
2410 }
2411
2412 /* Also discard relocs on undefined weak syms with non-default
2413 visibility. */
2414 if (eh->dyn_relocs != NULL
2415 && h->root.type == bfd_link_hash_undefweak)
2416 {
2417 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2418 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
2419 eh->dyn_relocs = NULL;
2420
2421 /* Make sure undefined weak symbols are output as a dynamic
2422 symbol in PIEs. */
2423 else if (h->dynindx == -1
2424 && !h->forced_local)
2425 {
2426 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2427 return FALSE;
2428 }
2429 }
2430 }
2431 else
2432 {
2433 /* For the non-shared case, discard space for relocs against
2434 symbols which turn out to need copy relocs or are not
2435 dynamic. */
2436
2437 if (!h->non_got_ref
2438 && ((h->def_dynamic
2439 && !h->def_regular)
2440 || (htab->elf.dynamic_sections_created
2441 && (h->root.type == bfd_link_hash_undefweak
2442 || h->root.type == bfd_link_hash_undefined))))
2443 {
2444 /* Make sure this symbol is output as a dynamic symbol.
2445 Undefined weak syms won't yet be marked as dynamic. */
2446 if (h->dynindx == -1
2447 && !h->forced_local)
2448 {
2449 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2450 return FALSE;
2451 }
2452
2453 /* If that succeeded, we know we'll be keeping all the
2454 relocs. */
2455 if (h->dynindx != -1)
2456 goto keep;
2457 }
2458
2459 eh->dyn_relocs = NULL;
2460
2461 keep: ;
2462 }
2463
2464 /* Finally, allocate space. */
2465 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2466 {
2467 asection *sreloc = elf_section_data (p->sec)->sreloc;
2468 sreloc->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
2469 }
2470
2471 return TRUE;
2472 }
2473
2474 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
2475 read-only sections. */
2476
2477 static bfd_boolean
2478 maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
2479 {
2480 asection *sec;
2481
2482 if (h->root.type == bfd_link_hash_indirect)
2483 return TRUE;
2484
2485 sec = readonly_dynrelocs (h);
2486 if (sec != NULL)
2487 {
2488 struct bfd_link_info *info = (struct bfd_link_info *) info_p;
2489
2490 info->flags |= DF_TEXTREL;
2491 info->callbacks->minfo
2492 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
2493 sec->owner, h->root.root.string, sec);
2494
2495 /* Not an error, just cut short the traversal. */
2496 return FALSE;
2497 }
2498 return TRUE;
2499 }
2500
2501 /* Return true if the dynamic symbol for a given section should be
2502 omitted when creating a shared library. */
2503
2504 bfd_boolean
2505 tilegx_elf_omit_section_dynsym (bfd *output_bfd,
2506 struct bfd_link_info *info,
2507 asection *p)
2508 {
2509 /* We keep the .got section symbol so that explicit relocations
2510 against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2511 can be turned into relocations against the .got symbol. */
2512 if (strcmp (p->name, ".got") == 0)
2513 return FALSE;
2514
2515 return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p);
2516 }
2517
2518 bfd_boolean
2519 tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2520 struct bfd_link_info *info)
2521 {
2522 struct tilegx_elf_link_hash_table *htab;
2523 bfd *dynobj;
2524 asection *s;
2525 bfd *ibfd;
2526
2527 htab = tilegx_elf_hash_table (info);
2528 BFD_ASSERT (htab != NULL);
2529 dynobj = htab->elf.dynobj;
2530 BFD_ASSERT (dynobj != NULL);
2531
2532 if (elf_hash_table (info)->dynamic_sections_created)
2533 {
2534 /* Set the contents of the .interp section to the interpreter. */
2535 if (bfd_link_executable (info) && !info->nointerp)
2536 {
2537 s = bfd_get_linker_section (dynobj, ".interp");
2538 BFD_ASSERT (s != NULL);
2539 s->size = strlen (htab->dynamic_interpreter) + 1;
2540 s->contents = (unsigned char *) htab->dynamic_interpreter;
2541 }
2542 }
2543
2544 /* Set up .got offsets for local syms, and space for local dynamic
2545 relocs. */
2546 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2547 {
2548 bfd_signed_vma *local_got;
2549 bfd_signed_vma *end_local_got;
2550 char *local_tls_type;
2551 bfd_size_type locsymcount;
2552 Elf_Internal_Shdr *symtab_hdr;
2553 asection *srel;
2554
2555 if (! is_tilegx_elf (ibfd))
2556 continue;
2557
2558 for (s = ibfd->sections; s != NULL; s = s->next)
2559 {
2560 struct elf_dyn_relocs *p;
2561
2562 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2563 {
2564 if (!bfd_is_abs_section (p->sec)
2565 && bfd_is_abs_section (p->sec->output_section))
2566 {
2567 /* Input section has been discarded, either because
2568 it is a copy of a linkonce section or due to
2569 linker script /DISCARD/, so we'll be discarding
2570 the relocs too. */
2571 }
2572 else if (p->count != 0)
2573 {
2574 srel = elf_section_data (p->sec)->sreloc;
2575 srel->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
2576 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2577 {
2578 info->flags |= DF_TEXTREL;
2579
2580 info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
2581 p->sec->owner, p->sec);
2582 }
2583 }
2584 }
2585 }
2586
2587 local_got = elf_local_got_refcounts (ibfd);
2588 if (!local_got)
2589 continue;
2590
2591 symtab_hdr = &elf_symtab_hdr (ibfd);
2592 locsymcount = symtab_hdr->sh_info;
2593 end_local_got = local_got + locsymcount;
2594 local_tls_type = _bfd_tilegx_elf_local_got_tls_type (ibfd);
2595 s = htab->elf.sgot;
2596 srel = htab->elf.srelgot;
2597 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2598 {
2599 if (*local_got > 0)
2600 {
2601 *local_got = s->size;
2602 s->size += TILEGX_ELF_WORD_BYTES (htab);
2603 if (*local_tls_type == GOT_TLS_GD)
2604 s->size += TILEGX_ELF_WORD_BYTES (htab);
2605 if (bfd_link_pic (info)
2606 || *local_tls_type == GOT_TLS_GD
2607 || *local_tls_type == GOT_TLS_IE)
2608 srel->size += TILEGX_ELF_RELA_BYTES (htab);
2609 }
2610 else
2611 *local_got = (bfd_vma) -1;
2612 }
2613 }
2614
2615 /* Allocate global sym .plt and .got entries, and space for global
2616 sym dynamic relocs. */
2617 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2618
2619 if (elf_hash_table (info)->dynamic_sections_created)
2620 {
2621 /* If the .got section is more than 0x8000 bytes, we add
2622 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
2623 bit relocations have a greater chance of working. */
2624 if (htab->elf.sgot->size >= 0x8000
2625 && elf_hash_table (info)->hgot->root.u.def.value == 0)
2626 elf_hash_table (info)->hgot->root.u.def.value = 0x8000;
2627 }
2628
2629 if (htab->elf.sgotplt)
2630 {
2631 struct elf_link_hash_entry *got;
2632 got = elf_link_hash_lookup (elf_hash_table (info),
2633 "_GLOBAL_OFFSET_TABLE_",
2634 FALSE, FALSE, FALSE);
2635
2636 /* Don't allocate .got.plt section if there are no GOT nor PLT
2637 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
2638 if ((got == NULL
2639 || !got->ref_regular_nonweak)
2640 && (htab->elf.sgotplt->size
2641 == (unsigned)GOTPLT_HEADER_SIZE (htab))
2642 && (htab->elf.splt == NULL
2643 || htab->elf.splt->size == 0)
2644 && (htab->elf.sgot == NULL
2645 || (htab->elf.sgot->size
2646 == get_elf_backend_data (output_bfd)->got_header_size)))
2647 htab->elf.sgotplt->size = 0;
2648 }
2649
2650 /* The check_relocs and adjust_dynamic_symbol entry points have
2651 determined the sizes of the various dynamic sections. Allocate
2652 memory for them. */
2653 for (s = dynobj->sections; s != NULL; s = s->next)
2654 {
2655 if ((s->flags & SEC_LINKER_CREATED) == 0)
2656 continue;
2657
2658 if (s == htab->elf.splt
2659 || s == htab->elf.sgot
2660 || s == htab->elf.sgotplt
2661 || s == htab->elf.sdynbss
2662 || s == htab->elf.sdynrelro)
2663 {
2664 /* Strip this section if we don't need it; see the
2665 comment below. */
2666 }
2667 else if (strncmp (s->name, ".rela", 5) == 0)
2668 {
2669 if (s->size != 0)
2670 {
2671 /* We use the reloc_count field as a counter if we need
2672 to copy relocs into the output file. */
2673 s->reloc_count = 0;
2674 }
2675 }
2676 else
2677 {
2678 /* It's not one of our sections. */
2679 continue;
2680 }
2681
2682 if (s->size == 0)
2683 {
2684 /* If we don't need this section, strip it from the
2685 output file. This is mostly to handle .rela.bss and
2686 .rela.plt. We must create both sections in
2687 create_dynamic_sections, because they must be created
2688 before the linker maps input sections to output
2689 sections. The linker does that before
2690 adjust_dynamic_symbol is called, and it is that
2691 function which decides whether anything needs to go
2692 into these sections. */
2693 s->flags |= SEC_EXCLUDE;
2694 continue;
2695 }
2696
2697 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2698 continue;
2699
2700 /* Allocate memory for the section contents. Zero the memory
2701 for the benefit of .rela.plt, which has 4 unused entries
2702 at the beginning, and we don't want garbage. */
2703 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2704 if (s->contents == NULL)
2705 return FALSE;
2706 }
2707
2708 if (elf_hash_table (info)->dynamic_sections_created)
2709 {
2710 /* Add some entries to the .dynamic section. We fill in the
2711 values later, in tilegx_elf_finish_dynamic_sections, but we
2712 must add the entries now so that we get the correct size for
2713 the .dynamic section. The DT_DEBUG entry is filled in by the
2714 dynamic linker and used by the debugger. */
2715 #define add_dynamic_entry(TAG, VAL) \
2716 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2717
2718 if (bfd_link_executable (info))
2719 {
2720 if (!add_dynamic_entry (DT_DEBUG, 0))
2721 return FALSE;
2722 }
2723
2724 if (htab->elf.srelplt->size != 0)
2725 {
2726 if (!add_dynamic_entry (DT_PLTGOT, 0)
2727 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2728 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2729 || !add_dynamic_entry (DT_JMPREL, 0))
2730 return FALSE;
2731 }
2732
2733 if (!add_dynamic_entry (DT_RELA, 0)
2734 || !add_dynamic_entry (DT_RELASZ, 0)
2735 || !add_dynamic_entry (DT_RELAENT, TILEGX_ELF_RELA_BYTES (htab)))
2736 return FALSE;
2737
2738 /* If any dynamic relocs apply to a read-only section,
2739 then we need a DT_TEXTREL entry. */
2740 if ((info->flags & DF_TEXTREL) == 0)
2741 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
2742
2743 if (info->flags & DF_TEXTREL)
2744 {
2745 if (!add_dynamic_entry (DT_TEXTREL, 0))
2746 return FALSE;
2747 }
2748 }
2749 #undef add_dynamic_entry
2750
2751 return TRUE;
2752 }
2753
2754 /* Return the base VMA address which should be subtracted from real addresses
2756 when resolving @dtpoff relocation.
2757 This is PT_TLS segment p_vaddr. */
2758
2759 static bfd_vma
2760 dtpoff_base (struct bfd_link_info *info)
2761 {
2762 /* If tls_sec is NULL, we should have signalled an error already. */
2763 if (elf_hash_table (info)->tls_sec == NULL)
2764 return 0;
2765 return elf_hash_table (info)->tls_sec->vma;
2766 }
2767
2768 /* Return the relocation value for @tpoff relocation. */
2769
2770 static bfd_vma
2771 tpoff (struct bfd_link_info *info, bfd_vma address)
2772 {
2773 struct elf_link_hash_table *htab = elf_hash_table (info);
2774
2775 /* If tls_sec is NULL, we should have signalled an error already. */
2776 if (htab->tls_sec == NULL)
2777 return 0;
2778
2779 return (address - htab->tls_sec->vma);
2780 }
2781
2782 /* Copy SIZE bits from FROM to TO at address ADDR. */
2783
2784 static void
2785 tilegx_copy_bits (bfd_byte *addr, int from, int to, int size)
2786 {
2787 int i;
2788 for (i = 0; i < size; i++)
2789 {
2790 int from_byte = (from + i) / 8;
2791 int from_bit = (from + i) % 8;
2792 int to_byte = (to + i) / 8;
2793 int to_bit = (to + i) % 8;
2794 bfd_byte to_mask = 1 << to_bit;
2795 addr[to_byte] = (addr[to_byte] & ~to_mask)
2796 | ((addr[from_byte] >> from_bit << to_bit) & to_mask);
2797 }
2798 }
2799
2800 /* Replace the MASK bits in ADDR with those in INSN, for the next
2801 TILEGX_BUNDLE_SIZE_IN_BYTES bytes. */
2802
2803 static void
2804 tilegx_replace_insn (bfd_byte *addr, const bfd_byte *mask,
2805 const bfd_byte *insn)
2806 {
2807 int i;
2808 for (i = 0; i < TILEGX_BUNDLE_SIZE_IN_BYTES; i++)
2809 {
2810 addr[i] = (addr[i] & ~mask[i]) | (insn[i] & mask[i]);
2811 }
2812 }
2813
2814 /* Mask to extract the bits corresponding to an instruction in a
2815 specific pipe of a bundle. */
2816 static const bfd_byte insn_mask_X1[] = {
2817 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f
2818 };
2819
2820 /* Mask to extract the bits corresponding to an instruction in a
2821 specific pipe of a bundle, minus the destination operand and the
2822 first source operand. */
2823 static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
2824 0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
2825 };
2826
2827 static const bfd_byte insn_mask_X1_no_dest_no_srca[] = {
2828 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x3f
2829 };
2830
2831 static const bfd_byte insn_mask_Y0_no_dest_no_srca[] = {
2832 0x00, 0xf0, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00
2833 };
2834 static const bfd_byte insn_mask_Y1_no_dest_no_srca[] = {
2835 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x3c
2836 };
2837
2838 /* Mask to extract the bits corresponding to an instruction in a
2839 specific pipe of a bundle, minus the register operands. */
2840 static const bfd_byte insn_mask_X0_no_operand[] = {
2841 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00
2842 };
2843
2844 static const bfd_byte insn_mask_X1_no_operand[] = {
2845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f
2846 };
2847
2848 static const bfd_byte insn_mask_Y0_no_operand[] = {
2849 0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00
2850 };
2851
2852 static const bfd_byte insn_mask_Y1_no_operand[] = {
2853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3c
2854 };
2855
2856 /* Various instructions synthesized to support tls references. */
2857
2858 /* ld r0, r0 in the X1 pipe, used for tls ie. */
2859 static const bfd_byte insn_tls_ie_ld_X1[] = {
2860 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6a, 0x28
2861 };
2862
2863 /* ld4s r0, r0 in the X1 pipe, used for tls ie. */
2864 static const bfd_byte insn_tls_ie_ld4s_X1[] = {
2865 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x6a, 0x28
2866 };
2867
2868 /* add r0, r0, tp in various pipes, used for tls ie. */
2869 static const bfd_byte insn_tls_ie_add_X0X1[] = {
2870 0x00, 0x50, 0x0f, 0x50, 0x00, 0xa8, 0x07, 0x28
2871 };
2872 static const bfd_byte insn_tls_ie_add_Y0Y1[] = {
2873 0x00, 0x50, 0x27, 0x2c, 0x00, 0xa8, 0x13, 0x9a
2874 };
2875
2876 /* addx r0, r0, tp in various pipes, used for tls ie. */
2877 static const bfd_byte insn_tls_ie_addx_X0X1[] = {
2878 0x00, 0x50, 0x0b, 0x50, 0x00, 0xa8, 0x05, 0x28
2879 };
2880 static const bfd_byte insn_tls_ie_addx_Y0Y1[] = {
2881 0x00, 0x50, 0x03, 0x2c, 0x00, 0xa8, 0x01, 0x9a
2882 };
2883
2884 /* move r0, r0 in various pipes, used for tls gd. */
2885 static const bfd_byte insn_tls_gd_add_X0X1[] = {
2886 0x00, 0xf0, 0x07, 0x51, 0x00, 0xf8, 0x3b, 0x28
2887 };
2888 static const bfd_byte insn_tls_gd_add_Y0Y1[] = {
2889 0x00, 0xf0, 0x0b, 0x54, 0x00, 0xf8, 0x05, 0xae
2890 };
2891
2892 static const bfd_byte *insn_move_X0X1 = insn_tls_gd_add_X0X1;
2893 static const bfd_byte *insn_move_Y0Y1 = insn_tls_gd_add_Y0Y1;
2894
2895 static const bfd_byte *insn_add_X0X1 = insn_tls_ie_add_X0X1;
2896 static const bfd_byte *insn_add_Y0Y1 = insn_tls_ie_add_Y0Y1;
2897
2898 static const bfd_byte *insn_addx_X0X1 = insn_tls_ie_addx_X0X1;
2899 static const bfd_byte *insn_addx_Y0Y1 = insn_tls_ie_addx_Y0Y1;
2900
2901 /* Relocate an TILEGX ELF section.
2902
2903 The RELOCATE_SECTION function is called by the new ELF backend linker
2904 to handle the relocations for a section.
2905
2906 The relocs are always passed as Rela structures.
2907
2908 This function is responsible for adjusting the section contents as
2909 necessary, and (if generating a relocatable output file) adjusting
2910 the reloc addend as necessary.
2911
2912 This function does not have to worry about setting the reloc
2913 address or the reloc symbol index.
2914
2915 LOCAL_SYMS is a pointer to the swapped in local symbols.
2916
2917 LOCAL_SECTIONS is an array giving the section in the input file
2918 corresponding to the st_shndx field of each local symbol.
2919
2920 The global hash table entry for the global symbols can be found
2921 via elf_sym_hashes (input_bfd).
2922
2923 When generating relocatable output, this function must handle
2924 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
2925 going to be the section symbol corresponding to the output
2926 section, which means that the addend must be adjusted
2927 accordingly. */
2928
2929 bfd_boolean
2930 tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2931 bfd *input_bfd, asection *input_section,
2932 bfd_byte *contents, Elf_Internal_Rela *relocs,
2933 Elf_Internal_Sym *local_syms,
2934 asection **local_sections)
2935 {
2936 struct tilegx_elf_link_hash_table *htab;
2937 Elf_Internal_Shdr *symtab_hdr;
2938 struct elf_link_hash_entry **sym_hashes;
2939 bfd_vma *local_got_offsets;
2940 bfd_vma got_base;
2941 asection *sreloc;
2942 Elf_Internal_Rela *rel;
2943 Elf_Internal_Rela *relend;
2944 int num_relocs;
2945
2946 htab = tilegx_elf_hash_table (info);
2947 BFD_ASSERT (htab != NULL);
2948 symtab_hdr = &elf_symtab_hdr (input_bfd);
2949 sym_hashes = elf_sym_hashes (input_bfd);
2950 local_got_offsets = elf_local_got_offsets (input_bfd);
2951
2952 if (elf_hash_table (info)->hgot == NULL)
2953 got_base = 0;
2954 else
2955 got_base = elf_hash_table (info)->hgot->root.u.def.value;
2956
2957 sreloc = elf_section_data (input_section)->sreloc;
2958
2959 rel = relocs;
2960 num_relocs = input_section->reloc_count;
2961 relend = relocs + num_relocs;
2962 for (; rel < relend; rel++)
2963 {
2964 int r_type, tls_type;
2965 bfd_boolean is_tls_iele, is_tls_le;
2966 reloc_howto_type *howto;
2967 unsigned long r_symndx;
2968 struct elf_link_hash_entry *h;
2969 Elf_Internal_Sym *sym;
2970 tilegx_create_func create_func;
2971 asection *sec;
2972 bfd_vma relocation;
2973 bfd_reloc_status_type r;
2974 const char *name;
2975 bfd_vma off;
2976 bfd_boolean is_plt = FALSE;
2977 bfd_boolean resolved_to_zero;
2978 bfd_boolean unresolved_reloc;
2979
2980 r_type = TILEGX_ELF_R_TYPE (rel->r_info);
2981 if (r_type == R_TILEGX_GNU_VTINHERIT
2982 || r_type == R_TILEGX_GNU_VTENTRY)
2983 continue;
2984
2985 if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table))
2986 return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
2987
2988 howto = tilegx_elf_howto_table + r_type;
2989
2990 /* This is a final link. */
2991 r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
2992 h = NULL;
2993 sym = NULL;
2994 sec = NULL;
2995 unresolved_reloc = FALSE;
2996 if (r_symndx < symtab_hdr->sh_info)
2997 {
2998 sym = local_syms + r_symndx;
2999 sec = local_sections[r_symndx];
3000 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3001 }
3002 else
3003 {
3004 bfd_boolean warned ATTRIBUTE_UNUSED;
3005 bfd_boolean ignored ATTRIBUTE_UNUSED;
3006
3007 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3008 r_symndx, symtab_hdr, sym_hashes,
3009 h, sec, relocation,
3010 unresolved_reloc, warned, ignored);
3011 if (warned)
3012 {
3013 /* To avoid generating warning messages about truncated
3014 relocations, set the relocation's address to be the same as
3015 the start of this section. */
3016 if (input_section->output_section != NULL)
3017 relocation = input_section->output_section->vma;
3018 else
3019 relocation = 0;
3020 }
3021 }
3022
3023 if (sec != NULL && discarded_section (sec))
3024 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3025 rel, 1, relend, howto, 0, contents);
3026
3027 if (bfd_link_relocatable (info))
3028 continue;
3029
3030 if (h != NULL)
3031 name = h->root.root.string;
3032 else
3033 {
3034 name = (bfd_elf_string_from_elf_section
3035 (input_bfd, symtab_hdr->sh_link, sym->st_name));
3036 if (name == NULL || *name == '\0')
3037 name = bfd_section_name (sec);
3038 }
3039
3040 switch (r_type)
3041 {
3042 case R_TILEGX_TLS_GD_CALL:
3043 case R_TILEGX_IMM8_X0_TLS_GD_ADD:
3044 case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3045 case R_TILEGX_IMM8_X1_TLS_GD_ADD:
3046 case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3047 case R_TILEGX_IMM8_X0_TLS_ADD:
3048 case R_TILEGX_IMM8_Y0_TLS_ADD:
3049 case R_TILEGX_IMM8_X1_TLS_ADD:
3050 case R_TILEGX_IMM8_Y1_TLS_ADD:
3051 tls_type = GOT_UNKNOWN;
3052 if (h == NULL && local_got_offsets)
3053 tls_type =
3054 _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
3055 else if (h != NULL)
3056 tls_type = tilegx_elf_hash_entry(h)->tls_type;
3057
3058 is_tls_iele = (bfd_link_executable (info) || tls_type == GOT_TLS_IE);
3059 is_tls_le = is_tls_iele && (!input_section->sec_flg0
3060 && bfd_link_executable (info)
3061 && (h == NULL || h->dynindx == -1));
3062
3063 if (r_type == R_TILEGX_TLS_GD_CALL)
3064 {
3065 if (is_tls_le)
3066 {
3067 /* GD -> LE */
3068 tilegx_replace_insn (contents + rel->r_offset,
3069 insn_mask_X1, insn_move_X0X1);
3070 continue;
3071 }
3072 else if (is_tls_iele)
3073 {
3074 /* GD -> IE */
3075 if (ABI_64_P (output_bfd))
3076 tilegx_replace_insn (contents + rel->r_offset,
3077 insn_mask_X1, insn_tls_ie_ld_X1);
3078 else
3079 tilegx_replace_insn (contents + rel->r_offset,
3080 insn_mask_X1, insn_tls_ie_ld4s_X1);
3081 continue;
3082 }
3083
3084 /* GD -> GD */
3085 h = (struct elf_link_hash_entry *)
3086 bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
3087 FALSE, TRUE);
3088 BFD_ASSERT (h != NULL);
3089 r_type = R_TILEGX_JUMPOFF_X1_PLT;
3090 howto = tilegx_elf_howto_table + r_type;
3091 }
3092 else if (r_type == R_TILEGX_IMM8_X0_TLS_ADD
3093 || r_type == R_TILEGX_IMM8_X1_TLS_ADD
3094 || r_type == R_TILEGX_IMM8_Y0_TLS_ADD
3095 || r_type == R_TILEGX_IMM8_Y1_TLS_ADD)
3096 {
3097 bfd_boolean is_pipe0 =
3098 (r_type == R_TILEGX_IMM8_X0_TLS_ADD
3099 || r_type == R_TILEGX_IMM8_Y0_TLS_ADD);
3100 bfd_boolean is_X0X1 =
3101 (r_type == R_TILEGX_IMM8_X0_TLS_ADD
3102 || r_type == R_TILEGX_IMM8_X1_TLS_ADD);
3103 int dest_begin = is_pipe0 ? 0 : 31;
3104 int src_begin;
3105 const bfd_byte *insn;
3106 const bfd_byte *mask = NULL;
3107
3108 if (is_tls_le)
3109 {
3110 /* 1. copy dest operand into the first source operand.
3111 2. change the opcode to "move". */
3112 src_begin = is_pipe0 ? 6 : 37;
3113 insn = is_X0X1 ? insn_move_X0X1 : insn_move_Y0Y1;
3114
3115 switch (r_type)
3116 {
3117 case R_TILEGX_IMM8_X0_TLS_ADD:
3118 mask = insn_mask_X0_no_dest_no_srca;
3119 break;
3120 case R_TILEGX_IMM8_X1_TLS_ADD:
3121 mask = insn_mask_X1_no_dest_no_srca;
3122 break;
3123 case R_TILEGX_IMM8_Y0_TLS_ADD:
3124 mask = insn_mask_Y0_no_dest_no_srca;
3125 break;
3126 case R_TILEGX_IMM8_Y1_TLS_ADD:
3127 mask = insn_mask_Y1_no_dest_no_srca;
3128 break;
3129 }
3130 }
3131 else
3132 {
3133 /* 1. copy dest operand into the second source operand.
3134 2. change the opcode to "add". */
3135 src_begin = is_pipe0 ? 12 : 43;
3136 if (ABI_64_P (output_bfd))
3137 insn = is_X0X1 ? insn_add_X0X1 : insn_add_Y0Y1;
3138 else
3139 insn = is_X0X1 ? insn_addx_X0X1 : insn_addx_Y0Y1;
3140
3141 switch (r_type)
3142 {
3143 case R_TILEGX_IMM8_X0_TLS_ADD:
3144 mask = insn_mask_X0_no_operand;
3145 break;
3146 case R_TILEGX_IMM8_X1_TLS_ADD:
3147 mask = insn_mask_X1_no_operand;
3148 break;
3149 case R_TILEGX_IMM8_Y0_TLS_ADD:
3150 mask = insn_mask_Y0_no_operand;
3151 break;
3152 case R_TILEGX_IMM8_Y1_TLS_ADD:
3153 mask = insn_mask_Y1_no_operand;
3154 break;
3155 }
3156 }
3157
3158 tilegx_copy_bits (contents + rel->r_offset, dest_begin,
3159 src_begin, 6);
3160 tilegx_replace_insn (contents + rel->r_offset, mask, insn);
3161
3162 continue;
3163 }
3164 else
3165 {
3166 const bfd_byte *mask = NULL;
3167 const bfd_byte *add_insn = NULL;
3168 bfd_boolean is_64bit = ABI_64_P (output_bfd);
3169
3170 switch (r_type)
3171 {
3172 case R_TILEGX_IMM8_X0_TLS_GD_ADD:
3173 add_insn = is_tls_iele
3174 ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
3175 : insn_tls_gd_add_X0X1;
3176 mask = insn_mask_X0_no_dest_no_srca;
3177 break;
3178 case R_TILEGX_IMM8_X1_TLS_GD_ADD:
3179 add_insn = is_tls_iele
3180 ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
3181 : insn_tls_gd_add_X0X1;
3182 mask = insn_mask_X1_no_dest_no_srca;
3183 break;
3184 case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
3185 add_insn = is_tls_iele
3186 ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
3187 : insn_tls_gd_add_Y0Y1;
3188 mask = insn_mask_Y0_no_dest_no_srca;
3189 break;
3190 case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
3191 add_insn = is_tls_iele
3192 ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
3193 : insn_tls_gd_add_Y0Y1;
3194 mask = insn_mask_Y1_no_dest_no_srca;
3195 break;
3196 }
3197
3198 tilegx_replace_insn (contents + rel->r_offset, mask, add_insn);
3199
3200 continue;
3201 }
3202 break;
3203 case R_TILEGX_TLS_IE_LOAD:
3204 if (!input_section->sec_flg0
3205 && bfd_link_executable (info)
3206 && (h == NULL || h->dynindx == -1))
3207 {
3208 /* IE -> LE */
3209 tilegx_replace_insn (contents + rel->r_offset,
3210 insn_mask_X1_no_dest_no_srca,
3211 insn_move_X0X1);
3212 }
3213 else
3214 {
3215 /* IE -> IE */
3216 if (ABI_64_P (output_bfd))
3217 tilegx_replace_insn (contents + rel->r_offset,
3218 insn_mask_X1_no_dest_no_srca,
3219 insn_tls_ie_ld_X1);
3220 else
3221 tilegx_replace_insn (contents + rel->r_offset,
3222 insn_mask_X1_no_dest_no_srca,
3223 insn_tls_ie_ld4s_X1);
3224 }
3225 continue;
3226 break;
3227 default:
3228 break;
3229 }
3230
3231 resolved_to_zero = (h != NULL
3232 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
3233
3234 switch (r_type)
3235 {
3236 case R_TILEGX_IMM16_X0_HW0_GOT:
3237 case R_TILEGX_IMM16_X1_HW0_GOT:
3238 case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
3239 case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
3240 case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
3241 case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
3242 /* Relocation is to the entry for this symbol in the global
3243 offset table. */
3244 if (htab->elf.sgot == NULL)
3245 abort ();
3246
3247 if (h != NULL)
3248 {
3249 bfd_boolean dyn;
3250
3251 off = h->got.offset;
3252 BFD_ASSERT (off != (bfd_vma) -1);
3253 dyn = elf_hash_table (info)->dynamic_sections_created;
3254
3255 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3256 bfd_link_pic (info),
3257 h)
3258 || (bfd_link_pic (info)
3259 && SYMBOL_REFERENCES_LOCAL (info, h)))
3260 {
3261 /* This is actually a static link, or it is a
3262 -Bsymbolic link and the symbol is defined
3263 locally, or the symbol was forced to be local
3264 because of a version file. We must initialize
3265 this entry in the global offset table. Since the
3266 offset must always be a multiple
3267 of 8 for 64-bit, we use the least significant bit
3268 to record whether we have initialized it already.
3269
3270 When doing a dynamic link, we create a .rela.got
3271 relocation entry to initialize the value. This
3272 is done in the finish_dynamic_symbol routine. */
3273 if ((off & 1) != 0)
3274 off &= ~1;
3275 else
3276 {
3277 TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
3278 htab->elf.sgot->contents + off);
3279 h->got.offset |= 1;
3280 }
3281 }
3282 else
3283 unresolved_reloc = FALSE;
3284 }
3285 else
3286 {
3287 BFD_ASSERT (local_got_offsets != NULL
3288 && local_got_offsets[r_symndx] != (bfd_vma) -1);
3289
3290 off = local_got_offsets[r_symndx];
3291
3292 /* The offset must always be a multiple of 8 on 64-bit.
3293 We use the least significant bit to record
3294 whether we have already processed this entry. */
3295 if ((off & 1) != 0)
3296 off &= ~1;
3297 else
3298 {
3299 if (bfd_link_pic (info))
3300 {
3301 asection *s;
3302 Elf_Internal_Rela outrel;
3303
3304 /* We need to generate a R_TILEGX_RELATIVE reloc
3305 for the dynamic linker. */
3306 s = htab->elf.srelgot;
3307 BFD_ASSERT (s != NULL);
3308
3309 outrel.r_offset = (htab->elf.sgot->output_section->vma
3310 + htab->elf.sgot->output_offset
3311 + off);
3312 outrel.r_info =
3313 TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
3314 outrel.r_addend = relocation;
3315 relocation = 0;
3316 tilegx_elf_append_rela (output_bfd, s, &outrel);
3317 }
3318
3319 TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
3320 htab->elf.sgot->contents + off);
3321 local_got_offsets[r_symndx] |= 1;
3322 }
3323 }
3324 relocation = off - got_base;
3325 break;
3326
3327 case R_TILEGX_JUMPOFF_X1_PLT:
3328 case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
3329 case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
3330 case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
3331 case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
3332 case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
3333 case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
3334 case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
3335 case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
3336 case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
3337 case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
3338 case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
3339 case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
3340 case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
3341 case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
3342 /* Relocation is to the entry for this symbol in the
3343 procedure linkage table. */
3344 BFD_ASSERT (h != NULL);
3345
3346 if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3347 {
3348 /* We didn't make a PLT entry for this symbol. This
3349 happens when statically linking PIC code, or when
3350 using -Bsymbolic. */
3351 break;
3352 }
3353
3354 relocation = (htab->elf.splt->output_section->vma
3355 + htab->elf.splt->output_offset
3356 + h->plt.offset);
3357 unresolved_reloc = FALSE;
3358 break;
3359
3360 case R_TILEGX_64_PCREL:
3361 case R_TILEGX_32_PCREL:
3362 case R_TILEGX_16_PCREL:
3363 case R_TILEGX_8_PCREL:
3364 case R_TILEGX_IMM16_X0_HW0_PCREL:
3365 case R_TILEGX_IMM16_X1_HW0_PCREL:
3366 case R_TILEGX_IMM16_X0_HW1_PCREL:
3367 case R_TILEGX_IMM16_X1_HW1_PCREL:
3368 case R_TILEGX_IMM16_X0_HW2_PCREL:
3369 case R_TILEGX_IMM16_X1_HW2_PCREL:
3370 case R_TILEGX_IMM16_X0_HW3_PCREL:
3371 case R_TILEGX_IMM16_X1_HW3_PCREL:
3372 case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
3373 case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
3374 case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
3375 case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
3376 case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
3377 case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
3378 if (h != NULL
3379 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3380 break;
3381 /* Fall through. */
3382 case R_TILEGX_64:
3383 case R_TILEGX_32:
3384 case R_TILEGX_16:
3385 case R_TILEGX_8:
3386 case R_TILEGX_HW0:
3387 case R_TILEGX_HW1:
3388 case R_TILEGX_HW2:
3389 case R_TILEGX_HW3:
3390 case R_TILEGX_HW0_LAST:
3391 case R_TILEGX_HW1_LAST:
3392 case R_TILEGX_HW2_LAST:
3393 case R_TILEGX_COPY:
3394 case R_TILEGX_GLOB_DAT:
3395 case R_TILEGX_JMP_SLOT:
3396 case R_TILEGX_RELATIVE:
3397 case R_TILEGX_BROFF_X1:
3398 case R_TILEGX_JUMPOFF_X1:
3399 case R_TILEGX_IMM8_X0:
3400 case R_TILEGX_IMM8_Y0:
3401 case R_TILEGX_IMM8_X1:
3402 case R_TILEGX_IMM8_Y1:
3403 case R_TILEGX_DEST_IMM8_X1:
3404 case R_TILEGX_MT_IMM14_X1:
3405 case R_TILEGX_MF_IMM14_X1:
3406 case R_TILEGX_MMSTART_X0:
3407 case R_TILEGX_MMEND_X0:
3408 case R_TILEGX_SHAMT_X0:
3409 case R_TILEGX_SHAMT_X1:
3410 case R_TILEGX_SHAMT_Y0:
3411 case R_TILEGX_SHAMT_Y1:
3412 case R_TILEGX_IMM16_X0_HW0:
3413 case R_TILEGX_IMM16_X1_HW0:
3414 case R_TILEGX_IMM16_X0_HW1:
3415 case R_TILEGX_IMM16_X1_HW1:
3416 case R_TILEGX_IMM16_X0_HW2:
3417 case R_TILEGX_IMM16_X1_HW2:
3418 case R_TILEGX_IMM16_X0_HW3:
3419 case R_TILEGX_IMM16_X1_HW3:
3420 case R_TILEGX_IMM16_X0_HW0_LAST:
3421 case R_TILEGX_IMM16_X1_HW0_LAST:
3422 case R_TILEGX_IMM16_X0_HW1_LAST:
3423 case R_TILEGX_IMM16_X1_HW1_LAST:
3424 case R_TILEGX_IMM16_X0_HW2_LAST:
3425 case R_TILEGX_IMM16_X1_HW2_LAST:
3426 if ((input_section->flags & SEC_ALLOC) == 0)
3427 break;
3428
3429 if ((bfd_link_pic (info)
3430 && (h == NULL
3431 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3432 && !resolved_to_zero)
3433 || h->root.type != bfd_link_hash_undefweak)
3434 && (! howto->pc_relative
3435 || !SYMBOL_CALLS_LOCAL (info, h)))
3436 || (!bfd_link_pic (info)
3437 && h != NULL
3438 && h->dynindx != -1
3439 && !h->non_got_ref
3440 && ((h->def_dynamic
3441 && !h->def_regular)
3442 || h->root.type == bfd_link_hash_undefweak
3443 || h->root.type == bfd_link_hash_undefined)))
3444 {
3445 Elf_Internal_Rela outrel;
3446 bfd_boolean skip, relocate = FALSE;
3447
3448 /* When generating a shared object, these relocations
3449 are copied into the output file to be resolved at run
3450 time. */
3451
3452 BFD_ASSERT (sreloc != NULL);
3453
3454 skip = FALSE;
3455
3456 outrel.r_offset =
3457 _bfd_elf_section_offset (output_bfd, info, input_section,
3458 rel->r_offset);
3459 if (outrel.r_offset == (bfd_vma) -1)
3460 skip = TRUE;
3461 else if (outrel.r_offset == (bfd_vma) -2)
3462 skip = TRUE, relocate = TRUE;
3463 outrel.r_offset += (input_section->output_section->vma
3464 + input_section->output_offset);
3465
3466 switch (r_type)
3467 {
3468 case R_TILEGX_64_PCREL:
3469 case R_TILEGX_32_PCREL:
3470 case R_TILEGX_16_PCREL:
3471 case R_TILEGX_8_PCREL:
3472 /* If the symbol is not dynamic, we should not keep
3473 a dynamic relocation. But an .rela.* slot has been
3474 allocated for it, output R_TILEGX_NONE.
3475 FIXME: Add code tracking needed dynamic relocs as
3476 e.g. i386 has. */
3477 if (h->dynindx == -1)
3478 skip = TRUE, relocate = TRUE;
3479 break;
3480 }
3481
3482 if (skip)
3483 memset (&outrel, 0, sizeof outrel);
3484 /* h->dynindx may be -1 if the symbol was marked to
3485 become local. */
3486 else if (h != NULL &&
3487 h->dynindx != -1
3488 && (! is_plt
3489 || !bfd_link_pic (info)
3490 || !SYMBOLIC_BIND (info, h)
3491 || !h->def_regular))
3492 {
3493 BFD_ASSERT (h->dynindx != -1);
3494 outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3495 outrel.r_addend = rel->r_addend;
3496 }
3497 else
3498 {
3499 if (r_type == R_TILEGX_32 || r_type == R_TILEGX_64)
3500 {
3501 outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0,
3502 R_TILEGX_RELATIVE);
3503 outrel.r_addend = relocation + rel->r_addend;
3504 }
3505 else
3506 {
3507 long indx;
3508
3509 outrel.r_addend = relocation + rel->r_addend;
3510
3511 if (is_plt)
3512 sec = htab->elf.splt;
3513
3514 if (bfd_is_abs_section (sec))
3515 indx = 0;
3516 else if (sec == NULL || sec->owner == NULL)
3517 {
3518 bfd_set_error (bfd_error_bad_value);
3519 return FALSE;
3520 }
3521 else
3522 {
3523 asection *osec;
3524
3525 /* We are turning this relocation into one
3526 against a section symbol. It would be
3527 proper to subtract the symbol's value,
3528 osec->vma, from the emitted reloc addend,
3529 but ld.so expects buggy relocs. */
3530 osec = sec->output_section;
3531 indx = elf_section_data (osec)->dynindx;
3532
3533 if (indx == 0)
3534 {
3535 osec = htab->elf.text_index_section;
3536 indx = elf_section_data (osec)->dynindx;
3537 }
3538
3539 /* FIXME: we really should be able to link non-pic
3540 shared libraries. */
3541 if (indx == 0)
3542 {
3543 BFD_FAIL ();
3544 _bfd_error_handler
3545 (_("%pB: probably compiled without -fPIC?"),
3546 input_bfd);
3547 bfd_set_error (bfd_error_bad_value);
3548 return FALSE;
3549 }
3550 }
3551
3552 outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, indx,
3553 r_type);
3554 }
3555 }
3556
3557 tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
3558
3559 /* This reloc will be computed at runtime, so there's no
3560 need to do anything now. */
3561 if (! relocate)
3562 continue;
3563 }
3564 break;
3565
3566 case R_TILEGX_IMM16_X0_HW0_TLS_LE:
3567 case R_TILEGX_IMM16_X1_HW0_TLS_LE:
3568 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
3569 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
3570 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
3571 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
3572 if (!bfd_link_executable (info))
3573 {
3574 Elf_Internal_Rela outrel;
3575 bfd_boolean skip;
3576
3577 BFD_ASSERT (sreloc != NULL);
3578 skip = FALSE;
3579 outrel.r_offset =
3580 _bfd_elf_section_offset (output_bfd, info, input_section,
3581 rel->r_offset);
3582 if (outrel.r_offset == (bfd_vma) -1)
3583 skip = TRUE;
3584 else if (outrel.r_offset == (bfd_vma) -2)
3585 skip = TRUE;
3586 outrel.r_offset += (input_section->output_section->vma
3587 + input_section->output_offset);
3588 if (skip)
3589 memset (&outrel, 0, sizeof outrel);
3590 else
3591 {
3592 outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, r_type);
3593 outrel.r_addend = relocation - dtpoff_base (info)
3594 + rel->r_addend;
3595 }
3596
3597 tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
3598 continue;
3599 }
3600 relocation = tpoff (info, relocation);
3601 break;
3602
3603 case R_TILEGX_IMM16_X0_HW0_TLS_GD:
3604 case R_TILEGX_IMM16_X1_HW0_TLS_GD:
3605 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3606 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3607 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3608 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3609 case R_TILEGX_IMM16_X0_HW0_TLS_IE:
3610 case R_TILEGX_IMM16_X1_HW0_TLS_IE:
3611 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3612 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3613 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3614 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3615 r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
3616 input_section->sec_flg0);
3617 tls_type = GOT_UNKNOWN;
3618 if (h == NULL && local_got_offsets)
3619 tls_type =
3620 _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
3621 else if (h != NULL)
3622 {
3623 tls_type = tilegx_elf_hash_entry(h)->tls_type;
3624 if (bfd_link_executable (info)
3625 && h->dynindx == -1
3626 && tls_type == GOT_TLS_IE)
3627 r_type = (!input_section->sec_flg0
3628 ? tilegx_tls_translate_to_le (r_type)
3629 : tilegx_tls_translate_to_ie (r_type));
3630 }
3631
3632 if (tls_type == GOT_TLS_IE)
3633 r_type = tilegx_tls_translate_to_ie (r_type);
3634
3635 if (r_type == R_TILEGX_IMM16_X0_HW0_TLS_LE
3636 || r_type == R_TILEGX_IMM16_X1_HW0_TLS_LE
3637 || r_type == R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
3638 || r_type == R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
3639 || r_type == R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
3640 || r_type == R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE)
3641 {
3642 relocation = tpoff (info, relocation);
3643 break;
3644 }
3645
3646 if (h != NULL)
3647 {
3648 off = h->got.offset;
3649 h->got.offset |= 1;
3650 }
3651 else
3652 {
3653 BFD_ASSERT (local_got_offsets != NULL);
3654 off = local_got_offsets[r_symndx];
3655 local_got_offsets[r_symndx] |= 1;
3656 }
3657
3658 if (htab->elf.sgot == NULL)
3659 abort ();
3660
3661 if ((off & 1) != 0)
3662 off &= ~1;
3663 else
3664 {
3665 Elf_Internal_Rela outrel;
3666 int indx = 0;
3667 bfd_boolean need_relocs = FALSE;
3668
3669 if (htab->elf.srelgot == NULL)
3670 abort ();
3671
3672 if (h != NULL)
3673 {
3674 bfd_boolean dyn;
3675 dyn = htab->elf.dynamic_sections_created;
3676
3677 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3678 bfd_link_pic (info),
3679 h)
3680 && (!bfd_link_pic (info)
3681 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3682 {
3683 indx = h->dynindx;
3684 }
3685 }
3686
3687 /* The GOT entries have not been initialized yet. Do it
3688 now, and emit any relocations. */
3689 if ((bfd_link_pic (info) || indx != 0)
3690 && (h == NULL
3691 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3692 || h->root.type != bfd_link_hash_undefweak))
3693 need_relocs = TRUE;
3694
3695 switch (r_type)
3696 {
3697 case R_TILEGX_IMM16_X0_HW0_TLS_IE:
3698 case R_TILEGX_IMM16_X1_HW0_TLS_IE:
3699 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
3700 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
3701 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
3702 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
3703 if (need_relocs) {
3704 TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
3705 htab->elf.sgot->contents + off);
3706 outrel.r_offset = (htab->elf.sgot->output_section->vma
3707 + htab->elf.sgot->output_offset + off);
3708 outrel.r_addend = 0;
3709 if (indx == 0)
3710 outrel.r_addend = relocation - dtpoff_base (info);
3711 outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
3712 TILEGX_ELF_TPOFF_RELOC (htab));
3713 tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3714 } else {
3715 TILEGX_ELF_PUT_WORD (htab, output_bfd,
3716 tpoff (info, relocation),
3717 htab->elf.sgot->contents + off);
3718 }
3719 break;
3720
3721 case R_TILEGX_IMM16_X0_HW0_TLS_GD:
3722 case R_TILEGX_IMM16_X1_HW0_TLS_GD:
3723 case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
3724 case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
3725 case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
3726 case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
3727 if (need_relocs) {
3728 outrel.r_offset = (htab->elf.sgot->output_section->vma
3729 + htab->elf.sgot->output_offset + off);
3730 outrel.r_addend = 0;
3731 outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
3732 TILEGX_ELF_DTPMOD_RELOC (htab));
3733 TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
3734 htab->elf.sgot->contents + off);
3735 tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3736 if (indx == 0)
3737 {
3738 BFD_ASSERT (! unresolved_reloc);
3739 TILEGX_ELF_PUT_WORD (htab, output_bfd,
3740 relocation - dtpoff_base (info),
3741 (htab->elf.sgot->contents + off +
3742 TILEGX_ELF_WORD_BYTES (htab)));
3743 }
3744 else
3745 {
3746 TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
3747 (htab->elf.sgot->contents + off +
3748 TILEGX_ELF_WORD_BYTES (htab)));
3749 outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
3750 TILEGX_ELF_DTPOFF_RELOC (htab));
3751 outrel.r_offset += TILEGX_ELF_WORD_BYTES (htab);
3752 tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3753 }
3754 }
3755
3756 else {
3757 /* If we are not emitting relocations for a
3758 general dynamic reference, then we must be in a
3759 static link or an executable link with the
3760 symbol binding locally. Mark it as belonging
3761 to module 1, the executable. */
3762 TILEGX_ELF_PUT_WORD (htab, output_bfd, 1,
3763 htab->elf.sgot->contents + off );
3764 TILEGX_ELF_PUT_WORD (htab, output_bfd,
3765 relocation - dtpoff_base (info),
3766 htab->elf.sgot->contents + off +
3767 TILEGX_ELF_WORD_BYTES (htab));
3768 }
3769 break;
3770 }
3771 }
3772
3773 if (off >= (bfd_vma) -2)
3774 abort ();
3775
3776 relocation = off - got_base;
3777 unresolved_reloc = FALSE;
3778 howto = tilegx_elf_howto_table + r_type;
3779 break;
3780
3781 default:
3782 break;
3783 }
3784
3785 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3786 because such sections are not SEC_ALLOC and thus ld.so will
3787 not process them. */
3788 if (unresolved_reloc
3789 && !((input_section->flags & SEC_DEBUGGING) != 0
3790 && h->def_dynamic)
3791 && _bfd_elf_section_offset (output_bfd, info, input_section,
3792 rel->r_offset) != (bfd_vma) -1)
3793 _bfd_error_handler
3794 /* xgettext:c-format */
3795 (_("%pB(%pA+%#" PRIx64 "): "
3796 "unresolvable %s relocation against symbol `%s'"),
3797 input_bfd,
3798 input_section,
3799 (uint64_t) rel->r_offset,
3800 howto->name,
3801 h->root.root.string);
3802
3803 r = bfd_reloc_continue;
3804
3805 /* Get the operand creation function, if any. */
3806 create_func = reloc_to_create_func[r_type];
3807 if (create_func == NULL)
3808 {
3809 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3810 contents, rel->r_offset,
3811 relocation, rel->r_addend);
3812 }
3813 else
3814 {
3815 if (howto->pc_relative)
3816 {
3817 relocation -=
3818 input_section->output_section->vma + input_section->output_offset;
3819 if (howto->pcrel_offset)
3820 relocation -= rel->r_offset;
3821 }
3822
3823 bfd_byte *data;
3824
3825 /* Add the relocation addend if any to the final target value */
3826 relocation += rel->r_addend;
3827
3828 /* Do basic range checking */
3829 r = bfd_check_overflow (howto->complain_on_overflow,
3830 howto->bitsize,
3831 howto->rightshift,
3832 TILEGX_ELF_WORD_BYTES (htab) * 8,
3833 relocation);
3834
3835 /*
3836 * Write the relocated value out into the raw section data.
3837 * Don't put a relocation out in the .rela section.
3838 */
3839 tilegx_bundle_bits mask = create_func(-1);
3840 tilegx_bundle_bits value = create_func(relocation >> howto->rightshift);
3841
3842 /* Only touch bytes while the mask is not 0, so we
3843 don't write to out of bounds memory if this is actually
3844 a 16-bit switch instruction. */
3845 for (data = contents + rel->r_offset; mask != 0; data++)
3846 {
3847 bfd_byte byte_mask = (bfd_byte)mask;
3848 *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask);
3849 mask >>= 8;
3850 value >>= 8;
3851 }
3852 }
3853
3854 if (r != bfd_reloc_ok)
3855 {
3856 const char *msg = NULL;
3857
3858 switch (r)
3859 {
3860 case bfd_reloc_overflow:
3861 (*info->callbacks->reloc_overflow)
3862 (info, (h ? &h->root : NULL), name, howto->name,
3863 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3864 break;
3865
3866 case bfd_reloc_undefined:
3867 (*info->callbacks->undefined_symbol)
3868 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
3869 break;
3870
3871 case bfd_reloc_outofrange:
3872 msg = _("internal error: out of range error");
3873 break;
3874
3875 case bfd_reloc_notsupported:
3876 msg = _("internal error: unsupported relocation error");
3877 break;
3878
3879 case bfd_reloc_dangerous:
3880 msg = _("internal error: dangerous relocation");
3881 break;
3882
3883 default:
3884 msg = _("internal error: unknown error");
3885 break;
3886 }
3887
3888 if (msg)
3889 (*info->callbacks->warning) (info, msg, name, input_bfd,
3890 input_section, rel->r_offset);
3891 }
3892 }
3893
3894 return TRUE;
3895 }
3896
3897 /* Finish up dynamic symbol handling. We set the contents of various
3898 dynamic sections here. */
3899
3900 bfd_boolean
3901 tilegx_elf_finish_dynamic_symbol (bfd *output_bfd,
3902 struct bfd_link_info *info,
3903 struct elf_link_hash_entry *h,
3904 Elf_Internal_Sym *sym)
3905 {
3906 struct tilegx_elf_link_hash_table *htab;
3907
3908 htab = tilegx_elf_hash_table (info);
3909 BFD_ASSERT (htab != NULL);
3910
3911 if (h->plt.offset != (bfd_vma) -1)
3912 {
3913 asection *splt;
3914 asection *srela;
3915 asection *sgotplt;
3916 Elf_Internal_Rela rela;
3917 bfd_byte *loc;
3918 bfd_vma r_offset;
3919 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
3920
3921
3922 int rela_index;
3923
3924 /* This symbol has an entry in the PLT. Set it up. */
3925
3926 BFD_ASSERT (h->dynindx != -1);
3927
3928 splt = htab->elf.splt;
3929 srela = htab->elf.srelplt;
3930 sgotplt = htab->elf.sgotplt;
3931
3932 if (splt == NULL || srela == NULL)
3933 abort ();
3934
3935 /* Fill in the entry in the procedure linkage table. */
3936 rela_index = tilegx_plt_entry_build (output_bfd, htab, splt, sgotplt,
3937 h->plt.offset, &r_offset);
3938
3939 /* Fill in the entry in the global offset table, which initially points
3940 to the beginning of the plt. */
3941 TILEGX_ELF_PUT_WORD (htab, output_bfd,
3942 splt->output_section->vma + splt->output_offset,
3943 sgotplt->contents + r_offset);
3944
3945 /* Fill in the entry in the .rela.plt section. */
3946 rela.r_offset = (sgotplt->output_section->vma
3947 + sgotplt->output_offset
3948 + r_offset);
3949 rela.r_addend = 0;
3950 rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_JMP_SLOT);
3951
3952 loc = srela->contents + rela_index * TILEGX_ELF_RELA_BYTES (htab);
3953 bed->s->swap_reloca_out (output_bfd, &rela, loc);
3954
3955 if (!h->def_regular)
3956 {
3957 /* Mark the symbol as undefined, rather than as defined in
3958 the .plt section. Leave the value alone. */
3959 sym->st_shndx = SHN_UNDEF;
3960 /* If the symbol is weak, we do need to clear the value.
3961 Otherwise, the PLT entry would provide a definition for
3962 the symbol even if the symbol wasn't defined anywhere,
3963 and so the symbol would never be NULL. */
3964 if (!h->ref_regular_nonweak)
3965 sym->st_value = 0;
3966 }
3967 }
3968
3969 if (h->got.offset != (bfd_vma) -1
3970 && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_GD
3971 && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
3972 {
3973 asection *sgot;
3974 asection *srela;
3975 Elf_Internal_Rela rela;
3976
3977 /* This symbol has an entry in the GOT. Set it up. */
3978
3979 sgot = htab->elf.sgot;
3980 srela = htab->elf.srelgot;
3981 BFD_ASSERT (sgot != NULL && srela != NULL);
3982
3983 rela.r_offset = (sgot->output_section->vma
3984 + sgot->output_offset
3985 + (h->got.offset &~ (bfd_vma) 1));
3986
3987 /* If this is a -Bsymbolic link, and the symbol is defined
3988 locally, we just want to emit a RELATIVE reloc. Likewise if
3989 the symbol was forced to be local because of a version file.
3990 The entry in the global offset table will already have been
3991 initialized in the relocate_section function. */
3992 if (bfd_link_pic (info)
3993 && (info->symbolic || h->dynindx == -1)
3994 && h->def_regular)
3995 {
3996 asection *sec = h->root.u.def.section;
3997 rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
3998 rela.r_addend = (h->root.u.def.value
3999 + sec->output_section->vma
4000 + sec->output_offset);
4001 }
4002 else
4003 {
4004 rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_GLOB_DAT);
4005 rela.r_addend = 0;
4006 }
4007
4008 TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
4009 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4010 tilegx_elf_append_rela (output_bfd, srela, &rela);
4011 }
4012
4013 if (h->needs_copy)
4014 {
4015 asection *s;
4016 Elf_Internal_Rela rela;
4017
4018 /* This symbols needs a copy reloc. Set it up. */
4019 BFD_ASSERT (h->dynindx != -1);
4020
4021 if (h->root.u.def.section == htab->elf.sdynrelro)
4022 s = htab->elf.sreldynrelro;
4023 else
4024 s = htab->elf.srelbss;
4025 BFD_ASSERT (s != NULL);
4026
4027 rela.r_offset = (h->root.u.def.value
4028 + h->root.u.def.section->output_section->vma
4029 + h->root.u.def.section->output_offset);
4030 rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_COPY);
4031 rela.r_addend = 0;
4032 tilegx_elf_append_rela (output_bfd, s, &rela);
4033 }
4034
4035 /* Mark some specially defined symbols as absolute. */
4036 if (h == htab->elf.hdynamic
4037 || (h == htab->elf.hgot || h == htab->elf.hplt))
4038 sym->st_shndx = SHN_ABS;
4039
4040 return TRUE;
4041 }
4042
4043 /* Finish up the dynamic sections. */
4044
4045 static bfd_boolean
4046 tilegx_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4047 bfd *dynobj, asection *sdyn,
4048 asection *splt ATTRIBUTE_UNUSED)
4049 {
4050 struct tilegx_elf_link_hash_table *htab;
4051 const struct elf_backend_data *bed;
4052 bfd_byte *dyncon, *dynconend;
4053 size_t dynsize;
4054
4055 htab = tilegx_elf_hash_table (info);
4056 BFD_ASSERT (htab != NULL);
4057 bed = get_elf_backend_data (output_bfd);
4058 dynsize = bed->s->sizeof_dyn;
4059 dynconend = sdyn->contents + sdyn->size;
4060
4061 for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4062 {
4063 Elf_Internal_Dyn dyn;
4064 asection *s;
4065
4066 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4067
4068 switch (dyn.d_tag)
4069 {
4070 case DT_PLTGOT:
4071 s = htab->elf.sgotplt;
4072 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4073 break;
4074 case DT_JMPREL:
4075 s = htab->elf.srelplt;
4076 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4077 break;
4078 case DT_PLTRELSZ:
4079 s = htab->elf.srelplt;
4080 dyn.d_un.d_val = s->size;
4081 break;
4082 default:
4083 continue;
4084 }
4085
4086 bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4087 }
4088 return TRUE;
4089 }
4090
4091 bfd_boolean
4092 tilegx_elf_finish_dynamic_sections (bfd *output_bfd,
4093 struct bfd_link_info *info)
4094 {
4095 bfd *dynobj;
4096 asection *sdyn;
4097 struct tilegx_elf_link_hash_table *htab;
4098 size_t pad_size;
4099
4100 htab = tilegx_elf_hash_table (info);
4101 BFD_ASSERT (htab != NULL);
4102 dynobj = htab->elf.dynobj;
4103
4104 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4105
4106 if (elf_hash_table (info)->dynamic_sections_created)
4107 {
4108 asection *splt;
4109 bfd_boolean ret;
4110
4111 splt = htab->elf.splt;
4112 BFD_ASSERT (splt != NULL && sdyn != NULL);
4113
4114 ret = tilegx_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
4115
4116 if (!ret)
4117 return ret;
4118
4119 /* Fill in the head and tail entries in the procedure linkage table. */
4120 if (splt->size > 0)
4121 {
4122 memcpy (splt->contents,
4123 ABI_64_P (output_bfd) ?
4124 tilegx64_plt0_entry : tilegx32_plt0_entry,
4125 PLT_HEADER_SIZE);
4126
4127 memcpy (splt->contents + splt->size
4128 - PLT_ENTRY_SIZE + PLT_HEADER_SIZE,
4129 ABI_64_P (output_bfd) ?
4130 tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
4131 PLT_TAIL_SIZE);
4132 /* Add padding so that the plt section is a multiple of its
4133 entry size. */
4134 pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE;
4135 memset (splt->contents + splt->size - pad_size, 0, pad_size);
4136
4137 elf_section_data (splt->output_section)->this_hdr.sh_entsize
4138 = PLT_ENTRY_SIZE;
4139 }
4140 }
4141
4142 if (htab->elf.sgotplt)
4143 {
4144 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
4145 {
4146 _bfd_error_handler
4147 (_("discarded output section: `%pA'"), htab->elf.sgotplt);
4148 return FALSE;
4149 }
4150
4151 if (htab->elf.sgotplt->size > 0)
4152 {
4153 /* Write the first two entries in .got.plt, needed for the dynamic
4154 linker. */
4155 TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) -1,
4156 htab->elf.sgotplt->contents);
4157 TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) 0,
4158 htab->elf.sgotplt->contents
4159 + GOT_ENTRY_SIZE (htab));
4160
4161 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
4162 GOT_ENTRY_SIZE (htab);
4163 }
4164 }
4165
4166 if (htab->elf.sgot)
4167 {
4168 if (htab->elf.sgot->size > 0)
4169 {
4170 /* Set the first entry in the global offset table to the address of
4171 the dynamic section. */
4172 bfd_vma val = (sdyn ?
4173 sdyn->output_section->vma + sdyn->output_offset :
4174 0);
4175 TILEGX_ELF_PUT_WORD (htab, output_bfd, val,
4176 htab->elf.sgot->contents);
4177
4178 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4179 GOT_ENTRY_SIZE (htab);
4180 }
4181 }
4182
4183 return TRUE;
4184 }
4185
4186
4187
4189 /* Return address for Ith PLT stub in section PLT, for relocation REL
4190 or (bfd_vma) -1 if it should not be included. */
4191
4192 bfd_vma
4193 tilegx_elf_plt_sym_val (bfd_vma i, const asection *plt,
4194 const arelent *rel ATTRIBUTE_UNUSED)
4195 {
4196 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
4197 }
4198
4199 enum elf_reloc_type_class
4200 tilegx_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4201 const asection *rel_sec ATTRIBUTE_UNUSED,
4202 const Elf_Internal_Rela *rela)
4203 {
4204 switch ((int) TILEGX_ELF_R_TYPE (rela->r_info))
4205 {
4206 case R_TILEGX_RELATIVE:
4207 return reloc_class_relative;
4208 case R_TILEGX_JMP_SLOT:
4209 return reloc_class_plt;
4210 case R_TILEGX_COPY:
4211 return reloc_class_copy;
4212 default:
4213 return reloc_class_normal;
4214 }
4215 }
4216
4217 int
4218 tilegx_additional_program_headers (bfd *abfd,
4219 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4220 {
4221 /* Each .intrpt section specified by the user adds another PT_LOAD
4222 header since the sections are discontiguous. */
4223 static const char intrpt_sections[4][9] =
4224 {
4225 ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
4226 };
4227 int count = 0;
4228 int i;
4229
4230 for (i = 0; i < 4; i++)
4231 {
4232 asection *sec = bfd_get_section_by_name (abfd, intrpt_sections[i]);
4233 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
4234 ++count;
4235 }
4236
4237 /* Add four "padding" headers in to leave room in case a custom linker
4238 script does something fancy. Otherwise ld complains that it ran
4239 out of program headers and refuses to link. */
4240 count += 4;
4241
4242 return count;
4243 }
4244
4245
4246 bfd_boolean
4247 _bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4248 {
4249 bfd *obfd = info->output_bfd;
4250 const char *targ1 = bfd_get_target (ibfd);
4251 const char *targ2 = bfd_get_target (obfd);
4252
4253 if (strcmp (targ1, targ2) != 0)
4254 {
4255 _bfd_error_handler
4256 /* xgettext:c-format */
4257 (_("%pB: cannot link together %s and %s objects"),
4258 ibfd, targ1, targ2);
4259 bfd_set_error (bfd_error_bad_value);
4260 return FALSE;
4261 }
4262
4263 return TRUE;
4264 }
4265