1 /* Renesas / SuperH SH specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
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 if (ELF32_R_SYM (irelfn
->r_info
) < symtab_hdr
->sh_info
)
2389 /* If this needs to be changed because of future relaxing,
2390 it will be handled here like other internal IND12W
2393 (bfd_vma
) 0xb000 | ((foff
>> 1) & 0xfff),
2394 contents
+ irel
->r_offset
);
2399 /* We can't fully resolve this yet, because the external
2400 symbol value may be changed by future relaxing. We let
2401 the final link phase handle it. */
2402 bfd_put_16 (abfd
, (bfd_vma
) 0xb000, contents
+ irel
->r_offset
);
2404 irel
->r_addend
= -4;
2406 /* See if there is another R_SH_USES reloc referring to the same
2408 for (irelscan
= internal_relocs
; irelscan
< irelend
; irelscan
++)
2409 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_USES
2410 && laddr
== irelscan
->r_offset
+ 4 + irelscan
->r_addend
)
2412 if (irelscan
< irelend
)
2414 /* Some other function call depends upon this register load,
2415 and we have not yet converted that function call.
2416 Indeed, we may never be able to convert it. There is
2417 nothing else we can do at this point. */
2421 /* Look for a R_SH_COUNT reloc on the location where the
2422 function address is stored. Do this before deleting any
2423 bytes, to avoid confusion about the address. */
2424 for (irelcount
= internal_relocs
; irelcount
< irelend
; irelcount
++)
2425 if (irelcount
->r_offset
== paddr
2426 && ELF32_R_TYPE (irelcount
->r_info
) == (int) R_SH_COUNT
)
2429 /* Delete the register load. */
2430 if (! sh_elf_relax_delete_bytes (abfd
, sec
, laddr
, 2))
2433 /* That will change things, so, just in case it permits some
2434 other function call to come within range, we should relax
2435 again. Note that this is not required, and it may be slow. */
2438 /* Now check whether we got a COUNT reloc. */
2439 if (irelcount
>= irelend
)
2441 ((*_bfd_error_handler
)
2442 (_("%B: 0x%lx: warning: could not find expected COUNT reloc"),
2443 abfd
, (unsigned long) paddr
));
2447 /* The number of uses is stored in the r_addend field. We've
2448 just deleted one. */
2449 if (irelcount
->r_addend
== 0)
2451 ((*_bfd_error_handler
) (_("%B: 0x%lx: warning: bad count"),
2453 (unsigned long) paddr
));
2457 --irelcount
->r_addend
;
2459 /* If there are no more uses, we can delete the address. Reload
2460 the address from irelfn, in case it was changed by the
2461 previous call to sh_elf_relax_delete_bytes. */
2462 if (irelcount
->r_addend
== 0)
2464 if (! sh_elf_relax_delete_bytes (abfd
, sec
, irelfn
->r_offset
, 4))
2468 /* We've done all we can with that function call. */
2471 /* Look for load and store instructions that we can align on four
2473 if ((elf_elfheader (abfd
)->e_flags
& EF_SH_MACH_MASK
) != EF_SH4
2476 bfd_boolean swapped
;
2478 /* Get the section contents. */
2479 if (contents
== NULL
)
2481 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2482 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2485 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2490 if (! sh_elf_align_loads (abfd
, sec
, internal_relocs
, contents
,
2496 elf_section_data (sec
)->relocs
= internal_relocs
;
2497 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2498 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2503 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2505 if (! link_info
->keep_memory
)
2509 /* Cache the symbols for elf_link_input_bfd. */
2510 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2514 if (contents
!= NULL
2515 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2517 if (! link_info
->keep_memory
)
2521 /* Cache the section contents for elf_link_input_bfd. */
2522 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2526 if (internal_relocs
!= NULL
2527 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2528 free (internal_relocs
);
2534 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2536 if (contents
!= NULL
2537 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2539 if (internal_relocs
!= NULL
2540 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2541 free (internal_relocs
);
2546 /* Delete some bytes from a section while relaxing. FIXME: There is a
2547 lot of duplication between this function and sh_relax_delete_bytes
2551 sh_elf_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
,
2554 Elf_Internal_Shdr
*symtab_hdr
;
2555 unsigned int sec_shndx
;
2557 Elf_Internal_Rela
*irel
, *irelend
;
2558 Elf_Internal_Rela
*irelalign
;
2560 Elf_Internal_Sym
*isymbuf
, *isym
, *isymend
;
2561 struct elf_link_hash_entry
**sym_hashes
;
2562 struct elf_link_hash_entry
**end_hashes
;
2563 unsigned int symcount
;
2566 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2567 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2569 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2571 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2573 /* The deletion must stop at the next ALIGN reloc for an aligment
2574 power larger than the number of bytes we are deleting. */
2579 irel
= elf_section_data (sec
)->relocs
;
2580 irelend
= irel
+ sec
->reloc_count
;
2581 for (; irel
< irelend
; irel
++)
2583 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2584 && irel
->r_offset
> addr
2585 && count
< (1 << irel
->r_addend
))
2588 toaddr
= irel
->r_offset
;
2593 /* Actually delete the bytes. */
2594 memmove (contents
+ addr
, contents
+ addr
+ count
,
2595 (size_t) (toaddr
- addr
- count
));
2596 if (irelalign
== NULL
)
2602 #define NOP_OPCODE (0x0009)
2604 BFD_ASSERT ((count
& 1) == 0);
2605 for (i
= 0; i
< count
; i
+= 2)
2606 bfd_put_16 (abfd
, (bfd_vma
) NOP_OPCODE
, contents
+ toaddr
- count
+ i
);
2609 /* Adjust all the relocs. */
2610 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
2612 bfd_vma nraddr
, stop
;
2615 int off
, adjust
, oinsn
;
2616 bfd_signed_vma voff
= 0;
2617 bfd_boolean overflow
;
2619 /* Get the new reloc address. */
2620 nraddr
= irel
->r_offset
;
2621 if ((irel
->r_offset
> addr
2622 && irel
->r_offset
< toaddr
)
2623 || (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2624 && irel
->r_offset
== toaddr
))
2627 /* See if this reloc was for the bytes we have deleted, in which
2628 case we no longer care about it. Don't delete relocs which
2629 represent addresses, though. */
2630 if (irel
->r_offset
>= addr
2631 && irel
->r_offset
< addr
+ count
2632 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_ALIGN
2633 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
2634 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_DATA
2635 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_LABEL
)
2636 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2639 /* If this is a PC relative reloc, see if the range it covers
2640 includes the bytes we have deleted. */
2641 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2650 start
= irel
->r_offset
;
2651 insn
= bfd_get_16 (abfd
, contents
+ nraddr
);
2655 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2658 start
= stop
= addr
;
2662 /* If this reloc is against a symbol defined in this
2663 section, and the symbol will not be adjusted below, we
2664 must check the addend to see it will put the value in
2665 range to be adjusted, and hence must be changed. */
2666 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2668 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
2669 if (isym
->st_shndx
== sec_shndx
2670 && (isym
->st_value
<= addr
2671 || isym
->st_value
>= toaddr
))
2675 val
= bfd_get_32 (abfd
, contents
+ nraddr
);
2676 val
+= isym
->st_value
;
2677 if (val
> addr
&& val
< toaddr
)
2678 bfd_put_32 (abfd
, val
- count
, contents
+ nraddr
);
2681 start
= stop
= addr
;
2688 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2695 /* This has been made by previous relaxation. Since the
2696 relocation will be against an external symbol, the
2697 final relocation will just do the right thing. */
2698 start
= stop
= addr
;
2704 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2706 /* The addend will be against the section symbol, thus
2707 for adjusting the addend, the relevant start is the
2708 start of the section.
2709 N.B. If we want to abandon in-place changes here and
2710 test directly using symbol + addend, we have to take into
2711 account that the addend has already been adjusted by -4. */
2712 if (stop
> addr
&& stop
< toaddr
)
2713 irel
->r_addend
-= count
;
2719 stop
= start
+ 4 + off
* 2;
2724 stop
= (start
& ~(bfd_vma
) 3) + 4 + off
* 4;
2730 /* These relocs types represent
2732 The r_addend field holds the difference between the reloc
2733 address and L1. That is the start of the reloc, and
2734 adding in the contents gives us the top. We must adjust
2735 both the r_offset field and the section contents.
2736 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
2737 and the elf bfd r_offset is called r_vaddr. */
2739 stop
= irel
->r_offset
;
2740 start
= (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irel
->r_addend
);
2744 && (stop
<= addr
|| stop
>= toaddr
))
2745 irel
->r_addend
+= count
;
2746 else if (stop
> addr
2748 && (start
<= addr
|| start
>= toaddr
))
2749 irel
->r_addend
-= count
;
2751 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH16
)
2752 voff
= bfd_get_signed_16 (abfd
, contents
+ nraddr
);
2753 else if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH8
)
2754 voff
= bfd_get_8 (abfd
, contents
+ nraddr
);
2756 voff
= bfd_get_signed_32 (abfd
, contents
+ nraddr
);
2757 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2762 start
= irel
->r_offset
;
2763 stop
= (bfd_vma
) ((bfd_signed_vma
) start
2764 + (long) irel
->r_addend
2771 && (stop
<= addr
|| stop
>= toaddr
))
2773 else if (stop
> addr
2775 && (start
<= addr
|| start
>= toaddr
))
2784 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2793 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2795 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2800 if ((oinsn
& 0xf000) != (insn
& 0xf000))
2802 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2806 BFD_ASSERT (adjust
== count
|| count
>= 4);
2811 if ((irel
->r_offset
& 3) == 0)
2814 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2816 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2821 if (voff
< 0 || voff
>= 0xff)
2823 bfd_put_8 (abfd
, voff
, contents
+ nraddr
);
2828 if (voff
< - 0x8000 || voff
>= 0x8000)
2830 bfd_put_signed_16 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2835 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2839 irel
->r_addend
+= adjust
;
2845 ((*_bfd_error_handler
)
2846 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
2847 abfd
, (unsigned long) irel
->r_offset
));
2848 bfd_set_error (bfd_error_bad_value
);
2853 irel
->r_offset
= nraddr
;
2856 /* Look through all the other sections. If there contain any IMM32
2857 relocs against internal symbols which we are not going to adjust
2858 below, we may need to adjust the addends. */
2859 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2861 Elf_Internal_Rela
*internal_relocs
;
2862 Elf_Internal_Rela
*irelscan
, *irelscanend
;
2863 bfd_byte
*ocontents
;
2866 || (o
->flags
& SEC_RELOC
) == 0
2867 || o
->reloc_count
== 0)
2870 /* We always cache the relocs. Perhaps, if info->keep_memory is
2871 FALSE, we should free them, if we are permitted to, when we
2872 leave sh_coff_relax_section. */
2873 internal_relocs
= (_bfd_elf_link_read_relocs
2874 (abfd
, o
, NULL
, (Elf_Internal_Rela
*) NULL
, TRUE
));
2875 if (internal_relocs
== NULL
)
2879 irelscanend
= internal_relocs
+ o
->reloc_count
;
2880 for (irelscan
= internal_relocs
; irelscan
< irelscanend
; irelscan
++)
2882 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
2883 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_SWITCH32
)
2885 bfd_vma start
, stop
;
2886 bfd_signed_vma voff
;
2888 if (ocontents
== NULL
)
2890 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2891 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2894 /* We always cache the section contents.
2895 Perhaps, if info->keep_memory is FALSE, we
2896 should free them, if we are permitted to,
2897 when we leave sh_coff_relax_section. */
2898 if (!bfd_malloc_and_get_section (abfd
, o
, &ocontents
))
2900 if (ocontents
!= NULL
)
2905 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2909 stop
= irelscan
->r_offset
;
2911 = (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irelscan
->r_addend
);
2913 /* STOP is in a different section, so it won't change. */
2914 if (start
> addr
&& start
< toaddr
)
2915 irelscan
->r_addend
+= count
;
2917 voff
= bfd_get_signed_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2918 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2922 && (stop
<= addr
|| stop
>= toaddr
))
2923 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
+ count
,
2924 ocontents
+ irelscan
->r_offset
);
2925 else if (stop
> addr
2927 && (start
<= addr
|| start
>= toaddr
))
2928 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
- count
,
2929 ocontents
+ irelscan
->r_offset
);
2932 if (ELF32_R_TYPE (irelscan
->r_info
) != (int) R_SH_DIR32
)
2935 if (ELF32_R_SYM (irelscan
->r_info
) >= symtab_hdr
->sh_info
)
2939 isym
= isymbuf
+ ELF32_R_SYM (irelscan
->r_info
);
2940 if (isym
->st_shndx
== sec_shndx
2941 && (isym
->st_value
<= addr
2942 || isym
->st_value
>= toaddr
))
2946 if (ocontents
== NULL
)
2948 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2949 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2952 /* We always cache the section contents.
2953 Perhaps, if info->keep_memory is FALSE, we
2954 should free them, if we are permitted to,
2955 when we leave sh_coff_relax_section. */
2956 if (!bfd_malloc_and_get_section (abfd
, o
, &ocontents
))
2958 if (ocontents
!= NULL
)
2963 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2967 val
= bfd_get_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2968 val
+= isym
->st_value
;
2969 if (val
> addr
&& val
< toaddr
)
2970 bfd_put_32 (abfd
, val
- count
,
2971 ocontents
+ irelscan
->r_offset
);
2976 /* Adjust the local symbols defined in this section. */
2977 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2978 for (isym
= isymbuf
; isym
< isymend
; isym
++)
2980 if (isym
->st_shndx
== sec_shndx
2981 && isym
->st_value
> addr
2982 && isym
->st_value
< toaddr
)
2983 isym
->st_value
-= count
;
2986 /* Now adjust the global symbols defined in this section. */
2987 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2988 - symtab_hdr
->sh_info
);
2989 sym_hashes
= elf_sym_hashes (abfd
);
2990 end_hashes
= sym_hashes
+ symcount
;
2991 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2993 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
2994 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2995 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2996 && sym_hash
->root
.u
.def
.section
== sec
2997 && sym_hash
->root
.u
.def
.value
> addr
2998 && sym_hash
->root
.u
.def
.value
< toaddr
)
3000 sym_hash
->root
.u
.def
.value
-= count
;
3004 /* See if we can move the ALIGN reloc forward. We have adjusted
3005 r_offset for it already. */
3006 if (irelalign
!= NULL
)
3008 bfd_vma alignto
, alignaddr
;
3010 alignto
= BFD_ALIGN (toaddr
, 1 << irelalign
->r_addend
);
3011 alignaddr
= BFD_ALIGN (irelalign
->r_offset
,
3012 1 << irelalign
->r_addend
);
3013 if (alignto
!= alignaddr
)
3015 /* Tail recursion. */
3016 return sh_elf_relax_delete_bytes (abfd
, sec
, alignaddr
,
3017 (int) (alignto
- alignaddr
));
3024 /* Look for loads and stores which we can align to four byte
3025 boundaries. This is like sh_align_loads in coff-sh.c. */
3028 sh_elf_align_loads (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
,
3029 Elf_Internal_Rela
*internal_relocs
,
3030 bfd_byte
*contents ATTRIBUTE_UNUSED
,
3031 bfd_boolean
*pswapped
)
3033 Elf_Internal_Rela
*irel
, *irelend
;
3034 bfd_vma
*labels
= NULL
;
3035 bfd_vma
*label
, *label_end
;
3040 irelend
= internal_relocs
+ sec
->reloc_count
;
3042 /* Get all the addresses with labels on them. */
3043 amt
= sec
->reloc_count
;
3044 amt
*= sizeof (bfd_vma
);
3045 labels
= (bfd_vma
*) bfd_malloc (amt
);
3049 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3051 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_LABEL
)
3053 *label_end
= irel
->r_offset
;
3058 /* Note that the assembler currently always outputs relocs in
3059 address order. If that ever changes, this code will need to sort
3060 the label values and the relocs. */
3064 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3066 bfd_vma start
, stop
;
3068 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
)
3071 start
= irel
->r_offset
;
3073 for (irel
++; irel
< irelend
; irel
++)
3074 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_DATA
)
3077 stop
= irel
->r_offset
;
3081 if (! _bfd_sh_align_load_span (abfd
, sec
, contents
, sh_elf_swap_insns
,
3082 internal_relocs
, &label
,
3083 label_end
, start
, stop
, pswapped
))
3098 /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
3101 sh_elf_swap_insns (bfd
*abfd
, asection
*sec
, void *relocs
,
3102 bfd_byte
*contents
, bfd_vma addr
)
3104 Elf_Internal_Rela
*internal_relocs
= (Elf_Internal_Rela
*) relocs
;
3105 unsigned short i1
, i2
;
3106 Elf_Internal_Rela
*irel
, *irelend
;
3108 /* Swap the instructions themselves. */
3109 i1
= bfd_get_16 (abfd
, contents
+ addr
);
3110 i2
= bfd_get_16 (abfd
, contents
+ addr
+ 2);
3111 bfd_put_16 (abfd
, (bfd_vma
) i2
, contents
+ addr
);
3112 bfd_put_16 (abfd
, (bfd_vma
) i1
, contents
+ addr
+ 2);
3114 /* Adjust all reloc addresses. */
3115 irelend
= internal_relocs
+ sec
->reloc_count
;
3116 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3118 enum elf_sh_reloc_type type
;
3121 /* There are a few special types of relocs that we don't want to
3122 adjust. These relocs do not apply to the instruction itself,
3123 but are only associated with the address. */
3124 type
= (enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
);
3125 if (type
== R_SH_ALIGN
3126 || type
== R_SH_CODE
3127 || type
== R_SH_DATA
3128 || type
== R_SH_LABEL
)
3131 /* If an R_SH_USES reloc points to one of the addresses being
3132 swapped, we must adjust it. It would be incorrect to do this
3133 for a jump, though, since we want to execute both
3134 instructions after the jump. (We have avoided swapping
3135 around a label, so the jump will not wind up executing an
3136 instruction it shouldn't). */
3137 if (type
== R_SH_USES
)
3141 off
= irel
->r_offset
+ 4 + irel
->r_addend
;
3143 irel
->r_offset
+= 2;
3144 else if (off
== addr
+ 2)
3145 irel
->r_offset
-= 2;
3148 if (irel
->r_offset
== addr
)
3150 irel
->r_offset
+= 2;
3153 else if (irel
->r_offset
== addr
+ 2)
3155 irel
->r_offset
-= 2;
3164 unsigned short insn
, oinsn
;
3165 bfd_boolean overflow
;
3167 loc
= contents
+ irel
->r_offset
;
3176 insn
= bfd_get_16 (abfd
, loc
);
3179 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3181 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3185 insn
= bfd_get_16 (abfd
, loc
);
3188 if ((oinsn
& 0xf000) != (insn
& 0xf000))
3190 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3194 /* This reloc ignores the least significant 3 bits of
3195 the program counter before adding in the offset.
3196 This means that if ADDR is at an even address, the
3197 swap will not affect the offset. If ADDR is an at an
3198 odd address, then the instruction will be crossing a
3199 four byte boundary, and must be adjusted. */
3200 if ((addr
& 3) != 0)
3202 insn
= bfd_get_16 (abfd
, loc
);
3205 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3207 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3215 ((*_bfd_error_handler
)
3216 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"),
3217 abfd
, (unsigned long) irel
->r_offset
));
3218 bfd_set_error (bfd_error_bad_value
);
3226 #endif /* defined SH64_ELF */
3228 #ifdef INCLUDE_SHMEDIA
3230 /* The size in bytes of an entry in the procedure linkage table. */
3232 #define PLT_ENTRY_SIZE 64
3234 /* First entry in an absolute procedure linkage table look like this. */
3236 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3238 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */
3239 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
3240 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3241 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3242 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3243 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3244 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3245 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3246 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3247 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3248 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3249 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3250 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3251 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3252 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3253 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3256 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3258 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */
3259 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
3260 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3261 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3262 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3263 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3264 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3265 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3266 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3267 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3268 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3269 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3270 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3271 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3272 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3273 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3276 /* Sebsequent entries in an absolute procedure linkage table look like
3279 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3281 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */
3282 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
3283 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */
3284 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3285 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3286 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3287 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3288 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3289 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */
3290 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
3291 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3292 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3293 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3294 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3295 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3296 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3299 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3301 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */
3302 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3303 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */
3304 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3305 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3306 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3307 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3308 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3309 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */
3310 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
3311 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3312 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3313 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3314 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3315 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3316 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3319 /* Entries in a PIC procedure linkage table look like this. */
3321 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3323 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */
3324 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3325 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
3326 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3327 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3328 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3329 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3330 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3331 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */
3332 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
3333 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3334 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3335 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3336 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3337 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3338 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3341 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3343 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */
3344 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3345 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
3346 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3347 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3348 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3349 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3350 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3351 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */
3352 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
3353 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3354 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3355 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3356 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3357 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3358 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3361 static const bfd_byte
*elf_sh_plt0_entry
;
3362 static const bfd_byte
*elf_sh_plt_entry
;
3363 static const bfd_byte
*elf_sh_pic_plt_entry
;
3365 /* Return size of a PLT entry. */
3366 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3368 /* Return offset of the PLT0 address in an absolute PLT entry. */
3369 #define elf_sh_plt_plt0_offset(info) 32
3371 /* Return offset of the linker in PLT0 entry. */
3372 #define elf_sh_plt0_gotplt_offset(info) 0
3374 /* Return offset of the trampoline in PLT entry */
3375 #define elf_sh_plt_temp_offset(info) 33 /* Add one because it's SHmedia. */
3377 /* Return offset of the symbol in PLT entry. */
3378 #define elf_sh_plt_symbol_offset(info) 0
3380 /* Return offset of the relocation in PLT entry. */
3381 #define elf_sh_plt_reloc_offset(info) (info->shared ? 52 : 44)
3384 movi_shori_putval (bfd
*output_bfd
, unsigned long value
, char *addr
)
3386 bfd_put_32 (output_bfd
,
3387 bfd_get_32 (output_bfd
, addr
)
3388 | ((value
>> 6) & 0x3fffc00),
3390 bfd_put_32 (output_bfd
,
3391 bfd_get_32 (output_bfd
, addr
+ 4)
3392 | ((value
<< 10) & 0x3fffc00),
3397 /* The size in bytes of an entry in the procedure linkage table. */
3399 #define PLT_ENTRY_SIZE 28
3401 /* First entry in an absolute procedure linkage table look like this. */
3404 /* Note - this code has been "optimised" not to use r2. r2 is used by
3405 GCC to return the address of large structures, so it should not be
3406 corrupted here. This does mean however, that this PLT does not conform
3407 to the SH PIC ABI. That spec says that r0 contains the type of the PLT
3408 and r2 contains the GOT id. This version stores the GOT id in r0 and
3409 ignores the type. Loaders can easily detect this difference however,
3410 since the type will always be 0 or 8, and the GOT ids will always be
3411 greater than or equal to 12. */
3412 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3414 0xd0, 0x05, /* mov.l 2f,r0 */
3415 0x60, 0x02, /* mov.l @r0,r0 */
3416 0x2f, 0x06, /* mov.l r0,@-r15 */
3417 0xd0, 0x03, /* mov.l 1f,r0 */
3418 0x60, 0x02, /* mov.l @r0,r0 */
3419 0x40, 0x2b, /* jmp @r0 */
3420 0x60, 0xf6, /* mov.l @r15+,r0 */
3421 0x00, 0x09, /* nop */
3422 0x00, 0x09, /* nop */
3423 0x00, 0x09, /* nop */
3424 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3425 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3428 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3430 0x05, 0xd0, /* mov.l 2f,r0 */
3431 0x02, 0x60, /* mov.l @r0,r0 */
3432 0x06, 0x2f, /* mov.l r0,@-r15 */
3433 0x03, 0xd0, /* mov.l 1f,r0 */
3434 0x02, 0x60, /* mov.l @r0,r0 */
3435 0x2b, 0x40, /* jmp @r0 */
3436 0xf6, 0x60, /* mov.l @r15+,r0 */
3437 0x09, 0x00, /* nop */
3438 0x09, 0x00, /* nop */
3439 0x09, 0x00, /* nop */
3440 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3441 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3444 /* Sebsequent entries in an absolute procedure linkage table look like
3447 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3449 0xd0, 0x04, /* mov.l 1f,r0 */
3450 0x60, 0x02, /* mov.l @r0,r0 */
3451 0xd1, 0x02, /* mov.l 0f,r1 */
3452 0x40, 0x2b, /* jmp @r0 */
3453 0x60, 0x13, /* mov r1,r0 */
3454 0xd1, 0x03, /* mov.l 2f,r1 */
3455 0x40, 0x2b, /* jmp @r0 */
3456 0x00, 0x09, /* nop */
3457 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3458 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3459 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3462 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3464 0x04, 0xd0, /* mov.l 1f,r0 */
3465 0x02, 0x60, /* mov.l @r0,r0 */
3466 0x02, 0xd1, /* mov.l 0f,r1 */
3467 0x2b, 0x40, /* jmp @r0 */
3468 0x13, 0x60, /* mov r1,r0 */
3469 0x03, 0xd1, /* mov.l 2f,r1 */
3470 0x2b, 0x40, /* jmp @r0 */
3471 0x09, 0x00, /* nop */
3472 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3473 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3474 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3477 /* Entries in a PIC procedure linkage table look like this. */
3479 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3481 0xd0, 0x04, /* mov.l 1f,r0 */
3482 0x00, 0xce, /* mov.l @(r0,r12),r0 */
3483 0x40, 0x2b, /* jmp @r0 */
3484 0x00, 0x09, /* nop */
3485 0x50, 0xc2, /* mov.l @(8,r12),r0 */
3486 0xd1, 0x03, /* mov.l 2f,r1 */
3487 0x40, 0x2b, /* jmp @r0 */
3488 0x50, 0xc1, /* mov.l @(4,r12),r0 */
3489 0x00, 0x09, /* nop */
3490 0x00, 0x09, /* nop */
3491 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3492 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3495 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3497 0x04, 0xd0, /* mov.l 1f,r0 */
3498 0xce, 0x00, /* mov.l @(r0,r12),r0 */
3499 0x2b, 0x40, /* jmp @r0 */
3500 0x09, 0x00, /* nop */
3501 0xc2, 0x50, /* mov.l @(8,r12),r0 */
3502 0x03, 0xd1, /* mov.l 2f,r1 */
3503 0x2b, 0x40, /* jmp @r0 */
3504 0xc1, 0x50, /* mov.l @(4,r12),r0 */
3505 0x09, 0x00, /* nop */
3506 0x09, 0x00, /* nop */
3507 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3508 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3511 #else /* These are the old style PLT entries. */
3512 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3514 0xd0, 0x04, /* mov.l 1f,r0 */
3515 0xd2, 0x05, /* mov.l 2f,r2 */
3516 0x60, 0x02, /* mov.l @r0,r0 */
3517 0x62, 0x22, /* mov.l @r2,r2 */
3518 0x40, 0x2b, /* jmp @r0 */
3519 0xe0, 0x00, /* mov #0,r0 */
3520 0x00, 0x09, /* nop */
3521 0x00, 0x09, /* nop */
3522 0x00, 0x09, /* nop */
3523 0x00, 0x09, /* nop */
3524 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3525 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3528 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3530 0x04, 0xd0, /* mov.l 1f,r0 */
3531 0x05, 0xd2, /* mov.l 2f,r2 */
3532 0x02, 0x60, /* mov.l @r0,r0 */
3533 0x22, 0x62, /* mov.l @r2,r2 */
3534 0x2b, 0x40, /* jmp @r0 */
3535 0x00, 0xe0, /* mov #0,r0 */
3536 0x09, 0x00, /* nop */
3537 0x09, 0x00, /* nop */
3538 0x09, 0x00, /* nop */
3539 0x09, 0x00, /* nop */
3540 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3541 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3544 /* Sebsequent entries in an absolute procedure linkage table look like
3547 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3549 0xd0, 0x04, /* mov.l 1f,r0 */
3550 0x60, 0x02, /* mov.l @r0,r0 */
3551 0xd2, 0x02, /* mov.l 0f,r2 */
3552 0x40, 0x2b, /* jmp @r0 */
3553 0x60, 0x23, /* mov r2,r0 */
3554 0xd1, 0x03, /* mov.l 2f,r1 */
3555 0x40, 0x2b, /* jmp @r0 */
3556 0x00, 0x09, /* nop */
3557 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3558 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3559 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3562 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3564 0x04, 0xd0, /* mov.l 1f,r0 */
3565 0x02, 0x60, /* mov.l @r0,r0 */
3566 0x02, 0xd2, /* mov.l 0f,r2 */
3567 0x2b, 0x40, /* jmp @r0 */
3568 0x23, 0x60, /* mov r2,r0 */
3569 0x03, 0xd1, /* mov.l 2f,r1 */
3570 0x2b, 0x40, /* jmp @r0 */
3571 0x09, 0x00, /* nop */
3572 0, 0, 0, 0, /* 0: replaced with address of .PLT. */
3573 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3574 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3577 /* Entries in a PIC procedure linkage table look like this. */
3579 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3581 0xd0, 0x04, /* mov.l 1f,r0 */
3582 0x00, 0xce, /* mov.l @(r0,r12),r0 */
3583 0x40, 0x2b, /* jmp @r0 */
3584 0x00, 0x09, /* nop */
3585 0x50, 0xc2, /* 0: mov.l @(8,r12),r0 */
3586 0x52, 0xc1, /* 1: mov.l @(4,r12),r2 */
3587 0xd1, 0x02, /* mov.l 2f,r1 */
3588 0x40, 0x2b, /* jmp @r0 */
3589 0xe0, 0x00, /* mov #0,r0 ! shows the type of PLT. */
3590 0x00, 0x09, /* nop */
3591 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3592 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3595 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3597 0x04, 0xd0, /* mov.l 1f,r0 */
3598 0xce, 0x00, /* mov.l @(r0,r12),r0 */
3599 0x2b, 0x40, /* jmp @r0 */
3600 0x09, 0x00, /* nop */
3601 0xc2, 0x50, /* 0: mov.l @(8,r12),r0 */
3602 0xc1, 0x52, /* 1: mov.l @(4,r12),r2 */
3603 0x02, 0xd1, /* mov.l 2f,r1 */
3604 0x2b, 0x40, /* jmp @r0 */
3605 0x00, 0xe0, /* mov #0,r0 ! shows the type of PLT. */
3606 0x09, 0x00, /* nop */
3607 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3608 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3610 #endif /* old style PLT entries. */
3612 static const bfd_byte
*elf_sh_plt0_entry
;
3613 static const bfd_byte
*elf_sh_plt_entry
;
3614 static const bfd_byte
*elf_sh_pic_plt_entry
;
3616 /* Return size of a PLT entry. */
3617 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3619 /* Return offset of the PLT0 address in an absolute PLT entry. */
3620 #define elf_sh_plt_plt0_offset(info) 16
3622 /* Return offset of the linker in PLT0 entry. */
3623 #define elf_sh_plt0_linker_offset(info) 20
3625 /* Return offset of the GOT id in PLT0 entry. */
3626 #define elf_sh_plt0_gotid_offset(info) 24
3628 /* Return offset of the temporary in PLT entry */
3629 #define elf_sh_plt_temp_offset(info) 8
3631 /* Return offset of the symbol in PLT entry. */
3632 #define elf_sh_plt_symbol_offset(info) 20
3634 /* Return offset of the relocation in PLT entry. */
3635 #define elf_sh_plt_reloc_offset(info) 24
3638 /* The sh linker needs to keep track of the number of relocs that it
3639 decides to copy as dynamic relocs in check_relocs for each symbol.
3640 This is so that it can later discard them if they are found to be
3641 unnecessary. We store the information in a field extending the
3642 regular ELF linker hash table. */
3644 struct elf_sh_dyn_relocs
3646 struct elf_sh_dyn_relocs
*next
;
3648 /* The input section of the reloc. */
3651 /* Total number of relocs copied for the input section. */
3652 bfd_size_type count
;
3654 /* Number of pc-relative relocs copied for the input section. */
3655 bfd_size_type pc_count
;
3658 /* sh ELF linker hash entry. */
3660 struct elf_sh_link_hash_entry
3662 struct elf_link_hash_entry root
;
3664 #ifdef INCLUDE_SHMEDIA
3667 bfd_signed_vma refcount
;
3672 /* Track dynamic relocs copied for this symbol. */
3673 struct elf_sh_dyn_relocs
*dyn_relocs
;
3675 bfd_signed_vma gotplt_refcount
;
3678 GOT_UNKNOWN
= 0, GOT_NORMAL
, GOT_TLS_GD
, GOT_TLS_IE
3682 #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
3684 struct sh_elf_obj_tdata
3686 struct elf_obj_tdata root
;
3688 /* tls_type for each local got entry. */
3689 char *local_got_tls_type
;
3692 #define sh_elf_tdata(abfd) \
3693 ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
3695 #define sh_elf_local_got_tls_type(abfd) \
3696 (sh_elf_tdata (abfd)->local_got_tls_type)
3698 /* Override the generic function because we need to store sh_elf_obj_tdata
3699 as the specific tdata. */
3702 sh_elf_mkobject (bfd
*abfd
)
3704 bfd_size_type amt
= sizeof (struct sh_elf_obj_tdata
);
3705 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
3706 if (abfd
->tdata
.any
== NULL
)
3711 /* sh ELF linker hash table. */
3713 struct elf_sh_link_hash_table
3715 struct elf_link_hash_table root
;
3717 /* Short-cuts to get to dynamic linker sections. */
3726 /* Small local sym to section mapping cache. */
3727 struct sym_sec_cache sym_sec
;
3729 /* A counter or offset to track a TLS got entry. */
3732 bfd_signed_vma refcount
;
3737 /* Traverse an sh ELF linker hash table. */
3739 #define sh_elf_link_hash_traverse(table, func, info) \
3740 (elf_link_hash_traverse \
3742 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
3745 /* Get the sh ELF linker hash table from a link_info structure. */
3747 #define sh_elf_hash_table(p) \
3748 ((struct elf_sh_link_hash_table *) ((p)->hash))
3750 /* Create an entry in an sh ELF linker hash table. */
3752 static struct bfd_hash_entry
*
3753 sh_elf_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3754 struct bfd_hash_table
*table
,
3757 struct elf_sh_link_hash_entry
*ret
=
3758 (struct elf_sh_link_hash_entry
*) entry
;
3760 /* Allocate the structure if it has not already been allocated by a
3762 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3763 ret
= ((struct elf_sh_link_hash_entry
*)
3764 bfd_hash_allocate (table
,
3765 sizeof (struct elf_sh_link_hash_entry
)));
3766 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3767 return (struct bfd_hash_entry
*) ret
;
3769 /* Call the allocation method of the superclass. */
3770 ret
= ((struct elf_sh_link_hash_entry
*)
3771 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3773 if (ret
!= (struct elf_sh_link_hash_entry
*) NULL
)
3775 ret
->dyn_relocs
= NULL
;
3776 ret
->gotplt_refcount
= 0;
3777 #ifdef INCLUDE_SHMEDIA
3778 ret
->datalabel_got
.refcount
= ret
->root
.got
.refcount
;
3780 ret
->tls_type
= GOT_UNKNOWN
;
3783 return (struct bfd_hash_entry
*) ret
;
3786 /* Create an sh ELF linker hash table. */
3788 static struct bfd_link_hash_table
*
3789 sh_elf_link_hash_table_create (bfd
*abfd
)
3791 struct elf_sh_link_hash_table
*ret
;
3792 bfd_size_type amt
= sizeof (struct elf_sh_link_hash_table
);
3794 ret
= (struct elf_sh_link_hash_table
*) bfd_malloc (amt
);
3795 if (ret
== (struct elf_sh_link_hash_table
*) NULL
)
3798 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
3799 sh_elf_link_hash_newfunc
))
3806 ret
->sgotplt
= NULL
;
3807 ret
->srelgot
= NULL
;
3809 ret
->srelplt
= NULL
;
3810 ret
->sdynbss
= NULL
;
3811 ret
->srelbss
= NULL
;
3812 ret
->sym_sec
.abfd
= NULL
;
3813 ret
->tls_ldm_got
.refcount
= 0;
3815 return &ret
->root
.root
;
3818 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3819 shortcuts to them in our hash table. */
3822 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
3824 struct elf_sh_link_hash_table
*htab
;
3826 if (! _bfd_elf_create_got_section (dynobj
, info
))
3829 htab
= sh_elf_hash_table (info
);
3830 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
3831 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
3832 if (! htab
->sgot
|| ! htab
->sgotplt
)
3835 htab
->srelgot
= bfd_make_section (dynobj
, ".rela.got");
3836 if (htab
->srelgot
== NULL
3837 || ! bfd_set_section_flags (dynobj
, htab
->srelgot
,
3842 | SEC_LINKER_CREATED
3844 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
3849 /* Create dynamic sections when linking against a dynamic object. */
3852 sh_elf_create_dynamic_sections (bfd
*abfd
, struct bfd_link_info
*info
)
3854 struct elf_sh_link_hash_table
*htab
;
3855 flagword flags
, pltflags
;
3856 register asection
*s
;
3857 const struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
3860 switch (bed
->s
->arch_size
)
3871 bfd_set_error (bfd_error_bad_value
);
3875 htab
= sh_elf_hash_table (info
);
3876 if (htab
->root
.dynamic_sections_created
)
3879 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3880 .rel[a].bss sections. */
3882 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3883 | SEC_LINKER_CREATED
);
3886 pltflags
|= SEC_CODE
;
3887 if (bed
->plt_not_loaded
)
3888 pltflags
&= ~ (SEC_LOAD
| SEC_HAS_CONTENTS
);
3889 if (bed
->plt_readonly
)
3890 pltflags
|= SEC_READONLY
;
3892 s
= bfd_make_section (abfd
, ".plt");
3895 || ! bfd_set_section_flags (abfd
, s
, pltflags
)
3896 || ! bfd_set_section_alignment (abfd
, s
, bed
->plt_alignment
))
3899 if (bed
->want_plt_sym
)
3901 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3903 struct elf_link_hash_entry
*h
;
3904 struct bfd_link_hash_entry
*bh
= NULL
;
3906 if (! (_bfd_generic_link_add_one_symbol
3907 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
3908 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
3909 get_elf_backend_data (abfd
)->collect
, &bh
)))
3912 h
= (struct elf_link_hash_entry
*) bh
;
3913 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
3914 h
->type
= STT_OBJECT
;
3917 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
3921 s
= bfd_make_section (abfd
,
3922 bed
->default_use_rela_p
? ".rela.plt" : ".rel.plt");
3925 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3926 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3929 if (htab
->sgot
== NULL
3930 && !create_got_section (abfd
, info
))
3934 const char *secname
;
3939 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3941 secflags
= bfd_get_section_flags (abfd
, sec
);
3942 if ((secflags
& (SEC_DATA
| SEC_LINKER_CREATED
))
3943 || ((secflags
& SEC_HAS_CONTENTS
) != SEC_HAS_CONTENTS
))
3945 secname
= bfd_get_section_name (abfd
, sec
);
3946 relname
= (char *) bfd_malloc ((bfd_size_type
) strlen (secname
) + 6);
3947 strcpy (relname
, ".rela");
3948 strcat (relname
, secname
);
3949 if (bfd_get_section_by_name (abfd
, secname
))
3951 s
= bfd_make_section (abfd
, relname
);
3953 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3954 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3959 if (bed
->want_dynbss
)
3961 /* The .dynbss section is a place to put symbols which are defined
3962 by dynamic objects, are referenced by regular objects, and are
3963 not functions. We must allocate space for them in the process
3964 image and use a R_*_COPY reloc to tell the dynamic linker to
3965 initialize them at run time. The linker script puts the .dynbss
3966 section into the .bss section of the final image. */
3967 s
= bfd_make_section (abfd
, ".dynbss");
3970 || ! bfd_set_section_flags (abfd
, s
, SEC_ALLOC
))
3973 /* The .rel[a].bss section holds copy relocs. This section is not
3974 normally needed. We need to create it here, though, so that the
3975 linker will map it to an output section. We can't just create it
3976 only if we need it, because we will not know whether we need it
3977 until we have seen all the input files, and the first time the
3978 main linker code calls BFD after examining all the input files
3979 (size_dynamic_sections) the input sections have already been
3980 mapped to the output sections. If the section turns out not to
3981 be needed, we can discard it later. We will never need this
3982 section when generating a shared object, since they do not use
3986 s
= bfd_make_section (abfd
,
3987 (bed
->default_use_rela_p
3988 ? ".rela.bss" : ".rel.bss"));
3991 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3992 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
4000 /* Adjust a symbol defined by a dynamic object and referenced by a
4001 regular object. The current definition is in some section of the
4002 dynamic object, but we're not including those sections. We have to
4003 change the definition to something the rest of the link can
4007 sh_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
4008 struct elf_link_hash_entry
*h
)
4010 struct elf_sh_link_hash_table
*htab
;
4011 struct elf_sh_link_hash_entry
*eh
;
4012 struct elf_sh_dyn_relocs
*p
;
4014 unsigned int power_of_two
;
4016 htab
= sh_elf_hash_table (info
);
4018 /* Make sure we know what is going on here. */
4019 BFD_ASSERT (htab
->root
.dynobj
!= NULL
4020 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
4021 || h
->weakdef
!= NULL
4022 || ((h
->elf_link_hash_flags
4023 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
4024 && (h
->elf_link_hash_flags
4025 & ELF_LINK_HASH_REF_REGULAR
) != 0
4026 && (h
->elf_link_hash_flags
4027 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
4029 /* If this is a function, put it in the procedure linkage table. We
4030 will fill in the contents of the procedure linkage table later,
4031 when we know the address of the .got section. */
4032 if (h
->type
== STT_FUNC
4033 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
4035 if (h
->plt
.refcount
<= 0
4036 || SYMBOL_CALLS_LOCAL (info
, h
)
4037 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
4038 && h
->root
.type
== bfd_link_hash_undefweak
))
4040 /* This case can occur if we saw a PLT reloc in an input
4041 file, but the symbol was never referred to by a dynamic
4042 object. In such a case, we don't actually need to build
4043 a procedure linkage table, and we can just do a REL32
4045 h
->plt
.offset
= (bfd_vma
) -1;
4046 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4052 h
->plt
.offset
= (bfd_vma
) -1;
4054 /* If this is a weak symbol, and there is a real definition, the
4055 processor independent code will have arranged for us to see the
4056 real definition first, and we can just use the same value. */
4057 if (h
->weakdef
!= NULL
)
4059 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
4060 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
4061 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
4062 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
4063 if (info
->nocopyreloc
)
4064 h
->elf_link_hash_flags
4065 = ((h
->elf_link_hash_flags
& ~ELF_LINK_NON_GOT_REF
)
4066 | (h
->weakdef
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
));
4070 /* This is a reference to a symbol defined by a dynamic object which
4071 is not a function. */
4073 /* If we are creating a shared library, we must presume that the
4074 only references to the symbol are via the global offset table.
4075 For such cases we need not do anything here; the relocations will
4076 be handled correctly by relocate_section. */
4080 /* If there are no references to this symbol that do not use the
4081 GOT, we don't need to generate a copy reloc. */
4082 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0)
4085 /* If -z nocopyreloc was given, we won't generate them either. */
4086 if (info
->nocopyreloc
)
4088 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
4092 eh
= (struct elf_sh_link_hash_entry
*) h
;
4093 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4095 s
= p
->sec
->output_section
;
4096 if (s
!= NULL
&& (s
->flags
& (SEC_READONLY
| SEC_HAS_CONTENTS
)) != 0)
4100 /* If we didn't find any dynamic relocs in sections which needs the
4101 copy reloc, then we'll be keeping the dynamic relocs and avoiding
4105 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
4109 /* We must allocate the symbol in our .dynbss section, which will
4110 become part of the .bss section of the executable. There will be
4111 an entry for this symbol in the .dynsym section. The dynamic
4112 object will contain position independent code, so all references
4113 from the dynamic object to this symbol will go through the global
4114 offset table. The dynamic linker will use the .dynsym entry to
4115 determine the address it must put in the global offset table, so
4116 both the dynamic object and the regular object will refer to the
4117 same memory location for the variable. */
4120 BFD_ASSERT (s
!= NULL
);
4122 /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
4123 copy the initial value out of the dynamic object and into the
4124 runtime process image. We need to remember the offset into the
4125 .rela.bss section we are going to use. */
4126 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
4130 srel
= htab
->srelbss
;
4131 BFD_ASSERT (srel
!= NULL
);
4132 srel
->size
+= sizeof (Elf32_External_Rela
);
4133 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
4136 /* We need to figure out the alignment required for this symbol. I
4137 have no idea how ELF linkers handle this. */
4138 power_of_two
= bfd_log2 (h
->size
);
4139 if (power_of_two
> 3)
4142 /* Apply the required alignment. */
4143 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
4144 if (power_of_two
> bfd_get_section_alignment (htab
->root
.dynobj
, s
))
4146 if (! bfd_set_section_alignment (htab
->root
.dynobj
, s
, power_of_two
))
4150 /* Define the symbol as being at this point in the section. */
4151 h
->root
.u
.def
.section
= s
;
4152 h
->root
.u
.def
.value
= s
->size
;
4154 /* Increment the section size to make room for the symbol. */
4160 /* Allocate space in .plt, .got and associated reloc sections for
4164 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
4166 struct bfd_link_info
*info
;
4167 struct elf_sh_link_hash_table
*htab
;
4168 struct elf_sh_link_hash_entry
*eh
;
4169 struct elf_sh_dyn_relocs
*p
;
4171 if (h
->root
.type
== bfd_link_hash_indirect
)
4174 if (h
->root
.type
== bfd_link_hash_warning
)
4175 /* When warning symbols are created, they **replace** the "real"
4176 entry in the hash table, thus we never get to see the real
4177 symbol in a hash traversal. So look at it now. */
4178 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4180 info
= (struct bfd_link_info
*) inf
;
4181 htab
= sh_elf_hash_table (info
);
4183 eh
= (struct elf_sh_link_hash_entry
*) h
;
4184 if ((h
->got
.refcount
> 0
4185 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
4186 && eh
->gotplt_refcount
> 0)
4188 /* The symbol has been forced local, or we have some direct got refs,
4189 so treat all the gotplt refs as got refs. */
4190 h
->got
.refcount
+= eh
->gotplt_refcount
;
4191 if (h
->plt
.refcount
>= eh
->gotplt_refcount
)
4192 h
->plt
.refcount
-= eh
->gotplt_refcount
;
4195 if (htab
->root
.dynamic_sections_created
4196 && h
->plt
.refcount
> 0
4197 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4198 || h
->root
.type
!= bfd_link_hash_undefweak
))
4200 /* Make sure this symbol is output as a dynamic symbol.
4201 Undefined weak syms won't yet be marked as dynamic. */
4202 if (h
->dynindx
== -1
4203 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4205 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4210 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
4212 asection
*s
= htab
->splt
;
4214 /* If this is the first .plt entry, make room for the special
4217 s
->size
+= PLT_ENTRY_SIZE
;
4219 h
->plt
.offset
= s
->size
;
4221 /* If this symbol is not defined in a regular file, and we are
4222 not generating a shared library, then set the symbol to this
4223 location in the .plt. This is required to make function
4224 pointers compare as equal between the normal executable and
4225 the shared library. */
4227 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4229 h
->root
.u
.def
.section
= s
;
4230 h
->root
.u
.def
.value
= h
->plt
.offset
;
4233 /* Make room for this entry. */
4234 s
->size
+= PLT_ENTRY_SIZE
;
4236 /* We also need to make an entry in the .got.plt section, which
4237 will be placed in the .got section by the linker script. */
4238 htab
->sgotplt
->size
+= 4;
4240 /* We also need to make an entry in the .rel.plt section. */
4241 htab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
4245 h
->plt
.offset
= (bfd_vma
) -1;
4246 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4251 h
->plt
.offset
= (bfd_vma
) -1;
4252 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4255 if (h
->got
.refcount
> 0)
4259 int tls_type
= sh_elf_hash_entry (h
)->tls_type
;
4261 /* Make sure this symbol is output as a dynamic symbol.
4262 Undefined weak syms won't yet be marked as dynamic. */
4263 if (h
->dynindx
== -1
4264 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4266 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4271 h
->got
.offset
= s
->size
;
4273 /* R_SH_TLS_GD needs 2 consecutive GOT slots. */
4274 if (tls_type
== GOT_TLS_GD
)
4276 dyn
= htab
->root
.dynamic_sections_created
;
4277 /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
4278 R_SH_TLS_GD needs one if local symbol and two if global. */
4279 if ((tls_type
== GOT_TLS_GD
&& h
->dynindx
== -1)
4280 || (tls_type
== GOT_TLS_IE
&& dyn
))
4281 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4282 else if (tls_type
== GOT_TLS_GD
)
4283 htab
->srelgot
->size
+= 2 * sizeof (Elf32_External_Rela
);
4284 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4285 || h
->root
.type
!= bfd_link_hash_undefweak
)
4287 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
4288 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4291 h
->got
.offset
= (bfd_vma
) -1;
4293 #ifdef INCLUDE_SHMEDIA
4294 if (eh
->datalabel_got
.refcount
> 0)
4299 /* Make sure this symbol is output as a dynamic symbol.
4300 Undefined weak syms won't yet be marked as dynamic. */
4301 if (h
->dynindx
== -1
4302 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4304 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4309 eh
->datalabel_got
.offset
= s
->size
;
4311 dyn
= htab
->root
.dynamic_sections_created
;
4312 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
))
4313 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4316 eh
->datalabel_got
.offset
= (bfd_vma
) -1;
4319 if (eh
->dyn_relocs
== NULL
)
4322 /* In the shared -Bsymbolic case, discard space allocated for
4323 dynamic pc-relative relocs against symbols which turn out to be
4324 defined in regular objects. For the normal shared case, discard
4325 space for pc-relative relocs that have become local due to symbol
4326 visibility changes. */
4330 if (SYMBOL_CALLS_LOCAL (info
, h
))
4332 struct elf_sh_dyn_relocs
**pp
;
4334 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
4336 p
->count
-= p
->pc_count
;
4345 /* Also discard relocs on undefined weak syms with non-default
4347 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
4348 && h
->root
.type
== bfd_link_hash_undefweak
)
4349 eh
->dyn_relocs
= NULL
;
4353 /* For the non-shared case, discard space for relocs against
4354 symbols which turn out to need copy relocs or are not
4357 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
4358 && (((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
4359 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4360 || (htab
->root
.dynamic_sections_created
4361 && (h
->root
.type
== bfd_link_hash_undefweak
4362 || h
->root
.type
== bfd_link_hash_undefined
))))
4364 /* Make sure this symbol is output as a dynamic symbol.
4365 Undefined weak syms won't yet be marked as dynamic. */
4366 if (h
->dynindx
== -1
4367 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4369 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
4373 /* If that succeeded, we know we'll be keeping all the
4375 if (h
->dynindx
!= -1)
4379 eh
->dyn_relocs
= NULL
;
4384 /* Finally, allocate space. */
4385 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4387 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
4388 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4394 /* Find any dynamic relocs that apply to read-only sections. */
4397 readonly_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
4399 struct elf_sh_link_hash_entry
*eh
;
4400 struct elf_sh_dyn_relocs
*p
;
4402 if (h
->root
.type
== bfd_link_hash_warning
)
4403 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4405 eh
= (struct elf_sh_link_hash_entry
*) h
;
4406 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4408 asection
*s
= p
->sec
->output_section
;
4410 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
4412 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
4414 info
->flags
|= DF_TEXTREL
;
4416 /* Not an error, just cut short the traversal. */
4423 /* Set the sizes of the dynamic sections. */
4426 sh_elf_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
4427 struct bfd_link_info
*info
)
4429 struct elf_sh_link_hash_table
*htab
;
4435 htab
= sh_elf_hash_table (info
);
4436 dynobj
= htab
->root
.dynobj
;
4437 BFD_ASSERT (dynobj
!= NULL
);
4439 if (htab
->root
.dynamic_sections_created
)
4441 /* Set the contents of the .interp section to the interpreter. */
4442 if (info
->executable
)
4444 s
= bfd_get_section_by_name (dynobj
, ".interp");
4445 BFD_ASSERT (s
!= NULL
);
4446 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
4447 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
4451 /* Set up .got offsets for local syms, and space for local dynamic
4453 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4455 bfd_signed_vma
*local_got
;
4456 bfd_signed_vma
*end_local_got
;
4457 char *local_tls_type
;
4458 bfd_size_type locsymcount
;
4459 Elf_Internal_Shdr
*symtab_hdr
;
4462 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
4465 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
4467 struct elf_sh_dyn_relocs
*p
;
4469 for (p
= ((struct elf_sh_dyn_relocs
*)
4470 elf_section_data (s
)->local_dynrel
);
4474 if (! bfd_is_abs_section (p
->sec
)
4475 && bfd_is_abs_section (p
->sec
->output_section
))
4477 /* Input section has been discarded, either because
4478 it is a copy of a linkonce section or due to
4479 linker script /DISCARD/, so we'll be discarding
4482 else if (p
->count
!= 0)
4484 srel
= elf_section_data (p
->sec
)->sreloc
;
4485 srel
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
4486 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
4487 info
->flags
|= DF_TEXTREL
;
4492 local_got
= elf_local_got_refcounts (ibfd
);
4496 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4497 locsymcount
= symtab_hdr
->sh_info
;
4498 #ifdef INCLUDE_SHMEDIA
4499 /* Count datalabel local GOT. */
4502 end_local_got
= local_got
+ locsymcount
;
4503 local_tls_type
= sh_elf_local_got_tls_type (ibfd
);
4505 srel
= htab
->srelgot
;
4506 for (; local_got
< end_local_got
; ++local_got
)
4510 *local_got
= s
->size
;
4512 if (*local_tls_type
== GOT_TLS_GD
)
4515 srel
->size
+= sizeof (Elf32_External_Rela
);
4518 *local_got
= (bfd_vma
) -1;
4523 if (htab
->tls_ldm_got
.refcount
> 0)
4525 /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
4527 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
4528 htab
->sgot
->size
+= 8;
4529 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
4532 htab
->tls_ldm_got
.offset
= -1;
4534 /* Allocate global sym .plt and .got entries, and space for global
4535 sym dynamic relocs. */
4536 elf_link_hash_traverse (&htab
->root
, allocate_dynrelocs
, info
);
4538 /* We now have determined the sizes of the various dynamic sections.
4539 Allocate memory for them. */
4541 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4543 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
4548 || s
== htab
->sgotplt
)
4550 /* Strip this section if we don't need it; see the
4553 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
4555 if (s
->size
!= 0 && s
!= htab
->srelplt
)
4558 /* We use the reloc_count field as a counter if we need
4559 to copy relocs into the output file. */
4564 /* It's not one of our sections, so don't allocate space. */
4570 /* If we don't need this section, strip it from the
4571 output file. This is mostly to handle .rela.bss and
4572 .rela.plt. We must create both sections in
4573 create_dynamic_sections, because they must be created
4574 before the linker maps input sections to output
4575 sections. The linker does that before
4576 adjust_dynamic_symbol is called, and it is that
4577 function which decides whether anything needs to go
4578 into these sections. */
4580 _bfd_strip_section_from_output (info
, s
);
4584 /* Allocate memory for the section contents. We use bfd_zalloc
4585 here in case unused entries are not reclaimed before the
4586 section's contents are written out. This should not happen,
4587 but this way if it does, we get a R_SH_NONE reloc instead
4589 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
4590 if (s
->contents
== NULL
)
4594 if (htab
->root
.dynamic_sections_created
)
4596 /* Add some entries to the .dynamic section. We fill in the
4597 values later, in sh_elf_finish_dynamic_sections, but we
4598 must add the entries now so that we get the correct size for
4599 the .dynamic section. The DT_DEBUG entry is filled in by the
4600 dynamic linker and used by the debugger. */
4601 #define add_dynamic_entry(TAG, VAL) \
4602 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4604 if (info
->executable
)
4606 if (! add_dynamic_entry (DT_DEBUG
, 0))
4610 if (htab
->splt
->size
!= 0)
4612 if (! add_dynamic_entry (DT_PLTGOT
, 0)
4613 || ! add_dynamic_entry (DT_PLTRELSZ
, 0)
4614 || ! add_dynamic_entry (DT_PLTREL
, DT_RELA
)
4615 || ! add_dynamic_entry (DT_JMPREL
, 0))
4621 if (! add_dynamic_entry (DT_RELA
, 0)
4622 || ! add_dynamic_entry (DT_RELASZ
, 0)
4623 || ! add_dynamic_entry (DT_RELAENT
,
4624 sizeof (Elf32_External_Rela
)))
4627 /* If any dynamic relocs apply to a read-only section,
4628 then we need a DT_TEXTREL entry. */
4629 if ((info
->flags
& DF_TEXTREL
) == 0)
4630 elf_link_hash_traverse (&htab
->root
, readonly_dynrelocs
, info
);
4632 if ((info
->flags
& DF_TEXTREL
) != 0)
4634 if (! add_dynamic_entry (DT_TEXTREL
, 0))
4639 #undef add_dynamic_entry
4644 /* Relocate an SH ELF section. */
4647 sh_elf_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
4648 bfd
*input_bfd
, asection
*input_section
,
4649 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
4650 Elf_Internal_Sym
*local_syms
,
4651 asection
**local_sections
)
4653 struct elf_sh_link_hash_table
*htab
;
4654 Elf_Internal_Shdr
*symtab_hdr
;
4655 struct elf_link_hash_entry
**sym_hashes
;
4656 Elf_Internal_Rela
*rel
, *relend
;
4658 bfd_vma
*local_got_offsets
;
4665 htab
= sh_elf_hash_table (info
);
4666 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4667 sym_hashes
= elf_sym_hashes (input_bfd
);
4668 dynobj
= htab
->root
.dynobj
;
4669 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4672 sgotplt
= htab
->sgotplt
;
4678 relend
= relocs
+ input_section
->reloc_count
;
4679 for (; rel
< relend
; rel
++)
4682 reloc_howto_type
*howto
;
4683 unsigned long r_symndx
;
4684 Elf_Internal_Sym
*sym
;
4686 struct elf_link_hash_entry
*h
;
4688 bfd_vma addend
= (bfd_vma
) 0;
4689 bfd_reloc_status_type r
;
4690 int seen_stt_datalabel
= 0;
4694 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4696 r_type
= ELF32_R_TYPE (rel
->r_info
);
4698 /* Many of the relocs are only used for relaxing, and are
4699 handled entirely by the relaxation code. */
4700 if (r_type
>= (int) R_SH_GNU_VTINHERIT
4701 && r_type
<= (int) R_SH_LABEL
)
4703 if (r_type
== (int) R_SH_NONE
)
4707 || r_type
>= R_SH_max
4708 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC
4709 && r_type
<= (int) R_SH_LAST_INVALID_RELOC
)
4710 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_3
4711 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_3
)
4712 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_4
4713 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_4
)
4714 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_5
4715 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_5
)
4716 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC_2
4717 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_2
))
4719 bfd_set_error (bfd_error_bad_value
);
4723 howto
= sh_elf_howto_table
+ r_type
;
4725 /* For relocs that aren't partial_inplace, we get the addend from
4727 if (! howto
->partial_inplace
)
4728 addend
= rel
->r_addend
;
4733 if (r_symndx
< symtab_hdr
->sh_info
)
4735 sym
= local_syms
+ r_symndx
;
4736 sec
= local_sections
[r_symndx
];
4737 relocation
= (sec
->output_section
->vma
4738 + sec
->output_offset
4740 /* A local symbol never has STO_SH5_ISA32, so we don't need
4741 datalabel processing here. Make sure this does not change
4743 if ((sym
->st_other
& STO_SH5_ISA32
) != 0)
4744 ((*info
->callbacks
->reloc_dangerous
)
4746 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
4747 input_bfd
, input_section
, rel
->r_offset
));
4748 if (info
->relocatable
)
4750 /* This is a relocatable link. We don't have to change
4751 anything, unless the reloc is against a section symbol,
4752 in which case we have to adjust according to where the
4753 section symbol winds up in the output section. */
4754 sym
= local_syms
+ r_symndx
;
4755 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4757 if (! howto
->partial_inplace
)
4759 /* For relocations with the addend in the
4760 relocation, we need just to update the addend.
4761 All real relocs are of type partial_inplace; this
4762 code is mostly for completeness. */
4763 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
4768 /* Relocs of type partial_inplace need to pick up the
4769 contents in the contents and add the offset resulting
4770 from the changed location of the section symbol.
4771 Using _bfd_final_link_relocate (e.g. goto
4772 final_link_relocate) here would be wrong, because
4773 relocations marked pc_relative would get the current
4774 location subtracted, and we must only do that at the
4776 r
= _bfd_relocate_contents (howto
, input_bfd
,
4779 contents
+ rel
->r_offset
);
4780 goto relocation_done
;
4785 else if (! howto
->partial_inplace
)
4787 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
4788 addend
= rel
->r_addend
;
4790 else if ((sec
->flags
& SEC_MERGE
)
4791 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4795 if (howto
->rightshift
|| howto
->src_mask
!= 0xffffffff)
4797 (*_bfd_error_handler
)
4798 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
4799 input_bfd
, input_section
,
4800 (long) rel
->r_offset
, howto
->name
);
4804 addend
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
4807 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
4809 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
4810 bfd_put_32 (input_bfd
, addend
, contents
+ rel
->r_offset
);
4816 /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro. */
4818 /* Section symbol are never (?) placed in the hash table, so
4819 we can just ignore hash relocations when creating a
4820 relocatable object file. */
4821 if (info
->relocatable
)
4824 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4825 while (h
->root
.type
== bfd_link_hash_indirect
4826 || h
->root
.type
== bfd_link_hash_warning
)
4828 #ifdef INCLUDE_SHMEDIA
4829 /* If the reference passes a symbol marked with
4830 STT_DATALABEL, then any STO_SH5_ISA32 on the final value
4832 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
4834 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4836 if (h
->root
.type
== bfd_link_hash_defined
4837 || h
->root
.type
== bfd_link_hash_defweak
)
4841 dyn
= htab
->root
.dynamic_sections_created
;
4842 sec
= h
->root
.u
.def
.section
;
4843 /* In these cases, we don't need the relocation value.
4844 We check specially because in some obscure cases
4845 sec->output_section will be NULL. */
4846 if (r_type
== R_SH_GOTPC
4847 || r_type
== R_SH_GOTPC_LOW16
4848 || r_type
== R_SH_GOTPC_MEDLOW16
4849 || r_type
== R_SH_GOTPC_MEDHI16
4850 || r_type
== R_SH_GOTPC_HI16
4851 || ((r_type
== R_SH_PLT32
4852 || r_type
== R_SH_PLT_LOW16
4853 || r_type
== R_SH_PLT_MEDLOW16
4854 || r_type
== R_SH_PLT_MEDHI16
4855 || r_type
== R_SH_PLT_HI16
)
4856 && h
->plt
.offset
!= (bfd_vma
) -1)
4857 || ((r_type
== R_SH_GOT32
4858 || r_type
== R_SH_GOT_LOW16
4859 || r_type
== R_SH_GOT_MEDLOW16
4860 || r_type
== R_SH_GOT_MEDHI16
4861 || r_type
== R_SH_GOT_HI16
)
4862 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4864 || (! info
->symbolic
&& h
->dynindx
!= -1)
4865 || (h
->elf_link_hash_flags
4866 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
4867 /* The cases above are those in which relocation is
4868 overwritten in the switch block below. The cases
4869 below are those in which we must defer relocation
4870 to run-time, because we can't resolve absolute
4871 addresses when creating a shared library. */
4873 && ((! info
->symbolic
&& h
->dynindx
!= -1)
4874 || (h
->elf_link_hash_flags
4875 & ELF_LINK_HASH_DEF_REGULAR
) == 0)
4876 && ((r_type
== R_SH_DIR32
4877 && (h
->elf_link_hash_flags
4878 & ELF_LINK_FORCED_LOCAL
) == 0)
4879 || r_type
== R_SH_REL32
)
4880 && ((input_section
->flags
& SEC_ALLOC
) != 0
4881 /* DWARF will emit R_SH_DIR32 relocations in its
4882 sections against symbols defined externally
4883 in shared libraries. We can't do anything
4885 || ((input_section
->flags
& SEC_DEBUGGING
) != 0
4886 && (h
->elf_link_hash_flags
4887 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0)))
4888 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4889 sections because such sections are not SEC_ALLOC and
4890 thus ld.so will not process them. */
4891 || (sec
->output_section
== NULL
4892 && ((input_section
->flags
& SEC_DEBUGGING
) != 0
4893 && (h
->elf_link_hash_flags
4894 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0))
4895 || (sec
->output_section
== NULL
4896 && (sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_IE
4897 || sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_GD
)))
4899 else if (sec
->output_section
== NULL
)
4901 (*_bfd_error_handler
)
4902 (_("%B(%A): unresolvable relocation against symbol `%s'"),
4903 input_bfd
, input_section
, h
->root
.root
.string
);
4907 relocation
= ((h
->root
.u
.def
.value
4908 + sec
->output_section
->vma
4909 + sec
->output_offset
)
4910 /* A STO_SH5_ISA32 causes a "bitor 1" to the
4911 symbol value, unless we've seen
4912 STT_DATALABEL on the way to it. */
4913 | ((h
->other
& STO_SH5_ISA32
) != 0
4914 && ! seen_stt_datalabel
));
4916 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4918 else if (info
->unresolved_syms_in_objects
== RM_IGNORE
4919 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4923 if (! info
->callbacks
->undefined_symbol
4924 (info
, h
->root
.root
.string
, input_bfd
,
4925 input_section
, rel
->r_offset
,
4926 (info
->unresolved_syms_in_objects
== RM_GENERATE_ERROR
4927 || ELF_ST_VISIBILITY (h
->other
))))
4933 switch ((int) r_type
)
4935 final_link_relocate
:
4936 /* COFF relocs don't use the addend. The addend is used for
4937 R_SH_DIR32 to be compatible with other compilers. */
4938 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4939 contents
, rel
->r_offset
,
4940 relocation
, addend
);
4944 goto final_link_relocate
;
4949 /* If the reloc is against the start of this section, then
4950 the assembler has already taken care of it and the reloc
4951 is here only to assist in relaxing. If the reloc is not
4952 against the start of this section, then it's against an
4953 external symbol and we must deal with it ourselves. */
4954 if (input_section
->output_section
->vma
+ input_section
->output_offset
4957 int disp
= (relocation
4958 - input_section
->output_section
->vma
4959 - input_section
->output_offset
4965 case R_SH_DIR8WPZ
: mask
= 1; break;
4966 case R_SH_DIR8WPL
: mask
= 3; break;
4967 default: mask
= 0; break;
4971 ((*_bfd_error_handler
)
4972 (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
4973 input_section
->owner
,
4974 (unsigned long) rel
->r_offset
));
4975 bfd_set_error (bfd_error_bad_value
);
4979 goto final_link_relocate
;
4985 #ifdef INCLUDE_SHMEDIA
4986 if (shmedia_prepare_reloc (info
, input_bfd
, input_section
,
4987 contents
, rel
, &relocation
))
4988 goto final_link_relocate
;
4990 bfd_set_error (bfd_error_bad_value
);
4998 goto final_link_relocate
;
5004 ((*_bfd_error_handler
)
5005 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
5006 input_section
->owner
,
5007 (unsigned long) rel
->r_offset
, howto
->name
,
5008 (unsigned long) relocation
));
5009 bfd_set_error (bfd_error_bad_value
);
5012 goto final_link_relocate
;
5019 ((*_bfd_error_handler
)
5020 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
5021 input_section
->owner
,
5022 (unsigned long) rel
->r_offset
, howto
->name
,
5023 (unsigned long) relocation
));
5024 bfd_set_error (bfd_error_bad_value
);
5027 goto final_link_relocate
;
5030 if ((signed int)relocation
< -32
5031 || (signed int)relocation
> 32)
5033 ((*_bfd_error_handler
)
5034 (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
5035 input_section
->owner
,
5036 (unsigned long) rel
->r_offset
,
5037 (unsigned long) relocation
));
5038 bfd_set_error (bfd_error_bad_value
);
5041 goto final_link_relocate
;
5044 if ((signed int)relocation
< -16
5045 || (signed int)relocation
> 16)
5047 ((*_bfd_error_handler
)
5048 (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
5049 input_section
->owner
,
5050 (unsigned long) rel
->r_offset
,
5051 (unsigned long) relocation
));
5052 bfd_set_error (bfd_error_bad_value
);
5055 goto final_link_relocate
;
5059 #ifdef INCLUDE_SHMEDIA
5060 case R_SH_IMM_LOW16_PCREL
:
5061 case R_SH_IMM_MEDLOW16_PCREL
:
5062 case R_SH_IMM_MEDHI16_PCREL
:
5063 case R_SH_IMM_HI16_PCREL
:
5067 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
5068 || h
->root
.type
!= bfd_link_hash_undefweak
)
5070 && (input_section
->flags
& SEC_ALLOC
) != 0
5071 && (r_type
== R_SH_DIR32
5072 || !SYMBOL_CALLS_LOCAL (info
, h
)))
5074 Elf_Internal_Rela outrel
;
5076 bfd_boolean skip
, relocate
;
5078 /* When generating a shared object, these relocations
5079 are copied into the output file to be resolved at run
5086 name
= (bfd_elf_string_from_elf_section
5088 elf_elfheader (input_bfd
)->e_shstrndx
,
5089 elf_section_data (input_section
)->rel_hdr
.sh_name
));
5093 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5094 && strcmp (bfd_get_section_name (input_bfd
,
5098 sreloc
= bfd_get_section_by_name (dynobj
, name
);
5099 BFD_ASSERT (sreloc
!= NULL
);
5106 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
5108 if (outrel
.r_offset
== (bfd_vma
) -1)
5110 else if (outrel
.r_offset
== (bfd_vma
) -2)
5111 skip
= TRUE
, relocate
= TRUE
;
5112 outrel
.r_offset
+= (input_section
->output_section
->vma
5113 + input_section
->output_offset
);
5116 memset (&outrel
, 0, sizeof outrel
);
5117 else if (r_type
== R_SH_REL32
)
5119 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
5120 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_REL32
);
5122 = bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
5124 #ifdef INCLUDE_SHMEDIA
5125 else if (r_type
== R_SH_IMM_LOW16_PCREL
5126 || r_type
== R_SH_IMM_MEDLOW16_PCREL
5127 || r_type
== R_SH_IMM_MEDHI16_PCREL
5128 || r_type
== R_SH_IMM_HI16_PCREL
)
5130 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
5131 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
5132 outrel
.r_addend
= addend
;
5137 /* h->dynindx may be -1 if this symbol was marked to
5140 || ((info
->symbolic
|| h
->dynindx
== -1)
5141 && (h
->elf_link_hash_flags
5142 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
5145 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
5147 = relocation
+ bfd_get_32 (input_bfd
,
5148 contents
+ rel
->r_offset
);
5152 BFD_ASSERT (h
->dynindx
!= -1);
5153 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_DIR32
);
5155 = relocation
+ bfd_get_32 (input_bfd
,
5156 contents
+ rel
->r_offset
);
5160 loc
= sreloc
->contents
;
5161 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5162 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5164 /* If this reloc is against an external symbol, we do
5165 not want to fiddle with the addend. Otherwise, we
5166 need to include the symbol value so that it becomes
5167 an addend for the dynamic reloc. */
5171 goto final_link_relocate
;
5174 #ifdef INCLUDE_SHMEDIA
5175 case R_SH_GOTPLT_LOW16
:
5176 case R_SH_GOTPLT_MEDLOW16
:
5177 case R_SH_GOTPLT_MEDHI16
:
5178 case R_SH_GOTPLT_HI16
:
5179 case R_SH_GOTPLT10BY4
:
5180 case R_SH_GOTPLT10BY8
:
5182 /* Relocation is to the entry for this symbol in the
5183 procedure linkage table. */
5186 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
5190 || h
->plt
.offset
== (bfd_vma
) -1
5191 || h
->got
.offset
!= (bfd_vma
) -1)
5194 /* Relocation is to the entry for this symbol in the global
5195 offset table extension for the procedure linkage table. */
5197 BFD_ASSERT (sgotplt
!= NULL
);
5198 relocation
= (sgotplt
->output_offset
5199 + ((h
->plt
.offset
/ elf_sh_sizeof_plt (info
)
5203 relocation
-= GOT_BIAS
;
5206 goto final_link_relocate
;
5210 #ifdef INCLUDE_SHMEDIA
5211 case R_SH_GOT_LOW16
:
5212 case R_SH_GOT_MEDLOW16
:
5213 case R_SH_GOT_MEDHI16
:
5218 /* Relocation is to the entry for this symbol in the global
5221 BFD_ASSERT (sgot
!= NULL
);
5227 off
= h
->got
.offset
;
5228 #ifdef INCLUDE_SHMEDIA
5229 if (seen_stt_datalabel
)
5231 struct elf_sh_link_hash_entry
*hsh
;
5233 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5234 off
= hsh
->datalabel_got
.offset
;
5237 BFD_ASSERT (off
!= (bfd_vma
) -1);
5239 dyn
= htab
->root
.dynamic_sections_created
;
5240 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
5242 && SYMBOL_REFERENCES_LOCAL (info
, h
))
5243 || (ELF_ST_VISIBILITY (h
->other
)
5244 && h
->root
.type
== bfd_link_hash_undefweak
))
5246 /* This is actually a static link, or it is a
5247 -Bsymbolic link and the symbol is defined
5248 locally, or the symbol was forced to be local
5249 because of a version file. We must initialize
5250 this entry in the global offset table. Since the
5251 offset must always be a multiple of 4, we use the
5252 least significant bit to record whether we have
5253 initialized it already.
5255 When doing a dynamic link, we create a .rela.got
5256 relocation entry to initialize the value. This
5257 is done in the finish_dynamic_symbol routine. */
5262 bfd_put_32 (output_bfd
, relocation
,
5263 sgot
->contents
+ off
);
5264 #ifdef INCLUDE_SHMEDIA
5265 if (seen_stt_datalabel
)
5267 struct elf_sh_link_hash_entry
*hsh
;
5269 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5270 hsh
->datalabel_got
.offset
|= 1;
5278 relocation
= sgot
->output_offset
+ off
;
5282 #ifdef INCLUDE_SHMEDIA
5285 BFD_ASSERT (local_got_offsets
!= NULL
5286 && (local_got_offsets
[symtab_hdr
->sh_info
5290 off
= local_got_offsets
[symtab_hdr
->sh_info
5296 BFD_ASSERT (local_got_offsets
!= NULL
5297 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
5299 off
= local_got_offsets
[r_symndx
];
5300 #ifdef INCLUDE_SHMEDIA
5304 /* The offset must always be a multiple of 4. We use
5305 the least significant bit to record whether we have
5306 already generated the necessary reloc. */
5311 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5315 Elf_Internal_Rela outrel
;
5318 if (srelgot
== NULL
)
5320 srelgot
= bfd_get_section_by_name (dynobj
,
5322 BFD_ASSERT (srelgot
!= NULL
);
5325 outrel
.r_offset
= (sgot
->output_section
->vma
5326 + sgot
->output_offset
5328 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
5329 outrel
.r_addend
= relocation
;
5330 loc
= srelgot
->contents
;
5331 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5332 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5335 #ifdef INCLUDE_SHMEDIA
5337 local_got_offsets
[symtab_hdr
->sh_info
+ r_symndx
] |= 1;
5340 local_got_offsets
[r_symndx
] |= 1;
5343 relocation
= sgot
->output_offset
+ off
;
5347 relocation
-= GOT_BIAS
;
5350 goto final_link_relocate
;
5353 #ifdef INCLUDE_SHMEDIA
5354 case R_SH_GOTOFF_LOW16
:
5355 case R_SH_GOTOFF_MEDLOW16
:
5356 case R_SH_GOTOFF_MEDHI16
:
5357 case R_SH_GOTOFF_HI16
:
5359 /* Relocation is relative to the start of the global offset
5362 BFD_ASSERT (sgot
!= NULL
);
5364 /* Note that sgot->output_offset is not involved in this
5365 calculation. We always want the start of .got. If we
5366 defined _GLOBAL_OFFSET_TABLE in a different way, as is
5367 permitted by the ABI, we might have to change this
5369 relocation
-= sgot
->output_section
->vma
;
5372 relocation
-= GOT_BIAS
;
5375 addend
= rel
->r_addend
;
5377 goto final_link_relocate
;
5380 #ifdef INCLUDE_SHMEDIA
5381 case R_SH_GOTPC_LOW16
:
5382 case R_SH_GOTPC_MEDLOW16
:
5383 case R_SH_GOTPC_MEDHI16
:
5384 case R_SH_GOTPC_HI16
:
5386 /* Use global offset table as symbol value. */
5388 BFD_ASSERT (sgot
!= NULL
);
5389 relocation
= sgot
->output_section
->vma
;
5392 relocation
+= GOT_BIAS
;
5395 addend
= rel
->r_addend
;
5397 goto final_link_relocate
;
5400 #ifdef INCLUDE_SHMEDIA
5401 case R_SH_PLT_LOW16
:
5402 case R_SH_PLT_MEDLOW16
:
5403 case R_SH_PLT_MEDHI16
:
5406 /* Relocation is to the entry for this symbol in the
5407 procedure linkage table. */
5409 /* Resolve a PLT reloc against a local symbol directly,
5410 without using the procedure linkage table. */
5412 goto final_link_relocate
;
5414 if (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
5415 goto final_link_relocate
;
5417 if (h
->plt
.offset
== (bfd_vma
) -1)
5419 /* We didn't make a PLT entry for this symbol. This
5420 happens when statically linking PIC code, or when
5421 using -Bsymbolic. */
5422 goto final_link_relocate
;
5425 BFD_ASSERT (splt
!= NULL
);
5426 relocation
= (splt
->output_section
->vma
5427 + splt
->output_offset
5430 #ifdef INCLUDE_SHMEDIA
5434 addend
= rel
->r_addend
;
5436 goto final_link_relocate
;
5438 case R_SH_LOOP_START
:
5440 static bfd_vma start
, end
;
5442 start
= (relocation
+ rel
->r_addend
5443 - (sec
->output_section
->vma
+ sec
->output_offset
));
5444 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5445 rel
->r_offset
, sec
, start
, end
);
5449 end
= (relocation
+ rel
->r_addend
5450 - (sec
->output_section
->vma
+ sec
->output_offset
));
5451 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5452 rel
->r_offset
, sec
, start
, end
);
5456 case R_SH_TLS_GD_32
:
5457 case R_SH_TLS_IE_32
:
5458 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
5459 tls_type
= GOT_UNKNOWN
;
5460 if (h
== NULL
&& local_got_offsets
)
5461 tls_type
= sh_elf_local_got_tls_type (input_bfd
) [r_symndx
];
5464 tls_type
= sh_elf_hash_entry (h
)->tls_type
;
5466 && (h
->dynindx
== -1
5467 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
5468 r_type
= R_SH_TLS_LE_32
;
5471 if (r_type
== R_SH_TLS_GD_32
&& tls_type
== GOT_TLS_IE
)
5472 r_type
= R_SH_TLS_IE_32
;
5474 if (r_type
== R_SH_TLS_LE_32
)
5477 unsigned short insn
;
5479 if (ELF32_R_TYPE (rel
->r_info
) == R_SH_TLS_GD_32
)
5481 /* GD->LE transition:
5482 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5483 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5484 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5486 mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
5488 1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:. */
5490 offset
= rel
->r_offset
;
5491 BFD_ASSERT (offset
>= 16);
5492 /* Size of GD instructions is 16 or 18. */
5494 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5495 if ((insn
& 0xff00) == 0xc700)
5497 BFD_ASSERT (offset
>= 2);
5499 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5502 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5503 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5504 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5505 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5506 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5507 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5508 BFD_ASSERT (insn
== 0x310c);
5509 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5510 BFD_ASSERT (insn
== 0x410b);
5511 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5512 BFD_ASSERT (insn
== 0x34cc);
5514 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 2);
5515 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 4);
5516 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5517 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5518 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5524 /* IE->LE transition:
5525 mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
5526 bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
5528 mov.l .Ln,rM; stc gbr,rN; nop; ...;
5531 offset
= rel
->r_offset
;
5532 BFD_ASSERT (offset
>= 16);
5533 /* Size of IE instructions is 10 or 12. */
5535 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5536 if ((insn
& 0xf0ff) == 0x0012)
5538 BFD_ASSERT (offset
>= 2);
5540 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5543 BFD_ASSERT ((insn
& 0xff00) == 0xd000);
5544 index
= insn
& 0x00ff;
5545 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5546 BFD_ASSERT ((insn
& 0xf0ff) == 0x0012);
5547 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5548 BFD_ASSERT ((insn
& 0xf0ff) == 0x00ce);
5549 insn
= 0xd000 | (insn
& 0x0f00) | index
;
5550 bfd_put_16 (output_bfd
, insn
, contents
+ offset
+ 0);
5551 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5554 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5555 contents
+ rel
->r_offset
);
5564 off
= h
->got
.offset
;
5567 if (local_got_offsets
== NULL
)
5570 off
= local_got_offsets
[r_symndx
];
5573 /* Relocate R_SH_TLS_IE_32 directly when statically linking. */
5574 if (r_type
== R_SH_TLS_IE_32
5575 && ! htab
->root
.dynamic_sections_created
)
5578 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5579 sgot
->contents
+ off
);
5580 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5581 contents
+ rel
->r_offset
);
5589 Elf_Internal_Rela outrel
;
5593 if (srelgot
== NULL
)
5595 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5596 BFD_ASSERT (srelgot
!= NULL
);
5599 outrel
.r_offset
= (sgot
->output_section
->vma
5600 + sgot
->output_offset
+ off
);
5602 if (h
== NULL
|| h
->dynindx
== -1)
5607 dr_type
= (r_type
== R_SH_TLS_GD_32
? R_SH_TLS_DTPMOD32
:
5609 if (dr_type
== R_SH_TLS_TPOFF32
&& indx
== 0)
5610 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5612 outrel
.r_addend
= 0;
5613 outrel
.r_info
= ELF32_R_INFO (indx
, dr_type
);
5614 loc
= srelgot
->contents
;
5615 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5616 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5618 if (r_type
== R_SH_TLS_GD_32
)
5622 bfd_put_32 (output_bfd
,
5623 relocation
- dtpoff_base (info
),
5624 sgot
->contents
+ off
+ 4);
5628 outrel
.r_info
= ELF32_R_INFO (indx
,
5630 outrel
.r_offset
+= 4;
5631 outrel
.r_addend
= 0;
5632 srelgot
->reloc_count
++;
5633 loc
+= sizeof (Elf32_External_Rela
);
5634 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5641 local_got_offsets
[r_symndx
] |= 1;
5644 if (off
>= (bfd_vma
) -2)
5647 if (r_type
== (int) ELF32_R_TYPE (rel
->r_info
))
5648 relocation
= sgot
->output_offset
+ off
;
5652 unsigned short insn
;
5654 /* GD->IE transition:
5655 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5656 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5657 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5659 mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
5660 nop; nop; bra 3f; nop; .align 2;
5661 1: .long x@TPOFF; 2:...; 3:. */
5663 offset
= rel
->r_offset
;
5664 BFD_ASSERT (offset
>= 16);
5665 /* Size of GD instructions is 16 or 18. */
5667 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5668 if ((insn
& 0xff00) == 0xc700)
5670 BFD_ASSERT (offset
>= 2);
5672 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5675 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5677 /* Replace mov.l 1f,R4 with mov.l 1f,r0. */
5678 bfd_put_16 (output_bfd
, insn
& 0xf0ff, contents
+ offset
);
5680 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5681 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5682 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5683 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5684 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5685 BFD_ASSERT (insn
== 0x310c);
5686 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5687 BFD_ASSERT (insn
== 0x410b);
5688 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5689 BFD_ASSERT (insn
== 0x34cc);
5691 bfd_put_16 (output_bfd
, 0x0412, contents
+ offset
+ 2);
5692 bfd_put_16 (output_bfd
, 0x00ce, contents
+ offset
+ 4);
5693 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 6);
5694 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5695 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5697 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5698 contents
+ rel
->r_offset
);
5703 addend
= rel
->r_addend
;
5705 goto final_link_relocate
;
5707 case R_SH_TLS_LD_32
:
5711 unsigned short insn
;
5713 /* LD->LE transition:
5714 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5715 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5716 1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
5718 stc gbr,r0; nop; nop; nop;
5719 nop; nop; bra 3f; ...; 3:. */
5721 offset
= rel
->r_offset
;
5722 BFD_ASSERT (offset
>= 16);
5723 /* Size of LD instructions is 16 or 18. */
5725 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5726 if ((insn
& 0xff00) == 0xc700)
5728 BFD_ASSERT (offset
>= 2);
5730 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5733 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5734 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5735 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5736 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5737 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5738 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5739 BFD_ASSERT (insn
== 0x310c);
5740 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5741 BFD_ASSERT (insn
== 0x410b);
5742 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5743 BFD_ASSERT (insn
== 0x34cc);
5745 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 0);
5746 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 2);
5747 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5748 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5749 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5750 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5759 off
= htab
->tls_ldm_got
.offset
;
5764 Elf_Internal_Rela outrel
;
5767 srelgot
= htab
->srelgot
;
5768 if (srelgot
== NULL
)
5771 outrel
.r_offset
= (sgot
->output_section
->vma
5772 + sgot
->output_offset
+ off
);
5773 outrel
.r_addend
= 0;
5774 outrel
.r_info
= ELF32_R_INFO (0, R_SH_TLS_DTPMOD32
);
5775 loc
= srelgot
->contents
;
5776 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5777 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5778 htab
->tls_ldm_got
.offset
|= 1;
5781 relocation
= sgot
->output_offset
+ off
;
5782 addend
= rel
->r_addend
;
5784 goto final_link_relocate
;
5786 case R_SH_TLS_LDO_32
:
5788 relocation
= tpoff (info
, relocation
);
5790 relocation
-= dtpoff_base (info
);
5792 addend
= rel
->r_addend
;
5793 goto final_link_relocate
;
5795 case R_SH_TLS_LE_32
:
5798 Elf_Internal_Rela outrel
;
5803 relocation
= tpoff (info
, relocation
);
5804 addend
= rel
->r_addend
;
5805 goto final_link_relocate
;
5812 name
= (bfd_elf_string_from_elf_section
5814 elf_elfheader (input_bfd
)->e_shstrndx
,
5815 elf_section_data (input_section
)->rel_hdr
.sh_name
));
5819 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5820 && strcmp (bfd_get_section_name (input_bfd
,
5824 sreloc
= bfd_get_section_by_name (dynobj
, name
);
5825 BFD_ASSERT (sreloc
!= NULL
);
5828 if (h
== NULL
|| h
->dynindx
== -1)
5833 outrel
.r_offset
= (input_section
->output_section
->vma
5834 + input_section
->output_offset
5836 outrel
.r_info
= ELF32_R_INFO (indx
, R_SH_TLS_TPOFF32
);
5838 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5840 outrel
.r_addend
= 0;
5842 loc
= sreloc
->contents
;
5843 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5844 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5850 if (r
!= bfd_reloc_ok
)
5855 case bfd_reloc_outofrange
:
5857 case bfd_reloc_overflow
:
5862 name
= h
->root
.root
.string
;
5865 name
= (bfd_elf_string_from_elf_section
5866 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
5870 name
= bfd_section_name (input_bfd
, sec
);
5872 if (! ((*info
->callbacks
->reloc_overflow
)
5873 (info
, name
, howto
->name
, (bfd_vma
) 0,
5874 input_bfd
, input_section
, rel
->r_offset
)))
5885 /* This is a version of bfd_generic_get_relocated_section_contents
5886 which uses sh_elf_relocate_section. */
5889 sh_elf_get_relocated_section_contents (bfd
*output_bfd
,
5890 struct bfd_link_info
*link_info
,
5891 struct bfd_link_order
*link_order
,
5893 bfd_boolean relocatable
,
5896 Elf_Internal_Shdr
*symtab_hdr
;
5897 asection
*input_section
= link_order
->u
.indirect
.section
;
5898 bfd
*input_bfd
= input_section
->owner
;
5899 asection
**sections
= NULL
;
5900 Elf_Internal_Rela
*internal_relocs
= NULL
;
5901 Elf_Internal_Sym
*isymbuf
= NULL
;
5903 /* We only need to handle the case of relaxing, or of having a
5904 particular set of section contents, specially. */
5906 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
5907 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
5912 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
5914 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
5915 (size_t) input_section
->size
);
5917 if ((input_section
->flags
& SEC_RELOC
) != 0
5918 && input_section
->reloc_count
> 0)
5921 Elf_Internal_Sym
*isym
, *isymend
;
5924 internal_relocs
= (_bfd_elf_link_read_relocs
5925 (input_bfd
, input_section
, NULL
,
5926 (Elf_Internal_Rela
*) NULL
, FALSE
));
5927 if (internal_relocs
== NULL
)
5930 if (symtab_hdr
->sh_info
!= 0)
5932 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
5933 if (isymbuf
== NULL
)
5934 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
5935 symtab_hdr
->sh_info
, 0,
5937 if (isymbuf
== NULL
)
5941 amt
= symtab_hdr
->sh_info
;
5942 amt
*= sizeof (asection
*);
5943 sections
= (asection
**) bfd_malloc (amt
);
5944 if (sections
== NULL
&& amt
!= 0)
5947 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
5948 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
5952 if (isym
->st_shndx
== SHN_UNDEF
)
5953 isec
= bfd_und_section_ptr
;
5954 else if (isym
->st_shndx
== SHN_ABS
)
5955 isec
= bfd_abs_section_ptr
;
5956 else if (isym
->st_shndx
== SHN_COMMON
)
5957 isec
= bfd_com_section_ptr
;
5959 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
5964 if (! sh_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
5965 input_section
, data
, internal_relocs
,
5969 if (sections
!= NULL
)
5972 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5974 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
5975 free (internal_relocs
);
5981 if (sections
!= NULL
)
5984 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5986 if (internal_relocs
!= NULL
5987 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
5988 free (internal_relocs
);
5992 /* Return the base VMA address which should be subtracted from real addresses
5993 when resolving @dtpoff relocation.
5994 This is PT_TLS segment p_vaddr. */
5997 dtpoff_base (struct bfd_link_info
*info
)
5999 /* If tls_sec is NULL, we should have signalled an error already. */
6000 if (elf_hash_table (info
)->tls_sec
== NULL
)
6002 return elf_hash_table (info
)->tls_sec
->vma
;
6005 /* Return the relocation value for R_SH_TLS_TPOFF32.. */
6008 tpoff (struct bfd_link_info
*info
, bfd_vma address
)
6010 /* If tls_sec is NULL, we should have signalled an error already. */
6011 if (elf_hash_table (info
)->tls_sec
== NULL
)
6013 /* SH TLS ABI is variant I and static TLS block start just after tcbhead
6014 structure which has 2 pointer fields. */
6015 return address
- elf_hash_table (info
)->tls_sec
->vma
+ 8;
6019 sh_elf_gc_mark_hook (asection
*sec
,
6020 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
6021 Elf_Internal_Rela
*rel
, struct elf_link_hash_entry
*h
,
6022 Elf_Internal_Sym
*sym
)
6026 switch (ELF32_R_TYPE (rel
->r_info
))
6028 case R_SH_GNU_VTINHERIT
:
6029 case R_SH_GNU_VTENTRY
:
6033 #ifdef INCLUDE_SHMEDIA
6034 while (h
->root
.type
== bfd_link_hash_indirect
6035 && h
->root
.u
.i
.link
)
6036 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6038 switch (h
->root
.type
)
6040 case bfd_link_hash_defined
:
6041 case bfd_link_hash_defweak
:
6042 return h
->root
.u
.def
.section
;
6044 case bfd_link_hash_common
:
6045 return h
->root
.u
.c
.p
->section
;
6053 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
6058 /* Update the got entry reference counts for the section being removed. */
6061 sh_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
6062 asection
*sec
, const Elf_Internal_Rela
*relocs
)
6064 Elf_Internal_Shdr
*symtab_hdr
;
6065 struct elf_link_hash_entry
**sym_hashes
;
6066 bfd_signed_vma
*local_got_refcounts
;
6067 const Elf_Internal_Rela
*rel
, *relend
;
6069 elf_section_data (sec
)->local_dynrel
= NULL
;
6071 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6072 sym_hashes
= elf_sym_hashes (abfd
);
6073 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6075 relend
= relocs
+ sec
->reloc_count
;
6076 for (rel
= relocs
; rel
< relend
; rel
++)
6078 unsigned long r_symndx
;
6079 unsigned int r_type
;
6080 struct elf_link_hash_entry
*h
= NULL
;
6081 #ifdef INCLUDE_SHMEDIA
6082 int seen_stt_datalabel
= 0;
6085 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6086 if (r_symndx
>= symtab_hdr
->sh_info
)
6088 struct elf_sh_link_hash_entry
*eh
;
6089 struct elf_sh_dyn_relocs
**pp
;
6090 struct elf_sh_dyn_relocs
*p
;
6092 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6093 #ifdef INCLUDE_SHMEDIA
6094 while (h
->root
.type
== bfd_link_hash_indirect
6095 || h
->root
.type
== bfd_link_hash_warning
)
6097 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
6098 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6101 eh
= (struct elf_sh_link_hash_entry
*) h
;
6102 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
6105 /* Everything must go for SEC. */
6111 r_type
= ELF32_R_TYPE (rel
->r_info
);
6112 switch (sh_elf_optimized_tls_reloc (info
, r_type
, h
!= NULL
))
6114 case R_SH_TLS_LD_32
:
6115 if (sh_elf_hash_table (info
)->tls_ldm_got
.refcount
> 0)
6116 sh_elf_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
6122 #ifdef INCLUDE_SHMEDIA
6123 case R_SH_GOT_LOW16
:
6124 case R_SH_GOT_MEDLOW16
:
6125 case R_SH_GOT_MEDHI16
:
6129 case R_SH_GOTOFF_LOW16
:
6130 case R_SH_GOTOFF_MEDLOW16
:
6131 case R_SH_GOTOFF_MEDHI16
:
6132 case R_SH_GOTOFF_HI16
:
6133 case R_SH_GOTPC_LOW16
:
6134 case R_SH_GOTPC_MEDLOW16
:
6135 case R_SH_GOTPC_MEDHI16
:
6136 case R_SH_GOTPC_HI16
:
6138 case R_SH_TLS_GD_32
:
6139 case R_SH_TLS_IE_32
:
6142 #ifdef INCLUDE_SHMEDIA
6143 if (seen_stt_datalabel
)
6145 struct elf_sh_link_hash_entry
*eh
;
6146 eh
= (struct elf_sh_link_hash_entry
*) h
;
6147 if (eh
->datalabel_got
.refcount
> 0)
6148 eh
->datalabel_got
.refcount
-= 1;
6152 if (h
->got
.refcount
> 0)
6153 h
->got
.refcount
-= 1;
6155 else if (local_got_refcounts
!= NULL
)
6157 #ifdef INCLUDE_SHMEDIA
6158 if (rel
->r_addend
& 1)
6160 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6161 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6165 if (local_got_refcounts
[r_symndx
] > 0)
6166 local_got_refcounts
[r_symndx
] -= 1;
6177 #ifdef INCLUDE_SHMEDIA
6178 case R_SH_PLT_LOW16
:
6179 case R_SH_PLT_MEDLOW16
:
6180 case R_SH_PLT_MEDHI16
:
6185 if (h
->plt
.refcount
> 0)
6186 h
->plt
.refcount
-= 1;
6191 #ifdef INCLUDE_SHMEDIA
6192 case R_SH_GOTPLT_LOW16
:
6193 case R_SH_GOTPLT_MEDLOW16
:
6194 case R_SH_GOTPLT_MEDHI16
:
6195 case R_SH_GOTPLT_HI16
:
6196 case R_SH_GOTPLT10BY4
:
6197 case R_SH_GOTPLT10BY8
:
6201 struct elf_sh_link_hash_entry
*eh
;
6202 eh
= (struct elf_sh_link_hash_entry
*) h
;
6203 if (eh
->gotplt_refcount
> 0)
6205 eh
->gotplt_refcount
-= 1;
6206 if (h
->plt
.refcount
> 0)
6207 h
->plt
.refcount
-= 1;
6209 #ifdef INCLUDE_SHMEDIA
6210 else if (seen_stt_datalabel
)
6212 if (eh
->datalabel_got
.refcount
> 0)
6213 eh
->datalabel_got
.refcount
-= 1;
6216 else if (h
->got
.refcount
> 0)
6217 h
->got
.refcount
-= 1;
6219 else if (local_got_refcounts
!= NULL
)
6221 #ifdef INCLUDE_SHMEDIA
6222 if (rel
->r_addend
& 1)
6224 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6225 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6229 if (local_got_refcounts
[r_symndx
] > 0)
6230 local_got_refcounts
[r_symndx
] -= 1;
6242 /* Copy the extra info we tack onto an elf_link_hash_entry. */
6245 sh_elf_copy_indirect_symbol (const struct elf_backend_data
*bed
,
6246 struct elf_link_hash_entry
*dir
,
6247 struct elf_link_hash_entry
*ind
)
6249 struct elf_sh_link_hash_entry
*edir
, *eind
;
6250 #ifdef INCLUDE_SHMEDIA
6254 edir
= (struct elf_sh_link_hash_entry
*) dir
;
6255 eind
= (struct elf_sh_link_hash_entry
*) ind
;
6257 if (eind
->dyn_relocs
!= NULL
)
6259 if (edir
->dyn_relocs
!= NULL
)
6261 struct elf_sh_dyn_relocs
**pp
;
6262 struct elf_sh_dyn_relocs
*p
;
6264 BFD_ASSERT (ind
->root
.type
!= bfd_link_hash_indirect
);
6266 /* Add reloc counts against the weak sym to the strong sym
6267 list. Merge any entries against the same section. */
6268 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
6270 struct elf_sh_dyn_relocs
*q
;
6272 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
6273 if (q
->sec
== p
->sec
)
6275 q
->pc_count
+= p
->pc_count
;
6276 q
->count
+= p
->count
;
6283 *pp
= edir
->dyn_relocs
;
6286 edir
->dyn_relocs
= eind
->dyn_relocs
;
6287 eind
->dyn_relocs
= NULL
;
6289 edir
->gotplt_refcount
= eind
->gotplt_refcount
;
6290 eind
->gotplt_refcount
= 0;
6291 #ifdef INCLUDE_SHMEDIA
6292 tmp
= edir
->datalabel_got
.refcount
;
6295 edir
->datalabel_got
.refcount
= eind
->datalabel_got
.refcount
;
6296 eind
->datalabel_got
.refcount
= tmp
;
6299 BFD_ASSERT (eind
->datalabel_got
.refcount
< 1);
6302 if (ind
->root
.type
== bfd_link_hash_indirect
6303 && dir
->got
.refcount
<= 0)
6305 edir
->tls_type
= eind
->tls_type
;
6306 eind
->tls_type
= GOT_UNKNOWN
;
6309 if (ind
->root
.type
!= bfd_link_hash_indirect
6310 && (dir
->elf_link_hash_flags
& ELF_LINK_HASH_DYNAMIC_ADJUSTED
) != 0)
6311 /* If called to transfer flags for a weakdef during processing
6312 of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
6313 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
6314 dir
->elf_link_hash_flags
|=
6315 (ind
->elf_link_hash_flags
& (ELF_LINK_HASH_REF_DYNAMIC
6316 | ELF_LINK_HASH_REF_REGULAR
6317 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
6318 | ELF_LINK_HASH_NEEDS_PLT
));
6320 _bfd_elf_link_hash_copy_indirect (bed
, dir
, ind
);
6324 sh_elf_optimized_tls_reloc (struct bfd_link_info
*info
, int r_type
,
6332 case R_SH_TLS_GD_32
:
6333 case R_SH_TLS_IE_32
:
6335 return R_SH_TLS_LE_32
;
6336 return R_SH_TLS_IE_32
;
6337 case R_SH_TLS_LD_32
:
6338 return R_SH_TLS_LE_32
;
6344 /* Look through the relocs for a section during the first phase.
6345 Since we don't do .gots or .plts, we just need to consider the
6346 virtual table relocs for gc. */
6349 sh_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
, asection
*sec
,
6350 const Elf_Internal_Rela
*relocs
)
6352 Elf_Internal_Shdr
*symtab_hdr
;
6353 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
6354 struct elf_sh_link_hash_table
*htab
;
6355 const Elf_Internal_Rela
*rel
;
6356 const Elf_Internal_Rela
*rel_end
;
6357 bfd_vma
*local_got_offsets
;
6361 unsigned int r_type
;
6362 int tls_type
, old_tls_type
;
6368 if (info
->relocatable
)
6371 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6372 sym_hashes
= elf_sym_hashes (abfd
);
6373 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof (Elf32_External_Sym
);
6374 if (!elf_bad_symtab (abfd
))
6375 sym_hashes_end
-= symtab_hdr
->sh_info
;
6377 htab
= sh_elf_hash_table (info
);
6378 local_got_offsets
= elf_local_got_offsets (abfd
);
6380 rel_end
= relocs
+ sec
->reloc_count
;
6381 for (rel
= relocs
; rel
< rel_end
; rel
++)
6383 struct elf_link_hash_entry
*h
;
6384 unsigned long r_symndx
;
6385 #ifdef INCLUDE_SHMEDIA
6386 int seen_stt_datalabel
= 0;
6389 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6390 r_type
= ELF32_R_TYPE (rel
->r_info
);
6392 if (r_symndx
< symtab_hdr
->sh_info
)
6396 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6397 #ifdef INCLUDE_SHMEDIA
6398 while (h
->root
.type
== bfd_link_hash_indirect
6399 || h
->root
.type
== bfd_link_hash_warning
)
6401 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
6402 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6407 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
6409 && r_type
== R_SH_TLS_IE_32
6411 && h
->root
.type
!= bfd_link_hash_undefined
6412 && h
->root
.type
!= bfd_link_hash_undefweak
6413 && (h
->dynindx
== -1
6414 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
6415 r_type
= R_SH_TLS_LE_32
;
6417 /* Some relocs require a global offset table. */
6418 if (htab
->sgot
== NULL
)
6426 #ifdef INCLUDE_SHMEDIA
6427 case R_SH_GOTPLT_LOW16
:
6428 case R_SH_GOTPLT_MEDLOW16
:
6429 case R_SH_GOTPLT_MEDHI16
:
6430 case R_SH_GOTPLT_HI16
:
6431 case R_SH_GOTPLT10BY4
:
6432 case R_SH_GOTPLT10BY8
:
6433 case R_SH_GOT_LOW16
:
6434 case R_SH_GOT_MEDLOW16
:
6435 case R_SH_GOT_MEDHI16
:
6439 case R_SH_GOTOFF_LOW16
:
6440 case R_SH_GOTOFF_MEDLOW16
:
6441 case R_SH_GOTOFF_MEDHI16
:
6442 case R_SH_GOTOFF_HI16
:
6443 case R_SH_GOTPC_LOW16
:
6444 case R_SH_GOTPC_MEDLOW16
:
6445 case R_SH_GOTPC_MEDHI16
:
6446 case R_SH_GOTPC_HI16
:
6448 case R_SH_TLS_GD_32
:
6449 case R_SH_TLS_LD_32
:
6450 case R_SH_TLS_IE_32
:
6451 if (htab
->sgot
== NULL
)
6453 if (htab
->root
.dynobj
== NULL
)
6454 htab
->root
.dynobj
= abfd
;
6455 if (!create_got_section (htab
->root
.dynobj
, info
))
6467 /* This relocation describes the C++ object vtable hierarchy.
6468 Reconstruct it for later use during GC. */
6469 case R_SH_GNU_VTINHERIT
:
6470 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
6474 /* This relocation describes which C++ vtable entries are actually
6475 used. Record for later use during GC. */
6476 case R_SH_GNU_VTENTRY
:
6477 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
6481 case R_SH_TLS_IE_32
:
6483 info
->flags
|= DF_STATIC_TLS
;
6487 case R_SH_TLS_GD_32
:
6489 #ifdef INCLUDE_SHMEDIA
6490 case R_SH_GOT_LOW16
:
6491 case R_SH_GOT_MEDLOW16
:
6492 case R_SH_GOT_MEDHI16
:
6500 tls_type
= GOT_NORMAL
;
6502 case R_SH_TLS_GD_32
:
6503 tls_type
= GOT_TLS_GD
;
6505 case R_SH_TLS_IE_32
:
6506 tls_type
= GOT_TLS_IE
;
6512 #ifdef INCLUDE_SHMEDIA
6513 if (seen_stt_datalabel
)
6515 struct elf_sh_link_hash_entry
*eh
6516 = (struct elf_sh_link_hash_entry
*) h
;
6518 eh
->datalabel_got
.refcount
+= 1;
6522 h
->got
.refcount
+= 1;
6523 old_tls_type
= sh_elf_hash_entry (h
)->tls_type
;
6527 bfd_signed_vma
*local_got_refcounts
;
6529 /* This is a global offset table entry for a local
6531 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6532 if (local_got_refcounts
== NULL
)
6536 size
= symtab_hdr
->sh_info
;
6537 size
*= sizeof (bfd_signed_vma
);
6538 #ifdef INCLUDE_SHMEDIA
6539 /* Reserve space for both the datalabel and
6540 codelabel local GOT offsets. */
6543 size
+= symtab_hdr
->sh_info
;
6544 local_got_refcounts
= ((bfd_signed_vma
*)
6545 bfd_zalloc (abfd
, size
));
6546 if (local_got_refcounts
== NULL
)
6548 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
6549 #ifdef INCLUDE_SHMEDIA
6550 /* Take care of both the datalabel and codelabel local
6552 sh_elf_local_got_tls_type (abfd
)
6553 = (char *) (local_got_refcounts
+ 2 * symtab_hdr
->sh_info
);
6555 sh_elf_local_got_tls_type (abfd
)
6556 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
6559 #ifdef INCLUDE_SHMEDIA
6560 if (rel
->r_addend
& 1)
6561 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] += 1;
6564 local_got_refcounts
[r_symndx
] += 1;
6565 old_tls_type
= sh_elf_local_got_tls_type (abfd
) [r_symndx
];
6568 /* If a TLS symbol is accessed using IE at least once,
6569 there is no point to use dynamic model for it. */
6570 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
6571 && (old_tls_type
!= GOT_TLS_GD
|| tls_type
!= GOT_TLS_IE
))
6573 if (old_tls_type
== GOT_TLS_IE
&& tls_type
== GOT_TLS_GD
)
6574 tls_type
= GOT_TLS_IE
;
6577 (*_bfd_error_handler
)
6578 (_("%B: `%s' accessed both as normal and thread local symbol"),
6579 abfd
, h
->root
.root
.string
);
6584 if (old_tls_type
!= tls_type
)
6587 sh_elf_hash_entry (h
)->tls_type
= tls_type
;
6589 sh_elf_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
6594 case R_SH_TLS_LD_32
:
6595 sh_elf_hash_table(info
)->tls_ldm_got
.refcount
+= 1;
6599 #ifdef INCLUDE_SHMEDIA
6600 case R_SH_GOTPLT_LOW16
:
6601 case R_SH_GOTPLT_MEDLOW16
:
6602 case R_SH_GOTPLT_MEDHI16
:
6603 case R_SH_GOTPLT_HI16
:
6604 case R_SH_GOTPLT10BY4
:
6605 case R_SH_GOTPLT10BY8
:
6607 /* If this is a local symbol, we resolve it directly without
6608 creating a procedure linkage table entry. */
6611 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
6614 || h
->dynindx
== -1)
6617 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
6618 h
->plt
.refcount
+= 1;
6619 ((struct elf_sh_link_hash_entry
*) h
)->gotplt_refcount
+= 1;
6624 #ifdef INCLUDE_SHMEDIA
6625 case R_SH_PLT_LOW16
:
6626 case R_SH_PLT_MEDLOW16
:
6627 case R_SH_PLT_MEDHI16
:
6630 /* This symbol requires a procedure linkage table entry. We
6631 actually build the entry in adjust_dynamic_symbol,
6632 because this might be a case of linking PIC code which is
6633 never referenced by a dynamic object, in which case we
6634 don't need to generate a procedure linkage table entry
6637 /* If this is a local symbol, we resolve it directly without
6638 creating a procedure linkage table entry. */
6642 if (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
6645 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
6646 h
->plt
.refcount
+= 1;
6651 #ifdef INCLUDE_SHMEDIA
6652 case R_SH_IMM_LOW16_PCREL
:
6653 case R_SH_IMM_MEDLOW16_PCREL
:
6654 case R_SH_IMM_MEDHI16_PCREL
:
6655 case R_SH_IMM_HI16_PCREL
:
6657 if (h
!= NULL
&& ! info
->shared
)
6659 h
->elf_link_hash_flags
|= ELF_LINK_NON_GOT_REF
;
6660 h
->plt
.refcount
+= 1;
6663 /* If we are creating a shared library, and this is a reloc
6664 against a global symbol, or a non PC relative reloc
6665 against a local symbol, then we need to copy the reloc
6666 into the shared library. However, if we are linking with
6667 -Bsymbolic, we do not need to copy a reloc against a
6668 global symbol which is defined in an object we are
6669 including in the link (i.e., DEF_REGULAR is set). At
6670 this point we have not seen all the input files, so it is
6671 possible that DEF_REGULAR is not set now but will be set
6672 later (it is never cleared). We account for that
6673 possibility below by storing information in the
6674 dyn_relocs field of the hash table entry. A similar
6675 situation occurs when creating shared libraries and symbol
6676 visibility changes render the symbol local.
6678 If on the other hand, we are creating an executable, we
6679 may need to keep relocations for symbols satisfied by a
6680 dynamic library if we manage to avoid copy relocs for the
6683 && (sec
->flags
& SEC_ALLOC
) != 0
6684 && (r_type
!= R_SH_REL32
6686 && (! info
->symbolic
6687 || h
->root
.type
== bfd_link_hash_defweak
6688 || (h
->elf_link_hash_flags
6689 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
6691 && (sec
->flags
& SEC_ALLOC
) != 0
6693 && (h
->root
.type
== bfd_link_hash_defweak
6694 || (h
->elf_link_hash_flags
6695 & ELF_LINK_HASH_DEF_REGULAR
) == 0)))
6697 struct elf_sh_dyn_relocs
*p
;
6698 struct elf_sh_dyn_relocs
**head
;
6700 if (htab
->root
.dynobj
== NULL
)
6701 htab
->root
.dynobj
= abfd
;
6703 /* When creating a shared object, we must copy these
6704 reloc types into the output file. We create a reloc
6705 section in dynobj and make room for this reloc. */
6710 name
= (bfd_elf_string_from_elf_section
6712 elf_elfheader (abfd
)->e_shstrndx
,
6713 elf_section_data (sec
)->rel_hdr
.sh_name
));
6717 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
6718 && strcmp (bfd_get_section_name (abfd
, sec
),
6721 sreloc
= bfd_get_section_by_name (htab
->root
.dynobj
, name
);
6726 sreloc
= bfd_make_section (htab
->root
.dynobj
, name
);
6727 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
6728 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
6729 if ((sec
->flags
& SEC_ALLOC
) != 0)
6730 flags
|= SEC_ALLOC
| SEC_LOAD
;
6732 || ! bfd_set_section_flags (htab
->root
.dynobj
,
6734 || ! bfd_set_section_alignment (htab
->root
.dynobj
,
6738 elf_section_data (sec
)->sreloc
= sreloc
;
6741 /* If this is a global symbol, we count the number of
6742 relocations we need for this symbol. */
6744 head
= &((struct elf_sh_link_hash_entry
*) h
)->dyn_relocs
;
6749 /* Track dynamic relocs needed for local syms too. */
6750 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
6755 head
= ((struct elf_sh_dyn_relocs
**)
6756 &elf_section_data (s
)->local_dynrel
);
6760 if (p
== NULL
|| p
->sec
!= sec
)
6762 bfd_size_type amt
= sizeof (*p
);
6763 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
6774 if (r_type
== R_SH_REL32
6775 #ifdef INCLUDE_SHMEDIA
6776 || r_type
== R_SH_IMM_LOW16_PCREL
6777 || r_type
== R_SH_IMM_MEDLOW16_PCREL
6778 || r_type
== R_SH_IMM_MEDHI16_PCREL
6779 || r_type
== R_SH_IMM_HI16_PCREL
6787 case R_SH_TLS_LE_32
:
6790 (*_bfd_error_handler
)
6791 (_("%B: TLS local exec code cannot be linked into shared objects"),
6798 case R_SH_TLS_LDO_32
:
6799 /* Nothing to do. */
6810 #ifndef sh_elf_set_mach_from_flags
6811 static unsigned int sh_ef_bfd_table
[] = { EF_SH_BFD_TABLE
};
6814 sh_elf_set_mach_from_flags (bfd
*abfd
)
6816 flagword flags
= elf_elfheader (abfd
)->e_flags
& EF_SH_MACH_MASK
;
6818 if (flags
>= sizeof(sh_ef_bfd_table
))
6821 if (sh_ef_bfd_table
[flags
] == 0)
6824 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, sh_ef_bfd_table
[flags
]);
6830 /* Reverse table lookup for sh_ef_bfd_table[].
6831 Given a bfd MACH value from archures.c
6832 return the equivalent ELF flags from the table.
6833 Return -1 if no match is found. */
6836 sh_elf_get_flags_from_mach (unsigned long mach
)
6838 int i
= ARRAY_SIZE (sh_ef_bfd_table
);
6841 if (sh_ef_bfd_table
[i
] == mach
)
6844 /* shouldn't get here */
6849 #endif /* not sh_elf_set_mach_from_flags */
6851 #ifndef sh_elf_set_private_flags
6852 /* Function to keep SH specific file flags. */
6855 sh_elf_set_private_flags (bfd
*abfd
, flagword flags
)
6857 BFD_ASSERT (! elf_flags_init (abfd
)
6858 || elf_elfheader (abfd
)->e_flags
== flags
);
6860 elf_elfheader (abfd
)->e_flags
= flags
;
6861 elf_flags_init (abfd
) = TRUE
;
6862 return sh_elf_set_mach_from_flags (abfd
);
6864 #endif /* not sh_elf_set_private_flags */
6866 #ifndef sh_elf_copy_private_data
6867 /* Copy backend specific data from one object module to another */
6870 sh_elf_copy_private_data (bfd
* ibfd
, bfd
* obfd
)
6872 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6873 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6876 return sh_elf_set_private_flags (obfd
, elf_elfheader (ibfd
)->e_flags
);
6878 #endif /* not sh_elf_copy_private_data */
6880 #ifndef sh_elf_merge_private_data
6882 /* This function returns the ELF architecture number that
6883 corresponds to the given arch_sh* flags. */
6886 sh_find_elf_flags (unsigned int arch_set
)
6888 extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int);
6889 unsigned long bfd_mach
= sh_get_bfd_mach_from_arch_set (arch_set
);
6891 return sh_elf_get_flags_from_mach (bfd_mach
);
6894 /* This routine initialises the elf flags when required and
6895 calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */
6898 sh_elf_merge_private_data (bfd
*ibfd
, bfd
*obfd
)
6900 extern bfd_boolean
sh_merge_bfd_arch (bfd
*, bfd
*);
6902 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6903 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6906 if (! elf_flags_init (obfd
))
6908 /* This happens when ld starts out with a 'blank' output file. */
6909 elf_flags_init (obfd
) = TRUE
;
6910 elf_elfheader (obfd
)->e_flags
= EF_SH1
;
6911 sh_elf_set_mach_from_flags (obfd
);
6914 if (! sh_merge_bfd_arch (ibfd
, obfd
))
6916 _bfd_error_handler ("%B: uses instructions which are incompatible "
6917 "with instructions used in previous modules",
6919 bfd_set_error (bfd_error_bad_value
);
6923 elf_elfheader (obfd
)->e_flags
=
6924 sh_elf_get_flags_from_mach (bfd_get_mach (obfd
));
6928 #endif /* not sh_elf_merge_private_data */
6930 /* Override the generic function because we need to store sh_elf_obj_tdata
6931 as the specific tdata. We set also the machine architecture from flags
6935 sh_elf_object_p (bfd
*abfd
)
6937 return sh_elf_set_mach_from_flags (abfd
);
6940 /* Finish up dynamic symbol handling. We set the contents of various
6941 dynamic sections here. */
6944 sh_elf_finish_dynamic_symbol (bfd
*output_bfd
, struct bfd_link_info
*info
,
6945 struct elf_link_hash_entry
*h
,
6946 Elf_Internal_Sym
*sym
)
6948 struct elf_sh_link_hash_table
*htab
;
6950 htab
= sh_elf_hash_table (info
);
6952 if (h
->plt
.offset
!= (bfd_vma
) -1)
6960 Elf_Internal_Rela rel
;
6963 /* This symbol has an entry in the procedure linkage table. Set
6966 BFD_ASSERT (h
->dynindx
!= -1);
6969 sgot
= htab
->sgotplt
;
6970 srel
= htab
->srelplt
;
6971 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srel
!= NULL
);
6973 /* Get the index in the procedure linkage table which
6974 corresponds to this symbol. This is the index of this symbol
6975 in all the symbols for which we are making plt entries. The
6976 first entry in the procedure linkage table is reserved. */
6977 plt_index
= h
->plt
.offset
/ elf_sh_sizeof_plt (info
) - 1;
6979 /* Get the offset into the .got table of the entry that
6980 corresponds to this function. Each .got entry is 4 bytes.
6981 The first three are reserved. */
6982 got_offset
= (plt_index
+ 3) * 4;
6986 got_offset
-= GOT_BIAS
;
6989 /* Fill in the entry in the procedure linkage table. */
6992 if (elf_sh_plt_entry
== NULL
)
6994 elf_sh_plt_entry
= (bfd_big_endian (output_bfd
) ?
6995 elf_sh_plt_entry_be
: elf_sh_plt_entry_le
);
6997 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_plt_entry
,
6998 elf_sh_sizeof_plt (info
));
6999 #ifdef INCLUDE_SHMEDIA
7000 movi_shori_putval (output_bfd
,
7001 (sgot
->output_section
->vma
7002 + sgot
->output_offset
7004 (splt
->contents
+ h
->plt
.offset
7005 + elf_sh_plt_symbol_offset (info
)));
7007 /* Set bottom bit because its for a branch to SHmedia */
7008 movi_shori_putval (output_bfd
,
7009 (splt
->output_section
->vma
+ splt
->output_offset
)
7011 (splt
->contents
+ h
->plt
.offset
7012 + elf_sh_plt_plt0_offset (info
)));
7014 bfd_put_32 (output_bfd
,
7015 (sgot
->output_section
->vma
7016 + sgot
->output_offset
7018 (splt
->contents
+ h
->plt
.offset
7019 + elf_sh_plt_symbol_offset (info
)));
7021 bfd_put_32 (output_bfd
,
7022 (splt
->output_section
->vma
+ splt
->output_offset
),
7023 (splt
->contents
+ h
->plt
.offset
7024 + elf_sh_plt_plt0_offset (info
)));
7029 if (elf_sh_pic_plt_entry
== NULL
)
7031 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
7032 elf_sh_pic_plt_entry_be
:
7033 elf_sh_pic_plt_entry_le
);
7035 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_pic_plt_entry
,
7036 elf_sh_sizeof_plt (info
));
7037 #ifdef INCLUDE_SHMEDIA
7038 movi_shori_putval (output_bfd
, got_offset
,
7039 (splt
->contents
+ h
->plt
.offset
7040 + elf_sh_plt_symbol_offset (info
)));
7042 bfd_put_32 (output_bfd
, got_offset
,
7043 (splt
->contents
+ h
->plt
.offset
7044 + elf_sh_plt_symbol_offset (info
)));
7050 got_offset
+= GOT_BIAS
;
7053 #ifdef INCLUDE_SHMEDIA
7054 movi_shori_putval (output_bfd
,
7055 plt_index
* sizeof (Elf32_External_Rela
),
7056 (splt
->contents
+ h
->plt
.offset
7057 + elf_sh_plt_reloc_offset (info
)));
7059 bfd_put_32 (output_bfd
, plt_index
* sizeof (Elf32_External_Rela
),
7060 (splt
->contents
+ h
->plt
.offset
7061 + elf_sh_plt_reloc_offset (info
)));
7064 /* Fill in the entry in the global offset table. */
7065 bfd_put_32 (output_bfd
,
7066 (splt
->output_section
->vma
7067 + splt
->output_offset
7069 + elf_sh_plt_temp_offset (info
)),
7070 sgot
->contents
+ got_offset
);
7072 /* Fill in the entry in the .rela.plt section. */
7073 rel
.r_offset
= (sgot
->output_section
->vma
7074 + sgot
->output_offset
7076 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_JMP_SLOT
);
7079 rel
.r_addend
= GOT_BIAS
;
7081 loc
= srel
->contents
+ plt_index
* sizeof (Elf32_External_Rela
);
7082 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7084 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
7086 /* Mark the symbol as undefined, rather than as defined in
7087 the .plt section. Leave the value alone. */
7088 sym
->st_shndx
= SHN_UNDEF
;
7092 if (h
->got
.offset
!= (bfd_vma
) -1
7093 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_GD
7094 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_IE
)
7098 Elf_Internal_Rela rel
;
7101 /* This symbol has an entry in the global offset table. Set it
7105 srel
= htab
->srelgot
;
7106 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
7108 rel
.r_offset
= (sgot
->output_section
->vma
7109 + sgot
->output_offset
7110 + (h
->got
.offset
&~ (bfd_vma
) 1));
7112 /* If this is a static link, or it is a -Bsymbolic link and the
7113 symbol is defined locally or was forced to be local because
7114 of a version file, we just want to emit a RELATIVE reloc.
7115 The entry in the global offset table will already have been
7116 initialized in the relocate_section function. */
7118 && SYMBOL_REFERENCES_LOCAL (info
, h
))
7120 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
7121 rel
.r_addend
= (h
->root
.u
.def
.value
7122 + h
->root
.u
.def
.section
->output_section
->vma
7123 + h
->root
.u
.def
.section
->output_offset
);
7127 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
7128 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
7132 loc
= srel
->contents
;
7133 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7134 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7137 #ifdef INCLUDE_SHMEDIA
7139 struct elf_sh_link_hash_entry
*eh
;
7141 eh
= (struct elf_sh_link_hash_entry
*) h
;
7142 if (eh
->datalabel_got
.offset
!= (bfd_vma
) -1)
7146 Elf_Internal_Rela rel
;
7149 /* This symbol has a datalabel entry in the global offset table.
7153 srel
= htab
->srelgot
;
7154 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
7156 rel
.r_offset
= (sgot
->output_section
->vma
7157 + sgot
->output_offset
7158 + (eh
->datalabel_got
.offset
&~ (bfd_vma
) 1));
7160 /* If this is a static link, or it is a -Bsymbolic link and the
7161 symbol is defined locally or was forced to be local because
7162 of a version file, we just want to emit a RELATIVE reloc.
7163 The entry in the global offset table will already have been
7164 initialized in the relocate_section function. */
7166 && SYMBOL_REFERENCES_LOCAL (info
, h
))
7168 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
7169 rel
.r_addend
= (h
->root
.u
.def
.value
7170 + h
->root
.u
.def
.section
->output_section
->vma
7171 + h
->root
.u
.def
.section
->output_offset
);
7175 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
7176 + eh
->datalabel_got
.offset
);
7177 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
7181 loc
= srel
->contents
;
7182 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7183 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7188 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
7191 Elf_Internal_Rela rel
;
7194 /* This symbol needs a copy reloc. Set it up. */
7196 BFD_ASSERT (h
->dynindx
!= -1
7197 && (h
->root
.type
== bfd_link_hash_defined
7198 || h
->root
.type
== bfd_link_hash_defweak
));
7200 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
7202 BFD_ASSERT (s
!= NULL
);
7204 rel
.r_offset
= (h
->root
.u
.def
.value
7205 + h
->root
.u
.def
.section
->output_section
->vma
7206 + h
->root
.u
.def
.section
->output_offset
);
7207 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_COPY
);
7209 loc
= s
->contents
+ s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7210 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7213 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
7214 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
7215 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
7216 sym
->st_shndx
= SHN_ABS
;
7221 /* Finish up the dynamic sections. */
7224 sh_elf_finish_dynamic_sections (bfd
*output_bfd
, struct bfd_link_info
*info
)
7226 struct elf_sh_link_hash_table
*htab
;
7230 htab
= sh_elf_hash_table (info
);
7231 sgot
= htab
->sgotplt
;
7232 sdyn
= bfd_get_section_by_name (htab
->root
.dynobj
, ".dynamic");
7234 if (htab
->root
.dynamic_sections_created
)
7237 Elf32_External_Dyn
*dyncon
, *dynconend
;
7239 BFD_ASSERT (sgot
!= NULL
&& sdyn
!= NULL
);
7241 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
7242 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
7243 for (; dyncon
< dynconend
; dyncon
++)
7245 Elf_Internal_Dyn dyn
;
7247 #ifdef INCLUDE_SHMEDIA
7251 bfd_elf32_swap_dyn_in (htab
->root
.dynobj
, dyncon
, &dyn
);
7258 #ifdef INCLUDE_SHMEDIA
7260 name
= info
->init_function
;
7264 name
= info
->fini_function
;
7266 if (dyn
.d_un
.d_val
!= 0)
7268 struct elf_link_hash_entry
*h
;
7270 h
= elf_link_hash_lookup (&htab
->root
, name
,
7271 FALSE
, FALSE
, TRUE
);
7272 if (h
!= NULL
&& (h
->other
& STO_SH5_ISA32
))
7274 dyn
.d_un
.d_val
|= 1;
7275 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7282 s
= htab
->sgot
->output_section
;
7286 s
= htab
->srelplt
->output_section
;
7288 BFD_ASSERT (s
!= NULL
);
7289 dyn
.d_un
.d_ptr
= s
->vma
;
7290 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7294 s
= htab
->srelplt
->output_section
;
7295 BFD_ASSERT (s
!= NULL
);
7296 dyn
.d_un
.d_val
= s
->size
;
7297 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7301 /* My reading of the SVR4 ABI indicates that the
7302 procedure linkage table relocs (DT_JMPREL) should be
7303 included in the overall relocs (DT_RELA). This is
7304 what Solaris does. However, UnixWare can not handle
7305 that case. Therefore, we override the DT_RELASZ entry
7306 here to make it not include the JMPREL relocs. Since
7307 the linker script arranges for .rela.plt to follow all
7308 other relocation sections, we don't have to worry
7309 about changing the DT_RELA entry. */
7310 if (htab
->srelplt
!= NULL
)
7312 s
= htab
->srelplt
->output_section
;
7313 dyn
.d_un
.d_val
-= s
->size
;
7315 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7320 /* Fill in the first entry in the procedure linkage table. */
7322 if (splt
&& splt
->size
> 0)
7326 if (elf_sh_pic_plt_entry
== NULL
)
7328 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
7329 elf_sh_pic_plt_entry_be
:
7330 elf_sh_pic_plt_entry_le
);
7332 memcpy (splt
->contents
, elf_sh_pic_plt_entry
,
7333 elf_sh_sizeof_plt (info
));
7337 if (elf_sh_plt0_entry
== NULL
)
7339 elf_sh_plt0_entry
= (bfd_big_endian (output_bfd
) ?
7340 elf_sh_plt0_entry_be
:
7341 elf_sh_plt0_entry_le
);
7343 memcpy (splt
->contents
, elf_sh_plt0_entry
, PLT_ENTRY_SIZE
);
7344 #ifdef INCLUDE_SHMEDIA
7345 movi_shori_putval (output_bfd
,
7346 sgot
->output_section
->vma
7347 + sgot
->output_offset
,
7349 + elf_sh_plt0_gotplt_offset (info
));
7351 bfd_put_32 (output_bfd
,
7352 sgot
->output_section
->vma
+ sgot
->output_offset
+ 4,
7353 splt
->contents
+ elf_sh_plt0_gotid_offset (info
));
7354 bfd_put_32 (output_bfd
,
7355 sgot
->output_section
->vma
+ sgot
->output_offset
+ 8,
7356 splt
->contents
+ elf_sh_plt0_linker_offset (info
));
7360 /* UnixWare sets the entsize of .plt to 4, although that doesn't
7361 really seem like the right value. */
7362 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
7366 /* Fill in the first three entries in the global offset table. */
7367 if (sgot
&& sgot
->size
> 0)
7370 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
7372 bfd_put_32 (output_bfd
,
7373 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
7375 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
7376 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
7378 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
7384 static enum elf_reloc_type_class
7385 sh_elf_reloc_type_class (const Elf_Internal_Rela
*rela
)
7387 switch ((int) ELF32_R_TYPE (rela
->r_info
))
7390 return reloc_class_relative
;
7392 return reloc_class_plt
;
7394 return reloc_class_copy
;
7396 return reloc_class_normal
;
7400 #if !defined SH_TARGET_ALREADY_DEFINED
7401 /* Support for Linux core dump NOTE sections. */
7404 elf32_shlin_grok_prstatus (bfd
*abfd
, Elf_Internal_Note
*note
)
7409 switch (note
->descsz
)
7414 case 168: /* Linux/SH */
7416 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
7419 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
7428 /* Make a ".reg/999" section. */
7429 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
7430 size
, note
->descpos
+ offset
);
7434 elf32_shlin_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
7436 switch (note
->descsz
)
7441 case 124: /* Linux/SH elf_prpsinfo */
7442 elf_tdata (abfd
)->core_program
7443 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
7444 elf_tdata (abfd
)->core_command
7445 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
7448 /* Note that for some reason, a spurious space is tacked
7449 onto the end of the args in some (at least one anyway)
7450 implementations, so strip it off if it exists. */
7453 char *command
= elf_tdata (abfd
)->core_command
;
7454 int n
= strlen (command
);
7456 if (0 < n
&& command
[n
- 1] == ' ')
7457 command
[n
- 1] = '\0';
7462 #endif /* not SH_TARGET_ALREADY_DEFINED */
7465 /* Return address for Ith PLT stub in section PLT, for relocation REL
7466 or (bfd_vma) -1 if it should not be included. */
7469 sh_elf_plt_sym_val (bfd_vma i
, const asection
*plt
,
7470 const arelent
*rel ATTRIBUTE_UNUSED
)
7472 return plt
->vma
+ (i
+ 1) * PLT_ENTRY_SIZE
;
7475 #if !defined SH_TARGET_ALREADY_DEFINED
7476 #define TARGET_BIG_SYM bfd_elf32_sh_vec
7477 #define TARGET_BIG_NAME "elf32-sh"
7478 #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
7479 #define TARGET_LITTLE_NAME "elf32-shl"
7482 #define ELF_ARCH bfd_arch_sh
7483 #define ELF_MACHINE_CODE EM_SH
7484 #ifdef __QNXTARGET__
7485 #define ELF_MAXPAGESIZE 0x1000
7487 #define ELF_MAXPAGESIZE 0x80
7490 #define elf_symbol_leading_char '_'
7492 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
7493 #define elf_info_to_howto sh_elf_info_to_howto
7494 #define bfd_elf32_bfd_relax_section sh_elf_relax_section
7495 #define elf_backend_relocate_section sh_elf_relocate_section
7496 #define bfd_elf32_bfd_get_relocated_section_contents \
7497 sh_elf_get_relocated_section_contents
7498 #define bfd_elf32_mkobject sh_elf_mkobject
7499 #define elf_backend_object_p sh_elf_object_p
7500 #define bfd_elf32_bfd_set_private_bfd_flags \
7501 sh_elf_set_private_flags
7502 #define bfd_elf32_bfd_copy_private_bfd_data \
7503 sh_elf_copy_private_data
7504 #define bfd_elf32_bfd_merge_private_bfd_data \
7505 sh_elf_merge_private_data
7507 #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
7508 #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
7509 #define elf_backend_check_relocs sh_elf_check_relocs
7510 #define elf_backend_copy_indirect_symbol \
7511 sh_elf_copy_indirect_symbol
7512 #define elf_backend_create_dynamic_sections \
7513 sh_elf_create_dynamic_sections
7514 #define bfd_elf32_bfd_link_hash_table_create \
7515 sh_elf_link_hash_table_create
7516 #define elf_backend_adjust_dynamic_symbol \
7517 sh_elf_adjust_dynamic_symbol
7518 #define elf_backend_size_dynamic_sections \
7519 sh_elf_size_dynamic_sections
7520 #define elf_backend_finish_dynamic_symbol \
7521 sh_elf_finish_dynamic_symbol
7522 #define elf_backend_finish_dynamic_sections \
7523 sh_elf_finish_dynamic_sections
7524 #define elf_backend_reloc_type_class sh_elf_reloc_type_class
7525 #define elf_backend_plt_sym_val sh_elf_plt_sym_val
7527 #define elf_backend_can_gc_sections 1
7528 #define elf_backend_can_refcount 1
7529 #define elf_backend_want_got_plt 1
7530 #define elf_backend_plt_readonly 1
7531 #define elf_backend_want_plt_sym 0
7532 #define elf_backend_got_header_size 12
7534 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
7536 #include "elf32-target.h"
7538 /* NetBSD support. */
7539 #undef TARGET_BIG_SYM
7540 #define TARGET_BIG_SYM bfd_elf32_shnbsd_vec
7541 #undef TARGET_BIG_NAME
7542 #define TARGET_BIG_NAME "elf32-sh-nbsd"
7543 #undef TARGET_LITTLE_SYM
7544 #define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec
7545 #undef TARGET_LITTLE_NAME
7546 #define TARGET_LITTLE_NAME "elf32-shl-nbsd"
7547 #undef ELF_MAXPAGESIZE
7548 #define ELF_MAXPAGESIZE 0x10000
7549 #undef elf_symbol_leading_char
7550 #define elf_symbol_leading_char 0
7552 #define elf32_bed elf32_sh_nbsd_bed
7554 #include "elf32-target.h"
7557 /* Linux support. */
7558 #undef TARGET_BIG_SYM
7559 #define TARGET_BIG_SYM bfd_elf32_shblin_vec
7560 #undef TARGET_BIG_NAME
7561 #define TARGET_BIG_NAME "elf32-shbig-linux"
7562 #undef TARGET_LITTLE_SYM
7563 #define TARGET_LITTLE_SYM bfd_elf32_shlin_vec
7564 #undef TARGET_LITTLE_NAME
7565 #define TARGET_LITTLE_NAME "elf32-sh-linux"
7567 #undef elf_backend_grok_prstatus
7568 #define elf_backend_grok_prstatus elf32_shlin_grok_prstatus
7569 #undef elf_backend_grok_psinfo
7570 #define elf_backend_grok_psinfo elf32_shlin_grok_psinfo
7572 #define elf32_bed elf32_sh_lin_bed
7574 #include "elf32-target.h"
7576 #endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */