1 /* TILEPro-specific support for 32-bit ELF.
2 Copyright 2011 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
25 #include "elf/tilepro.h"
26 #include "opcode/tilepro.h"
27 #include "libiberty.h"
28 #include "elf32-tilepro.h"
30 #define TILEPRO_BYTES_PER_WORD 4
32 static reloc_howto_type tilepro_elf_howto_table
[] =
34 /* This reloc does nothing. */
35 HOWTO (R_TILEPRO_NONE
, /* type */
37 2, /* size (0 = byte, 1 = short, 2 = long) */
39 FALSE
, /* pc_relative */
41 complain_overflow_bitfield
, /* complain_on_overflow */
42 bfd_elf_generic_reloc
, /* special_function */
43 "R_TILEPRO_NONE", /* name */
44 FALSE
, /* partial_inplace */
47 FALSE
), /* pcrel_offset */
49 /* A 32 bit absolute relocation. */
50 HOWTO (R_TILEPRO_32
, /* type */
52 2, /* size (0 = byte, 1 = short, 2 = long) */
54 FALSE
, /* pc_relative */
56 complain_overflow_dont
, /* complain_on_overflow */
57 bfd_elf_generic_reloc
, /* special_function */
58 "R_TILEPRO_32", /* name */
59 FALSE
, /* partial_inplace */
61 0xffffffff, /* dst_mask */
62 FALSE
), /* pcrel_offset */
64 /* A 16 bit absolute relocation. */
65 HOWTO (R_TILEPRO_16
, /* type */
67 1, /* size (0 = byte, 1 = short, 2 = long) */
69 FALSE
, /* pc_relative */
71 complain_overflow_bitfield
, /* complain_on_overflow */
72 bfd_elf_generic_reloc
, /* special_function */
73 "R_TILEPRO_16", /* name */
74 FALSE
, /* partial_inplace */
76 0xffff, /* dst_mask */
77 FALSE
), /* pcrel_offset */
79 /* An 8 bit absolute relocation. */
80 HOWTO (R_TILEPRO_8
, /* type */
82 0, /* size (0 = byte, 1 = short, 2 = long) */
84 FALSE
, /* pc_relative */
86 complain_overflow_unsigned
, /* complain_on_overflow */
87 bfd_elf_generic_reloc
, /* special_function */
88 "R_TILEPRO_8", /* name */
89 FALSE
, /* partial_inplace */
92 FALSE
), /* pcrel_offset */
94 /* A 32 bit pc-relative relocation. */
95 HOWTO (R_TILEPRO_32_PCREL
,/* type */
97 2, /* size (0 = byte, 1 = short, 2 = long) */
99 TRUE
, /* pc_relative */
101 complain_overflow_dont
, /* complain_on_overflow */
102 bfd_elf_generic_reloc
, /* special_function */
103 "R_TILEPRO_32_PCREL", /* name */
104 FALSE
, /* partial_inplace */
106 0xffffffff, /* dst_mask */
107 TRUE
), /* pcrel_offset */
109 /* A 16 bit pc-relative relocation. */
110 HOWTO (R_TILEPRO_16_PCREL
,/* type */
112 1, /* size (0 = byte, 1 = short, 2 = long) */
114 TRUE
, /* pc_relative */
116 complain_overflow_signed
, /* complain_on_overflow */
117 bfd_elf_generic_reloc
, /* special_function */
118 "R_TILEPRO_16_PCREL", /* name */
119 FALSE
, /* partial_inplace */
121 0xffff, /* dst_mask */
122 TRUE
), /* pcrel_offset */
124 /* An 8 bit pc-relative relocation. */
125 HOWTO (R_TILEPRO_8_PCREL
, /* type */
127 0, /* size (0 = byte, 1 = short, 2 = long) */
129 TRUE
, /* pc_relative */
131 complain_overflow_signed
, /* complain_on_overflow */
132 bfd_elf_generic_reloc
, /* special_function */
133 "R_TILEPRO_8_PCREL",/* name */
134 FALSE
, /* partial_inplace */
137 TRUE
), /* pcrel_offset */
139 /* A 16 bit relocation without overflow. */
140 HOWTO (R_TILEPRO_LO16
, /* type */
142 1, /* size (0 = byte, 1 = short, 2 = long) */
144 FALSE
, /* pc_relative */
146 complain_overflow_dont
,/* complain_on_overflow */
147 bfd_elf_generic_reloc
, /* special_function */
148 "R_TILEPRO_LO16", /* name */
149 FALSE
, /* partial_inplace */
151 0xffff, /* dst_mask */
152 FALSE
), /* pcrel_offset */
154 /* The high order 16 bits of an address. */
155 HOWTO (R_TILEPRO_HI16
, /* type */
157 1, /* size (0 = byte, 1 = short, 2 = long) */
159 FALSE
, /* pc_relative */
161 complain_overflow_dont
, /* complain_on_overflow */
162 bfd_elf_generic_reloc
, /* special_function */
163 "R_TILEPRO_HI16", /* name */
164 FALSE
, /* partial_inplace */
166 0xffff, /* dst_mask */
167 FALSE
), /* pcrel_offset */
169 /* The high order 16 bits of an address, plus 1 if the contents of
170 the low 16 bits, treated as a signed number, is negative. */
171 HOWTO (R_TILEPRO_HA16
, /* type */
173 1, /* size (0 = byte, 1 = short, 2 = long) */
175 FALSE
, /* pc_relative */
177 complain_overflow_dont
, /* complain_on_overflow */
178 bfd_elf_generic_reloc
, /* special_function */
179 "R_TILEPRO_HA16", /* name */
180 FALSE
, /* partial_inplace */
182 0xffff, /* dst_mask */
183 FALSE
), /* pcrel_offset */
185 HOWTO (R_TILEPRO_COPY
, /* type */
187 0, /* size (0 = byte, 1 = short, 2 = long) */
189 FALSE
, /* pc_relative */
191 complain_overflow_dont
, /* complain_on_overflow */
192 bfd_elf_generic_reloc
, /* special_function */
193 "R_TILEPRO_COPY", /* name */
194 FALSE
, /* partial_inplace */
197 TRUE
), /* pcrel_offset */
199 HOWTO (R_TILEPRO_GLOB_DAT
, /* type */
201 0, /* size (0 = byte, 1 = short, 2 = long) */
203 FALSE
, /* pc_relative */
205 complain_overflow_dont
, /* complain_on_overflow */
206 bfd_elf_generic_reloc
, /* special_function */
207 "R_TILEPRO_GLOB_DAT", /* name */
208 FALSE
, /* partial_inplace */
211 TRUE
), /* pcrel_offset */
213 HOWTO (R_TILEPRO_JMP_SLOT
, /* type */
215 0, /* size (0 = byte, 1 = short, 2 = long) */
217 FALSE
, /* pc_relative */
219 complain_overflow_dont
, /* complain_on_overflow */
220 bfd_elf_generic_reloc
, /* special_function */
221 "R_TILEPRO_JMP_SLOT", /* name */
222 FALSE
, /* partial_inplace */
225 TRUE
), /* pcrel_offset */
227 HOWTO (R_TILEPRO_RELATIVE
, /* type */
229 0, /* size (0 = byte, 1 = short, 2 = long) */
231 FALSE
, /* pc_relative */
233 complain_overflow_dont
, /* complain_on_overflow */
234 bfd_elf_generic_reloc
, /* special_function */
235 "R_TILEPRO_RELATIVE", /* name */
236 FALSE
, /* partial_inplace */
239 TRUE
), /* pcrel_offset */
241 HOWTO (R_TILEPRO_BROFF_X1
, /* type */
242 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
, /* rightshift */
243 2, /* size (0 = byte, 1 = short, 2 = long) */
245 TRUE
, /* pc_relative */
247 complain_overflow_signed
, /* complain_on_overflow */
248 bfd_elf_generic_reloc
, /* special_function */
249 "R_TILEPRO_BROFF_X1", /* name */
250 FALSE
, /* partial_inplace */
253 TRUE
), /* pcrel_offset */
255 HOWTO (R_TILEPRO_JOFFLONG_X1
, /* type */
256 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
, /* rightshift */
257 2, /* size (0 = byte, 1 = short, 2 = long) */
259 TRUE
, /* pc_relative */
261 complain_overflow_signed
,/* complain_on_overflow */
262 bfd_elf_generic_reloc
, /* special_function */
263 "R_TILEPRO_JOFFLONG_X1", /* name */
264 FALSE
, /* partial_inplace */
267 TRUE
), /* pcrel_offset */
269 HOWTO (R_TILEPRO_JOFFLONG_X1_PLT
, /* type */
270 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
, /* rightshift */
271 2, /* size (0 = byte, 1 = short, 2 = long) */
273 TRUE
, /* pc_relative */
275 complain_overflow_signed
,/* complain_on_overflow */
276 bfd_elf_generic_reloc
, /* special_function */
277 "R_TILEPRO_JOFFLONG_X1_PLT", /* name */
278 FALSE
, /* partial_inplace */
281 TRUE
), /* pcrel_offset */
283 #define TILEPRO_IMM_HOWTO(name, size, bitsize) \
284 HOWTO (name, 0, size, bitsize, FALSE, 0, \
285 complain_overflow_signed, bfd_elf_generic_reloc, \
286 #name, FALSE, 0, -1, FALSE)
288 #define TILEPRO_UIMM_HOWTO(name, size, bitsize) \
289 HOWTO (name, 0, size, bitsize, FALSE, 0, \
290 complain_overflow_unsigned, bfd_elf_generic_reloc, \
291 #name, FALSE, 0, -1, FALSE)
293 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0
, 0, 8),
294 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y0
, 0, 8),
295 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X1
, 0, 8),
296 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y1
, 0, 8),
297 TILEPRO_UIMM_HOWTO(R_TILEPRO_MT_IMM15_X1
, 1, 15),
298 TILEPRO_UIMM_HOWTO(R_TILEPRO_MF_IMM15_X1
, 1, 15),
299 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X0
, 1, 16),
300 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X1
, 1, 16),
302 #define TILEPRO_IMM16_HOWTO(name, rshift) \
303 HOWTO (name, rshift, 1, 16, FALSE, 0, \
304 complain_overflow_dont, bfd_elf_generic_reloc, \
305 #name, FALSE, 0, 0xffff, FALSE)
307 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_LO
, 0),
308 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_LO
, 0),
309 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_HI
, 16),
310 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_HI
, 16),
311 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_HA
, 16),
312 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_HA
, 16),
314 /* PC-relative offsets. */
316 HOWTO (R_TILEPRO_IMM16_X0_PCREL
, /* type */
318 1, /* size (0 = byte, 1 = short, 2 = long) */
320 TRUE
, /* pc_relative */
322 complain_overflow_signed
, /* complain_on_overflow */
323 bfd_elf_generic_reloc
, /* special_function */
324 "R_TILEPRO_IMM16_X0_PCREL",/* name */
325 FALSE
, /* partial_inplace */
328 TRUE
), /* pcrel_offset */
330 HOWTO (R_TILEPRO_IMM16_X1_PCREL
, /* type */
332 1, /* size (0 = byte, 1 = short, 2 = long) */
334 TRUE
, /* pc_relative */
336 complain_overflow_signed
, /* complain_on_overflow */
337 bfd_elf_generic_reloc
, /* special_function */
338 "R_TILEPRO_IMM16_X1_PCREL",/* name */
339 FALSE
, /* partial_inplace */
342 TRUE
), /* pcrel_offset */
344 #define TILEPRO_IMM16_HOWTO_PCREL(name, rshift) \
345 HOWTO (name, rshift, 1, 16, TRUE, 0, \
346 complain_overflow_dont, bfd_elf_generic_reloc, \
347 #name, FALSE, 0, 0xffff, TRUE)
349 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_LO_PCREL
, 0),
350 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_LO_PCREL
, 0),
351 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_HI_PCREL
, 16),
352 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_HI_PCREL
, 16),
353 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_HA_PCREL
, 16),
354 TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_HA_PCREL
, 16),
356 /* Byte offset into GOT for a particular symbol. */
357 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X0_GOT
, 1, 16),
358 TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X1_GOT
, 1, 16),
359 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_LO
, 0),
360 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_LO
, 0),
361 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_HI
, 16),
362 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_HI
, 16),
363 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_HA
, 16),
364 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_HA
, 16),
366 TILEPRO_UIMM_HOWTO(R_TILEPRO_MMSTART_X0
, 0, 5),
367 TILEPRO_UIMM_HOWTO(R_TILEPRO_MMEND_X0
, 0, 5),
368 TILEPRO_UIMM_HOWTO(R_TILEPRO_MMSTART_X1
, 0, 5),
369 TILEPRO_UIMM_HOWTO(R_TILEPRO_MMEND_X1
, 0, 5),
371 TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_X0
, 0, 5),
372 TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_X1
, 0, 5),
373 TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_Y0
, 0, 5),
374 TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_Y1
, 0, 5),
376 TILEPRO_IMM_HOWTO(R_TILEPRO_DEST_IMM8_X1
, 0, 8),
378 /* These relocs are currently not defined. */
390 /* Offsets into the GOT of TLS Descriptors. */
392 HOWTO (R_TILEPRO_IMM16_X0_TLS_GD
,/* type */
394 1, /* size (0 = byte, 1 = short, 2 = long) */
396 FALSE
, /* pc_relative */
398 complain_overflow_signed
, /* complain_on_overflow */
399 bfd_elf_generic_reloc
, /* special_function */
400 "R_TILEPRO_IMM16_X0_TLS_GD",/* name */
401 FALSE
, /* partial_inplace */
403 0xffff, /* dst_mask */
404 FALSE
), /* pcrel_offset */
406 HOWTO (R_TILEPRO_IMM16_X1_TLS_GD
,/* type */
408 1, /* size (0 = byte, 1 = short, 2 = long) */
410 FALSE
, /* pc_relative */
412 complain_overflow_signed
, /* complain_on_overflow */
413 bfd_elf_generic_reloc
, /* special_function */
414 "R_TILEPRO_IMM16_X1_TLS_GD",/* name */
415 FALSE
, /* partial_inplace */
417 0xffff, /* dst_mask */
418 FALSE
), /* pcrel_offset */
420 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_LO
, 0),
421 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_LO
, 0),
422 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_HI
, 16),
423 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_HI
, 16),
424 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_HA
, 16),
425 TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_HA
, 16),
427 /* Offsets into the GOT of TLS Descriptors. */
429 HOWTO (R_TILEPRO_IMM16_X0_TLS_IE
,/* type */
431 1, /* size (0 = byte, 1 = short, 2 = long) */
433 FALSE
, /* pc_relative */
435 complain_overflow_signed
, /* complain_on_overflow */
436 bfd_elf_generic_reloc
, /* special_function */
437 "R_TILEPRO_IMM16_X0_TLS_IE",/* name */
438 FALSE
, /* partial_inplace */
441 TRUE
), /* pcrel_offset */
443 HOWTO (R_TILEPRO_IMM16_X1_TLS_IE
,/* type */
445 1, /* size (0 = byte, 1 = short, 2 = long) */
447 FALSE
, /* pc_relative */
449 complain_overflow_signed
, /* complain_on_overflow */
450 bfd_elf_generic_reloc
, /* special_function */
451 "R_TILEPRO_IMM16_X1_TLS_IE",/* name */
452 FALSE
, /* partial_inplace */
455 TRUE
), /* pcrel_offset */
457 #define TILEPRO_IMM16_HOWTO_TLS_IE(name, rshift) \
458 HOWTO (name, rshift, 1, 16, FALSE, 0, \
459 complain_overflow_dont, bfd_elf_generic_reloc, \
460 #name, FALSE, 0, 0xffff, TRUE)
462 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_LO
, 0),
463 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_LO
, 0),
464 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HI
, 16),
465 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HI
, 16),
466 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HA
, 16),
467 TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HA
, 16),
469 /* These are common with the Solaris TLS implementation. */
470 HOWTO(R_TILEPRO_TLS_DTPMOD32
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
471 bfd_elf_generic_reloc
, "R_TILEPRO_TLS_DTPMOD32",
473 HOWTO(R_TILEPRO_TLS_DTPOFF32
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,
474 bfd_elf_generic_reloc
, "R_TILEPRO_TLS_DTPOFF32",
475 FALSE
, 0, 0xFFFFFFFF, TRUE
),
476 HOWTO(R_TILEPRO_TLS_TPOFF32
, 0, 0, 0, FALSE
, 0, complain_overflow_dont
,
477 bfd_elf_generic_reloc
, "R_TILEPRO_TLS_TPOFF32",
482 static reloc_howto_type tilepro_elf_howto_table2
[] =
484 /* GNU extension to record C++ vtable hierarchy */
485 HOWTO (R_TILEPRO_GNU_VTINHERIT
, /* type */
487 2, /* size (0 = byte, 1 = short, 2 = long) */
489 FALSE
, /* pc_relative */
491 complain_overflow_dont
, /* complain_on_overflow */
492 NULL
, /* special_function */
493 "R_TILEPRO_GNU_VTINHERIT", /* name */
494 FALSE
, /* partial_inplace */
497 FALSE
), /* pcrel_offset */
499 /* GNU extension to record C++ vtable member usage */
500 HOWTO (R_TILEPRO_GNU_VTENTRY
, /* type */
502 2, /* size (0 = byte, 1 = short, 2 = long) */
504 FALSE
, /* pc_relative */
506 complain_overflow_dont
, /* complain_on_overflow */
507 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
508 "R_TILEPRO_GNU_VTENTRY", /* name */
509 FALSE
, /* partial_inplace */
512 FALSE
), /* pcrel_offset */
516 /* Map BFD reloc types to TILEPRO ELF reloc types. */
518 typedef struct tilepro_reloc_map
520 bfd_reloc_code_real_type bfd_reloc_val
;
521 unsigned int tilepro_reloc_val
;
522 reloc_howto_type
* table
;
525 static const reloc_map tilepro_reloc_map
[] =
527 #define TH_REMAP(bfd, tilepro) \
528 { bfd, tilepro, tilepro_elf_howto_table },
530 /* Standard relocations. */
531 TH_REMAP (BFD_RELOC_NONE
, R_TILEPRO_NONE
)
532 TH_REMAP (BFD_RELOC_32
, R_TILEPRO_32
)
533 TH_REMAP (BFD_RELOC_16
, R_TILEPRO_16
)
534 TH_REMAP (BFD_RELOC_8
, R_TILEPRO_8
)
535 TH_REMAP (BFD_RELOC_32_PCREL
, R_TILEPRO_32_PCREL
)
536 TH_REMAP (BFD_RELOC_16_PCREL
, R_TILEPRO_16_PCREL
)
537 TH_REMAP (BFD_RELOC_8_PCREL
, R_TILEPRO_8_PCREL
)
538 TH_REMAP (BFD_RELOC_LO16
, R_TILEPRO_LO16
)
539 TH_REMAP (BFD_RELOC_HI16
, R_TILEPRO_HI16
)
540 TH_REMAP (BFD_RELOC_HI16_S
, R_TILEPRO_HA16
)
542 /* Custom relocations. */
543 TH_REMAP (BFD_RELOC_TILEPRO_COPY
, R_TILEPRO_COPY
)
544 TH_REMAP (BFD_RELOC_TILEPRO_GLOB_DAT
, R_TILEPRO_GLOB_DAT
)
545 TH_REMAP (BFD_RELOC_TILEPRO_JMP_SLOT
, R_TILEPRO_JMP_SLOT
)
546 TH_REMAP (BFD_RELOC_TILEPRO_RELATIVE
, R_TILEPRO_RELATIVE
)
547 TH_REMAP (BFD_RELOC_TILEPRO_BROFF_X1
, R_TILEPRO_BROFF_X1
)
548 TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1
, R_TILEPRO_JOFFLONG_X1
)
549 TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT
, R_TILEPRO_JOFFLONG_X1_PLT
)
550 TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0
, R_TILEPRO_IMM8_X0
)
551 TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0
, R_TILEPRO_IMM8_Y0
)
552 TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1
, R_TILEPRO_IMM8_X1
)
553 TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1
, R_TILEPRO_IMM8_Y1
)
554 TH_REMAP (BFD_RELOC_TILEPRO_DEST_IMM8_X1
, R_TILEPRO_DEST_IMM8_X1
)
555 TH_REMAP (BFD_RELOC_TILEPRO_MT_IMM15_X1
, R_TILEPRO_MT_IMM15_X1
)
556 TH_REMAP (BFD_RELOC_TILEPRO_MF_IMM15_X1
, R_TILEPRO_MF_IMM15_X1
)
557 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0
, R_TILEPRO_IMM16_X0
)
558 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1
, R_TILEPRO_IMM16_X1
)
559 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO
, R_TILEPRO_IMM16_X0_LO
)
560 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO
, R_TILEPRO_IMM16_X1_LO
)
561 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI
, R_TILEPRO_IMM16_X0_HI
)
562 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HI
, R_TILEPRO_IMM16_X1_HI
)
563 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HA
, R_TILEPRO_IMM16_X0_HA
)
564 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HA
, R_TILEPRO_IMM16_X1_HA
)
566 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_PCREL
, R_TILEPRO_IMM16_X0_PCREL
)
567 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_PCREL
, R_TILEPRO_IMM16_X1_PCREL
)
568 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL
, R_TILEPRO_IMM16_X0_LO_PCREL
)
569 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL
, R_TILEPRO_IMM16_X1_LO_PCREL
)
570 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL
, R_TILEPRO_IMM16_X0_HI_PCREL
)
571 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL
, R_TILEPRO_IMM16_X1_HI_PCREL
)
572 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL
, R_TILEPRO_IMM16_X0_HA_PCREL
)
573 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL
, R_TILEPRO_IMM16_X1_HA_PCREL
)
575 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT
, R_TILEPRO_IMM16_X0_GOT
)
576 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT
, R_TILEPRO_IMM16_X1_GOT
)
577 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO
, R_TILEPRO_IMM16_X0_GOT_LO
)
578 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO
, R_TILEPRO_IMM16_X1_GOT_LO
)
579 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI
, R_TILEPRO_IMM16_X0_GOT_HI
)
580 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI
, R_TILEPRO_IMM16_X1_GOT_HI
)
581 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA
, R_TILEPRO_IMM16_X0_GOT_HA
)
582 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA
, R_TILEPRO_IMM16_X1_GOT_HA
)
584 TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X0
, R_TILEPRO_MMSTART_X0
)
585 TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X0
, R_TILEPRO_MMEND_X0
)
586 TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X1
, R_TILEPRO_MMSTART_X1
)
587 TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X1
, R_TILEPRO_MMEND_X1
)
588 TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0
, R_TILEPRO_SHAMT_X0
)
589 TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1
, R_TILEPRO_SHAMT_X1
)
590 TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0
, R_TILEPRO_SHAMT_Y0
)
591 TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1
, R_TILEPRO_SHAMT_Y1
)
593 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD
, R_TILEPRO_IMM16_X0_TLS_GD
)
594 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD
, R_TILEPRO_IMM16_X1_TLS_GD
)
595 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO
, R_TILEPRO_IMM16_X0_TLS_GD_LO
)
596 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO
, R_TILEPRO_IMM16_X1_TLS_GD_LO
)
597 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI
, R_TILEPRO_IMM16_X0_TLS_GD_HI
)
598 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI
, R_TILEPRO_IMM16_X1_TLS_GD_HI
)
599 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA
, R_TILEPRO_IMM16_X0_TLS_GD_HA
)
600 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA
, R_TILEPRO_IMM16_X1_TLS_GD_HA
)
602 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE
, R_TILEPRO_IMM16_X0_TLS_IE
)
603 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE
, R_TILEPRO_IMM16_X1_TLS_IE
)
604 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO
, R_TILEPRO_IMM16_X0_TLS_IE_LO
)
605 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO
, R_TILEPRO_IMM16_X1_TLS_IE_LO
)
606 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI
, R_TILEPRO_IMM16_X0_TLS_IE_HI
)
607 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI
, R_TILEPRO_IMM16_X1_TLS_IE_HI
)
608 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA
, R_TILEPRO_IMM16_X0_TLS_IE_HA
)
609 TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA
, R_TILEPRO_IMM16_X1_TLS_IE_HA
)
611 TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPMOD32
, R_TILEPRO_TLS_DTPMOD32
)
612 TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32
, R_TILEPRO_TLS_DTPOFF32
)
613 TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32
, R_TILEPRO_TLS_TPOFF32
)
617 { BFD_RELOC_VTABLE_INHERIT
, R_TILEPRO_GNU_VTINHERIT
, tilepro_elf_howto_table2
},
618 { BFD_RELOC_VTABLE_ENTRY
, R_TILEPRO_GNU_VTENTRY
, tilepro_elf_howto_table2
},
623 /* The TILEPro linker needs to keep track of the number of relocs that it
624 decides to copy as dynamic relocs in check_relocs for each symbol.
625 This is so that it can later discard them if they are found to be
626 unnecessary. We store the information in a field extending the
627 regular ELF linker hash table. */
629 struct tilepro_elf_dyn_relocs
631 struct tilepro_elf_dyn_relocs
*next
;
633 /* The input section of the reloc. */
636 /* Total number of relocs copied for the input section. */
639 /* Number of pc-relative relocs copied for the input section. */
640 bfd_size_type pc_count
;
643 /* TILEPRO ELF linker hash entry. */
645 struct tilepro_elf_link_hash_entry
647 struct elf_link_hash_entry elf
;
649 /* Track dynamic relocs copied for this symbol. */
650 struct tilepro_elf_dyn_relocs
*dyn_relocs
;
652 #define GOT_UNKNOWN 0
656 unsigned char tls_type
;
659 #define tilepro_elf_hash_entry(ent) \
660 ((struct tilepro_elf_link_hash_entry *)(ent))
662 struct _bfd_tilepro_elf_obj_tdata
664 struct elf_obj_tdata root
;
666 /* tls_type for each local got entry. */
667 char *local_got_tls_type
;
670 #define _bfd_tilepro_elf_tdata(abfd) \
671 ((struct _bfd_tilepro_elf_obj_tdata *) (abfd)->tdata.any)
673 #define _bfd_tilepro_elf_local_got_tls_type(abfd) \
674 (_bfd_tilepro_elf_tdata (abfd)->local_got_tls_type)
676 #define is_tilepro_elf(bfd) \
677 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
678 && elf_tdata (bfd) != NULL \
679 && elf_object_id (bfd) == TILEPRO_ELF_DATA)
681 #include "elf/common.h"
682 #include "elf/internal.h"
684 struct tilepro_elf_link_hash_table
686 struct elf_link_hash_table elf
;
688 /* Short-cuts to get to dynamic linker sections. */
692 /* Small local sym to section mapping cache. */
693 struct sym_cache sym_cache
;
696 /* Get the Tilepro ELF linker hash table from a link_info structure. */
697 #define tilepro_elf_hash_table(p) \
698 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
699 == TILEPRO_ELF_DATA \
700 ? ((struct tilepro_elf_link_hash_table *) ((p)->hash)) : NULL)
702 static reloc_howto_type
*
703 tilepro_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
704 bfd_reloc_code_real_type code
)
708 for (i
= ARRAY_SIZE (tilepro_reloc_map
); --i
;)
710 const reloc_map
* entry
;
712 entry
= tilepro_reloc_map
+ i
;
714 if (entry
->bfd_reloc_val
== code
)
715 return entry
->table
+ (entry
->tilepro_reloc_val
716 - entry
->table
[0].type
);
722 static reloc_howto_type
*
723 tilepro_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
729 i
< (sizeof (tilepro_elf_howto_table
)
730 / sizeof (tilepro_elf_howto_table
[0]));
732 if (tilepro_elf_howto_table
[i
].name
!= NULL
733 && strcasecmp (tilepro_elf_howto_table
[i
].name
, r_name
) == 0)
734 return &tilepro_elf_howto_table
[i
];
739 /* Set the howto pointer for an TILEPro ELF reloc. */
742 tilepro_info_to_howto_rela (bfd
* abfd ATTRIBUTE_UNUSED
,
744 Elf_Internal_Rela
* dst
)
746 unsigned int r_type
= ELF32_R_TYPE (dst
->r_info
);
748 if (r_type
<= (unsigned int) R_TILEPRO_TLS_TPOFF32
)
749 cache_ptr
->howto
= &tilepro_elf_howto_table
[r_type
];
750 else if (r_type
- R_TILEPRO_GNU_VTINHERIT
751 <= (unsigned int) R_TILEPRO_GNU_VTENTRY
)
753 = &tilepro_elf_howto_table2
[r_type
- R_TILEPRO_GNU_VTINHERIT
];
758 typedef tilepro_bundle_bits (*tilepro_create_func
)(int);
760 static const tilepro_create_func reloc_to_create_func
[] =
762 /* The first fourteen relocation types don't correspond to operands */
778 /* The remaining relocations are used for immediate operands */
851 #define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0])))
853 /* Support for core dump NOTE sections. */
856 tilepro_elf_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
861 if (note
->descsz
!= TILEPRO_PRSTATUS_SIZEOF
)
865 elf_tdata (abfd
)->core_signal
=
866 bfd_get_16 (abfd
, note
->descdata
+ TILEPRO_PRSTATUS_OFFSET_PR_CURSIG
);
869 elf_tdata (abfd
)->core_pid
=
870 bfd_get_32 (abfd
, note
->descdata
+ TILEPRO_PRSTATUS_OFFSET_PR_PID
);
873 offset
= TILEPRO_PRSTATUS_OFFSET_PR_REG
;
874 size
= TILEPRO_GREGSET_T_SIZE
;
876 /* Make a ".reg/999" section. */
877 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
878 size
, note
->descpos
+ offset
);
882 tilepro_elf_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
884 if (note
->descsz
!= TILEPRO_PRPSINFO_SIZEOF
)
887 elf_tdata (abfd
)->core_program
888 = _bfd_elfcore_strndup (abfd
,
889 note
->descdata
+ TILEPRO_PRPSINFO_OFFSET_PR_FNAME
,
891 elf_tdata (abfd
)->core_command
892 = _bfd_elfcore_strndup (abfd
,
893 note
->descdata
+ TILEPRO_PRPSINFO_OFFSET_PR_PSARGS
,
897 /* Note that for some reason, a spurious space is tacked
898 onto the end of the args in some (at least one anyway)
899 implementations, so strip it off if it exists. */
901 char *command
= elf_tdata (abfd
)->core_command
;
902 int n
= strlen (command
);
904 if (0 < n
&& command
[n
- 1] == ' ')
905 command
[n
- 1] = '\0';
913 tilepro_elf_append_rela_32 (bfd
*abfd
, asection
*s
, Elf_Internal_Rela
*rel
)
915 Elf32_External_Rela
*loc32
;
917 loc32
= (Elf32_External_Rela
*) s
->contents
;
918 loc32
+= s
->reloc_count
++;
919 bfd_elf32_swap_reloca_out (abfd
, rel
, (bfd_byte
*) loc32
);
924 /* The procedure linkage table starts with the following header:
932 info 10 ## SP not offset, return PC in LR
936 Subsequent entries are the following, jumping to the header at the end:
941 auli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
942 auli r27, r28, <_GLOBAL_OFFSET_TABLE_ - 1b>
945 addli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
946 addli r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
949 auli r29, zero, MY_PLT_INDEX
953 info 10 ## SP not offset, return PC in LR
957 We initially store MY_PLT_INDEX in the high bits so that we can use the all
958 16 bits as an unsigned offset; if we use the low bits we would get an
959 unwanted sign extension. The PLT header then rotates the index to get the
960 right value, before calling the resolution routine. This computation can
961 fit in unused bundle slots so it's free.
963 This code sequence lets the code at at the start of the PLT determine
964 which PLT entry was executed by examining 'r29'.
966 Note that MY_PLT_INDEX skips over the header entries, so the first
967 actual jump table entry has index zero.
970 #define PLT_HEADER_SIZE_IN_BUNDLES 3
971 #define PLT_ENTRY_SIZE_IN_BUNDLES 5
973 #define PLT_HEADER_SIZE \
974 (PLT_HEADER_SIZE_IN_BUNDLES * TILEPRO_BUNDLE_SIZE_IN_BYTES)
975 #define PLT_ENTRY_SIZE \
976 (PLT_ENTRY_SIZE_IN_BUNDLES * TILEPRO_BUNDLE_SIZE_IN_BYTES)
978 /* The size in bytes of an entry in the global offset table. */
980 #define GOT_ENTRY_SIZE TILEPRO_BYTES_PER_WORD
982 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
985 static const bfd_byte
986 tilepro_plt0_entry
[PLT_HEADER_SIZE
] =
988 0x5d, 0x07, 0x03, 0x70,
989 0x6e, 0x23, 0xd0, 0x30, /* { rli r29, r29, 16 ; lwadd r28, r27, 4 } */
990 0x00, 0x50, 0xba, 0x6d,
991 0x00, 0x08, 0x6d, 0xdc, /* { lw r27, r27 } */
992 0xff, 0xaf, 0x10, 0x50,
993 0x60, 0x03, 0x18, 0x08, /* { info 10 ; jr r27 } */
996 static const bfd_byte
997 tilepro_short_plt_entry
[PLT_ENTRY_SIZE
] =
999 0x00, 0x50, 0x16, 0x70,
1000 0x0e, 0x00, 0x1a, 0x08, /* { lnk r28 } */
1001 0x1c, 0x07, 0x00, 0xa0,
1002 0x8d, 0x03, 0x00, 0x18, /* { addli r28, r28, 0 ; addli r27, r28, 0 } */
1003 0xdd, 0x0f, 0x00, 0x30,
1004 0x8e, 0x73, 0x0b, 0x40, /* { auli r29, zero, 0 ; lw r28, r28 } */
1005 0xff, 0xaf, 0x10, 0x50,
1006 0x80, 0x03, 0x18, 0x08, /* { info 10 ; jr r28 } */
1007 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00,
1011 static const bfd_byte
1012 tilepro_long_plt_entry
[PLT_ENTRY_SIZE
] =
1014 0x00, 0x50, 0x16, 0x70,
1015 0x0e, 0x00, 0x1a, 0x08, /* { lnk r28 } */
1016 0x1c, 0x07, 0x00, 0xb0,
1017 0x8d, 0x03, 0x00, 0x20, /* { auli r28, r28, 0 ; auli r27, r28, 0 } */
1018 0x1c, 0x07, 0x00, 0xa0,
1019 0x6d, 0x03, 0x00, 0x18, /* { addli r28, r28, 0 ; addli r27, r27, 0 } */
1020 0xdd, 0x0f, 0x00, 0x30,
1021 0x8e, 0x73, 0x0b, 0x40, /* { auli r29, zero, 0 ; lw r28, r28 } */
1022 0xff, 0xaf, 0x10, 0x50,
1023 0x80, 0x03, 0x18, 0x08, /* { info 10 ; jr r28 } */
1027 tilepro_ha16(bfd_vma vma
)
1029 return ((vma
>> 16) + ((vma
>> 15) & 1)) & 0xffff;
1033 tilepro_plt_entry_build (asection
*splt
, asection
*sgotplt
, bfd_vma offset
,
1036 int plt_index
= (offset
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
1037 int got_offset
= plt_index
* GOT_ENTRY_SIZE
+ GOTPLT_HEADER_SIZE
;
1038 tilepro_bundle_bits
*pc
;
1040 /* Compute the distance from the got entry to the lnk. */
1041 bfd_signed_vma dist_got_entry
= sgotplt
->output_section
->vma
1042 + sgotplt
->output_offset
1044 - splt
->output_section
->vma
1045 - splt
->output_offset
1047 - TILEPRO_BUNDLE_SIZE_IN_BYTES
;
1049 /* Compute the distance to GOTPLT[0]. */
1050 bfd_signed_vma dist_got0
= dist_got_entry
- got_offset
;
1052 /* Check whether we can use the short plt entry with 16-bit offset. */
1053 bfd_boolean short_plt_entry
=
1054 (dist_got_entry
<= 0x7fff && dist_got0
>= -0x8000);
1056 /* Copy the plt entry template. */
1057 memcpy (splt
->contents
+ offset
,
1058 short_plt_entry
? tilepro_short_plt_entry
: tilepro_long_plt_entry
,
1061 /* Write the immediate offsets. */
1062 pc
= (tilepro_bundle_bits
*)(splt
->contents
+ offset
);
1065 if (!short_plt_entry
)
1067 /* { auli r28, r28, &GOTPLT[MY_GOT_INDEX] ; auli r27, r28, &GOTPLT[0] } */
1068 *pc
++ |= create_Imm16_X0 (tilepro_ha16 (dist_got_entry
))
1069 | create_Imm16_X1 (tilepro_ha16 (dist_got0
));
1072 /* { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; addli r27, r28, &GOTPLT[0] } or
1073 { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; addli r27, r27, &GOTPLT[0] } */
1074 *pc
++ |= create_Imm16_X0 (dist_got_entry
)
1075 | create_Imm16_X1 (dist_got0
);
1077 /* { auli r29, zero, MY_PLT_INDEX ; lw r28, r28 } */
1078 *pc
|= create_Imm16_X0 (plt_index
);
1080 /* Set the relocation offset. */
1081 *r_offset
= got_offset
;
1086 #define TILEPRO_ELF_RELA_BYTES (sizeof(Elf32_External_Rela))
1089 /* Create an entry in an TILEPro ELF linker hash table. */
1091 static struct bfd_hash_entry
*
1092 link_hash_newfunc (struct bfd_hash_entry
*entry
,
1093 struct bfd_hash_table
*table
, const char *string
)
1095 /* Allocate the structure if it has not already been allocated by a
1100 bfd_hash_allocate (table
,
1101 sizeof (struct tilepro_elf_link_hash_entry
));
1106 /* Call the allocation method of the superclass. */
1107 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
1110 struct tilepro_elf_link_hash_entry
*eh
;
1112 eh
= (struct tilepro_elf_link_hash_entry
*) entry
;
1113 eh
->dyn_relocs
= NULL
;
1114 eh
->tls_type
= GOT_UNKNOWN
;
1120 /* Create a TILEPRO ELF linker hash table. */
1122 static struct bfd_link_hash_table
*
1123 tilepro_elf_link_hash_table_create (bfd
*abfd
)
1125 struct tilepro_elf_link_hash_table
*ret
;
1126 bfd_size_type amt
= sizeof (struct tilepro_elf_link_hash_table
);
1128 ret
= (struct tilepro_elf_link_hash_table
*) bfd_zmalloc (amt
);
1132 if (!_bfd_elf_link_hash_table_init (&ret
->elf
, abfd
, link_hash_newfunc
,
1133 sizeof (struct tilepro_elf_link_hash_entry
),
1140 return &ret
->elf
.root
;
1143 /* Create the .got section. */
1146 tilepro_elf_create_got_section (bfd
*abfd
, struct bfd_link_info
*info
)
1149 asection
*s
, *s_got
;
1150 struct elf_link_hash_entry
*h
;
1151 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
1152 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
1154 /* This function may be called more than once. */
1155 s
= bfd_get_section_by_name (abfd
, ".got");
1156 if (s
!= NULL
&& (s
->flags
& SEC_LINKER_CREATED
) != 0)
1159 flags
= bed
->dynamic_sec_flags
;
1161 s
= bfd_make_section_with_flags (abfd
,
1162 (bed
->rela_plts_and_copies_p
1163 ? ".rela.got" : ".rel.got"),
1164 (bed
->dynamic_sec_flags
1167 || ! bfd_set_section_alignment (abfd
, s
, bed
->s
->log_file_align
))
1171 s
= s_got
= bfd_make_section_with_flags (abfd
, ".got", flags
);
1173 || !bfd_set_section_alignment (abfd
, s
, bed
->s
->log_file_align
))
1177 /* The first bit of the global offset table is the header. */
1178 s
->size
+= bed
->got_header_size
;
1180 if (bed
->want_got_plt
)
1182 s
= bfd_make_section_with_flags (abfd
, ".got.plt", flags
);
1184 || !bfd_set_section_alignment (abfd
, s
,
1185 bed
->s
->log_file_align
))
1189 /* Reserve room for the header. */
1190 s
->size
+= GOTPLT_HEADER_SIZE
;
1193 if (bed
->want_got_sym
)
1195 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
1196 section. We don't do this in the linker script because we don't want
1197 to define the symbol if we are not creating a global offset
1199 h
= _bfd_elf_define_linkage_sym (abfd
, info
, s_got
,
1200 "_GLOBAL_OFFSET_TABLE_");
1201 elf_hash_table (info
)->hgot
= h
;
1209 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1210 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1214 tilepro_elf_create_dynamic_sections (bfd
*dynobj
,
1215 struct bfd_link_info
*info
)
1217 struct tilepro_elf_link_hash_table
*htab
;
1219 htab
= tilepro_elf_hash_table (info
);
1220 BFD_ASSERT (htab
!= NULL
);
1222 if (!tilepro_elf_create_got_section (dynobj
, info
))
1225 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
1228 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
1230 htab
->srelbss
= bfd_get_section_by_name (dynobj
, ".rela.bss");
1232 if (!htab
->elf
.splt
|| !htab
->elf
.srelplt
|| !htab
->sdynbss
1233 || (!info
->shared
&& !htab
->srelbss
))
1239 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1242 tilepro_elf_copy_indirect_symbol (struct bfd_link_info
*info
,
1243 struct elf_link_hash_entry
*dir
,
1244 struct elf_link_hash_entry
*ind
)
1246 struct tilepro_elf_link_hash_entry
*edir
, *eind
;
1248 edir
= (struct tilepro_elf_link_hash_entry
*) dir
;
1249 eind
= (struct tilepro_elf_link_hash_entry
*) ind
;
1251 if (eind
->dyn_relocs
!= NULL
)
1253 if (edir
->dyn_relocs
!= NULL
)
1255 struct tilepro_elf_dyn_relocs
**pp
;
1256 struct tilepro_elf_dyn_relocs
*p
;
1258 /* Add reloc counts against the indirect sym to the direct sym
1259 list. Merge any entries against the same section. */
1260 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
1262 struct tilepro_elf_dyn_relocs
*q
;
1264 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
1265 if (q
->sec
== p
->sec
)
1267 q
->pc_count
+= p
->pc_count
;
1268 q
->count
+= p
->count
;
1275 *pp
= edir
->dyn_relocs
;
1278 edir
->dyn_relocs
= eind
->dyn_relocs
;
1279 eind
->dyn_relocs
= NULL
;
1282 if (ind
->root
.type
== bfd_link_hash_indirect
1283 && dir
->got
.refcount
<= 0)
1285 edir
->tls_type
= eind
->tls_type
;
1286 eind
->tls_type
= GOT_UNKNOWN
;
1288 _bfd_elf_link_hash_copy_indirect (info
, dir
, ind
);
1291 /* Look through the relocs for a section during the first phase, and
1292 allocate space in the global offset table or procedure linkage
1296 tilepro_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
1297 asection
*sec
, const Elf_Internal_Rela
*relocs
)
1299 struct tilepro_elf_link_hash_table
*htab
;
1300 Elf_Internal_Shdr
*symtab_hdr
;
1301 struct elf_link_hash_entry
**sym_hashes
;
1302 bfd_vma
*local_got_offsets
;
1303 const Elf_Internal_Rela
*rel
;
1304 const Elf_Internal_Rela
*rel_end
;
1308 if (info
->relocatable
)
1311 htab
= tilepro_elf_hash_table (info
);
1312 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1313 sym_hashes
= elf_sym_hashes (abfd
);
1314 local_got_offsets
= elf_local_got_offsets (abfd
);
1318 num_relocs
= sec
->reloc_count
;
1320 BFD_ASSERT (is_tilepro_elf (abfd
) || num_relocs
== 0);
1322 if (htab
->elf
.dynobj
== NULL
)
1323 htab
->elf
.dynobj
= abfd
;
1325 rel_end
= relocs
+ num_relocs
;
1326 for (rel
= relocs
; rel
< rel_end
; rel
++)
1328 unsigned int r_type
;
1329 unsigned long r_symndx
;
1330 struct elf_link_hash_entry
*h
;
1333 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1334 r_type
= ELF32_R_TYPE (rel
->r_info
);
1336 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
1338 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"),
1343 if (r_symndx
< symtab_hdr
->sh_info
)
1347 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1348 while (h
->root
.type
== bfd_link_hash_indirect
1349 || h
->root
.type
== bfd_link_hash_warning
)
1350 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1355 case R_TILEPRO_IMM16_X0_TLS_GD
:
1356 case R_TILEPRO_IMM16_X1_TLS_GD
:
1357 case R_TILEPRO_IMM16_X0_TLS_GD_LO
:
1358 case R_TILEPRO_IMM16_X1_TLS_GD_LO
:
1359 case R_TILEPRO_IMM16_X0_TLS_GD_HI
:
1360 case R_TILEPRO_IMM16_X1_TLS_GD_HI
:
1361 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
1362 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
1363 tls_type
= GOT_TLS_GD
;
1364 goto have_got_reference
;
1366 case R_TILEPRO_IMM16_X0_TLS_IE
:
1367 case R_TILEPRO_IMM16_X1_TLS_IE
:
1368 case R_TILEPRO_IMM16_X0_TLS_IE_LO
:
1369 case R_TILEPRO_IMM16_X1_TLS_IE_LO
:
1370 case R_TILEPRO_IMM16_X0_TLS_IE_HI
:
1371 case R_TILEPRO_IMM16_X1_TLS_IE_HI
:
1372 case R_TILEPRO_IMM16_X0_TLS_IE_HA
:
1373 case R_TILEPRO_IMM16_X1_TLS_IE_HA
:
1374 tls_type
= GOT_TLS_IE
;
1376 info
->flags
|= DF_STATIC_TLS
;
1377 goto have_got_reference
;
1379 case R_TILEPRO_IMM16_X0_GOT
:
1380 case R_TILEPRO_IMM16_X1_GOT
:
1381 case R_TILEPRO_IMM16_X0_GOT_LO
:
1382 case R_TILEPRO_IMM16_X1_GOT_LO
:
1383 case R_TILEPRO_IMM16_X0_GOT_HI
:
1384 case R_TILEPRO_IMM16_X1_GOT_HI
:
1385 case R_TILEPRO_IMM16_X0_GOT_HA
:
1386 case R_TILEPRO_IMM16_X1_GOT_HA
:
1387 tls_type
= GOT_NORMAL
;
1391 /* This symbol requires a global offset table entry. */
1397 h
->got
.refcount
+= 1;
1398 old_tls_type
= tilepro_elf_hash_entry(h
)->tls_type
;
1402 bfd_signed_vma
*local_got_refcounts
;
1404 /* This is a global offset table entry for a local symbol. */
1405 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1406 if (local_got_refcounts
== NULL
)
1410 size
= symtab_hdr
->sh_info
;
1411 size
*= (sizeof (bfd_signed_vma
) + sizeof(char));
1412 local_got_refcounts
= ((bfd_signed_vma
*)
1413 bfd_zalloc (abfd
, size
));
1414 if (local_got_refcounts
== NULL
)
1416 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
1417 _bfd_tilepro_elf_local_got_tls_type (abfd
)
1418 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
1420 local_got_refcounts
[r_symndx
] += 1;
1422 _bfd_tilepro_elf_local_got_tls_type (abfd
) [r_symndx
];
1425 /* If a TLS symbol is accessed using IE at least once,
1426 there is no point to use dynamic model for it. */
1427 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
1428 && (old_tls_type
!= GOT_TLS_GD
1429 || tls_type
!= GOT_TLS_IE
))
1431 if (old_tls_type
== GOT_TLS_IE
&& tls_type
== GOT_TLS_GD
)
1432 tls_type
= old_tls_type
;
1435 (*_bfd_error_handler
)
1436 (_("%B: `%s' accessed both as normal and thread local symbol"),
1437 abfd
, h
? h
->root
.root
.string
: "<local>");
1442 if (old_tls_type
!= tls_type
)
1445 tilepro_elf_hash_entry (h
)->tls_type
= tls_type
;
1447 _bfd_tilepro_elf_local_got_tls_type (abfd
) [r_symndx
] =
1452 if (htab
->elf
.sgot
== NULL
)
1454 if (!tilepro_elf_create_got_section (htab
->elf
.dynobj
, info
))
1459 case R_TILEPRO_JOFFLONG_X1_PLT
:
1460 /* This symbol requires a procedure linkage table entry. We
1461 actually build the entry in adjust_dynamic_symbol,
1462 because this might be a case of linking PIC code without
1463 linking in any dynamic objects, in which case we don't
1464 need to generate a procedure linkage table after all. */
1469 h
->plt
.refcount
+= 1;
1473 case R_TILEPRO_32_PCREL
:
1474 case R_TILEPRO_16_PCREL
:
1475 case R_TILEPRO_8_PCREL
:
1476 case R_TILEPRO_IMM16_X0_PCREL
:
1477 case R_TILEPRO_IMM16_X1_PCREL
:
1478 case R_TILEPRO_IMM16_X0_LO_PCREL
:
1479 case R_TILEPRO_IMM16_X1_LO_PCREL
:
1480 case R_TILEPRO_IMM16_X0_HI_PCREL
:
1481 case R_TILEPRO_IMM16_X1_HI_PCREL
:
1482 case R_TILEPRO_IMM16_X0_HA_PCREL
:
1483 case R_TILEPRO_IMM16_X1_HA_PCREL
:
1488 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1495 case R_TILEPRO_LO16
:
1496 case R_TILEPRO_HI16
:
1497 case R_TILEPRO_HA16
:
1498 case R_TILEPRO_COPY
:
1499 case R_TILEPRO_GLOB_DAT
:
1500 case R_TILEPRO_JMP_SLOT
:
1501 case R_TILEPRO_RELATIVE
:
1502 case R_TILEPRO_BROFF_X1
:
1503 case R_TILEPRO_JOFFLONG_X1
:
1504 case R_TILEPRO_IMM8_X0
:
1505 case R_TILEPRO_IMM8_Y0
:
1506 case R_TILEPRO_IMM8_X1
:
1507 case R_TILEPRO_IMM8_Y1
:
1508 case R_TILEPRO_DEST_IMM8_X1
:
1509 case R_TILEPRO_MT_IMM15_X1
:
1510 case R_TILEPRO_MF_IMM15_X1
:
1511 case R_TILEPRO_IMM16_X0
:
1512 case R_TILEPRO_IMM16_X1
:
1513 case R_TILEPRO_IMM16_X0_LO
:
1514 case R_TILEPRO_IMM16_X1_LO
:
1515 case R_TILEPRO_IMM16_X0_HI
:
1516 case R_TILEPRO_IMM16_X1_HI
:
1517 case R_TILEPRO_IMM16_X0_HA
:
1518 case R_TILEPRO_IMM16_X1_HA
:
1519 case R_TILEPRO_MMSTART_X0
:
1520 case R_TILEPRO_MMEND_X0
:
1521 case R_TILEPRO_MMSTART_X1
:
1522 case R_TILEPRO_MMEND_X1
:
1523 case R_TILEPRO_SHAMT_X0
:
1524 case R_TILEPRO_SHAMT_X1
:
1525 case R_TILEPRO_SHAMT_Y0
:
1526 case R_TILEPRO_SHAMT_Y1
:
1533 /* We may need a .plt entry if the function this reloc
1534 refers to is in a shared lib. */
1535 h
->plt
.refcount
+= 1;
1539 /* If we are creating a shared library, and this is a reloc
1540 against a global symbol, or a non PC relative reloc
1541 against a local symbol, then we need to copy the reloc
1542 into the shared library. However, if we are linking with
1543 -Bsymbolic, we do not need to copy a reloc against a
1544 global symbol which is defined in an object we are
1545 including in the link (i.e., DEF_REGULAR is set). At
1546 this point we have not seen all the input files, so it is
1547 possible that DEF_REGULAR is not set now but will be set
1548 later (it is never cleared). In case of a weak definition,
1549 DEF_REGULAR may be cleared later by a strong definition in
1550 a shared library. We account for that possibility below by
1551 storing information in the relocs_copied field of the hash
1552 table entry. A similar situation occurs when creating
1553 shared libraries and symbol visibility changes render the
1556 If on the other hand, we are creating an executable, we
1557 may need to keep relocations for symbols satisfied by a
1558 dynamic library if we manage to avoid copy relocs for the
1561 && (sec
->flags
& SEC_ALLOC
) != 0
1562 && (! tilepro_elf_howto_table
[r_type
].pc_relative
1564 && (! info
->symbolic
1565 || h
->root
.type
== bfd_link_hash_defweak
1566 || !h
->def_regular
))))
1568 && (sec
->flags
& SEC_ALLOC
) != 0
1570 && (h
->root
.type
== bfd_link_hash_defweak
1571 || !h
->def_regular
)))
1573 struct tilepro_elf_dyn_relocs
*p
;
1574 struct tilepro_elf_dyn_relocs
**head
;
1576 /* When creating a shared object, we must copy these
1577 relocs into the output file. We create a reloc
1578 section in dynobj and make room for the reloc. */
1581 sreloc
= _bfd_elf_make_dynamic_reloc_section
1582 (sec
, htab
->elf
.dynobj
, 2, abfd
, /*rela?*/ TRUE
);
1588 /* If this is a global symbol, we count the number of
1589 relocations we need for this symbol. */
1592 &((struct tilepro_elf_link_hash_entry
*) h
)->dyn_relocs
;
1595 /* Track dynamic relocs needed for local syms too.
1596 We really need local syms available to do this
1601 Elf_Internal_Sym
*isym
;
1603 isym
= bfd_sym_from_r_symndx (&htab
->sym_cache
,
1608 s
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1612 vpp
= &elf_section_data (s
)->local_dynrel
;
1613 head
= (struct tilepro_elf_dyn_relocs
**) vpp
;
1617 if (p
== NULL
|| p
->sec
!= sec
)
1619 bfd_size_type amt
= sizeof *p
;
1620 p
= ((struct tilepro_elf_dyn_relocs
*)
1621 bfd_alloc (htab
->elf
.dynobj
, amt
));
1632 if (tilepro_elf_howto_table
[r_type
].pc_relative
)
1638 case R_TILEPRO_GNU_VTINHERIT
:
1639 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
1643 case R_TILEPRO_GNU_VTENTRY
:
1644 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
1658 tilepro_elf_gc_mark_hook (asection
*sec
,
1659 struct bfd_link_info
*info
,
1660 Elf_Internal_Rela
*rel
,
1661 struct elf_link_hash_entry
*h
,
1662 Elf_Internal_Sym
*sym
)
1666 switch (ELF32_R_TYPE (rel
->r_info
))
1668 case R_TILEPRO_GNU_VTINHERIT
:
1669 case R_TILEPRO_GNU_VTENTRY
:
1674 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
1677 /* Update the got entry reference counts for the section being removed. */
1679 tilepro_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
1680 asection
*sec
, const Elf_Internal_Rela
*relocs
)
1682 struct tilepro_elf_link_hash_table
*htab
;
1683 Elf_Internal_Shdr
*symtab_hdr
;
1684 struct elf_link_hash_entry
**sym_hashes
;
1685 bfd_signed_vma
*local_got_refcounts
;
1686 const Elf_Internal_Rela
*rel
, *relend
;
1688 if (info
->relocatable
)
1691 BFD_ASSERT (is_tilepro_elf (abfd
) || sec
->reloc_count
== 0);
1693 elf_section_data (sec
)->local_dynrel
= NULL
;
1695 htab
= tilepro_elf_hash_table (info
);
1696 BFD_ASSERT (htab
!= NULL
);
1697 symtab_hdr
= &elf_symtab_hdr (abfd
);
1698 sym_hashes
= elf_sym_hashes (abfd
);
1699 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1701 relend
= relocs
+ sec
->reloc_count
;
1702 for (rel
= relocs
; rel
< relend
; rel
++)
1704 unsigned long r_symndx
;
1705 unsigned int r_type
;
1706 struct elf_link_hash_entry
*h
= NULL
;
1708 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1709 if (r_symndx
>= symtab_hdr
->sh_info
)
1711 struct tilepro_elf_link_hash_entry
*eh
;
1712 struct tilepro_elf_dyn_relocs
**pp
;
1713 struct tilepro_elf_dyn_relocs
*p
;
1715 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1716 while (h
->root
.type
== bfd_link_hash_indirect
1717 || h
->root
.type
== bfd_link_hash_warning
)
1718 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1719 eh
= (struct tilepro_elf_link_hash_entry
*) h
;
1720 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
1723 /* Everything must go for SEC. */
1729 r_type
= ELF32_R_TYPE (rel
->r_info
);
1732 case R_TILEPRO_IMM16_X0_GOT
:
1733 case R_TILEPRO_IMM16_X1_GOT
:
1734 case R_TILEPRO_IMM16_X0_GOT_LO
:
1735 case R_TILEPRO_IMM16_X1_GOT_LO
:
1736 case R_TILEPRO_IMM16_X0_GOT_HI
:
1737 case R_TILEPRO_IMM16_X1_GOT_HI
:
1738 case R_TILEPRO_IMM16_X0_GOT_HA
:
1739 case R_TILEPRO_IMM16_X1_GOT_HA
:
1740 case R_TILEPRO_IMM16_X0_TLS_GD
:
1741 case R_TILEPRO_IMM16_X1_TLS_GD
:
1742 case R_TILEPRO_IMM16_X0_TLS_GD_LO
:
1743 case R_TILEPRO_IMM16_X1_TLS_GD_LO
:
1744 case R_TILEPRO_IMM16_X0_TLS_GD_HI
:
1745 case R_TILEPRO_IMM16_X1_TLS_GD_HI
:
1746 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
1747 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
1748 case R_TILEPRO_IMM16_X0_TLS_IE
:
1749 case R_TILEPRO_IMM16_X1_TLS_IE
:
1750 case R_TILEPRO_IMM16_X0_TLS_IE_LO
:
1751 case R_TILEPRO_IMM16_X1_TLS_IE_LO
:
1752 case R_TILEPRO_IMM16_X0_TLS_IE_HI
:
1753 case R_TILEPRO_IMM16_X1_TLS_IE_HI
:
1754 case R_TILEPRO_IMM16_X0_TLS_IE_HA
:
1755 case R_TILEPRO_IMM16_X1_TLS_IE_HA
:
1758 if (h
->got
.refcount
> 0)
1763 if (local_got_refcounts
[r_symndx
] > 0)
1764 local_got_refcounts
[r_symndx
]--;
1768 case R_TILEPRO_32_PCREL
:
1769 case R_TILEPRO_16_PCREL
:
1770 case R_TILEPRO_8_PCREL
:
1771 case R_TILEPRO_IMM16_X0_PCREL
:
1772 case R_TILEPRO_IMM16_X1_PCREL
:
1773 case R_TILEPRO_IMM16_X0_LO_PCREL
:
1774 case R_TILEPRO_IMM16_X1_LO_PCREL
:
1775 case R_TILEPRO_IMM16_X0_HI_PCREL
:
1776 case R_TILEPRO_IMM16_X1_HI_PCREL
:
1777 case R_TILEPRO_IMM16_X0_HA_PCREL
:
1778 case R_TILEPRO_IMM16_X1_HA_PCREL
:
1780 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1787 case R_TILEPRO_LO16
:
1788 case R_TILEPRO_HI16
:
1789 case R_TILEPRO_HA16
:
1790 case R_TILEPRO_COPY
:
1791 case R_TILEPRO_GLOB_DAT
:
1792 case R_TILEPRO_JMP_SLOT
:
1793 case R_TILEPRO_RELATIVE
:
1794 case R_TILEPRO_BROFF_X1
:
1795 case R_TILEPRO_JOFFLONG_X1
:
1796 case R_TILEPRO_IMM8_X0
:
1797 case R_TILEPRO_IMM8_Y0
:
1798 case R_TILEPRO_IMM8_X1
:
1799 case R_TILEPRO_IMM8_Y1
:
1800 case R_TILEPRO_DEST_IMM8_X1
:
1801 case R_TILEPRO_MT_IMM15_X1
:
1802 case R_TILEPRO_MF_IMM15_X1
:
1803 case R_TILEPRO_IMM16_X0
:
1804 case R_TILEPRO_IMM16_X1
:
1805 case R_TILEPRO_IMM16_X0_LO
:
1806 case R_TILEPRO_IMM16_X1_LO
:
1807 case R_TILEPRO_IMM16_X0_HI
:
1808 case R_TILEPRO_IMM16_X1_HI
:
1809 case R_TILEPRO_IMM16_X0_HA
:
1810 case R_TILEPRO_IMM16_X1_HA
:
1811 case R_TILEPRO_MMSTART_X0
:
1812 case R_TILEPRO_MMEND_X0
:
1813 case R_TILEPRO_MMSTART_X1
:
1814 case R_TILEPRO_MMEND_X1
:
1815 case R_TILEPRO_SHAMT_X0
:
1816 case R_TILEPRO_SHAMT_X1
:
1817 case R_TILEPRO_SHAMT_Y0
:
1818 case R_TILEPRO_SHAMT_Y1
:
1823 case R_TILEPRO_JOFFLONG_X1_PLT
:
1826 if (h
->plt
.refcount
> 0)
1839 /* Adjust a symbol defined by a dynamic object and referenced by a
1840 regular object. The current definition is in some section of the
1841 dynamic object, but we're not including those sections. We have to
1842 change the definition to something the rest of the link can
1846 tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
1847 struct elf_link_hash_entry
*h
)
1849 struct tilepro_elf_link_hash_table
*htab
;
1850 struct tilepro_elf_link_hash_entry
* eh
;
1851 struct tilepro_elf_dyn_relocs
*p
;
1854 htab
= tilepro_elf_hash_table (info
);
1855 BFD_ASSERT (htab
!= NULL
);
1857 /* Make sure we know what is going on here. */
1858 BFD_ASSERT (htab
->elf
.dynobj
!= NULL
1860 || h
->u
.weakdef
!= NULL
1863 && !h
->def_regular
)));
1865 /* If this is a function, put it in the procedure linkage table. We
1866 will fill in the contents of the procedure linkage table later
1867 (although we could actually do it here). */
1868 if (h
->type
== STT_FUNC
|| h
->needs_plt
)
1870 if (h
->plt
.refcount
<= 0
1871 || SYMBOL_CALLS_LOCAL (info
, h
)
1872 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
1873 && h
->root
.type
== bfd_link_hash_undefweak
))
1875 /* This case can occur if we saw a R_TILEPRO_JOFFLONG_X1_PLT
1876 reloc in an input file, but the symbol was never referred
1877 to by a dynamic object, or if all references were garbage
1878 collected. In such a case, we don't actually need to build
1879 a procedure linkage table, and we can just do a
1880 R_TILEPRO_JOFFLONG_X1 relocation instead. */
1881 h
->plt
.offset
= (bfd_vma
) -1;
1888 h
->plt
.offset
= (bfd_vma
) -1;
1890 /* If this is a weak symbol, and there is a real definition, the
1891 processor independent code will have arranged for us to see the
1892 real definition first, and we can just use the same value. */
1893 if (h
->u
.weakdef
!= NULL
)
1895 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
1896 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
1897 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
1898 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
1902 /* This is a reference to a symbol defined by a dynamic object which
1903 is not a function. */
1905 /* If we are creating a shared library, we must presume that the
1906 only references to the symbol are via the global offset table.
1907 For such cases we need not do anything here; the relocations will
1908 be handled correctly by relocate_section. */
1912 /* If there are no references to this symbol that do not use the
1913 GOT, we don't need to generate a copy reloc. */
1914 if (!h
->non_got_ref
)
1917 /* If -z nocopyreloc was given, we won't generate them either. */
1918 if (info
->nocopyreloc
)
1924 eh
= (struct tilepro_elf_link_hash_entry
*) h
;
1925 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1927 s
= p
->sec
->output_section
;
1928 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
1932 /* If we didn't find any dynamic relocs in read-only sections, then
1933 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1942 (*_bfd_error_handler
) (_("dynamic variable `%s' is zero size"),
1943 h
->root
.root
.string
);
1947 /* We must allocate the symbol in our .dynbss section, which will
1948 become part of the .bss section of the executable. There will be
1949 an entry for this symbol in the .dynsym section. The dynamic
1950 object will contain position independent code, so all references
1951 from the dynamic object to this symbol will go through the global
1952 offset table. The dynamic linker will use the .dynsym entry to
1953 determine the address it must put in the global offset table, so
1954 both the dynamic object and the regular object will refer to the
1955 same memory location for the variable. */
1957 /* We must generate a R_TILEPRO_COPY reloc to tell the dynamic linker
1958 to copy the initial value out of the dynamic object and into the
1959 runtime process image. We need to remember the offset into the
1960 .rel.bss section we are going to use. */
1961 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
1963 htab
->srelbss
->size
+= TILEPRO_ELF_RELA_BYTES
;
1967 return _bfd_elf_adjust_dynamic_copy (h
, htab
->sdynbss
);
1970 /* Allocate space in .plt, .got and associated reloc sections for
1974 allocate_dynrelocs (struct elf_link_hash_entry
*h
, PTR inf
)
1976 struct bfd_link_info
*info
;
1977 struct tilepro_elf_link_hash_table
*htab
;
1978 struct tilepro_elf_link_hash_entry
*eh
;
1979 struct tilepro_elf_dyn_relocs
*p
;
1981 if (h
->root
.type
== bfd_link_hash_indirect
)
1984 if (h
->root
.type
== bfd_link_hash_warning
)
1985 /* When warning symbols are created, they **replace** the "real"
1986 entry in the hash table, thus we never get to see the real
1987 symbol in a hash traversal. So look at it now. */
1988 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1990 info
= (struct bfd_link_info
*) inf
;
1991 htab
= tilepro_elf_hash_table (info
);
1992 BFD_ASSERT (htab
!= NULL
);
1994 if (htab
->elf
.dynamic_sections_created
1995 && h
->plt
.refcount
> 0)
1997 /* Make sure this symbol is output as a dynamic symbol.
1998 Undefined weak syms won't yet be marked as dynamic. */
1999 if (h
->dynindx
== -1
2000 && !h
->forced_local
)
2002 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
2006 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
, h
))
2008 asection
*s
= htab
->elf
.splt
;
2010 /* Allocate room for the header. */
2013 s
->size
= PLT_HEADER_SIZE
;
2016 h
->plt
.offset
= s
->size
;
2018 /* If this symbol is not defined in a regular file, and we are
2019 not generating a shared library, then set the symbol to this
2020 location in the .plt. This is required to make function
2021 pointers compare as equal between the normal executable and
2022 the shared library. */
2026 h
->root
.u
.def
.section
= s
;
2027 h
->root
.u
.def
.value
= h
->plt
.offset
;
2030 /* Make room for this entry. */
2031 s
->size
+= PLT_ENTRY_SIZE
;
2033 /* We also need to make an entry in the .got.plt section. */
2034 htab
->elf
.sgotplt
->size
+= GOT_ENTRY_SIZE
;
2036 /* We also need to make an entry in the .rela.plt section. */
2037 htab
->elf
.srelplt
->size
+= TILEPRO_ELF_RELA_BYTES
;
2041 h
->plt
.offset
= (bfd_vma
) -1;
2047 h
->plt
.offset
= (bfd_vma
) -1;
2051 if (h
->got
.refcount
> 0)
2055 int tls_type
= tilepro_elf_hash_entry(h
)->tls_type
;
2057 /* Make sure this symbol is output as a dynamic symbol.
2058 Undefined weak syms won't yet be marked as dynamic. */
2059 if (h
->dynindx
== -1
2060 && !h
->forced_local
)
2062 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
2067 h
->got
.offset
= s
->size
;
2068 s
->size
+= TILEPRO_BYTES_PER_WORD
;
2069 /* R_TILEPRO_IMM16_Xn_TLS_GD entries need 2 consecutive GOT slots. */
2070 if (tls_type
== GOT_TLS_GD
)
2071 s
->size
+= TILEPRO_BYTES_PER_WORD
;
2072 dyn
= htab
->elf
.dynamic_sections_created
;
2073 /* R_TILEPRO_IMM16_Xn_TLS_IE_xxx needs one dynamic relocation,
2074 R_TILEPRO_IMM16_Xn_TLS_GD_xxx needs two if local symbol and two if
2076 if (tls_type
== GOT_TLS_GD
|| tls_type
== GOT_TLS_IE
)
2077 htab
->elf
.srelgot
->size
+= 2 * TILEPRO_ELF_RELA_BYTES
;
2078 else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
))
2079 htab
->elf
.srelgot
->size
+= TILEPRO_ELF_RELA_BYTES
;
2082 h
->got
.offset
= (bfd_vma
) -1;
2084 eh
= (struct tilepro_elf_link_hash_entry
*) h
;
2085 if (eh
->dyn_relocs
== NULL
)
2088 /* In the shared -Bsymbolic case, discard space allocated for
2089 dynamic pc-relative relocs against symbols which turn out to be
2090 defined in regular objects. For the normal shared case, discard
2091 space for pc-relative relocs that have become local due to symbol
2092 visibility changes. */
2096 if (SYMBOL_CALLS_LOCAL (info
, h
))
2098 struct tilepro_elf_dyn_relocs
**pp
;
2100 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
2102 p
->count
-= p
->pc_count
;
2111 /* Also discard relocs on undefined weak syms with non-default
2113 if (eh
->dyn_relocs
!= NULL
2114 && h
->root
.type
== bfd_link_hash_undefweak
)
2116 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
)
2117 eh
->dyn_relocs
= NULL
;
2119 /* Make sure undefined weak symbols are output as a dynamic
2121 else if (h
->dynindx
== -1
2122 && !h
->forced_local
)
2124 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
2131 /* For the non-shared case, discard space for relocs against
2132 symbols which turn out to need copy relocs or are not
2138 || (htab
->elf
.dynamic_sections_created
2139 && (h
->root
.type
== bfd_link_hash_undefweak
2140 || h
->root
.type
== bfd_link_hash_undefined
))))
2142 /* Make sure this symbol is output as a dynamic symbol.
2143 Undefined weak syms won't yet be marked as dynamic. */
2144 if (h
->dynindx
== -1
2145 && !h
->forced_local
)
2147 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
2151 /* If that succeeded, we know we'll be keeping all the
2153 if (h
->dynindx
!= -1)
2157 eh
->dyn_relocs
= NULL
;
2162 /* Finally, allocate space. */
2163 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2165 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
2166 sreloc
->size
+= p
->count
* TILEPRO_ELF_RELA_BYTES
;
2172 /* Find any dynamic relocs that apply to read-only sections. */
2175 readonly_dynrelocs (struct elf_link_hash_entry
*h
, PTR inf
)
2177 struct tilepro_elf_link_hash_entry
*eh
;
2178 struct tilepro_elf_dyn_relocs
*p
;
2180 if (h
->root
.type
== bfd_link_hash_warning
)
2181 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
2183 eh
= (struct tilepro_elf_link_hash_entry
*) h
;
2184 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2186 asection
*s
= p
->sec
->output_section
;
2188 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
2190 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
2192 info
->flags
|= DF_TEXTREL
;
2194 /* Not an error, just cut short the traversal. */
2201 /* Return true if the dynamic symbol for a given section should be
2202 omitted when creating a shared library. */
2205 tilepro_elf_omit_section_dynsym (bfd
*output_bfd
,
2206 struct bfd_link_info
*info
,
2209 /* We keep the .got section symbol so that explicit relocations
2210 against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2211 can be turned into relocations against the .got symbol. */
2212 if (strcmp (p
->name
, ".got") == 0)
2215 return _bfd_elf_link_omit_section_dynsym (output_bfd
, info
, p
);
2218 /* Set the sizes of the dynamic sections. */
2220 #define ELF32_DYNAMIC_INTERPRETER "/lib/ld.so.1"
2223 tilepro_elf_size_dynamic_sections (bfd
*output_bfd
,
2224 struct bfd_link_info
*info
)
2228 struct tilepro_elf_link_hash_table
*htab
;
2233 htab
= tilepro_elf_hash_table (info
);
2234 BFD_ASSERT (htab
!= NULL
);
2235 dynobj
= htab
->elf
.dynobj
;
2236 BFD_ASSERT (dynobj
!= NULL
);
2238 if (elf_hash_table (info
)->dynamic_sections_created
)
2240 /* Set the contents of the .interp section to the interpreter. */
2241 if (info
->executable
)
2243 s
= bfd_get_section_by_name (dynobj
, ".interp");
2244 BFD_ASSERT (s
!= NULL
);
2245 s
->size
= sizeof ELF32_DYNAMIC_INTERPRETER
;
2246 s
->contents
= (unsigned char *) ELF32_DYNAMIC_INTERPRETER
;
2250 /* Set up .got offsets for local syms, and space for local dynamic
2252 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2254 bfd_signed_vma
*local_got
;
2255 bfd_signed_vma
*end_local_got
;
2256 char *local_tls_type
;
2257 bfd_size_type locsymcount
;
2258 Elf_Internal_Shdr
*symtab_hdr
;
2261 if (! is_tilepro_elf (ibfd
))
2264 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
2266 struct tilepro_elf_dyn_relocs
*p
;
2268 for (p
= elf_section_data (s
)->local_dynrel
; p
!= NULL
; p
= p
->next
)
2270 if (!bfd_is_abs_section (p
->sec
)
2271 && bfd_is_abs_section (p
->sec
->output_section
))
2273 /* Input section has been discarded, either because
2274 it is a copy of a linkonce section or due to
2275 linker script /DISCARD/, so we'll be discarding
2278 else if (p
->count
!= 0)
2280 srel
= elf_section_data (p
->sec
)->sreloc
;
2281 srel
->size
+= p
->count
* TILEPRO_ELF_RELA_BYTES
;
2282 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
2283 info
->flags
|= DF_TEXTREL
;
2288 local_got
= elf_local_got_refcounts (ibfd
);
2292 symtab_hdr
= &elf_symtab_hdr (ibfd
);
2293 locsymcount
= symtab_hdr
->sh_info
;
2294 end_local_got
= local_got
+ locsymcount
;
2295 local_tls_type
= _bfd_tilepro_elf_local_got_tls_type (ibfd
);
2297 srel
= htab
->elf
.srelgot
;
2298 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
2302 *local_got
= s
->size
;
2303 s
->size
+= TILEPRO_BYTES_PER_WORD
;
2304 if (*local_tls_type
== GOT_TLS_GD
)
2305 s
->size
+= TILEPRO_BYTES_PER_WORD
;
2307 || *local_tls_type
== GOT_TLS_GD
2308 || *local_tls_type
== GOT_TLS_IE
)
2309 srel
->size
+= TILEPRO_ELF_RELA_BYTES
;
2312 *local_got
= (bfd_vma
) -1;
2316 /* Allocate global sym .plt and .got entries, and space for global
2317 sym dynamic relocs. */
2318 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, (PTR
) info
);
2320 if (elf_hash_table (info
)->dynamic_sections_created
)
2322 /* If the .got section is more than 0x8000 bytes, we add
2323 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
2324 bit relocations have a greater chance of working. */
2325 if (htab
->elf
.sgot
->size
>= 0x8000
2326 && elf_hash_table (info
)->hgot
->root
.u
.def
.value
== 0)
2327 elf_hash_table (info
)->hgot
->root
.u
.def
.value
= 0x8000;
2330 if (htab
->elf
.sgotplt
)
2332 struct elf_link_hash_entry
*got
;
2333 got
= elf_link_hash_lookup (elf_hash_table (info
),
2334 "_GLOBAL_OFFSET_TABLE_",
2335 FALSE
, FALSE
, FALSE
);
2337 /* Don't allocate .got.plt section if there are no GOT nor PLT
2338 entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */
2340 || !got
->ref_regular_nonweak
)
2341 && (htab
->elf
.sgotplt
->size
2342 == GOTPLT_HEADER_SIZE
)
2343 && (htab
->elf
.splt
== NULL
2344 || htab
->elf
.splt
->size
== 0)
2345 && (htab
->elf
.sgot
== NULL
2346 || (htab
->elf
.sgot
->size
2347 == get_elf_backend_data (output_bfd
)->got_header_size
)))
2348 htab
->elf
.sgotplt
->size
= 0;
2351 /* The check_relocs and adjust_dynamic_symbol entry points have
2352 determined the sizes of the various dynamic sections. Allocate
2354 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
2356 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
2359 if (s
== htab
->elf
.splt
2360 || s
== htab
->elf
.sgot
2361 || s
== htab
->elf
.sgotplt
2362 || s
== htab
->sdynbss
)
2364 /* Strip this section if we don't need it; see the
2367 else if (strncmp (s
->name
, ".rela", 5) == 0)
2371 /* We use the reloc_count field as a counter if we need
2372 to copy relocs into the output file. */
2378 /* It's not one of our sections. */
2384 /* If we don't need this section, strip it from the
2385 output file. This is mostly to handle .rela.bss and
2386 .rela.plt. We must create both sections in
2387 create_dynamic_sections, because they must be created
2388 before the linker maps input sections to output
2389 sections. The linker does that before
2390 adjust_dynamic_symbol is called, and it is that
2391 function which decides whether anything needs to go
2392 into these sections. */
2393 s
->flags
|= SEC_EXCLUDE
;
2397 if ((s
->flags
& SEC_HAS_CONTENTS
) == 0)
2400 /* Allocate memory for the section contents. Zero the memory
2401 for the benefit of .rela.plt, which has 4 unused entries
2402 at the beginning, and we don't want garbage. */
2403 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
2404 if (s
->contents
== NULL
)
2408 if (elf_hash_table (info
)->dynamic_sections_created
)
2410 /* Add some entries to the .dynamic section. We fill in the
2411 values later, in tilepro_elf_finish_dynamic_sections, but we
2412 must add the entries now so that we get the correct size for
2413 the .dynamic section. The DT_DEBUG entry is filled in by the
2414 dynamic linker and used by the debugger. */
2415 #define add_dynamic_entry(TAG, VAL) \
2416 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2418 if (info
->executable
)
2420 if (!add_dynamic_entry (DT_DEBUG
, 0))
2424 if (htab
->elf
.srelplt
->size
!= 0)
2426 if (!add_dynamic_entry (DT_PLTGOT
, 0)
2427 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
2428 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
2429 || !add_dynamic_entry (DT_JMPREL
, 0))
2433 if (!add_dynamic_entry (DT_RELA
, 0)
2434 || !add_dynamic_entry (DT_RELASZ
, 0)
2435 || !add_dynamic_entry (DT_RELAENT
, TILEPRO_ELF_RELA_BYTES
))
2438 /* If any dynamic relocs apply to a read-only section,
2439 then we need a DT_TEXTREL entry. */
2440 if ((info
->flags
& DF_TEXTREL
) == 0)
2441 elf_link_hash_traverse (&htab
->elf
, readonly_dynrelocs
,
2444 if (info
->flags
& DF_TEXTREL
)
2446 if (!add_dynamic_entry (DT_TEXTREL
, 0))
2450 #undef add_dynamic_entry
2455 /* Return the base VMA address which should be subtracted from real addresses
2456 when resolving @dtpoff relocation.
2457 This is PT_TLS segment p_vaddr. */
2460 dtpoff_base (struct bfd_link_info
*info
)
2462 /* If tls_sec is NULL, we should have signalled an error already. */
2463 if (elf_hash_table (info
)->tls_sec
== NULL
)
2465 return elf_hash_table (info
)->tls_sec
->vma
;
2468 /* Return the relocation value for R_TILEPRO_TLS_TPOFF32. */
2471 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
2473 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
2475 /* If tls_sec is NULL, we should have signalled an error already. */
2476 if (htab
->tls_sec
== NULL
)
2479 return (address
- htab
->tls_sec
->vma
);
2482 /* Relocate an TILEPRO ELF section.
2484 The RELOCATE_SECTION function is called by the new ELF backend linker
2485 to handle the relocations for a section.
2487 The relocs are always passed as Rela structures.
2489 This function is responsible for adjusting the section contents as
2490 necessary, and (if generating a relocatable output file) adjusting
2491 the reloc addend as necessary.
2493 This function does not have to worry about setting the reloc
2494 address or the reloc symbol index.
2496 LOCAL_SYMS is a pointer to the swapped in local symbols.
2498 LOCAL_SECTIONS is an array giving the section in the input file
2499 corresponding to the st_shndx field of each local symbol.
2501 The global hash table entry for the global symbols can be found
2502 via elf_sym_hashes (input_bfd).
2504 When generating relocatable output, this function must handle
2505 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
2506 going to be the section symbol corresponding to the output
2507 section, which means that the addend must be adjusted
2511 tilepro_elf_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
2512 bfd
*input_bfd
, asection
*input_section
,
2513 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
2514 Elf_Internal_Sym
*local_syms
,
2515 asection
**local_sections
)
2517 struct tilepro_elf_link_hash_table
*htab
;
2518 Elf_Internal_Shdr
*symtab_hdr
;
2519 struct elf_link_hash_entry
**sym_hashes
;
2520 bfd_vma
*local_got_offsets
;
2523 Elf_Internal_Rela
*rel
;
2524 Elf_Internal_Rela
*relend
;
2527 htab
= tilepro_elf_hash_table (info
);
2528 BFD_ASSERT (htab
!= NULL
);
2529 symtab_hdr
= &elf_symtab_hdr (input_bfd
);
2530 sym_hashes
= elf_sym_hashes (input_bfd
);
2531 local_got_offsets
= elf_local_got_offsets (input_bfd
);
2533 if (elf_hash_table (info
)->hgot
== NULL
)
2536 got_base
= elf_hash_table (info
)->hgot
->root
.u
.def
.value
;
2538 sreloc
= elf_section_data (input_section
)->sreloc
;
2541 num_relocs
= input_section
->reloc_count
;
2542 relend
= relocs
+ num_relocs
;
2543 for (; rel
< relend
; rel
++)
2545 int r_type
, tls_type
;
2546 reloc_howto_type
*howto
;
2547 unsigned long r_symndx
;
2548 struct elf_link_hash_entry
*h
;
2549 Elf_Internal_Sym
*sym
;
2550 tilepro_create_func create_func
;
2553 bfd_reloc_status_type r
;
2556 bfd_boolean is_plt
= FALSE
;
2558 bfd_boolean unresolved_reloc
;
2560 r_type
= ELF32_R_TYPE (rel
->r_info
);
2561 if (r_type
== R_TILEPRO_GNU_VTINHERIT
2562 || r_type
== R_TILEPRO_GNU_VTENTRY
)
2565 if ((unsigned int)r_type
>= NELEMS(tilepro_elf_howto_table
))
2567 /* Not clear if we need to check here, but just be paranoid. */
2568 (*_bfd_error_handler
)
2569 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
2570 input_bfd
, r_type
, input_section
);
2571 bfd_set_error (bfd_error_bad_value
);
2575 howto
= tilepro_elf_howto_table
+ r_type
;
2577 /* This is a final link. */
2578 r_symndx
= ELF32_R_SYM (rel
->r_info
);
2582 unresolved_reloc
= FALSE
;
2583 if (r_symndx
< symtab_hdr
->sh_info
)
2585 sym
= local_syms
+ r_symndx
;
2586 sec
= local_sections
[r_symndx
];
2587 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
2593 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
2594 r_symndx
, symtab_hdr
, sym_hashes
,
2596 unresolved_reloc
, warned
);
2599 /* To avoid generating warning messages about truncated
2600 relocations, set the relocation's address to be the same as
2601 the start of this section. */
2602 if (input_section
->output_section
!= NULL
)
2603 relocation
= input_section
->output_section
->vma
;
2609 if (sec
!= NULL
&& elf_discarded_section (sec
))
2610 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
2611 rel
, relend
, howto
, contents
);
2613 if (info
->relocatable
)
2617 name
= h
->root
.root
.string
;
2620 name
= (bfd_elf_string_from_elf_section
2621 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
2622 if (name
== NULL
|| *name
== '\0')
2623 name
= bfd_section_name (input_bfd
, sec
);
2628 case R_TILEPRO_IMM16_X0_GOT
:
2629 case R_TILEPRO_IMM16_X1_GOT
:
2630 case R_TILEPRO_IMM16_X0_GOT_LO
:
2631 case R_TILEPRO_IMM16_X1_GOT_LO
:
2632 case R_TILEPRO_IMM16_X0_GOT_HI
:
2633 case R_TILEPRO_IMM16_X1_GOT_HI
:
2634 case R_TILEPRO_IMM16_X0_GOT_HA
:
2635 case R_TILEPRO_IMM16_X1_GOT_HA
:
2636 /* Relocation is to the entry for this symbol in the global
2638 if (htab
->elf
.sgot
== NULL
)
2645 off
= h
->got
.offset
;
2646 BFD_ASSERT (off
!= (bfd_vma
) -1);
2647 dyn
= elf_hash_table (info
)->dynamic_sections_created
;
2649 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
2651 && SYMBOL_REFERENCES_LOCAL (info
, h
)))
2653 /* This is actually a static link, or it is a
2654 -Bsymbolic link and the symbol is defined
2655 locally, or the symbol was forced to be local
2656 because of a version file. We must initialize
2657 this entry in the global offset table. Since the
2658 offset must always be a multiple
2659 of 4 for 32-bit, we use the least significant bit
2660 to record whether we have initialized it already.
2662 When doing a dynamic link, we create a .rela.got
2663 relocation entry to initialize the value. This
2664 is done in the finish_dynamic_symbol routine. */
2669 bfd_put_32 (output_bfd
, relocation
,
2670 htab
->elf
.sgot
->contents
+ off
);
2675 unresolved_reloc
= FALSE
;
2679 BFD_ASSERT (local_got_offsets
!= NULL
2680 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
2682 off
= local_got_offsets
[r_symndx
];
2684 /* The offset must always be a multiple of 4 on 32-bit.
2685 We use the least significant bit to record
2686 whether we have already processed this entry. */
2694 Elf_Internal_Rela outrel
;
2696 /* We need to generate a R_TILEPRO_RELATIVE reloc
2697 for the dynamic linker. */
2698 s
= htab
->elf
.srelgot
;
2699 BFD_ASSERT (s
!= NULL
);
2701 outrel
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
2702 + htab
->elf
.sgot
->output_offset
2704 outrel
.r_info
= ELF32_R_INFO (0, R_TILEPRO_RELATIVE
);
2705 outrel
.r_addend
= relocation
;
2707 tilepro_elf_append_rela_32 (output_bfd
, s
, &outrel
);
2710 bfd_put_32 (output_bfd
, relocation
,
2711 htab
->elf
.sgot
->contents
+ off
);
2712 local_got_offsets
[r_symndx
] |= 1;
2715 relocation
= htab
->elf
.sgot
->output_offset
+ off
- got_base
;
2718 case R_TILEPRO_JOFFLONG_X1_PLT
:
2719 /* Relocation is to the entry for this symbol in the
2720 procedure linkage table. */
2721 BFD_ASSERT (h
!= NULL
);
2723 if (h
->plt
.offset
== (bfd_vma
) -1 || htab
->elf
.splt
== NULL
)
2725 /* We didn't make a PLT entry for this symbol. This
2726 happens when statically linking PIC code, or when
2727 using -Bsymbolic. */
2731 relocation
= (htab
->elf
.splt
->output_section
->vma
2732 + htab
->elf
.splt
->output_offset
2734 unresolved_reloc
= FALSE
;
2737 case R_TILEPRO_32_PCREL
:
2738 case R_TILEPRO_16_PCREL
:
2739 case R_TILEPRO_8_PCREL
:
2740 case R_TILEPRO_IMM16_X0_PCREL
:
2741 case R_TILEPRO_IMM16_X1_PCREL
:
2742 case R_TILEPRO_IMM16_X0_LO_PCREL
:
2743 case R_TILEPRO_IMM16_X1_LO_PCREL
:
2744 case R_TILEPRO_IMM16_X0_HI_PCREL
:
2745 case R_TILEPRO_IMM16_X1_HI_PCREL
:
2746 case R_TILEPRO_IMM16_X0_HA_PCREL
:
2747 case R_TILEPRO_IMM16_X1_HA_PCREL
:
2749 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
2755 case R_TILEPRO_LO16
:
2756 case R_TILEPRO_HI16
:
2757 case R_TILEPRO_HA16
:
2758 case R_TILEPRO_COPY
:
2759 case R_TILEPRO_GLOB_DAT
:
2760 case R_TILEPRO_JMP_SLOT
:
2761 case R_TILEPRO_RELATIVE
:
2762 case R_TILEPRO_BROFF_X1
:
2763 case R_TILEPRO_JOFFLONG_X1
:
2764 case R_TILEPRO_IMM8_X0
:
2765 case R_TILEPRO_IMM8_Y0
:
2766 case R_TILEPRO_IMM8_X1
:
2767 case R_TILEPRO_IMM8_Y1
:
2768 case R_TILEPRO_DEST_IMM8_X1
:
2769 case R_TILEPRO_MT_IMM15_X1
:
2770 case R_TILEPRO_MF_IMM15_X1
:
2771 case R_TILEPRO_IMM16_X0
:
2772 case R_TILEPRO_IMM16_X1
:
2773 case R_TILEPRO_IMM16_X0_LO
:
2774 case R_TILEPRO_IMM16_X1_LO
:
2775 case R_TILEPRO_IMM16_X0_HI
:
2776 case R_TILEPRO_IMM16_X1_HI
:
2777 case R_TILEPRO_IMM16_X0_HA
:
2778 case R_TILEPRO_IMM16_X1_HA
:
2779 case R_TILEPRO_MMSTART_X0
:
2780 case R_TILEPRO_MMEND_X0
:
2781 case R_TILEPRO_MMSTART_X1
:
2782 case R_TILEPRO_MMEND_X1
:
2783 case R_TILEPRO_SHAMT_X0
:
2784 case R_TILEPRO_SHAMT_X1
:
2785 case R_TILEPRO_SHAMT_Y0
:
2786 case R_TILEPRO_SHAMT_Y1
:
2787 if ((input_section
->flags
& SEC_ALLOC
) == 0)
2792 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
2793 || h
->root
.type
!= bfd_link_hash_undefweak
)
2794 && (! howto
->pc_relative
2795 || !SYMBOL_CALLS_LOCAL (info
, h
)))
2802 || h
->root
.type
== bfd_link_hash_undefweak
2803 || h
->root
.type
== bfd_link_hash_undefined
)))
2805 Elf_Internal_Rela outrel
;
2806 bfd_boolean skip
, relocate
= FALSE
;
2808 /* When generating a shared object, these relocations
2809 are copied into the output file to be resolved at run
2812 BFD_ASSERT (sreloc
!= NULL
);
2817 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2819 if (outrel
.r_offset
== (bfd_vma
) -1)
2821 else if (outrel
.r_offset
== (bfd_vma
) -2)
2822 skip
= TRUE
, relocate
= TRUE
;
2823 outrel
.r_offset
+= (input_section
->output_section
->vma
2824 + input_section
->output_offset
);
2828 case R_TILEPRO_32_PCREL
:
2829 case R_TILEPRO_16_PCREL
:
2830 case R_TILEPRO_8_PCREL
:
2831 /* If the symbol is not dynamic, we should not keep
2832 a dynamic relocation. But an .rela.* slot has been
2833 allocated for it, output R_TILEPRO_NONE.
2834 FIXME: Add code tracking needed dynamic relocs as
2836 if (h
->dynindx
== -1)
2837 skip
= TRUE
, relocate
= TRUE
;
2842 memset (&outrel
, 0, sizeof outrel
);
2843 /* h->dynindx may be -1 if the symbol was marked to
2845 else if (h
!= NULL
&&
2849 || !SYMBOLIC_BIND (info
, h
)
2850 || !h
->def_regular
))
2852 BFD_ASSERT (h
->dynindx
!= -1);
2853 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
2854 outrel
.r_addend
= rel
->r_addend
;
2858 if (r_type
== R_TILEPRO_32
)
2860 outrel
.r_info
= ELF32_R_INFO (0, R_TILEPRO_RELATIVE
);
2861 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2867 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2870 sec
= htab
->elf
.splt
;
2872 if (bfd_is_abs_section (sec
))
2874 else if (sec
== NULL
|| sec
->owner
== NULL
)
2876 bfd_set_error (bfd_error_bad_value
);
2883 /* We are turning this relocation into one
2884 against a section symbol. It would be
2885 proper to subtract the symbol's value,
2886 osec->vma, from the emitted reloc addend,
2887 but ld.so expects buggy relocs. */
2888 osec
= sec
->output_section
;
2889 indx
= elf_section_data (osec
)->dynindx
;
2893 osec
= htab
->elf
.text_index_section
;
2894 indx
= elf_section_data (osec
)->dynindx
;
2897 /* FIXME: we really should be able to link non-pic
2898 shared libraries. */
2902 (*_bfd_error_handler
)
2903 (_("%B: probably compiled without -fPIC?"),
2905 bfd_set_error (bfd_error_bad_value
);
2910 outrel
.r_info
= ELF32_R_INFO (indx
, r_type
);
2914 tilepro_elf_append_rela_32 (output_bfd
, sreloc
, &outrel
);
2916 /* This reloc will be computed at runtime, so there's no
2917 need to do anything now. */
2923 case R_TILEPRO_IMM16_X0_TLS_GD
:
2924 case R_TILEPRO_IMM16_X1_TLS_GD
:
2925 case R_TILEPRO_IMM16_X0_TLS_GD_LO
:
2926 case R_TILEPRO_IMM16_X1_TLS_GD_LO
:
2927 case R_TILEPRO_IMM16_X0_TLS_GD_HI
:
2928 case R_TILEPRO_IMM16_X1_TLS_GD_HI
:
2929 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
2930 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
2931 tls_type
= GOT_TLS_GD
;
2932 goto have_tls_reference
;
2934 case R_TILEPRO_IMM16_X0_TLS_IE
:
2935 case R_TILEPRO_IMM16_X1_TLS_IE
:
2936 case R_TILEPRO_IMM16_X0_TLS_IE_LO
:
2937 case R_TILEPRO_IMM16_X1_TLS_IE_LO
:
2938 case R_TILEPRO_IMM16_X0_TLS_IE_HI
:
2939 case R_TILEPRO_IMM16_X1_TLS_IE_HI
:
2940 case R_TILEPRO_IMM16_X0_TLS_IE_HA
:
2941 case R_TILEPRO_IMM16_X1_TLS_IE_HA
:
2942 tls_type
= GOT_TLS_IE
;
2946 if (h
== NULL
&& local_got_offsets
)
2948 = _bfd_tilepro_elf_local_got_tls_type (input_bfd
) [r_symndx
];
2951 tls_type
= tilepro_elf_hash_entry(h
)->tls_type
;
2953 if (tls_type
== GOT_TLS_IE
)
2956 case R_TILEPRO_IMM16_X0_TLS_GD
:
2957 r_type
= R_TILEPRO_IMM16_X0_TLS_IE
;
2959 case R_TILEPRO_IMM16_X1_TLS_GD
:
2960 r_type
= R_TILEPRO_IMM16_X1_TLS_IE
;
2962 case R_TILEPRO_IMM16_X0_TLS_GD_LO
:
2963 r_type
= R_TILEPRO_IMM16_X0_TLS_IE_LO
;
2965 case R_TILEPRO_IMM16_X1_TLS_GD_LO
:
2966 r_type
= R_TILEPRO_IMM16_X1_TLS_IE_LO
;
2968 case R_TILEPRO_IMM16_X0_TLS_GD_HI
:
2969 r_type
= R_TILEPRO_IMM16_X0_TLS_IE_HI
;
2971 case R_TILEPRO_IMM16_X1_TLS_GD_HI
:
2972 r_type
= R_TILEPRO_IMM16_X1_TLS_IE_HI
;
2974 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
2975 r_type
= R_TILEPRO_IMM16_X0_TLS_IE_HA
;
2977 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
2978 r_type
= R_TILEPRO_IMM16_X1_TLS_IE_HA
;
2984 off
= h
->got
.offset
;
2989 BFD_ASSERT (local_got_offsets
!= NULL
);
2990 off
= local_got_offsets
[r_symndx
];
2991 local_got_offsets
[r_symndx
] |= 1;
2994 if (htab
->elf
.sgot
== NULL
)
3001 Elf_Internal_Rela outrel
;
3003 bfd_boolean need_relocs
= FALSE
;
3005 if (htab
->elf
.srelgot
== NULL
)
3011 dyn
= htab
->elf
.dynamic_sections_created
;
3013 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
3015 || !SYMBOL_REFERENCES_LOCAL (info
, h
)))
3021 /* The GOT entries have not been initialized yet. Do it
3022 now, and emit any relocations. */
3023 if ((info
->shared
|| indx
!= 0)
3025 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
3026 || h
->root
.type
!= bfd_link_hash_undefweak
))
3031 case R_TILEPRO_IMM16_X0_TLS_IE
:
3032 case R_TILEPRO_IMM16_X1_TLS_IE
:
3033 case R_TILEPRO_IMM16_X0_TLS_IE_LO
:
3034 case R_TILEPRO_IMM16_X1_TLS_IE_LO
:
3035 case R_TILEPRO_IMM16_X0_TLS_IE_HI
:
3036 case R_TILEPRO_IMM16_X1_TLS_IE_HI
:
3037 case R_TILEPRO_IMM16_X0_TLS_IE_HA
:
3038 case R_TILEPRO_IMM16_X1_TLS_IE_HA
:
3040 bfd_put_32 (output_bfd
, 0, htab
->elf
.sgot
->contents
+ off
);
3041 outrel
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
3042 + htab
->elf
.sgot
->output_offset
+ off
);
3043 outrel
.r_addend
= 0;
3045 outrel
.r_addend
= relocation
- dtpoff_base (info
);
3046 outrel
.r_info
= ELF32_R_INFO (indx
, R_TILEPRO_TLS_TPOFF32
);
3047 tilepro_elf_append_rela_32 (output_bfd
, htab
->elf
.srelgot
,
3050 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
3051 htab
->elf
.sgot
->contents
+ off
);
3055 case R_TILEPRO_IMM16_X0_TLS_GD
:
3056 case R_TILEPRO_IMM16_X1_TLS_GD
:
3057 case R_TILEPRO_IMM16_X0_TLS_GD_LO
:
3058 case R_TILEPRO_IMM16_X1_TLS_GD_LO
:
3059 case R_TILEPRO_IMM16_X0_TLS_GD_HI
:
3060 case R_TILEPRO_IMM16_X1_TLS_GD_HI
:
3061 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
3062 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
3064 outrel
.r_offset
= (htab
->elf
.sgot
->output_section
->vma
3065 + htab
->elf
.sgot
->output_offset
+ off
);
3066 outrel
.r_addend
= 0;
3067 outrel
.r_info
= ELF32_R_INFO (indx
, R_TILEPRO_TLS_DTPMOD32
);
3068 bfd_put_32 (output_bfd
, 0, htab
->elf
.sgot
->contents
+ off
);
3069 tilepro_elf_append_rela_32 (output_bfd
, htab
->elf
.srelgot
,
3073 BFD_ASSERT (! unresolved_reloc
);
3074 bfd_put_32 (output_bfd
,
3075 relocation
- dtpoff_base (info
),
3076 (htab
->elf
.sgot
->contents
+ off
+
3077 TILEPRO_BYTES_PER_WORD
));
3081 bfd_put_32 (output_bfd
, 0,
3082 (htab
->elf
.sgot
->contents
+ off
+
3083 TILEPRO_BYTES_PER_WORD
));
3084 outrel
.r_info
= ELF32_R_INFO (indx
,
3085 R_TILEPRO_TLS_DTPOFF32
);
3086 outrel
.r_offset
+= TILEPRO_BYTES_PER_WORD
;
3087 tilepro_elf_append_rela_32 (output_bfd
,
3088 htab
->elf
.srelgot
, &outrel
);
3093 /* If we are not emitting relocations for a
3094 general dynamic reference, then we must be in a
3095 static link or an executable link with the
3096 symbol binding locally. Mark it as belonging
3097 to module 1, the executable. */
3098 bfd_put_32 (output_bfd
, 1,
3099 htab
->elf
.sgot
->contents
+ off
);
3100 bfd_put_32 (output_bfd
, relocation
- dtpoff_base (info
),
3101 htab
->elf
.sgot
->contents
+ off
+
3102 TILEPRO_BYTES_PER_WORD
);
3108 if (off
>= (bfd_vma
) -2)
3111 relocation
= htab
->elf
.sgot
->output_offset
+ off
- got_base
;
3112 unresolved_reloc
= FALSE
;
3113 howto
= tilepro_elf_howto_table
+ r_type
;
3120 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3121 because such sections are not SEC_ALLOC and thus ld.so will
3122 not process them. */
3123 if (unresolved_reloc
3124 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
3126 (*_bfd_error_handler
)
3127 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3130 (long) rel
->r_offset
,
3132 h
->root
.root
.string
);
3134 r
= bfd_reloc_continue
;
3136 /* For the _HA types, we add 0x8000 so that if bit 15 is set,
3137 * we will increment bit 16. The howto->rightshift takes care
3138 * of the rest for us. */
3141 case R_TILEPRO_HA16
:
3142 case R_TILEPRO_IMM16_X0_HA
:
3143 case R_TILEPRO_IMM16_X1_HA
:
3144 case R_TILEPRO_IMM16_X0_HA_PCREL
:
3145 case R_TILEPRO_IMM16_X1_HA_PCREL
:
3146 case R_TILEPRO_IMM16_X0_GOT_HA
:
3147 case R_TILEPRO_IMM16_X1_GOT_HA
:
3148 case R_TILEPRO_IMM16_X0_TLS_GD_HA
:
3149 case R_TILEPRO_IMM16_X1_TLS_GD_HA
:
3150 case R_TILEPRO_IMM16_X0_TLS_IE_HA
:
3151 case R_TILEPRO_IMM16_X1_TLS_IE_HA
:
3152 relocation
+= 0x8000;
3156 /* Get the operand creation function, if any. */
3157 create_func
= reloc_to_create_func
[r_type
];
3158 if (create_func
== NULL
)
3160 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3161 contents
, rel
->r_offset
,
3162 relocation
, rel
->r_addend
);
3166 if (howto
->pc_relative
)
3169 input_section
->output_section
->vma
+ input_section
->output_offset
;
3170 if (howto
->pcrel_offset
)
3171 relocation
-= rel
->r_offset
;
3176 /* Add the relocation addend if any to the final target value */
3177 relocation
+= rel
->r_addend
;
3179 /* Do basic range checking */
3180 r
= bfd_check_overflow (howto
->complain_on_overflow
,
3187 * Write the relocated value out into the raw section data.
3188 * Don't put a relocation out in the .rela section.
3190 tilepro_bundle_bits mask
= create_func(-1);
3191 tilepro_bundle_bits value
= create_func(relocation
>> howto
->rightshift
);
3193 /* Only touch bytes while the mask is not 0, so we
3194 don't write to out of bounds memory if this is actually
3195 a 16-bit switch instruction. */
3196 for (data
= contents
+ rel
->r_offset
; mask
!= 0; data
++)
3198 bfd_byte byte_mask
= (bfd_byte
)mask
;
3199 *data
= (*data
& ~byte_mask
) | ((bfd_byte
)value
& byte_mask
);
3205 if (r
!= bfd_reloc_ok
)
3207 const char *msg
= NULL
;
3211 case bfd_reloc_overflow
:
3212 r
= info
->callbacks
->reloc_overflow
3213 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
3214 (bfd_vma
) 0, input_bfd
, input_section
, rel
->r_offset
);
3217 case bfd_reloc_undefined
:
3218 r
= info
->callbacks
->undefined_symbol
3219 (info
, name
, input_bfd
, input_section
, rel
->r_offset
,
3223 case bfd_reloc_outofrange
:
3224 msg
= _("internal error: out of range error");
3227 case bfd_reloc_notsupported
:
3228 msg
= _("internal error: unsupported relocation error");
3231 case bfd_reloc_dangerous
:
3232 msg
= _("internal error: dangerous relocation");
3236 msg
= _("internal error: unknown error");
3241 r
= info
->callbacks
->warning
3242 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
3252 /* Finish up dynamic symbol handling. We set the contents of various
3253 dynamic sections here. */
3256 tilepro_elf_finish_dynamic_symbol (bfd
*output_bfd
,
3257 struct bfd_link_info
*info
,
3258 struct elf_link_hash_entry
*h
,
3259 Elf_Internal_Sym
*sym
)
3261 struct tilepro_elf_link_hash_table
*htab
;
3263 htab
= tilepro_elf_hash_table (info
);
3264 BFD_ASSERT (htab
!= NULL
);
3266 if (h
->plt
.offset
!= (bfd_vma
) -1)
3271 Elf_Internal_Rela rela
;
3277 /* This symbol has an entry in the PLT. Set it up. */
3279 BFD_ASSERT (h
->dynindx
!= -1);
3281 splt
= htab
->elf
.splt
;
3282 srela
= htab
->elf
.srelplt
;
3283 sgotplt
= htab
->elf
.sgotplt
;
3285 if (splt
== NULL
|| srela
== NULL
)
3288 /* Fill in the entry in the procedure linkage table. */
3289 rela_index
= tilepro_plt_entry_build (splt
, sgotplt
, h
->plt
.offset
,
3292 /* Fill in the entry in the global offset table, which initially points
3293 to the beginning of the plt. */
3294 bfd_put_32 (output_bfd
, splt
->output_section
->vma
+ splt
->output_offset
,
3295 sgotplt
->contents
+ r_offset
);
3297 /* Fill in the entry in the .rela.plt section. */
3298 rela
.r_offset
= (sgotplt
->output_section
->vma
3299 + sgotplt
->output_offset
3302 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_TILEPRO_JMP_SLOT
);
3304 loc
= srela
->contents
+ rela_index
* sizeof (Elf32_External_Rela
);
3305 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
3307 if (!h
->def_regular
)
3309 /* Mark the symbol as undefined, rather than as defined in
3310 the .plt section. Leave the value alone. */
3311 sym
->st_shndx
= SHN_UNDEF
;
3312 /* If the symbol is weak, we do need to clear the value.
3313 Otherwise, the PLT entry would provide a definition for
3314 the symbol even if the symbol wasn't defined anywhere,
3315 and so the symbol would never be NULL. */
3316 if (!h
->ref_regular_nonweak
)
3321 if (h
->got
.offset
!= (bfd_vma
) -1
3322 && tilepro_elf_hash_entry(h
)->tls_type
!= GOT_TLS_GD
3323 && tilepro_elf_hash_entry(h
)->tls_type
!= GOT_TLS_IE
)
3327 Elf_Internal_Rela rela
;
3329 /* This symbol has an entry in the GOT. Set it up. */
3331 sgot
= htab
->elf
.sgot
;
3332 srela
= htab
->elf
.srelgot
;
3333 BFD_ASSERT (sgot
!= NULL
&& srela
!= NULL
);
3335 rela
.r_offset
= (sgot
->output_section
->vma
3336 + sgot
->output_offset
3337 + (h
->got
.offset
&~ (bfd_vma
) 1));
3339 /* If this is a -Bsymbolic link, and the symbol is defined
3340 locally, we just want to emit a RELATIVE reloc. Likewise if
3341 the symbol was forced to be local because of a version file.
3342 The entry in the global offset table will already have been
3343 initialized in the relocate_section function. */
3345 && (info
->symbolic
|| h
->dynindx
== -1)
3348 asection
*sec
= h
->root
.u
.def
.section
;
3349 rela
.r_info
= ELF32_R_INFO (0, R_TILEPRO_RELATIVE
);
3350 rela
.r_addend
= (h
->root
.u
.def
.value
3351 + sec
->output_section
->vma
3352 + sec
->output_offset
);
3356 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_TILEPRO_GLOB_DAT
);
3360 bfd_put_32 (output_bfd
, 0,
3361 sgot
->contents
+ (h
->got
.offset
& ~(bfd_vma
) 1));
3362 tilepro_elf_append_rela_32 (output_bfd
, srela
, &rela
);
3368 Elf_Internal_Rela rela
;
3370 /* This symbols needs a copy reloc. Set it up. */
3371 BFD_ASSERT (h
->dynindx
!= -1);
3373 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
3375 BFD_ASSERT (s
!= NULL
);
3377 rela
.r_offset
= (h
->root
.u
.def
.value
3378 + h
->root
.u
.def
.section
->output_section
->vma
3379 + h
->root
.u
.def
.section
->output_offset
);
3380 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_TILEPRO_COPY
);
3382 tilepro_elf_append_rela_32 (output_bfd
, s
, &rela
);
3385 /* Mark some specially defined symbols as absolute. */
3386 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
3387 || (h
== htab
->elf
.hgot
|| h
== htab
->elf
.hplt
))
3388 sym
->st_shndx
= SHN_ABS
;
3393 /* Finish up the dynamic sections. */
3396 tilepro_finish_dyn (bfd
*output_bfd
, struct bfd_link_info
*info
,
3397 bfd
*dynobj
, asection
*sdyn
,
3398 asection
*splt ATTRIBUTE_UNUSED
)
3400 Elf32_External_Dyn
*dyncon
, *dynconend
;
3401 struct tilepro_elf_link_hash_table
*htab
;
3403 htab
= tilepro_elf_hash_table (info
);
3404 BFD_ASSERT (htab
!= NULL
);
3405 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
3406 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
3407 for (; dyncon
< dynconend
; dyncon
++)
3409 Elf_Internal_Dyn dyn
;
3412 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
3417 s
= htab
->elf
.sgotplt
;
3418 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
3421 s
= htab
->elf
.srelplt
;
3422 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
3425 s
= htab
->elf
.srelplt
;
3426 dyn
.d_un
.d_val
= s
->size
;
3432 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
3438 tilepro_elf_finish_dynamic_sections (bfd
*output_bfd
,
3439 struct bfd_link_info
*info
)
3443 struct tilepro_elf_link_hash_table
*htab
;
3445 htab
= tilepro_elf_hash_table (info
);
3446 BFD_ASSERT (htab
!= NULL
);
3447 dynobj
= htab
->elf
.dynobj
;
3449 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
3451 if (elf_hash_table (info
)->dynamic_sections_created
)
3456 splt
= bfd_get_section_by_name (dynobj
, ".plt");
3457 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
3459 ret
= tilepro_finish_dyn (output_bfd
, info
, dynobj
, sdyn
, splt
);
3464 /* Fill in the first entry in the procedure linkage table. */
3466 memcpy (splt
->contents
, tilepro_plt0_entry
, PLT_HEADER_SIZE
);
3468 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
3472 if (htab
->elf
.sgotplt
)
3474 if (bfd_is_abs_section (htab
->elf
.sgotplt
->output_section
))
3476 (*_bfd_error_handler
)
3477 (_("discarded output section: `%A'"), htab
->elf
.sgotplt
);
3481 if (htab
->elf
.sgotplt
->size
> 0)
3483 /* Write the first two entries in .got.plt, needed for the dynamic
3485 bfd_put_32 (output_bfd
, (bfd_vma
) -1,
3486 htab
->elf
.sgotplt
->contents
);
3487 bfd_put_32 (output_bfd
, (bfd_vma
) 0,
3488 htab
->elf
.sgotplt
->contents
+ GOT_ENTRY_SIZE
);
3491 elf_section_data (htab
->elf
.sgotplt
->output_section
)->this_hdr
.sh_entsize
3497 if (htab
->elf
.sgot
->size
> 0)
3499 /* Set the first entry in the global offset table to the address of
3500 the dynamic section. */
3501 bfd_vma val
= (sdyn
?
3502 sdyn
->output_section
->vma
+ sdyn
->output_offset
:
3504 bfd_put_32 (output_bfd
, val
, htab
->elf
.sgot
->contents
);
3507 elf_section_data (htab
->elf
.sgot
->output_section
)->this_hdr
.sh_entsize
3516 /* Return address for Ith PLT stub in section PLT, for relocation REL
3517 or (bfd_vma) -1 if it should not be included. */
3520 tilepro_elf_plt_sym_val (bfd_vma i
, const asection
*plt
,
3521 const arelent
*rel ATTRIBUTE_UNUSED
)
3523 return plt
->vma
+ PLT_HEADER_SIZE
+ i
* PLT_ENTRY_SIZE
;
3526 static enum elf_reloc_type_class
3527 tilepro_reloc_type_class (const Elf_Internal_Rela
*rela
)
3529 switch ((int) ELF32_R_TYPE (rela
->r_info
))
3531 case R_TILEPRO_RELATIVE
:
3532 return reloc_class_relative
;
3533 case R_TILEPRO_JMP_SLOT
:
3534 return reloc_class_plt
;
3535 case R_TILEPRO_COPY
:
3536 return reloc_class_copy
;
3538 return reloc_class_normal
;
3543 tilepro_additional_program_headers (bfd
*abfd
,
3544 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3546 /* Each .intrpt section specified by the user adds another PT_LOAD
3547 header since the sections are discontiguous. */
3548 static const char intrpt_sections
[4][9] =
3550 ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
3555 for (i
= 0; i
< 4; i
++)
3557 asection
*sec
= bfd_get_section_by_name (abfd
, intrpt_sections
[i
]);
3558 if (sec
!= NULL
&& (sec
->flags
& SEC_LOAD
) != 0)
3562 /* Add four "padding" headers in to leave room in case a custom linker
3563 script does something fancy. Otherwise ld complains that it ran
3564 out of program headers and refuses to link. */
3570 #define ELF_ARCH bfd_arch_tilepro
3571 #define ELF_TARGET_ID TILEPRO_ELF_DATA
3572 #define ELF_MACHINE_CODE EM_TILEPRO
3573 #define ELF_MAXPAGESIZE 0x10000
3574 #define ELF_COMMONPAGESIZE 0x10000
3576 #define TARGET_LITTLE_SYM bfd_elf32_tilepro_vec
3577 #define TARGET_LITTLE_NAME "elf32-tilepro"
3579 #define elf_backend_reloc_type_class tilepro_reloc_type_class
3581 #define bfd_elf32_bfd_reloc_name_lookup tilepro_reloc_name_lookup
3582 #define bfd_elf32_bfd_link_hash_table_create tilepro_elf_link_hash_table_create
3583 #define bfd_elf32_bfd_reloc_type_lookup tilepro_reloc_type_lookup
3585 #define elf_backend_copy_indirect_symbol tilepro_elf_copy_indirect_symbol
3586 #define elf_backend_create_dynamic_sections tilepro_elf_create_dynamic_sections
3587 #define elf_backend_check_relocs tilepro_elf_check_relocs
3588 #define elf_backend_adjust_dynamic_symbol tilepro_elf_adjust_dynamic_symbol
3589 #define elf_backend_omit_section_dynsym tilepro_elf_omit_section_dynsym
3590 #define elf_backend_size_dynamic_sections tilepro_elf_size_dynamic_sections
3591 #define elf_backend_relocate_section tilepro_elf_relocate_section
3592 #define elf_backend_finish_dynamic_symbol tilepro_elf_finish_dynamic_symbol
3593 #define elf_backend_finish_dynamic_sections tilepro_elf_finish_dynamic_sections
3594 #define elf_backend_gc_mark_hook tilepro_elf_gc_mark_hook
3595 #define elf_backend_gc_sweep_hook tilepro_elf_gc_sweep_hook
3596 #define elf_backend_plt_sym_val tilepro_elf_plt_sym_val
3597 #define elf_info_to_howto_rel NULL
3598 #define elf_info_to_howto tilepro_info_to_howto_rela
3599 #define elf_backend_grok_prstatus tilepro_elf_grok_prstatus
3600 #define elf_backend_grok_psinfo tilepro_elf_grok_psinfo
3601 #define elf_backend_additional_program_headers tilepro_additional_program_headers
3603 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3605 #define elf_backend_can_gc_sections 1
3606 #define elf_backend_can_refcount 1
3607 #define elf_backend_want_got_plt 1
3608 #define elf_backend_plt_readonly 1
3609 /* Align PLT mod 64 byte L2 line size. */
3610 #define elf_backend_plt_alignment 6
3611 #define elf_backend_want_plt_sym 1
3612 #define elf_backend_got_header_size GOT_ENTRY_SIZE
3613 #define elf_backend_rela_normal 1
3614 #define elf_backend_default_execstack 0
3616 #include "elf32-target.h"