1 /* Renesas / SuperH SH specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
4 Contributed by Ian Lance Taylor, Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #include "libiberty.h"
29 #include "../opcodes/sh-opc.h"
31 static bfd_reloc_status_type sh_elf_reloc
32 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
33 static bfd_reloc_status_type sh_elf_ignore_reloc
34 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
35 static reloc_howto_type
*sh_elf_reloc_type_lookup
36 (bfd
*, bfd_reloc_code_real_type
);
37 static void sh_elf_info_to_howto
38 (bfd
*, arelent
*, Elf_Internal_Rela
*);
39 static bfd_boolean sh_elf_set_private_flags
41 static bfd_boolean sh_elf_copy_private_data
43 static bfd_boolean sh_elf_merge_private_data
45 static bfd_boolean sh_elf_set_mach_from_flags
47 static bfd_boolean sh_elf_relax_section
48 (bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*);
49 static bfd_boolean sh_elf_relax_delete_bytes
50 (bfd
*, asection
*, bfd_vma
, int);
51 static bfd_boolean sh_elf_align_loads
52 (bfd
*, asection
*, Elf_Internal_Rela
*, bfd_byte
*, bfd_boolean
*);
54 static bfd_boolean sh_elf_swap_insns
55 (bfd
*, asection
*, void *, bfd_byte
*, bfd_vma
);
57 static bfd_boolean sh_elf_relocate_section
58 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
59 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**);
60 static bfd_byte
*sh_elf_get_relocated_section_contents
61 (bfd
*, struct bfd_link_info
*, struct bfd_link_order
*, bfd_byte
*,
62 bfd_boolean
, asymbol
**);
63 static void sh_elf_copy_indirect_symbol
64 (const struct elf_backend_data
*, struct elf_link_hash_entry
*,
65 struct elf_link_hash_entry
*);
66 static int sh_elf_optimized_tls_reloc
67 (struct bfd_link_info
*, int, int);
68 static bfd_boolean sh_elf_mkobject
70 static bfd_boolean sh_elf_object_p
72 static bfd_boolean sh_elf_check_relocs
73 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
74 static struct bfd_hash_entry
*sh_elf_link_hash_newfunc
75 (struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *);
76 static struct bfd_link_hash_table
*sh_elf_link_hash_table_create
78 static bfd_boolean sh_elf_adjust_dynamic_symbol
79 (struct bfd_link_info
*, struct elf_link_hash_entry
*);
80 static bfd_boolean sh_elf_size_dynamic_sections
81 (bfd
*, struct bfd_link_info
*);
82 static bfd_boolean sh_elf_finish_dynamic_symbol
83 (bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
85 static bfd_boolean sh_elf_finish_dynamic_sections
86 (bfd
*, struct bfd_link_info
*);
87 static bfd_reloc_status_type sh_elf_reloc_loop
88 (int, bfd
*, asection
*, bfd_byte
*, bfd_vma
, asection
*, bfd_vma
,
90 static bfd_boolean create_got_section
91 (bfd
*, struct bfd_link_info
*);
92 static bfd_boolean sh_elf_create_dynamic_sections
93 (bfd
*, struct bfd_link_info
*);
94 static bfd_vma dtpoff_base
95 (struct bfd_link_info
*);
97 (struct bfd_link_info
*, bfd_vma
);
98 static asection
* sh_elf_gc_mark_hook
99 (asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*,
100 struct elf_link_hash_entry
*, Elf_Internal_Sym
*);
101 static bfd_boolean sh_elf_gc_sweep_hook
102 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
103 static bfd_boolean allocate_dynrelocs
104 (struct elf_link_hash_entry
*, void *);
105 static bfd_boolean readonly_dynrelocs
106 (struct elf_link_hash_entry
*, void *);
107 static enum elf_reloc_type_class sh_elf_reloc_type_class
108 (const Elf_Internal_Rela
*);
109 #ifdef INCLUDE_SHMEDIA
110 inline static void movi_shori_putval (bfd
*, unsigned long, char *);
112 #if !defined SH_TARGET_ALREADY_DEFINED
113 static bfd_boolean elf32_shlin_grok_prstatus
114 (bfd
*abfd
, Elf_Internal_Note
*note
);
115 static bfd_boolean elf32_shlin_grok_psinfo
116 (bfd
*abfd
, Elf_Internal_Note
*note
);
119 /* The name of the dynamic interpreter. This is put in the .interp
122 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
124 static reloc_howto_type sh_elf_howto_table
[] =
127 HOWTO (R_SH_NONE
, /* type */
129 0, /* size (0 = byte, 1 = short, 2 = long) */
131 FALSE
, /* pc_relative */
133 complain_overflow_dont
, /* complain_on_overflow */
134 sh_elf_ignore_reloc
, /* special_function */
135 "R_SH_NONE", /* name */
136 FALSE
, /* partial_inplace */
139 FALSE
), /* pcrel_offset */
141 /* 32 bit absolute relocation. Setting partial_inplace to TRUE and
142 src_mask to a non-zero value is similar to the COFF toolchain. */
143 HOWTO (R_SH_DIR32
, /* type */
145 2, /* size (0 = byte, 1 = short, 2 = long) */
147 FALSE
, /* pc_relative */
149 complain_overflow_bitfield
, /* complain_on_overflow */
150 sh_elf_reloc
, /* special_function */
151 "R_SH_DIR32", /* name */
152 TRUE
, /* partial_inplace */
153 0xffffffff, /* src_mask */
154 0xffffffff, /* dst_mask */
155 FALSE
), /* pcrel_offset */
157 /* 32 bit PC relative relocation. */
158 HOWTO (R_SH_REL32
, /* type */
160 2, /* size (0 = byte, 1 = short, 2 = long) */
162 TRUE
, /* pc_relative */
164 complain_overflow_signed
, /* complain_on_overflow */
165 sh_elf_ignore_reloc
, /* special_function */
166 "R_SH_REL32", /* name */
167 TRUE
, /* partial_inplace */
168 0xffffffff, /* src_mask */
169 0xffffffff, /* dst_mask */
170 TRUE
), /* pcrel_offset */
172 /* 8 bit PC relative branch divided by 2. */
173 HOWTO (R_SH_DIR8WPN
, /* type */
175 1, /* size (0 = byte, 1 = short, 2 = long) */
177 TRUE
, /* pc_relative */
179 complain_overflow_signed
, /* complain_on_overflow */
180 sh_elf_ignore_reloc
, /* special_function */
181 "R_SH_DIR8WPN", /* name */
182 TRUE
, /* partial_inplace */
185 TRUE
), /* pcrel_offset */
187 /* 12 bit PC relative branch divided by 2. */
188 /* This cannot be partial_inplace because relaxation can't know the
189 eventual value of a symbol. */
190 HOWTO (R_SH_IND12W
, /* type */
192 1, /* size (0 = byte, 1 = short, 2 = long) */
194 TRUE
, /* pc_relative */
196 complain_overflow_signed
, /* complain_on_overflow */
197 NULL
, /* special_function */
198 "R_SH_IND12W", /* name */
199 FALSE
, /* partial_inplace */
201 0xfff, /* dst_mask */
202 TRUE
), /* pcrel_offset */
204 /* 8 bit unsigned PC relative divided by 4. */
205 HOWTO (R_SH_DIR8WPL
, /* type */
207 1, /* size (0 = byte, 1 = short, 2 = long) */
209 TRUE
, /* pc_relative */
211 complain_overflow_unsigned
, /* complain_on_overflow */
212 sh_elf_ignore_reloc
, /* special_function */
213 "R_SH_DIR8WPL", /* name */
214 TRUE
, /* partial_inplace */
217 TRUE
), /* pcrel_offset */
219 /* 8 bit unsigned PC relative divided by 2. */
220 HOWTO (R_SH_DIR8WPZ
, /* type */
222 1, /* size (0 = byte, 1 = short, 2 = long) */
224 TRUE
, /* pc_relative */
226 complain_overflow_unsigned
, /* complain_on_overflow */
227 sh_elf_ignore_reloc
, /* special_function */
228 "R_SH_DIR8WPZ", /* name */
229 TRUE
, /* partial_inplace */
232 TRUE
), /* pcrel_offset */
234 /* 8 bit GBR relative. FIXME: This only makes sense if we have some
235 special symbol for the GBR relative area, and that is not
237 HOWTO (R_SH_DIR8BP
, /* type */
239 1, /* size (0 = byte, 1 = short, 2 = long) */
241 FALSE
, /* pc_relative */
243 complain_overflow_unsigned
, /* complain_on_overflow */
244 sh_elf_ignore_reloc
, /* special_function */
245 "R_SH_DIR8BP", /* name */
246 FALSE
, /* partial_inplace */
249 TRUE
), /* pcrel_offset */
251 /* 8 bit GBR relative divided by 2. FIXME: This only makes sense if
252 we have some special symbol for the GBR relative area, and that
253 is not implemented. */
254 HOWTO (R_SH_DIR8W
, /* type */
256 1, /* size (0 = byte, 1 = short, 2 = long) */
258 FALSE
, /* pc_relative */
260 complain_overflow_unsigned
, /* complain_on_overflow */
261 sh_elf_ignore_reloc
, /* special_function */
262 "R_SH_DIR8W", /* name */
263 FALSE
, /* partial_inplace */
266 TRUE
), /* pcrel_offset */
268 /* 8 bit GBR relative divided by 4. FIXME: This only makes sense if
269 we have some special symbol for the GBR relative area, and that
270 is not implemented. */
271 HOWTO (R_SH_DIR8L
, /* type */
273 1, /* size (0 = byte, 1 = short, 2 = long) */
275 FALSE
, /* pc_relative */
277 complain_overflow_unsigned
, /* complain_on_overflow */
278 sh_elf_ignore_reloc
, /* special_function */
279 "R_SH_DIR8L", /* name */
280 FALSE
, /* partial_inplace */
283 TRUE
), /* pcrel_offset */
285 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
286 HOWTO (R_SH_LOOP_START
, /* type */
288 1, /* size (0 = byte, 1 = short, 2 = long) */
290 FALSE
, /* pc_relative */
292 complain_overflow_signed
, /* complain_on_overflow */
293 sh_elf_ignore_reloc
, /* special_function */
294 "R_SH_LOOP_START", /* name */
295 TRUE
, /* partial_inplace */
298 TRUE
), /* pcrel_offset */
300 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
301 HOWTO (R_SH_LOOP_END
, /* type */
303 1, /* size (0 = byte, 1 = short, 2 = long) */
305 FALSE
, /* pc_relative */
307 complain_overflow_signed
, /* complain_on_overflow */
308 sh_elf_ignore_reloc
, /* special_function */
309 "R_SH_LOOP_END", /* name */
310 TRUE
, /* partial_inplace */
313 TRUE
), /* pcrel_offset */
326 /* The remaining relocs are a GNU extension used for relaxing. The
327 final pass of the linker never needs to do anything with any of
328 these relocs. Any required operations are handled by the
331 /* GNU extension to record C++ vtable hierarchy */
332 HOWTO (R_SH_GNU_VTINHERIT
, /* type */
334 2, /* size (0 = byte, 1 = short, 2 = long) */
336 FALSE
, /* pc_relative */
338 complain_overflow_dont
, /* complain_on_overflow */
339 NULL
, /* special_function */
340 "R_SH_GNU_VTINHERIT", /* name */
341 FALSE
, /* partial_inplace */
344 FALSE
), /* pcrel_offset */
346 /* GNU extension to record C++ vtable member usage */
347 HOWTO (R_SH_GNU_VTENTRY
, /* type */
349 2, /* size (0 = byte, 1 = short, 2 = long) */
351 FALSE
, /* pc_relative */
353 complain_overflow_dont
, /* complain_on_overflow */
354 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
355 "R_SH_GNU_VTENTRY", /* name */
356 FALSE
, /* partial_inplace */
359 FALSE
), /* pcrel_offset */
361 /* An 8 bit switch table entry. This is generated for an expression
362 such as ``.word L1 - L2''. The offset holds the difference
363 between the reloc address and L2. */
364 HOWTO (R_SH_SWITCH8
, /* type */
366 0, /* size (0 = byte, 1 = short, 2 = long) */
368 FALSE
, /* pc_relative */
370 complain_overflow_unsigned
, /* complain_on_overflow */
371 sh_elf_ignore_reloc
, /* special_function */
372 "R_SH_SWITCH8", /* name */
373 FALSE
, /* partial_inplace */
376 TRUE
), /* pcrel_offset */
378 /* A 16 bit switch table entry. This is generated for an expression
379 such as ``.word L1 - L2''. The offset holds the difference
380 between the reloc address and L2. */
381 HOWTO (R_SH_SWITCH16
, /* type */
383 1, /* size (0 = byte, 1 = short, 2 = long) */
385 FALSE
, /* pc_relative */
387 complain_overflow_unsigned
, /* complain_on_overflow */
388 sh_elf_ignore_reloc
, /* special_function */
389 "R_SH_SWITCH16", /* name */
390 FALSE
, /* partial_inplace */
393 TRUE
), /* pcrel_offset */
395 /* A 32 bit switch table entry. This is generated for an expression
396 such as ``.long L1 - L2''. The offset holds the difference
397 between the reloc address and L2. */
398 HOWTO (R_SH_SWITCH32
, /* type */
400 2, /* size (0 = byte, 1 = short, 2 = long) */
402 FALSE
, /* pc_relative */
404 complain_overflow_unsigned
, /* complain_on_overflow */
405 sh_elf_ignore_reloc
, /* special_function */
406 "R_SH_SWITCH32", /* name */
407 FALSE
, /* partial_inplace */
410 TRUE
), /* pcrel_offset */
412 /* Indicates a .uses pseudo-op. The compiler will generate .uses
413 pseudo-ops when it finds a function call which can be relaxed.
414 The offset field holds the PC relative offset to the instruction
415 which loads the register used in the function call. */
416 HOWTO (R_SH_USES
, /* type */
418 1, /* size (0 = byte, 1 = short, 2 = long) */
420 FALSE
, /* pc_relative */
422 complain_overflow_unsigned
, /* complain_on_overflow */
423 sh_elf_ignore_reloc
, /* special_function */
424 "R_SH_USES", /* name */
425 FALSE
, /* partial_inplace */
428 TRUE
), /* pcrel_offset */
430 /* The assembler will generate this reloc for addresses referred to
431 by the register loads associated with USES relocs. The offset
432 field holds the number of times the address is referenced in the
434 HOWTO (R_SH_COUNT
, /* type */
436 1, /* size (0 = byte, 1 = short, 2 = long) */
438 FALSE
, /* pc_relative */
440 complain_overflow_unsigned
, /* complain_on_overflow */
441 sh_elf_ignore_reloc
, /* special_function */
442 "R_SH_COUNT", /* name */
443 FALSE
, /* partial_inplace */
446 TRUE
), /* pcrel_offset */
448 /* Indicates an alignment statement. The offset field is the power
449 of 2 to which subsequent portions of the object file must be
451 HOWTO (R_SH_ALIGN
, /* type */
453 1, /* size (0 = byte, 1 = short, 2 = long) */
455 FALSE
, /* pc_relative */
457 complain_overflow_unsigned
, /* complain_on_overflow */
458 sh_elf_ignore_reloc
, /* special_function */
459 "R_SH_ALIGN", /* name */
460 FALSE
, /* partial_inplace */
463 TRUE
), /* pcrel_offset */
465 /* The assembler will generate this reloc before a block of
466 instructions. A section should be processed as assuming it
467 contains data, unless this reloc is seen. */
468 HOWTO (R_SH_CODE
, /* type */
470 1, /* size (0 = byte, 1 = short, 2 = long) */
472 FALSE
, /* pc_relative */
474 complain_overflow_unsigned
, /* complain_on_overflow */
475 sh_elf_ignore_reloc
, /* special_function */
476 "R_SH_CODE", /* name */
477 FALSE
, /* partial_inplace */
480 TRUE
), /* pcrel_offset */
482 /* The assembler will generate this reloc after a block of
483 instructions when it sees data that is not instructions. */
484 HOWTO (R_SH_DATA
, /* type */
486 1, /* size (0 = byte, 1 = short, 2 = long) */
488 FALSE
, /* pc_relative */
490 complain_overflow_unsigned
, /* complain_on_overflow */
491 sh_elf_ignore_reloc
, /* special_function */
492 "R_SH_DATA", /* name */
493 FALSE
, /* partial_inplace */
496 TRUE
), /* pcrel_offset */
498 /* The assembler generates this reloc for each label within a block
499 of instructions. This permits the linker to avoid swapping
500 instructions which are the targets of branches. */
501 HOWTO (R_SH_LABEL
, /* type */
503 1, /* size (0 = byte, 1 = short, 2 = long) */
505 FALSE
, /* pc_relative */
507 complain_overflow_unsigned
, /* complain_on_overflow */
508 sh_elf_ignore_reloc
, /* special_function */
509 "R_SH_LABEL", /* name */
510 FALSE
, /* partial_inplace */
513 TRUE
), /* pcrel_offset */
515 /* The next 12 are only supported via linking in SHC-generated objects. */
516 HOWTO (R_SH_DIR16
, /* type */
518 1, /* size (0 = byte, 1 = short, 2 = long) */
520 FALSE
, /* pc_relative */
522 complain_overflow_dont
, /* complain_on_overflow */
523 bfd_elf_generic_reloc
, /* special_function */
524 "R_SH_DIR16", /* name */
525 FALSE
, /* partial_inplace */
527 0xffff, /* dst_mask */
528 FALSE
), /* pcrel_offset */
530 HOWTO (R_SH_DIR8
, /* type */
532 0, /* size (0 = byte, 1 = short, 2 = long) */
534 FALSE
, /* pc_relative */
536 complain_overflow_dont
, /* complain_on_overflow */
537 bfd_elf_generic_reloc
, /* special_function */
538 "R_SH_DIR8", /* name */
539 FALSE
, /* partial_inplace */
542 FALSE
), /* pcrel_offset */
544 HOWTO (R_SH_DIR8UL
, /* type */
546 0, /* size (0 = byte, 1 = short, 2 = long) */
548 FALSE
, /* pc_relative */
550 complain_overflow_unsigned
, /* complain_on_overflow */
551 bfd_elf_generic_reloc
, /* special_function */
552 "R_SH_DIR8UL", /* name */
553 FALSE
, /* partial_inplace */
556 FALSE
), /* pcrel_offset */
558 HOWTO (R_SH_DIR8UW
, /* type */
560 0, /* size (0 = byte, 1 = short, 2 = long) */
562 FALSE
, /* pc_relative */
564 complain_overflow_unsigned
, /* complain_on_overflow */
565 bfd_elf_generic_reloc
, /* special_function */
566 "R_SH_DIR8UW", /* name */
567 FALSE
, /* partial_inplace */
570 FALSE
), /* pcrel_offset */
572 HOWTO (R_SH_DIR8U
, /* type */
574 0, /* size (0 = byte, 1 = short, 2 = long) */
576 FALSE
, /* pc_relative */
578 complain_overflow_unsigned
, /* complain_on_overflow */
579 bfd_elf_generic_reloc
, /* special_function */
580 "R_SH_DIR8U", /* name */
581 FALSE
, /* partial_inplace */
584 FALSE
), /* pcrel_offset */
586 HOWTO (R_SH_DIR8SW
, /* type */
588 0, /* size (0 = byte, 1 = short, 2 = long) */
590 FALSE
, /* pc_relative */
592 complain_overflow_signed
, /* complain_on_overflow */
593 bfd_elf_generic_reloc
, /* special_function */
594 "R_SH_DIR8SW", /* name */
595 FALSE
, /* partial_inplace */
598 FALSE
), /* pcrel_offset */
600 HOWTO (R_SH_DIR8S
, /* type */
602 0, /* size (0 = byte, 1 = short, 2 = long) */
604 FALSE
, /* pc_relative */
606 complain_overflow_signed
, /* complain_on_overflow */
607 bfd_elf_generic_reloc
, /* special_function */
608 "R_SH_DIR8S", /* name */
609 FALSE
, /* partial_inplace */
612 FALSE
), /* pcrel_offset */
614 HOWTO (R_SH_DIR4UL
, /* type */
616 0, /* size (0 = byte, 1 = short, 2 = long) */
618 FALSE
, /* pc_relative */
620 complain_overflow_unsigned
, /* complain_on_overflow */
621 bfd_elf_generic_reloc
, /* special_function */
622 "R_SH_DIR4UL", /* name */
623 FALSE
, /* partial_inplace */
626 FALSE
), /* pcrel_offset */
628 HOWTO (R_SH_DIR4UW
, /* type */
630 0, /* size (0 = byte, 1 = short, 2 = long) */
632 FALSE
, /* pc_relative */
634 complain_overflow_unsigned
, /* complain_on_overflow */
635 bfd_elf_generic_reloc
, /* special_function */
636 "R_SH_DIR4UW", /* name */
637 FALSE
, /* partial_inplace */
640 FALSE
), /* pcrel_offset */
642 HOWTO (R_SH_DIR4U
, /* type */
644 0, /* size (0 = byte, 1 = short, 2 = long) */
646 FALSE
, /* pc_relative */
648 complain_overflow_unsigned
, /* complain_on_overflow */
649 bfd_elf_generic_reloc
, /* special_function */
650 "R_SH_DIR4U", /* name */
651 FALSE
, /* partial_inplace */
654 FALSE
), /* pcrel_offset */
656 HOWTO (R_SH_PSHA
, /* type */
658 1, /* size (0 = byte, 1 = short, 2 = long) */
660 FALSE
, /* pc_relative */
662 complain_overflow_signed
, /* complain_on_overflow */
663 bfd_elf_generic_reloc
, /* special_function */
664 "R_SH_PSHA", /* name */
665 FALSE
, /* partial_inplace */
668 FALSE
), /* pcrel_offset */
670 HOWTO (R_SH_PSHL
, /* type */
672 1, /* size (0 = byte, 1 = short, 2 = long) */
674 FALSE
, /* pc_relative */
676 complain_overflow_signed
, /* complain_on_overflow */
677 bfd_elf_generic_reloc
, /* special_function */
678 "R_SH_PSHL", /* name */
679 FALSE
, /* partial_inplace */
682 FALSE
), /* pcrel_offset */
684 #ifdef INCLUDE_SHMEDIA
685 /* Used in SHLLI.L and SHLRI.L. */
686 HOWTO (R_SH_DIR5U
, /* type */
688 2, /* size (0 = byte, 1 = short, 2 = long) */
690 FALSE
, /* pc_relative */
692 complain_overflow_unsigned
, /* complain_on_overflow */
693 bfd_elf_generic_reloc
, /* special_function */
694 "R_SH_DIR5U", /* name */
695 FALSE
, /* partial_inplace */
697 0xfc00, /* dst_mask */
698 FALSE
), /* pcrel_offset */
700 /* Used in SHARI, SHLLI et al. */
701 HOWTO (R_SH_DIR6U
, /* type */
703 2, /* size (0 = byte, 1 = short, 2 = long) */
705 FALSE
, /* pc_relative */
707 complain_overflow_unsigned
, /* complain_on_overflow */
708 bfd_elf_generic_reloc
, /* special_function */
709 "R_SH_DIR6U", /* name */
710 FALSE
, /* partial_inplace */
712 0xfc00, /* dst_mask */
713 FALSE
), /* pcrel_offset */
715 /* Used in BxxI, LDHI.L et al. */
716 HOWTO (R_SH_DIR6S
, /* type */
718 2, /* size (0 = byte, 1 = short, 2 = long) */
720 FALSE
, /* pc_relative */
722 complain_overflow_signed
, /* complain_on_overflow */
723 bfd_elf_generic_reloc
, /* special_function */
724 "R_SH_DIR6S", /* name */
725 FALSE
, /* partial_inplace */
727 0xfc00, /* dst_mask */
728 FALSE
), /* pcrel_offset */
730 /* Used in ADDI, ANDI et al. */
731 HOWTO (R_SH_DIR10S
, /* type */
733 2, /* size (0 = byte, 1 = short, 2 = long) */
735 FALSE
, /* pc_relative */
737 complain_overflow_signed
, /* complain_on_overflow */
738 bfd_elf_generic_reloc
, /* special_function */
739 "R_SH_DIR10S", /* name */
740 FALSE
, /* partial_inplace */
742 0xffc00, /* dst_mask */
743 FALSE
), /* pcrel_offset */
745 /* Used in LD.UW, ST.W et al. */
746 HOWTO (R_SH_DIR10SW
, /* type */
748 2, /* size (0 = byte, 1 = short, 2 = long) */
750 FALSE
, /* pc_relative */
752 complain_overflow_signed
, /* complain_on_overflow */
753 bfd_elf_generic_reloc
, /* special_function */
754 "R_SH_DIR10SW", /* name */
755 FALSE
, /* partial_inplace */
757 0xffc00, /* dst_mask */
758 FALSE
), /* pcrel_offset */
760 /* Used in LD.L, FLD.S et al. */
761 HOWTO (R_SH_DIR10SL
, /* type */
763 2, /* size (0 = byte, 1 = short, 2 = long) */
765 FALSE
, /* pc_relative */
767 complain_overflow_signed
, /* complain_on_overflow */
768 bfd_elf_generic_reloc
, /* special_function */
769 "R_SH_DIR10SL", /* name */
770 FALSE
, /* partial_inplace */
772 0xffc00, /* dst_mask */
773 FALSE
), /* pcrel_offset */
775 /* Used in FLD.D, FST.P et al. */
776 HOWTO (R_SH_DIR10SQ
, /* type */
778 2, /* size (0 = byte, 1 = short, 2 = long) */
780 FALSE
, /* pc_relative */
782 complain_overflow_signed
, /* complain_on_overflow */
783 bfd_elf_generic_reloc
, /* special_function */
784 "R_SH_DIR10SQ", /* name */
785 FALSE
, /* partial_inplace */
787 0xffc00, /* dst_mask */
788 FALSE
), /* pcrel_offset */
802 HOWTO (R_SH_DIR16S
, /* type */
804 1, /* size (0 = byte, 1 = short, 2 = long) */
806 FALSE
, /* pc_relative */
808 complain_overflow_signed
, /* complain_on_overflow */
809 bfd_elf_generic_reloc
, /* special_function */
810 "R_SH_DIR16S", /* name */
811 FALSE
, /* partial_inplace */
813 0xffff, /* dst_mask */
814 FALSE
), /* pcrel_offset */
907 HOWTO (R_SH_TLS_GD_32
, /* type */
909 2, /* size (0 = byte, 1 = short, 2 = long) */
911 FALSE
, /* pc_relative */
913 complain_overflow_bitfield
, /* complain_on_overflow */
914 bfd_elf_generic_reloc
, /* */
915 "R_SH_TLS_GD_32", /* name */
916 TRUE
, /* partial_inplace */
917 0xffffffff, /* src_mask */
918 0xffffffff, /* dst_mask */
919 FALSE
), /* pcrel_offset */
921 HOWTO (R_SH_TLS_LD_32
, /* type */
923 2, /* size (0 = byte, 1 = short, 2 = long) */
925 FALSE
, /* pc_relative */
927 complain_overflow_bitfield
, /* complain_on_overflow */
928 bfd_elf_generic_reloc
, /* */
929 "R_SH_TLS_LD_32", /* name */
930 TRUE
, /* partial_inplace */
931 0xffffffff, /* src_mask */
932 0xffffffff, /* dst_mask */
933 FALSE
), /* pcrel_offset */
935 HOWTO (R_SH_TLS_LDO_32
, /* type */
937 2, /* size (0 = byte, 1 = short, 2 = long) */
939 FALSE
, /* pc_relative */
941 complain_overflow_bitfield
, /* complain_on_overflow */
942 bfd_elf_generic_reloc
, /* */
943 "R_SH_TLS_LDO_32", /* name */
944 TRUE
, /* partial_inplace */
945 0xffffffff, /* src_mask */
946 0xffffffff, /* dst_mask */
947 FALSE
), /* pcrel_offset */
949 HOWTO (R_SH_TLS_IE_32
, /* type */
951 2, /* size (0 = byte, 1 = short, 2 = long) */
953 FALSE
, /* pc_relative */
955 complain_overflow_bitfield
, /* complain_on_overflow */
956 bfd_elf_generic_reloc
, /* */
957 "R_SH_TLS_IE_32", /* name */
958 TRUE
, /* partial_inplace */
959 0xffffffff, /* src_mask */
960 0xffffffff, /* dst_mask */
961 FALSE
), /* pcrel_offset */
963 HOWTO (R_SH_TLS_LE_32
, /* type */
965 2, /* size (0 = byte, 1 = short, 2 = long) */
967 FALSE
, /* pc_relative */
969 complain_overflow_bitfield
, /* complain_on_overflow */
970 bfd_elf_generic_reloc
, /* */
971 "R_SH_TLS_LE_32", /* name */
972 TRUE
, /* partial_inplace */
973 0xffffffff, /* src_mask */
974 0xffffffff, /* dst_mask */
975 FALSE
), /* pcrel_offset */
977 HOWTO (R_SH_TLS_DTPMOD32
, /* type */
979 2, /* size (0 = byte, 1 = short, 2 = long) */
981 FALSE
, /* pc_relative */
983 complain_overflow_bitfield
, /* complain_on_overflow */
984 bfd_elf_generic_reloc
, /* */
985 "R_SH_TLS_DTPMOD32", /* name */
986 TRUE
, /* partial_inplace */
987 0xffffffff, /* src_mask */
988 0xffffffff, /* dst_mask */
989 FALSE
), /* pcrel_offset */
991 HOWTO (R_SH_TLS_DTPOFF32
, /* type */
993 2, /* size (0 = byte, 1 = short, 2 = long) */
995 FALSE
, /* pc_relative */
997 complain_overflow_bitfield
, /* complain_on_overflow */
998 bfd_elf_generic_reloc
, /* */
999 "R_SH_TLS_DTPOFF32", /* name */
1000 TRUE
, /* partial_inplace */
1001 0xffffffff, /* src_mask */
1002 0xffffffff, /* dst_mask */
1003 FALSE
), /* pcrel_offset */
1005 HOWTO (R_SH_TLS_TPOFF32
, /* type */
1007 2, /* size (0 = byte, 1 = short, 2 = long) */
1009 FALSE
, /* pc_relative */
1011 complain_overflow_bitfield
, /* complain_on_overflow */
1012 bfd_elf_generic_reloc
, /* */
1013 "R_SH_TLS_TPOFF32", /* name */
1014 TRUE
, /* partial_inplace */
1015 0xffffffff, /* src_mask */
1016 0xffffffff, /* dst_mask */
1017 FALSE
), /* pcrel_offset */
1028 HOWTO (R_SH_GOT32
, /* type */
1030 2, /* size (0 = byte, 1 = short, 2 = long) */
1032 FALSE
, /* pc_relative */
1034 complain_overflow_bitfield
, /* complain_on_overflow */
1035 bfd_elf_generic_reloc
, /* */
1036 "R_SH_GOT32", /* name */
1037 TRUE
, /* partial_inplace */
1038 0xffffffff, /* src_mask */
1039 0xffffffff, /* dst_mask */
1040 FALSE
), /* pcrel_offset */
1042 HOWTO (R_SH_PLT32
, /* type */
1044 2, /* size (0 = byte, 1 = short, 2 = long) */
1046 TRUE
, /* pc_relative */
1048 complain_overflow_bitfield
, /* complain_on_overflow */
1049 bfd_elf_generic_reloc
, /* */
1050 "R_SH_PLT32", /* name */
1051 TRUE
, /* partial_inplace */
1052 0xffffffff, /* src_mask */
1053 0xffffffff, /* dst_mask */
1054 TRUE
), /* pcrel_offset */
1056 HOWTO (R_SH_COPY
, /* type */
1058 2, /* size (0 = byte, 1 = short, 2 = long) */
1060 FALSE
, /* pc_relative */
1062 complain_overflow_bitfield
, /* complain_on_overflow */
1063 bfd_elf_generic_reloc
, /* */
1064 "R_SH_COPY", /* name */
1065 TRUE
, /* partial_inplace */
1066 0xffffffff, /* src_mask */
1067 0xffffffff, /* dst_mask */
1068 FALSE
), /* pcrel_offset */
1070 HOWTO (R_SH_GLOB_DAT
, /* type */
1072 2, /* size (0 = byte, 1 = short, 2 = long) */
1074 FALSE
, /* pc_relative */
1076 complain_overflow_bitfield
, /* complain_on_overflow */
1077 bfd_elf_generic_reloc
, /* */
1078 "R_SH_GLOB_DAT", /* name */
1079 TRUE
, /* partial_inplace */
1080 0xffffffff, /* src_mask */
1081 0xffffffff, /* dst_mask */
1082 FALSE
), /* pcrel_offset */
1084 HOWTO (R_SH_JMP_SLOT
, /* type */
1086 2, /* size (0 = byte, 1 = short, 2 = long) */
1088 FALSE
, /* pc_relative */
1090 complain_overflow_bitfield
, /* complain_on_overflow */
1091 bfd_elf_generic_reloc
, /* */
1092 "R_SH_JMP_SLOT", /* name */
1093 TRUE
, /* partial_inplace */
1094 0xffffffff, /* src_mask */
1095 0xffffffff, /* dst_mask */
1096 FALSE
), /* pcrel_offset */
1098 HOWTO (R_SH_RELATIVE
, /* type */
1100 2, /* size (0 = byte, 1 = short, 2 = long) */
1102 FALSE
, /* pc_relative */
1104 complain_overflow_bitfield
, /* complain_on_overflow */
1105 bfd_elf_generic_reloc
, /* */
1106 "R_SH_RELATIVE", /* name */
1107 TRUE
, /* partial_inplace */
1108 0xffffffff, /* src_mask */
1109 0xffffffff, /* dst_mask */
1110 FALSE
), /* pcrel_offset */
1112 HOWTO (R_SH_GOTOFF
, /* type */
1114 2, /* size (0 = byte, 1 = short, 2 = long) */
1116 FALSE
, /* pc_relative */
1118 complain_overflow_bitfield
, /* complain_on_overflow */
1119 bfd_elf_generic_reloc
, /* */
1120 "R_SH_GOTOFF", /* name */
1121 TRUE
, /* partial_inplace */
1122 0xffffffff, /* src_mask */
1123 0xffffffff, /* dst_mask */
1124 FALSE
), /* pcrel_offset */
1126 HOWTO (R_SH_GOTPC
, /* type */
1128 2, /* size (0 = byte, 1 = short, 2 = long) */
1130 TRUE
, /* pc_relative */
1132 complain_overflow_bitfield
, /* complain_on_overflow */
1133 bfd_elf_generic_reloc
, /* */
1134 "R_SH_GOTPC", /* name */
1135 TRUE
, /* partial_inplace */
1136 0xffffffff, /* src_mask */
1137 0xffffffff, /* dst_mask */
1138 TRUE
), /* pcrel_offset */
1140 HOWTO (R_SH_GOTPLT32
, /* type */
1142 2, /* size (0 = byte, 1 = short, 2 = long) */
1144 FALSE
, /* pc_relative */
1146 complain_overflow_bitfield
, /* complain_on_overflow */
1147 bfd_elf_generic_reloc
, /* */
1148 "R_SH_GOTPLT32", /* name */
1149 FALSE
, /* partial_inplace */
1150 0xffffffff, /* src_mask */
1151 0xffffffff, /* dst_mask */
1152 FALSE
), /* pcrel_offset */
1154 #ifdef INCLUDE_SHMEDIA
1155 /* Used in MOVI and SHORI (x & 65536). */
1156 HOWTO (R_SH_GOT_LOW16
, /* type */
1158 2, /* size (0 = byte, 1 = short, 2 = long) */
1160 FALSE
, /* pc_relative */
1162 complain_overflow_dont
, /* complain_on_overflow */
1163 bfd_elf_generic_reloc
, /* special_function */
1164 "R_SH_GOT_LOW16", /* name */
1165 FALSE
, /* partial_inplace */
1167 0x3fffc00, /* dst_mask */
1168 FALSE
), /* pcrel_offset */
1170 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1171 HOWTO (R_SH_GOT_MEDLOW16
, /* type */
1172 16, /* rightshift */
1173 2, /* size (0 = byte, 1 = short, 2 = long) */
1175 FALSE
, /* pc_relative */
1177 complain_overflow_dont
, /* complain_on_overflow */
1178 bfd_elf_generic_reloc
, /* special_function */
1179 "R_SH_GOT_MEDLOW16", /* name */
1180 FALSE
, /* partial_inplace */
1182 0x3fffc00, /* dst_mask */
1183 FALSE
), /* pcrel_offset */
1185 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1186 HOWTO (R_SH_GOT_MEDHI16
, /* type */
1187 32, /* rightshift */
1188 2, /* size (0 = byte, 1 = short, 2 = long) */
1190 FALSE
, /* pc_relative */
1192 complain_overflow_dont
, /* complain_on_overflow */
1193 bfd_elf_generic_reloc
, /* special_function */
1194 "R_SH_GOT_MEDHI16", /* name */
1195 FALSE
, /* partial_inplace */
1197 0x3fffc00, /* dst_mask */
1198 FALSE
), /* pcrel_offset */
1200 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1201 HOWTO (R_SH_GOT_HI16
, /* type */
1202 48, /* rightshift */
1203 2, /* size (0 = byte, 1 = short, 2 = long) */
1205 FALSE
, /* pc_relative */
1207 complain_overflow_dont
, /* complain_on_overflow */
1208 bfd_elf_generic_reloc
, /* special_function */
1209 "R_SH_GOT_HI16", /* name */
1210 FALSE
, /* partial_inplace */
1212 0x3fffc00, /* dst_mask */
1213 FALSE
), /* pcrel_offset */
1215 /* Used in MOVI and SHORI (x & 65536). */
1216 HOWTO (R_SH_GOTPLT_LOW16
, /* type */
1218 2, /* size (0 = byte, 1 = short, 2 = long) */
1220 FALSE
, /* pc_relative */
1222 complain_overflow_dont
, /* complain_on_overflow */
1223 bfd_elf_generic_reloc
, /* special_function */
1224 "R_SH_GOTPLT_LOW16", /* name */
1225 FALSE
, /* partial_inplace */
1227 0x3fffc00, /* dst_mask */
1228 FALSE
), /* pcrel_offset */
1230 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1231 HOWTO (R_SH_GOTPLT_MEDLOW16
, /* type */
1232 16, /* rightshift */
1233 2, /* size (0 = byte, 1 = short, 2 = long) */
1235 FALSE
, /* pc_relative */
1237 complain_overflow_dont
, /* complain_on_overflow */
1238 bfd_elf_generic_reloc
, /* special_function */
1239 "R_SH_GOTPLT_MEDLOW16", /* name */
1240 FALSE
, /* partial_inplace */
1242 0x3fffc00, /* dst_mask */
1243 FALSE
), /* pcrel_offset */
1245 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1246 HOWTO (R_SH_GOTPLT_MEDHI16
, /* type */
1247 32, /* rightshift */
1248 2, /* size (0 = byte, 1 = short, 2 = long) */
1250 FALSE
, /* pc_relative */
1252 complain_overflow_dont
, /* complain_on_overflow */
1253 bfd_elf_generic_reloc
, /* special_function */
1254 "R_SH_GOTPLT_MEDHI16", /* name */
1255 FALSE
, /* partial_inplace */
1257 0x3fffc00, /* dst_mask */
1258 FALSE
), /* pcrel_offset */
1260 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1261 HOWTO (R_SH_GOTPLT_HI16
, /* type */
1262 48, /* rightshift */
1263 2, /* size (0 = byte, 1 = short, 2 = long) */
1265 FALSE
, /* pc_relative */
1267 complain_overflow_dont
, /* complain_on_overflow */
1268 bfd_elf_generic_reloc
, /* special_function */
1269 "R_SH_GOTPLT_HI16", /* name */
1270 FALSE
, /* partial_inplace */
1272 0x3fffc00, /* dst_mask */
1273 FALSE
), /* pcrel_offset */
1275 /* Used in MOVI and SHORI (x & 65536). */
1276 HOWTO (R_SH_PLT_LOW16
, /* type */
1278 2, /* size (0 = byte, 1 = short, 2 = long) */
1280 TRUE
, /* pc_relative */
1282 complain_overflow_dont
, /* complain_on_overflow */
1283 bfd_elf_generic_reloc
, /* special_function */
1284 "R_SH_PLT_LOW16", /* name */
1285 FALSE
, /* partial_inplace */
1287 0x3fffc00, /* dst_mask */
1288 TRUE
), /* pcrel_offset */
1290 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1291 HOWTO (R_SH_PLT_MEDLOW16
, /* type */
1292 16, /* rightshift */
1293 2, /* size (0 = byte, 1 = short, 2 = long) */
1295 TRUE
, /* pc_relative */
1297 complain_overflow_dont
, /* complain_on_overflow */
1298 bfd_elf_generic_reloc
, /* special_function */
1299 "R_SH_PLT_MEDLOW16", /* name */
1300 FALSE
, /* partial_inplace */
1302 0x3fffc00, /* dst_mask */
1303 TRUE
), /* pcrel_offset */
1305 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1306 HOWTO (R_SH_PLT_MEDHI16
, /* type */
1307 32, /* rightshift */
1308 2, /* size (0 = byte, 1 = short, 2 = long) */
1310 TRUE
, /* pc_relative */
1312 complain_overflow_dont
, /* complain_on_overflow */
1313 bfd_elf_generic_reloc
, /* special_function */
1314 "R_SH_PLT_MEDHI16", /* name */
1315 FALSE
, /* partial_inplace */
1317 0x3fffc00, /* dst_mask */
1318 TRUE
), /* pcrel_offset */
1320 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1321 HOWTO (R_SH_PLT_HI16
, /* type */
1322 48, /* rightshift */
1323 2, /* size (0 = byte, 1 = short, 2 = long) */
1325 TRUE
, /* pc_relative */
1327 complain_overflow_dont
, /* complain_on_overflow */
1328 bfd_elf_generic_reloc
, /* special_function */
1329 "R_SH_PLT_HI16", /* name */
1330 FALSE
, /* partial_inplace */
1332 0x3fffc00, /* dst_mask */
1333 TRUE
), /* pcrel_offset */
1335 /* Used in MOVI and SHORI (x & 65536). */
1336 HOWTO (R_SH_GOTOFF_LOW16
, /* type */
1338 2, /* size (0 = byte, 1 = short, 2 = long) */
1340 FALSE
, /* pc_relative */
1342 complain_overflow_dont
, /* complain_on_overflow */
1343 bfd_elf_generic_reloc
, /* special_function */
1344 "R_SH_GOTOFF_LOW16", /* name */
1345 FALSE
, /* partial_inplace */
1347 0x3fffc00, /* dst_mask */
1348 FALSE
), /* pcrel_offset */
1350 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1351 HOWTO (R_SH_GOTOFF_MEDLOW16
, /* type */
1352 16, /* rightshift */
1353 2, /* size (0 = byte, 1 = short, 2 = long) */
1355 FALSE
, /* pc_relative */
1357 complain_overflow_dont
, /* complain_on_overflow */
1358 bfd_elf_generic_reloc
, /* special_function */
1359 "R_SH_GOTOFF_MEDLOW16", /* name */
1360 FALSE
, /* partial_inplace */
1362 0x3fffc00, /* dst_mask */
1363 FALSE
), /* pcrel_offset */
1365 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1366 HOWTO (R_SH_GOTOFF_MEDHI16
, /* type */
1367 32, /* rightshift */
1368 2, /* size (0 = byte, 1 = short, 2 = long) */
1370 FALSE
, /* pc_relative */
1372 complain_overflow_dont
, /* complain_on_overflow */
1373 bfd_elf_generic_reloc
, /* special_function */
1374 "R_SH_GOTOFF_MEDHI16", /* name */
1375 FALSE
, /* partial_inplace */
1377 0x3fffc00, /* dst_mask */
1378 FALSE
), /* pcrel_offset */
1380 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1381 HOWTO (R_SH_GOTOFF_HI16
, /* type */
1382 48, /* rightshift */
1383 2, /* size (0 = byte, 1 = short, 2 = long) */
1385 FALSE
, /* pc_relative */
1387 complain_overflow_dont
, /* complain_on_overflow */
1388 bfd_elf_generic_reloc
, /* special_function */
1389 "R_SH_GOTOFF_HI16", /* name */
1390 FALSE
, /* partial_inplace */
1392 0x3fffc00, /* dst_mask */
1393 FALSE
), /* pcrel_offset */
1395 /* Used in MOVI and SHORI (x & 65536). */
1396 HOWTO (R_SH_GOTPC_LOW16
, /* type */
1398 2, /* size (0 = byte, 1 = short, 2 = long) */
1400 TRUE
, /* pc_relative */
1402 complain_overflow_dont
, /* complain_on_overflow */
1403 bfd_elf_generic_reloc
, /* special_function */
1404 "R_SH_GOTPC_LOW16", /* name */
1405 FALSE
, /* partial_inplace */
1407 0x3fffc00, /* dst_mask */
1408 TRUE
), /* pcrel_offset */
1410 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1411 HOWTO (R_SH_GOTPC_MEDLOW16
, /* type */
1412 16, /* rightshift */
1413 2, /* size (0 = byte, 1 = short, 2 = long) */
1415 TRUE
, /* pc_relative */
1417 complain_overflow_dont
, /* complain_on_overflow */
1418 bfd_elf_generic_reloc
, /* special_function */
1419 "R_SH_GOTPC_MEDLOW16", /* name */
1420 FALSE
, /* partial_inplace */
1422 0x3fffc00, /* dst_mask */
1423 TRUE
), /* pcrel_offset */
1425 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1426 HOWTO (R_SH_GOTPC_MEDHI16
, /* type */
1427 32, /* rightshift */
1428 2, /* size (0 = byte, 1 = short, 2 = long) */
1430 TRUE
, /* pc_relative */
1432 complain_overflow_dont
, /* complain_on_overflow */
1433 bfd_elf_generic_reloc
, /* special_function */
1434 "R_SH_GOTPC_MEDHI16", /* name */
1435 FALSE
, /* partial_inplace */
1437 0x3fffc00, /* dst_mask */
1438 TRUE
), /* pcrel_offset */
1440 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1441 HOWTO (R_SH_GOTPC_HI16
, /* type */
1442 48, /* rightshift */
1443 2, /* size (0 = byte, 1 = short, 2 = long) */
1445 TRUE
, /* pc_relative */
1447 complain_overflow_dont
, /* complain_on_overflow */
1448 bfd_elf_generic_reloc
, /* special_function */
1449 "R_SH_GOTPC_HI16", /* name */
1450 FALSE
, /* partial_inplace */
1452 0x3fffc00, /* dst_mask */
1453 TRUE
), /* pcrel_offset */
1455 /* Used in LD.L, FLD.S et al. */
1456 HOWTO (R_SH_GOT10BY4
, /* type */
1458 2, /* size (0 = byte, 1 = short, 2 = long) */
1460 FALSE
, /* pc_relative */
1462 complain_overflow_signed
, /* complain_on_overflow */
1463 bfd_elf_generic_reloc
, /* special_function */
1464 "R_SH_GOT10BY4", /* name */
1465 FALSE
, /* partial_inplace */
1467 0xffc00, /* dst_mask */
1468 FALSE
), /* pcrel_offset */
1470 /* Used in LD.L, FLD.S et al. */
1471 HOWTO (R_SH_GOTPLT10BY4
, /* type */
1473 2, /* size (0 = byte, 1 = short, 2 = long) */
1475 FALSE
, /* pc_relative */
1477 complain_overflow_signed
, /* complain_on_overflow */
1478 bfd_elf_generic_reloc
, /* special_function */
1479 "R_SH_GOTPLT10BY4", /* name */
1480 FALSE
, /* partial_inplace */
1482 0xffc00, /* dst_mask */
1483 FALSE
), /* pcrel_offset */
1485 /* Used in FLD.D, FST.P et al. */
1486 HOWTO (R_SH_GOT10BY8
, /* type */
1488 2, /* size (0 = byte, 1 = short, 2 = long) */
1490 FALSE
, /* pc_relative */
1492 complain_overflow_signed
, /* complain_on_overflow */
1493 bfd_elf_generic_reloc
, /* special_function */
1494 "R_SH_GOT10BY8", /* name */
1495 FALSE
, /* partial_inplace */
1497 0xffc00, /* dst_mask */
1498 FALSE
), /* pcrel_offset */
1500 /* Used in FLD.D, FST.P et al. */
1501 HOWTO (R_SH_GOTPLT10BY8
, /* type */
1503 2, /* size (0 = byte, 1 = short, 2 = long) */
1505 FALSE
, /* pc_relative */
1507 complain_overflow_signed
, /* complain_on_overflow */
1508 bfd_elf_generic_reloc
, /* special_function */
1509 "R_SH_GOTPLT10BY8", /* name */
1510 FALSE
, /* partial_inplace */
1512 0xffc00, /* dst_mask */
1513 FALSE
), /* pcrel_offset */
1515 HOWTO (R_SH_COPY64
, /* type */
1517 4, /* size (0 = byte, 1 = short, 2 = long) */
1519 FALSE
, /* pc_relative */
1521 complain_overflow_dont
, /* complain_on_overflow */
1522 bfd_elf_generic_reloc
, /* special_function */
1523 "R_SH_COPY64", /* name */
1524 FALSE
, /* partial_inplace */
1526 ((bfd_vma
) 0) - 1, /* dst_mask */
1527 FALSE
), /* pcrel_offset */
1529 HOWTO (R_SH_GLOB_DAT64
, /* type */
1531 4, /* size (0 = byte, 1 = short, 2 = long) */
1533 FALSE
, /* pc_relative */
1535 complain_overflow_dont
, /* complain_on_overflow */
1536 bfd_elf_generic_reloc
, /* special_function */
1537 "R_SH_GLOB_DAT64", /* name */
1538 FALSE
, /* partial_inplace */
1540 ((bfd_vma
) 0) - 1, /* dst_mask */
1541 FALSE
), /* pcrel_offset */
1543 HOWTO (R_SH_JMP_SLOT64
, /* type */
1545 4, /* size (0 = byte, 1 = short, 2 = long) */
1547 FALSE
, /* pc_relative */
1549 complain_overflow_dont
, /* complain_on_overflow */
1550 bfd_elf_generic_reloc
, /* special_function */
1551 "R_SH_JMP_SLOT64", /* name */
1552 FALSE
, /* partial_inplace */
1554 ((bfd_vma
) 0) - 1, /* dst_mask */
1555 FALSE
), /* pcrel_offset */
1557 HOWTO (R_SH_RELATIVE64
, /* type */
1559 4, /* size (0 = byte, 1 = short, 2 = long) */
1561 FALSE
, /* pc_relative */
1563 complain_overflow_dont
, /* complain_on_overflow */
1564 bfd_elf_generic_reloc
, /* special_function */
1565 "R_SH_RELATIVE64", /* name */
1566 FALSE
, /* partial_inplace */
1568 ((bfd_vma
) 0) - 1, /* dst_mask */
1569 FALSE
), /* pcrel_offset */
1617 /* Relocations for SHmedia code. None of these are partial_inplace or
1618 use the field being relocated (except R_SH_PT_16). */
1620 /* The assembler will generate this reloc before a block of SHmedia
1621 instructions. A section should be processed as assuming it contains
1622 data, unless this reloc is seen. Note that a block of SHcompact
1623 instructions are instead preceded by R_SH_CODE.
1624 This is currently not implemented, but should be used for SHmedia
1625 linker relaxation. */
1626 HOWTO (R_SH_SHMEDIA_CODE
, /* type */
1628 1, /* size (0 = byte, 1 = short, 2 = long) */
1630 FALSE
, /* pc_relative */
1632 complain_overflow_unsigned
, /* complain_on_overflow */
1633 sh_elf_ignore_reloc
, /* special_function */
1634 "R_SH_SHMEDIA_CODE", /* name */
1635 FALSE
, /* partial_inplace */
1638 FALSE
), /* pcrel_offset */
1640 /* The assembler will generate this reloc at a PTA or PTB instruction,
1641 and the linker checks the right type of target, or changes a PTA to a
1642 PTB, if the original insn was PT. */
1643 HOWTO (R_SH_PT_16
, /* type */
1645 2, /* size (0 = byte, 1 = short, 2 = long) */
1647 TRUE
, /* pc_relative */
1649 complain_overflow_signed
, /* complain_on_overflow */
1650 bfd_elf_generic_reloc
, /* special_function */
1651 "R_SH_PT_16", /* name */
1652 FALSE
, /* partial_inplace */
1654 0x3fffc00, /* dst_mask */
1655 TRUE
), /* pcrel_offset */
1657 /* Used in unexpanded MOVI. */
1658 HOWTO (R_SH_IMMS16
, /* type */
1660 2, /* size (0 = byte, 1 = short, 2 = long) */
1662 FALSE
, /* pc_relative */
1664 complain_overflow_signed
, /* complain_on_overflow */
1665 bfd_elf_generic_reloc
, /* special_function */
1666 "R_SH_IMMS16", /* name */
1667 FALSE
, /* partial_inplace */
1669 0x3fffc00, /* dst_mask */
1670 FALSE
), /* pcrel_offset */
1672 /* Used in SHORI. */
1673 HOWTO (R_SH_IMMU16
, /* type */
1675 2, /* size (0 = byte, 1 = short, 2 = long) */
1677 FALSE
, /* pc_relative */
1679 complain_overflow_unsigned
, /* complain_on_overflow */
1680 bfd_elf_generic_reloc
, /* special_function */
1681 "R_SH_IMMU16", /* name */
1682 FALSE
, /* partial_inplace */
1684 0x3fffc00, /* dst_mask */
1685 FALSE
), /* pcrel_offset */
1687 /* Used in MOVI and SHORI (x & 65536). */
1688 HOWTO (R_SH_IMM_LOW16
, /* type */
1690 2, /* size (0 = byte, 1 = short, 2 = long) */
1692 FALSE
, /* pc_relative */
1694 complain_overflow_dont
, /* complain_on_overflow */
1695 bfd_elf_generic_reloc
, /* special_function */
1696 "R_SH_IMM_LOW16", /* name */
1697 FALSE
, /* partial_inplace */
1699 0x3fffc00, /* dst_mask */
1700 FALSE
), /* pcrel_offset */
1702 /* Used in MOVI and SHORI ((x - $) & 65536). */
1703 HOWTO (R_SH_IMM_LOW16_PCREL
, /* type */
1705 2, /* size (0 = byte, 1 = short, 2 = long) */
1707 TRUE
, /* pc_relative */
1709 complain_overflow_dont
, /* complain_on_overflow */
1710 bfd_elf_generic_reloc
, /* special_function */
1711 "R_SH_IMM_LOW16_PCREL", /* name */
1712 FALSE
, /* partial_inplace */
1714 0x3fffc00, /* dst_mask */
1715 TRUE
), /* pcrel_offset */
1717 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1718 HOWTO (R_SH_IMM_MEDLOW16
, /* type */
1719 16, /* rightshift */
1720 2, /* size (0 = byte, 1 = short, 2 = long) */
1722 FALSE
, /* pc_relative */
1724 complain_overflow_dont
, /* complain_on_overflow */
1725 bfd_elf_generic_reloc
, /* special_function */
1726 "R_SH_IMM_MEDLOW16", /* name */
1727 FALSE
, /* partial_inplace */
1729 0x3fffc00, /* dst_mask */
1730 FALSE
), /* pcrel_offset */
1732 /* Used in MOVI and SHORI (((x - $) >> 16) & 65536). */
1733 HOWTO (R_SH_IMM_MEDLOW16_PCREL
, /* type */
1734 16, /* rightshift */
1735 2, /* size (0 = byte, 1 = short, 2 = long) */
1737 TRUE
, /* pc_relative */
1739 complain_overflow_dont
, /* complain_on_overflow */
1740 bfd_elf_generic_reloc
, /* special_function */
1741 "R_SH_IMM_MEDLOW16_PCREL", /* name */
1742 FALSE
, /* partial_inplace */
1744 0x3fffc00, /* dst_mask */
1745 TRUE
), /* pcrel_offset */
1747 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1748 HOWTO (R_SH_IMM_MEDHI16
, /* type */
1749 32, /* rightshift */
1750 2, /* size (0 = byte, 1 = short, 2 = long) */
1752 FALSE
, /* pc_relative */
1754 complain_overflow_dont
, /* complain_on_overflow */
1755 bfd_elf_generic_reloc
, /* special_function */
1756 "R_SH_IMM_MEDHI16", /* name */
1757 FALSE
, /* partial_inplace */
1759 0x3fffc00, /* dst_mask */
1760 FALSE
), /* pcrel_offset */
1762 /* Used in MOVI and SHORI (((x - $) >> 32) & 65536). */
1763 HOWTO (R_SH_IMM_MEDHI16_PCREL
, /* type */
1764 32, /* rightshift */
1765 2, /* size (0 = byte, 1 = short, 2 = long) */
1767 TRUE
, /* pc_relative */
1769 complain_overflow_dont
, /* complain_on_overflow */
1770 bfd_elf_generic_reloc
, /* special_function */
1771 "R_SH_IMM_MEDHI16_PCREL", /* name */
1772 FALSE
, /* partial_inplace */
1774 0x3fffc00, /* dst_mask */
1775 TRUE
), /* pcrel_offset */
1777 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1778 HOWTO (R_SH_IMM_HI16
, /* type */
1779 48, /* rightshift */
1780 2, /* size (0 = byte, 1 = short, 2 = long) */
1782 FALSE
, /* pc_relative */
1784 complain_overflow_dont
, /* complain_on_overflow */
1785 bfd_elf_generic_reloc
, /* special_function */
1786 "R_SH_IMM_HI16", /* name */
1787 FALSE
, /* partial_inplace */
1789 0x3fffc00, /* dst_mask */
1790 FALSE
), /* pcrel_offset */
1792 /* Used in MOVI and SHORI (((x - $) >> 48) & 65536). */
1793 HOWTO (R_SH_IMM_HI16_PCREL
, /* type */
1794 48, /* rightshift */
1795 2, /* size (0 = byte, 1 = short, 2 = long) */
1797 TRUE
, /* pc_relative */
1799 complain_overflow_dont
, /* complain_on_overflow */
1800 bfd_elf_generic_reloc
, /* special_function */
1801 "R_SH_IMM_HI16_PCREL", /* name */
1802 FALSE
, /* partial_inplace */
1804 0x3fffc00, /* dst_mask */
1805 TRUE
), /* pcrel_offset */
1807 /* For the .uaquad pseudo. */
1808 HOWTO (R_SH_64
, /* type */
1810 4, /* size (0 = byte, 1 = short, 2 = long) */
1812 FALSE
, /* pc_relative */
1814 complain_overflow_dont
, /* complain_on_overflow */
1815 bfd_elf_generic_reloc
, /* special_function */
1816 "R_SH_64", /* name */
1817 FALSE
, /* partial_inplace */
1819 ((bfd_vma
) 0) - 1, /* dst_mask */
1820 FALSE
), /* pcrel_offset */
1822 /* For the .uaquad pseudo, (x - $). */
1823 HOWTO (R_SH_64_PCREL
, /* type */
1824 48, /* rightshift */
1825 2, /* size (0 = byte, 1 = short, 2 = long) */
1827 TRUE
, /* pc_relative */
1829 complain_overflow_dont
, /* complain_on_overflow */
1830 bfd_elf_generic_reloc
, /* special_function */
1831 "R_SH_64_PCREL", /* name */
1832 FALSE
, /* partial_inplace */
1834 ((bfd_vma
) 0) - 1, /* dst_mask */
1835 TRUE
), /* pcrel_offset */
1840 static bfd_reloc_status_type
1841 sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED
, bfd
*input_bfd
,
1842 asection
*input_section
, bfd_byte
*contents
,
1843 bfd_vma addr
, asection
*symbol_section
,
1844 bfd_vma start
, bfd_vma end
)
1846 static bfd_vma last_addr
;
1847 static asection
*last_symbol_section
;
1848 bfd_byte
*start_ptr
, *ptr
, *last_ptr
;
1853 /* Sanity check the address. */
1854 if (addr
> bfd_get_section_limit (input_bfd
, input_section
))
1855 return bfd_reloc_outofrange
;
1857 /* We require the start and end relocations to be processed consecutively -
1858 although we allow then to be processed forwards or backwards. */
1862 last_symbol_section
= symbol_section
;
1863 return bfd_reloc_ok
;
1865 if (last_addr
!= addr
)
1869 if (! symbol_section
|| last_symbol_section
!= symbol_section
|| end
< start
)
1870 return bfd_reloc_outofrange
;
1872 /* Get the symbol_section contents. */
1873 if (symbol_section
!= input_section
)
1875 if (elf_section_data (symbol_section
)->this_hdr
.contents
!= NULL
)
1876 contents
= elf_section_data (symbol_section
)->this_hdr
.contents
;
1879 if (!bfd_malloc_and_get_section (input_bfd
, symbol_section
,
1882 if (contents
!= NULL
)
1884 return bfd_reloc_outofrange
;
1888 #define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
1889 start_ptr
= contents
+ start
;
1890 for (cum_diff
= -6, ptr
= contents
+ end
; cum_diff
< 0 && ptr
> start_ptr
;)
1892 for (last_ptr
= ptr
, ptr
-= 4; ptr
>= start_ptr
&& IS_PPI (ptr
);)
1895 diff
= (last_ptr
- ptr
) >> 1;
1896 cum_diff
+= diff
& 1;
1899 /* Calculate the start / end values to load into rs / re minus four -
1900 so that will cancel out the four we would otherwise have to add to
1901 addr to get the value to subtract in order to get relative addressing. */
1905 end
= (ptr
+ cum_diff
* 2) - contents
;
1909 bfd_vma start0
= start
- 4;
1911 while (start0
&& IS_PPI (contents
+ start0
))
1913 start0
= start
- 2 - ((start
- start0
) & 2);
1914 start
= start0
- cum_diff
- 2;
1918 if (contents
!= NULL
1919 && elf_section_data (symbol_section
)->this_hdr
.contents
!= contents
)
1922 insn
= bfd_get_16 (input_bfd
, contents
+ addr
);
1924 x
= (insn
& 0x200 ? end
: start
) - addr
;
1925 if (input_section
!= symbol_section
)
1926 x
+= ((symbol_section
->output_section
->vma
+ symbol_section
->output_offset
)
1927 - (input_section
->output_section
->vma
1928 + input_section
->output_offset
));
1930 if (x
< -128 || x
> 127)
1931 return bfd_reloc_overflow
;
1933 x
= (insn
& ~0xff) | (x
& 0xff);
1934 bfd_put_16 (input_bfd
, (bfd_vma
) x
, contents
+ addr
);
1936 return bfd_reloc_ok
;
1939 /* This function is used for normal relocs. This used to be like the COFF
1940 function, and is almost certainly incorrect for other ELF targets. */
1942 static bfd_reloc_status_type
1943 sh_elf_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol_in
,
1944 void *data
, asection
*input_section
, bfd
*output_bfd
,
1945 char **error_message ATTRIBUTE_UNUSED
)
1949 enum elf_sh_reloc_type r_type
;
1950 bfd_vma addr
= reloc_entry
->address
;
1951 bfd_byte
*hit_data
= addr
+ (bfd_byte
*) data
;
1953 r_type
= (enum elf_sh_reloc_type
) reloc_entry
->howto
->type
;
1955 if (output_bfd
!= NULL
)
1957 /* Partial linking--do nothing. */
1958 reloc_entry
->address
+= input_section
->output_offset
;
1959 return bfd_reloc_ok
;
1962 /* Almost all relocs have to do with relaxing. If any work must be
1963 done for them, it has been done in sh_relax_section. */
1964 if (r_type
== R_SH_IND12W
&& (symbol_in
->flags
& BSF_LOCAL
) != 0)
1965 return bfd_reloc_ok
;
1967 if (symbol_in
!= NULL
1968 && bfd_is_und_section (symbol_in
->section
))
1969 return bfd_reloc_undefined
;
1971 if (bfd_is_com_section (symbol_in
->section
))
1974 sym_value
= (symbol_in
->value
+
1975 symbol_in
->section
->output_section
->vma
+
1976 symbol_in
->section
->output_offset
);
1981 insn
= bfd_get_32 (abfd
, hit_data
);
1982 insn
+= sym_value
+ reloc_entry
->addend
;
1983 bfd_put_32 (abfd
, (bfd_vma
) insn
, hit_data
);
1986 insn
= bfd_get_16 (abfd
, hit_data
);
1987 sym_value
+= reloc_entry
->addend
;
1988 sym_value
-= (input_section
->output_section
->vma
1989 + input_section
->output_offset
1992 sym_value
+= (insn
& 0xfff) << 1;
1994 sym_value
-= 0x1000;
1995 insn
= (insn
& 0xf000) | (sym_value
& 0xfff);
1996 bfd_put_16 (abfd
, (bfd_vma
) insn
, hit_data
);
1997 if (sym_value
< (bfd_vma
) -0x1000 || sym_value
>= 0x1000)
1998 return bfd_reloc_overflow
;
2005 return bfd_reloc_ok
;
2008 /* This function is used for relocs which are only used for relaxing,
2009 which the linker should otherwise ignore. */
2011 static bfd_reloc_status_type
2012 sh_elf_ignore_reloc (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc_entry
,
2013 asymbol
*symbol ATTRIBUTE_UNUSED
,
2014 void *data ATTRIBUTE_UNUSED
, asection
*input_section
,
2016 char **error_message ATTRIBUTE_UNUSED
)
2018 if (output_bfd
!= NULL
)
2019 reloc_entry
->address
+= input_section
->output_offset
;
2020 return bfd_reloc_ok
;
2023 /* This structure is used to map BFD reloc codes to SH ELF relocs. */
2025 struct elf_reloc_map
2027 bfd_reloc_code_real_type bfd_reloc_val
;
2028 unsigned char elf_reloc_val
;
2031 /* An array mapping BFD reloc codes to SH ELF relocs. */
2033 static const struct elf_reloc_map sh_reloc_map
[] =
2035 { BFD_RELOC_NONE
, R_SH_NONE
},
2036 { BFD_RELOC_32
, R_SH_DIR32
},
2037 { BFD_RELOC_16
, R_SH_DIR16
},
2038 { BFD_RELOC_8
, R_SH_DIR8
},
2039 { BFD_RELOC_CTOR
, R_SH_DIR32
},
2040 { BFD_RELOC_32_PCREL
, R_SH_REL32
},
2041 { BFD_RELOC_SH_PCDISP8BY2
, R_SH_DIR8WPN
},
2042 { BFD_RELOC_SH_PCDISP12BY2
, R_SH_IND12W
},
2043 { BFD_RELOC_SH_PCRELIMM8BY2
, R_SH_DIR8WPZ
},
2044 { BFD_RELOC_SH_PCRELIMM8BY4
, R_SH_DIR8WPL
},
2045 { BFD_RELOC_8_PCREL
, R_SH_SWITCH8
},
2046 { BFD_RELOC_SH_SWITCH16
, R_SH_SWITCH16
},
2047 { BFD_RELOC_SH_SWITCH32
, R_SH_SWITCH32
},
2048 { BFD_RELOC_SH_USES
, R_SH_USES
},
2049 { BFD_RELOC_SH_COUNT
, R_SH_COUNT
},
2050 { BFD_RELOC_SH_ALIGN
, R_SH_ALIGN
},
2051 { BFD_RELOC_SH_CODE
, R_SH_CODE
},
2052 { BFD_RELOC_SH_DATA
, R_SH_DATA
},
2053 { BFD_RELOC_SH_LABEL
, R_SH_LABEL
},
2054 { BFD_RELOC_VTABLE_INHERIT
, R_SH_GNU_VTINHERIT
},
2055 { BFD_RELOC_VTABLE_ENTRY
, R_SH_GNU_VTENTRY
},
2056 { BFD_RELOC_SH_LOOP_START
, R_SH_LOOP_START
},
2057 { BFD_RELOC_SH_LOOP_END
, R_SH_LOOP_END
},
2058 { BFD_RELOC_SH_TLS_GD_32
, R_SH_TLS_GD_32
},
2059 { BFD_RELOC_SH_TLS_LD_32
, R_SH_TLS_LD_32
},
2060 { BFD_RELOC_SH_TLS_LDO_32
, R_SH_TLS_LDO_32
},
2061 { BFD_RELOC_SH_TLS_IE_32
, R_SH_TLS_IE_32
},
2062 { BFD_RELOC_SH_TLS_LE_32
, R_SH_TLS_LE_32
},
2063 { BFD_RELOC_SH_TLS_DTPMOD32
, R_SH_TLS_DTPMOD32
},
2064 { BFD_RELOC_SH_TLS_DTPOFF32
, R_SH_TLS_DTPOFF32
},
2065 { BFD_RELOC_SH_TLS_TPOFF32
, R_SH_TLS_TPOFF32
},
2066 { BFD_RELOC_32_GOT_PCREL
, R_SH_GOT32
},
2067 { BFD_RELOC_32_PLT_PCREL
, R_SH_PLT32
},
2068 { BFD_RELOC_SH_COPY
, R_SH_COPY
},
2069 { BFD_RELOC_SH_GLOB_DAT
, R_SH_GLOB_DAT
},
2070 { BFD_RELOC_SH_JMP_SLOT
, R_SH_JMP_SLOT
},
2071 { BFD_RELOC_SH_RELATIVE
, R_SH_RELATIVE
},
2072 { BFD_RELOC_32_GOTOFF
, R_SH_GOTOFF
},
2073 { BFD_RELOC_SH_GOTPC
, R_SH_GOTPC
},
2074 { BFD_RELOC_SH_GOTPLT32
, R_SH_GOTPLT32
},
2075 #ifdef INCLUDE_SHMEDIA
2076 { BFD_RELOC_SH_GOT_LOW16
, R_SH_GOT_LOW16
},
2077 { BFD_RELOC_SH_GOT_MEDLOW16
, R_SH_GOT_MEDLOW16
},
2078 { BFD_RELOC_SH_GOT_MEDHI16
, R_SH_GOT_MEDHI16
},
2079 { BFD_RELOC_SH_GOT_HI16
, R_SH_GOT_HI16
},
2080 { BFD_RELOC_SH_GOTPLT_LOW16
, R_SH_GOTPLT_LOW16
},
2081 { BFD_RELOC_SH_GOTPLT_MEDLOW16
, R_SH_GOTPLT_MEDLOW16
},
2082 { BFD_RELOC_SH_GOTPLT_MEDHI16
, R_SH_GOTPLT_MEDHI16
},
2083 { BFD_RELOC_SH_GOTPLT_HI16
, R_SH_GOTPLT_HI16
},
2084 { BFD_RELOC_SH_PLT_LOW16
, R_SH_PLT_LOW16
},
2085 { BFD_RELOC_SH_PLT_MEDLOW16
, R_SH_PLT_MEDLOW16
},
2086 { BFD_RELOC_SH_PLT_MEDHI16
, R_SH_PLT_MEDHI16
},
2087 { BFD_RELOC_SH_PLT_HI16
, R_SH_PLT_HI16
},
2088 { BFD_RELOC_SH_GOTOFF_LOW16
, R_SH_GOTOFF_LOW16
},
2089 { BFD_RELOC_SH_GOTOFF_MEDLOW16
, R_SH_GOTOFF_MEDLOW16
},
2090 { BFD_RELOC_SH_GOTOFF_MEDHI16
, R_SH_GOTOFF_MEDHI16
},
2091 { BFD_RELOC_SH_GOTOFF_HI16
, R_SH_GOTOFF_HI16
},
2092 { BFD_RELOC_SH_GOTPC_LOW16
, R_SH_GOTPC_LOW16
},
2093 { BFD_RELOC_SH_GOTPC_MEDLOW16
, R_SH_GOTPC_MEDLOW16
},
2094 { BFD_RELOC_SH_GOTPC_MEDHI16
, R_SH_GOTPC_MEDHI16
},
2095 { BFD_RELOC_SH_GOTPC_HI16
, R_SH_GOTPC_HI16
},
2096 { BFD_RELOC_SH_COPY64
, R_SH_COPY64
},
2097 { BFD_RELOC_SH_GLOB_DAT64
, R_SH_GLOB_DAT64
},
2098 { BFD_RELOC_SH_JMP_SLOT64
, R_SH_JMP_SLOT64
},
2099 { BFD_RELOC_SH_RELATIVE64
, R_SH_RELATIVE64
},
2100 { BFD_RELOC_SH_GOT10BY4
, R_SH_GOT10BY4
},
2101 { BFD_RELOC_SH_GOT10BY8
, R_SH_GOT10BY8
},
2102 { BFD_RELOC_SH_GOTPLT10BY4
, R_SH_GOTPLT10BY4
},
2103 { BFD_RELOC_SH_GOTPLT10BY8
, R_SH_GOTPLT10BY8
},
2104 { BFD_RELOC_SH_PT_16
, R_SH_PT_16
},
2105 { BFD_RELOC_SH_SHMEDIA_CODE
, R_SH_SHMEDIA_CODE
},
2106 { BFD_RELOC_SH_IMMU5
, R_SH_DIR5U
},
2107 { BFD_RELOC_SH_IMMS6
, R_SH_DIR6S
},
2108 { BFD_RELOC_SH_IMMU6
, R_SH_DIR6U
},
2109 { BFD_RELOC_SH_IMMS10
, R_SH_DIR10S
},
2110 { BFD_RELOC_SH_IMMS10BY2
, R_SH_DIR10SW
},
2111 { BFD_RELOC_SH_IMMS10BY4
, R_SH_DIR10SL
},
2112 { BFD_RELOC_SH_IMMS10BY8
, R_SH_DIR10SQ
},
2113 { BFD_RELOC_SH_IMMS16
, R_SH_IMMS16
},
2114 { BFD_RELOC_SH_IMMU16
, R_SH_IMMU16
},
2115 { BFD_RELOC_SH_IMM_LOW16
, R_SH_IMM_LOW16
},
2116 { BFD_RELOC_SH_IMM_LOW16_PCREL
, R_SH_IMM_LOW16_PCREL
},
2117 { BFD_RELOC_SH_IMM_MEDLOW16
, R_SH_IMM_MEDLOW16
},
2118 { BFD_RELOC_SH_IMM_MEDLOW16_PCREL
, R_SH_IMM_MEDLOW16_PCREL
},
2119 { BFD_RELOC_SH_IMM_MEDHI16
, R_SH_IMM_MEDHI16
},
2120 { BFD_RELOC_SH_IMM_MEDHI16_PCREL
, R_SH_IMM_MEDHI16_PCREL
},
2121 { BFD_RELOC_SH_IMM_HI16
, R_SH_IMM_HI16
},
2122 { BFD_RELOC_SH_IMM_HI16_PCREL
, R_SH_IMM_HI16_PCREL
},
2123 { BFD_RELOC_64
, R_SH_64
},
2124 { BFD_RELOC_64_PCREL
, R_SH_64_PCREL
},
2125 #endif /* not INCLUDE_SHMEDIA */
2128 /* Given a BFD reloc code, return the howto structure for the
2129 corresponding SH ELf reloc. */
2131 static reloc_howto_type
*
2132 sh_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
2133 bfd_reloc_code_real_type code
)
2137 for (i
= 0; i
< sizeof (sh_reloc_map
) / sizeof (struct elf_reloc_map
); i
++)
2139 if (sh_reloc_map
[i
].bfd_reloc_val
== code
)
2140 return &sh_elf_howto_table
[(int) sh_reloc_map
[i
].elf_reloc_val
];
2146 /* Given an ELF reloc, fill in the howto field of a relent. */
2149 sh_elf_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
2150 Elf_Internal_Rela
*dst
)
2154 r
= ELF32_R_TYPE (dst
->r_info
);
2156 BFD_ASSERT (r
< (unsigned int) R_SH_max
);
2157 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC
|| r
> R_SH_LAST_INVALID_RELOC
);
2158 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_2
|| r
> R_SH_LAST_INVALID_RELOC_2
);
2159 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_3
|| r
> R_SH_LAST_INVALID_RELOC_3
);
2160 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_4
|| r
> R_SH_LAST_INVALID_RELOC_4
);
2161 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_5
|| r
> R_SH_LAST_INVALID_RELOC_5
);
2163 cache_ptr
->howto
= &sh_elf_howto_table
[r
];
2166 /* This function handles relaxing for SH ELF. See the corresponding
2167 function in coff-sh.c for a description of what this does. FIXME:
2168 There is a lot of duplication here between this code and the COFF
2169 specific code. The format of relocs and symbols is wound deeply
2170 into this code, but it would still be better if the duplication
2171 could be eliminated somehow. Note in particular that although both
2172 functions use symbols like R_SH_CODE, those symbols have different
2173 values; in coff-sh.c they come from include/coff/sh.h, whereas here
2174 they come from enum elf_sh_reloc_type in include/elf/sh.h. */
2177 sh_elf_relax_section (bfd
*abfd
, asection
*sec
,
2178 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
2180 Elf_Internal_Shdr
*symtab_hdr
;
2181 Elf_Internal_Rela
*internal_relocs
;
2182 bfd_boolean have_code
;
2183 Elf_Internal_Rela
*irel
, *irelend
;
2184 bfd_byte
*contents
= NULL
;
2185 Elf_Internal_Sym
*isymbuf
= NULL
;
2189 if (link_info
->relocatable
2190 || (sec
->flags
& SEC_RELOC
) == 0
2191 || sec
->reloc_count
== 0)
2194 #ifdef INCLUDE_SHMEDIA
2195 if (elf_section_data (sec
)->this_hdr
.sh_flags
2196 & (SHF_SH5_ISA32
| SHF_SH5_ISA32_MIXED
))
2202 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2204 internal_relocs
= (_bfd_elf_link_read_relocs
2205 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
2206 link_info
->keep_memory
));
2207 if (internal_relocs
== NULL
)
2212 irelend
= internal_relocs
+ sec
->reloc_count
;
2213 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2215 bfd_vma laddr
, paddr
, symval
;
2216 unsigned short insn
;
2217 Elf_Internal_Rela
*irelfn
, *irelscan
, *irelcount
;
2218 bfd_signed_vma foff
;
2220 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_CODE
)
2223 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_USES
)
2226 /* Get the section contents. */
2227 if (contents
== NULL
)
2229 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2230 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2233 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2238 /* The r_addend field of the R_SH_USES reloc will point us to
2239 the register load. The 4 is because the r_addend field is
2240 computed as though it were a jump offset, which are based
2241 from 4 bytes after the jump instruction. */
2242 laddr
= irel
->r_offset
+ 4 + irel
->r_addend
;
2243 if (laddr
>= sec
->size
)
2245 (*_bfd_error_handler
) (_("%B: 0x%lx: warning: bad R_SH_USES offset"),
2247 (unsigned long) irel
->r_offset
);
2250 insn
= bfd_get_16 (abfd
, contents
+ laddr
);
2252 /* If the instruction is not mov.l NN,rN, we don't know what to
2254 if ((insn
& 0xf000) != 0xd000)
2256 ((*_bfd_error_handler
)
2257 (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
2258 abfd
, (unsigned long) irel
->r_offset
, insn
));
2262 /* Get the address from which the register is being loaded. The
2263 displacement in the mov.l instruction is quadrupled. It is a
2264 displacement from four bytes after the movl instruction, but,
2265 before adding in the PC address, two least significant bits
2266 of the PC are cleared. We assume that the section is aligned
2267 on a four byte boundary. */
2268 paddr
= insn
& 0xff;
2270 paddr
+= (laddr
+ 4) &~ (bfd_vma
) 3;
2271 if (paddr
>= sec
->size
)
2273 ((*_bfd_error_handler
)
2274 (_("%B: 0x%lx: warning: bad R_SH_USES load offset"),
2275 abfd
, (unsigned long) irel
->r_offset
));
2279 /* Get the reloc for the address from which the register is
2280 being loaded. This reloc will tell us which function is
2281 actually being called. */
2282 for (irelfn
= internal_relocs
; irelfn
< irelend
; irelfn
++)
2283 if (irelfn
->r_offset
== paddr
2284 && ELF32_R_TYPE (irelfn
->r_info
) == (int) R_SH_DIR32
)
2286 if (irelfn
>= irelend
)
2288 ((*_bfd_error_handler
)
2289 (_("%B: 0x%lx: warning: could not find expected reloc"),
2290 abfd
, (unsigned long) paddr
));
2294 /* Read this BFD's symbols if we haven't done so already. */
2295 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2297 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2298 if (isymbuf
== NULL
)
2299 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
2300 symtab_hdr
->sh_info
, 0,
2302 if (isymbuf
== NULL
)
2306 /* Get the value of the symbol referred to by the reloc. */
2307 if (ELF32_R_SYM (irelfn
->r_info
) < symtab_hdr
->sh_info
)
2309 /* A local symbol. */
2310 Elf_Internal_Sym
*isym
;
2312 isym
= isymbuf
+ ELF32_R_SYM (irelfn
->r_info
);
2314 != (unsigned int) _bfd_elf_section_from_bfd_section (abfd
, sec
))
2316 ((*_bfd_error_handler
)
2317 (_("%B: 0x%lx: warning: symbol in unexpected section"),
2318 abfd
, (unsigned long) paddr
));
2322 symval
= (isym
->st_value
2323 + sec
->output_section
->vma
2324 + sec
->output_offset
);
2329 struct elf_link_hash_entry
*h
;
2331 indx
= ELF32_R_SYM (irelfn
->r_info
) - symtab_hdr
->sh_info
;
2332 h
= elf_sym_hashes (abfd
)[indx
];
2333 BFD_ASSERT (h
!= NULL
);
2334 if (h
->root
.type
!= bfd_link_hash_defined
2335 && h
->root
.type
!= bfd_link_hash_defweak
)
2337 /* This appears to be a reference to an undefined
2338 symbol. Just ignore it--it will be caught by the
2339 regular reloc processing. */
2343 symval
= (h
->root
.u
.def
.value
2344 + h
->root
.u
.def
.section
->output_section
->vma
2345 + h
->root
.u
.def
.section
->output_offset
);
2348 symval
+= bfd_get_32 (abfd
, contents
+ paddr
);
2350 /* See if this function call can be shortened. */
2353 + sec
->output_section
->vma
2354 + sec
->output_offset
2356 if (foff
< -0x1000 || foff
>= 0x1000)
2358 /* After all that work, we can't shorten this function call. */
2362 /* Shorten the function call. */
2364 /* For simplicity of coding, we are going to modify the section
2365 contents, the section relocs, and the BFD symbol table. We
2366 must tell the rest of the code not to free up this
2367 information. It would be possible to instead create a table
2368 of changes which have to be made, as is done in coff-mips.c;
2369 that would be more work, but would require less memory when
2370 the linker is run. */
2372 elf_section_data (sec
)->relocs
= internal_relocs
;
2373 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2374 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2376 /* Replace the jsr with a bsr. */
2378 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
2379 replace the jsr with a bsr. */
2380 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irelfn
->r_info
), R_SH_IND12W
);
2381 /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
2382 here, but that only checks if the symbol is an external symbol,
2383 not if the symbol is in a different section. Besides, we need
2384 a consistent meaning for the relocation, so we just assume here that
2385 the value of the symbol is not available. */
2387 /* We can't fully resolve this yet, because the external
2388 symbol value may be changed by future relaxing. We let
2389 the final link phase handle it. */
2390 bfd_put_16 (abfd
, (bfd_vma
) 0xb000, contents
+ irel
->r_offset
);
2392 irel
->r_addend
= -4;
2394 /* See if there is another R_SH_USES reloc referring to the same
2396 for (irelscan
= internal_relocs
; irelscan
< irelend
; irelscan
++)
2397 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_USES
2398 && laddr
== irelscan
->r_offset
+ 4 + irelscan
->r_addend
)
2400 if (irelscan
< irelend
)
2402 /* Some other function call depends upon this register load,
2403 and we have not yet converted that function call.
2404 Indeed, we may never be able to convert it. There is
2405 nothing else we can do at this point. */
2409 /* Look for a R_SH_COUNT reloc on the location where the
2410 function address is stored. Do this before deleting any
2411 bytes, to avoid confusion about the address. */
2412 for (irelcount
= internal_relocs
; irelcount
< irelend
; irelcount
++)
2413 if (irelcount
->r_offset
== paddr
2414 && ELF32_R_TYPE (irelcount
->r_info
) == (int) R_SH_COUNT
)
2417 /* Delete the register load. */
2418 if (! sh_elf_relax_delete_bytes (abfd
, sec
, laddr
, 2))
2421 /* That will change things, so, just in case it permits some
2422 other function call to come within range, we should relax
2423 again. Note that this is not required, and it may be slow. */
2426 /* Now check whether we got a COUNT reloc. */
2427 if (irelcount
>= irelend
)
2429 ((*_bfd_error_handler
)
2430 (_("%B: 0x%lx: warning: could not find expected COUNT reloc"),
2431 abfd
, (unsigned long) paddr
));
2435 /* The number of uses is stored in the r_addend field. We've
2436 just deleted one. */
2437 if (irelcount
->r_addend
== 0)
2439 ((*_bfd_error_handler
) (_("%B: 0x%lx: warning: bad count"),
2441 (unsigned long) paddr
));
2445 --irelcount
->r_addend
;
2447 /* If there are no more uses, we can delete the address. Reload
2448 the address from irelfn, in case it was changed by the
2449 previous call to sh_elf_relax_delete_bytes. */
2450 if (irelcount
->r_addend
== 0)
2452 if (! sh_elf_relax_delete_bytes (abfd
, sec
, irelfn
->r_offset
, 4))
2456 /* We've done all we can with that function call. */
2459 /* Look for load and store instructions that we can align on four
2461 if ((elf_elfheader (abfd
)->e_flags
& EF_SH_MACH_MASK
) != EF_SH4
2464 bfd_boolean swapped
;
2466 /* Get the section contents. */
2467 if (contents
== NULL
)
2469 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2470 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2473 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2478 if (! sh_elf_align_loads (abfd
, sec
, internal_relocs
, contents
,
2484 elf_section_data (sec
)->relocs
= internal_relocs
;
2485 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2486 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2491 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2493 if (! link_info
->keep_memory
)
2497 /* Cache the symbols for elf_link_input_bfd. */
2498 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2502 if (contents
!= NULL
2503 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2505 if (! link_info
->keep_memory
)
2509 /* Cache the section contents for elf_link_input_bfd. */
2510 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2514 if (internal_relocs
!= NULL
2515 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2516 free (internal_relocs
);
2522 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2524 if (contents
!= NULL
2525 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2527 if (internal_relocs
!= NULL
2528 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2529 free (internal_relocs
);
2534 /* Delete some bytes from a section while relaxing. FIXME: There is a
2535 lot of duplication between this function and sh_relax_delete_bytes
2539 sh_elf_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
,
2542 Elf_Internal_Shdr
*symtab_hdr
;
2543 unsigned int sec_shndx
;
2545 Elf_Internal_Rela
*irel
, *irelend
;
2546 Elf_Internal_Rela
*irelalign
;
2548 Elf_Internal_Sym
*isymbuf
, *isym
, *isymend
;
2549 struct elf_link_hash_entry
**sym_hashes
;
2550 struct elf_link_hash_entry
**end_hashes
;
2551 unsigned int symcount
;
2554 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2555 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2557 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2559 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2561 /* The deletion must stop at the next ALIGN reloc for an aligment
2562 power larger than the number of bytes we are deleting. */
2567 irel
= elf_section_data (sec
)->relocs
;
2568 irelend
= irel
+ sec
->reloc_count
;
2569 for (; irel
< irelend
; irel
++)
2571 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2572 && irel
->r_offset
> addr
2573 && count
< (1 << irel
->r_addend
))
2576 toaddr
= irel
->r_offset
;
2581 /* Actually delete the bytes. */
2582 memmove (contents
+ addr
, contents
+ addr
+ count
,
2583 (size_t) (toaddr
- addr
- count
));
2584 if (irelalign
== NULL
)
2590 #define NOP_OPCODE (0x0009)
2592 BFD_ASSERT ((count
& 1) == 0);
2593 for (i
= 0; i
< count
; i
+= 2)
2594 bfd_put_16 (abfd
, (bfd_vma
) NOP_OPCODE
, contents
+ toaddr
- count
+ i
);
2597 /* Adjust all the relocs. */
2598 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
2600 bfd_vma nraddr
, stop
;
2603 int off
, adjust
, oinsn
;
2604 bfd_signed_vma voff
= 0;
2605 bfd_boolean overflow
;
2607 /* Get the new reloc address. */
2608 nraddr
= irel
->r_offset
;
2609 if ((irel
->r_offset
> addr
2610 && irel
->r_offset
< toaddr
)
2611 || (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2612 && irel
->r_offset
== toaddr
))
2615 /* See if this reloc was for the bytes we have deleted, in which
2616 case we no longer care about it. Don't delete relocs which
2617 represent addresses, though. */
2618 if (irel
->r_offset
>= addr
2619 && irel
->r_offset
< addr
+ count
2620 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_ALIGN
2621 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
2622 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_DATA
2623 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_LABEL
)
2624 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2627 /* If this is a PC relative reloc, see if the range it covers
2628 includes the bytes we have deleted. */
2629 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2638 start
= irel
->r_offset
;
2639 insn
= bfd_get_16 (abfd
, contents
+ nraddr
);
2643 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2646 start
= stop
= addr
;
2650 /* If this reloc is against a symbol defined in this
2651 section, and the symbol will not be adjusted below, we
2652 must check the addend to see it will put the value in
2653 range to be adjusted, and hence must be changed. */
2654 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2656 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
2657 if (isym
->st_shndx
== sec_shndx
2658 && (isym
->st_value
<= addr
2659 || isym
->st_value
>= toaddr
))
2663 val
= bfd_get_32 (abfd
, contents
+ nraddr
);
2664 val
+= isym
->st_value
;
2665 if (val
> addr
&& val
< toaddr
)
2666 bfd_put_32 (abfd
, val
- count
, contents
+ nraddr
);
2669 start
= stop
= addr
;
2676 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2683 /* This has been made by previous relaxation. Since the
2684 relocation will be against an external symbol, the
2685 final relocation will just do the right thing. */
2686 start
= stop
= addr
;
2692 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2694 /* The addend will be against the section symbol, thus
2695 for adjusting the addend, the relevant start is the
2696 start of the section.
2697 N.B. If we want to abandon in-place changes here and
2698 test directly using symbol + addend, we have to take into
2699 account that the addend has already been adjusted by -4. */
2700 if (stop
> addr
&& stop
< toaddr
)
2701 irel
->r_addend
-= count
;
2707 stop
= start
+ 4 + off
* 2;
2712 stop
= (start
& ~(bfd_vma
) 3) + 4 + off
* 4;
2718 /* These relocs types represent
2720 The r_addend field holds the difference between the reloc
2721 address and L1. That is the start of the reloc, and
2722 adding in the contents gives us the top. We must adjust
2723 both the r_offset field and the section contents.
2724 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
2725 and the elf bfd r_offset is called r_vaddr. */
2727 stop
= irel
->r_offset
;
2728 start
= (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irel
->r_addend
);
2732 && (stop
<= addr
|| stop
>= toaddr
))
2733 irel
->r_addend
+= count
;
2734 else if (stop
> addr
2736 && (start
<= addr
|| start
>= toaddr
))
2737 irel
->r_addend
-= count
;
2739 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH16
)
2740 voff
= bfd_get_signed_16 (abfd
, contents
+ nraddr
);
2741 else if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH8
)
2742 voff
= bfd_get_8 (abfd
, contents
+ nraddr
);
2744 voff
= bfd_get_signed_32 (abfd
, contents
+ nraddr
);
2745 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2750 start
= irel
->r_offset
;
2751 stop
= (bfd_vma
) ((bfd_signed_vma
) start
2752 + (long) irel
->r_addend
2759 && (stop
<= addr
|| stop
>= toaddr
))
2761 else if (stop
> addr
2763 && (start
<= addr
|| start
>= toaddr
))
2772 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2781 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2783 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2788 if ((oinsn
& 0xf000) != (insn
& 0xf000))
2790 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2794 BFD_ASSERT (adjust
== count
|| count
>= 4);
2799 if ((irel
->r_offset
& 3) == 0)
2802 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2804 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2809 if (voff
< 0 || voff
>= 0xff)
2811 bfd_put_8 (abfd
, voff
, contents
+ nraddr
);
2816 if (voff
< - 0x8000 || voff
>= 0x8000)
2818 bfd_put_signed_16 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2823 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2827 irel
->r_addend
+= adjust
;
2833 ((*_bfd_error_handler
)
2834 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
2835 abfd
, (unsigned long) irel
->r_offset
));
2836 bfd_set_error (bfd_error_bad_value
);
2841 irel
->r_offset
= nraddr
;
2844 /* Look through all the other sections. If there contain any IMM32
2845 relocs against internal symbols which we are not going to adjust
2846 below, we may need to adjust the addends. */
2847 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2849 Elf_Internal_Rela
*internal_relocs
;
2850 Elf_Internal_Rela
*irelscan
, *irelscanend
;
2851 bfd_byte
*ocontents
;
2854 || (o
->flags
& SEC_RELOC
) == 0
2855 || o
->reloc_count
== 0)
2858 /* We always cache the relocs. Perhaps, if info->keep_memory is
2859 FALSE, we should free them, if we are permitted to, when we
2860 leave sh_coff_relax_section. */
2861 internal_relocs
= (_bfd_elf_link_read_relocs
2862 (abfd
, o
, NULL
, (Elf_Internal_Rela
*) NULL
, TRUE
));
2863 if (internal_relocs
== NULL
)
2867 irelscanend
= internal_relocs
+ o
->reloc_count
;
2868 for (irelscan
= internal_relocs
; irelscan
< irelscanend
; irelscan
++)
2870 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
2871 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_SWITCH32
)
2873 bfd_vma start
, stop
;
2874 bfd_signed_vma voff
;
2876 if (ocontents
== NULL
)
2878 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2879 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2882 /* We always cache the section contents.
2883 Perhaps, if info->keep_memory is FALSE, we
2884 should free them, if we are permitted to,
2885 when we leave sh_coff_relax_section. */
2886 if (!bfd_malloc_and_get_section (abfd
, o
, &ocontents
))
2888 if (ocontents
!= NULL
)
2893 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2897 stop
= irelscan
->r_offset
;
2899 = (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irelscan
->r_addend
);
2901 /* STOP is in a different section, so it won't change. */
2902 if (start
> addr
&& start
< toaddr
)
2903 irelscan
->r_addend
+= count
;
2905 voff
= bfd_get_signed_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2906 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2910 && (stop
<= addr
|| stop
>= toaddr
))
2911 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
+ count
,
2912 ocontents
+ irelscan
->r_offset
);
2913 else if (stop
> addr
2915 && (start
<= addr
|| start
>= toaddr
))
2916 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
- count
,
2917 ocontents
+ irelscan
->r_offset
);
2920 if (ELF32_R_TYPE (irelscan
->r_info
) != (int) R_SH_DIR32
)
2923 if (ELF32_R_SYM (irelscan
->r_info
) >= symtab_hdr
->sh_info
)
2927 isym
= isymbuf
+ ELF32_R_SYM (irelscan
->r_info
);
2928 if (isym
->st_shndx
== sec_shndx
2929 && (isym
->st_value
<= addr
2930 || isym
->st_value
>= toaddr
))
2934 if (ocontents
== NULL
)
2936 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2937 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2940 /* We always cache the section contents.
2941 Perhaps, if info->keep_memory is FALSE, we
2942 should free them, if we are permitted to,
2943 when we leave sh_coff_relax_section. */
2944 if (!bfd_malloc_and_get_section (abfd
, o
, &ocontents
))
2946 if (ocontents
!= NULL
)
2951 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2955 val
= bfd_get_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2956 val
+= isym
->st_value
;
2957 if (val
> addr
&& val
< toaddr
)
2958 bfd_put_32 (abfd
, val
- count
,
2959 ocontents
+ irelscan
->r_offset
);
2964 /* Adjust the local symbols defined in this section. */
2965 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2966 for (isym
= isymbuf
; isym
< isymend
; isym
++)
2968 if (isym
->st_shndx
== sec_shndx
2969 && isym
->st_value
> addr
2970 && isym
->st_value
< toaddr
)
2971 isym
->st_value
-= count
;
2974 /* Now adjust the global symbols defined in this section. */
2975 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2976 - symtab_hdr
->sh_info
);
2977 sym_hashes
= elf_sym_hashes (abfd
);
2978 end_hashes
= sym_hashes
+ symcount
;
2979 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2981 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
2982 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2983 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2984 && sym_hash
->root
.u
.def
.section
== sec
2985 && sym_hash
->root
.u
.def
.value
> addr
2986 && sym_hash
->root
.u
.def
.value
< toaddr
)
2988 sym_hash
->root
.u
.def
.value
-= count
;
2992 /* See if we can move the ALIGN reloc forward. We have adjusted
2993 r_offset for it already. */
2994 if (irelalign
!= NULL
)
2996 bfd_vma alignto
, alignaddr
;
2998 alignto
= BFD_ALIGN (toaddr
, 1 << irelalign
->r_addend
);
2999 alignaddr
= BFD_ALIGN (irelalign
->r_offset
,
3000 1 << irelalign
->r_addend
);
3001 if (alignto
!= alignaddr
)
3003 /* Tail recursion. */
3004 return sh_elf_relax_delete_bytes (abfd
, sec
, alignaddr
,
3005 (int) (alignto
- alignaddr
));
3012 /* Look for loads and stores which we can align to four byte
3013 boundaries. This is like sh_align_loads in coff-sh.c. */
3016 sh_elf_align_loads (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
,
3017 Elf_Internal_Rela
*internal_relocs
,
3018 bfd_byte
*contents ATTRIBUTE_UNUSED
,
3019 bfd_boolean
*pswapped
)
3021 Elf_Internal_Rela
*irel
, *irelend
;
3022 bfd_vma
*labels
= NULL
;
3023 bfd_vma
*label
, *label_end
;
3028 irelend
= internal_relocs
+ sec
->reloc_count
;
3030 /* Get all the addresses with labels on them. */
3031 amt
= sec
->reloc_count
;
3032 amt
*= sizeof (bfd_vma
);
3033 labels
= (bfd_vma
*) bfd_malloc (amt
);
3037 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3039 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_LABEL
)
3041 *label_end
= irel
->r_offset
;
3046 /* Note that the assembler currently always outputs relocs in
3047 address order. If that ever changes, this code will need to sort
3048 the label values and the relocs. */
3052 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3054 bfd_vma start
, stop
;
3056 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
)
3059 start
= irel
->r_offset
;
3061 for (irel
++; irel
< irelend
; irel
++)
3062 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_DATA
)
3065 stop
= irel
->r_offset
;
3069 if (! _bfd_sh_align_load_span (abfd
, sec
, contents
, sh_elf_swap_insns
,
3070 internal_relocs
, &label
,
3071 label_end
, start
, stop
, pswapped
))
3086 /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
3089 sh_elf_swap_insns (bfd
*abfd
, asection
*sec
, void *relocs
,
3090 bfd_byte
*contents
, bfd_vma addr
)
3092 Elf_Internal_Rela
*internal_relocs
= (Elf_Internal_Rela
*) relocs
;
3093 unsigned short i1
, i2
;
3094 Elf_Internal_Rela
*irel
, *irelend
;
3096 /* Swap the instructions themselves. */
3097 i1
= bfd_get_16 (abfd
, contents
+ addr
);
3098 i2
= bfd_get_16 (abfd
, contents
+ addr
+ 2);
3099 bfd_put_16 (abfd
, (bfd_vma
) i2
, contents
+ addr
);
3100 bfd_put_16 (abfd
, (bfd_vma
) i1
, contents
+ addr
+ 2);
3102 /* Adjust all reloc addresses. */
3103 irelend
= internal_relocs
+ sec
->reloc_count
;
3104 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3106 enum elf_sh_reloc_type type
;
3109 /* There are a few special types of relocs that we don't want to
3110 adjust. These relocs do not apply to the instruction itself,
3111 but are only associated with the address. */
3112 type
= (enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
);
3113 if (type
== R_SH_ALIGN
3114 || type
== R_SH_CODE
3115 || type
== R_SH_DATA
3116 || type
== R_SH_LABEL
)
3119 /* If an R_SH_USES reloc points to one of the addresses being
3120 swapped, we must adjust it. It would be incorrect to do this
3121 for a jump, though, since we want to execute both
3122 instructions after the jump. (We have avoided swapping
3123 around a label, so the jump will not wind up executing an
3124 instruction it shouldn't). */
3125 if (type
== R_SH_USES
)
3129 off
= irel
->r_offset
+ 4 + irel
->r_addend
;
3131 irel
->r_offset
+= 2;
3132 else if (off
== addr
+ 2)
3133 irel
->r_offset
-= 2;
3136 if (irel
->r_offset
== addr
)
3138 irel
->r_offset
+= 2;
3141 else if (irel
->r_offset
== addr
+ 2)
3143 irel
->r_offset
-= 2;
3152 unsigned short insn
, oinsn
;
3153 bfd_boolean overflow
;
3155 loc
= contents
+ irel
->r_offset
;
3164 insn
= bfd_get_16 (abfd
, loc
);
3167 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3169 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3173 insn
= bfd_get_16 (abfd
, loc
);
3176 if ((oinsn
& 0xf000) != (insn
& 0xf000))
3178 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3182 /* This reloc ignores the least significant 3 bits of
3183 the program counter before adding in the offset.
3184 This means that if ADDR is at an even address, the
3185 swap will not affect the offset. If ADDR is an at an
3186 odd address, then the instruction will be crossing a
3187 four byte boundary, and must be adjusted. */
3188 if ((addr
& 3) != 0)
3190 insn
= bfd_get_16 (abfd
, loc
);
3193 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3195 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3203 ((*_bfd_error_handler
)
3204 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
3205 abfd
, (unsigned long) irel
->r_offset
));
3206 bfd_set_error (bfd_error_bad_value
);
3214 #endif /* defined SH64_ELF */
3216 #ifdef INCLUDE_SHMEDIA
3218 /* The size in bytes of an entry in the procedure linkage table. */
3220 #define PLT_ENTRY_SIZE 64
3222 /* First entry in an absolute procedure linkage table look like this. */
3224 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3226 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */
3227 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
3228 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3229 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3230 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3231 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3232 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3233 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3234 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3235 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3236 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3237 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3238 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3239 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3240 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3241 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3244 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3246 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */
3247 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
3248 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3249 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3250 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3251 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3252 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3253 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3254 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3255 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3256 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3257 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3258 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3259 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3260 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3261 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3264 /* Sebsequent entries in an absolute procedure linkage table look like
3267 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3269 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */
3270 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
3271 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */
3272 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3273 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3274 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3275 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3276 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3277 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */
3278 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
3279 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3280 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3281 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3282 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3283 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3284 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3287 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3289 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */
3290 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3291 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */
3292 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3293 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3294 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3295 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3296 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3297 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */
3298 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
3299 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3300 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3301 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3302 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3303 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3304 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3307 /* Entries in a PIC procedure linkage table look like this. */
3309 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3311 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */
3312 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3313 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
3314 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3315 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3316 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3317 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3318 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3319 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */
3320 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
3321 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3322 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3323 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3324 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3325 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3326 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3329 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3331 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */
3332 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3333 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
3334 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3335 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3336 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3337 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3338 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3339 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */
3340 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
3341 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3342 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3343 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3344 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3345 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3346 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3349 static const bfd_byte
*elf_sh_plt0_entry
;
3350 static const bfd_byte
*elf_sh_plt_entry
;
3351 static const bfd_byte
*elf_sh_pic_plt_entry
;
3353 /* Return size of a PLT entry. */
3354 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3356 /* Return offset of the PLT0 address in an absolute PLT entry. */
3357 #define elf_sh_plt_plt0_offset(info) 32
3359 /* Return offset of the linker in PLT0 entry. */
3360 #define elf_sh_plt0_gotplt_offset(info) 0
3362 /* Return offset of the trampoline in PLT entry */
3363 #define elf_sh_plt_temp_offset(info) 33 /* Add one because it's SHmedia. */
3365 /* Return offset of the symbol in PLT entry. */
3366 #define elf_sh_plt_symbol_offset(info) 0
3368 /* Return offset of the relocation in PLT entry. */
3369 #define elf_sh_plt_reloc_offset(info) (info->shared ? 52 : 44)
3372 movi_shori_putval (bfd
*output_bfd
, unsigned long value
, char *addr
)
3374 bfd_put_32 (output_bfd
,
3375 bfd_get_32 (output_bfd
, addr
)
3376 | ((value
>> 6) & 0x3fffc00),
3378 bfd_put_32 (output_bfd
,
3379 bfd_get_32 (output_bfd
, addr
+ 4)
3380 | ((value
<< 10) & 0x3fffc00),
3385 /* The size in bytes of an entry in the procedure linkage table. */
3387 #define PLT_ENTRY_SIZE 28
3389 /* First entry in an absolute procedure linkage table look like this. */
3391 /* Note - this code has been "optimised" not to use r2. r2 is used by
3392 GCC to return the address of large structures, so it should not be
3393 corrupted here. This does mean however, that this PLT does not conform
3394 to the SH PIC ABI. That spec says that r0 contains the type of the PLT
3395 and r2 contains the GOT id. This version stores the GOT id in r0 and
3396 ignores the type. Loaders can easily detect this difference however,
3397 since the type will always be 0 or 8, and the GOT ids will always be
3398 greater than or equal to 12. */
3399 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3401 0xd0, 0x05, /* mov.l 2f,r0 */
3402 0x60, 0x02, /* mov.l @r0,r0 */
3403 0x2f, 0x06, /* mov.l r0,@-r15 */
3404 0xd0, 0x03, /* mov.l 1f,r0 */
3405 0x60, 0x02, /* mov.l @r0,r0 */
3406 0x40, 0x2b, /* jmp @r0 */
3407 0x60, 0xf6, /* mov.l @r15+,r0 */
3408 0x00, 0x09, /* nop */
3409 0x00, 0x09, /* nop */
3410 0x00, 0x09, /* nop */
3411 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3412 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3415 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3417 0x05, 0xd0, /* mov.l 2f,r0 */
3418 0x02, 0x60, /* mov.l @r0,r0 */
3419 0x06, 0x2f, /* mov.l r0,@-r15 */
3420 0x03, 0xd0, /* mov.l 1f,r0 */
3421 0x02, 0x60, /* mov.l @r0,r0 */
3422 0x2b, 0x40, /* jmp @r0 */
3423 0xf6, 0x60, /* mov.l @r15+,r0 */
3424 0x09, 0x00, /* nop */
3425 0x09, 0x00, /* nop */
3426 0x09, 0x00, /* nop */
3427 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3428 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3431 /* Sebsequent entries in an absolute procedure linkage table look like
3434 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3436 0xd0, 0x04, /* mov.l 1f,r0 */
3437 0x60, 0x02, /* mov.l @r0,r0 */
3438 0xd1, 0x02, /* mov.l 0f,r1 */
3439 0x40, 0x2b, /* jmp @r0 */
3440 0x60, 0x13, /* mov r1,r0 */
3441 0xd1, 0x03, /* mov.l 2f,r1 */
3442 0x40, 0x2b, /* jmp @r0 */
3443 0x00, 0x09, /* nop */
3444 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3445 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3446 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3449 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3451 0x04, 0xd0, /* mov.l 1f,r0 */
3452 0x02, 0x60, /* mov.l @r0,r0 */
3453 0x02, 0xd1, /* mov.l 0f,r1 */
3454 0x2b, 0x40, /* jmp @r0 */
3455 0x13, 0x60, /* mov r1,r0 */
3456 0x03, 0xd1, /* mov.l 2f,r1 */
3457 0x2b, 0x40, /* jmp @r0 */
3458 0x09, 0x00, /* nop */
3459 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3460 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3461 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3464 /* Entries in a PIC procedure linkage table look like this. */
3466 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3468 0xd0, 0x04, /* mov.l 1f,r0 */
3469 0x00, 0xce, /* mov.l @(r0,r12),r0 */
3470 0x40, 0x2b, /* jmp @r0 */
3471 0x00, 0x09, /* nop */
3472 0x50, 0xc2, /* mov.l @(8,r12),r0 */
3473 0xd1, 0x03, /* mov.l 2f,r1 */
3474 0x40, 0x2b, /* jmp @r0 */
3475 0x50, 0xc1, /* mov.l @(4,r12),r0 */
3476 0x00, 0x09, /* nop */
3477 0x00, 0x09, /* nop */
3478 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3479 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3482 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3484 0x04, 0xd0, /* mov.l 1f,r0 */
3485 0xce, 0x00, /* mov.l @(r0,r12),r0 */
3486 0x2b, 0x40, /* jmp @r0 */
3487 0x09, 0x00, /* nop */
3488 0xc2, 0x50, /* mov.l @(8,r12),r0 */
3489 0x03, 0xd1, /* mov.l 2f,r1 */
3490 0x2b, 0x40, /* jmp @r0 */
3491 0xc1, 0x50, /* mov.l @(4,r12),r0 */
3492 0x09, 0x00, /* nop */
3493 0x09, 0x00, /* nop */
3494 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3495 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3498 static const bfd_byte
*elf_sh_plt0_entry
;
3499 static const bfd_byte
*elf_sh_plt_entry
;
3500 static const bfd_byte
*elf_sh_pic_plt_entry
;
3502 /* Return size of a PLT entry. */
3503 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3505 /* Return offset of the PLT0 address in an absolute PLT entry. */
3506 #define elf_sh_plt_plt0_offset(info) 16
3508 /* Return offset of the linker in PLT0 entry. */
3509 #define elf_sh_plt0_linker_offset(info) 20
3511 /* Return offset of the GOT id in PLT0 entry. */
3512 #define elf_sh_plt0_gotid_offset(info) 24
3514 /* Return offset of the temporary in PLT entry */
3515 #define elf_sh_plt_temp_offset(info) 8
3517 /* Return offset of the symbol in PLT entry. */
3518 #define elf_sh_plt_symbol_offset(info) 20
3520 /* Return offset of the relocation in PLT entry. */
3521 #define elf_sh_plt_reloc_offset(info) 24
3524 /* The sh linker needs to keep track of the number of relocs that it
3525 decides to copy as dynamic relocs in check_relocs for each symbol.
3526 This is so that it can later discard them if they are found to be
3527 unnecessary. We store the information in a field extending the
3528 regular ELF linker hash table. */
3530 struct elf_sh_dyn_relocs
3532 struct elf_sh_dyn_relocs
*next
;
3534 /* The input section of the reloc. */
3537 /* Total number of relocs copied for the input section. */
3538 bfd_size_type count
;
3540 /* Number of pc-relative relocs copied for the input section. */
3541 bfd_size_type pc_count
;
3544 /* sh ELF linker hash entry. */
3546 struct elf_sh_link_hash_entry
3548 struct elf_link_hash_entry root
;
3550 #ifdef INCLUDE_SHMEDIA
3553 bfd_signed_vma refcount
;
3558 /* Track dynamic relocs copied for this symbol. */
3559 struct elf_sh_dyn_relocs
*dyn_relocs
;
3561 bfd_signed_vma gotplt_refcount
;
3564 GOT_UNKNOWN
= 0, GOT_NORMAL
, GOT_TLS_GD
, GOT_TLS_IE
3568 #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
3570 struct sh_elf_obj_tdata
3572 struct elf_obj_tdata root
;
3574 /* tls_type for each local got entry. */
3575 char *local_got_tls_type
;
3578 #define sh_elf_tdata(abfd) \
3579 ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
3581 #define sh_elf_local_got_tls_type(abfd) \
3582 (sh_elf_tdata (abfd)->local_got_tls_type)
3584 /* Override the generic function because we need to store sh_elf_obj_tdata
3585 as the specific tdata. */
3588 sh_elf_mkobject (bfd
*abfd
)
3590 bfd_size_type amt
= sizeof (struct sh_elf_obj_tdata
);
3591 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
3592 if (abfd
->tdata
.any
== NULL
)
3597 /* sh ELF linker hash table. */
3599 struct elf_sh_link_hash_table
3601 struct elf_link_hash_table root
;
3603 /* Short-cuts to get to dynamic linker sections. */
3612 /* Small local sym to section mapping cache. */
3613 struct sym_sec_cache sym_sec
;
3615 /* A counter or offset to track a TLS got entry. */
3618 bfd_signed_vma refcount
;
3623 /* Traverse an sh ELF linker hash table. */
3625 #define sh_elf_link_hash_traverse(table, func, info) \
3626 (elf_link_hash_traverse \
3628 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
3631 /* Get the sh ELF linker hash table from a link_info structure. */
3633 #define sh_elf_hash_table(p) \
3634 ((struct elf_sh_link_hash_table *) ((p)->hash))
3636 /* Create an entry in an sh ELF linker hash table. */
3638 static struct bfd_hash_entry
*
3639 sh_elf_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3640 struct bfd_hash_table
*table
,
3643 struct elf_sh_link_hash_entry
*ret
=
3644 (struct elf_sh_link_hash_entry
*) entry
;
3646 /* Allocate the structure if it has not already been allocated by a
3648 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3649 ret
= ((struct elf_sh_link_hash_entry
*)
3650 bfd_hash_allocate (table
,
3651 sizeof (struct elf_sh_link_hash_entry
)));
3652 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3653 return (struct bfd_hash_entry
*) ret
;
3655 /* Call the allocation method of the superclass. */
3656 ret
= ((struct elf_sh_link_hash_entry
*)
3657 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3659 if (ret
!= (struct elf_sh_link_hash_entry
*) NULL
)
3661 ret
->dyn_relocs
= NULL
;
3662 ret
->gotplt_refcount
= 0;
3663 #ifdef INCLUDE_SHMEDIA
3664 ret
->datalabel_got
.refcount
= ret
->root
.got
.refcount
;
3666 ret
->tls_type
= GOT_UNKNOWN
;
3669 return (struct bfd_hash_entry
*) ret
;
3672 /* Create an sh ELF linker hash table. */
3674 static struct bfd_link_hash_table
*
3675 sh_elf_link_hash_table_create (bfd
*abfd
)
3677 struct elf_sh_link_hash_table
*ret
;
3678 bfd_size_type amt
= sizeof (struct elf_sh_link_hash_table
);
3680 ret
= (struct elf_sh_link_hash_table
*) bfd_malloc (amt
);
3681 if (ret
== (struct elf_sh_link_hash_table
*) NULL
)
3684 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
3685 sh_elf_link_hash_newfunc
))
3692 ret
->sgotplt
= NULL
;
3693 ret
->srelgot
= NULL
;
3695 ret
->srelplt
= NULL
;
3696 ret
->sdynbss
= NULL
;
3697 ret
->srelbss
= NULL
;
3698 ret
->sym_sec
.abfd
= NULL
;
3699 ret
->tls_ldm_got
.refcount
= 0;
3701 return &ret
->root
.root
;
3704 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3705 shortcuts to them in our hash table. */
3708 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
3710 struct elf_sh_link_hash_table
*htab
;
3712 if (! _bfd_elf_create_got_section (dynobj
, info
))
3715 htab
= sh_elf_hash_table (info
);
3716 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
3717 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
3718 if (! htab
->sgot
|| ! htab
->sgotplt
)
3721 htab
->srelgot
= bfd_make_section (dynobj
, ".rela.got");
3722 if (htab
->srelgot
== NULL
3723 || ! bfd_set_section_flags (dynobj
, htab
->srelgot
,
3728 | SEC_LINKER_CREATED
3730 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
3735 /* Create dynamic sections when linking against a dynamic object. */
3738 sh_elf_create_dynamic_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3740 struct elf_sh_link_hash_table
*htab
;
3741 flagword flags
, pltflags
;
3742 register asection
*s
;
3743 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
3746 switch (bed
->s
->arch_size
)
3757 bfd_set_error (bfd_error_bad_value
);
3761 htab
= sh_elf_hash_table (info
);
3762 if (htab
->root
.dynamic_sections_created
)
3765 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3766 .rel[a].bss sections. */
3768 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3769 | SEC_LINKER_CREATED
);
3772 pltflags
|= SEC_CODE
;
3773 if (bed
->plt_not_loaded
)
3774 pltflags
&= ~ (SEC_LOAD
| SEC_HAS_CONTENTS
);
3775 if (bed
->plt_readonly
)
3776 pltflags
|= SEC_READONLY
;
3778 s
= bfd_make_section (abfd
, ".plt");
3781 || ! bfd_set_section_flags (abfd
, s
, pltflags
)
3782 || ! bfd_set_section_alignment (abfd
, s
, bed
->plt_alignment
))
3785 if (bed
->want_plt_sym
)
3787 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3789 struct elf_link_hash_entry
*h
;
3790 struct bfd_link_hash_entry
*bh
= NULL
;
3792 if (! (_bfd_generic_link_add_one_symbol
3793 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
3794 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
3795 get_elf_backend_data (abfd
)->collect
, &bh
)))
3798 h
= (struct elf_link_hash_entry
*) bh
;
3800 h
->type
= STT_OBJECT
;
3803 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
3807 s
= bfd_make_section (abfd
,
3808 bed
->default_use_rela_p
? ".rela.plt" : ".rel.plt");
3811 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3812 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3815 if (htab
->sgot
== NULL
3816 && !create_got_section (abfd
, info
))
3820 const char *secname
;
3825 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3827 secflags
= bfd_get_section_flags (abfd
, sec
);
3828 if ((secflags
& (SEC_DATA
| SEC_LINKER_CREATED
))
3829 || ((secflags
& SEC_HAS_CONTENTS
) != SEC_HAS_CONTENTS
))
3831 secname
= bfd_get_section_name (abfd
, sec
);
3832 relname
= (char *) bfd_malloc ((bfd_size_type
) strlen (secname
) + 6);
3833 strcpy (relname
, ".rela");
3834 strcat (relname
, secname
);
3835 if (bfd_get_section_by_name (abfd
, secname
))
3837 s
= bfd_make_section (abfd
, relname
);
3839 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3840 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3845 if (bed
->want_dynbss
)
3847 /* The .dynbss section is a place to put symbols which are defined
3848 by dynamic objects, are referenced by regular objects, and are
3849 not functions. We must allocate space for them in the process
3850 image and use a R_*_COPY reloc to tell the dynamic linker to
3851 initialize them at run time. The linker script puts the .dynbss
3852 section into the .bss section of the final image. */
3853 s
= bfd_make_section (abfd
, ".dynbss");
3856 || ! bfd_set_section_flags (abfd
, s
, SEC_ALLOC
))
3859 /* The .rel[a].bss section holds copy relocs. This section is not
3860 normally needed. We need to create it here, though, so that the
3861 linker will map it to an output section. We can't just create it
3862 only if we need it, because we will not know whether we need it
3863 until we have seen all the input files, and the first time the
3864 main linker code calls BFD after examining all the input files
3865 (size_dynamic_sections) the input sections have already been
3866 mapped to the output sections. If the section turns out not to
3867 be needed, we can discard it later. We will never need this
3868 section when generating a shared object, since they do not use
3872 s
= bfd_make_section (abfd
,
3873 (bed
->default_use_rela_p
3874 ? ".rela.bss" : ".rel.bss"));
3877 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3878 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3886 /* Adjust a symbol defined by a dynamic object and referenced by a
3887 regular object. The current definition is in some section of the
3888 dynamic object, but we're not including those sections. We have to
3889 change the definition to something the rest of the link can
3893 sh_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
3894 struct elf_link_hash_entry
*h
)
3896 struct elf_sh_link_hash_table
*htab
;
3897 struct elf_sh_link_hash_entry
*eh
;
3898 struct elf_sh_dyn_relocs
*p
;
3900 unsigned int power_of_two
;
3902 htab
= sh_elf_hash_table (info
);
3904 /* Make sure we know what is going on here. */
3905 BFD_ASSERT (htab
->root
.dynobj
!= NULL
3907 || h
->u
.weakdef
!= NULL
3910 && !h
->def_regular
)));
3912 /* If this is a function, put it in the procedure linkage table. We
3913 will fill in the contents of the procedure linkage table later,
3914 when we know the address of the .got section. */
3915 if (h
->type
== STT_FUNC
3918 if (h
->plt
.refcount
<= 0
3919 || SYMBOL_CALLS_LOCAL (info
, h
)
3920 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
3921 && h
->root
.type
== bfd_link_hash_undefweak
))
3923 /* This case can occur if we saw a PLT reloc in an input
3924 file, but the symbol was never referred to by a dynamic
3925 object. In such a case, we don't actually need to build
3926 a procedure linkage table, and we can just do a REL32
3928 h
->plt
.offset
= (bfd_vma
) -1;
3935 h
->plt
.offset
= (bfd_vma
) -1;
3937 /* If this is a weak symbol, and there is a real definition, the
3938 processor independent code will have arranged for us to see the
3939 real definition first, and we can just use the same value. */
3940 if (h
->u
.weakdef
!= NULL
)
3942 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
3943 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
3944 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
3945 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
3946 if (info
->nocopyreloc
)
3947 h
->non_got_ref
= h
->u
.weakdef
->non_got_ref
;
3951 /* This is a reference to a symbol defined by a dynamic object which
3952 is not a function. */
3954 /* If we are creating a shared library, we must presume that the
3955 only references to the symbol are via the global offset table.
3956 For such cases we need not do anything here; the relocations will
3957 be handled correctly by relocate_section. */
3961 /* If there are no references to this symbol that do not use the
3962 GOT, we don't need to generate a copy reloc. */
3963 if (!h
->non_got_ref
)
3966 /* If -z nocopyreloc was given, we won't generate them either. */
3967 if (info
->nocopyreloc
)
3973 eh
= (struct elf_sh_link_hash_entry
*) h
;
3974 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3976 s
= p
->sec
->output_section
;
3977 if (s
!= NULL
&& (s
->flags
& (SEC_READONLY
| SEC_HAS_CONTENTS
)) != 0)
3981 /* If we didn't find any dynamic relocs in sections which needs the
3982 copy reloc, then we'll be keeping the dynamic relocs and avoiding
3990 /* We must allocate the symbol in our .dynbss section, which will
3991 become part of the .bss section of the executable. There will be
3992 an entry for this symbol in the .dynsym section. The dynamic
3993 object will contain position independent code, so all references
3994 from the dynamic object to this symbol will go through the global
3995 offset table. The dynamic linker will use the .dynsym entry to
3996 determine the address it must put in the global offset table, so
3997 both the dynamic object and the regular object will refer to the
3998 same memory location for the variable. */
4001 BFD_ASSERT (s
!= NULL
);
4003 /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
4004 copy the initial value out of the dynamic object and into the
4005 runtime process image. We need to remember the offset into the
4006 .rela.bss section we are going to use. */
4007 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
4011 srel
= htab
->srelbss
;
4012 BFD_ASSERT (srel
!= NULL
);
4013 srel
->size
+= sizeof (Elf32_External_Rela
);
4017 /* We need to figure out the alignment required for this symbol. I
4018 have no idea how ELF linkers handle this. */
4019 power_of_two
= bfd_log2 (h
->size
);
4020 if (power_of_two
> 3)
4023 /* Apply the required alignment. */
4024 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
4025 if (power_of_two
> bfd_get_section_alignment (htab
->root
.dynobj
, s
))
4027 if (! bfd_set_section_alignment (htab
->root
.dynobj
, s
, power_of_two
))
4031 /* Define the symbol as being at this point in the section. */
4032 h
->root
.u
.def
.section
= s
;
4033 h
->root
.u
.def
.value
= s
->size
;
4035 /* Increment the section size to make room for the symbol. */
4041 /* Allocate space in .plt, .got and associated reloc sections for
4045 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
4047 struct bfd_link_info
*info
;
4048 struct elf_sh_link_hash_table
*htab
;
4049 struct elf_sh_link_hash_entry
*eh
;
4050 struct elf_sh_dyn_relocs
*p
;
4052 if (h
->root
.type
== bfd_link_hash_indirect
)
4055 if (h
->root
.type
== bfd_link_hash_warning
)
4056 /* When warning symbols are created, they **replace** the "real"
4057 entry in the hash table, thus we never get to see the real
4058 symbol in a hash traversal. So look at it now. */
4059 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4061 info
= (struct bfd_link_info
*) inf
;
4062 htab
= sh_elf_hash_table (info
);
4064 eh
= (struct elf_sh_link_hash_entry
*) h
;
4065 if ((h
->got
.refcount
> 0
4067 && eh
->gotplt_refcount
> 0)
4069 /* The symbol has been forced local, or we have some direct got refs,
4070 so treat all the gotplt refs as got refs. */
4071 h
->got
.refcount
+= eh
->gotplt_refcount
;
4072 if (h
->plt
.refcount
>= eh
->gotplt_refcount
)
4073 h
->plt
.refcount
-= eh
->gotplt_refcount
;
4076 if (htab
->root
.dynamic_sections_created
4077 && h
->plt
.refcount
> 0
4078 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4079 || h
->root
.type
!= bfd_link_hash_undefweak
))
4081 /* Make sure this symbol is output as a dynamic symbol.
4082 Undefined weak syms won't yet be marked as dynamic. */
4083 if (h
->dynindx
== -1
4084 && !h
->forced_local
)
4086 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4091 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
4093 asection
*s
= htab
->splt
;
4095 /* If this is the first .plt entry, make room for the special
4098 s
->size
+= PLT_ENTRY_SIZE
;
4100 h
->plt
.offset
= s
->size
;
4102 /* If this symbol is not defined in a regular file, and we are
4103 not generating a shared library, then set the symbol to this
4104 location in the .plt. This is required to make function
4105 pointers compare as equal between the normal executable and
4106 the shared library. */
4110 h
->root
.u
.def
.section
= s
;
4111 h
->root
.u
.def
.value
= h
->plt
.offset
;
4114 /* Make room for this entry. */
4115 s
->size
+= PLT_ENTRY_SIZE
;
4117 /* We also need to make an entry in the .got.plt section, which
4118 will be placed in the .got section by the linker script. */
4119 htab
->sgotplt
->size
+= 4;
4121 /* We also need to make an entry in the .rel.plt section. */
4122 htab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
4126 h
->plt
.offset
= (bfd_vma
) -1;
4132 h
->plt
.offset
= (bfd_vma
) -1;
4136 if (h
->got
.refcount
> 0)
4140 int tls_type
= sh_elf_hash_entry (h
)->tls_type
;
4142 /* Make sure this symbol is output as a dynamic symbol.
4143 Undefined weak syms won't yet be marked as dynamic. */
4144 if (h
->dynindx
== -1
4145 && !h
->forced_local
)
4147 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4152 h
->got
.offset
= s
->size
;
4154 /* R_SH_TLS_GD needs 2 consecutive GOT slots. */
4155 if (tls_type
== GOT_TLS_GD
)
4157 dyn
= htab
->root
.dynamic_sections_created
;
4158 /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
4159 R_SH_TLS_GD needs one if local symbol and two if global. */
4160 if ((tls_type
== GOT_TLS_GD
&& h
->dynindx
== -1)
4161 || (tls_type
== GOT_TLS_IE
&& dyn
))
4162 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4163 else if (tls_type
== GOT_TLS_GD
)
4164 htab
->srelgot
->size
+= 2 * sizeof (Elf32_External_Rela
);
4165 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4166 || h
->root
.type
!= bfd_link_hash_undefweak
)
4168 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
4169 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4172 h
->got
.offset
= (bfd_vma
) -1;
4174 #ifdef INCLUDE_SHMEDIA
4175 if (eh
->datalabel_got
.refcount
> 0)
4180 /* Make sure this symbol is output as a dynamic symbol.
4181 Undefined weak syms won't yet be marked as dynamic. */
4182 if (h
->dynindx
== -1
4183 && !h
->forced_local
)
4185 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4190 eh
->datalabel_got
.offset
= s
->size
;
4192 dyn
= htab
->root
.dynamic_sections_created
;
4193 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
))
4194 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4197 eh
->datalabel_got
.offset
= (bfd_vma
) -1;
4200 if (eh
->dyn_relocs
== NULL
)
4203 /* In the shared -Bsymbolic case, discard space allocated for
4204 dynamic pc-relative relocs against symbols which turn out to be
4205 defined in regular objects. For the normal shared case, discard
4206 space for pc-relative relocs that have become local due to symbol
4207 visibility changes. */
4211 if (SYMBOL_CALLS_LOCAL (info
, h
))
4213 struct elf_sh_dyn_relocs
**pp
;
4215 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
4217 p
->count
-= p
->pc_count
;
4226 /* Also discard relocs on undefined weak syms with non-default
4228 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
4229 && h
->root
.type
== bfd_link_hash_undefweak
)
4230 eh
->dyn_relocs
= NULL
;
4234 /* For the non-shared case, discard space for relocs against
4235 symbols which turn out to need copy relocs or are not
4241 || (htab
->root
.dynamic_sections_created
4242 && (h
->root
.type
== bfd_link_hash_undefweak
4243 || h
->root
.type
== bfd_link_hash_undefined
))))
4245 /* Make sure this symbol is output as a dynamic symbol.
4246 Undefined weak syms won't yet be marked as dynamic. */
4247 if (h
->dynindx
== -1
4248 && !h
->forced_local
)
4250 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4254 /* If that succeeded, we know we'll be keeping all the
4256 if (h
->dynindx
!= -1)
4260 eh
->dyn_relocs
= NULL
;
4265 /* Finally, allocate space. */
4266 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4268 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
4269 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4275 /* Find any dynamic relocs that apply to read-only sections. */
4278 readonly_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
4280 struct elf_sh_link_hash_entry
*eh
;
4281 struct elf_sh_dyn_relocs
*p
;
4283 if (h
->root
.type
== bfd_link_hash_warning
)
4284 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4286 eh
= (struct elf_sh_link_hash_entry
*) h
;
4287 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4289 asection
*s
= p
->sec
->output_section
;
4291 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
4293 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
4295 info
->flags
|= DF_TEXTREL
;
4297 /* Not an error, just cut short the traversal. */
4304 /* Set the sizes of the dynamic sections. */
4307 sh_elf_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
4308 struct bfd_link_info
*info
)
4310 struct elf_sh_link_hash_table
*htab
;
4316 htab
= sh_elf_hash_table (info
);
4317 dynobj
= htab
->root
.dynobj
;
4318 BFD_ASSERT (dynobj
!= NULL
);
4320 if (htab
->root
.dynamic_sections_created
)
4322 /* Set the contents of the .interp section to the interpreter. */
4323 if (info
->executable
)
4325 s
= bfd_get_section_by_name (dynobj
, ".interp");
4326 BFD_ASSERT (s
!= NULL
);
4327 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
4328 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
4332 /* Set up .got offsets for local syms, and space for local dynamic
4334 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4336 bfd_signed_vma
*local_got
;
4337 bfd_signed_vma
*end_local_got
;
4338 char *local_tls_type
;
4339 bfd_size_type locsymcount
;
4340 Elf_Internal_Shdr
*symtab_hdr
;
4343 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
4346 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
4348 struct elf_sh_dyn_relocs
*p
;
4350 for (p
= ((struct elf_sh_dyn_relocs
*)
4351 elf_section_data (s
)->local_dynrel
);
4355 if (! bfd_is_abs_section (p
->sec
)
4356 && bfd_is_abs_section (p
->sec
->output_section
))
4358 /* Input section has been discarded, either because
4359 it is a copy of a linkonce section or due to
4360 linker script /DISCARD/, so we'll be discarding
4363 else if (p
->count
!= 0)
4365 srel
= elf_section_data (p
->sec
)->sreloc
;
4366 srel
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4367 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
4368 info
->flags
|= DF_TEXTREL
;
4373 local_got
= elf_local_got_refcounts (ibfd
);
4377 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4378 locsymcount
= symtab_hdr
->sh_info
;
4379 #ifdef INCLUDE_SHMEDIA
4380 /* Count datalabel local GOT. */
4383 end_local_got
= local_got
+ locsymcount
;
4384 local_tls_type
= sh_elf_local_got_tls_type (ibfd
);
4386 srel
= htab
->srelgot
;
4387 for (; local_got
< end_local_got
; ++local_got
)
4391 *local_got
= s
->size
;
4393 if (*local_tls_type
== GOT_TLS_GD
)
4396 srel
->size
+= sizeof (Elf32_External_Rela
);
4399 *local_got
= (bfd_vma
) -1;
4404 if (htab
->tls_ldm_got
.refcount
> 0)
4406 /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
4408 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
4409 htab
->sgot
->size
+= 8;
4410 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4413 htab
->tls_ldm_got
.offset
= -1;
4415 /* Allocate global sym .plt and .got entries, and space for global
4416 sym dynamic relocs. */
4417 elf_link_hash_traverse (&htab
->root
, allocate_dynrelocs
, info
);
4419 /* We now have determined the sizes of the various dynamic sections.
4420 Allocate memory for them. */
4422 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4424 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
4429 || s
== htab
->sgotplt
)
4431 /* Strip this section if we don't need it; see the
4434 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
4436 if (s
->size
!= 0 && s
!= htab
->srelplt
)
4439 /* We use the reloc_count field as a counter if we need
4440 to copy relocs into the output file. */
4445 /* It's not one of our sections, so don't allocate space. */
4451 /* If we don't need this section, strip it from the
4452 output file. This is mostly to handle .rela.bss and
4453 .rela.plt. We must create both sections in
4454 create_dynamic_sections, because they must be created
4455 before the linker maps input sections to output
4456 sections. The linker does that before
4457 adjust_dynamic_symbol is called, and it is that
4458 function which decides whether anything needs to go
4459 into these sections. */
4461 _bfd_strip_section_from_output (info
, s
);
4465 /* Allocate memory for the section contents. We use bfd_zalloc
4466 here in case unused entries are not reclaimed before the
4467 section's contents are written out. This should not happen,
4468 but this way if it does, we get a R_SH_NONE reloc instead
4470 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
4471 if (s
->contents
== NULL
)
4475 if (htab
->root
.dynamic_sections_created
)
4477 /* Add some entries to the .dynamic section. We fill in the
4478 values later, in sh_elf_finish_dynamic_sections, but we
4479 must add the entries now so that we get the correct size for
4480 the .dynamic section. The DT_DEBUG entry is filled in by the
4481 dynamic linker and used by the debugger. */
4482 #define add_dynamic_entry(TAG, VAL) \
4483 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4485 if (info
->executable
)
4487 if (! add_dynamic_entry (DT_DEBUG
, 0))
4491 if (htab
->splt
->size
!= 0)
4493 if (! add_dynamic_entry (DT_PLTGOT
, 0)
4494 || ! add_dynamic_entry (DT_PLTRELSZ
, 0)
4495 || ! add_dynamic_entry (DT_PLTREL
, DT_RELA
)
4496 || ! add_dynamic_entry (DT_JMPREL
, 0))
4502 if (! add_dynamic_entry (DT_RELA
, 0)
4503 || ! add_dynamic_entry (DT_RELASZ
, 0)
4504 || ! add_dynamic_entry (DT_RELAENT
,
4505 sizeof (Elf32_External_Rela
)))
4508 /* If any dynamic relocs apply to a read-only section,
4509 then we need a DT_TEXTREL entry. */
4510 if ((info
->flags
& DF_TEXTREL
) == 0)
4511 elf_link_hash_traverse (&htab
->root
, readonly_dynrelocs
, info
);
4513 if ((info
->flags
& DF_TEXTREL
) != 0)
4515 if (! add_dynamic_entry (DT_TEXTREL
, 0))
4520 #undef add_dynamic_entry
4525 /* Relocate an SH ELF section. */
4528 sh_elf_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
4529 bfd
*input_bfd
, asection
*input_section
,
4530 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
4531 Elf_Internal_Sym
*local_syms
,
4532 asection
**local_sections
)
4534 struct elf_sh_link_hash_table
*htab
;
4535 Elf_Internal_Shdr
*symtab_hdr
;
4536 struct elf_link_hash_entry
**sym_hashes
;
4537 Elf_Internal_Rela
*rel
, *relend
;
4539 bfd_vma
*local_got_offsets
;
4546 htab
= sh_elf_hash_table (info
);
4547 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4548 sym_hashes
= elf_sym_hashes (input_bfd
);
4549 dynobj
= htab
->root
.dynobj
;
4550 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4553 sgotplt
= htab
->sgotplt
;
4559 relend
= relocs
+ input_section
->reloc_count
;
4560 for (; rel
< relend
; rel
++)
4563 reloc_howto_type
*howto
;
4564 unsigned long r_symndx
;
4565 Elf_Internal_Sym
*sym
;
4567 struct elf_link_hash_entry
*h
;
4569 bfd_vma addend
= (bfd_vma
) 0;
4570 bfd_reloc_status_type r
;
4571 int seen_stt_datalabel
= 0;
4575 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4577 r_type
= ELF32_R_TYPE (rel
->r_info
);
4579 /* Many of the relocs are only used for relaxing, and are
4580 handled entirely by the relaxation code. */
4581 if (r_type
>= (int) R_SH_GNU_VTINHERIT
4582 && r_type
<= (int) R_SH_LABEL
)
4584 if (r_type
== (int) R_SH_NONE
)
4588 || r_type
>= R_SH_max
4589 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC
4590 && r_type
<= (int) R_SH_LAST_INVALID_RELOC
)
4591 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_3
4592 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_3
)
4593 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_4
4594 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_4
)
4595 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_5
4596 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_5
)
4597 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC_2
4598 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_2
))
4600 bfd_set_error (bfd_error_bad_value
);
4604 howto
= sh_elf_howto_table
+ r_type
;
4606 /* For relocs that aren't partial_inplace, we get the addend from
4608 if (! howto
->partial_inplace
)
4609 addend
= rel
->r_addend
;
4614 if (r_symndx
< symtab_hdr
->sh_info
)
4616 sym
= local_syms
+ r_symndx
;
4617 sec
= local_sections
[r_symndx
];
4618 relocation
= (sec
->output_section
->vma
4619 + sec
->output_offset
4621 /* A local symbol never has STO_SH5_ISA32, so we don't need
4622 datalabel processing here. Make sure this does not change
4624 if ((sym
->st_other
& STO_SH5_ISA32
) != 0)
4625 ((*info
->callbacks
->reloc_dangerous
)
4627 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
4628 input_bfd
, input_section
, rel
->r_offset
));
4629 if (info
->relocatable
)
4631 /* This is a relocatable link. We don't have to change
4632 anything, unless the reloc is against a section symbol,
4633 in which case we have to adjust according to where the
4634 section symbol winds up in the output section. */
4635 sym
= local_syms
+ r_symndx
;
4636 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4638 if (! howto
->partial_inplace
)
4640 /* For relocations with the addend in the
4641 relocation, we need just to update the addend.
4642 All real relocs are of type partial_inplace; this
4643 code is mostly for completeness. */
4644 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
4649 /* Relocs of type partial_inplace need to pick up the
4650 contents in the contents and add the offset resulting
4651 from the changed location of the section symbol.
4652 Using _bfd_final_link_relocate (e.g. goto
4653 final_link_relocate) here would be wrong, because
4654 relocations marked pc_relative would get the current
4655 location subtracted, and we must only do that at the
4657 r
= _bfd_relocate_contents (howto
, input_bfd
,
4660 contents
+ rel
->r_offset
);
4661 goto relocation_done
;
4666 else if (! howto
->partial_inplace
)
4668 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
4669 addend
= rel
->r_addend
;
4671 else if ((sec
->flags
& SEC_MERGE
)
4672 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4676 if (howto
->rightshift
|| howto
->src_mask
!= 0xffffffff)
4678 (*_bfd_error_handler
)
4679 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4680 input_bfd
, input_section
,
4681 (long) rel
->r_offset
, howto
->name
);
4685 addend
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
4688 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
4690 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
4691 bfd_put_32 (input_bfd
, addend
, contents
+ rel
->r_offset
);
4697 /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro. */
4699 /* Section symbol are never (?) placed in the hash table, so
4700 we can just ignore hash relocations when creating a
4701 relocatable object file. */
4702 if (info
->relocatable
)
4705 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4706 while (h
->root
.type
== bfd_link_hash_indirect
4707 || h
->root
.type
== bfd_link_hash_warning
)
4709 #ifdef INCLUDE_SHMEDIA
4710 /* If the reference passes a symbol marked with
4711 STT_DATALABEL, then any STO_SH5_ISA32 on the final value
4713 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
4715 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4717 if (h
->root
.type
== bfd_link_hash_defined
4718 || h
->root
.type
== bfd_link_hash_defweak
)
4722 dyn
= htab
->root
.dynamic_sections_created
;
4723 sec
= h
->root
.u
.def
.section
;
4724 /* In these cases, we don't need the relocation value.
4725 We check specially because in some obscure cases
4726 sec->output_section will be NULL. */
4727 if (r_type
== R_SH_GOTPC
4728 || r_type
== R_SH_GOTPC_LOW16
4729 || r_type
== R_SH_GOTPC_MEDLOW16
4730 || r_type
== R_SH_GOTPC_MEDHI16
4731 || r_type
== R_SH_GOTPC_HI16
4732 || ((r_type
== R_SH_PLT32
4733 || r_type
== R_SH_PLT_LOW16
4734 || r_type
== R_SH_PLT_MEDLOW16
4735 || r_type
== R_SH_PLT_MEDHI16
4736 || r_type
== R_SH_PLT_HI16
)
4737 && h
->plt
.offset
!= (bfd_vma
) -1)
4738 || ((r_type
== R_SH_GOT32
4739 || r_type
== R_SH_GOT_LOW16
4740 || r_type
== R_SH_GOT_MEDLOW16
4741 || r_type
== R_SH_GOT_MEDHI16
4742 || r_type
== R_SH_GOT_HI16
)
4743 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4745 || (! info
->symbolic
&& h
->dynindx
!= -1)
4746 || !h
->def_regular
))
4747 /* The cases above are those in which relocation is
4748 overwritten in the switch block below. The cases
4749 below are those in which we must defer relocation
4750 to run-time, because we can't resolve absolute
4751 addresses when creating a shared library. */
4753 && ((! info
->symbolic
&& h
->dynindx
!= -1)
4755 && ((r_type
== R_SH_DIR32
4756 && !h
->forced_local
)
4757 || r_type
== R_SH_REL32
)
4758 && ((input_section
->flags
& SEC_ALLOC
) != 0
4759 /* DWARF will emit R_SH_DIR32 relocations in its
4760 sections against symbols defined externally
4761 in shared libraries. We can't do anything
4763 || ((input_section
->flags
& SEC_DEBUGGING
) != 0
4764 && h
->def_dynamic
)))
4765 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4766 sections because such sections are not SEC_ALLOC and
4767 thus ld.so will not process them. */
4768 || (sec
->output_section
== NULL
4769 && ((input_section
->flags
& SEC_DEBUGGING
) != 0
4771 || (sec
->output_section
== NULL
4772 && (sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_IE
4773 || sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_GD
)))
4775 else if (sec
->output_section
== NULL
)
4777 (*_bfd_error_handler
)
4778 (_("%B(%A): unresolvable relocation against symbol `%s'"),
4779 input_bfd
, input_section
, h
->root
.root
.string
);
4783 relocation
= ((h
->root
.u
.def
.value
4784 + sec
->output_section
->vma
4785 + sec
->output_offset
)
4786 /* A STO_SH5_ISA32 causes a "bitor 1" to the
4787 symbol value, unless we've seen
4788 STT_DATALABEL on the way to it. */
4789 | ((h
->other
& STO_SH5_ISA32
) != 0
4790 && ! seen_stt_datalabel
));
4792 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4794 else if (info
->unresolved_syms_in_objects
== RM_IGNORE
4795 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4799 if (! info
->callbacks
->undefined_symbol
4800 (info
, h
->root
.root
.string
, input_bfd
,
4801 input_section
, rel
->r_offset
,
4802 (info
->unresolved_syms_in_objects
== RM_GENERATE_ERROR
4803 || ELF_ST_VISIBILITY (h
->other
))))
4809 switch ((int) r_type
)
4811 final_link_relocate
:
4812 /* COFF relocs don't use the addend. The addend is used for
4813 R_SH_DIR32 to be compatible with other compilers. */
4814 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4815 contents
, rel
->r_offset
,
4816 relocation
, addend
);
4820 goto final_link_relocate
;
4825 /* If the reloc is against the start of this section, then
4826 the assembler has already taken care of it and the reloc
4827 is here only to assist in relaxing. If the reloc is not
4828 against the start of this section, then it's against an
4829 external symbol and we must deal with it ourselves. */
4830 if (input_section
->output_section
->vma
+ input_section
->output_offset
4833 int disp
= (relocation
4834 - input_section
->output_section
->vma
4835 - input_section
->output_offset
4841 case R_SH_DIR8WPZ
: mask
= 1; break;
4842 case R_SH_DIR8WPL
: mask
= 3; break;
4843 default: mask
= 0; break;
4847 ((*_bfd_error_handler
)
4848 (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
4849 input_section
->owner
,
4850 (unsigned long) rel
->r_offset
));
4851 bfd_set_error (bfd_error_bad_value
);
4855 goto final_link_relocate
;
4861 #ifdef INCLUDE_SHMEDIA
4862 if (shmedia_prepare_reloc (info
, input_bfd
, input_section
,
4863 contents
, rel
, &relocation
))
4864 goto final_link_relocate
;
4866 bfd_set_error (bfd_error_bad_value
);
4874 goto final_link_relocate
;
4880 ((*_bfd_error_handler
)
4881 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
4882 input_section
->owner
,
4883 (unsigned long) rel
->r_offset
, howto
->name
,
4884 (unsigned long) relocation
));
4885 bfd_set_error (bfd_error_bad_value
);
4888 goto final_link_relocate
;
4895 ((*_bfd_error_handler
)
4896 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
4897 input_section
->owner
,
4898 (unsigned long) rel
->r_offset
, howto
->name
,
4899 (unsigned long) relocation
));
4900 bfd_set_error (bfd_error_bad_value
);
4903 goto final_link_relocate
;
4906 if ((signed int)relocation
< -32
4907 || (signed int)relocation
> 32)
4909 ((*_bfd_error_handler
)
4910 (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
4911 input_section
->owner
,
4912 (unsigned long) rel
->r_offset
,
4913 (unsigned long) relocation
));
4914 bfd_set_error (bfd_error_bad_value
);
4917 goto final_link_relocate
;
4920 if ((signed int)relocation
< -16
4921 || (signed int)relocation
> 16)
4923 ((*_bfd_error_handler
)
4924 (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
4925 input_section
->owner
,
4926 (unsigned long) rel
->r_offset
,
4927 (unsigned long) relocation
));
4928 bfd_set_error (bfd_error_bad_value
);
4931 goto final_link_relocate
;
4935 #ifdef INCLUDE_SHMEDIA
4936 case R_SH_IMM_LOW16_PCREL
:
4937 case R_SH_IMM_MEDLOW16_PCREL
:
4938 case R_SH_IMM_MEDHI16_PCREL
:
4939 case R_SH_IMM_HI16_PCREL
:
4943 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4944 || h
->root
.type
!= bfd_link_hash_undefweak
)
4946 && (input_section
->flags
& SEC_ALLOC
) != 0
4947 && (r_type
== R_SH_DIR32
4948 || !SYMBOL_CALLS_LOCAL (info
, h
)))
4950 Elf_Internal_Rela outrel
;
4952 bfd_boolean skip
, relocate
;
4954 /* When generating a shared object, these relocations
4955 are copied into the output file to be resolved at run
4962 name
= (bfd_elf_string_from_elf_section
4964 elf_elfheader (input_bfd
)->e_shstrndx
,
4965 elf_section_data (input_section
)->rel_hdr
.sh_name
));
4969 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
4970 && strcmp (bfd_get_section_name (input_bfd
,
4974 sreloc
= bfd_get_section_by_name (dynobj
, name
);
4975 BFD_ASSERT (sreloc
!= NULL
);
4982 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
4984 if (outrel
.r_offset
== (bfd_vma
) -1)
4986 else if (outrel
.r_offset
== (bfd_vma
) -2)
4987 skip
= TRUE
, relocate
= TRUE
;
4988 outrel
.r_offset
+= (input_section
->output_section
->vma
4989 + input_section
->output_offset
);
4992 memset (&outrel
, 0, sizeof outrel
);
4993 else if (r_type
== R_SH_REL32
)
4995 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
4996 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_REL32
);
4998 = bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
5000 #ifdef INCLUDE_SHMEDIA
5001 else if (r_type
== R_SH_IMM_LOW16_PCREL
5002 || r_type
== R_SH_IMM_MEDLOW16_PCREL
5003 || r_type
== R_SH_IMM_MEDHI16_PCREL
5004 || r_type
== R_SH_IMM_HI16_PCREL
)
5006 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
5007 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
5008 outrel
.r_addend
= addend
;
5013 /* h->dynindx may be -1 if this symbol was marked to
5016 || ((info
->symbolic
|| h
->dynindx
== -1)
5020 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
5022 = relocation
+ bfd_get_32 (input_bfd
,
5023 contents
+ rel
->r_offset
);
5027 BFD_ASSERT (h
->dynindx
!= -1);
5028 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_DIR32
);
5030 = relocation
+ bfd_get_32 (input_bfd
,
5031 contents
+ rel
->r_offset
);
5035 loc
= sreloc
->contents
;
5036 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5037 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5039 /* If this reloc is against an external symbol, we do
5040 not want to fiddle with the addend. Otherwise, we
5041 need to include the symbol value so that it becomes
5042 an addend for the dynamic reloc. */
5046 goto final_link_relocate
;
5049 #ifdef INCLUDE_SHMEDIA
5050 case R_SH_GOTPLT_LOW16
:
5051 case R_SH_GOTPLT_MEDLOW16
:
5052 case R_SH_GOTPLT_MEDHI16
:
5053 case R_SH_GOTPLT_HI16
:
5054 case R_SH_GOTPLT10BY4
:
5055 case R_SH_GOTPLT10BY8
:
5057 /* Relocation is to the entry for this symbol in the
5058 procedure linkage table. */
5065 || h
->plt
.offset
== (bfd_vma
) -1
5066 || h
->got
.offset
!= (bfd_vma
) -1)
5069 /* Relocation is to the entry for this symbol in the global
5070 offset table extension for the procedure linkage table. */
5072 BFD_ASSERT (sgotplt
!= NULL
);
5073 relocation
= (sgotplt
->output_offset
5074 + ((h
->plt
.offset
/ elf_sh_sizeof_plt (info
)
5078 relocation
-= GOT_BIAS
;
5081 goto final_link_relocate
;
5085 #ifdef INCLUDE_SHMEDIA
5086 case R_SH_GOT_LOW16
:
5087 case R_SH_GOT_MEDLOW16
:
5088 case R_SH_GOT_MEDHI16
:
5093 /* Relocation is to the entry for this symbol in the global
5096 BFD_ASSERT (sgot
!= NULL
);
5102 off
= h
->got
.offset
;
5103 #ifdef INCLUDE_SHMEDIA
5104 if (seen_stt_datalabel
)
5106 struct elf_sh_link_hash_entry
*hsh
;
5108 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5109 off
= hsh
->datalabel_got
.offset
;
5112 BFD_ASSERT (off
!= (bfd_vma
) -1);
5114 dyn
= htab
->root
.dynamic_sections_created
;
5115 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
5117 && SYMBOL_REFERENCES_LOCAL (info
, h
))
5118 || (ELF_ST_VISIBILITY (h
->other
)
5119 && h
->root
.type
== bfd_link_hash_undefweak
))
5121 /* This is actually a static link, or it is a
5122 -Bsymbolic link and the symbol is defined
5123 locally, or the symbol was forced to be local
5124 because of a version file. We must initialize
5125 this entry in the global offset table. Since the
5126 offset must always be a multiple of 4, we use the
5127 least significant bit to record whether we have
5128 initialized it already.
5130 When doing a dynamic link, we create a .rela.got
5131 relocation entry to initialize the value. This
5132 is done in the finish_dynamic_symbol routine. */
5137 bfd_put_32 (output_bfd
, relocation
,
5138 sgot
->contents
+ off
);
5139 #ifdef INCLUDE_SHMEDIA
5140 if (seen_stt_datalabel
)
5142 struct elf_sh_link_hash_entry
*hsh
;
5144 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5145 hsh
->datalabel_got
.offset
|= 1;
5153 relocation
= sgot
->output_offset
+ off
;
5157 #ifdef INCLUDE_SHMEDIA
5160 BFD_ASSERT (local_got_offsets
!= NULL
5161 && (local_got_offsets
[symtab_hdr
->sh_info
5165 off
= local_got_offsets
[symtab_hdr
->sh_info
5171 BFD_ASSERT (local_got_offsets
!= NULL
5172 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
5174 off
= local_got_offsets
[r_symndx
];
5175 #ifdef INCLUDE_SHMEDIA
5179 /* The offset must always be a multiple of 4. We use
5180 the least significant bit to record whether we have
5181 already generated the necessary reloc. */
5186 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5190 Elf_Internal_Rela outrel
;
5193 if (srelgot
== NULL
)
5195 srelgot
= bfd_get_section_by_name (dynobj
,
5197 BFD_ASSERT (srelgot
!= NULL
);
5200 outrel
.r_offset
= (sgot
->output_section
->vma
5201 + sgot
->output_offset
5203 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
5204 outrel
.r_addend
= relocation
;
5205 loc
= srelgot
->contents
;
5206 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5207 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5210 #ifdef INCLUDE_SHMEDIA
5212 local_got_offsets
[symtab_hdr
->sh_info
+ r_symndx
] |= 1;
5215 local_got_offsets
[r_symndx
] |= 1;
5218 relocation
= sgot
->output_offset
+ off
;
5222 relocation
-= GOT_BIAS
;
5225 goto final_link_relocate
;
5228 #ifdef INCLUDE_SHMEDIA
5229 case R_SH_GOTOFF_LOW16
:
5230 case R_SH_GOTOFF_MEDLOW16
:
5231 case R_SH_GOTOFF_MEDHI16
:
5232 case R_SH_GOTOFF_HI16
:
5234 /* Relocation is relative to the start of the global offset
5237 BFD_ASSERT (sgot
!= NULL
);
5239 /* Note that sgot->output_offset is not involved in this
5240 calculation. We always want the start of .got. If we
5241 defined _GLOBAL_OFFSET_TABLE in a different way, as is
5242 permitted by the ABI, we might have to change this
5244 relocation
-= sgot
->output_section
->vma
;
5247 relocation
-= GOT_BIAS
;
5250 addend
= rel
->r_addend
;
5252 goto final_link_relocate
;
5255 #ifdef INCLUDE_SHMEDIA
5256 case R_SH_GOTPC_LOW16
:
5257 case R_SH_GOTPC_MEDLOW16
:
5258 case R_SH_GOTPC_MEDHI16
:
5259 case R_SH_GOTPC_HI16
:
5261 /* Use global offset table as symbol value. */
5263 BFD_ASSERT (sgot
!= NULL
);
5264 relocation
= sgot
->output_section
->vma
;
5267 relocation
+= GOT_BIAS
;
5270 addend
= rel
->r_addend
;
5272 goto final_link_relocate
;
5275 #ifdef INCLUDE_SHMEDIA
5276 case R_SH_PLT_LOW16
:
5277 case R_SH_PLT_MEDLOW16
:
5278 case R_SH_PLT_MEDHI16
:
5281 /* Relocation is to the entry for this symbol in the
5282 procedure linkage table. */
5284 /* Resolve a PLT reloc against a local symbol directly,
5285 without using the procedure linkage table. */
5287 goto final_link_relocate
;
5289 if (h
->forced_local
)
5290 goto final_link_relocate
;
5292 if (h
->plt
.offset
== (bfd_vma
) -1)
5294 /* We didn't make a PLT entry for this symbol. This
5295 happens when statically linking PIC code, or when
5296 using -Bsymbolic. */
5297 goto final_link_relocate
;
5300 BFD_ASSERT (splt
!= NULL
);
5301 relocation
= (splt
->output_section
->vma
5302 + splt
->output_offset
5305 #ifdef INCLUDE_SHMEDIA
5309 addend
= rel
->r_addend
;
5311 goto final_link_relocate
;
5313 case R_SH_LOOP_START
:
5315 static bfd_vma start
, end
;
5317 start
= (relocation
+ rel
->r_addend
5318 - (sec
->output_section
->vma
+ sec
->output_offset
));
5319 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5320 rel
->r_offset
, sec
, start
, end
);
5324 end
= (relocation
+ rel
->r_addend
5325 - (sec
->output_section
->vma
+ sec
->output_offset
));
5326 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5327 rel
->r_offset
, sec
, start
, end
);
5331 case R_SH_TLS_GD_32
:
5332 case R_SH_TLS_IE_32
:
5333 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
5334 tls_type
= GOT_UNKNOWN
;
5335 if (h
== NULL
&& local_got_offsets
)
5336 tls_type
= sh_elf_local_got_tls_type (input_bfd
) [r_symndx
];
5339 tls_type
= sh_elf_hash_entry (h
)->tls_type
;
5341 && (h
->dynindx
== -1
5343 r_type
= R_SH_TLS_LE_32
;
5346 if (r_type
== R_SH_TLS_GD_32
&& tls_type
== GOT_TLS_IE
)
5347 r_type
= R_SH_TLS_IE_32
;
5349 if (r_type
== R_SH_TLS_LE_32
)
5352 unsigned short insn
;
5354 if (ELF32_R_TYPE (rel
->r_info
) == R_SH_TLS_GD_32
)
5356 /* GD->LE transition:
5357 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5358 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5359 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5361 mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
5363 1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:. */
5365 offset
= rel
->r_offset
;
5366 BFD_ASSERT (offset
>= 16);
5367 /* Size of GD instructions is 16 or 18. */
5369 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5370 if ((insn
& 0xff00) == 0xc700)
5372 BFD_ASSERT (offset
>= 2);
5374 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5377 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5378 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5379 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5380 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5381 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5382 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5383 BFD_ASSERT (insn
== 0x310c);
5384 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5385 BFD_ASSERT (insn
== 0x410b);
5386 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5387 BFD_ASSERT (insn
== 0x34cc);
5389 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 2);
5390 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 4);
5391 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5392 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5393 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5399 /* IE->LE transition:
5400 mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
5401 bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
5403 mov.l .Ln,rM; stc gbr,rN; nop; ...;
5406 offset
= rel
->r_offset
;
5407 BFD_ASSERT (offset
>= 16);
5408 /* Size of IE instructions is 10 or 12. */
5410 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5411 if ((insn
& 0xf0ff) == 0x0012)
5413 BFD_ASSERT (offset
>= 2);
5415 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5418 BFD_ASSERT ((insn
& 0xff00) == 0xd000);
5419 index
= insn
& 0x00ff;
5420 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5421 BFD_ASSERT ((insn
& 0xf0ff) == 0x0012);
5422 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5423 BFD_ASSERT ((insn
& 0xf0ff) == 0x00ce);
5424 insn
= 0xd000 | (insn
& 0x0f00) | index
;
5425 bfd_put_16 (output_bfd
, insn
, contents
+ offset
+ 0);
5426 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5429 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5430 contents
+ rel
->r_offset
);
5439 off
= h
->got
.offset
;
5442 if (local_got_offsets
== NULL
)
5445 off
= local_got_offsets
[r_symndx
];
5448 /* Relocate R_SH_TLS_IE_32 directly when statically linking. */
5449 if (r_type
== R_SH_TLS_IE_32
5450 && ! htab
->root
.dynamic_sections_created
)
5453 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5454 sgot
->contents
+ off
);
5455 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5456 contents
+ rel
->r_offset
);
5464 Elf_Internal_Rela outrel
;
5468 if (srelgot
== NULL
)
5470 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5471 BFD_ASSERT (srelgot
!= NULL
);
5474 outrel
.r_offset
= (sgot
->output_section
->vma
5475 + sgot
->output_offset
+ off
);
5477 if (h
== NULL
|| h
->dynindx
== -1)
5482 dr_type
= (r_type
== R_SH_TLS_GD_32
? R_SH_TLS_DTPMOD32
:
5484 if (dr_type
== R_SH_TLS_TPOFF32
&& indx
== 0)
5485 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5487 outrel
.r_addend
= 0;
5488 outrel
.r_info
= ELF32_R_INFO (indx
, dr_type
);
5489 loc
= srelgot
->contents
;
5490 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5491 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5493 if (r_type
== R_SH_TLS_GD_32
)
5497 bfd_put_32 (output_bfd
,
5498 relocation
- dtpoff_base (info
),
5499 sgot
->contents
+ off
+ 4);
5503 outrel
.r_info
= ELF32_R_INFO (indx
,
5505 outrel
.r_offset
+= 4;
5506 outrel
.r_addend
= 0;
5507 srelgot
->reloc_count
++;
5508 loc
+= sizeof (Elf32_External_Rela
);
5509 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5516 local_got_offsets
[r_symndx
] |= 1;
5519 if (off
>= (bfd_vma
) -2)
5522 if (r_type
== (int) ELF32_R_TYPE (rel
->r_info
))
5523 relocation
= sgot
->output_offset
+ off
;
5527 unsigned short insn
;
5529 /* GD->IE transition:
5530 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5531 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5532 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5534 mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
5535 nop; nop; bra 3f; nop; .align 2;
5536 1: .long x@TPOFF; 2:...; 3:. */
5538 offset
= rel
->r_offset
;
5539 BFD_ASSERT (offset
>= 16);
5540 /* Size of GD instructions is 16 or 18. */
5542 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5543 if ((insn
& 0xff00) == 0xc700)
5545 BFD_ASSERT (offset
>= 2);
5547 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5550 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5552 /* Replace mov.l 1f,R4 with mov.l 1f,r0. */
5553 bfd_put_16 (output_bfd
, insn
& 0xf0ff, contents
+ offset
);
5555 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5556 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5557 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5558 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5559 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5560 BFD_ASSERT (insn
== 0x310c);
5561 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5562 BFD_ASSERT (insn
== 0x410b);
5563 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5564 BFD_ASSERT (insn
== 0x34cc);
5566 bfd_put_16 (output_bfd
, 0x0412, contents
+ offset
+ 2);
5567 bfd_put_16 (output_bfd
, 0x00ce, contents
+ offset
+ 4);
5568 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 6);
5569 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5570 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5572 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5573 contents
+ rel
->r_offset
);
5578 addend
= rel
->r_addend
;
5580 goto final_link_relocate
;
5582 case R_SH_TLS_LD_32
:
5586 unsigned short insn
;
5588 /* LD->LE transition:
5589 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5590 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5591 1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
5593 stc gbr,r0; nop; nop; nop;
5594 nop; nop; bra 3f; ...; 3:. */
5596 offset
= rel
->r_offset
;
5597 BFD_ASSERT (offset
>= 16);
5598 /* Size of LD instructions is 16 or 18. */
5600 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5601 if ((insn
& 0xff00) == 0xc700)
5603 BFD_ASSERT (offset
>= 2);
5605 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5608 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5609 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5610 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5611 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5612 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5613 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5614 BFD_ASSERT (insn
== 0x310c);
5615 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5616 BFD_ASSERT (insn
== 0x410b);
5617 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5618 BFD_ASSERT (insn
== 0x34cc);
5620 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 0);
5621 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 2);
5622 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5623 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5624 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5625 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5634 off
= htab
->tls_ldm_got
.offset
;
5639 Elf_Internal_Rela outrel
;
5642 srelgot
= htab
->srelgot
;
5643 if (srelgot
== NULL
)
5646 outrel
.r_offset
= (sgot
->output_section
->vma
5647 + sgot
->output_offset
+ off
);
5648 outrel
.r_addend
= 0;
5649 outrel
.r_info
= ELF32_R_INFO (0, R_SH_TLS_DTPMOD32
);
5650 loc
= srelgot
->contents
;
5651 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5652 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5653 htab
->tls_ldm_got
.offset
|= 1;
5656 relocation
= sgot
->output_offset
+ off
;
5657 addend
= rel
->r_addend
;
5659 goto final_link_relocate
;
5661 case R_SH_TLS_LDO_32
:
5663 relocation
= tpoff (info
, relocation
);
5665 relocation
-= dtpoff_base (info
);
5667 addend
= rel
->r_addend
;
5668 goto final_link_relocate
;
5670 case R_SH_TLS_LE_32
:
5673 Elf_Internal_Rela outrel
;
5678 relocation
= tpoff (info
, relocation
);
5679 addend
= rel
->r_addend
;
5680 goto final_link_relocate
;
5687 name
= (bfd_elf_string_from_elf_section
5689 elf_elfheader (input_bfd
)->e_shstrndx
,
5690 elf_section_data (input_section
)->rel_hdr
.sh_name
));
5694 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5695 && strcmp (bfd_get_section_name (input_bfd
,
5699 sreloc
= bfd_get_section_by_name (dynobj
, name
);
5700 BFD_ASSERT (sreloc
!= NULL
);
5703 if (h
== NULL
|| h
->dynindx
== -1)
5708 outrel
.r_offset
= (input_section
->output_section
->vma
5709 + input_section
->output_offset
5711 outrel
.r_info
= ELF32_R_INFO (indx
, R_SH_TLS_TPOFF32
);
5713 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5715 outrel
.r_addend
= 0;
5717 loc
= sreloc
->contents
;
5718 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5719 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5725 if (r
!= bfd_reloc_ok
)
5730 case bfd_reloc_outofrange
:
5732 case bfd_reloc_overflow
:
5740 name
= (bfd_elf_string_from_elf_section
5741 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
5745 name
= bfd_section_name (input_bfd
, sec
);
5747 if (! ((*info
->callbacks
->reloc_overflow
)
5748 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
5749 (bfd_vma
) 0, input_bfd
, input_section
,
5761 /* This is a version of bfd_generic_get_relocated_section_contents
5762 which uses sh_elf_relocate_section. */
5765 sh_elf_get_relocated_section_contents (bfd
*output_bfd
,
5766 struct bfd_link_info
*link_info
,
5767 struct bfd_link_order
*link_order
,
5769 bfd_boolean relocatable
,
5772 Elf_Internal_Shdr
*symtab_hdr
;
5773 asection
*input_section
= link_order
->u
.indirect
.section
;
5774 bfd
*input_bfd
= input_section
->owner
;
5775 asection
**sections
= NULL
;
5776 Elf_Internal_Rela
*internal_relocs
= NULL
;
5777 Elf_Internal_Sym
*isymbuf
= NULL
;
5779 /* We only need to handle the case of relaxing, or of having a
5780 particular set of section contents, specially. */
5782 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
5783 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
5788 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
5790 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
5791 (size_t) input_section
->size
);
5793 if ((input_section
->flags
& SEC_RELOC
) != 0
5794 && input_section
->reloc_count
> 0)
5797 Elf_Internal_Sym
*isym
, *isymend
;
5800 internal_relocs
= (_bfd_elf_link_read_relocs
5801 (input_bfd
, input_section
, NULL
,
5802 (Elf_Internal_Rela
*) NULL
, FALSE
));
5803 if (internal_relocs
== NULL
)
5806 if (symtab_hdr
->sh_info
!= 0)
5808 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
5809 if (isymbuf
== NULL
)
5810 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
5811 symtab_hdr
->sh_info
, 0,
5813 if (isymbuf
== NULL
)
5817 amt
= symtab_hdr
->sh_info
;
5818 amt
*= sizeof (asection
*);
5819 sections
= (asection
**) bfd_malloc (amt
);
5820 if (sections
== NULL
&& amt
!= 0)
5823 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
5824 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
5828 if (isym
->st_shndx
== SHN_UNDEF
)
5829 isec
= bfd_und_section_ptr
;
5830 else if (isym
->st_shndx
== SHN_ABS
)
5831 isec
= bfd_abs_section_ptr
;
5832 else if (isym
->st_shndx
== SHN_COMMON
)
5833 isec
= bfd_com_section_ptr
;
5835 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
5840 if (! sh_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
5841 input_section
, data
, internal_relocs
,
5845 if (sections
!= NULL
)
5848 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5850 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
5851 free (internal_relocs
);
5857 if (sections
!= NULL
)
5860 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5862 if (internal_relocs
!= NULL
5863 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
5864 free (internal_relocs
);
5868 /* Return the base VMA address which should be subtracted from real addresses
5869 when resolving @dtpoff relocation.
5870 This is PT_TLS segment p_vaddr. */
5873 dtpoff_base (struct bfd_link_info
*info
)
5875 /* If tls_sec is NULL, we should have signalled an error already. */
5876 if (elf_hash_table (info
)->tls_sec
== NULL
)
5878 return elf_hash_table (info
)->tls_sec
->vma
;
5881 /* Return the relocation value for R_SH_TLS_TPOFF32.. */
5884 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
5886 /* If tls_sec is NULL, we should have signalled an error already. */
5887 if (elf_hash_table (info
)->tls_sec
== NULL
)
5889 /* SH TLS ABI is variant I and static TLS block start just after tcbhead
5890 structure which has 2 pointer fields. */
5891 return (address
- elf_hash_table (info
)->tls_sec
->vma
5892 + align_power ((bfd_vma
) 8,
5893 elf_hash_table (info
)->tls_sec
->alignment_power
));
5897 sh_elf_gc_mark_hook (asection
*sec
,
5898 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
5899 Elf_Internal_Rela
*rel
, struct elf_link_hash_entry
*h
,
5900 Elf_Internal_Sym
*sym
)
5904 switch (ELF32_R_TYPE (rel
->r_info
))
5906 case R_SH_GNU_VTINHERIT
:
5907 case R_SH_GNU_VTENTRY
:
5911 #ifdef INCLUDE_SHMEDIA
5912 while (h
->root
.type
== bfd_link_hash_indirect
5913 && h
->root
.u
.i
.link
)
5914 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5916 switch (h
->root
.type
)
5918 case bfd_link_hash_defined
:
5919 case bfd_link_hash_defweak
:
5920 return h
->root
.u
.def
.section
;
5922 case bfd_link_hash_common
:
5923 return h
->root
.u
.c
.p
->section
;
5931 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
5936 /* Update the got entry reference counts for the section being removed. */
5939 sh_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
5940 asection
*sec
, const Elf_Internal_Rela
*relocs
)
5942 Elf_Internal_Shdr
*symtab_hdr
;
5943 struct elf_link_hash_entry
**sym_hashes
;
5944 bfd_signed_vma
*local_got_refcounts
;
5945 const Elf_Internal_Rela
*rel
, *relend
;
5947 elf_section_data (sec
)->local_dynrel
= NULL
;
5949 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
5950 sym_hashes
= elf_sym_hashes (abfd
);
5951 local_got_refcounts
= elf_local_got_refcounts (abfd
);
5953 relend
= relocs
+ sec
->reloc_count
;
5954 for (rel
= relocs
; rel
< relend
; rel
++)
5956 unsigned long r_symndx
;
5957 unsigned int r_type
;
5958 struct elf_link_hash_entry
*h
= NULL
;
5959 #ifdef INCLUDE_SHMEDIA
5960 int seen_stt_datalabel
= 0;
5963 r_symndx
= ELF32_R_SYM (rel
->r_info
);
5964 if (r_symndx
>= symtab_hdr
->sh_info
)
5966 struct elf_sh_link_hash_entry
*eh
;
5967 struct elf_sh_dyn_relocs
**pp
;
5968 struct elf_sh_dyn_relocs
*p
;
5970 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
5971 while (h
->root
.type
== bfd_link_hash_indirect
5972 || h
->root
.type
== bfd_link_hash_warning
)
5974 #ifdef INCLUDE_SHMEDIA
5975 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
5977 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5979 eh
= (struct elf_sh_link_hash_entry
*) h
;
5980 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
5983 /* Everything must go for SEC. */
5989 r_type
= ELF32_R_TYPE (rel
->r_info
);
5990 switch (sh_elf_optimized_tls_reloc (info
, r_type
, h
!= NULL
))
5992 case R_SH_TLS_LD_32
:
5993 if (sh_elf_hash_table (info
)->tls_ldm_got
.refcount
> 0)
5994 sh_elf_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
6000 #ifdef INCLUDE_SHMEDIA
6001 case R_SH_GOT_LOW16
:
6002 case R_SH_GOT_MEDLOW16
:
6003 case R_SH_GOT_MEDHI16
:
6007 case R_SH_GOTOFF_LOW16
:
6008 case R_SH_GOTOFF_MEDLOW16
:
6009 case R_SH_GOTOFF_MEDHI16
:
6010 case R_SH_GOTOFF_HI16
:
6011 case R_SH_GOTPC_LOW16
:
6012 case R_SH_GOTPC_MEDLOW16
:
6013 case R_SH_GOTPC_MEDHI16
:
6014 case R_SH_GOTPC_HI16
:
6016 case R_SH_TLS_GD_32
:
6017 case R_SH_TLS_IE_32
:
6020 #ifdef INCLUDE_SHMEDIA
6021 if (seen_stt_datalabel
)
6023 struct elf_sh_link_hash_entry
*eh
;
6024 eh
= (struct elf_sh_link_hash_entry
*) h
;
6025 if (eh
->datalabel_got
.refcount
> 0)
6026 eh
->datalabel_got
.refcount
-= 1;
6030 if (h
->got
.refcount
> 0)
6031 h
->got
.refcount
-= 1;
6033 else if (local_got_refcounts
!= NULL
)
6035 #ifdef INCLUDE_SHMEDIA
6036 if (rel
->r_addend
& 1)
6038 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6039 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6043 if (local_got_refcounts
[r_symndx
] > 0)
6044 local_got_refcounts
[r_symndx
] -= 1;
6055 #ifdef INCLUDE_SHMEDIA
6056 case R_SH_PLT_LOW16
:
6057 case R_SH_PLT_MEDLOW16
:
6058 case R_SH_PLT_MEDHI16
:
6063 if (h
->plt
.refcount
> 0)
6064 h
->plt
.refcount
-= 1;
6069 #ifdef INCLUDE_SHMEDIA
6070 case R_SH_GOTPLT_LOW16
:
6071 case R_SH_GOTPLT_MEDLOW16
:
6072 case R_SH_GOTPLT_MEDHI16
:
6073 case R_SH_GOTPLT_HI16
:
6074 case R_SH_GOTPLT10BY4
:
6075 case R_SH_GOTPLT10BY8
:
6079 struct elf_sh_link_hash_entry
*eh
;
6080 eh
= (struct elf_sh_link_hash_entry
*) h
;
6081 if (eh
->gotplt_refcount
> 0)
6083 eh
->gotplt_refcount
-= 1;
6084 if (h
->plt
.refcount
> 0)
6085 h
->plt
.refcount
-= 1;
6087 #ifdef INCLUDE_SHMEDIA
6088 else if (seen_stt_datalabel
)
6090 if (eh
->datalabel_got
.refcount
> 0)
6091 eh
->datalabel_got
.refcount
-= 1;
6094 else if (h
->got
.refcount
> 0)
6095 h
->got
.refcount
-= 1;
6097 else if (local_got_refcounts
!= NULL
)
6099 #ifdef INCLUDE_SHMEDIA
6100 if (rel
->r_addend
& 1)
6102 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6103 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6107 if (local_got_refcounts
[r_symndx
] > 0)
6108 local_got_refcounts
[r_symndx
] -= 1;
6120 /* Copy the extra info we tack onto an elf_link_hash_entry. */
6123 sh_elf_copy_indirect_symbol (const struct elf_backend_data
*bed
,
6124 struct elf_link_hash_entry
*dir
,
6125 struct elf_link_hash_entry
*ind
)
6127 struct elf_sh_link_hash_entry
*edir
, *eind
;
6128 #ifdef INCLUDE_SHMEDIA
6132 edir
= (struct elf_sh_link_hash_entry
*) dir
;
6133 eind
= (struct elf_sh_link_hash_entry
*) ind
;
6135 if (eind
->dyn_relocs
!= NULL
)
6137 if (edir
->dyn_relocs
!= NULL
)
6139 struct elf_sh_dyn_relocs
**pp
;
6140 struct elf_sh_dyn_relocs
*p
;
6142 BFD_ASSERT (ind
->root
.type
!= bfd_link_hash_indirect
);
6144 /* Add reloc counts against the weak sym to the strong sym
6145 list. Merge any entries against the same section. */
6146 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
6148 struct elf_sh_dyn_relocs
*q
;
6150 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
6151 if (q
->sec
== p
->sec
)
6153 q
->pc_count
+= p
->pc_count
;
6154 q
->count
+= p
->count
;
6161 *pp
= edir
->dyn_relocs
;
6164 edir
->dyn_relocs
= eind
->dyn_relocs
;
6165 eind
->dyn_relocs
= NULL
;
6167 edir
->gotplt_refcount
= eind
->gotplt_refcount
;
6168 eind
->gotplt_refcount
= 0;
6169 #ifdef INCLUDE_SHMEDIA
6170 tmp
= edir
->datalabel_got
.refcount
;
6173 edir
->datalabel_got
.refcount
= eind
->datalabel_got
.refcount
;
6174 eind
->datalabel_got
.refcount
= tmp
;
6177 BFD_ASSERT (eind
->datalabel_got
.refcount
< 1);
6180 if (ind
->root
.type
== bfd_link_hash_indirect
6181 && dir
->got
.refcount
<= 0)
6183 edir
->tls_type
= eind
->tls_type
;
6184 eind
->tls_type
= GOT_UNKNOWN
;
6187 if (ind
->root
.type
!= bfd_link_hash_indirect
6188 && dir
->dynamic_adjusted
)
6190 /* If called to transfer flags for a weakdef during processing
6191 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
6192 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
6193 dir
->ref_dynamic
|= ind
->ref_dynamic
;
6194 dir
->ref_regular
|= ind
->ref_regular
;
6195 dir
->ref_regular_nonweak
|= ind
->ref_regular_nonweak
;
6196 dir
->needs_plt
|= ind
->needs_plt
;
6199 _bfd_elf_link_hash_copy_indirect (bed
, dir
, ind
);
6203 sh_elf_optimized_tls_reloc (struct bfd_link_info
*info
, int r_type
,
6211 case R_SH_TLS_GD_32
:
6212 case R_SH_TLS_IE_32
:
6214 return R_SH_TLS_LE_32
;
6215 return R_SH_TLS_IE_32
;
6216 case R_SH_TLS_LD_32
:
6217 return R_SH_TLS_LE_32
;
6223 /* Look through the relocs for a section during the first phase.
6224 Since we don't do .gots or .plts, we just need to consider the
6225 virtual table relocs for gc. */
6228 sh_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
, asection
*sec
,
6229 const Elf_Internal_Rela
*relocs
)
6231 Elf_Internal_Shdr
*symtab_hdr
;
6232 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
6233 struct elf_sh_link_hash_table
*htab
;
6234 const Elf_Internal_Rela
*rel
;
6235 const Elf_Internal_Rela
*rel_end
;
6236 bfd_vma
*local_got_offsets
;
6240 unsigned int r_type
;
6241 int tls_type
, old_tls_type
;
6247 if (info
->relocatable
)
6250 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6251 sym_hashes
= elf_sym_hashes (abfd
);
6252 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof (Elf32_External_Sym
);
6253 if (!elf_bad_symtab (abfd
))
6254 sym_hashes_end
-= symtab_hdr
->sh_info
;
6256 htab
= sh_elf_hash_table (info
);
6257 local_got_offsets
= elf_local_got_offsets (abfd
);
6259 rel_end
= relocs
+ sec
->reloc_count
;
6260 for (rel
= relocs
; rel
< rel_end
; rel
++)
6262 struct elf_link_hash_entry
*h
;
6263 unsigned long r_symndx
;
6264 #ifdef INCLUDE_SHMEDIA
6265 int seen_stt_datalabel
= 0;
6268 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6269 r_type
= ELF32_R_TYPE (rel
->r_info
);
6271 if (r_symndx
< symtab_hdr
->sh_info
)
6275 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6276 #ifdef INCLUDE_SHMEDIA
6277 while (h
->root
.type
== bfd_link_hash_indirect
6278 || h
->root
.type
== bfd_link_hash_warning
)
6280 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
6281 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6286 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
6288 && r_type
== R_SH_TLS_IE_32
6290 && h
->root
.type
!= bfd_link_hash_undefined
6291 && h
->root
.type
!= bfd_link_hash_undefweak
6292 && (h
->dynindx
== -1
6294 r_type
= R_SH_TLS_LE_32
;
6296 /* Some relocs require a global offset table. */
6297 if (htab
->sgot
== NULL
)
6305 #ifdef INCLUDE_SHMEDIA
6306 case R_SH_GOTPLT_LOW16
:
6307 case R_SH_GOTPLT_MEDLOW16
:
6308 case R_SH_GOTPLT_MEDHI16
:
6309 case R_SH_GOTPLT_HI16
:
6310 case R_SH_GOTPLT10BY4
:
6311 case R_SH_GOTPLT10BY8
:
6312 case R_SH_GOT_LOW16
:
6313 case R_SH_GOT_MEDLOW16
:
6314 case R_SH_GOT_MEDHI16
:
6318 case R_SH_GOTOFF_LOW16
:
6319 case R_SH_GOTOFF_MEDLOW16
:
6320 case R_SH_GOTOFF_MEDHI16
:
6321 case R_SH_GOTOFF_HI16
:
6322 case R_SH_GOTPC_LOW16
:
6323 case R_SH_GOTPC_MEDLOW16
:
6324 case R_SH_GOTPC_MEDHI16
:
6325 case R_SH_GOTPC_HI16
:
6327 case R_SH_TLS_GD_32
:
6328 case R_SH_TLS_LD_32
:
6329 case R_SH_TLS_IE_32
:
6330 if (htab
->sgot
== NULL
)
6332 if (htab
->root
.dynobj
== NULL
)
6333 htab
->root
.dynobj
= abfd
;
6334 if (!create_got_section (htab
->root
.dynobj
, info
))
6346 /* This relocation describes the C++ object vtable hierarchy.
6347 Reconstruct it for later use during GC. */
6348 case R_SH_GNU_VTINHERIT
:
6349 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
6353 /* This relocation describes which C++ vtable entries are actually
6354 used. Record for later use during GC. */
6355 case R_SH_GNU_VTENTRY
:
6356 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
6360 case R_SH_TLS_IE_32
:
6362 info
->flags
|= DF_STATIC_TLS
;
6366 case R_SH_TLS_GD_32
:
6368 #ifdef INCLUDE_SHMEDIA
6369 case R_SH_GOT_LOW16
:
6370 case R_SH_GOT_MEDLOW16
:
6371 case R_SH_GOT_MEDHI16
:
6379 tls_type
= GOT_NORMAL
;
6381 case R_SH_TLS_GD_32
:
6382 tls_type
= GOT_TLS_GD
;
6384 case R_SH_TLS_IE_32
:
6385 tls_type
= GOT_TLS_IE
;
6391 #ifdef INCLUDE_SHMEDIA
6392 if (seen_stt_datalabel
)
6394 struct elf_sh_link_hash_entry
*eh
6395 = (struct elf_sh_link_hash_entry
*) h
;
6397 eh
->datalabel_got
.refcount
+= 1;
6401 h
->got
.refcount
+= 1;
6402 old_tls_type
= sh_elf_hash_entry (h
)->tls_type
;
6406 bfd_signed_vma
*local_got_refcounts
;
6408 /* This is a global offset table entry for a local
6410 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6411 if (local_got_refcounts
== NULL
)
6415 size
= symtab_hdr
->sh_info
;
6416 size
*= sizeof (bfd_signed_vma
);
6417 #ifdef INCLUDE_SHMEDIA
6418 /* Reserve space for both the datalabel and
6419 codelabel local GOT offsets. */
6422 size
+= symtab_hdr
->sh_info
;
6423 local_got_refcounts
= ((bfd_signed_vma
*)
6424 bfd_zalloc (abfd
, size
));
6425 if (local_got_refcounts
== NULL
)
6427 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
6428 #ifdef INCLUDE_SHMEDIA
6429 /* Take care of both the datalabel and codelabel local
6431 sh_elf_local_got_tls_type (abfd
)
6432 = (char *) (local_got_refcounts
+ 2 * symtab_hdr
->sh_info
);
6434 sh_elf_local_got_tls_type (abfd
)
6435 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
6438 #ifdef INCLUDE_SHMEDIA
6439 if (rel
->r_addend
& 1)
6440 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] += 1;
6443 local_got_refcounts
[r_symndx
] += 1;
6444 old_tls_type
= sh_elf_local_got_tls_type (abfd
) [r_symndx
];
6447 /* If a TLS symbol is accessed using IE at least once,
6448 there is no point to use dynamic model for it. */
6449 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
6450 && (old_tls_type
!= GOT_TLS_GD
|| tls_type
!= GOT_TLS_IE
))
6452 if (old_tls_type
== GOT_TLS_IE
&& tls_type
== GOT_TLS_GD
)
6453 tls_type
= GOT_TLS_IE
;
6456 (*_bfd_error_handler
)
6457 (_("%B: `%s' accessed both as normal and thread local symbol"),
6458 abfd
, h
->root
.root
.string
);
6463 if (old_tls_type
!= tls_type
)
6466 sh_elf_hash_entry (h
)->tls_type
= tls_type
;
6468 sh_elf_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
6473 case R_SH_TLS_LD_32
:
6474 sh_elf_hash_table(info
)->tls_ldm_got
.refcount
+= 1;
6478 #ifdef INCLUDE_SHMEDIA
6479 case R_SH_GOTPLT_LOW16
:
6480 case R_SH_GOTPLT_MEDLOW16
:
6481 case R_SH_GOTPLT_MEDHI16
:
6482 case R_SH_GOTPLT_HI16
:
6483 case R_SH_GOTPLT10BY4
:
6484 case R_SH_GOTPLT10BY8
:
6486 /* If this is a local symbol, we resolve it directly without
6487 creating a procedure linkage table entry. */
6493 || h
->dynindx
== -1)
6497 h
->plt
.refcount
+= 1;
6498 ((struct elf_sh_link_hash_entry
*) h
)->gotplt_refcount
+= 1;
6503 #ifdef INCLUDE_SHMEDIA
6504 case R_SH_PLT_LOW16
:
6505 case R_SH_PLT_MEDLOW16
:
6506 case R_SH_PLT_MEDHI16
:
6509 /* This symbol requires a procedure linkage table entry. We
6510 actually build the entry in adjust_dynamic_symbol,
6511 because this might be a case of linking PIC code which is
6512 never referenced by a dynamic object, in which case we
6513 don't need to generate a procedure linkage table entry
6516 /* If this is a local symbol, we resolve it directly without
6517 creating a procedure linkage table entry. */
6521 if (h
->forced_local
)
6525 h
->plt
.refcount
+= 1;
6530 #ifdef INCLUDE_SHMEDIA
6531 case R_SH_IMM_LOW16_PCREL
:
6532 case R_SH_IMM_MEDLOW16_PCREL
:
6533 case R_SH_IMM_MEDHI16_PCREL
:
6534 case R_SH_IMM_HI16_PCREL
:
6536 if (h
!= NULL
&& ! info
->shared
)
6539 h
->plt
.refcount
+= 1;
6542 /* If we are creating a shared library, and this is a reloc
6543 against a global symbol, or a non PC relative reloc
6544 against a local symbol, then we need to copy the reloc
6545 into the shared library. However, if we are linking with
6546 -Bsymbolic, we do not need to copy a reloc against a
6547 global symbol which is defined in an object we are
6548 including in the link (i.e., DEF_REGULAR is set). At
6549 this point we have not seen all the input files, so it is
6550 possible that DEF_REGULAR is not set now but will be set
6551 later (it is never cleared). We account for that
6552 possibility below by storing information in the
6553 dyn_relocs field of the hash table entry. A similar
6554 situation occurs when creating shared libraries and symbol
6555 visibility changes render the symbol local.
6557 If on the other hand, we are creating an executable, we
6558 may need to keep relocations for symbols satisfied by a
6559 dynamic library if we manage to avoid copy relocs for the
6562 && (sec
->flags
& SEC_ALLOC
) != 0
6563 && (r_type
!= R_SH_REL32
6565 && (! info
->symbolic
6566 || h
->root
.type
== bfd_link_hash_defweak
6567 || !h
->def_regular
))))
6569 && (sec
->flags
& SEC_ALLOC
) != 0
6571 && (h
->root
.type
== bfd_link_hash_defweak
6572 || !h
->def_regular
)))
6574 struct elf_sh_dyn_relocs
*p
;
6575 struct elf_sh_dyn_relocs
**head
;
6577 if (htab
->root
.dynobj
== NULL
)
6578 htab
->root
.dynobj
= abfd
;
6580 /* When creating a shared object, we must copy these
6581 reloc types into the output file. We create a reloc
6582 section in dynobj and make room for this reloc. */
6587 name
= (bfd_elf_string_from_elf_section
6589 elf_elfheader (abfd
)->e_shstrndx
,
6590 elf_section_data (sec
)->rel_hdr
.sh_name
));
6594 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
6595 && strcmp (bfd_get_section_name (abfd
, sec
),
6598 sreloc
= bfd_get_section_by_name (htab
->root
.dynobj
, name
);
6603 sreloc
= bfd_make_section (htab
->root
.dynobj
, name
);
6604 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
6605 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
6606 if ((sec
->flags
& SEC_ALLOC
) != 0)
6607 flags
|= SEC_ALLOC
| SEC_LOAD
;
6609 || ! bfd_set_section_flags (htab
->root
.dynobj
,
6611 || ! bfd_set_section_alignment (htab
->root
.dynobj
,
6615 elf_section_data (sec
)->sreloc
= sreloc
;
6618 /* If this is a global symbol, we count the number of
6619 relocations we need for this symbol. */
6621 head
= &((struct elf_sh_link_hash_entry
*) h
)->dyn_relocs
;
6626 /* Track dynamic relocs needed for local syms too. */
6627 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
6632 head
= ((struct elf_sh_dyn_relocs
**)
6633 &elf_section_data (s
)->local_dynrel
);
6637 if (p
== NULL
|| p
->sec
!= sec
)
6639 bfd_size_type amt
= sizeof (*p
);
6640 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
6651 if (r_type
== R_SH_REL32
6652 #ifdef INCLUDE_SHMEDIA
6653 || r_type
== R_SH_IMM_LOW16_PCREL
6654 || r_type
== R_SH_IMM_MEDLOW16_PCREL
6655 || r_type
== R_SH_IMM_MEDHI16_PCREL
6656 || r_type
== R_SH_IMM_HI16_PCREL
6664 case R_SH_TLS_LE_32
:
6667 (*_bfd_error_handler
)
6668 (_("%B: TLS local exec code cannot be linked into shared objects"),
6675 case R_SH_TLS_LDO_32
:
6676 /* Nothing to do. */
6687 #ifndef sh_elf_set_mach_from_flags
6688 static unsigned int sh_ef_bfd_table
[] = { EF_SH_BFD_TABLE
};
6691 sh_elf_set_mach_from_flags (bfd
*abfd
)
6693 flagword flags
= elf_elfheader (abfd
)->e_flags
& EF_SH_MACH_MASK
;
6695 if (flags
>= sizeof(sh_ef_bfd_table
))
6698 if (sh_ef_bfd_table
[flags
] == 0)
6701 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, sh_ef_bfd_table
[flags
]);
6707 /* Reverse table lookup for sh_ef_bfd_table[].
6708 Given a bfd MACH value from archures.c
6709 return the equivalent ELF flags from the table.
6710 Return -1 if no match is found. */
6713 sh_elf_get_flags_from_mach (unsigned long mach
)
6715 int i
= ARRAY_SIZE (sh_ef_bfd_table
);
6718 if (sh_ef_bfd_table
[i
] == mach
)
6721 /* shouldn't get here */
6726 #endif /* not sh_elf_set_mach_from_flags */
6728 #ifndef sh_elf_set_private_flags
6729 /* Function to keep SH specific file flags. */
6732 sh_elf_set_private_flags (bfd
*abfd
, flagword flags
)
6734 BFD_ASSERT (! elf_flags_init (abfd
)
6735 || elf_elfheader (abfd
)->e_flags
== flags
);
6737 elf_elfheader (abfd
)->e_flags
= flags
;
6738 elf_flags_init (abfd
) = TRUE
;
6739 return sh_elf_set_mach_from_flags (abfd
);
6741 #endif /* not sh_elf_set_private_flags */
6743 #ifndef sh_elf_copy_private_data
6744 /* Copy backend specific data from one object module to another */
6747 sh_elf_copy_private_data (bfd
* ibfd
, bfd
* obfd
)
6749 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6750 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6753 return sh_elf_set_private_flags (obfd
, elf_elfheader (ibfd
)->e_flags
);
6755 #endif /* not sh_elf_copy_private_data */
6757 #ifndef sh_elf_merge_private_data
6759 /* This function returns the ELF architecture number that
6760 corresponds to the given arch_sh* flags. */
6763 sh_find_elf_flags (unsigned int arch_set
)
6765 extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int);
6766 unsigned long bfd_mach
= sh_get_bfd_mach_from_arch_set (arch_set
);
6768 return sh_elf_get_flags_from_mach (bfd_mach
);
6771 /* This routine initialises the elf flags when required and
6772 calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */
6775 sh_elf_merge_private_data (bfd
*ibfd
, bfd
*obfd
)
6777 extern bfd_boolean
sh_merge_bfd_arch (bfd
*, bfd
*);
6779 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6780 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6783 if (! elf_flags_init (obfd
))
6785 /* This happens when ld starts out with a 'blank' output file. */
6786 elf_flags_init (obfd
) = TRUE
;
6787 elf_elfheader (obfd
)->e_flags
= EF_SH1
;
6788 sh_elf_set_mach_from_flags (obfd
);
6791 if (! sh_merge_bfd_arch (ibfd
, obfd
))
6793 _bfd_error_handler ("%B: uses instructions which are incompatible "
6794 "with instructions used in previous modules",
6796 bfd_set_error (bfd_error_bad_value
);
6800 elf_elfheader (obfd
)->e_flags
=
6801 sh_elf_get_flags_from_mach (bfd_get_mach (obfd
));
6805 #endif /* not sh_elf_merge_private_data */
6807 /* Override the generic function because we need to store sh_elf_obj_tdata
6808 as the specific tdata. We set also the machine architecture from flags
6812 sh_elf_object_p (bfd
*abfd
)
6814 return sh_elf_set_mach_from_flags (abfd
);
6817 /* Finish up dynamic symbol handling. We set the contents of various
6818 dynamic sections here. */
6821 sh_elf_finish_dynamic_symbol (bfd
*output_bfd
, struct bfd_link_info
*info
,
6822 struct elf_link_hash_entry
*h
,
6823 Elf_Internal_Sym
*sym
)
6825 struct elf_sh_link_hash_table
*htab
;
6827 htab
= sh_elf_hash_table (info
);
6829 if (h
->plt
.offset
!= (bfd_vma
) -1)
6837 Elf_Internal_Rela rel
;
6840 /* This symbol has an entry in the procedure linkage table. Set
6843 BFD_ASSERT (h
->dynindx
!= -1);
6846 sgot
= htab
->sgotplt
;
6847 srel
= htab
->srelplt
;
6848 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srel
!= NULL
);
6850 /* Get the index in the procedure linkage table which
6851 corresponds to this symbol. This is the index of this symbol
6852 in all the symbols for which we are making plt entries. The
6853 first entry in the procedure linkage table is reserved. */
6854 plt_index
= h
->plt
.offset
/ elf_sh_sizeof_plt (info
) - 1;
6856 /* Get the offset into the .got table of the entry that
6857 corresponds to this function. Each .got entry is 4 bytes.
6858 The first three are reserved. */
6859 got_offset
= (plt_index
+ 3) * 4;
6863 got_offset
-= GOT_BIAS
;
6866 /* Fill in the entry in the procedure linkage table. */
6869 if (elf_sh_plt_entry
== NULL
)
6871 elf_sh_plt_entry
= (bfd_big_endian (output_bfd
) ?
6872 elf_sh_plt_entry_be
: elf_sh_plt_entry_le
);
6874 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_plt_entry
,
6875 elf_sh_sizeof_plt (info
));
6876 #ifdef INCLUDE_SHMEDIA
6877 movi_shori_putval (output_bfd
,
6878 (sgot
->output_section
->vma
6879 + sgot
->output_offset
6881 (splt
->contents
+ h
->plt
.offset
6882 + elf_sh_plt_symbol_offset (info
)));
6884 /* Set bottom bit because its for a branch to SHmedia */
6885 movi_shori_putval (output_bfd
,
6886 (splt
->output_section
->vma
+ splt
->output_offset
)
6888 (splt
->contents
+ h
->plt
.offset
6889 + elf_sh_plt_plt0_offset (info
)));
6891 bfd_put_32 (output_bfd
,
6892 (sgot
->output_section
->vma
6893 + sgot
->output_offset
6895 (splt
->contents
+ h
->plt
.offset
6896 + elf_sh_plt_symbol_offset (info
)));
6898 bfd_put_32 (output_bfd
,
6899 (splt
->output_section
->vma
+ splt
->output_offset
),
6900 (splt
->contents
+ h
->plt
.offset
6901 + elf_sh_plt_plt0_offset (info
)));
6906 if (elf_sh_pic_plt_entry
== NULL
)
6908 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
6909 elf_sh_pic_plt_entry_be
:
6910 elf_sh_pic_plt_entry_le
);
6912 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_pic_plt_entry
,
6913 elf_sh_sizeof_plt (info
));
6914 #ifdef INCLUDE_SHMEDIA
6915 movi_shori_putval (output_bfd
, got_offset
,
6916 (splt
->contents
+ h
->plt
.offset
6917 + elf_sh_plt_symbol_offset (info
)));
6919 bfd_put_32 (output_bfd
, got_offset
,
6920 (splt
->contents
+ h
->plt
.offset
6921 + elf_sh_plt_symbol_offset (info
)));
6927 got_offset
+= GOT_BIAS
;
6930 #ifdef INCLUDE_SHMEDIA
6931 movi_shori_putval (output_bfd
,
6932 plt_index
* sizeof (Elf32_External_Rela
),
6933 (splt
->contents
+ h
->plt
.offset
6934 + elf_sh_plt_reloc_offset (info
)));
6936 bfd_put_32 (output_bfd
, plt_index
* sizeof (Elf32_External_Rela
),
6937 (splt
->contents
+ h
->plt
.offset
6938 + elf_sh_plt_reloc_offset (info
)));
6941 /* Fill in the entry in the global offset table. */
6942 bfd_put_32 (output_bfd
,
6943 (splt
->output_section
->vma
6944 + splt
->output_offset
6946 + elf_sh_plt_temp_offset (info
)),
6947 sgot
->contents
+ got_offset
);
6949 /* Fill in the entry in the .rela.plt section. */
6950 rel
.r_offset
= (sgot
->output_section
->vma
6951 + sgot
->output_offset
6953 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_JMP_SLOT
);
6956 rel
.r_addend
= GOT_BIAS
;
6958 loc
= srel
->contents
+ plt_index
* sizeof (Elf32_External_Rela
);
6959 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
6961 if (!h
->def_regular
)
6963 /* Mark the symbol as undefined, rather than as defined in
6964 the .plt section. Leave the value alone. */
6965 sym
->st_shndx
= SHN_UNDEF
;
6969 if (h
->got
.offset
!= (bfd_vma
) -1
6970 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_GD
6971 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_IE
)
6975 Elf_Internal_Rela rel
;
6978 /* This symbol has an entry in the global offset table. Set it
6982 srel
= htab
->srelgot
;
6983 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
6985 rel
.r_offset
= (sgot
->output_section
->vma
6986 + sgot
->output_offset
6987 + (h
->got
.offset
&~ (bfd_vma
) 1));
6989 /* If this is a static link, or it is a -Bsymbolic link and the
6990 symbol is defined locally or was forced to be local because
6991 of a version file, we just want to emit a RELATIVE reloc.
6992 The entry in the global offset table will already have been
6993 initialized in the relocate_section function. */
6995 && SYMBOL_REFERENCES_LOCAL (info
, h
))
6997 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
6998 rel
.r_addend
= (h
->root
.u
.def
.value
6999 + h
->root
.u
.def
.section
->output_section
->vma
7000 + h
->root
.u
.def
.section
->output_offset
);
7004 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
7005 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
7009 loc
= srel
->contents
;
7010 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7011 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7014 #ifdef INCLUDE_SHMEDIA
7016 struct elf_sh_link_hash_entry
*eh
;
7018 eh
= (struct elf_sh_link_hash_entry
*) h
;
7019 if (eh
->datalabel_got
.offset
!= (bfd_vma
) -1)
7023 Elf_Internal_Rela rel
;
7026 /* This symbol has a datalabel entry in the global offset table.
7030 srel
= htab
->srelgot
;
7031 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
7033 rel
.r_offset
= (sgot
->output_section
->vma
7034 + sgot
->output_offset
7035 + (eh
->datalabel_got
.offset
&~ (bfd_vma
) 1));
7037 /* If this is a static link, or it is a -Bsymbolic link and the
7038 symbol is defined locally or was forced to be local because
7039 of a version file, we just want to emit a RELATIVE reloc.
7040 The entry in the global offset table will already have been
7041 initialized in the relocate_section function. */
7043 && SYMBOL_REFERENCES_LOCAL (info
, h
))
7045 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
7046 rel
.r_addend
= (h
->root
.u
.def
.value
7047 + h
->root
.u
.def
.section
->output_section
->vma
7048 + h
->root
.u
.def
.section
->output_offset
);
7052 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
7053 + eh
->datalabel_got
.offset
);
7054 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
7058 loc
= srel
->contents
;
7059 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7060 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7068 Elf_Internal_Rela rel
;
7071 /* This symbol needs a copy reloc. Set it up. */
7073 BFD_ASSERT (h
->dynindx
!= -1
7074 && (h
->root
.type
== bfd_link_hash_defined
7075 || h
->root
.type
== bfd_link_hash_defweak
));
7077 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
7079 BFD_ASSERT (s
!= NULL
);
7081 rel
.r_offset
= (h
->root
.u
.def
.value
7082 + h
->root
.u
.def
.section
->output_section
->vma
7083 + h
->root
.u
.def
.section
->output_offset
);
7084 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_COPY
);
7086 loc
= s
->contents
+ s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7087 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7090 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
7091 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
7092 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
7093 sym
->st_shndx
= SHN_ABS
;
7098 /* Finish up the dynamic sections. */
7101 sh_elf_finish_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
7103 struct elf_sh_link_hash_table
*htab
;
7107 htab
= sh_elf_hash_table (info
);
7108 sgot
= htab
->sgotplt
;
7109 sdyn
= bfd_get_section_by_name (htab
->root
.dynobj
, ".dynamic");
7111 if (htab
->root
.dynamic_sections_created
)
7114 Elf32_External_Dyn
*dyncon
, *dynconend
;
7116 BFD_ASSERT (sgot
!= NULL
&& sdyn
!= NULL
);
7118 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
7119 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
7120 for (; dyncon
< dynconend
; dyncon
++)
7122 Elf_Internal_Dyn dyn
;
7124 #ifdef INCLUDE_SHMEDIA
7128 bfd_elf32_swap_dyn_in (htab
->root
.dynobj
, dyncon
, &dyn
);
7135 #ifdef INCLUDE_SHMEDIA
7137 name
= info
->init_function
;
7141 name
= info
->fini_function
;
7143 if (dyn
.d_un
.d_val
!= 0)
7145 struct elf_link_hash_entry
*h
;
7147 h
= elf_link_hash_lookup (&htab
->root
, name
,
7148 FALSE
, FALSE
, TRUE
);
7149 if (h
!= NULL
&& (h
->other
& STO_SH5_ISA32
))
7151 dyn
.d_un
.d_val
|= 1;
7152 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7159 s
= htab
->sgot
->output_section
;
7163 s
= htab
->srelplt
->output_section
;
7165 BFD_ASSERT (s
!= NULL
);
7166 dyn
.d_un
.d_ptr
= s
->vma
;
7167 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7171 s
= htab
->srelplt
->output_section
;
7172 BFD_ASSERT (s
!= NULL
);
7173 dyn
.d_un
.d_val
= s
->size
;
7174 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7178 /* My reading of the SVR4 ABI indicates that the
7179 procedure linkage table relocs (DT_JMPREL) should be
7180 included in the overall relocs (DT_RELA). This is
7181 what Solaris does. However, UnixWare can not handle
7182 that case. Therefore, we override the DT_RELASZ entry
7183 here to make it not include the JMPREL relocs. Since
7184 the linker script arranges for .rela.plt to follow all
7185 other relocation sections, we don't have to worry
7186 about changing the DT_RELA entry. */
7187 if (htab
->srelplt
!= NULL
)
7189 s
= htab
->srelplt
->output_section
;
7190 dyn
.d_un
.d_val
-= s
->size
;
7192 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7197 /* Fill in the first entry in the procedure linkage table. */
7199 if (splt
&& splt
->size
> 0)
7203 if (elf_sh_pic_plt_entry
== NULL
)
7205 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
7206 elf_sh_pic_plt_entry_be
:
7207 elf_sh_pic_plt_entry_le
);
7209 memcpy (splt
->contents
, elf_sh_pic_plt_entry
,
7210 elf_sh_sizeof_plt (info
));
7214 if (elf_sh_plt0_entry
== NULL
)
7216 elf_sh_plt0_entry
= (bfd_big_endian (output_bfd
) ?
7217 elf_sh_plt0_entry_be
:
7218 elf_sh_plt0_entry_le
);
7220 memcpy (splt
->contents
, elf_sh_plt0_entry
, PLT_ENTRY_SIZE
);
7221 #ifdef INCLUDE_SHMEDIA
7222 movi_shori_putval (output_bfd
,
7223 sgot
->output_section
->vma
7224 + sgot
->output_offset
,
7226 + elf_sh_plt0_gotplt_offset (info
));
7228 bfd_put_32 (output_bfd
,
7229 sgot
->output_section
->vma
+ sgot
->output_offset
+ 4,
7230 splt
->contents
+ elf_sh_plt0_gotid_offset (info
));
7231 bfd_put_32 (output_bfd
,
7232 sgot
->output_section
->vma
+ sgot
->output_offset
+ 8,
7233 splt
->contents
+ elf_sh_plt0_linker_offset (info
));
7237 /* UnixWare sets the entsize of .plt to 4, although that doesn't
7238 really seem like the right value. */
7239 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
7243 /* Fill in the first three entries in the global offset table. */
7244 if (sgot
&& sgot
->size
> 0)
7247 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
7249 bfd_put_32 (output_bfd
,
7250 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
7252 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
7253 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
7255 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
7261 static enum elf_reloc_type_class
7262 sh_elf_reloc_type_class (const Elf_Internal_Rela
*rela
)
7264 switch ((int) ELF32_R_TYPE (rela
->r_info
))
7267 return reloc_class_relative
;
7269 return reloc_class_plt
;
7271 return reloc_class_copy
;
7273 return reloc_class_normal
;
7277 #if !defined SH_TARGET_ALREADY_DEFINED
7278 /* Support for Linux core dump NOTE sections. */
7281 elf32_shlin_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
7286 switch (note
->descsz
)
7291 case 168: /* Linux/SH */
7293 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
7296 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
7305 /* Make a ".reg/999" section. */
7306 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
7307 size
, note
->descpos
+ offset
);
7311 elf32_shlin_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
7313 switch (note
->descsz
)
7318 case 124: /* Linux/SH elf_prpsinfo */
7319 elf_tdata (abfd
)->core_program
7320 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
7321 elf_tdata (abfd
)->core_command
7322 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
7325 /* Note that for some reason, a spurious space is tacked
7326 onto the end of the args in some (at least one anyway)
7327 implementations, so strip it off if it exists. */
7330 char *command
= elf_tdata (abfd
)->core_command
;
7331 int n
= strlen (command
);
7333 if (0 < n
&& command
[n
- 1] == ' ')
7334 command
[n
- 1] = '\0';
7339 #endif /* not SH_TARGET_ALREADY_DEFINED */
7342 /* Return address for Ith PLT stub in section PLT, for relocation REL
7343 or (bfd_vma) -1 if it should not be included. */
7346 sh_elf_plt_sym_val (bfd_vma i
, const asection
*plt
,
7347 const arelent
*rel ATTRIBUTE_UNUSED
)
7349 return plt
->vma
+ (i
+ 1) * PLT_ENTRY_SIZE
;
7352 #if !defined SH_TARGET_ALREADY_DEFINED
7353 #define TARGET_BIG_SYM bfd_elf32_sh_vec
7354 #define TARGET_BIG_NAME "elf32-sh"
7355 #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
7356 #define TARGET_LITTLE_NAME "elf32-shl"
7359 #define ELF_ARCH bfd_arch_sh
7360 #define ELF_MACHINE_CODE EM_SH
7361 #ifdef __QNXTARGET__
7362 #define ELF_MAXPAGESIZE 0x1000
7364 #define ELF_MAXPAGESIZE 0x80
7367 #define elf_symbol_leading_char '_'
7369 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
7370 #define elf_info_to_howto sh_elf_info_to_howto
7371 #define bfd_elf32_bfd_relax_section sh_elf_relax_section
7372 #define elf_backend_relocate_section sh_elf_relocate_section
7373 #define bfd_elf32_bfd_get_relocated_section_contents \
7374 sh_elf_get_relocated_section_contents
7375 #define bfd_elf32_mkobject sh_elf_mkobject
7376 #define elf_backend_object_p sh_elf_object_p
7377 #define bfd_elf32_bfd_set_private_bfd_flags \
7378 sh_elf_set_private_flags
7379 #define bfd_elf32_bfd_copy_private_bfd_data \
7380 sh_elf_copy_private_data
7381 #define bfd_elf32_bfd_merge_private_bfd_data \
7382 sh_elf_merge_private_data
7384 #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
7385 #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
7386 #define elf_backend_check_relocs sh_elf_check_relocs
7387 #define elf_backend_copy_indirect_symbol \
7388 sh_elf_copy_indirect_symbol
7389 #define elf_backend_create_dynamic_sections \
7390 sh_elf_create_dynamic_sections
7391 #define bfd_elf32_bfd_link_hash_table_create \
7392 sh_elf_link_hash_table_create
7393 #define elf_backend_adjust_dynamic_symbol \
7394 sh_elf_adjust_dynamic_symbol
7395 #define elf_backend_size_dynamic_sections \
7396 sh_elf_size_dynamic_sections
7397 #define elf_backend_finish_dynamic_symbol \
7398 sh_elf_finish_dynamic_symbol
7399 #define elf_backend_finish_dynamic_sections \
7400 sh_elf_finish_dynamic_sections
7401 #define elf_backend_reloc_type_class sh_elf_reloc_type_class
7402 #define elf_backend_plt_sym_val sh_elf_plt_sym_val
7404 #define elf_backend_can_gc_sections 1
7405 #define elf_backend_can_refcount 1
7406 #define elf_backend_want_got_plt 1
7407 #define elf_backend_plt_readonly 1
7408 #define elf_backend_want_plt_sym 0
7409 #define elf_backend_got_header_size 12
7411 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
7413 #include "elf32-target.h"
7415 /* NetBSD support. */
7416 #undef TARGET_BIG_SYM
7417 #define TARGET_BIG_SYM bfd_elf32_shnbsd_vec
7418 #undef TARGET_BIG_NAME
7419 #define TARGET_BIG_NAME "elf32-sh-nbsd"
7420 #undef TARGET_LITTLE_SYM
7421 #define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec
7422 #undef TARGET_LITTLE_NAME
7423 #define TARGET_LITTLE_NAME "elf32-shl-nbsd"
7424 #undef ELF_MAXPAGESIZE
7425 #define ELF_MAXPAGESIZE 0x10000
7426 #undef elf_symbol_leading_char
7427 #define elf_symbol_leading_char 0
7429 #define elf32_bed elf32_sh_nbsd_bed
7431 #include "elf32-target.h"
7434 /* Linux support. */
7435 #undef TARGET_BIG_SYM
7436 #define TARGET_BIG_SYM bfd_elf32_shblin_vec
7437 #undef TARGET_BIG_NAME
7438 #define TARGET_BIG_NAME "elf32-shbig-linux"
7439 #undef TARGET_LITTLE_SYM
7440 #define TARGET_LITTLE_SYM bfd_elf32_shlin_vec
7441 #undef TARGET_LITTLE_NAME
7442 #define TARGET_LITTLE_NAME "elf32-sh-linux"
7444 #undef elf_backend_grok_prstatus
7445 #define elf_backend_grok_prstatus elf32_shlin_grok_prstatus
7446 #undef elf_backend_grok_psinfo
7447 #define elf_backend_grok_psinfo elf32_shlin_grok_psinfo
7449 #define elf32_bed elf32_sh_lin_bed
7451 #include "elf32-target.h"
7453 #endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */