1 /* Renesas / SuperH SH specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
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. */
29 static bfd_reloc_status_type sh_elf_reloc
30 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
31 static bfd_reloc_status_type sh_elf_ignore_reloc
32 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
33 static reloc_howto_type
*sh_elf_reloc_type_lookup
34 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
35 static void sh_elf_info_to_howto
36 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
37 static bfd_boolean sh_elf_set_private_flags
38 PARAMS ((bfd
*, flagword
));
39 static bfd_boolean sh_elf_copy_private_data
40 PARAMS ((bfd
*, bfd
*));
41 static bfd_boolean sh_elf_merge_private_data
42 PARAMS ((bfd
*, bfd
*));
43 static bfd_boolean sh_elf_set_mach_from_flags
45 static bfd_boolean sh_elf_relax_section
46 PARAMS ((bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*));
47 static bfd_boolean sh_elf_relax_delete_bytes
48 PARAMS ((bfd
*, asection
*, bfd_vma
, int));
49 static bfd_boolean sh_elf_align_loads
50 PARAMS ((bfd
*, asection
*, Elf_Internal_Rela
*, bfd_byte
*, bfd_boolean
*));
51 static bfd_boolean sh_elf_swap_insns
52 PARAMS ((bfd
*, asection
*, PTR
, bfd_byte
*, bfd_vma
));
53 static bfd_boolean sh_elf_relocate_section
54 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
55 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
56 static bfd_byte
*sh_elf_get_relocated_section_contents
57 PARAMS ((bfd
*, struct bfd_link_info
*, struct bfd_link_order
*,
58 bfd_byte
*, bfd_boolean
, asymbol
**));
59 static void sh_elf_copy_indirect_symbol
60 PARAMS ((struct elf_backend_data
*, struct elf_link_hash_entry
*,
61 struct elf_link_hash_entry
*));
62 static int sh_elf_optimized_tls_reloc
63 PARAMS ((struct bfd_link_info
*, int, int));
64 static bfd_boolean sh_elf_mkobject
66 static bfd_boolean sh_elf_object_p
68 static bfd_boolean sh_elf_check_relocs
69 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
70 const Elf_Internal_Rela
*));
71 static struct bfd_hash_entry
*sh_elf_link_hash_newfunc
72 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *));
73 static struct bfd_link_hash_table
*sh_elf_link_hash_table_create
75 static bfd_boolean sh_elf_adjust_dynamic_symbol
76 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
77 static bfd_boolean sh_elf_size_dynamic_sections
78 PARAMS ((bfd
*, struct bfd_link_info
*));
79 static bfd_boolean sh_elf_finish_dynamic_symbol
80 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
82 static bfd_boolean sh_elf_finish_dynamic_sections
83 PARAMS ((bfd
*, struct bfd_link_info
*));
84 static bfd_reloc_status_type sh_elf_reloc_loop
85 PARAMS ((int, bfd
*, asection
*, bfd_byte
*, bfd_vma
, asection
*,
87 static bfd_boolean create_got_section
88 PARAMS ((bfd
*, struct bfd_link_info
*));
89 static bfd_boolean sh_elf_create_dynamic_sections
90 PARAMS ((bfd
*, struct bfd_link_info
*));
91 static bfd_vma dtpoff_base
92 PARAMS ((struct bfd_link_info
*));
94 PARAMS ((struct bfd_link_info
*, bfd_vma
));
95 static asection
* sh_elf_gc_mark_hook
96 PARAMS ((asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*,
97 struct elf_link_hash_entry
*, Elf_Internal_Sym
*));
98 static bfd_boolean sh_elf_gc_sweep_hook
99 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
100 const Elf_Internal_Rela
*));
101 static bfd_boolean allocate_dynrelocs
102 PARAMS ((struct elf_link_hash_entry
*, PTR
));
103 static bfd_boolean readonly_dynrelocs
104 PARAMS ((struct elf_link_hash_entry
*, PTR
));
105 static enum elf_reloc_type_class sh_elf_reloc_type_class
106 PARAMS ((const Elf_Internal_Rela
*));
107 #ifdef INCLUDE_SHMEDIA
108 inline static void movi_shori_putval
PARAMS ((bfd
*, unsigned long, char *));
110 static bfd_boolean elf32_shlin_grok_prstatus
111 PARAMS ((bfd
*abfd
, Elf_Internal_Note
*note
));
112 static bfd_boolean elf32_shlin_grok_psinfo
113 PARAMS ((bfd
*abfd
, Elf_Internal_Note
*note
));
115 /* The name of the dynamic interpreter. This is put in the .interp
118 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
120 static reloc_howto_type sh_elf_howto_table
[] =
123 HOWTO (R_SH_NONE
, /* type */
125 0, /* size (0 = byte, 1 = short, 2 = long) */
127 FALSE
, /* pc_relative */
129 complain_overflow_dont
, /* complain_on_overflow */
130 sh_elf_ignore_reloc
, /* special_function */
131 "R_SH_NONE", /* name */
132 FALSE
, /* partial_inplace */
135 FALSE
), /* pcrel_offset */
137 /* 32 bit absolute relocation. Setting partial_inplace to TRUE and
138 src_mask to a non-zero value is similar to the COFF toolchain. */
139 HOWTO (R_SH_DIR32
, /* type */
141 2, /* size (0 = byte, 1 = short, 2 = long) */
143 FALSE
, /* pc_relative */
145 complain_overflow_bitfield
, /* complain_on_overflow */
146 sh_elf_reloc
, /* special_function */
147 "R_SH_DIR32", /* name */
148 TRUE
, /* partial_inplace */
149 0xffffffff, /* src_mask */
150 0xffffffff, /* dst_mask */
151 FALSE
), /* pcrel_offset */
153 /* 32 bit PC relative relocation. */
154 HOWTO (R_SH_REL32
, /* type */
156 2, /* size (0 = byte, 1 = short, 2 = long) */
158 TRUE
, /* pc_relative */
160 complain_overflow_signed
, /* complain_on_overflow */
161 sh_elf_ignore_reloc
, /* special_function */
162 "R_SH_REL32", /* name */
163 TRUE
, /* partial_inplace */
164 0xffffffff, /* src_mask */
165 0xffffffff, /* dst_mask */
166 TRUE
), /* pcrel_offset */
168 /* 8 bit PC relative branch divided by 2. */
169 HOWTO (R_SH_DIR8WPN
, /* type */
171 1, /* size (0 = byte, 1 = short, 2 = long) */
173 TRUE
, /* pc_relative */
175 complain_overflow_signed
, /* complain_on_overflow */
176 sh_elf_ignore_reloc
, /* special_function */
177 "R_SH_DIR8WPN", /* name */
178 TRUE
, /* partial_inplace */
181 TRUE
), /* pcrel_offset */
183 /* 12 bit PC relative branch divided by 2. */
184 /* This cannot be partial_inplace because relaxation can't know the
185 eventual value of a symbol. */
186 HOWTO (R_SH_IND12W
, /* type */
188 1, /* size (0 = byte, 1 = short, 2 = long) */
190 TRUE
, /* pc_relative */
192 complain_overflow_signed
, /* complain_on_overflow */
193 NULL
, /* special_function */
194 "R_SH_IND12W", /* name */
195 FALSE
, /* partial_inplace */
197 0xfff, /* dst_mask */
198 TRUE
), /* pcrel_offset */
200 /* 8 bit unsigned PC relative divided by 4. */
201 HOWTO (R_SH_DIR8WPL
, /* type */
203 1, /* size (0 = byte, 1 = short, 2 = long) */
205 TRUE
, /* pc_relative */
207 complain_overflow_unsigned
, /* complain_on_overflow */
208 sh_elf_ignore_reloc
, /* special_function */
209 "R_SH_DIR8WPL", /* name */
210 TRUE
, /* partial_inplace */
213 TRUE
), /* pcrel_offset */
215 /* 8 bit unsigned PC relative divided by 2. */
216 HOWTO (R_SH_DIR8WPZ
, /* type */
218 1, /* size (0 = byte, 1 = short, 2 = long) */
220 TRUE
, /* pc_relative */
222 complain_overflow_unsigned
, /* complain_on_overflow */
223 sh_elf_ignore_reloc
, /* special_function */
224 "R_SH_DIR8WPZ", /* name */
225 TRUE
, /* partial_inplace */
228 TRUE
), /* pcrel_offset */
230 /* 8 bit GBR relative. FIXME: This only makes sense if we have some
231 special symbol for the GBR relative area, and that is not
233 HOWTO (R_SH_DIR8BP
, /* type */
235 1, /* size (0 = byte, 1 = short, 2 = long) */
237 FALSE
, /* pc_relative */
239 complain_overflow_unsigned
, /* complain_on_overflow */
240 sh_elf_ignore_reloc
, /* special_function */
241 "R_SH_DIR8BP", /* name */
242 FALSE
, /* partial_inplace */
245 TRUE
), /* pcrel_offset */
247 /* 8 bit GBR relative divided by 2. FIXME: This only makes sense if
248 we have some special symbol for the GBR relative area, and that
249 is not implemented. */
250 HOWTO (R_SH_DIR8W
, /* type */
252 1, /* size (0 = byte, 1 = short, 2 = long) */
254 FALSE
, /* pc_relative */
256 complain_overflow_unsigned
, /* complain_on_overflow */
257 sh_elf_ignore_reloc
, /* special_function */
258 "R_SH_DIR8W", /* name */
259 FALSE
, /* partial_inplace */
262 TRUE
), /* pcrel_offset */
264 /* 8 bit GBR relative divided by 4. FIXME: This only makes sense if
265 we have some special symbol for the GBR relative area, and that
266 is not implemented. */
267 HOWTO (R_SH_DIR8L
, /* type */
269 1, /* size (0 = byte, 1 = short, 2 = long) */
271 FALSE
, /* pc_relative */
273 complain_overflow_unsigned
, /* complain_on_overflow */
274 sh_elf_ignore_reloc
, /* special_function */
275 "R_SH_DIR8L", /* name */
276 FALSE
, /* partial_inplace */
279 TRUE
), /* pcrel_offset */
297 /* The remaining relocs are a GNU extension used for relaxing. The
298 final pass of the linker never needs to do anything with any of
299 these relocs. Any required operations are handled by the
302 /* A 16 bit switch table entry. This is generated for an expression
303 such as ``.word L1 - L2''. The offset holds the difference
304 between the reloc address and L2. */
305 HOWTO (R_SH_SWITCH16
, /* type */
307 1, /* size (0 = byte, 1 = short, 2 = long) */
309 FALSE
, /* pc_relative */
311 complain_overflow_unsigned
, /* complain_on_overflow */
312 sh_elf_ignore_reloc
, /* special_function */
313 "R_SH_SWITCH16", /* name */
314 FALSE
, /* partial_inplace */
317 TRUE
), /* pcrel_offset */
319 /* A 32 bit switch table entry. This is generated for an expression
320 such as ``.long L1 - L2''. The offset holds the difference
321 between the reloc address and L2. */
322 HOWTO (R_SH_SWITCH32
, /* type */
324 2, /* size (0 = byte, 1 = short, 2 = long) */
326 FALSE
, /* pc_relative */
328 complain_overflow_unsigned
, /* complain_on_overflow */
329 sh_elf_ignore_reloc
, /* special_function */
330 "R_SH_SWITCH32", /* name */
331 FALSE
, /* partial_inplace */
334 TRUE
), /* pcrel_offset */
336 /* Indicates a .uses pseudo-op. The compiler will generate .uses
337 pseudo-ops when it finds a function call which can be relaxed.
338 The offset field holds the PC relative offset to the instruction
339 which loads the register used in the function call. */
340 HOWTO (R_SH_USES
, /* type */
342 1, /* size (0 = byte, 1 = short, 2 = long) */
344 FALSE
, /* pc_relative */
346 complain_overflow_unsigned
, /* complain_on_overflow */
347 sh_elf_ignore_reloc
, /* special_function */
348 "R_SH_USES", /* name */
349 FALSE
, /* partial_inplace */
352 TRUE
), /* pcrel_offset */
354 /* The assembler will generate this reloc for addresses referred to
355 by the register loads associated with USES relocs. The offset
356 field holds the number of times the address is referenced in the
358 HOWTO (R_SH_COUNT
, /* type */
360 1, /* size (0 = byte, 1 = short, 2 = long) */
362 FALSE
, /* pc_relative */
364 complain_overflow_unsigned
, /* complain_on_overflow */
365 sh_elf_ignore_reloc
, /* special_function */
366 "R_SH_COUNT", /* name */
367 FALSE
, /* partial_inplace */
370 TRUE
), /* pcrel_offset */
372 /* Indicates an alignment statement. The offset field is the power
373 of 2 to which subsequent portions of the object file must be
375 HOWTO (R_SH_ALIGN
, /* type */
377 1, /* size (0 = byte, 1 = short, 2 = long) */
379 FALSE
, /* pc_relative */
381 complain_overflow_unsigned
, /* complain_on_overflow */
382 sh_elf_ignore_reloc
, /* special_function */
383 "R_SH_ALIGN", /* name */
384 FALSE
, /* partial_inplace */
387 TRUE
), /* pcrel_offset */
389 /* The assembler will generate this reloc before a block of
390 instructions. A section should be processed as assumining it
391 contains data, unless this reloc is seen. */
392 HOWTO (R_SH_CODE
, /* type */
394 1, /* size (0 = byte, 1 = short, 2 = long) */
396 FALSE
, /* pc_relative */
398 complain_overflow_unsigned
, /* complain_on_overflow */
399 sh_elf_ignore_reloc
, /* special_function */
400 "R_SH_CODE", /* name */
401 FALSE
, /* partial_inplace */
404 TRUE
), /* pcrel_offset */
406 /* The assembler will generate this reloc after a block of
407 instructions when it sees data that is not instructions. */
408 HOWTO (R_SH_DATA
, /* type */
410 1, /* size (0 = byte, 1 = short, 2 = long) */
412 FALSE
, /* pc_relative */
414 complain_overflow_unsigned
, /* complain_on_overflow */
415 sh_elf_ignore_reloc
, /* special_function */
416 "R_SH_DATA", /* name */
417 FALSE
, /* partial_inplace */
420 TRUE
), /* pcrel_offset */
422 /* The assembler generates this reloc for each label within a block
423 of instructions. This permits the linker to avoid swapping
424 instructions which are the targets of branches. */
425 HOWTO (R_SH_LABEL
, /* type */
427 1, /* size (0 = byte, 1 = short, 2 = long) */
429 FALSE
, /* pc_relative */
431 complain_overflow_unsigned
, /* complain_on_overflow */
432 sh_elf_ignore_reloc
, /* special_function */
433 "R_SH_LABEL", /* name */
434 FALSE
, /* partial_inplace */
437 TRUE
), /* pcrel_offset */
439 /* An 8 bit switch table entry. This is generated for an expression
440 such as ``.word L1 - L2''. The offset holds the difference
441 between the reloc address and L2. */
442 HOWTO (R_SH_SWITCH8
, /* type */
444 0, /* size (0 = byte, 1 = short, 2 = long) */
446 FALSE
, /* pc_relative */
448 complain_overflow_unsigned
, /* complain_on_overflow */
449 sh_elf_ignore_reloc
, /* special_function */
450 "R_SH_SWITCH8", /* name */
451 FALSE
, /* partial_inplace */
454 TRUE
), /* pcrel_offset */
456 /* GNU extension to record C++ vtable hierarchy */
457 HOWTO (R_SH_GNU_VTINHERIT
, /* type */
459 2, /* size (0 = byte, 1 = short, 2 = long) */
461 FALSE
, /* pc_relative */
463 complain_overflow_dont
, /* complain_on_overflow */
464 NULL
, /* special_function */
465 "R_SH_GNU_VTINHERIT", /* name */
466 FALSE
, /* partial_inplace */
469 FALSE
), /* pcrel_offset */
471 /* GNU extension to record C++ vtable member usage */
472 HOWTO (R_SH_GNU_VTENTRY
, /* type */
474 2, /* size (0 = byte, 1 = short, 2 = long) */
476 FALSE
, /* pc_relative */
478 complain_overflow_dont
, /* complain_on_overflow */
479 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
480 "R_SH_GNU_VTENTRY", /* name */
481 FALSE
, /* partial_inplace */
484 FALSE
), /* pcrel_offset */
486 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
487 HOWTO (R_SH_LOOP_START
, /* type */
489 1, /* size (0 = byte, 1 = short, 2 = long) */
491 FALSE
, /* pc_relative */
493 complain_overflow_signed
, /* complain_on_overflow */
494 sh_elf_ignore_reloc
, /* special_function */
495 "R_SH_LOOP_START", /* name */
496 TRUE
, /* partial_inplace */
499 TRUE
), /* pcrel_offset */
501 /* 8 bit PC relative divided by 2 - but specified in a very odd way. */
502 HOWTO (R_SH_LOOP_END
, /* type */
504 1, /* size (0 = byte, 1 = short, 2 = long) */
506 FALSE
, /* pc_relative */
508 complain_overflow_signed
, /* complain_on_overflow */
509 sh_elf_ignore_reloc
, /* special_function */
510 "R_SH_LOOP_END", /* name */
511 TRUE
, /* partial_inplace */
514 TRUE
), /* pcrel_offset */
524 #ifdef INCLUDE_SHMEDIA
525 /* Used in SHLLI.L and SHLRI.L. */
526 HOWTO (R_SH_DIR5U
, /* type */
528 2, /* size (0 = byte, 1 = short, 2 = long) */
530 FALSE
, /* pc_relative */
532 complain_overflow_unsigned
, /* complain_on_overflow */
533 bfd_elf_generic_reloc
, /* special_function */
534 "R_SH_DIR5U", /* name */
535 FALSE
, /* partial_inplace */
537 0xfc00, /* dst_mask */
538 FALSE
), /* pcrel_offset */
540 /* Used in SHARI, SHLLI et al. */
541 HOWTO (R_SH_DIR6U
, /* type */
543 2, /* size (0 = byte, 1 = short, 2 = long) */
545 FALSE
, /* pc_relative */
547 complain_overflow_unsigned
, /* complain_on_overflow */
548 bfd_elf_generic_reloc
, /* special_function */
549 "R_SH_DIR6U", /* name */
550 FALSE
, /* partial_inplace */
552 0xfc00, /* dst_mask */
553 FALSE
), /* pcrel_offset */
555 /* Used in BxxI, LDHI.L et al. */
556 HOWTO (R_SH_DIR6S
, /* type */
558 2, /* size (0 = byte, 1 = short, 2 = long) */
560 FALSE
, /* pc_relative */
562 complain_overflow_signed
, /* complain_on_overflow */
563 bfd_elf_generic_reloc
, /* special_function */
564 "R_SH_DIR6S", /* name */
565 FALSE
, /* partial_inplace */
567 0xfc00, /* dst_mask */
568 FALSE
), /* pcrel_offset */
570 /* Used in ADDI, ANDI et al. */
571 HOWTO (R_SH_DIR10S
, /* type */
573 2, /* size (0 = byte, 1 = short, 2 = long) */
575 FALSE
, /* pc_relative */
577 complain_overflow_signed
, /* complain_on_overflow */
578 bfd_elf_generic_reloc
, /* special_function */
579 "R_SH_DIR10S", /* name */
580 FALSE
, /* partial_inplace */
582 0xffc00, /* dst_mask */
583 FALSE
), /* pcrel_offset */
585 /* Used in LD.UW, ST.W et al. */
586 HOWTO (R_SH_DIR10SW
, /* type */
588 2, /* 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_DIR10SW", /* name */
595 FALSE
, /* partial_inplace */
597 0xffc00, /* dst_mask */
598 FALSE
), /* pcrel_offset */
600 /* Used in LD.L, FLD.S et al. */
601 HOWTO (R_SH_DIR10SL
, /* type */
603 2, /* size (0 = byte, 1 = short, 2 = long) */
605 FALSE
, /* pc_relative */
607 complain_overflow_signed
, /* complain_on_overflow */
608 bfd_elf_generic_reloc
, /* special_function */
609 "R_SH_DIR10SL", /* name */
610 FALSE
, /* partial_inplace */
612 0xffc00, /* dst_mask */
613 FALSE
), /* pcrel_offset */
615 /* Used in FLD.D, FST.P et al. */
616 HOWTO (R_SH_DIR10SQ
, /* type */
618 2, /* size (0 = byte, 1 = short, 2 = long) */
620 FALSE
, /* pc_relative */
622 complain_overflow_signed
, /* complain_on_overflow */
623 bfd_elf_generic_reloc
, /* special_function */
624 "R_SH_DIR10SQ", /* name */
625 FALSE
, /* partial_inplace */
627 0xffc00, /* dst_mask */
628 FALSE
), /* pcrel_offset */
733 HOWTO (R_SH_TLS_GD_32
, /* type */
735 2, /* size (0 = byte, 1 = short, 2 = long) */
737 FALSE
, /* pc_relative */
739 complain_overflow_bitfield
, /* complain_on_overflow */
740 bfd_elf_generic_reloc
, /* */
741 "R_SH_TLS_GD_32", /* name */
742 TRUE
, /* partial_inplace */
743 0xffffffff, /* src_mask */
744 0xffffffff, /* dst_mask */
745 FALSE
), /* pcrel_offset */
747 HOWTO (R_SH_TLS_LD_32
, /* type */
749 2, /* size (0 = byte, 1 = short, 2 = long) */
751 FALSE
, /* pc_relative */
753 complain_overflow_bitfield
, /* complain_on_overflow */
754 bfd_elf_generic_reloc
, /* */
755 "R_SH_TLS_LD_32", /* name */
756 TRUE
, /* partial_inplace */
757 0xffffffff, /* src_mask */
758 0xffffffff, /* dst_mask */
759 FALSE
), /* pcrel_offset */
761 HOWTO (R_SH_TLS_LDO_32
, /* type */
763 2, /* size (0 = byte, 1 = short, 2 = long) */
765 FALSE
, /* pc_relative */
767 complain_overflow_bitfield
, /* complain_on_overflow */
768 bfd_elf_generic_reloc
, /* */
769 "R_SH_TLS_LDO_32", /* name */
770 TRUE
, /* partial_inplace */
771 0xffffffff, /* src_mask */
772 0xffffffff, /* dst_mask */
773 FALSE
), /* pcrel_offset */
775 HOWTO (R_SH_TLS_IE_32
, /* type */
777 2, /* size (0 = byte, 1 = short, 2 = long) */
779 FALSE
, /* pc_relative */
781 complain_overflow_bitfield
, /* complain_on_overflow */
782 bfd_elf_generic_reloc
, /* */
783 "R_SH_TLS_IE_32", /* name */
784 TRUE
, /* partial_inplace */
785 0xffffffff, /* src_mask */
786 0xffffffff, /* dst_mask */
787 FALSE
), /* pcrel_offset */
789 HOWTO (R_SH_TLS_LE_32
, /* type */
791 2, /* size (0 = byte, 1 = short, 2 = long) */
793 FALSE
, /* pc_relative */
795 complain_overflow_bitfield
, /* complain_on_overflow */
796 bfd_elf_generic_reloc
, /* */
797 "R_SH_TLS_LE_32", /* name */
798 TRUE
, /* partial_inplace */
799 0xffffffff, /* src_mask */
800 0xffffffff, /* dst_mask */
801 FALSE
), /* pcrel_offset */
803 HOWTO (R_SH_TLS_DTPMOD32
, /* type */
805 2, /* size (0 = byte, 1 = short, 2 = long) */
807 FALSE
, /* pc_relative */
809 complain_overflow_bitfield
, /* complain_on_overflow */
810 bfd_elf_generic_reloc
, /* */
811 "R_SH_TLS_DTPMOD32", /* name */
812 TRUE
, /* partial_inplace */
813 0xffffffff, /* src_mask */
814 0xffffffff, /* dst_mask */
815 FALSE
), /* pcrel_offset */
817 HOWTO (R_SH_TLS_DTPOFF32
, /* type */
819 2, /* size (0 = byte, 1 = short, 2 = long) */
821 FALSE
, /* pc_relative */
823 complain_overflow_bitfield
, /* complain_on_overflow */
824 bfd_elf_generic_reloc
, /* */
825 "R_SH_TLS_DTPOFF32", /* name */
826 TRUE
, /* partial_inplace */
827 0xffffffff, /* src_mask */
828 0xffffffff, /* dst_mask */
829 FALSE
), /* pcrel_offset */
831 HOWTO (R_SH_TLS_TPOFF32
, /* type */
833 2, /* size (0 = byte, 1 = short, 2 = long) */
835 FALSE
, /* pc_relative */
837 complain_overflow_bitfield
, /* complain_on_overflow */
838 bfd_elf_generic_reloc
, /* */
839 "R_SH_TLS_TPOFF32", /* name */
840 TRUE
, /* partial_inplace */
841 0xffffffff, /* src_mask */
842 0xffffffff, /* dst_mask */
843 FALSE
), /* pcrel_offset */
854 HOWTO (R_SH_GOT32
, /* type */
856 2, /* size (0 = byte, 1 = short, 2 = long) */
858 FALSE
, /* pc_relative */
860 complain_overflow_bitfield
, /* complain_on_overflow */
861 bfd_elf_generic_reloc
, /* */
862 "R_SH_GOT32", /* name */
863 TRUE
, /* partial_inplace */
864 0xffffffff, /* src_mask */
865 0xffffffff, /* dst_mask */
866 FALSE
), /* pcrel_offset */
868 HOWTO (R_SH_PLT32
, /* type */
870 2, /* size (0 = byte, 1 = short, 2 = long) */
872 TRUE
, /* pc_relative */
874 complain_overflow_bitfield
, /* complain_on_overflow */
875 bfd_elf_generic_reloc
, /* */
876 "R_SH_PLT32", /* name */
877 TRUE
, /* partial_inplace */
878 0xffffffff, /* src_mask */
879 0xffffffff, /* dst_mask */
880 TRUE
), /* pcrel_offset */
882 HOWTO (R_SH_COPY
, /* type */
884 2, /* size (0 = byte, 1 = short, 2 = long) */
886 FALSE
, /* pc_relative */
888 complain_overflow_bitfield
, /* complain_on_overflow */
889 bfd_elf_generic_reloc
, /* */
890 "R_SH_COPY", /* name */
891 TRUE
, /* partial_inplace */
892 0xffffffff, /* src_mask */
893 0xffffffff, /* dst_mask */
894 FALSE
), /* pcrel_offset */
896 HOWTO (R_SH_GLOB_DAT
, /* type */
898 2, /* size (0 = byte, 1 = short, 2 = long) */
900 FALSE
, /* pc_relative */
902 complain_overflow_bitfield
, /* complain_on_overflow */
903 bfd_elf_generic_reloc
, /* */
904 "R_SH_GLOB_DAT", /* name */
905 TRUE
, /* partial_inplace */
906 0xffffffff, /* src_mask */
907 0xffffffff, /* dst_mask */
908 FALSE
), /* pcrel_offset */
910 HOWTO (R_SH_JMP_SLOT
, /* type */
912 2, /* size (0 = byte, 1 = short, 2 = long) */
914 FALSE
, /* pc_relative */
916 complain_overflow_bitfield
, /* complain_on_overflow */
917 bfd_elf_generic_reloc
, /* */
918 "R_SH_JMP_SLOT", /* name */
919 TRUE
, /* partial_inplace */
920 0xffffffff, /* src_mask */
921 0xffffffff, /* dst_mask */
922 FALSE
), /* pcrel_offset */
924 HOWTO (R_SH_RELATIVE
, /* type */
926 2, /* size (0 = byte, 1 = short, 2 = long) */
928 FALSE
, /* pc_relative */
930 complain_overflow_bitfield
, /* complain_on_overflow */
931 bfd_elf_generic_reloc
, /* */
932 "R_SH_RELATIVE", /* name */
933 TRUE
, /* partial_inplace */
934 0xffffffff, /* src_mask */
935 0xffffffff, /* dst_mask */
936 FALSE
), /* pcrel_offset */
938 HOWTO (R_SH_GOTOFF
, /* type */
940 2, /* size (0 = byte, 1 = short, 2 = long) */
942 FALSE
, /* pc_relative */
944 complain_overflow_bitfield
, /* complain_on_overflow */
945 bfd_elf_generic_reloc
, /* */
946 "R_SH_GOTOFF", /* name */
947 TRUE
, /* partial_inplace */
948 0xffffffff, /* src_mask */
949 0xffffffff, /* dst_mask */
950 FALSE
), /* pcrel_offset */
952 HOWTO (R_SH_GOTPC
, /* type */
954 2, /* size (0 = byte, 1 = short, 2 = long) */
956 TRUE
, /* pc_relative */
958 complain_overflow_bitfield
, /* complain_on_overflow */
959 bfd_elf_generic_reloc
, /* */
960 "R_SH_GOTPC", /* name */
961 TRUE
, /* partial_inplace */
962 0xffffffff, /* src_mask */
963 0xffffffff, /* dst_mask */
964 TRUE
), /* pcrel_offset */
966 HOWTO (R_SH_GOTPLT32
, /* type */
968 2, /* size (0 = byte, 1 = short, 2 = long) */
970 FALSE
, /* pc_relative */
972 complain_overflow_bitfield
, /* complain_on_overflow */
973 bfd_elf_generic_reloc
, /* */
974 "R_SH_GOTPLT32", /* name */
975 FALSE
, /* partial_inplace */
976 0xffffffff, /* src_mask */
977 0xffffffff, /* dst_mask */
978 FALSE
), /* pcrel_offset */
980 #ifdef INCLUDE_SHMEDIA
981 /* Used in MOVI and SHORI (x & 65536). */
982 HOWTO (R_SH_GOT_LOW16
, /* type */
984 2, /* size (0 = byte, 1 = short, 2 = long) */
986 FALSE
, /* pc_relative */
988 complain_overflow_dont
, /* complain_on_overflow */
989 bfd_elf_generic_reloc
, /* special_function */
990 "R_SH_GOT_LOW16", /* name */
991 FALSE
, /* partial_inplace */
993 0x3fffc00, /* dst_mask */
994 FALSE
), /* pcrel_offset */
996 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
997 HOWTO (R_SH_GOT_MEDLOW16
, /* type */
999 2, /* size (0 = byte, 1 = short, 2 = long) */
1001 FALSE
, /* pc_relative */
1003 complain_overflow_dont
, /* complain_on_overflow */
1004 bfd_elf_generic_reloc
, /* special_function */
1005 "R_SH_GOT_MEDLOW16", /* name */
1006 FALSE
, /* partial_inplace */
1008 0x3fffc00, /* dst_mask */
1009 FALSE
), /* pcrel_offset */
1011 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1012 HOWTO (R_SH_GOT_MEDHI16
, /* type */
1013 32, /* rightshift */
1014 2, /* size (0 = byte, 1 = short, 2 = long) */
1016 FALSE
, /* pc_relative */
1018 complain_overflow_dont
, /* complain_on_overflow */
1019 bfd_elf_generic_reloc
, /* special_function */
1020 "R_SH_GOT_MEDHI16", /* name */
1021 FALSE
, /* partial_inplace */
1023 0x3fffc00, /* dst_mask */
1024 FALSE
), /* pcrel_offset */
1026 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1027 HOWTO (R_SH_GOT_HI16
, /* type */
1028 48, /* rightshift */
1029 2, /* size (0 = byte, 1 = short, 2 = long) */
1031 FALSE
, /* pc_relative */
1033 complain_overflow_dont
, /* complain_on_overflow */
1034 bfd_elf_generic_reloc
, /* special_function */
1035 "R_SH_GOT_HI16", /* name */
1036 FALSE
, /* partial_inplace */
1038 0x3fffc00, /* dst_mask */
1039 FALSE
), /* pcrel_offset */
1041 /* Used in MOVI and SHORI (x & 65536). */
1042 HOWTO (R_SH_GOTPLT_LOW16
, /* type */
1044 2, /* size (0 = byte, 1 = short, 2 = long) */
1046 FALSE
, /* pc_relative */
1048 complain_overflow_dont
, /* complain_on_overflow */
1049 bfd_elf_generic_reloc
, /* special_function */
1050 "R_SH_GOTPLT_LOW16", /* name */
1051 FALSE
, /* partial_inplace */
1053 0x3fffc00, /* dst_mask */
1054 FALSE
), /* pcrel_offset */
1056 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1057 HOWTO (R_SH_GOTPLT_MEDLOW16
, /* type */
1058 16, /* rightshift */
1059 2, /* size (0 = byte, 1 = short, 2 = long) */
1061 FALSE
, /* pc_relative */
1063 complain_overflow_dont
, /* complain_on_overflow */
1064 bfd_elf_generic_reloc
, /* special_function */
1065 "R_SH_GOTPLT_MEDLOW16", /* name */
1066 FALSE
, /* partial_inplace */
1068 0x3fffc00, /* dst_mask */
1069 FALSE
), /* pcrel_offset */
1071 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1072 HOWTO (R_SH_GOTPLT_MEDHI16
, /* type */
1073 32, /* rightshift */
1074 2, /* size (0 = byte, 1 = short, 2 = long) */
1076 FALSE
, /* pc_relative */
1078 complain_overflow_dont
, /* complain_on_overflow */
1079 bfd_elf_generic_reloc
, /* special_function */
1080 "R_SH_GOTPLT_MEDHI16", /* name */
1081 FALSE
, /* partial_inplace */
1083 0x3fffc00, /* dst_mask */
1084 FALSE
), /* pcrel_offset */
1086 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1087 HOWTO (R_SH_GOTPLT_HI16
, /* type */
1088 48, /* rightshift */
1089 2, /* size (0 = byte, 1 = short, 2 = long) */
1091 FALSE
, /* pc_relative */
1093 complain_overflow_dont
, /* complain_on_overflow */
1094 bfd_elf_generic_reloc
, /* special_function */
1095 "R_SH_GOTPLT_HI16", /* name */
1096 FALSE
, /* partial_inplace */
1098 0x3fffc00, /* dst_mask */
1099 FALSE
), /* pcrel_offset */
1101 /* Used in MOVI and SHORI (x & 65536). */
1102 HOWTO (R_SH_PLT_LOW16
, /* type */
1104 2, /* size (0 = byte, 1 = short, 2 = long) */
1106 TRUE
, /* pc_relative */
1108 complain_overflow_dont
, /* complain_on_overflow */
1109 bfd_elf_generic_reloc
, /* special_function */
1110 "R_SH_PLT_LOW16", /* name */
1111 FALSE
, /* partial_inplace */
1113 0x3fffc00, /* dst_mask */
1114 TRUE
), /* pcrel_offset */
1116 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1117 HOWTO (R_SH_PLT_MEDLOW16
, /* type */
1118 16, /* rightshift */
1119 2, /* size (0 = byte, 1 = short, 2 = long) */
1121 TRUE
, /* pc_relative */
1123 complain_overflow_dont
, /* complain_on_overflow */
1124 bfd_elf_generic_reloc
, /* special_function */
1125 "R_SH_PLT_MEDLOW16", /* name */
1126 FALSE
, /* partial_inplace */
1128 0x3fffc00, /* dst_mask */
1129 TRUE
), /* pcrel_offset */
1131 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1132 HOWTO (R_SH_PLT_MEDHI16
, /* type */
1133 32, /* rightshift */
1134 2, /* size (0 = byte, 1 = short, 2 = long) */
1136 TRUE
, /* pc_relative */
1138 complain_overflow_dont
, /* complain_on_overflow */
1139 bfd_elf_generic_reloc
, /* special_function */
1140 "R_SH_PLT_MEDHI16", /* name */
1141 FALSE
, /* partial_inplace */
1143 0x3fffc00, /* dst_mask */
1144 TRUE
), /* pcrel_offset */
1146 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1147 HOWTO (R_SH_PLT_HI16
, /* type */
1148 48, /* rightshift */
1149 2, /* size (0 = byte, 1 = short, 2 = long) */
1151 TRUE
, /* pc_relative */
1153 complain_overflow_dont
, /* complain_on_overflow */
1154 bfd_elf_generic_reloc
, /* special_function */
1155 "R_SH_PLT_HI16", /* name */
1156 FALSE
, /* partial_inplace */
1158 0x3fffc00, /* dst_mask */
1159 TRUE
), /* pcrel_offset */
1161 /* Used in MOVI and SHORI (x & 65536). */
1162 HOWTO (R_SH_GOTOFF_LOW16
, /* type */
1164 2, /* size (0 = byte, 1 = short, 2 = long) */
1166 FALSE
, /* pc_relative */
1168 complain_overflow_dont
, /* complain_on_overflow */
1169 bfd_elf_generic_reloc
, /* special_function */
1170 "R_SH_GOTOFF_LOW16", /* name */
1171 FALSE
, /* partial_inplace */
1173 0x3fffc00, /* dst_mask */
1174 FALSE
), /* pcrel_offset */
1176 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1177 HOWTO (R_SH_GOTOFF_MEDLOW16
, /* type */
1178 16, /* rightshift */
1179 2, /* size (0 = byte, 1 = short, 2 = long) */
1181 FALSE
, /* pc_relative */
1183 complain_overflow_dont
, /* complain_on_overflow */
1184 bfd_elf_generic_reloc
, /* special_function */
1185 "R_SH_GOTOFF_MEDLOW16", /* name */
1186 FALSE
, /* partial_inplace */
1188 0x3fffc00, /* dst_mask */
1189 FALSE
), /* pcrel_offset */
1191 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1192 HOWTO (R_SH_GOTOFF_MEDHI16
, /* type */
1193 32, /* rightshift */
1194 2, /* size (0 = byte, 1 = short, 2 = long) */
1196 FALSE
, /* pc_relative */
1198 complain_overflow_dont
, /* complain_on_overflow */
1199 bfd_elf_generic_reloc
, /* special_function */
1200 "R_SH_GOTOFF_MEDHI16", /* name */
1201 FALSE
, /* partial_inplace */
1203 0x3fffc00, /* dst_mask */
1204 FALSE
), /* pcrel_offset */
1206 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1207 HOWTO (R_SH_GOTOFF_HI16
, /* type */
1208 48, /* rightshift */
1209 2, /* size (0 = byte, 1 = short, 2 = long) */
1211 FALSE
, /* pc_relative */
1213 complain_overflow_dont
, /* complain_on_overflow */
1214 bfd_elf_generic_reloc
, /* special_function */
1215 "R_SH_GOTOFF_HI16", /* name */
1216 FALSE
, /* partial_inplace */
1218 0x3fffc00, /* dst_mask */
1219 FALSE
), /* pcrel_offset */
1221 /* Used in MOVI and SHORI (x & 65536). */
1222 HOWTO (R_SH_GOTPC_LOW16
, /* type */
1224 2, /* size (0 = byte, 1 = short, 2 = long) */
1226 TRUE
, /* pc_relative */
1228 complain_overflow_dont
, /* complain_on_overflow */
1229 bfd_elf_generic_reloc
, /* special_function */
1230 "R_SH_GOTPC_LOW16", /* name */
1231 FALSE
, /* partial_inplace */
1233 0x3fffc00, /* dst_mask */
1234 TRUE
), /* pcrel_offset */
1236 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1237 HOWTO (R_SH_GOTPC_MEDLOW16
, /* type */
1238 16, /* rightshift */
1239 2, /* size (0 = byte, 1 = short, 2 = long) */
1241 TRUE
, /* pc_relative */
1243 complain_overflow_dont
, /* complain_on_overflow */
1244 bfd_elf_generic_reloc
, /* special_function */
1245 "R_SH_GOTPC_MEDLOW16", /* name */
1246 FALSE
, /* partial_inplace */
1248 0x3fffc00, /* dst_mask */
1249 TRUE
), /* pcrel_offset */
1251 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1252 HOWTO (R_SH_GOTPC_MEDHI16
, /* type */
1253 32, /* rightshift */
1254 2, /* size (0 = byte, 1 = short, 2 = long) */
1256 TRUE
, /* pc_relative */
1258 complain_overflow_dont
, /* complain_on_overflow */
1259 bfd_elf_generic_reloc
, /* special_function */
1260 "R_SH_GOTPC_MEDHI16", /* name */
1261 FALSE
, /* partial_inplace */
1263 0x3fffc00, /* dst_mask */
1264 TRUE
), /* pcrel_offset */
1266 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1267 HOWTO (R_SH_GOTPC_HI16
, /* type */
1268 48, /* rightshift */
1269 2, /* size (0 = byte, 1 = short, 2 = long) */
1271 TRUE
, /* pc_relative */
1273 complain_overflow_dont
, /* complain_on_overflow */
1274 bfd_elf_generic_reloc
, /* special_function */
1275 "R_SH_GOTPC_HI16", /* name */
1276 FALSE
, /* partial_inplace */
1278 0x3fffc00, /* dst_mask */
1279 TRUE
), /* pcrel_offset */
1281 /* Used in LD.L, FLD.S et al. */
1282 HOWTO (R_SH_GOT10BY4
, /* type */
1284 2, /* size (0 = byte, 1 = short, 2 = long) */
1286 FALSE
, /* pc_relative */
1288 complain_overflow_signed
, /* complain_on_overflow */
1289 bfd_elf_generic_reloc
, /* special_function */
1290 "R_SH_GOT10BY4", /* name */
1291 FALSE
, /* partial_inplace */
1293 0xffc00, /* dst_mask */
1294 FALSE
), /* pcrel_offset */
1296 /* Used in LD.L, FLD.S et al. */
1297 HOWTO (R_SH_GOTPLT10BY4
, /* type */
1299 2, /* size (0 = byte, 1 = short, 2 = long) */
1301 FALSE
, /* pc_relative */
1303 complain_overflow_signed
, /* complain_on_overflow */
1304 bfd_elf_generic_reloc
, /* special_function */
1305 "R_SH_GOTPLT10BY4", /* name */
1306 FALSE
, /* partial_inplace */
1308 0xffc00, /* dst_mask */
1309 FALSE
), /* pcrel_offset */
1311 /* Used in FLD.D, FST.P et al. */
1312 HOWTO (R_SH_GOT10BY8
, /* type */
1314 2, /* size (0 = byte, 1 = short, 2 = long) */
1316 FALSE
, /* pc_relative */
1318 complain_overflow_signed
, /* complain_on_overflow */
1319 bfd_elf_generic_reloc
, /* special_function */
1320 "R_SH_GOT10BY8", /* name */
1321 FALSE
, /* partial_inplace */
1323 0xffc00, /* dst_mask */
1324 FALSE
), /* pcrel_offset */
1326 /* Used in FLD.D, FST.P et al. */
1327 HOWTO (R_SH_GOTPLT10BY8
, /* type */
1329 2, /* size (0 = byte, 1 = short, 2 = long) */
1331 FALSE
, /* pc_relative */
1333 complain_overflow_signed
, /* complain_on_overflow */
1334 bfd_elf_generic_reloc
, /* special_function */
1335 "R_SH_GOTPLT10BY8", /* name */
1336 FALSE
, /* partial_inplace */
1338 0xffc00, /* dst_mask */
1339 FALSE
), /* pcrel_offset */
1341 HOWTO (R_SH_COPY64
, /* type */
1343 4, /* size (0 = byte, 1 = short, 2 = long) */
1345 FALSE
, /* pc_relative */
1347 complain_overflow_dont
, /* complain_on_overflow */
1348 bfd_elf_generic_reloc
, /* special_function */
1349 "R_SH_COPY64", /* name */
1350 FALSE
, /* partial_inplace */
1352 ((bfd_vma
) 0) - 1, /* dst_mask */
1353 FALSE
), /* pcrel_offset */
1355 HOWTO (R_SH_GLOB_DAT64
, /* type */
1357 4, /* size (0 = byte, 1 = short, 2 = long) */
1359 FALSE
, /* pc_relative */
1361 complain_overflow_dont
, /* complain_on_overflow */
1362 bfd_elf_generic_reloc
, /* special_function */
1363 "R_SH_GLOB_DAT64", /* name */
1364 FALSE
, /* partial_inplace */
1366 ((bfd_vma
) 0) - 1, /* dst_mask */
1367 FALSE
), /* pcrel_offset */
1369 HOWTO (R_SH_JMP_SLOT64
, /* type */
1371 4, /* size (0 = byte, 1 = short, 2 = long) */
1373 FALSE
, /* pc_relative */
1375 complain_overflow_dont
, /* complain_on_overflow */
1376 bfd_elf_generic_reloc
, /* special_function */
1377 "R_SH_JMP_SLOT64", /* name */
1378 FALSE
, /* partial_inplace */
1380 ((bfd_vma
) 0) - 1, /* dst_mask */
1381 FALSE
), /* pcrel_offset */
1383 HOWTO (R_SH_RELATIVE64
, /* type */
1385 4, /* size (0 = byte, 1 = short, 2 = long) */
1387 FALSE
, /* pc_relative */
1389 complain_overflow_dont
, /* complain_on_overflow */
1390 bfd_elf_generic_reloc
, /* special_function */
1391 "R_SH_RELATIVE64", /* name */
1392 FALSE
, /* partial_inplace */
1394 ((bfd_vma
) 0) - 1, /* dst_mask */
1395 FALSE
), /* pcrel_offset */
1443 /* Relocations for SHmedia code. None of these are partial_inplace or
1444 use the field being relocated (except R_SH_PT_16). */
1446 /* The assembler will generate this reloc before a block of SHmedia
1447 instructions. A section should be processed as assuming it contains
1448 data, unless this reloc is seen. Note that a block of SHcompact
1449 instructions are instead preceded by R_SH_CODE.
1450 This is currently not implemented, but should be used for SHmedia
1451 linker relaxation. */
1452 HOWTO (R_SH_SHMEDIA_CODE
, /* type */
1454 1, /* size (0 = byte, 1 = short, 2 = long) */
1456 FALSE
, /* pc_relative */
1458 complain_overflow_unsigned
, /* complain_on_overflow */
1459 sh_elf_ignore_reloc
, /* special_function */
1460 "R_SH_SHMEDIA_CODE", /* name */
1461 FALSE
, /* partial_inplace */
1464 FALSE
), /* pcrel_offset */
1466 /* The assembler will generate this reloc at a PTA or PTB instruction,
1467 and the linker checks the right type of target, or changes a PTA to a
1468 PTB, if the original insn was PT. */
1469 HOWTO (R_SH_PT_16
, /* type */
1471 2, /* size (0 = byte, 1 = short, 2 = long) */
1473 TRUE
, /* pc_relative */
1475 complain_overflow_signed
, /* complain_on_overflow */
1476 bfd_elf_generic_reloc
, /* special_function */
1477 "R_SH_PT_16", /* name */
1478 FALSE
, /* partial_inplace */
1480 0x3fffc00, /* dst_mask */
1481 TRUE
), /* pcrel_offset */
1483 /* Used in unexpanded MOVI. */
1484 HOWTO (R_SH_IMMS16
, /* type */
1486 2, /* size (0 = byte, 1 = short, 2 = long) */
1488 FALSE
, /* pc_relative */
1490 complain_overflow_signed
, /* complain_on_overflow */
1491 bfd_elf_generic_reloc
, /* special_function */
1492 "R_SH_IMMS16", /* name */
1493 FALSE
, /* partial_inplace */
1495 0x3fffc00, /* dst_mask */
1496 FALSE
), /* pcrel_offset */
1498 /* Used in SHORI. */
1499 HOWTO (R_SH_IMMU16
, /* type */
1501 2, /* size (0 = byte, 1 = short, 2 = long) */
1503 FALSE
, /* pc_relative */
1505 complain_overflow_unsigned
, /* complain_on_overflow */
1506 bfd_elf_generic_reloc
, /* special_function */
1507 "R_SH_IMMU16", /* name */
1508 FALSE
, /* partial_inplace */
1510 0x3fffc00, /* dst_mask */
1511 FALSE
), /* pcrel_offset */
1513 /* Used in MOVI and SHORI (x & 65536). */
1514 HOWTO (R_SH_IMM_LOW16
, /* type */
1516 2, /* size (0 = byte, 1 = short, 2 = long) */
1518 FALSE
, /* pc_relative */
1520 complain_overflow_dont
, /* complain_on_overflow */
1521 bfd_elf_generic_reloc
, /* special_function */
1522 "R_SH_IMM_LOW16", /* name */
1523 FALSE
, /* partial_inplace */
1525 0x3fffc00, /* dst_mask */
1526 FALSE
), /* pcrel_offset */
1528 /* Used in MOVI and SHORI ((x - $) & 65536). */
1529 HOWTO (R_SH_IMM_LOW16_PCREL
, /* type */
1531 2, /* size (0 = byte, 1 = short, 2 = long) */
1533 TRUE
, /* pc_relative */
1535 complain_overflow_dont
, /* complain_on_overflow */
1536 bfd_elf_generic_reloc
, /* special_function */
1537 "R_SH_IMM_LOW16_PCREL", /* name */
1538 FALSE
, /* partial_inplace */
1540 0x3fffc00, /* dst_mask */
1541 TRUE
), /* pcrel_offset */
1543 /* Used in MOVI and SHORI ((x >> 16) & 65536). */
1544 HOWTO (R_SH_IMM_MEDLOW16
, /* type */
1545 16, /* rightshift */
1546 2, /* size (0 = byte, 1 = short, 2 = long) */
1548 FALSE
, /* pc_relative */
1550 complain_overflow_dont
, /* complain_on_overflow */
1551 bfd_elf_generic_reloc
, /* special_function */
1552 "R_SH_IMM_MEDLOW16", /* name */
1553 FALSE
, /* partial_inplace */
1555 0x3fffc00, /* dst_mask */
1556 FALSE
), /* pcrel_offset */
1558 /* Used in MOVI and SHORI (((x - $) >> 16) & 65536). */
1559 HOWTO (R_SH_IMM_MEDLOW16_PCREL
, /* type */
1560 16, /* rightshift */
1561 2, /* size (0 = byte, 1 = short, 2 = long) */
1563 TRUE
, /* pc_relative */
1565 complain_overflow_dont
, /* complain_on_overflow */
1566 bfd_elf_generic_reloc
, /* special_function */
1567 "R_SH_IMM_MEDLOW16_PCREL", /* name */
1568 FALSE
, /* partial_inplace */
1570 0x3fffc00, /* dst_mask */
1571 TRUE
), /* pcrel_offset */
1573 /* Used in MOVI and SHORI ((x >> 32) & 65536). */
1574 HOWTO (R_SH_IMM_MEDHI16
, /* type */
1575 32, /* rightshift */
1576 2, /* size (0 = byte, 1 = short, 2 = long) */
1578 FALSE
, /* pc_relative */
1580 complain_overflow_dont
, /* complain_on_overflow */
1581 bfd_elf_generic_reloc
, /* special_function */
1582 "R_SH_IMM_MEDHI16", /* name */
1583 FALSE
, /* partial_inplace */
1585 0x3fffc00, /* dst_mask */
1586 FALSE
), /* pcrel_offset */
1588 /* Used in MOVI and SHORI (((x - $) >> 32) & 65536). */
1589 HOWTO (R_SH_IMM_MEDHI16_PCREL
, /* type */
1590 32, /* rightshift */
1591 2, /* size (0 = byte, 1 = short, 2 = long) */
1593 TRUE
, /* pc_relative */
1595 complain_overflow_dont
, /* complain_on_overflow */
1596 bfd_elf_generic_reloc
, /* special_function */
1597 "R_SH_IMM_MEDHI16_PCREL", /* name */
1598 FALSE
, /* partial_inplace */
1600 0x3fffc00, /* dst_mask */
1601 TRUE
), /* pcrel_offset */
1603 /* Used in MOVI and SHORI ((x >> 48) & 65536). */
1604 HOWTO (R_SH_IMM_HI16
, /* type */
1605 48, /* rightshift */
1606 2, /* size (0 = byte, 1 = short, 2 = long) */
1608 FALSE
, /* pc_relative */
1610 complain_overflow_dont
, /* complain_on_overflow */
1611 bfd_elf_generic_reloc
, /* special_function */
1612 "R_SH_IMM_HI16", /* name */
1613 FALSE
, /* partial_inplace */
1615 0x3fffc00, /* dst_mask */
1616 FALSE
), /* pcrel_offset */
1618 /* Used in MOVI and SHORI (((x - $) >> 48) & 65536). */
1619 HOWTO (R_SH_IMM_HI16_PCREL
, /* type */
1620 48, /* rightshift */
1621 2, /* size (0 = byte, 1 = short, 2 = long) */
1623 TRUE
, /* pc_relative */
1625 complain_overflow_dont
, /* complain_on_overflow */
1626 bfd_elf_generic_reloc
, /* special_function */
1627 "R_SH_IMM_HI16_PCREL", /* name */
1628 FALSE
, /* partial_inplace */
1630 0x3fffc00, /* dst_mask */
1631 TRUE
), /* pcrel_offset */
1633 /* For the .uaquad pseudo. */
1634 HOWTO (R_SH_64
, /* type */
1636 4, /* size (0 = byte, 1 = short, 2 = long) */
1638 FALSE
, /* pc_relative */
1640 complain_overflow_dont
, /* complain_on_overflow */
1641 bfd_elf_generic_reloc
, /* special_function */
1642 "R_SH_64", /* name */
1643 FALSE
, /* partial_inplace */
1645 ((bfd_vma
) 0) - 1, /* dst_mask */
1646 FALSE
), /* pcrel_offset */
1648 /* For the .uaquad pseudo, (x - $). */
1649 HOWTO (R_SH_64_PCREL
, /* type */
1650 48, /* rightshift */
1651 2, /* size (0 = byte, 1 = short, 2 = long) */
1653 TRUE
, /* pc_relative */
1655 complain_overflow_dont
, /* complain_on_overflow */
1656 bfd_elf_generic_reloc
, /* special_function */
1657 "R_SH_64_PCREL", /* name */
1658 FALSE
, /* partial_inplace */
1660 ((bfd_vma
) 0) - 1, /* dst_mask */
1661 TRUE
), /* pcrel_offset */
1666 static bfd_reloc_status_type
1667 sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
, addr
,
1668 symbol_section
, start
, end
)
1669 int r_type ATTRIBUTE_UNUSED
;
1671 asection
*input_section
;
1674 asection
*symbol_section
;
1677 static bfd_vma last_addr
;
1678 static asection
*last_symbol_section
;
1679 bfd_byte
*start_ptr
, *ptr
, *last_ptr
;
1684 /* Sanity check the address. */
1685 if (addr
> input_section
->_raw_size
)
1686 return bfd_reloc_outofrange
;
1688 /* We require the start and end relocations to be processed consecutively -
1689 although we allow then to be processed forwards or backwards. */
1693 last_symbol_section
= symbol_section
;
1694 return bfd_reloc_ok
;
1696 if (last_addr
!= addr
)
1700 if (! symbol_section
|| last_symbol_section
!= symbol_section
|| end
< start
)
1701 return bfd_reloc_outofrange
;
1703 /* Get the symbol_section contents. */
1704 if (symbol_section
!= input_section
)
1706 if (elf_section_data (symbol_section
)->this_hdr
.contents
!= NULL
)
1707 contents
= elf_section_data (symbol_section
)->this_hdr
.contents
;
1710 contents
= (bfd_byte
*) bfd_malloc (symbol_section
->_raw_size
);
1711 if (contents
== NULL
)
1712 return bfd_reloc_outofrange
;
1713 if (! bfd_get_section_contents (input_bfd
, symbol_section
, contents
,
1715 symbol_section
->_raw_size
))
1718 return bfd_reloc_outofrange
;
1722 #define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
1723 start_ptr
= contents
+ start
;
1724 for (cum_diff
= -6, ptr
= contents
+ end
; cum_diff
< 0 && ptr
> start_ptr
;)
1726 for (last_ptr
= ptr
, ptr
-= 4; ptr
>= start_ptr
&& IS_PPI (ptr
);)
1729 diff
= (last_ptr
- ptr
) >> 1;
1730 cum_diff
+= diff
& 1;
1733 /* Calculate the start / end values to load into rs / re minus four -
1734 so that will cancel out the four we would otherwise have to add to
1735 addr to get the value to subtract in order to get relative addressing. */
1739 end
= (ptr
+ cum_diff
* 2) - contents
;
1743 bfd_vma start0
= start
- 4;
1745 while (start0
&& IS_PPI (contents
+ start0
))
1747 start0
= start
- 2 - ((start
- start0
) & 2);
1748 start
= start0
- cum_diff
- 2;
1752 if (contents
!= NULL
1753 && elf_section_data (symbol_section
)->this_hdr
.contents
!= contents
)
1756 insn
= bfd_get_16 (input_bfd
, contents
+ addr
);
1758 x
= (insn
& 0x200 ? end
: start
) - addr
;
1759 if (input_section
!= symbol_section
)
1760 x
+= ((symbol_section
->output_section
->vma
+ symbol_section
->output_offset
)
1761 - (input_section
->output_section
->vma
1762 + input_section
->output_offset
));
1764 if (x
< -128 || x
> 127)
1765 return bfd_reloc_overflow
;
1767 x
= (insn
& ~0xff) | (x
& 0xff);
1768 bfd_put_16 (input_bfd
, (bfd_vma
) x
, contents
+ addr
);
1770 return bfd_reloc_ok
;
1773 /* This function is used for normal relocs. This used to be like the COFF
1774 function, and is almost certainly incorrect for other ELF targets. */
1776 static bfd_reloc_status_type
1777 sh_elf_reloc (abfd
, reloc_entry
, symbol_in
, data
, input_section
, output_bfd
,
1780 arelent
*reloc_entry
;
1783 asection
*input_section
;
1785 char **error_message ATTRIBUTE_UNUSED
;
1789 enum elf_sh_reloc_type r_type
;
1790 bfd_vma addr
= reloc_entry
->address
;
1791 bfd_byte
*hit_data
= addr
+ (bfd_byte
*) data
;
1793 r_type
= (enum elf_sh_reloc_type
) reloc_entry
->howto
->type
;
1795 if (output_bfd
!= NULL
)
1797 /* Partial linking--do nothing. */
1798 reloc_entry
->address
+= input_section
->output_offset
;
1799 return bfd_reloc_ok
;
1802 /* Almost all relocs have to do with relaxing. If any work must be
1803 done for them, it has been done in sh_relax_section. */
1804 if (r_type
== R_SH_IND12W
&& (symbol_in
->flags
& BSF_LOCAL
) != 0)
1805 return bfd_reloc_ok
;
1807 if (symbol_in
!= NULL
1808 && bfd_is_und_section (symbol_in
->section
))
1809 return bfd_reloc_undefined
;
1811 if (bfd_is_com_section (symbol_in
->section
))
1814 sym_value
= (symbol_in
->value
+
1815 symbol_in
->section
->output_section
->vma
+
1816 symbol_in
->section
->output_offset
);
1821 insn
= bfd_get_32 (abfd
, hit_data
);
1822 insn
+= sym_value
+ reloc_entry
->addend
;
1823 bfd_put_32 (abfd
, (bfd_vma
) insn
, hit_data
);
1826 insn
= bfd_get_16 (abfd
, hit_data
);
1827 sym_value
+= reloc_entry
->addend
;
1828 sym_value
-= (input_section
->output_section
->vma
1829 + input_section
->output_offset
1832 sym_value
+= (insn
& 0xfff) << 1;
1834 sym_value
-= 0x1000;
1835 insn
= (insn
& 0xf000) | (sym_value
& 0xfff);
1836 bfd_put_16 (abfd
, (bfd_vma
) insn
, hit_data
);
1837 if (sym_value
< (bfd_vma
) -0x1000 || sym_value
>= 0x1000)
1838 return bfd_reloc_overflow
;
1845 return bfd_reloc_ok
;
1848 /* This function is used for relocs which are only used for relaxing,
1849 which the linker should otherwise ignore. */
1851 static bfd_reloc_status_type
1852 sh_elf_ignore_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1853 output_bfd
, error_message
)
1854 bfd
*abfd ATTRIBUTE_UNUSED
;
1855 arelent
*reloc_entry
;
1856 asymbol
*symbol ATTRIBUTE_UNUSED
;
1857 PTR data ATTRIBUTE_UNUSED
;
1858 asection
*input_section
;
1860 char **error_message ATTRIBUTE_UNUSED
;
1862 if (output_bfd
!= NULL
)
1863 reloc_entry
->address
+= input_section
->output_offset
;
1864 return bfd_reloc_ok
;
1867 /* This structure is used to map BFD reloc codes to SH ELF relocs. */
1869 struct elf_reloc_map
1871 bfd_reloc_code_real_type bfd_reloc_val
;
1872 unsigned char elf_reloc_val
;
1875 /* An array mapping BFD reloc codes to SH ELF relocs. */
1877 static const struct elf_reloc_map sh_reloc_map
[] =
1879 { BFD_RELOC_NONE
, R_SH_NONE
},
1880 { BFD_RELOC_32
, R_SH_DIR32
},
1881 { BFD_RELOC_CTOR
, R_SH_DIR32
},
1882 { BFD_RELOC_32_PCREL
, R_SH_REL32
},
1883 { BFD_RELOC_SH_PCDISP8BY2
, R_SH_DIR8WPN
},
1884 { BFD_RELOC_SH_PCDISP12BY2
, R_SH_IND12W
},
1885 { BFD_RELOC_SH_PCRELIMM8BY2
, R_SH_DIR8WPZ
},
1886 { BFD_RELOC_SH_PCRELIMM8BY4
, R_SH_DIR8WPL
},
1887 { BFD_RELOC_8_PCREL
, R_SH_SWITCH8
},
1888 { BFD_RELOC_SH_SWITCH16
, R_SH_SWITCH16
},
1889 { BFD_RELOC_SH_SWITCH32
, R_SH_SWITCH32
},
1890 { BFD_RELOC_SH_USES
, R_SH_USES
},
1891 { BFD_RELOC_SH_COUNT
, R_SH_COUNT
},
1892 { BFD_RELOC_SH_ALIGN
, R_SH_ALIGN
},
1893 { BFD_RELOC_SH_CODE
, R_SH_CODE
},
1894 { BFD_RELOC_SH_DATA
, R_SH_DATA
},
1895 { BFD_RELOC_SH_LABEL
, R_SH_LABEL
},
1896 { BFD_RELOC_VTABLE_INHERIT
, R_SH_GNU_VTINHERIT
},
1897 { BFD_RELOC_VTABLE_ENTRY
, R_SH_GNU_VTENTRY
},
1898 { BFD_RELOC_SH_LOOP_START
, R_SH_LOOP_START
},
1899 { BFD_RELOC_SH_LOOP_END
, R_SH_LOOP_END
},
1900 { BFD_RELOC_SH_TLS_GD_32
, R_SH_TLS_GD_32
},
1901 { BFD_RELOC_SH_TLS_LD_32
, R_SH_TLS_LD_32
},
1902 { BFD_RELOC_SH_TLS_LDO_32
, R_SH_TLS_LDO_32
},
1903 { BFD_RELOC_SH_TLS_IE_32
, R_SH_TLS_IE_32
},
1904 { BFD_RELOC_SH_TLS_LE_32
, R_SH_TLS_LE_32
},
1905 { BFD_RELOC_SH_TLS_DTPMOD32
, R_SH_TLS_DTPMOD32
},
1906 { BFD_RELOC_SH_TLS_DTPOFF32
, R_SH_TLS_DTPOFF32
},
1907 { BFD_RELOC_SH_TLS_TPOFF32
, R_SH_TLS_TPOFF32
},
1908 { BFD_RELOC_32_GOT_PCREL
, R_SH_GOT32
},
1909 { BFD_RELOC_32_PLT_PCREL
, R_SH_PLT32
},
1910 { BFD_RELOC_SH_COPY
, R_SH_COPY
},
1911 { BFD_RELOC_SH_GLOB_DAT
, R_SH_GLOB_DAT
},
1912 { BFD_RELOC_SH_JMP_SLOT
, R_SH_JMP_SLOT
},
1913 { BFD_RELOC_SH_RELATIVE
, R_SH_RELATIVE
},
1914 { BFD_RELOC_32_GOTOFF
, R_SH_GOTOFF
},
1915 { BFD_RELOC_SH_GOTPC
, R_SH_GOTPC
},
1916 { BFD_RELOC_SH_GOTPLT32
, R_SH_GOTPLT32
},
1917 #ifdef INCLUDE_SHMEDIA
1918 { BFD_RELOC_SH_GOT_LOW16
, R_SH_GOT_LOW16
},
1919 { BFD_RELOC_SH_GOT_MEDLOW16
, R_SH_GOT_MEDLOW16
},
1920 { BFD_RELOC_SH_GOT_MEDHI16
, R_SH_GOT_MEDHI16
},
1921 { BFD_RELOC_SH_GOT_HI16
, R_SH_GOT_HI16
},
1922 { BFD_RELOC_SH_GOTPLT_LOW16
, R_SH_GOTPLT_LOW16
},
1923 { BFD_RELOC_SH_GOTPLT_MEDLOW16
, R_SH_GOTPLT_MEDLOW16
},
1924 { BFD_RELOC_SH_GOTPLT_MEDHI16
, R_SH_GOTPLT_MEDHI16
},
1925 { BFD_RELOC_SH_GOTPLT_HI16
, R_SH_GOTPLT_HI16
},
1926 { BFD_RELOC_SH_PLT_LOW16
, R_SH_PLT_LOW16
},
1927 { BFD_RELOC_SH_PLT_MEDLOW16
, R_SH_PLT_MEDLOW16
},
1928 { BFD_RELOC_SH_PLT_MEDHI16
, R_SH_PLT_MEDHI16
},
1929 { BFD_RELOC_SH_PLT_HI16
, R_SH_PLT_HI16
},
1930 { BFD_RELOC_SH_GOTOFF_LOW16
, R_SH_GOTOFF_LOW16
},
1931 { BFD_RELOC_SH_GOTOFF_MEDLOW16
, R_SH_GOTOFF_MEDLOW16
},
1932 { BFD_RELOC_SH_GOTOFF_MEDHI16
, R_SH_GOTOFF_MEDHI16
},
1933 { BFD_RELOC_SH_GOTOFF_HI16
, R_SH_GOTOFF_HI16
},
1934 { BFD_RELOC_SH_GOTPC_LOW16
, R_SH_GOTPC_LOW16
},
1935 { BFD_RELOC_SH_GOTPC_MEDLOW16
, R_SH_GOTPC_MEDLOW16
},
1936 { BFD_RELOC_SH_GOTPC_MEDHI16
, R_SH_GOTPC_MEDHI16
},
1937 { BFD_RELOC_SH_GOTPC_HI16
, R_SH_GOTPC_HI16
},
1938 { BFD_RELOC_SH_COPY64
, R_SH_COPY64
},
1939 { BFD_RELOC_SH_GLOB_DAT64
, R_SH_GLOB_DAT64
},
1940 { BFD_RELOC_SH_JMP_SLOT64
, R_SH_JMP_SLOT64
},
1941 { BFD_RELOC_SH_RELATIVE64
, R_SH_RELATIVE64
},
1942 { BFD_RELOC_SH_GOT10BY4
, R_SH_GOT10BY4
},
1943 { BFD_RELOC_SH_GOT10BY8
, R_SH_GOT10BY8
},
1944 { BFD_RELOC_SH_GOTPLT10BY4
, R_SH_GOTPLT10BY4
},
1945 { BFD_RELOC_SH_GOTPLT10BY8
, R_SH_GOTPLT10BY8
},
1946 { BFD_RELOC_SH_PT_16
, R_SH_PT_16
},
1947 { BFD_RELOC_SH_SHMEDIA_CODE
, R_SH_SHMEDIA_CODE
},
1948 { BFD_RELOC_SH_IMMU5
, R_SH_DIR5U
},
1949 { BFD_RELOC_SH_IMMS6
, R_SH_DIR6S
},
1950 { BFD_RELOC_SH_IMMU6
, R_SH_DIR6U
},
1951 { BFD_RELOC_SH_IMMS10
, R_SH_DIR10S
},
1952 { BFD_RELOC_SH_IMMS10BY2
, R_SH_DIR10SW
},
1953 { BFD_RELOC_SH_IMMS10BY4
, R_SH_DIR10SL
},
1954 { BFD_RELOC_SH_IMMS10BY8
, R_SH_DIR10SQ
},
1955 { BFD_RELOC_SH_IMMS16
, R_SH_IMMS16
},
1956 { BFD_RELOC_SH_IMMU16
, R_SH_IMMU16
},
1957 { BFD_RELOC_SH_IMM_LOW16
, R_SH_IMM_LOW16
},
1958 { BFD_RELOC_SH_IMM_LOW16_PCREL
, R_SH_IMM_LOW16_PCREL
},
1959 { BFD_RELOC_SH_IMM_MEDLOW16
, R_SH_IMM_MEDLOW16
},
1960 { BFD_RELOC_SH_IMM_MEDLOW16_PCREL
, R_SH_IMM_MEDLOW16_PCREL
},
1961 { BFD_RELOC_SH_IMM_MEDHI16
, R_SH_IMM_MEDHI16
},
1962 { BFD_RELOC_SH_IMM_MEDHI16_PCREL
, R_SH_IMM_MEDHI16_PCREL
},
1963 { BFD_RELOC_SH_IMM_HI16
, R_SH_IMM_HI16
},
1964 { BFD_RELOC_SH_IMM_HI16_PCREL
, R_SH_IMM_HI16_PCREL
},
1965 { BFD_RELOC_64
, R_SH_64
},
1966 { BFD_RELOC_64_PCREL
, R_SH_64_PCREL
},
1967 #endif /* not INCLUDE_SHMEDIA */
1970 /* Given a BFD reloc code, return the howto structure for the
1971 corresponding SH ELf reloc. */
1973 static reloc_howto_type
*
1974 sh_elf_reloc_type_lookup (abfd
, code
)
1975 bfd
*abfd ATTRIBUTE_UNUSED
;
1976 bfd_reloc_code_real_type code
;
1980 for (i
= 0; i
< sizeof (sh_reloc_map
) / sizeof (struct elf_reloc_map
); i
++)
1982 if (sh_reloc_map
[i
].bfd_reloc_val
== code
)
1983 return &sh_elf_howto_table
[(int) sh_reloc_map
[i
].elf_reloc_val
];
1989 /* Given an ELF reloc, fill in the howto field of a relent. */
1992 sh_elf_info_to_howto (abfd
, cache_ptr
, dst
)
1993 bfd
*abfd ATTRIBUTE_UNUSED
;
1995 Elf_Internal_Rela
*dst
;
1999 r
= ELF32_R_TYPE (dst
->r_info
);
2001 BFD_ASSERT (r
< (unsigned int) R_SH_max
);
2002 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC
|| r
> R_SH_LAST_INVALID_RELOC
);
2003 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_2
|| r
> R_SH_LAST_INVALID_RELOC_2
);
2004 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_3
|| r
> R_SH_LAST_INVALID_RELOC_3
);
2005 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_4
|| r
> R_SH_LAST_INVALID_RELOC_4
);
2006 BFD_ASSERT (r
< R_SH_FIRST_INVALID_RELOC_5
|| r
> R_SH_LAST_INVALID_RELOC_5
);
2008 cache_ptr
->howto
= &sh_elf_howto_table
[r
];
2011 /* This function handles relaxing for SH ELF. See the corresponding
2012 function in coff-sh.c for a description of what this does. FIXME:
2013 There is a lot of duplication here between this code and the COFF
2014 specific code. The format of relocs and symbols is wound deeply
2015 into this code, but it would still be better if the duplication
2016 could be eliminated somehow. Note in particular that although both
2017 functions use symbols like R_SH_CODE, those symbols have different
2018 values; in coff-sh.c they come from include/coff/sh.h, whereas here
2019 they come from enum elf_sh_reloc_type in include/elf/sh.h. */
2022 sh_elf_relax_section (abfd
, sec
, link_info
, again
)
2025 struct bfd_link_info
*link_info
;
2028 Elf_Internal_Shdr
*symtab_hdr
;
2029 Elf_Internal_Rela
*internal_relocs
;
2030 bfd_boolean have_code
;
2031 Elf_Internal_Rela
*irel
, *irelend
;
2032 bfd_byte
*contents
= NULL
;
2033 Elf_Internal_Sym
*isymbuf
= NULL
;
2037 if (link_info
->relocatable
2038 || (sec
->flags
& SEC_RELOC
) == 0
2039 || sec
->reloc_count
== 0)
2042 #ifdef INCLUDE_SHMEDIA
2043 if (elf_section_data (sec
)->this_hdr
.sh_flags
2044 & (SHF_SH5_ISA32
| SHF_SH5_ISA32_MIXED
))
2050 /* If this is the first time we have been called for this section,
2051 initialize the cooked size. */
2052 if (sec
->_cooked_size
== 0)
2053 sec
->_cooked_size
= sec
->_raw_size
;
2055 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2057 internal_relocs
= (_bfd_elf_link_read_relocs
2058 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
2059 link_info
->keep_memory
));
2060 if (internal_relocs
== NULL
)
2065 irelend
= internal_relocs
+ sec
->reloc_count
;
2066 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2068 bfd_vma laddr
, paddr
, symval
;
2069 unsigned short insn
;
2070 Elf_Internal_Rela
*irelfn
, *irelscan
, *irelcount
;
2071 bfd_signed_vma foff
;
2073 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_CODE
)
2076 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_USES
)
2079 /* Get the section contents. */
2080 if (contents
== NULL
)
2082 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2083 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2086 contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
2087 if (contents
== NULL
)
2090 if (! bfd_get_section_contents (abfd
, sec
, contents
,
2091 (file_ptr
) 0, sec
->_raw_size
))
2096 /* The r_addend field of the R_SH_USES reloc will point us to
2097 the register load. The 4 is because the r_addend field is
2098 computed as though it were a jump offset, which are based
2099 from 4 bytes after the jump instruction. */
2100 laddr
= irel
->r_offset
+ 4 + irel
->r_addend
;
2101 if (laddr
>= sec
->_raw_size
)
2103 (*_bfd_error_handler
) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
2104 bfd_archive_filename (abfd
),
2105 (unsigned long) irel
->r_offset
);
2108 insn
= bfd_get_16 (abfd
, contents
+ laddr
);
2110 /* If the instruction is not mov.l NN,rN, we don't know what to
2112 if ((insn
& 0xf000) != 0xd000)
2114 ((*_bfd_error_handler
)
2115 (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
2116 bfd_archive_filename (abfd
), (unsigned long) irel
->r_offset
, insn
));
2120 /* Get the address from which the register is being loaded. The
2121 displacement in the mov.l instruction is quadrupled. It is a
2122 displacement from four bytes after the movl instruction, but,
2123 before adding in the PC address, two least significant bits
2124 of the PC are cleared. We assume that the section is aligned
2125 on a four byte boundary. */
2126 paddr
= insn
& 0xff;
2128 paddr
+= (laddr
+ 4) &~ (bfd_vma
) 3;
2129 if (paddr
>= sec
->_raw_size
)
2131 ((*_bfd_error_handler
)
2132 (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
2133 bfd_archive_filename (abfd
), (unsigned long) irel
->r_offset
));
2137 /* Get the reloc for the address from which the register is
2138 being loaded. This reloc will tell us which function is
2139 actually being called. */
2140 for (irelfn
= internal_relocs
; irelfn
< irelend
; irelfn
++)
2141 if (irelfn
->r_offset
== paddr
2142 && ELF32_R_TYPE (irelfn
->r_info
) == (int) R_SH_DIR32
)
2144 if (irelfn
>= irelend
)
2146 ((*_bfd_error_handler
)
2147 (_("%s: 0x%lx: warning: could not find expected reloc"),
2148 bfd_archive_filename (abfd
), (unsigned long) paddr
));
2152 /* Read this BFD's symbols if we haven't done so already. */
2153 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2155 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2156 if (isymbuf
== NULL
)
2157 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
2158 symtab_hdr
->sh_info
, 0,
2160 if (isymbuf
== NULL
)
2164 /* Get the value of the symbol referred to by the reloc. */
2165 if (ELF32_R_SYM (irelfn
->r_info
) < symtab_hdr
->sh_info
)
2167 /* A local symbol. */
2168 Elf_Internal_Sym
*isym
;
2170 isym
= isymbuf
+ ELF32_R_SYM (irelfn
->r_info
);
2172 != (unsigned int) _bfd_elf_section_from_bfd_section (abfd
, sec
))
2174 ((*_bfd_error_handler
)
2175 (_("%s: 0x%lx: warning: symbol in unexpected section"),
2176 bfd_archive_filename (abfd
), (unsigned long) paddr
));
2180 symval
= (isym
->st_value
2181 + sec
->output_section
->vma
2182 + sec
->output_offset
);
2187 struct elf_link_hash_entry
*h
;
2189 indx
= ELF32_R_SYM (irelfn
->r_info
) - symtab_hdr
->sh_info
;
2190 h
= elf_sym_hashes (abfd
)[indx
];
2191 BFD_ASSERT (h
!= NULL
);
2192 if (h
->root
.type
!= bfd_link_hash_defined
2193 && h
->root
.type
!= bfd_link_hash_defweak
)
2195 /* This appears to be a reference to an undefined
2196 symbol. Just ignore it--it will be caught by the
2197 regular reloc processing. */
2201 symval
= (h
->root
.u
.def
.value
2202 + h
->root
.u
.def
.section
->output_section
->vma
2203 + h
->root
.u
.def
.section
->output_offset
);
2206 symval
+= bfd_get_32 (abfd
, contents
+ paddr
);
2208 /* See if this function call can be shortened. */
2211 + sec
->output_section
->vma
2212 + sec
->output_offset
2214 if (foff
< -0x1000 || foff
>= 0x1000)
2216 /* After all that work, we can't shorten this function call. */
2220 /* Shorten the function call. */
2222 /* For simplicity of coding, we are going to modify the section
2223 contents, the section relocs, and the BFD symbol table. We
2224 must tell the rest of the code not to free up this
2225 information. It would be possible to instead create a table
2226 of changes which have to be made, as is done in coff-mips.c;
2227 that would be more work, but would require less memory when
2228 the linker is run. */
2230 elf_section_data (sec
)->relocs
= internal_relocs
;
2231 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2232 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2234 /* Replace the jsr with a bsr. */
2236 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
2237 replace the jsr with a bsr. */
2238 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irelfn
->r_info
), R_SH_IND12W
);
2239 /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
2240 here, but that only checks if the symbol is an external symbol,
2241 not if the symbol is in a different section. Besides, we need
2242 a consistent meaning for the relocation, so we just assume here that
2243 the value of the symbol is not available. */
2245 if (ELF32_R_SYM (irelfn
->r_info
) < symtab_hdr
->sh_info
)
2247 /* If this needs to be changed because of future relaxing,
2248 it will be handled here like other internal IND12W
2251 (bfd_vma
) 0xb000 | ((foff
>> 1) & 0xfff),
2252 contents
+ irel
->r_offset
);
2257 /* We can't fully resolve this yet, because the external
2258 symbol value may be changed by future relaxing. We let
2259 the final link phase handle it. */
2260 bfd_put_16 (abfd
, (bfd_vma
) 0xb000, contents
+ irel
->r_offset
);
2262 irel
->r_addend
= -4;
2264 /* See if there is another R_SH_USES reloc referring to the same
2266 for (irelscan
= internal_relocs
; irelscan
< irelend
; irelscan
++)
2267 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_USES
2268 && laddr
== irelscan
->r_offset
+ 4 + irelscan
->r_addend
)
2270 if (irelscan
< irelend
)
2272 /* Some other function call depends upon this register load,
2273 and we have not yet converted that function call.
2274 Indeed, we may never be able to convert it. There is
2275 nothing else we can do at this point. */
2279 /* Look for a R_SH_COUNT reloc on the location where the
2280 function address is stored. Do this before deleting any
2281 bytes, to avoid confusion about the address. */
2282 for (irelcount
= internal_relocs
; irelcount
< irelend
; irelcount
++)
2283 if (irelcount
->r_offset
== paddr
2284 && ELF32_R_TYPE (irelcount
->r_info
) == (int) R_SH_COUNT
)
2287 /* Delete the register load. */
2288 if (! sh_elf_relax_delete_bytes (abfd
, sec
, laddr
, 2))
2291 /* That will change things, so, just in case it permits some
2292 other function call to come within range, we should relax
2293 again. Note that this is not required, and it may be slow. */
2296 /* Now check whether we got a COUNT reloc. */
2297 if (irelcount
>= irelend
)
2299 ((*_bfd_error_handler
)
2300 (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
2301 bfd_archive_filename (abfd
), (unsigned long) paddr
));
2305 /* The number of uses is stored in the r_addend field. We've
2306 just deleted one. */
2307 if (irelcount
->r_addend
== 0)
2309 ((*_bfd_error_handler
) (_("%s: 0x%lx: warning: bad count"),
2310 bfd_archive_filename (abfd
),
2311 (unsigned long) paddr
));
2315 --irelcount
->r_addend
;
2317 /* If there are no more uses, we can delete the address. Reload
2318 the address from irelfn, in case it was changed by the
2319 previous call to sh_elf_relax_delete_bytes. */
2320 if (irelcount
->r_addend
== 0)
2322 if (! sh_elf_relax_delete_bytes (abfd
, sec
, irelfn
->r_offset
, 4))
2326 /* We've done all we can with that function call. */
2329 /* Look for load and store instructions that we can align on four
2331 if ((elf_elfheader (abfd
)->e_flags
& EF_SH_MACH_MASK
) != EF_SH4
2334 bfd_boolean swapped
;
2336 /* Get the section contents. */
2337 if (contents
== NULL
)
2339 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2340 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2343 contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
2344 if (contents
== NULL
)
2347 if (! bfd_get_section_contents (abfd
, sec
, contents
,
2348 (file_ptr
) 0, sec
->_raw_size
))
2353 if (! sh_elf_align_loads (abfd
, sec
, internal_relocs
, contents
,
2359 elf_section_data (sec
)->relocs
= internal_relocs
;
2360 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2361 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2366 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2368 if (! link_info
->keep_memory
)
2372 /* Cache the symbols for elf_link_input_bfd. */
2373 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2377 if (contents
!= NULL
2378 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2380 if (! link_info
->keep_memory
)
2384 /* Cache the section contents for elf_link_input_bfd. */
2385 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2389 if (internal_relocs
!= NULL
2390 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2391 free (internal_relocs
);
2397 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2399 if (contents
!= NULL
2400 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
2402 if (internal_relocs
!= NULL
2403 && elf_section_data (sec
)->relocs
!= internal_relocs
)
2404 free (internal_relocs
);
2409 /* Delete some bytes from a section while relaxing. FIXME: There is a
2410 lot of duplication between this function and sh_relax_delete_bytes
2414 sh_elf_relax_delete_bytes (abfd
, sec
, addr
, count
)
2420 Elf_Internal_Shdr
*symtab_hdr
;
2421 unsigned int sec_shndx
;
2423 Elf_Internal_Rela
*irel
, *irelend
;
2424 Elf_Internal_Rela
*irelalign
;
2426 Elf_Internal_Sym
*isymbuf
, *isym
, *isymend
;
2427 struct elf_link_hash_entry
**sym_hashes
;
2428 struct elf_link_hash_entry
**end_hashes
;
2429 unsigned int symcount
;
2432 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2433 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2435 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2437 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2439 /* The deletion must stop at the next ALIGN reloc for an aligment
2440 power larger than the number of bytes we are deleting. */
2443 toaddr
= sec
->_cooked_size
;
2445 irel
= elf_section_data (sec
)->relocs
;
2446 irelend
= irel
+ sec
->reloc_count
;
2447 for (; irel
< irelend
; irel
++)
2449 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2450 && irel
->r_offset
> addr
2451 && count
< (1 << irel
->r_addend
))
2454 toaddr
= irel
->r_offset
;
2459 /* Actually delete the bytes. */
2460 memmove (contents
+ addr
, contents
+ addr
+ count
,
2461 (size_t) (toaddr
- addr
- count
));
2462 if (irelalign
== NULL
)
2463 sec
->_cooked_size
-= count
;
2468 #define NOP_OPCODE (0x0009)
2470 BFD_ASSERT ((count
& 1) == 0);
2471 for (i
= 0; i
< count
; i
+= 2)
2472 bfd_put_16 (abfd
, (bfd_vma
) NOP_OPCODE
, contents
+ toaddr
- count
+ i
);
2475 /* Adjust all the relocs. */
2476 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
2478 bfd_vma nraddr
, stop
;
2481 int off
, adjust
, oinsn
;
2482 bfd_signed_vma voff
= 0;
2483 bfd_boolean overflow
;
2485 /* Get the new reloc address. */
2486 nraddr
= irel
->r_offset
;
2487 if ((irel
->r_offset
> addr
2488 && irel
->r_offset
< toaddr
)
2489 || (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_ALIGN
2490 && irel
->r_offset
== toaddr
))
2493 /* See if this reloc was for the bytes we have deleted, in which
2494 case we no longer care about it. Don't delete relocs which
2495 represent addresses, though. */
2496 if (irel
->r_offset
>= addr
2497 && irel
->r_offset
< addr
+ count
2498 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_ALIGN
2499 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
2500 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_DATA
2501 && ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_LABEL
)
2502 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2505 /* If this is a PC relative reloc, see if the range it covers
2506 includes the bytes we have deleted. */
2507 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2516 start
= irel
->r_offset
;
2517 insn
= bfd_get_16 (abfd
, contents
+ nraddr
);
2521 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2524 start
= stop
= addr
;
2528 /* If this reloc is against a symbol defined in this
2529 section, and the symbol will not be adjusted below, we
2530 must check the addend to see it will put the value in
2531 range to be adjusted, and hence must be changed. */
2532 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2534 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
2535 if (isym
->st_shndx
== sec_shndx
2536 && (isym
->st_value
<= addr
2537 || isym
->st_value
>= toaddr
))
2541 val
= bfd_get_32 (abfd
, contents
+ nraddr
);
2542 val
+= isym
->st_value
;
2543 if (val
> addr
&& val
< toaddr
)
2544 bfd_put_32 (abfd
, val
- count
, contents
+ nraddr
);
2547 start
= stop
= addr
;
2554 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2561 /* This has been made by previous relaxation. Since the
2562 relocation will be against an external symbol, the
2563 final relocation will just do the right thing. */
2564 start
= stop
= addr
;
2570 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ 4 + off
* 2);
2572 /* The addend will be against the section symbol, thus
2573 for adjusting the addend, the relevant start is the
2574 start of the section.
2575 N.B. If we want to abandom in-place changes here and
2576 test directly using symbol + addend, we have to take into
2577 account that the addend has already been adjusted by -4. */
2578 if (stop
> addr
&& stop
< toaddr
)
2579 irel
->r_addend
-= count
;
2585 stop
= start
+ 4 + off
* 2;
2590 stop
= (start
& ~(bfd_vma
) 3) + 4 + off
* 4;
2596 /* These relocs types represent
2598 The r_addend field holds the difference between the reloc
2599 address and L1. That is the start of the reloc, and
2600 adding in the contents gives us the top. We must adjust
2601 both the r_offset field and the section contents.
2602 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
2603 and the elf bfd r_offset is called r_vaddr. */
2605 stop
= irel
->r_offset
;
2606 start
= (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irel
->r_addend
);
2610 && (stop
<= addr
|| stop
>= toaddr
))
2611 irel
->r_addend
+= count
;
2612 else if (stop
> addr
2614 && (start
<= addr
|| start
>= toaddr
))
2615 irel
->r_addend
-= count
;
2617 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH16
)
2618 voff
= bfd_get_signed_16 (abfd
, contents
+ nraddr
);
2619 else if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_SWITCH8
)
2620 voff
= bfd_get_8 (abfd
, contents
+ nraddr
);
2622 voff
= bfd_get_signed_32 (abfd
, contents
+ nraddr
);
2623 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2628 start
= irel
->r_offset
;
2629 stop
= (bfd_vma
) ((bfd_signed_vma
) start
2630 + (long) irel
->r_addend
2637 && (stop
<= addr
|| stop
>= toaddr
))
2639 else if (stop
> addr
2641 && (start
<= addr
|| start
>= toaddr
))
2650 switch ((enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
))
2659 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2661 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2666 if ((oinsn
& 0xf000) != (insn
& 0xf000))
2668 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2672 BFD_ASSERT (adjust
== count
|| count
>= 4);
2677 if ((irel
->r_offset
& 3) == 0)
2680 if ((oinsn
& 0xff00) != (insn
& 0xff00))
2682 bfd_put_16 (abfd
, (bfd_vma
) insn
, contents
+ nraddr
);
2687 if (voff
< 0 || voff
>= 0xff)
2689 bfd_put_8 (abfd
, voff
, contents
+ nraddr
);
2694 if (voff
< - 0x8000 || voff
>= 0x8000)
2696 bfd_put_signed_16 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2701 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
, contents
+ nraddr
);
2705 irel
->r_addend
+= adjust
;
2711 ((*_bfd_error_handler
)
2712 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
2713 bfd_archive_filename (abfd
), (unsigned long) irel
->r_offset
));
2714 bfd_set_error (bfd_error_bad_value
);
2719 irel
->r_offset
= nraddr
;
2722 /* Look through all the other sections. If there contain any IMM32
2723 relocs against internal symbols which we are not going to adjust
2724 below, we may need to adjust the addends. */
2725 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2727 Elf_Internal_Rela
*internal_relocs
;
2728 Elf_Internal_Rela
*irelscan
, *irelscanend
;
2729 bfd_byte
*ocontents
;
2732 || (o
->flags
& SEC_RELOC
) == 0
2733 || o
->reloc_count
== 0)
2736 /* We always cache the relocs. Perhaps, if info->keep_memory is
2737 FALSE, we should free them, if we are permitted to, when we
2738 leave sh_coff_relax_section. */
2739 internal_relocs
= (_bfd_elf_link_read_relocs
2740 (abfd
, o
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
2742 if (internal_relocs
== NULL
)
2746 irelscanend
= internal_relocs
+ o
->reloc_count
;
2747 for (irelscan
= internal_relocs
; irelscan
< irelscanend
; irelscan
++)
2749 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */
2750 if (ELF32_R_TYPE (irelscan
->r_info
) == (int) R_SH_SWITCH32
)
2752 bfd_vma start
, stop
;
2753 bfd_signed_vma voff
;
2755 if (ocontents
== NULL
)
2757 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2758 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2761 /* We always cache the section contents.
2762 Perhaps, if info->keep_memory is FALSE, we
2763 should free them, if we are permitted to,
2764 when we leave sh_coff_relax_section. */
2765 ocontents
= (bfd_byte
*) bfd_malloc (o
->_raw_size
);
2766 if (ocontents
== NULL
)
2768 if (! bfd_get_section_contents (abfd
, o
, ocontents
,
2772 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2776 stop
= irelscan
->r_offset
;
2778 = (bfd_vma
) ((bfd_signed_vma
) stop
- (long) irelscan
->r_addend
);
2780 /* STOP is in a different section, so it won't change. */
2781 if (start
> addr
&& start
< toaddr
)
2782 irelscan
->r_addend
+= count
;
2784 voff
= bfd_get_signed_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2785 stop
= (bfd_vma
) ((bfd_signed_vma
) start
+ voff
);
2789 && (stop
<= addr
|| stop
>= toaddr
))
2790 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
+ count
,
2791 ocontents
+ irelscan
->r_offset
);
2792 else if (stop
> addr
2794 && (start
<= addr
|| start
>= toaddr
))
2795 bfd_put_signed_32 (abfd
, (bfd_vma
) voff
- count
,
2796 ocontents
+ irelscan
->r_offset
);
2799 if (ELF32_R_TYPE (irelscan
->r_info
) != (int) R_SH_DIR32
)
2802 if (ELF32_R_SYM (irelscan
->r_info
) >= symtab_hdr
->sh_info
)
2806 isym
= isymbuf
+ ELF32_R_SYM (irelscan
->r_info
);
2807 if (isym
->st_shndx
== sec_shndx
2808 && (isym
->st_value
<= addr
2809 || isym
->st_value
>= toaddr
))
2813 if (ocontents
== NULL
)
2815 if (elf_section_data (o
)->this_hdr
.contents
!= NULL
)
2816 ocontents
= elf_section_data (o
)->this_hdr
.contents
;
2819 /* We always cache the section contents.
2820 Perhaps, if info->keep_memory is FALSE, we
2821 should free them, if we are permitted to,
2822 when we leave sh_coff_relax_section. */
2823 ocontents
= (bfd_byte
*) bfd_malloc (o
->_raw_size
);
2824 if (ocontents
== NULL
)
2826 if (! bfd_get_section_contents (abfd
, o
, ocontents
,
2830 elf_section_data (o
)->this_hdr
.contents
= ocontents
;
2834 val
= bfd_get_32 (abfd
, ocontents
+ irelscan
->r_offset
);
2835 val
+= isym
->st_value
;
2836 if (val
> addr
&& val
< toaddr
)
2837 bfd_put_32 (abfd
, val
- count
,
2838 ocontents
+ irelscan
->r_offset
);
2843 /* Adjust the local symbols defined in this section. */
2844 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
2845 for (isym
= isymbuf
; isym
< isymend
; isym
++)
2847 if (isym
->st_shndx
== sec_shndx
2848 && isym
->st_value
> addr
2849 && isym
->st_value
< toaddr
)
2850 isym
->st_value
-= count
;
2853 /* Now adjust the global symbols defined in this section. */
2854 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2855 - symtab_hdr
->sh_info
);
2856 sym_hashes
= elf_sym_hashes (abfd
);
2857 end_hashes
= sym_hashes
+ symcount
;
2858 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2860 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
2861 if ((sym_hash
->root
.type
== bfd_link_hash_defined
2862 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2863 && sym_hash
->root
.u
.def
.section
== sec
2864 && sym_hash
->root
.u
.def
.value
> addr
2865 && sym_hash
->root
.u
.def
.value
< toaddr
)
2867 sym_hash
->root
.u
.def
.value
-= count
;
2871 /* See if we can move the ALIGN reloc forward. We have adjusted
2872 r_offset for it already. */
2873 if (irelalign
!= NULL
)
2875 bfd_vma alignto
, alignaddr
;
2877 alignto
= BFD_ALIGN (toaddr
, 1 << irelalign
->r_addend
);
2878 alignaddr
= BFD_ALIGN (irelalign
->r_offset
,
2879 1 << irelalign
->r_addend
);
2880 if (alignto
!= alignaddr
)
2882 /* Tail recursion. */
2883 return sh_elf_relax_delete_bytes (abfd
, sec
, alignaddr
,
2884 (int) (alignto
- alignaddr
));
2891 /* Look for loads and stores which we can align to four byte
2892 boundaries. This is like sh_align_loads in coff-sh.c. */
2895 sh_elf_align_loads (abfd
, sec
, internal_relocs
, contents
, pswapped
)
2896 bfd
*abfd ATTRIBUTE_UNUSED
;
2898 Elf_Internal_Rela
*internal_relocs
;
2899 bfd_byte
*contents ATTRIBUTE_UNUSED
;
2900 bfd_boolean
*pswapped
;
2902 Elf_Internal_Rela
*irel
, *irelend
;
2903 bfd_vma
*labels
= NULL
;
2904 bfd_vma
*label
, *label_end
;
2909 irelend
= internal_relocs
+ sec
->reloc_count
;
2911 /* Get all the addresses with labels on them. */
2912 amt
= sec
->reloc_count
;
2913 amt
*= sizeof (bfd_vma
);
2914 labels
= (bfd_vma
*) bfd_malloc (amt
);
2918 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2920 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_LABEL
)
2922 *label_end
= irel
->r_offset
;
2927 /* Note that the assembler currently always outputs relocs in
2928 address order. If that ever changes, this code will need to sort
2929 the label values and the relocs. */
2933 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2935 bfd_vma start
, stop
;
2937 if (ELF32_R_TYPE (irel
->r_info
) != (int) R_SH_CODE
)
2940 start
= irel
->r_offset
;
2942 for (irel
++; irel
< irelend
; irel
++)
2943 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_SH_DATA
)
2946 stop
= irel
->r_offset
;
2948 stop
= sec
->_cooked_size
;
2950 if (! _bfd_sh_align_load_span (abfd
, sec
, contents
, sh_elf_swap_insns
,
2951 (PTR
) internal_relocs
, &label
,
2952 label_end
, start
, stop
, pswapped
))
2966 /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
2969 sh_elf_swap_insns (abfd
, sec
, relocs
, contents
, addr
)
2976 Elf_Internal_Rela
*internal_relocs
= (Elf_Internal_Rela
*) relocs
;
2977 unsigned short i1
, i2
;
2978 Elf_Internal_Rela
*irel
, *irelend
;
2980 /* Swap the instructions themselves. */
2981 i1
= bfd_get_16 (abfd
, contents
+ addr
);
2982 i2
= bfd_get_16 (abfd
, contents
+ addr
+ 2);
2983 bfd_put_16 (abfd
, (bfd_vma
) i2
, contents
+ addr
);
2984 bfd_put_16 (abfd
, (bfd_vma
) i1
, contents
+ addr
+ 2);
2986 /* Adjust all reloc addresses. */
2987 irelend
= internal_relocs
+ sec
->reloc_count
;
2988 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2990 enum elf_sh_reloc_type type
;
2993 /* There are a few special types of relocs that we don't want to
2994 adjust. These relocs do not apply to the instruction itself,
2995 but are only associated with the address. */
2996 type
= (enum elf_sh_reloc_type
) ELF32_R_TYPE (irel
->r_info
);
2997 if (type
== R_SH_ALIGN
2998 || type
== R_SH_CODE
2999 || type
== R_SH_DATA
3000 || type
== R_SH_LABEL
)
3003 /* If an R_SH_USES reloc points to one of the addresses being
3004 swapped, we must adjust it. It would be incorrect to do this
3005 for a jump, though, since we want to execute both
3006 instructions after the jump. (We have avoided swapping
3007 around a label, so the jump will not wind up executing an
3008 instruction it shouldn't). */
3009 if (type
== R_SH_USES
)
3013 off
= irel
->r_offset
+ 4 + irel
->r_addend
;
3015 irel
->r_offset
+= 2;
3016 else if (off
== addr
+ 2)
3017 irel
->r_offset
-= 2;
3020 if (irel
->r_offset
== addr
)
3022 irel
->r_offset
+= 2;
3025 else if (irel
->r_offset
== addr
+ 2)
3027 irel
->r_offset
-= 2;
3036 unsigned short insn
, oinsn
;
3037 bfd_boolean overflow
;
3039 loc
= contents
+ irel
->r_offset
;
3048 insn
= bfd_get_16 (abfd
, loc
);
3051 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3053 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3057 insn
= bfd_get_16 (abfd
, loc
);
3060 if ((oinsn
& 0xf000) != (insn
& 0xf000))
3062 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3066 /* This reloc ignores the least significant 3 bits of
3067 the program counter before adding in the offset.
3068 This means that if ADDR is at an even address, the
3069 swap will not affect the offset. If ADDR is an at an
3070 odd address, then the instruction will be crossing a
3071 four byte boundary, and must be adjusted. */
3072 if ((addr
& 3) != 0)
3074 insn
= bfd_get_16 (abfd
, loc
);
3077 if ((oinsn
& 0xff00) != (insn
& 0xff00))
3079 bfd_put_16 (abfd
, (bfd_vma
) insn
, loc
);
3087 ((*_bfd_error_handler
)
3088 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
3089 bfd_archive_filename (abfd
), (unsigned long) irel
->r_offset
));
3090 bfd_set_error (bfd_error_bad_value
);
3099 #ifdef INCLUDE_SHMEDIA
3101 /* The size in bytes of an entry in the procedure linkage table. */
3103 #define PLT_ENTRY_SIZE 64
3105 /* First entry in an absolute procedure linkage table look like this. */
3107 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3109 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */
3110 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
3111 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3112 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3113 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3114 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3115 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3116 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3117 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3118 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3119 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3120 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3121 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3122 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3123 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3124 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3127 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3129 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */
3130 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
3131 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3132 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3133 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3134 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3135 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3136 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3137 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3138 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3139 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3140 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3141 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3142 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3143 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3144 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3147 /* Sebsequent entries in an absolute procedure linkage table look like
3150 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3152 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */
3153 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
3154 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */
3155 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3156 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3157 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3158 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3159 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3160 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */
3161 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
3162 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3163 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3164 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3165 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3166 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3167 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3170 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3172 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */
3173 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3174 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */
3175 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3176 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3177 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3178 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3179 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3180 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */
3181 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
3182 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3183 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3184 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3185 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3186 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3187 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3190 /* Entries in a PIC procedure linkage table look like this. */
3192 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3194 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */
3195 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3196 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
3197 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3198 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3199 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3200 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3201 0x6f, 0xf0, 0xff, 0xf0, /* nop */
3202 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */
3203 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
3204 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */
3205 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3206 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */
3207 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */
3208 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3209 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3212 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3214 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */
3215 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3216 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
3217 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3218 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3219 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3220 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3221 0xf0, 0xff, 0xf0, 0x6f, /* nop */
3222 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */
3223 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
3224 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */
3225 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3226 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */
3227 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */
3228 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3229 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3232 static const bfd_byte
*elf_sh_plt0_entry
;
3233 static const bfd_byte
*elf_sh_plt_entry
;
3234 static const bfd_byte
*elf_sh_pic_plt_entry
;
3236 /* Return size of a PLT entry. */
3237 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3239 /* Return offset of the PLT0 address in an absolute PLT entry. */
3240 #define elf_sh_plt_plt0_offset(info) 32
3242 /* Return offset of the linker in PLT0 entry. */
3243 #define elf_sh_plt0_gotplt_offset(info) 0
3245 /* Return offset of the trampoline in PLT entry */
3246 #define elf_sh_plt_temp_offset(info) 33 /* Add one because it's SHmedia. */
3248 /* Return offset of the symbol in PLT entry. */
3249 #define elf_sh_plt_symbol_offset(info) 0
3251 /* Return offset of the relocation in PLT entry. */
3252 #define elf_sh_plt_reloc_offset(info) (info->shared ? 52 : 44)
3255 movi_shori_putval (output_bfd
, value
, addr
)
3257 unsigned long value
;
3260 bfd_put_32 (output_bfd
,
3261 bfd_get_32 (output_bfd
, addr
)
3262 | ((value
>> 6) & 0x3fffc00),
3264 bfd_put_32 (output_bfd
,
3265 bfd_get_32 (output_bfd
, addr
+ 4)
3266 | ((value
<< 10) & 0x3fffc00),
3271 /* The size in bytes of an entry in the procedure linkage table. */
3273 #define PLT_ENTRY_SIZE 28
3275 /* First entry in an absolute procedure linkage table look like this. */
3278 /* Note - this code has been "optimised" not to use r2. r2 is used by
3279 GCC to return the address of large strutcures, so it should not be
3280 corrupted here. This does mean however, that this PLT does not conform
3281 to the SH PIC ABI. That spec says that r0 contains the type of the PLT
3282 and r2 contains the GOT id. This version stores the GOT id in r0 and
3283 ignores the type. Loaders can easily detect this difference however,
3284 since the type will always be 0 or 8, and the GOT ids will always be
3285 greater than or equal to 12. */
3286 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3288 0xd0, 0x05, /* mov.l 2f,r0 */
3289 0x60, 0x02, /* mov.l @r0,r0 */
3290 0x2f, 0x06, /* mov.l r0,@-r15 */
3291 0xd0, 0x03, /* mov.l 1f,r0 */
3292 0x60, 0x02, /* mov.l @r0,r0 */
3293 0x40, 0x2b, /* jmp @r0 */
3294 0x60, 0xf6, /* mov.l @r15+,r0 */
3295 0x00, 0x09, /* nop */
3296 0x00, 0x09, /* nop */
3297 0x00, 0x09, /* nop */
3298 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3299 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3302 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3304 0x05, 0xd0, /* mov.l 2f,r0 */
3305 0x02, 0x60, /* mov.l @r0,r0 */
3306 0x06, 0x2f, /* mov.l r0,@-r15 */
3307 0x03, 0xd0, /* mov.l 1f,r0 */
3308 0x02, 0x60, /* mov.l @r0,r0 */
3309 0x2b, 0x40, /* jmp @r0 */
3310 0xf6, 0x60, /* mov.l @r15+,r0 */
3311 0x09, 0x00, /* nop */
3312 0x09, 0x00, /* nop */
3313 0x09, 0x00, /* nop */
3314 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3315 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3318 /* Sebsequent entries in an absolute procedure linkage table look like
3321 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3323 0xd0, 0x04, /* mov.l 1f,r0 */
3324 0x60, 0x02, /* mov.l @r0,r0 */
3325 0xd1, 0x02, /* mov.l 0f,r1 */
3326 0x40, 0x2b, /* jmp @r0 */
3327 0x60, 0x13, /* mov r1,r0 */
3328 0xd1, 0x03, /* mov.l 2f,r1 */
3329 0x40, 0x2b, /* jmp @r0 */
3330 0x00, 0x09, /* nop */
3331 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3332 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3333 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3336 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3338 0x04, 0xd0, /* mov.l 1f,r0 */
3339 0x02, 0x60, /* mov.l @r0,r0 */
3340 0x02, 0xd1, /* mov.l 0f,r1 */
3341 0x2b, 0x40, /* jmp @r0 */
3342 0x13, 0x60, /* mov r1,r0 */
3343 0x03, 0xd1, /* mov.l 2f,r1 */
3344 0x2b, 0x40, /* jmp @r0 */
3345 0x09, 0x00, /* nop */
3346 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3347 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3348 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3351 /* Entries in a PIC procedure linkage table look like this. */
3353 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3355 0xd0, 0x04, /* mov.l 1f,r0 */
3356 0x00, 0xce, /* mov.l @(r0,r12),r0 */
3357 0x40, 0x2b, /* jmp @r0 */
3358 0x00, 0x09, /* nop */
3359 0x50, 0xc2, /* mov.l @(8,r12),r0 */
3360 0xd1, 0x03, /* mov.l 2f,r1 */
3361 0x40, 0x2b, /* jmp @r0 */
3362 0x50, 0xc1, /* mov.l @(4,r12),r0 */
3363 0x00, 0x09, /* nop */
3364 0x00, 0x09, /* nop */
3365 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3366 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3369 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3371 0x04, 0xd0, /* mov.l 1f,r0 */
3372 0xce, 0x00, /* mov.l @(r0,r12),r0 */
3373 0x2b, 0x40, /* jmp @r0 */
3374 0x09, 0x00, /* nop */
3375 0xc2, 0x50, /* mov.l @(8,r12),r0 */
3376 0x03, 0xd1, /* mov.l 2f,r1 */
3377 0x2b, 0x40, /* jmp @r0 */
3378 0xc1, 0x50, /* mov.l @(4,r12),r0 */
3379 0x09, 0x00, /* nop */
3380 0x09, 0x00, /* nop */
3381 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3382 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3385 #else /* These are the old style PLT entries. */
3386 static const bfd_byte elf_sh_plt0_entry_be
[PLT_ENTRY_SIZE
] =
3388 0xd0, 0x04, /* mov.l 1f,r0 */
3389 0xd2, 0x05, /* mov.l 2f,r2 */
3390 0x60, 0x02, /* mov.l @r0,r0 */
3391 0x62, 0x22, /* mov.l @r2,r2 */
3392 0x40, 0x2b, /* jmp @r0 */
3393 0xe0, 0x00, /* mov #0,r0 */
3394 0x00, 0x09, /* nop */
3395 0x00, 0x09, /* nop */
3396 0x00, 0x09, /* nop */
3397 0x00, 0x09, /* nop */
3398 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3399 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3402 static const bfd_byte elf_sh_plt0_entry_le
[PLT_ENTRY_SIZE
] =
3404 0x04, 0xd0, /* mov.l 1f,r0 */
3405 0x05, 0xd2, /* mov.l 2f,r2 */
3406 0x02, 0x60, /* mov.l @r0,r0 */
3407 0x22, 0x62, /* mov.l @r2,r2 */
3408 0x2b, 0x40, /* jmp @r0 */
3409 0x00, 0xe0, /* mov #0,r0 */
3410 0x09, 0x00, /* nop */
3411 0x09, 0x00, /* nop */
3412 0x09, 0x00, /* nop */
3413 0x09, 0x00, /* nop */
3414 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */
3415 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */
3418 /* Sebsequent entries in an absolute procedure linkage table look like
3421 static const bfd_byte elf_sh_plt_entry_be
[PLT_ENTRY_SIZE
] =
3423 0xd0, 0x04, /* mov.l 1f,r0 */
3424 0x60, 0x02, /* mov.l @r0,r0 */
3425 0xd2, 0x02, /* mov.l 0f,r2 */
3426 0x40, 0x2b, /* jmp @r0 */
3427 0x60, 0x23, /* mov r2,r0 */
3428 0xd1, 0x03, /* mov.l 2f,r1 */
3429 0x40, 0x2b, /* jmp @r0 */
3430 0x00, 0x09, /* nop */
3431 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */
3432 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3433 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3436 static const bfd_byte elf_sh_plt_entry_le
[PLT_ENTRY_SIZE
] =
3438 0x04, 0xd0, /* mov.l 1f,r0 */
3439 0x02, 0x60, /* mov.l @r0,r0 */
3440 0x02, 0xd2, /* mov.l 0f,r2 */
3441 0x2b, 0x40, /* jmp @r0 */
3442 0x23, 0x60, /* mov r2,r0 */
3443 0x03, 0xd1, /* mov.l 2f,r1 */
3444 0x2b, 0x40, /* jmp @r0 */
3445 0x09, 0x00, /* nop */
3446 0, 0, 0, 0, /* 0: replaced with address of .PLT. */
3447 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3448 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */
3451 /* Entries in a PIC procedure linkage table look like this. */
3453 static const bfd_byte elf_sh_pic_plt_entry_be
[PLT_ENTRY_SIZE
] =
3455 0xd0, 0x04, /* mov.l 1f,r0 */
3456 0x00, 0xce, /* mov.l @(r0,r12),r0 */
3457 0x40, 0x2b, /* jmp @r0 */
3458 0x00, 0x09, /* nop */
3459 0x50, 0xc2, /* 0: mov.l @(8,r12),r0 */
3460 0x52, 0xc1, /* 1: mov.l @(4,r12),r2 */
3461 0xd1, 0x02, /* mov.l 2f,r1 */
3462 0x40, 0x2b, /* jmp @r0 */
3463 0xe0, 0x00, /* mov #0,r0 ! shows the type of PLT. */
3464 0x00, 0x09, /* nop */
3465 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3466 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3469 static const bfd_byte elf_sh_pic_plt_entry_le
[PLT_ENTRY_SIZE
] =
3471 0x04, 0xd0, /* mov.l 1f,r0 */
3472 0xce, 0x00, /* mov.l @(r0,r12),r0 */
3473 0x2b, 0x40, /* jmp @r0 */
3474 0x09, 0x00, /* nop */
3475 0xc2, 0x50, /* 0: mov.l @(8,r12),r0 */
3476 0xc1, 0x52, /* 1: mov.l @(4,r12),r2 */
3477 0x02, 0xd1, /* mov.l 2f,r1 */
3478 0x2b, 0x40, /* jmp @r0 */
3479 0x00, 0xe0, /* mov #0,r0 ! shows the type of PLT. */
3480 0x09, 0x00, /* nop */
3481 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */
3482 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */
3484 #endif /* old style PLT entries. */
3486 static const bfd_byte
*elf_sh_plt0_entry
;
3487 static const bfd_byte
*elf_sh_plt_entry
;
3488 static const bfd_byte
*elf_sh_pic_plt_entry
;
3490 /* Return size of a PLT entry. */
3491 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3493 /* Return offset of the PLT0 address in an absolute PLT entry. */
3494 #define elf_sh_plt_plt0_offset(info) 16
3496 /* Return offset of the linker in PLT0 entry. */
3497 #define elf_sh_plt0_linker_offset(info) 20
3499 /* Return offset of the GOT id in PLT0 entry. */
3500 #define elf_sh_plt0_gotid_offset(info) 24
3502 /* Return offset of the tempoline in PLT entry */
3503 #define elf_sh_plt_temp_offset(info) 8
3505 /* Return offset of the symbol in PLT entry. */
3506 #define elf_sh_plt_symbol_offset(info) 20
3508 /* Return offset of the relocation in PLT entry. */
3509 #define elf_sh_plt_reloc_offset(info) 24
3512 /* The sh linker needs to keep track of the number of relocs that it
3513 decides to copy as dynamic relocs in check_relocs for each symbol.
3514 This is so that it can later discard them if they are found to be
3515 unnecessary. We store the information in a field extending the
3516 regular ELF linker hash table. */
3518 struct elf_sh_dyn_relocs
3520 struct elf_sh_dyn_relocs
*next
;
3522 /* The input section of the reloc. */
3525 /* Total number of relocs copied for the input section. */
3526 bfd_size_type count
;
3528 /* Number of pc-relative relocs copied for the input section. */
3529 bfd_size_type pc_count
;
3532 /* sh ELF linker hash entry. */
3534 struct elf_sh_link_hash_entry
3536 struct elf_link_hash_entry root
;
3538 #ifdef INCLUDE_SHMEDIA
3541 bfd_signed_vma refcount
;
3546 /* Track dynamic relocs copied for this symbol. */
3547 struct elf_sh_dyn_relocs
*dyn_relocs
;
3549 bfd_signed_vma gotplt_refcount
;
3552 GOT_UNKNOWN
= 0, GOT_NORMAL
, GOT_TLS_GD
, GOT_TLS_IE
3556 #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
3558 struct sh_elf_obj_tdata
3560 struct elf_obj_tdata root
;
3562 /* tls_type for each local got entry. */
3563 char *local_got_tls_type
;
3566 #define sh_elf_tdata(abfd) \
3567 ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
3569 #define sh_elf_local_got_tls_type(abfd) \
3570 (sh_elf_tdata (abfd)->local_got_tls_type)
3572 /* Override the generic function because we need to store sh_elf_obj_tdata
3573 as the specific tdata. */
3576 sh_elf_mkobject (abfd
)
3579 bfd_size_type amt
= sizeof (struct sh_elf_obj_tdata
);
3580 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
3581 if (abfd
->tdata
.any
== NULL
)
3586 /* sh ELF linker hash table. */
3588 struct elf_sh_link_hash_table
3590 struct elf_link_hash_table root
;
3592 /* Short-cuts to get to dynamic linker sections. */
3601 /* Small local sym to section mapping cache. */
3602 struct sym_sec_cache sym_sec
;
3604 /* A counter or offset to track a TLS got entry. */
3607 bfd_signed_vma refcount
;
3612 /* Traverse an sh ELF linker hash table. */
3614 #define sh_elf_link_hash_traverse(table, func, info) \
3615 (elf_link_hash_traverse \
3617 (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
3620 /* Get the sh ELF linker hash table from a link_info structure. */
3622 #define sh_elf_hash_table(p) \
3623 ((struct elf_sh_link_hash_table *) ((p)->hash))
3625 /* Create an entry in an sh ELF linker hash table. */
3627 static struct bfd_hash_entry
*
3628 sh_elf_link_hash_newfunc (entry
, table
, string
)
3629 struct bfd_hash_entry
*entry
;
3630 struct bfd_hash_table
*table
;
3633 struct elf_sh_link_hash_entry
*ret
=
3634 (struct elf_sh_link_hash_entry
*) entry
;
3636 /* Allocate the structure if it has not already been allocated by a
3638 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3639 ret
= ((struct elf_sh_link_hash_entry
*)
3640 bfd_hash_allocate (table
,
3641 sizeof (struct elf_sh_link_hash_entry
)));
3642 if (ret
== (struct elf_sh_link_hash_entry
*) NULL
)
3643 return (struct bfd_hash_entry
*) ret
;
3645 /* Call the allocation method of the superclass. */
3646 ret
= ((struct elf_sh_link_hash_entry
*)
3647 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3649 if (ret
!= (struct elf_sh_link_hash_entry
*) NULL
)
3651 ret
->dyn_relocs
= NULL
;
3652 ret
->gotplt_refcount
= 0;
3653 #ifdef INCLUDE_SHMEDIA
3654 ret
->datalabel_got
.refcount
= ret
->root
.got
.refcount
;
3656 ret
->tls_type
= GOT_UNKNOWN
;
3659 return (struct bfd_hash_entry
*) ret
;
3662 /* Create an sh ELF linker hash table. */
3664 static struct bfd_link_hash_table
*
3665 sh_elf_link_hash_table_create (abfd
)
3668 struct elf_sh_link_hash_table
*ret
;
3669 bfd_size_type amt
= sizeof (struct elf_sh_link_hash_table
);
3671 ret
= (struct elf_sh_link_hash_table
*) bfd_malloc (amt
);
3672 if (ret
== (struct elf_sh_link_hash_table
*) NULL
)
3675 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
3676 sh_elf_link_hash_newfunc
))
3683 ret
->sgotplt
= NULL
;
3684 ret
->srelgot
= NULL
;
3686 ret
->srelplt
= NULL
;
3687 ret
->sdynbss
= NULL
;
3688 ret
->srelbss
= NULL
;
3689 ret
->sym_sec
.abfd
= NULL
;
3690 ret
->tls_ldm_got
.refcount
= 0;
3692 return &ret
->root
.root
;
3695 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3696 shortcuts to them in our hash table. */
3699 create_got_section (dynobj
, info
)
3701 struct bfd_link_info
*info
;
3703 struct elf_sh_link_hash_table
*htab
;
3705 if (! _bfd_elf_create_got_section (dynobj
, info
))
3708 htab
= sh_elf_hash_table (info
);
3709 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
3710 htab
->sgotplt
= bfd_get_section_by_name (dynobj
, ".got.plt");
3711 if (! htab
->sgot
|| ! htab
->sgotplt
)
3714 htab
->srelgot
= bfd_make_section (dynobj
, ".rela.got");
3715 if (htab
->srelgot
== NULL
3716 || ! bfd_set_section_flags (dynobj
, htab
->srelgot
,
3721 | SEC_LINKER_CREATED
3723 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
3728 /* Create dynamic sections when linking against a dynamic object. */
3731 sh_elf_create_dynamic_sections (abfd
, info
)
3733 struct bfd_link_info
*info
;
3735 struct elf_sh_link_hash_table
*htab
;
3736 flagword flags
, pltflags
;
3737 register asection
*s
;
3738 struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
3741 switch (bed
->s
->arch_size
)
3752 bfd_set_error (bfd_error_bad_value
);
3756 htab
= sh_elf_hash_table (info
);
3757 if (htab
->root
.dynamic_sections_created
)
3760 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3761 .rel[a].bss sections. */
3763 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3764 | SEC_LINKER_CREATED
);
3767 pltflags
|= SEC_CODE
;
3768 if (bed
->plt_not_loaded
)
3769 pltflags
&= ~ (SEC_LOAD
| SEC_HAS_CONTENTS
);
3770 if (bed
->plt_readonly
)
3771 pltflags
|= SEC_READONLY
;
3773 s
= bfd_make_section (abfd
, ".plt");
3776 || ! bfd_set_section_flags (abfd
, s
, pltflags
)
3777 || ! bfd_set_section_alignment (abfd
, s
, bed
->plt_alignment
))
3780 if (bed
->want_plt_sym
)
3782 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3784 struct elf_link_hash_entry
*h
;
3785 struct bfd_link_hash_entry
*bh
= NULL
;
3787 if (! (_bfd_generic_link_add_one_symbol
3788 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
3789 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
3790 get_elf_backend_data (abfd
)->collect
, &bh
)))
3793 h
= (struct elf_link_hash_entry
*) bh
;
3794 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
3795 h
->type
= STT_OBJECT
;
3798 && ! _bfd_elf_link_record_dynamic_symbol (info
, h
))
3802 s
= bfd_make_section (abfd
,
3803 bed
->default_use_rela_p
? ".rela.plt" : ".rel.plt");
3806 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3807 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3810 if (htab
->sgot
== NULL
3811 && !create_got_section (abfd
, info
))
3815 const char *secname
;
3820 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3822 secflags
= bfd_get_section_flags (abfd
, sec
);
3823 if ((secflags
& (SEC_DATA
| SEC_LINKER_CREATED
))
3824 || ((secflags
& SEC_HAS_CONTENTS
) != SEC_HAS_CONTENTS
))
3826 secname
= bfd_get_section_name (abfd
, sec
);
3827 relname
= (char *) bfd_malloc ((bfd_size_type
) strlen (secname
) + 6);
3828 strcpy (relname
, ".rela");
3829 strcat (relname
, secname
);
3830 if (bfd_get_section_by_name (abfd
, secname
))
3832 s
= bfd_make_section (abfd
, relname
);
3834 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3835 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3840 if (bed
->want_dynbss
)
3842 /* The .dynbss section is a place to put symbols which are defined
3843 by dynamic objects, are referenced by regular objects, and are
3844 not functions. We must allocate space for them in the process
3845 image and use a R_*_COPY reloc to tell the dynamic linker to
3846 initialize them at run time. The linker script puts the .dynbss
3847 section into the .bss section of the final image. */
3848 s
= bfd_make_section (abfd
, ".dynbss");
3851 || ! bfd_set_section_flags (abfd
, s
, SEC_ALLOC
))
3854 /* The .rel[a].bss section holds copy relocs. This section is not
3855 normally needed. We need to create it here, though, so that the
3856 linker will map it to an output section. We can't just create it
3857 only if we need it, because we will not know whether we need it
3858 until we have seen all the input files, and the first time the
3859 main linker code calls BFD after examining all the input files
3860 (size_dynamic_sections) the input sections have already been
3861 mapped to the output sections. If the section turns out not to
3862 be needed, we can discard it later. We will never need this
3863 section when generating a shared object, since they do not use
3867 s
= bfd_make_section (abfd
,
3868 (bed
->default_use_rela_p
3869 ? ".rela.bss" : ".rel.bss"));
3872 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
3873 || ! bfd_set_section_alignment (abfd
, s
, ptralign
))
3881 /* Adjust a symbol defined by a dynamic object and referenced by a
3882 regular object. The current definition is in some section of the
3883 dynamic object, but we're not including those sections. We have to
3884 change the definition to something the rest of the link can
3888 sh_elf_adjust_dynamic_symbol (info
, h
)
3889 struct bfd_link_info
*info
;
3890 struct elf_link_hash_entry
*h
;
3892 struct elf_sh_link_hash_table
*htab
;
3893 struct elf_sh_link_hash_entry
*eh
;
3894 struct elf_sh_dyn_relocs
*p
;
3896 unsigned int power_of_two
;
3898 htab
= sh_elf_hash_table (info
);
3900 /* Make sure we know what is going on here. */
3901 BFD_ASSERT (htab
->root
.dynobj
!= NULL
3902 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
3903 || h
->weakdef
!= NULL
3904 || ((h
->elf_link_hash_flags
3905 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
3906 && (h
->elf_link_hash_flags
3907 & ELF_LINK_HASH_REF_REGULAR
) != 0
3908 && (h
->elf_link_hash_flags
3909 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
3911 /* If this is a function, put it in the procedure linkage table. We
3912 will fill in the contents of the procedure linkage table later,
3913 when we know the address of the .got section. */
3914 if (h
->type
== STT_FUNC
3915 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
3917 if (h
->plt
.refcount
<= 0
3919 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) == 0
3920 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) == 0
3921 && h
->root
.type
!= bfd_link_hash_undefweak
3922 && h
->root
.type
!= bfd_link_hash_undefined
))
3924 /* This case can occur if we saw a PLT reloc in an input
3925 file, but the symbol was never referred to by a dynamic
3926 object. In such a case, we don't actually need to build
3927 a procedure linkage table, and we can just do a REL32
3929 h
->plt
.offset
= (bfd_vma
) -1;
3930 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
3936 h
->plt
.offset
= (bfd_vma
) -1;
3938 /* If this is a weak symbol, and there is a real definition, the
3939 processor independent code will have arranged for us to see the
3940 real definition first, and we can just use the same value. */
3941 if (h
->weakdef
!= NULL
)
3943 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
3944 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
3945 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
3946 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
3947 if (info
->nocopyreloc
)
3948 h
->elf_link_hash_flags
3949 = ((h
->elf_link_hash_flags
& ~ELF_LINK_NON_GOT_REF
)
3950 | (h
->weakdef
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
));
3954 /* This is a reference to a symbol defined by a dynamic object which
3955 is not a function. */
3957 /* If we are creating a shared library, we must presume that the
3958 only references to the symbol are via the global offset table.
3959 For such cases we need not do anything here; the relocations will
3960 be handled correctly by relocate_section. */
3964 /* If there are no references to this symbol that do not use the
3965 GOT, we don't need to generate a copy reloc. */
3966 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0)
3969 /* If -z nocopyreloc was given, we won't generate them either. */
3970 if (info
->nocopyreloc
)
3972 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
3976 eh
= (struct elf_sh_link_hash_entry
*) h
;
3977 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
3979 s
= p
->sec
->output_section
;
3980 if (s
!= NULL
&& (s
->flags
& (SEC_READONLY
| SEC_HAS_CONTENTS
)) != 0)
3984 /* If we didn't find any dynamic relocs in sections which needs the
3985 copy reloc, then we'll be keeping the dynamic relocs and avoiding
3989 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
3993 /* We must allocate the symbol in our .dynbss section, which will
3994 become part of the .bss section of the executable. There will be
3995 an entry for this symbol in the .dynsym section. The dynamic
3996 object will contain position independent code, so all references
3997 from the dynamic object to this symbol will go through the global
3998 offset table. The dynamic linker will use the .dynsym entry to
3999 determine the address it must put in the global offset table, so
4000 both the dynamic object and the regular object will refer to the
4001 same memory location for the variable. */
4004 BFD_ASSERT (s
!= NULL
);
4006 /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
4007 copy the initial value out of the dynamic object and into the
4008 runtime process image. We need to remember the offset into the
4009 .rela.bss section we are going to use. */
4010 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
4014 srel
= htab
->srelbss
;
4015 BFD_ASSERT (srel
!= NULL
);
4016 srel
->_raw_size
+= sizeof (Elf32_External_Rela
);
4017 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
4020 /* We need to figure out the alignment required for this symbol. I
4021 have no idea how ELF linkers handle this. */
4022 power_of_two
= bfd_log2 (h
->size
);
4023 if (power_of_two
> 3)
4026 /* Apply the required alignment. */
4027 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
, (bfd_size_type
) (1 << power_of_two
));
4028 if (power_of_two
> bfd_get_section_alignment (htab
->root
.dynobj
, s
))
4030 if (! bfd_set_section_alignment (htab
->root
.dynobj
, s
, power_of_two
))
4034 /* Define the symbol as being at this point in the section. */
4035 h
->root
.u
.def
.section
= s
;
4036 h
->root
.u
.def
.value
= s
->_raw_size
;
4038 /* Increment the section size to make room for the symbol. */
4039 s
->_raw_size
+= h
->size
;
4044 /* This is the condition under which sh_elf_finish_dynamic_symbol
4045 will be called from elflink.h. If elflink.h doesn't call our
4046 finish_dynamic_symbol routine, we'll need to do something about
4047 initializing any .plt and .got entries in sh_elf_relocate_section. */
4048 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
4051 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
4052 && ((H)->dynindx != -1 \
4053 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
4055 /* Allocate space in .plt, .got and associated reloc sections for
4059 allocate_dynrelocs (h
, inf
)
4060 struct elf_link_hash_entry
*h
;
4063 struct bfd_link_info
*info
;
4064 struct elf_sh_link_hash_table
*htab
;
4065 struct elf_sh_link_hash_entry
*eh
;
4066 struct elf_sh_dyn_relocs
*p
;
4068 if (h
->root
.type
== bfd_link_hash_indirect
)
4071 if (h
->root
.type
== bfd_link_hash_warning
)
4072 /* When warning symbols are created, they **replace** the "real"
4073 entry in the hash table, thus we never get to see the real
4074 symbol in a hash traversal. So look at it now. */
4075 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4077 info
= (struct bfd_link_info
*) inf
;
4078 htab
= sh_elf_hash_table (info
);
4080 eh
= (struct elf_sh_link_hash_entry
*) h
;
4081 if ((h
->got
.refcount
> 0
4082 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
4083 && eh
->gotplt_refcount
> 0)
4085 /* The symbol has been forced local, or we have some direct got refs,
4086 so treat all the gotplt refs as got refs. */
4087 h
->got
.refcount
+= eh
->gotplt_refcount
;
4088 if (h
->plt
.refcount
>= eh
->gotplt_refcount
)
4089 h
->plt
.refcount
-= eh
->gotplt_refcount
;
4092 if (htab
->root
.dynamic_sections_created
4093 && h
->plt
.refcount
> 0
4094 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4095 || h
->root
.type
!= bfd_link_hash_undefweak
))
4097 /* Make sure this symbol is output as a dynamic symbol.
4098 Undefined weak syms won't yet be marked as dynamic. */
4099 if (h
->dynindx
== -1
4100 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4102 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
4107 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
4109 asection
*s
= htab
->splt
;
4111 /* If this is the first .plt entry, make room for the special
4113 if (s
->_raw_size
== 0)
4114 s
->_raw_size
+= PLT_ENTRY_SIZE
;
4116 h
->plt
.offset
= s
->_raw_size
;
4118 /* If this symbol is not defined in a regular file, and we are
4119 not generating a shared library, then set the symbol to this
4120 location in the .plt. This is required to make function
4121 pointers compare as equal between the normal executable and
4122 the shared library. */
4124 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4126 h
->root
.u
.def
.section
= s
;
4127 h
->root
.u
.def
.value
= h
->plt
.offset
;
4130 /* Make room for this entry. */
4131 s
->_raw_size
+= PLT_ENTRY_SIZE
;
4133 /* We also need to make an entry in the .got.plt section, which
4134 will be placed in the .got section by the linker script. */
4135 htab
->sgotplt
->_raw_size
+= 4;
4137 /* We also need to make an entry in the .rel.plt section. */
4138 htab
->srelplt
->_raw_size
+= sizeof (Elf32_External_Rela
);
4142 h
->plt
.offset
= (bfd_vma
) -1;
4143 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4148 h
->plt
.offset
= (bfd_vma
) -1;
4149 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4152 if (h
->got
.refcount
> 0)
4156 int tls_type
= sh_elf_hash_entry (h
)->tls_type
;
4158 /* Make sure this symbol is output as a dynamic symbol.
4159 Undefined weak syms won't yet be marked as dynamic. */
4160 if (h
->dynindx
== -1
4161 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4163 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
4168 h
->got
.offset
= s
->_raw_size
;
4170 /* R_SH_TLS_GD needs 2 consecutive GOT slots. */
4171 if (tls_type
== GOT_TLS_GD
)
4173 dyn
= htab
->root
.dynamic_sections_created
;
4174 /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
4175 R_SH_TLS_GD needs one if local symbol and two if global. */
4176 if ((tls_type
== GOT_TLS_GD
&& h
->dynindx
== -1)
4177 || (tls_type
== GOT_TLS_IE
&& dyn
))
4178 htab
->srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
4179 else if (tls_type
== GOT_TLS_GD
)
4180 htab
->srelgot
->_raw_size
+= 2 * sizeof (Elf32_External_Rela
);
4181 else if ((ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4182 || h
->root
.type
!= bfd_link_hash_undefweak
)
4184 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
)))
4185 htab
->srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
4188 h
->got
.offset
= (bfd_vma
) -1;
4190 #ifdef INCLUDE_SHMEDIA
4191 if (eh
->datalabel_got
.refcount
> 0)
4196 /* Make sure this symbol is output as a dynamic symbol.
4197 Undefined weak syms won't yet be marked as dynamic. */
4198 if (h
->dynindx
== -1
4199 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4201 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
4206 eh
->datalabel_got
.offset
= s
->_raw_size
;
4208 dyn
= htab
->root
.dynamic_sections_created
;
4209 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
))
4210 htab
->srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
4213 eh
->datalabel_got
.offset
= (bfd_vma
) -1;
4216 if (eh
->dyn_relocs
== NULL
)
4219 /* In the shared -Bsymbolic case, discard space allocated for
4220 dynamic pc-relative relocs against symbols which turn out to be
4221 defined in regular objects. For the normal shared case, discard
4222 space for pc-relative relocs that have become local due to symbol
4223 visibility changes. */
4227 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) != 0
4228 && ((h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) != 0
4231 struct elf_sh_dyn_relocs
**pp
;
4233 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
4235 p
->count
-= p
->pc_count
;
4244 /* Also discard relocs on undefined weak syms with non-default
4246 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
4247 && h
->root
.type
== bfd_link_hash_undefweak
)
4248 eh
->dyn_relocs
= NULL
;
4252 /* For the non-shared case, discard space for relocs against
4253 symbols which turn out to need copy relocs or are not
4256 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
4257 && (((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
4258 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4259 || (htab
->root
.dynamic_sections_created
4260 && (h
->root
.type
== bfd_link_hash_undefweak
4261 || h
->root
.type
== bfd_link_hash_undefined
))))
4263 /* Make sure this symbol is output as a dynamic symbol.
4264 Undefined weak syms won't yet be marked as dynamic. */
4265 if (h
->dynindx
== -1
4266 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
4268 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
4272 /* If that succeeded, we know we'll be keeping all the
4274 if (h
->dynindx
!= -1)
4278 eh
->dyn_relocs
= NULL
;
4283 /* Finally, allocate space. */
4284 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4286 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
4287 sreloc
->_raw_size
+= p
->count
* sizeof (Elf32_External_Rela
);
4293 /* Find any dynamic relocs that apply to read-only sections. */
4296 readonly_dynrelocs (h
, inf
)
4297 struct elf_link_hash_entry
*h
;
4300 struct elf_sh_link_hash_entry
*eh
;
4301 struct elf_sh_dyn_relocs
*p
;
4303 if (h
->root
.type
== bfd_link_hash_warning
)
4304 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4306 eh
= (struct elf_sh_link_hash_entry
*) h
;
4307 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4309 asection
*s
= p
->sec
->output_section
;
4311 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
4313 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
4315 info
->flags
|= DF_TEXTREL
;
4317 /* Not an error, just cut short the traversal. */
4324 /* Set the sizes of the dynamic sections. */
4327 sh_elf_size_dynamic_sections (output_bfd
, info
)
4328 bfd
*output_bfd ATTRIBUTE_UNUSED
;
4329 struct bfd_link_info
*info
;
4331 struct elf_sh_link_hash_table
*htab
;
4337 htab
= sh_elf_hash_table (info
);
4338 dynobj
= htab
->root
.dynobj
;
4339 BFD_ASSERT (dynobj
!= NULL
);
4341 if (htab
->root
.dynamic_sections_created
)
4343 /* Set the contents of the .interp section to the interpreter. */
4344 if (info
->executable
)
4346 s
= bfd_get_section_by_name (dynobj
, ".interp");
4347 BFD_ASSERT (s
!= NULL
);
4348 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
4349 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
4353 /* Set up .got offsets for local syms, and space for local dynamic
4355 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4357 bfd_signed_vma
*local_got
;
4358 bfd_signed_vma
*end_local_got
;
4359 char *local_tls_type
;
4360 bfd_size_type locsymcount
;
4361 Elf_Internal_Shdr
*symtab_hdr
;
4364 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
4367 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
4369 struct elf_sh_dyn_relocs
*p
;
4371 for (p
= ((struct elf_sh_dyn_relocs
*)
4372 elf_section_data (s
)->local_dynrel
);
4376 if (! bfd_is_abs_section (p
->sec
)
4377 && bfd_is_abs_section (p
->sec
->output_section
))
4379 /* Input section has been discarded, either because
4380 it is a copy of a linkonce section or due to
4381 linker script /DISCARD/, so we'll be discarding
4384 else if (p
->count
!= 0)
4386 srel
= elf_section_data (p
->sec
)->sreloc
;
4387 srel
->_raw_size
+= p
->count
* sizeof (Elf32_External_Rela
);
4388 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
4389 info
->flags
|= DF_TEXTREL
;
4394 local_got
= elf_local_got_refcounts (ibfd
);
4398 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4399 locsymcount
= symtab_hdr
->sh_info
;
4400 #ifdef INCLUDE_SHMEDIA
4401 /* Count datalabel local GOT. */
4404 end_local_got
= local_got
+ locsymcount
;
4405 local_tls_type
= sh_elf_local_got_tls_type (ibfd
);
4407 srel
= htab
->srelgot
;
4408 for (; local_got
< end_local_got
; ++local_got
)
4412 *local_got
= s
->_raw_size
;
4414 if (*local_tls_type
== GOT_TLS_GD
)
4417 srel
->_raw_size
+= sizeof (Elf32_External_Rela
);
4420 *local_got
= (bfd_vma
) -1;
4425 if (htab
->tls_ldm_got
.refcount
> 0)
4427 /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
4429 htab
->tls_ldm_got
.offset
= htab
->sgot
->_raw_size
;
4430 htab
->sgot
->_raw_size
+= 8;
4431 htab
->srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
4434 htab
->tls_ldm_got
.offset
= -1;
4436 /* Allocate global sym .plt and .got entries, and space for global
4437 sym dynamic relocs. */
4438 elf_link_hash_traverse (&htab
->root
, allocate_dynrelocs
, (PTR
) info
);
4440 /* We now have determined the sizes of the various dynamic sections.
4441 Allocate memory for them. */
4443 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4445 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
4450 || s
== htab
->sgotplt
)
4452 /* Strip this section if we don't need it; see the
4455 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
4457 if (s
->_raw_size
!= 0 && s
!= htab
->srelplt
)
4460 /* We use the reloc_count field as a counter if we need
4461 to copy relocs into the output file. */
4466 /* It's not one of our sections, so don't allocate space. */
4470 if (s
->_raw_size
== 0)
4472 /* If we don't need this section, strip it from the
4473 output file. This is mostly to handle .rela.bss and
4474 .rela.plt. We must create both sections in
4475 create_dynamic_sections, because they must be created
4476 before the linker maps input sections to output
4477 sections. The linker does that before
4478 adjust_dynamic_symbol is called, and it is that
4479 function which decides whether anything needs to go
4480 into these sections. */
4482 _bfd_strip_section_from_output (info
, s
);
4486 /* Allocate memory for the section contents. We use bfd_zalloc
4487 here in case unused entries are not reclaimed before the
4488 section's contents are written out. This should not happen,
4489 but this way if it does, we get a R_SH_NONE reloc instead
4491 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->_raw_size
);
4492 if (s
->contents
== NULL
)
4496 if (htab
->root
.dynamic_sections_created
)
4498 /* Add some entries to the .dynamic section. We fill in the
4499 values later, in sh_elf_finish_dynamic_sections, but we
4500 must add the entries now so that we get the correct size for
4501 the .dynamic section. The DT_DEBUG entry is filled in by the
4502 dynamic linker and used by the debugger. */
4503 #define add_dynamic_entry(TAG, VAL) \
4504 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
4506 if (info
->executable
)
4508 if (! add_dynamic_entry (DT_DEBUG
, 0))
4512 if (htab
->splt
->_raw_size
!= 0)
4514 if (! add_dynamic_entry (DT_PLTGOT
, 0)
4515 || ! add_dynamic_entry (DT_PLTRELSZ
, 0)
4516 || ! add_dynamic_entry (DT_PLTREL
, DT_RELA
)
4517 || ! add_dynamic_entry (DT_JMPREL
, 0))
4523 if (! add_dynamic_entry (DT_RELA
, 0)
4524 || ! add_dynamic_entry (DT_RELASZ
, 0)
4525 || ! add_dynamic_entry (DT_RELAENT
,
4526 sizeof (Elf32_External_Rela
)))
4529 /* If any dynamic relocs apply to a read-only section,
4530 then we need a DT_TEXTREL entry. */
4531 if ((info
->flags
& DF_TEXTREL
) == 0)
4532 elf_link_hash_traverse (&htab
->root
, readonly_dynrelocs
,
4535 if ((info
->flags
& DF_TEXTREL
) != 0)
4537 if (! add_dynamic_entry (DT_TEXTREL
, 0))
4542 #undef add_dynamic_entry
4547 /* Relocate an SH ELF section. */
4550 sh_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
4551 contents
, relocs
, local_syms
, local_sections
)
4553 struct bfd_link_info
*info
;
4555 asection
*input_section
;
4557 Elf_Internal_Rela
*relocs
;
4558 Elf_Internal_Sym
*local_syms
;
4559 asection
**local_sections
;
4561 struct elf_sh_link_hash_table
*htab
;
4562 Elf_Internal_Shdr
*symtab_hdr
;
4563 struct elf_link_hash_entry
**sym_hashes
;
4564 Elf_Internal_Rela
*rel
, *relend
;
4566 bfd_vma
*local_got_offsets
;
4573 htab
= sh_elf_hash_table (info
);
4574 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4575 sym_hashes
= elf_sym_hashes (input_bfd
);
4576 dynobj
= htab
->root
.dynobj
;
4577 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4580 sgotplt
= htab
->sgotplt
;
4586 relend
= relocs
+ input_section
->reloc_count
;
4587 for (; rel
< relend
; rel
++)
4590 reloc_howto_type
*howto
;
4591 unsigned long r_symndx
;
4592 Elf_Internal_Sym
*sym
;
4594 struct elf_link_hash_entry
*h
;
4596 bfd_vma addend
= (bfd_vma
) 0;
4597 bfd_reloc_status_type r
;
4598 int seen_stt_datalabel
= 0;
4602 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4604 r_type
= ELF32_R_TYPE (rel
->r_info
);
4606 /* Many of the relocs are only used for relaxing, and are
4607 handled entirely by the relaxation code. */
4608 if (r_type
> (int) R_SH_LAST_INVALID_RELOC
4609 && r_type
< (int) R_SH_LOOP_START
)
4611 if (r_type
== (int) R_SH_NONE
)
4615 || r_type
>= R_SH_max
4616 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC
4617 && r_type
<= (int) R_SH_LAST_INVALID_RELOC
)
4618 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_3
4619 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_3
)
4620 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_4
4621 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_4
)
4622 || ( r_type
>= (int) R_SH_FIRST_INVALID_RELOC_5
4623 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_5
)
4624 || (r_type
>= (int) R_SH_FIRST_INVALID_RELOC_2
4625 && r_type
<= (int) R_SH_LAST_INVALID_RELOC_2
))
4627 bfd_set_error (bfd_error_bad_value
);
4631 howto
= sh_elf_howto_table
+ r_type
;
4633 /* For relocs that aren't partial_inplace, we get the addend from
4635 if (! howto
->partial_inplace
)
4636 addend
= rel
->r_addend
;
4641 if (r_symndx
< symtab_hdr
->sh_info
)
4643 sym
= local_syms
+ r_symndx
;
4644 sec
= local_sections
[r_symndx
];
4645 relocation
= (sec
->output_section
->vma
4646 + sec
->output_offset
4648 /* A local symbol never has STO_SH5_ISA32, so we don't need
4649 datalabel processing here. Make sure this does not change
4651 if ((sym
->st_other
& STO_SH5_ISA32
) != 0)
4652 ((*info
->callbacks
->reloc_dangerous
)
4654 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
4655 input_bfd
, input_section
, rel
->r_offset
));
4656 if (info
->relocatable
)
4658 /* This is a relocatable link. We don't have to change
4659 anything, unless the reloc is against a section symbol,
4660 in which case we have to adjust according to where the
4661 section symbol winds up in the output section. */
4662 sym
= local_syms
+ r_symndx
;
4663 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4665 if (! howto
->partial_inplace
)
4667 /* For relocations with the addend in the
4668 relocation, we need just to update the addend.
4669 All real relocs are of type partial_inplace; this
4670 code is mostly for completeness. */
4671 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
4676 /* Relocs of type partial_inplace need to pick up the
4677 contents in the contents and add the offset resulting
4678 from the changed location of the section symbol.
4679 Using _bfd_final_link_relocate (e.g. goto
4680 final_link_relocate) here would be wrong, because
4681 relocations marked pc_relative would get the current
4682 location subtracted, and we must only do that at the
4684 r
= _bfd_relocate_contents (howto
, input_bfd
,
4687 contents
+ rel
->r_offset
);
4688 goto relocation_done
;
4693 else if (! howto
->partial_inplace
)
4695 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, sec
, rel
);
4696 addend
= rel
->r_addend
;
4698 else if ((sec
->flags
& SEC_MERGE
)
4699 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4703 if (howto
->rightshift
|| howto
->src_mask
!= 0xffffffff)
4705 (*_bfd_error_handler
)
4706 (_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
4707 bfd_archive_filename (input_bfd
),
4708 bfd_get_section_name (input_bfd
, input_section
),
4709 (long) rel
->r_offset
, howto
->name
);
4713 addend
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
4716 _bfd_elf_rel_local_sym (output_bfd
, sym
, &msec
, addend
)
4718 addend
+= msec
->output_section
->vma
+ msec
->output_offset
;
4719 bfd_put_32 (input_bfd
, addend
, contents
+ rel
->r_offset
);
4725 /* Section symbol are never (?) placed in the hash table, so
4726 we can just ignore hash relocations when creating a
4727 relocatable object file. */
4728 if (info
->relocatable
)
4731 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4732 while (h
->root
.type
== bfd_link_hash_indirect
4733 || h
->root
.type
== bfd_link_hash_warning
)
4735 #ifdef INCLUDE_SHMEDIA
4736 /* If the reference passes a symbol marked with
4737 STT_DATALABEL, then any STO_SH5_ISA32 on the final value
4739 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
4741 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4743 if (h
->root
.type
== bfd_link_hash_defined
4744 || h
->root
.type
== bfd_link_hash_defweak
)
4748 dyn
= htab
->root
.dynamic_sections_created
;
4749 sec
= h
->root
.u
.def
.section
;
4750 /* In these cases, we don't need the relocation value.
4751 We check specially because in some obscure cases
4752 sec->output_section will be NULL. */
4753 if (r_type
== R_SH_GOTPC
4754 || r_type
== R_SH_GOTPC_LOW16
4755 || r_type
== R_SH_GOTPC_MEDLOW16
4756 || r_type
== R_SH_GOTPC_MEDHI16
4757 || r_type
== R_SH_GOTPC_HI16
4758 || ((r_type
== R_SH_PLT32
4759 || r_type
== R_SH_PLT_LOW16
4760 || r_type
== R_SH_PLT_MEDLOW16
4761 || r_type
== R_SH_PLT_MEDHI16
4762 || r_type
== R_SH_PLT_HI16
)
4763 && h
->plt
.offset
!= (bfd_vma
) -1)
4764 || ((r_type
== R_SH_GOT32
4765 || r_type
== R_SH_GOT_LOW16
4766 || r_type
== R_SH_GOT_MEDLOW16
4767 || r_type
== R_SH_GOT_MEDHI16
4768 || r_type
== R_SH_GOT_HI16
)
4769 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4771 || (! info
->symbolic
&& h
->dynindx
!= -1)
4772 || (h
->elf_link_hash_flags
4773 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
4774 /* The cases above are those in which relocation is
4775 overwritten in the switch block below. The cases
4776 below are those in which we must defer relocation
4777 to run-time, because we can't resolve absolute
4778 addresses when creating a shared library. */
4780 && ((! info
->symbolic
&& h
->dynindx
!= -1)
4781 || (h
->elf_link_hash_flags
4782 & ELF_LINK_HASH_DEF_REGULAR
) == 0)
4783 && ((r_type
== R_SH_DIR32
4784 && (h
->elf_link_hash_flags
4785 & ELF_LINK_FORCED_LOCAL
) == 0)
4786 || r_type
== R_SH_REL32
)
4787 && ((input_section
->flags
& SEC_ALLOC
) != 0
4788 /* DWARF will emit R_SH_DIR32 relocations in its
4789 sections against symbols defined externally
4790 in shared libraries. We can't do anything
4792 || ((input_section
->flags
& SEC_DEBUGGING
) != 0
4793 && (h
->elf_link_hash_flags
4794 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0)))
4795 /* Dynamic relocs are not propagated for SEC_DEBUGGING
4796 sections because such sections are not SEC_ALLOC and
4797 thus ld.so will not process them. */
4798 || (sec
->output_section
== NULL
4799 && ((input_section
->flags
& SEC_DEBUGGING
) != 0
4800 && (h
->elf_link_hash_flags
4801 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0))
4802 || (sec
->output_section
== NULL
4803 && (sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_IE
4804 || sh_elf_hash_entry (h
)->tls_type
== GOT_TLS_GD
)))
4806 else if (sec
->output_section
== NULL
)
4808 (*_bfd_error_handler
)
4809 (_("%s: unresolvable relocation against symbol `%s' from %s section"),
4810 bfd_archive_filename (input_bfd
), h
->root
.root
.string
,
4811 bfd_get_section_name (input_bfd
, input_section
));
4815 relocation
= ((h
->root
.u
.def
.value
4816 + sec
->output_section
->vma
4817 + sec
->output_offset
)
4818 /* A STO_SH5_ISA32 causes a "bitor 1" to the
4819 symbol value, unless we've seen
4820 STT_DATALABEL on the way to it. */
4821 | ((h
->other
& STO_SH5_ISA32
) != 0
4822 && ! seen_stt_datalabel
));
4824 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4826 else if (info
->shared
4827 && ! info
->no_undefined
4828 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4832 if (! ((*info
->callbacks
->undefined_symbol
)
4833 (info
, h
->root
.root
.string
, input_bfd
,
4834 input_section
, rel
->r_offset
,
4835 (!info
->shared
|| info
->no_undefined
4836 || ELF_ST_VISIBILITY (h
->other
)))))
4842 switch ((int) r_type
)
4844 final_link_relocate
:
4845 /* COFF relocs don't use the addend. The addend is used for
4846 R_SH_DIR32 to be compatible with other compilers. */
4847 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4848 contents
, rel
->r_offset
,
4849 relocation
, addend
);
4853 goto final_link_relocate
;
4858 /* If the reloc is against the start of this section, then
4859 the assembler has already taken care of it and the reloc
4860 is here only to assist in relaxing. If the reloc is not
4861 against the start of this section, then it's against an
4862 external symbol and we must deal with it ourselves. */
4863 if (input_section
->output_section
->vma
+ input_section
->output_offset
4866 int disp
= (relocation
4867 - input_section
->output_section
->vma
4868 - input_section
->output_offset
4874 case R_SH_DIR8WPZ
: mask
= 1; break;
4875 case R_SH_DIR8WPL
: mask
= 3; break;
4876 default: mask
= 0; break;
4880 ((*_bfd_error_handler
)
4881 (_("%s: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
4882 bfd_archive_filename (input_section
->owner
),
4883 (unsigned long) rel
->r_offset
));
4884 bfd_set_error (bfd_error_bad_value
);
4888 goto final_link_relocate
;
4894 #ifdef INCLUDE_SHMEDIA
4895 if (shmedia_prepare_reloc (info
, input_bfd
, input_section
,
4896 contents
, rel
, &relocation
))
4897 goto final_link_relocate
;
4899 bfd_set_error (bfd_error_bad_value
);
4906 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
4907 || h
->root
.type
!= bfd_link_hash_undefweak
)
4909 && (input_section
->flags
& SEC_ALLOC
) != 0
4910 && (r_type
!= R_SH_REL32
4913 && (! info
->symbolic
4914 || (h
->elf_link_hash_flags
4915 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
4917 Elf_Internal_Rela outrel
;
4919 bfd_boolean skip
, relocate
;
4921 /* When generating a shared object, these relocations
4922 are copied into the output file to be resolved at run
4929 name
= (bfd_elf_string_from_elf_section
4931 elf_elfheader (input_bfd
)->e_shstrndx
,
4932 elf_section_data (input_section
)->rel_hdr
.sh_name
));
4936 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
4937 && strcmp (bfd_get_section_name (input_bfd
,
4941 sreloc
= bfd_get_section_by_name (dynobj
, name
);
4942 BFD_ASSERT (sreloc
!= NULL
);
4949 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
4951 if (outrel
.r_offset
== (bfd_vma
) -1)
4953 else if (outrel
.r_offset
== (bfd_vma
) -2)
4954 skip
= TRUE
, relocate
= TRUE
;
4955 outrel
.r_offset
+= (input_section
->output_section
->vma
4956 + input_section
->output_offset
);
4959 memset (&outrel
, 0, sizeof outrel
);
4960 else if (r_type
== R_SH_REL32
)
4962 BFD_ASSERT (h
!= NULL
&& h
->dynindx
!= -1);
4963 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_REL32
);
4965 = bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
4969 /* h->dynindx may be -1 if this symbol was marked to
4972 || ((info
->symbolic
|| h
->dynindx
== -1)
4973 && (h
->elf_link_hash_flags
4974 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
4977 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
4979 = relocation
+ bfd_get_32 (input_bfd
,
4980 contents
+ rel
->r_offset
);
4984 BFD_ASSERT (h
->dynindx
!= -1);
4985 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_DIR32
);
4987 = relocation
+ bfd_get_32 (input_bfd
,
4988 contents
+ rel
->r_offset
);
4992 loc
= sreloc
->contents
;
4993 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4994 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4996 /* If this reloc is against an external symbol, we do
4997 not want to fiddle with the addend. Otherwise, we
4998 need to include the symbol value so that it becomes
4999 an addend for the dynamic reloc. */
5003 goto final_link_relocate
;
5006 #ifdef INCLUDE_SHMEDIA
5007 case R_SH_GOTPLT_LOW16
:
5008 case R_SH_GOTPLT_MEDLOW16
:
5009 case R_SH_GOTPLT_MEDHI16
:
5010 case R_SH_GOTPLT_HI16
:
5011 case R_SH_GOTPLT10BY4
:
5012 case R_SH_GOTPLT10BY8
:
5014 /* Relocation is to the entry for this symbol in the
5015 procedure linkage table. */
5018 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
5022 || h
->plt
.offset
== (bfd_vma
) -1
5023 || h
->got
.offset
!= (bfd_vma
) -1)
5026 /* Relocation is to the entry for this symbol in the global
5027 offset table extension for the procedure linkage table. */
5029 BFD_ASSERT (sgotplt
!= NULL
);
5030 relocation
= (sgotplt
->output_offset
5031 + ((h
->plt
.offset
/ elf_sh_sizeof_plt (info
)
5035 relocation
-= GOT_BIAS
;
5038 goto final_link_relocate
;
5042 #ifdef INCLUDE_SHMEDIA
5043 case R_SH_GOT_LOW16
:
5044 case R_SH_GOT_MEDLOW16
:
5045 case R_SH_GOT_MEDHI16
:
5050 /* Relocation is to the entry for this symbol in the global
5053 BFD_ASSERT (sgot
!= NULL
);
5059 off
= h
->got
.offset
;
5060 #ifdef INCLUDE_SHMEDIA
5061 if (seen_stt_datalabel
)
5063 struct elf_sh_link_hash_entry
*hsh
;
5065 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5066 off
= hsh
->datalabel_got
.offset
;
5069 BFD_ASSERT (off
!= (bfd_vma
) -1);
5071 dyn
= htab
->root
.dynamic_sections_created
;
5072 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
5074 && (info
->symbolic
|| h
->dynindx
== -1
5075 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
5076 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
5077 || (ELF_ST_VISIBILITY (h
->other
)
5078 && h
->root
.type
== bfd_link_hash_undefweak
))
5080 /* This is actually a static link, or it is a
5081 -Bsymbolic link and the symbol is defined
5082 locally, or the symbol was forced to be local
5083 because of a version file. We must initialize
5084 this entry in the global offset table. Since the
5085 offset must always be a multiple of 4, we use the
5086 least significant bit to record whether we have
5087 initialized it already.
5089 When doing a dynamic link, we create a .rela.got
5090 relocation entry to initialize the value. This
5091 is done in the finish_dynamic_symbol routine. */
5096 bfd_put_32 (output_bfd
, relocation
,
5097 sgot
->contents
+ off
);
5098 #ifdef INCLUDE_SHMEDIA
5099 if (seen_stt_datalabel
)
5101 struct elf_sh_link_hash_entry
*hsh
;
5103 hsh
= (struct elf_sh_link_hash_entry
*)h
;
5104 hsh
->datalabel_got
.offset
|= 1;
5112 relocation
= sgot
->output_offset
+ off
;
5116 #ifdef INCLUDE_SHMEDIA
5119 BFD_ASSERT (local_got_offsets
!= NULL
5120 && (local_got_offsets
[symtab_hdr
->sh_info
5124 off
= local_got_offsets
[symtab_hdr
->sh_info
5130 BFD_ASSERT (local_got_offsets
!= NULL
5131 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
5133 off
= local_got_offsets
[r_symndx
];
5134 #ifdef INCLUDE_SHMEDIA
5138 /* The offset must always be a multiple of 4. We use
5139 the least significant bit to record whether we have
5140 already generated the necessary reloc. */
5145 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
5149 Elf_Internal_Rela outrel
;
5152 if (srelgot
== NULL
)
5154 srelgot
= bfd_get_section_by_name (dynobj
,
5156 BFD_ASSERT (srelgot
!= NULL
);
5159 outrel
.r_offset
= (sgot
->output_section
->vma
5160 + sgot
->output_offset
5162 outrel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
5163 outrel
.r_addend
= relocation
;
5164 loc
= srelgot
->contents
;
5165 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5166 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5169 #ifdef INCLUDE_SHMEDIA
5171 local_got_offsets
[symtab_hdr
->sh_info
+ r_symndx
] |= 1;
5174 local_got_offsets
[r_symndx
] |= 1;
5177 relocation
= sgot
->output_offset
+ off
;
5181 relocation
-= GOT_BIAS
;
5184 goto final_link_relocate
;
5187 #ifdef INCLUDE_SHMEDIA
5188 case R_SH_GOTOFF_LOW16
:
5189 case R_SH_GOTOFF_MEDLOW16
:
5190 case R_SH_GOTOFF_MEDHI16
:
5191 case R_SH_GOTOFF_HI16
:
5193 /* Relocation is relative to the start of the global offset
5196 BFD_ASSERT (sgot
!= NULL
);
5198 /* Note that sgot->output_offset is not involved in this
5199 calculation. We always want the start of .got. If we
5200 defined _GLOBAL_OFFSET_TABLE in a different way, as is
5201 permitted by the ABI, we might have to change this
5203 relocation
-= sgot
->output_section
->vma
;
5206 relocation
-= GOT_BIAS
;
5209 addend
= rel
->r_addend
;
5211 goto final_link_relocate
;
5214 #ifdef INCLUDE_SHMEDIA
5215 case R_SH_GOTPC_LOW16
:
5216 case R_SH_GOTPC_MEDLOW16
:
5217 case R_SH_GOTPC_MEDHI16
:
5218 case R_SH_GOTPC_HI16
:
5220 /* Use global offset table as symbol value. */
5222 BFD_ASSERT (sgot
!= NULL
);
5223 relocation
= sgot
->output_section
->vma
;
5226 relocation
+= GOT_BIAS
;
5229 addend
= rel
->r_addend
;
5231 goto final_link_relocate
;
5234 #ifdef INCLUDE_SHMEDIA
5235 case R_SH_PLT_LOW16
:
5236 case R_SH_PLT_MEDLOW16
:
5237 case R_SH_PLT_MEDHI16
:
5240 /* Relocation is to the entry for this symbol in the
5241 procedure linkage table. */
5243 /* Resolve a PLT reloc against a local symbol directly,
5244 without using the procedure linkage table. */
5246 goto final_link_relocate
;
5248 if (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
5249 goto final_link_relocate
;
5251 if (h
->plt
.offset
== (bfd_vma
) -1)
5253 /* We didn't make a PLT entry for this symbol. This
5254 happens when statically linking PIC code, or when
5255 using -Bsymbolic. */
5256 goto final_link_relocate
;
5259 BFD_ASSERT (splt
!= NULL
);
5260 relocation
= (splt
->output_section
->vma
5261 + splt
->output_offset
5264 #ifdef INCLUDE_SHMEDIA
5268 addend
= rel
->r_addend
;
5270 goto final_link_relocate
;
5272 case R_SH_LOOP_START
:
5274 static bfd_vma start
, end
;
5276 start
= (relocation
+ rel
->r_addend
5277 - (sec
->output_section
->vma
+ sec
->output_offset
));
5278 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5279 rel
->r_offset
, sec
, start
, end
);
5283 end
= (relocation
+ rel
->r_addend
5284 - (sec
->output_section
->vma
+ sec
->output_offset
));
5285 r
= sh_elf_reloc_loop (r_type
, input_bfd
, input_section
, contents
,
5286 rel
->r_offset
, sec
, start
, end
);
5290 case R_SH_TLS_GD_32
:
5291 case R_SH_TLS_IE_32
:
5292 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
5293 tls_type
= GOT_UNKNOWN
;
5294 if (h
== NULL
&& local_got_offsets
)
5295 tls_type
= sh_elf_local_got_tls_type (input_bfd
) [r_symndx
];
5298 tls_type
= sh_elf_hash_entry (h
)->tls_type
;
5300 && (h
->dynindx
== -1
5301 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
5302 r_type
= R_SH_TLS_LE_32
;
5305 if (r_type
== R_SH_TLS_GD_32
&& tls_type
== GOT_TLS_IE
)
5306 r_type
= R_SH_TLS_IE_32
;
5308 if (r_type
== R_SH_TLS_LE_32
)
5311 unsigned short insn
;
5313 if (ELF32_R_TYPE (rel
->r_info
) == R_SH_TLS_GD_32
)
5315 /* GD->LE transition:
5316 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5317 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5318 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5320 mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
5322 1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:. */
5324 offset
= rel
->r_offset
;
5325 BFD_ASSERT (offset
>= 16);
5326 /* Size of GD instructions is 16 or 18. */
5328 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5329 if ((insn
& 0xff00) == 0xc700)
5331 BFD_ASSERT (offset
>= 2);
5333 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5336 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5337 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5338 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5339 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5340 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5341 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5342 BFD_ASSERT (insn
== 0x310c);
5343 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5344 BFD_ASSERT (insn
== 0x410b);
5345 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5346 BFD_ASSERT (insn
== 0x34cc);
5348 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 2);
5349 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 4);
5350 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5351 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5352 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5358 /* IE->LE transition:
5359 mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
5360 bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
5362 mov.l .Ln,rM; stc gbr,rN; nop; ...;
5365 offset
= rel
->r_offset
;
5366 BFD_ASSERT (offset
>= 16);
5367 /* Size of IE instructions is 10 or 12. */
5369 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5370 if ((insn
& 0xf0ff) == 0x0012)
5372 BFD_ASSERT (offset
>= 2);
5374 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5377 BFD_ASSERT ((insn
& 0xff00) == 0xd000);
5378 index
= insn
& 0x00ff;
5379 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5380 BFD_ASSERT ((insn
& 0xf0ff) == 0x0012);
5381 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5382 BFD_ASSERT ((insn
& 0xf0ff) == 0x00ce);
5383 insn
= 0xd000 | (insn
& 0x0f00) | index
;
5384 bfd_put_16 (output_bfd
, insn
, contents
+ offset
+ 0);
5385 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5388 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5389 contents
+ rel
->r_offset
);
5398 off
= h
->got
.offset
;
5401 if (local_got_offsets
== NULL
)
5404 off
= local_got_offsets
[r_symndx
];
5407 /* Relocate R_SH_TLS_IE_32 directly when statically linking. */
5408 if (r_type
== R_SH_TLS_IE_32
5409 && ! htab
->root
.dynamic_sections_created
)
5412 bfd_put_32 (output_bfd
, tpoff (info
, relocation
),
5413 sgot
->contents
+ off
);
5414 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5415 contents
+ rel
->r_offset
);
5423 Elf_Internal_Rela outrel
;
5427 if (srelgot
== NULL
)
5429 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
5430 BFD_ASSERT (srelgot
!= NULL
);
5433 outrel
.r_offset
= (sgot
->output_section
->vma
5434 + sgot
->output_offset
+ off
);
5436 if (h
== NULL
|| h
->dynindx
== -1)
5441 dr_type
= (r_type
== R_SH_TLS_GD_32
? R_SH_TLS_DTPMOD32
:
5443 if (dr_type
== R_SH_TLS_TPOFF32
&& indx
== 0)
5444 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5446 outrel
.r_addend
= 0;
5447 outrel
.r_info
= ELF32_R_INFO (indx
, dr_type
);
5448 loc
= srelgot
->contents
;
5449 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5450 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5452 if (r_type
== R_SH_TLS_GD_32
)
5456 bfd_put_32 (output_bfd
,
5457 relocation
- dtpoff_base (info
),
5458 sgot
->contents
+ off
+ 4);
5462 outrel
.r_info
= ELF32_R_INFO (indx
,
5464 outrel
.r_offset
+= 4;
5465 outrel
.r_addend
= 0;
5466 srelgot
->reloc_count
++;
5467 loc
+= sizeof (Elf32_External_Rela
);
5468 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5475 local_got_offsets
[r_symndx
] |= 1;
5478 if (off
>= (bfd_vma
) -2)
5481 if (r_type
== (int) ELF32_R_TYPE (rel
->r_info
))
5482 relocation
= sgot
->output_offset
+ off
;
5486 unsigned short insn
;
5488 /* GD->IE transition:
5489 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5490 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5491 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5493 mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
5494 nop; nop; bra 3f; nop; .align 2;
5495 1: .long x@TPOFF; 2:...; 3:. */
5497 offset
= rel
->r_offset
;
5498 BFD_ASSERT (offset
>= 16);
5499 /* Size of GD instructions is 16 or 18. */
5501 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5502 if ((insn
& 0xff00) == 0xc700)
5504 BFD_ASSERT (offset
>= 2);
5506 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5509 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5511 /* Replace mov.l 1f,R4 with mov.l 1f,r0. */
5512 bfd_put_16 (output_bfd
, insn
& 0xf0ff, contents
+ offset
);
5514 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5515 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5516 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5517 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5518 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5519 BFD_ASSERT (insn
== 0x310c);
5520 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5521 BFD_ASSERT (insn
== 0x410b);
5522 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5523 BFD_ASSERT (insn
== 0x34cc);
5525 bfd_put_16 (output_bfd
, 0x0412, contents
+ offset
+ 2);
5526 bfd_put_16 (output_bfd
, 0x00ce, contents
+ offset
+ 4);
5527 bfd_put_16 (output_bfd
, 0x304c, contents
+ offset
+ 6);
5528 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5529 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5531 bfd_put_32 (output_bfd
, sgot
->output_offset
+ off
,
5532 contents
+ rel
->r_offset
);
5537 addend
= rel
->r_addend
;
5539 goto final_link_relocate
;
5541 case R_SH_TLS_LD_32
:
5545 unsigned short insn
;
5547 /* LD->LE transition:
5548 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5549 jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5550 1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
5552 stc gbr,r0; nop; nop; nop;
5553 nop; nop; bra 3f; ...; 3:. */
5555 offset
= rel
->r_offset
;
5556 BFD_ASSERT (offset
>= 16);
5557 /* Size of LD instructions is 16 or 18. */
5559 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5560 if ((insn
& 0xff00) == 0xc700)
5562 BFD_ASSERT (offset
>= 2);
5564 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 0);
5567 BFD_ASSERT ((insn
& 0xff00) == 0xd400);
5568 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 2);
5569 BFD_ASSERT ((insn
& 0xff00) == 0xc700);
5570 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 4);
5571 BFD_ASSERT ((insn
& 0xff00) == 0xd100);
5572 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 6);
5573 BFD_ASSERT (insn
== 0x310c);
5574 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 8);
5575 BFD_ASSERT (insn
== 0x410b);
5576 insn
= bfd_get_16 (input_bfd
, contents
+ offset
+ 10);
5577 BFD_ASSERT (insn
== 0x34cc);
5579 bfd_put_16 (output_bfd
, 0x0012, contents
+ offset
+ 0);
5580 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 2);
5581 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 4);
5582 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 6);
5583 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 8);
5584 bfd_put_16 (output_bfd
, 0x0009, contents
+ offset
+ 10);
5593 off
= htab
->tls_ldm_got
.offset
;
5598 Elf_Internal_Rela outrel
;
5601 srelgot
= htab
->srelgot
;
5602 if (srelgot
== NULL
)
5605 outrel
.r_offset
= (sgot
->output_section
->vma
5606 + sgot
->output_offset
+ off
);
5607 outrel
.r_addend
= 0;
5608 outrel
.r_info
= ELF32_R_INFO (0, R_SH_TLS_DTPMOD32
);
5609 loc
= srelgot
->contents
;
5610 loc
+= srelgot
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5611 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5612 htab
->tls_ldm_got
.offset
|= 1;
5615 relocation
= sgot
->output_offset
+ off
;
5616 addend
= rel
->r_addend
;
5618 goto final_link_relocate
;
5620 case R_SH_TLS_LDO_32
:
5622 relocation
= tpoff (info
, relocation
);
5624 relocation
-= dtpoff_base (info
);
5626 addend
= rel
->r_addend
;
5627 goto final_link_relocate
;
5629 case R_SH_TLS_LE_32
:
5632 Elf_Internal_Rela outrel
;
5637 relocation
= tpoff (info
, relocation
);
5638 addend
= rel
->r_addend
;
5639 goto final_link_relocate
;
5646 name
= (bfd_elf_string_from_elf_section
5648 elf_elfheader (input_bfd
)->e_shstrndx
,
5649 elf_section_data (input_section
)->rel_hdr
.sh_name
));
5653 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5654 && strcmp (bfd_get_section_name (input_bfd
,
5658 sreloc
= bfd_get_section_by_name (dynobj
, name
);
5659 BFD_ASSERT (sreloc
!= NULL
);
5662 if (h
== NULL
|| h
->dynindx
== -1)
5667 outrel
.r_offset
= (input_section
->output_section
->vma
5668 + input_section
->output_offset
5670 outrel
.r_info
= ELF32_R_INFO (indx
, R_SH_TLS_TPOFF32
);
5672 outrel
.r_addend
= relocation
- dtpoff_base (info
);
5674 outrel
.r_addend
= 0;
5676 loc
= sreloc
->contents
;
5677 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5678 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5684 if (r
!= bfd_reloc_ok
)
5689 case bfd_reloc_outofrange
:
5691 case bfd_reloc_overflow
:
5696 name
= h
->root
.root
.string
;
5699 name
= (bfd_elf_string_from_elf_section
5700 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
5704 name
= bfd_section_name (input_bfd
, sec
);
5706 if (! ((*info
->callbacks
->reloc_overflow
)
5707 (info
, name
, howto
->name
, (bfd_vma
) 0,
5708 input_bfd
, input_section
, rel
->r_offset
)))
5719 /* This is a version of bfd_generic_get_relocated_section_contents
5720 which uses sh_elf_relocate_section. */
5723 sh_elf_get_relocated_section_contents (output_bfd
, link_info
, link_order
,
5724 data
, relocatable
, symbols
)
5726 struct bfd_link_info
*link_info
;
5727 struct bfd_link_order
*link_order
;
5729 bfd_boolean relocatable
;
5732 Elf_Internal_Shdr
*symtab_hdr
;
5733 asection
*input_section
= link_order
->u
.indirect
.section
;
5734 bfd
*input_bfd
= input_section
->owner
;
5735 asection
**sections
= NULL
;
5736 Elf_Internal_Rela
*internal_relocs
= NULL
;
5737 Elf_Internal_Sym
*isymbuf
= NULL
;
5739 /* We only need to handle the case of relaxing, or of having a
5740 particular set of section contents, specially. */
5742 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
5743 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
5748 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
5750 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
5751 (size_t) input_section
->_raw_size
);
5753 if ((input_section
->flags
& SEC_RELOC
) != 0
5754 && input_section
->reloc_count
> 0)
5757 Elf_Internal_Sym
*isym
, *isymend
;
5760 internal_relocs
= (_bfd_elf_link_read_relocs
5761 (input_bfd
, input_section
, (PTR
) NULL
,
5762 (Elf_Internal_Rela
*) NULL
, FALSE
));
5763 if (internal_relocs
== NULL
)
5766 if (symtab_hdr
->sh_info
!= 0)
5768 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
5769 if (isymbuf
== NULL
)
5770 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
5771 symtab_hdr
->sh_info
, 0,
5773 if (isymbuf
== NULL
)
5777 amt
= symtab_hdr
->sh_info
;
5778 amt
*= sizeof (asection
*);
5779 sections
= (asection
**) bfd_malloc (amt
);
5780 if (sections
== NULL
&& amt
!= 0)
5783 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
5784 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
5788 if (isym
->st_shndx
== SHN_UNDEF
)
5789 isec
= bfd_und_section_ptr
;
5790 else if (isym
->st_shndx
== SHN_ABS
)
5791 isec
= bfd_abs_section_ptr
;
5792 else if (isym
->st_shndx
== SHN_COMMON
)
5793 isec
= bfd_com_section_ptr
;
5795 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
5800 if (! sh_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
5801 input_section
, data
, internal_relocs
,
5805 if (sections
!= NULL
)
5808 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5810 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
5811 free (internal_relocs
);
5817 if (sections
!= NULL
)
5820 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
5822 if (internal_relocs
!= NULL
5823 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
5824 free (internal_relocs
);
5828 /* Return the base VMA address which should be subtracted from real addresses
5829 when resolving @dtpoff relocation.
5830 This is PT_TLS segment p_vaddr. */
5834 struct bfd_link_info
*info
;
5836 /* If tls_segment is NULL, we should have signalled an error already. */
5837 if (elf_hash_table (info
)->tls_segment
== NULL
)
5839 return elf_hash_table (info
)->tls_segment
->start
;
5842 /* Return the relocation value for R_SH_TLS_TPOFF32.. */
5845 tpoff (info
, address
)
5846 struct bfd_link_info
*info
;
5849 /* If tls_segment is NULL, we should have signalled an error already. */
5850 if (elf_hash_table (info
)->tls_segment
== NULL
)
5852 /* SH TLS ABI is variant I and static TLS block start just after tcbhead
5853 structure which has 2 pointer fields. */
5854 return (address
- dtpoff_base (info
) + 8);
5858 sh_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
)
5860 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
5861 Elf_Internal_Rela
*rel
;
5862 struct elf_link_hash_entry
*h
;
5863 Elf_Internal_Sym
*sym
;
5867 switch (ELF32_R_TYPE (rel
->r_info
))
5869 case R_SH_GNU_VTINHERIT
:
5870 case R_SH_GNU_VTENTRY
:
5874 #ifdef INCLUDE_SHMEDIA
5875 while (h
->root
.type
== bfd_link_hash_indirect
5876 && h
->root
.u
.i
.link
)
5877 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5879 switch (h
->root
.type
)
5881 case bfd_link_hash_defined
:
5882 case bfd_link_hash_defweak
:
5883 return h
->root
.u
.def
.section
;
5885 case bfd_link_hash_common
:
5886 return h
->root
.u
.c
.p
->section
;
5894 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
5899 /* Update the got entry reference counts for the section being removed. */
5902 sh_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
5904 struct bfd_link_info
*info
;
5906 const Elf_Internal_Rela
*relocs
;
5908 Elf_Internal_Shdr
*symtab_hdr
;
5909 struct elf_link_hash_entry
**sym_hashes
;
5910 bfd_signed_vma
*local_got_refcounts
;
5911 const Elf_Internal_Rela
*rel
, *relend
;
5913 elf_section_data (sec
)->local_dynrel
= NULL
;
5915 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
5916 sym_hashes
= elf_sym_hashes (abfd
);
5917 local_got_refcounts
= elf_local_got_refcounts (abfd
);
5919 relend
= relocs
+ sec
->reloc_count
;
5920 for (rel
= relocs
; rel
< relend
; rel
++)
5922 unsigned long r_symndx
;
5923 unsigned int r_type
;
5924 struct elf_link_hash_entry
*h
= NULL
;
5925 #ifdef INCLUDE_SHMEDIA
5926 int seen_stt_datalabel
= 0;
5929 r_symndx
= ELF32_R_SYM (rel
->r_info
);
5930 if (r_symndx
>= symtab_hdr
->sh_info
)
5932 struct elf_sh_link_hash_entry
*eh
;
5933 struct elf_sh_dyn_relocs
**pp
;
5934 struct elf_sh_dyn_relocs
*p
;
5936 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
5937 #ifdef INCLUDE_SHMEDIA
5938 while (h
->root
.type
== bfd_link_hash_indirect
5939 || h
->root
.type
== bfd_link_hash_warning
)
5941 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
5942 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5945 eh
= (struct elf_sh_link_hash_entry
*) h
;
5946 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
5949 /* Everything must go for SEC. */
5955 r_type
= ELF32_R_TYPE (rel
->r_info
);
5956 switch (sh_elf_optimized_tls_reloc (info
, r_type
, h
!= NULL
))
5958 case R_SH_TLS_LD_32
:
5959 if (sh_elf_hash_table (info
)->tls_ldm_got
.refcount
> 0)
5960 sh_elf_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
5966 #ifdef INCLUDE_SHMEDIA
5967 case R_SH_GOT_LOW16
:
5968 case R_SH_GOT_MEDLOW16
:
5969 case R_SH_GOT_MEDHI16
:
5973 case R_SH_GOTOFF_LOW16
:
5974 case R_SH_GOTOFF_MEDLOW16
:
5975 case R_SH_GOTOFF_MEDHI16
:
5976 case R_SH_GOTOFF_HI16
:
5977 case R_SH_GOTPC_LOW16
:
5978 case R_SH_GOTPC_MEDLOW16
:
5979 case R_SH_GOTPC_MEDHI16
:
5980 case R_SH_GOTPC_HI16
:
5982 case R_SH_TLS_GD_32
:
5983 case R_SH_TLS_IE_32
:
5986 #ifdef INCLUDE_SHMEDIA
5987 if (seen_stt_datalabel
)
5989 struct elf_sh_link_hash_entry
*eh
;
5990 eh
= (struct elf_sh_link_hash_entry
*) h
;
5991 if (eh
->datalabel_got
.refcount
> 0)
5992 eh
->datalabel_got
.refcount
-= 1;
5996 if (h
->got
.refcount
> 0)
5997 h
->got
.refcount
-= 1;
5999 else if (local_got_refcounts
!= NULL
)
6001 #ifdef INCLUDE_SHMEDIA
6002 if (rel
->r_addend
& 1)
6004 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6005 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6009 if (local_got_refcounts
[r_symndx
] > 0)
6010 local_got_refcounts
[r_symndx
] -= 1;
6021 #ifdef INCLUDE_SHMEDIA
6022 case R_SH_PLT_LOW16
:
6023 case R_SH_PLT_MEDLOW16
:
6024 case R_SH_PLT_MEDHI16
:
6029 if (h
->plt
.refcount
> 0)
6030 h
->plt
.refcount
-= 1;
6035 #ifdef INCLUDE_SHMEDIA
6036 case R_SH_GOTPLT_LOW16
:
6037 case R_SH_GOTPLT_MEDLOW16
:
6038 case R_SH_GOTPLT_MEDHI16
:
6039 case R_SH_GOTPLT_HI16
:
6040 case R_SH_GOTPLT10BY4
:
6041 case R_SH_GOTPLT10BY8
:
6045 struct elf_sh_link_hash_entry
*eh
;
6046 eh
= (struct elf_sh_link_hash_entry
*) h
;
6047 if (eh
->gotplt_refcount
> 0)
6049 eh
->gotplt_refcount
-= 1;
6050 if (h
->plt
.refcount
> 0)
6051 h
->plt
.refcount
-= 1;
6053 #ifdef INCLUDE_SHMEDIA
6054 else if (seen_stt_datalabel
)
6056 if (eh
->datalabel_got
.refcount
> 0)
6057 eh
->datalabel_got
.refcount
-= 1;
6060 else if (h
->got
.refcount
> 0)
6061 h
->got
.refcount
-= 1;
6063 else if (local_got_refcounts
!= NULL
)
6065 #ifdef INCLUDE_SHMEDIA
6066 if (rel
->r_addend
& 1)
6068 if (local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] > 0)
6069 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] -= 1;
6073 if (local_got_refcounts
[r_symndx
] > 0)
6074 local_got_refcounts
[r_symndx
] -= 1;
6086 /* Copy the extra info we tack onto an elf_link_hash_entry. */
6089 sh_elf_copy_indirect_symbol (bed
, dir
, ind
)
6090 struct elf_backend_data
*bed
;
6091 struct elf_link_hash_entry
*dir
, *ind
;
6093 struct elf_sh_link_hash_entry
*edir
, *eind
;
6094 #ifdef INCLUDE_SHMEDIA
6098 edir
= (struct elf_sh_link_hash_entry
*) dir
;
6099 eind
= (struct elf_sh_link_hash_entry
*) ind
;
6101 if (eind
->dyn_relocs
!= NULL
)
6103 if (edir
->dyn_relocs
!= NULL
)
6105 struct elf_sh_dyn_relocs
**pp
;
6106 struct elf_sh_dyn_relocs
*p
;
6108 BFD_ASSERT (ind
->root
.type
!= bfd_link_hash_indirect
);
6110 /* Add reloc counts against the weak sym to the strong sym
6111 list. Merge any entries against the same section. */
6112 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
6114 struct elf_sh_dyn_relocs
*q
;
6116 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
6117 if (q
->sec
== p
->sec
)
6119 q
->pc_count
+= p
->pc_count
;
6120 q
->count
+= p
->count
;
6127 *pp
= edir
->dyn_relocs
;
6130 edir
->dyn_relocs
= eind
->dyn_relocs
;
6131 eind
->dyn_relocs
= NULL
;
6133 edir
->gotplt_refcount
= eind
->gotplt_refcount
;
6134 eind
->gotplt_refcount
= 0;
6135 #ifdef INCLUDE_SHMEDIA
6136 tmp
= edir
->datalabel_got
.refcount
;
6139 edir
->datalabel_got
.refcount
= eind
->datalabel_got
.refcount
;
6140 eind
->datalabel_got
.refcount
= tmp
;
6143 BFD_ASSERT (eind
->datalabel_got
.refcount
< 1);
6146 if (ind
->root
.type
== bfd_link_hash_indirect
6147 && dir
->got
.refcount
<= 0)
6149 edir
->tls_type
= eind
->tls_type
;
6150 eind
->tls_type
= GOT_UNKNOWN
;
6153 if (ind
->root
.type
!= bfd_link_hash_indirect
6154 && (dir
->elf_link_hash_flags
& ELF_LINK_HASH_DYNAMIC_ADJUSTED
) != 0)
6155 /* If called to transfer flags for a weakdef during processing
6156 of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
6157 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
6158 dir
->elf_link_hash_flags
|=
6159 (ind
->elf_link_hash_flags
& (ELF_LINK_HASH_REF_DYNAMIC
6160 | ELF_LINK_HASH_REF_REGULAR
6161 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
));
6163 _bfd_elf_link_hash_copy_indirect (bed
, dir
, ind
);
6167 sh_elf_optimized_tls_reloc (info
, r_type
, is_local
)
6168 struct bfd_link_info
*info
;
6177 case R_SH_TLS_GD_32
:
6178 case R_SH_TLS_IE_32
:
6180 return R_SH_TLS_LE_32
;
6181 return R_SH_TLS_IE_32
;
6182 case R_SH_TLS_LD_32
:
6183 return R_SH_TLS_LE_32
;
6189 /* Look through the relocs for a section during the first phase.
6190 Since we don't do .gots or .plts, we just need to consider the
6191 virtual table relocs for gc. */
6194 sh_elf_check_relocs (abfd
, info
, sec
, relocs
)
6196 struct bfd_link_info
*info
;
6198 const Elf_Internal_Rela
*relocs
;
6200 Elf_Internal_Shdr
*symtab_hdr
;
6201 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
6202 struct elf_sh_link_hash_table
*htab
;
6203 const Elf_Internal_Rela
*rel
;
6204 const Elf_Internal_Rela
*rel_end
;
6205 bfd_vma
*local_got_offsets
;
6209 unsigned int r_type
;
6210 int tls_type
, old_tls_type
;
6216 if (info
->relocatable
)
6219 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
6220 sym_hashes
= elf_sym_hashes (abfd
);
6221 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof (Elf32_External_Sym
);
6222 if (!elf_bad_symtab (abfd
))
6223 sym_hashes_end
-= symtab_hdr
->sh_info
;
6225 htab
= sh_elf_hash_table (info
);
6226 local_got_offsets
= elf_local_got_offsets (abfd
);
6228 rel_end
= relocs
+ sec
->reloc_count
;
6229 for (rel
= relocs
; rel
< rel_end
; rel
++)
6231 struct elf_link_hash_entry
*h
;
6232 unsigned long r_symndx
;
6233 #ifdef INCLUDE_SHMEDIA
6234 int seen_stt_datalabel
= 0;
6237 r_symndx
= ELF32_R_SYM (rel
->r_info
);
6238 r_type
= ELF32_R_TYPE (rel
->r_info
);
6240 if (r_symndx
< symtab_hdr
->sh_info
)
6244 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
6245 #ifdef INCLUDE_SHMEDIA
6246 while (h
->root
.type
== bfd_link_hash_indirect
6247 || h
->root
.type
== bfd_link_hash_warning
)
6249 seen_stt_datalabel
|= h
->type
== STT_DATALABEL
;
6250 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
6255 r_type
= sh_elf_optimized_tls_reloc (info
, r_type
, h
== NULL
);
6257 && r_type
== R_SH_TLS_IE_32
6259 && h
->root
.type
!= bfd_link_hash_undefined
6260 && h
->root
.type
!= bfd_link_hash_undefweak
6261 && (h
->dynindx
== -1
6262 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
6263 r_type
= R_SH_TLS_LE_32
;
6265 /* Some relocs require a global offset table. */
6266 if (htab
->sgot
== NULL
)
6274 #ifdef INCLUDE_SHMEDIA
6275 case R_SH_GOTPLT_LOW16
:
6276 case R_SH_GOTPLT_MEDLOW16
:
6277 case R_SH_GOTPLT_MEDHI16
:
6278 case R_SH_GOTPLT_HI16
:
6279 case R_SH_GOTPLT10BY4
:
6280 case R_SH_GOTPLT10BY8
:
6281 case R_SH_GOT_LOW16
:
6282 case R_SH_GOT_MEDLOW16
:
6283 case R_SH_GOT_MEDHI16
:
6287 case R_SH_GOTOFF_LOW16
:
6288 case R_SH_GOTOFF_MEDLOW16
:
6289 case R_SH_GOTOFF_MEDHI16
:
6290 case R_SH_GOTOFF_HI16
:
6291 case R_SH_GOTPC_LOW16
:
6292 case R_SH_GOTPC_MEDLOW16
:
6293 case R_SH_GOTPC_MEDHI16
:
6294 case R_SH_GOTPC_HI16
:
6296 case R_SH_TLS_GD_32
:
6297 case R_SH_TLS_LD_32
:
6298 case R_SH_TLS_IE_32
:
6299 if (htab
->sgot
== NULL
)
6301 if (htab
->root
.dynobj
== NULL
)
6302 htab
->root
.dynobj
= abfd
;
6303 if (!create_got_section (htab
->root
.dynobj
, info
))
6315 /* This relocation describes the C++ object vtable hierarchy.
6316 Reconstruct it for later use during GC. */
6317 case R_SH_GNU_VTINHERIT
:
6318 if (!_bfd_elf32_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
6322 /* This relocation describes which C++ vtable entries are actually
6323 used. Record for later use during GC. */
6324 case R_SH_GNU_VTENTRY
:
6325 if (!_bfd_elf32_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
6329 case R_SH_TLS_IE_32
:
6331 info
->flags
|= DF_STATIC_TLS
;
6335 case R_SH_TLS_GD_32
:
6337 #ifdef INCLUDE_SHMEDIA
6338 case R_SH_GOT_LOW16
:
6339 case R_SH_GOT_MEDLOW16
:
6340 case R_SH_GOT_MEDHI16
:
6348 tls_type
= GOT_NORMAL
;
6350 case R_SH_TLS_GD_32
:
6351 tls_type
= GOT_TLS_GD
;
6353 case R_SH_TLS_IE_32
:
6354 tls_type
= GOT_TLS_IE
;
6360 #ifdef INCLUDE_SHMEDIA
6361 if (seen_stt_datalabel
)
6363 struct elf_sh_link_hash_entry
*eh
6364 = (struct elf_sh_link_hash_entry
*) h
;
6366 eh
->datalabel_got
.refcount
+= 1;
6370 h
->got
.refcount
+= 1;
6371 old_tls_type
= sh_elf_hash_entry (h
)->tls_type
;
6375 bfd_signed_vma
*local_got_refcounts
;
6377 /* This is a global offset table entry for a local
6379 local_got_refcounts
= elf_local_got_refcounts (abfd
);
6380 if (local_got_refcounts
== NULL
)
6384 size
= symtab_hdr
->sh_info
;
6385 size
*= sizeof (bfd_signed_vma
);
6386 #ifdef INCLUDE_SHMEDIA
6387 /* Reserve space for both the datalabel and
6388 codelabel local GOT offsets. */
6391 size
+= symtab_hdr
->sh_info
;
6392 local_got_refcounts
= ((bfd_signed_vma
*)
6393 bfd_zalloc (abfd
, size
));
6394 if (local_got_refcounts
== NULL
)
6396 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
6397 #ifdef INCLUDE_SHMEDIA
6398 /* Take care of both the datalabel and codelabel local
6400 sh_elf_local_got_tls_type (abfd
)
6401 = (char *) (local_got_refcounts
+ 2 * symtab_hdr
->sh_info
);
6403 sh_elf_local_got_tls_type (abfd
)
6404 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
6407 #ifdef INCLUDE_SHMEDIA
6408 if (rel
->r_addend
& 1)
6409 local_got_refcounts
[symtab_hdr
->sh_info
+ r_symndx
] += 1;
6412 local_got_refcounts
[r_symndx
] += 1;
6413 old_tls_type
= sh_elf_local_got_tls_type (abfd
) [r_symndx
];
6416 /* If a TLS symbol is accessed using IE at least once,
6417 there is no point to use dynamic model for it. */
6418 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
6419 && (old_tls_type
!= GOT_TLS_GD
|| tls_type
!= GOT_TLS_IE
))
6421 if (old_tls_type
== GOT_TLS_IE
&& tls_type
== GOT_TLS_GD
)
6422 tls_type
= GOT_TLS_IE
;
6425 (*_bfd_error_handler
)
6426 (_("%s: `%s' accessed both as normal and thread local symbol"),
6427 bfd_archive_filename (abfd
), h
->root
.root
.string
);
6432 if (old_tls_type
!= tls_type
)
6435 sh_elf_hash_entry (h
)->tls_type
= tls_type
;
6437 sh_elf_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
6442 case R_SH_TLS_LD_32
:
6443 sh_elf_hash_table(info
)->tls_ldm_got
.refcount
+= 1;
6447 #ifdef INCLUDE_SHMEDIA
6448 case R_SH_GOTPLT_LOW16
:
6449 case R_SH_GOTPLT_MEDLOW16
:
6450 case R_SH_GOTPLT_MEDHI16
:
6451 case R_SH_GOTPLT_HI16
:
6452 case R_SH_GOTPLT10BY4
:
6453 case R_SH_GOTPLT10BY8
:
6455 /* If this is a local symbol, we resolve it directly without
6456 creating a procedure linkage table entry. */
6459 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
6462 || h
->dynindx
== -1)
6465 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
6466 h
->plt
.refcount
+= 1;
6467 ((struct elf_sh_link_hash_entry
*) h
)->gotplt_refcount
+= 1;
6472 #ifdef INCLUDE_SHMEDIA
6473 case R_SH_PLT_LOW16
:
6474 case R_SH_PLT_MEDLOW16
:
6475 case R_SH_PLT_MEDHI16
:
6478 /* This symbol requires a procedure linkage table entry. We
6479 actually build the entry in adjust_dynamic_symbol,
6480 because this might be a case of linking PIC code which is
6481 never referenced by a dynamic object, in which case we
6482 don't need to generate a procedure linkage table entry
6485 /* If this is a local symbol, we resolve it directly without
6486 creating a procedure linkage table entry. */
6490 if (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
)
6493 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
6494 h
->plt
.refcount
+= 1;
6499 if (h
!= NULL
&& ! info
->shared
)
6501 h
->elf_link_hash_flags
|= ELF_LINK_NON_GOT_REF
;
6502 h
->plt
.refcount
+= 1;
6505 /* If we are creating a shared library, and this is a reloc
6506 against a global symbol, or a non PC relative reloc
6507 against a local symbol, then we need to copy the reloc
6508 into the shared library. However, if we are linking with
6509 -Bsymbolic, we do not need to copy a reloc against a
6510 global symbol which is defined in an object we are
6511 including in the link (i.e., DEF_REGULAR is set). At
6512 this point we have not seen all the input files, so it is
6513 possible that DEF_REGULAR is not set now but will be set
6514 later (it is never cleared). We account for that
6515 possibility below by storing information in the
6516 dyn_relocs field of the hash table entry. A similar
6517 situation occurs when creating shared libraries and symbol
6518 visibility changes render the symbol local.
6520 If on the other hand, we are creating an executable, we
6521 may need to keep relocations for symbols satisfied by a
6522 dynamic library if we manage to avoid copy relocs for the
6525 && (sec
->flags
& SEC_ALLOC
) != 0
6526 && (r_type
!= R_SH_REL32
6528 && (! info
->symbolic
6529 || h
->root
.type
== bfd_link_hash_defweak
6530 || (h
->elf_link_hash_flags
6531 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
6533 && (sec
->flags
& SEC_ALLOC
) != 0
6535 && (h
->root
.type
== bfd_link_hash_defweak
6536 || (h
->elf_link_hash_flags
6537 & ELF_LINK_HASH_DEF_REGULAR
) == 0)))
6539 struct elf_sh_dyn_relocs
*p
;
6540 struct elf_sh_dyn_relocs
**head
;
6542 if (htab
->root
.dynobj
== NULL
)
6543 htab
->root
.dynobj
= abfd
;
6545 /* When creating a shared object, we must copy these
6546 reloc types into the output file. We create a reloc
6547 section in dynobj and make room for this reloc. */
6552 name
= (bfd_elf_string_from_elf_section
6554 elf_elfheader (abfd
)->e_shstrndx
,
6555 elf_section_data (sec
)->rel_hdr
.sh_name
));
6559 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
6560 && strcmp (bfd_get_section_name (abfd
, sec
),
6563 sreloc
= bfd_get_section_by_name (htab
->root
.dynobj
, name
);
6568 sreloc
= bfd_make_section (htab
->root
.dynobj
, name
);
6569 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
6570 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
6571 if ((sec
->flags
& SEC_ALLOC
) != 0)
6572 flags
|= SEC_ALLOC
| SEC_LOAD
;
6574 || ! bfd_set_section_flags (htab
->root
.dynobj
,
6576 || ! bfd_set_section_alignment (htab
->root
.dynobj
,
6580 if (sec
->flags
& SEC_READONLY
)
6581 info
->flags
|= DF_TEXTREL
;
6582 elf_section_data (sec
)->sreloc
= sreloc
;
6585 /* If this is a global symbol, we count the number of
6586 relocations we need for this symbol. */
6588 head
= &((struct elf_sh_link_hash_entry
*) h
)->dyn_relocs
;
6593 /* Track dynamic relocs needed for local syms too. */
6594 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
6599 head
= ((struct elf_sh_dyn_relocs
**)
6600 &elf_section_data (s
)->local_dynrel
);
6604 if (p
== NULL
|| p
->sec
!= sec
)
6606 bfd_size_type amt
= sizeof (*p
);
6607 p
= bfd_alloc (htab
->root
.dynobj
, amt
);
6618 if (r_type
== R_SH_REL32
)
6624 case R_SH_TLS_LE_32
:
6627 (*_bfd_error_handler
) (_("%s: TLS local exec code cannot be linked into shared objects"),
6628 bfd_archive_filename (abfd
));
6634 case R_SH_TLS_LDO_32
:
6635 /* Nothing to do. */
6646 #ifndef sh_elf_set_mach_from_flags
6648 sh_elf_set_mach_from_flags (abfd
)
6651 flagword flags
= elf_elfheader (abfd
)->e_flags
;
6653 switch (flags
& EF_SH_MACH_MASK
)
6656 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh
);
6659 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh2
);
6662 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh2e
);
6665 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh_dsp
);
6668 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh3
);
6671 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh3_dsp
);
6674 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh3e
);
6678 bfd_default_set_arch_mach (abfd
, bfd_arch_sh
, bfd_mach_sh4
);
6685 #endif /* not sh_elf_set_mach_from_flags */
6687 #ifndef sh_elf_set_private_flags
6688 /* Function to keep SH specific file flags. */
6691 sh_elf_set_private_flags (abfd
, flags
)
6695 BFD_ASSERT (! elf_flags_init (abfd
)
6696 || elf_elfheader (abfd
)->e_flags
== flags
);
6698 elf_elfheader (abfd
)->e_flags
= flags
;
6699 elf_flags_init (abfd
) = TRUE
;
6700 return sh_elf_set_mach_from_flags (abfd
);
6702 #endif /* not sh_elf_set_private_flags */
6704 #ifndef sh_elf_copy_private_data
6705 /* Copy backend specific data from one object module to another */
6708 sh_elf_copy_private_data (ibfd
, obfd
)
6712 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6713 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6716 return sh_elf_set_private_flags (obfd
, elf_elfheader (ibfd
)->e_flags
);
6718 #endif /* not sh_elf_copy_private_data */
6720 #ifndef sh_elf_merge_private_data
6721 /* This routine checks for linking big and little endian objects
6722 together, and for linking sh-dsp with sh3e / sh4 objects. */
6725 sh_elf_merge_private_data (ibfd
, obfd
)
6729 flagword old_flags
, new_flags
;
6731 if (! _bfd_generic_verify_endian_match (ibfd
, obfd
))
6734 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
6735 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
6738 if (! elf_flags_init (obfd
))
6740 /* This happens when ld starts out with a 'blank' output file. */
6741 elf_flags_init (obfd
) = TRUE
;
6742 elf_elfheader (obfd
)->e_flags
= EF_SH1
;
6744 old_flags
= elf_elfheader (obfd
)->e_flags
;
6745 new_flags
= elf_elfheader (ibfd
)->e_flags
;
6746 if ((EF_SH_HAS_DSP (old_flags
) && EF_SH_HAS_FP (new_flags
))
6747 || (EF_SH_HAS_DSP (new_flags
) && EF_SH_HAS_FP (old_flags
)))
6749 (*_bfd_error_handler
)
6750 ("%s: uses %s instructions while previous modules use %s instructions",
6751 bfd_archive_filename (ibfd
),
6752 EF_SH_HAS_DSP (new_flags
) ? "dsp" : "floating point",
6753 EF_SH_HAS_DSP (new_flags
) ? "floating point" : "dsp");
6754 bfd_set_error (bfd_error_bad_value
);
6757 elf_elfheader (obfd
)->e_flags
= EF_SH_MERGE_MACH (old_flags
, new_flags
);
6759 return sh_elf_set_mach_from_flags (obfd
);
6761 #endif /* not sh_elf_merge_private_data */
6763 /* Override the generic function because we need to store sh_elf_obj_tdata
6764 as the specific tdata. We set also the machine architecture from flags
6768 sh_elf_object_p (abfd
)
6771 struct sh_elf_obj_tdata
*new_tdata
;
6772 bfd_size_type amt
= sizeof (struct sh_elf_obj_tdata
);
6774 if (!sh_elf_set_mach_from_flags (abfd
))
6777 /* Allocate our special target data. */
6778 new_tdata
= bfd_zalloc (abfd
, amt
);
6779 if (new_tdata
== NULL
)
6781 new_tdata
->root
= *abfd
->tdata
.elf_obj_data
;
6782 abfd
->tdata
.any
= new_tdata
;
6786 /* Finish up dynamic symbol handling. We set the contents of various
6787 dynamic sections here. */
6790 sh_elf_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
6792 struct bfd_link_info
*info
;
6793 struct elf_link_hash_entry
*h
;
6794 Elf_Internal_Sym
*sym
;
6796 struct elf_sh_link_hash_table
*htab
;
6798 htab
= sh_elf_hash_table (info
);
6800 if (h
->plt
.offset
!= (bfd_vma
) -1)
6808 Elf_Internal_Rela rel
;
6811 /* This symbol has an entry in the procedure linkage table. Set
6814 BFD_ASSERT (h
->dynindx
!= -1);
6817 sgot
= htab
->sgotplt
;
6818 srel
= htab
->srelplt
;
6819 BFD_ASSERT (splt
!= NULL
&& sgot
!= NULL
&& srel
!= NULL
);
6821 /* Get the index in the procedure linkage table which
6822 corresponds to this symbol. This is the index of this symbol
6823 in all the symbols for which we are making plt entries. The
6824 first entry in the procedure linkage table is reserved. */
6825 plt_index
= h
->plt
.offset
/ elf_sh_sizeof_plt (info
) - 1;
6827 /* Get the offset into the .got table of the entry that
6828 corresponds to this function. Each .got entry is 4 bytes.
6829 The first three are reserved. */
6830 got_offset
= (plt_index
+ 3) * 4;
6834 got_offset
-= GOT_BIAS
;
6837 /* Fill in the entry in the procedure linkage table. */
6840 if (elf_sh_plt_entry
== NULL
)
6842 elf_sh_plt_entry
= (bfd_big_endian (output_bfd
) ?
6843 elf_sh_plt_entry_be
: elf_sh_plt_entry_le
);
6845 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_plt_entry
,
6846 elf_sh_sizeof_plt (info
));
6847 #ifdef INCLUDE_SHMEDIA
6848 movi_shori_putval (output_bfd
,
6849 (sgot
->output_section
->vma
6850 + sgot
->output_offset
6852 (splt
->contents
+ h
->plt
.offset
6853 + elf_sh_plt_symbol_offset (info
)));
6855 /* Set bottom bit because its for a branch to SHmedia */
6856 movi_shori_putval (output_bfd
,
6857 (splt
->output_section
->vma
+ splt
->output_offset
)
6859 (splt
->contents
+ h
->plt
.offset
6860 + elf_sh_plt_plt0_offset (info
)));
6862 bfd_put_32 (output_bfd
,
6863 (sgot
->output_section
->vma
6864 + sgot
->output_offset
6866 (splt
->contents
+ h
->plt
.offset
6867 + elf_sh_plt_symbol_offset (info
)));
6869 bfd_put_32 (output_bfd
,
6870 (splt
->output_section
->vma
+ splt
->output_offset
),
6871 (splt
->contents
+ h
->plt
.offset
6872 + elf_sh_plt_plt0_offset (info
)));
6877 if (elf_sh_pic_plt_entry
== NULL
)
6879 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
6880 elf_sh_pic_plt_entry_be
:
6881 elf_sh_pic_plt_entry_le
);
6883 memcpy (splt
->contents
+ h
->plt
.offset
, elf_sh_pic_plt_entry
,
6884 elf_sh_sizeof_plt (info
));
6885 #ifdef INCLUDE_SHMEDIA
6886 movi_shori_putval (output_bfd
, got_offset
,
6887 (splt
->contents
+ h
->plt
.offset
6888 + elf_sh_plt_symbol_offset (info
)));
6890 bfd_put_32 (output_bfd
, got_offset
,
6891 (splt
->contents
+ h
->plt
.offset
6892 + elf_sh_plt_symbol_offset (info
)));
6898 got_offset
+= GOT_BIAS
;
6901 #ifdef INCLUDE_SHMEDIA
6902 movi_shori_putval (output_bfd
,
6903 plt_index
* sizeof (Elf32_External_Rela
),
6904 (splt
->contents
+ h
->plt
.offset
6905 + elf_sh_plt_reloc_offset (info
)));
6907 bfd_put_32 (output_bfd
, plt_index
* sizeof (Elf32_External_Rela
),
6908 (splt
->contents
+ h
->plt
.offset
6909 + elf_sh_plt_reloc_offset (info
)));
6912 /* Fill in the entry in the global offset table. */
6913 bfd_put_32 (output_bfd
,
6914 (splt
->output_section
->vma
6915 + splt
->output_offset
6917 + elf_sh_plt_temp_offset (info
)),
6918 sgot
->contents
+ got_offset
);
6920 /* Fill in the entry in the .rela.plt section. */
6921 rel
.r_offset
= (sgot
->output_section
->vma
6922 + sgot
->output_offset
6924 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_JMP_SLOT
);
6927 rel
.r_addend
= GOT_BIAS
;
6929 loc
= srel
->contents
+ plt_index
* sizeof (Elf32_External_Rela
);
6930 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
6932 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
6934 /* Mark the symbol as undefined, rather than as defined in
6935 the .plt section. Leave the value alone. */
6936 sym
->st_shndx
= SHN_UNDEF
;
6940 if (h
->got
.offset
!= (bfd_vma
) -1
6941 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_GD
6942 && sh_elf_hash_entry (h
)->tls_type
!= GOT_TLS_IE
)
6946 Elf_Internal_Rela rel
;
6949 /* This symbol has an entry in the global offset table. Set it
6953 srel
= htab
->srelgot
;
6954 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
6956 rel
.r_offset
= (sgot
->output_section
->vma
6957 + sgot
->output_offset
6958 + (h
->got
.offset
&~ (bfd_vma
) 1));
6960 /* If this is a static link, or it is a -Bsymbolic link and the
6961 symbol is defined locally or was forced to be local because
6962 of a version file, we just want to emit a RELATIVE reloc.
6963 The entry in the global offset table will already have been
6964 initialized in the relocate_section function. */
6968 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
6969 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
6971 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
6972 rel
.r_addend
= (h
->root
.u
.def
.value
6973 + h
->root
.u
.def
.section
->output_section
->vma
6974 + h
->root
.u
.def
.section
->output_offset
);
6978 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
6979 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
6983 loc
= srel
->contents
;
6984 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
6985 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
6988 #ifdef INCLUDE_SHMEDIA
6990 struct elf_sh_link_hash_entry
*eh
;
6992 eh
= (struct elf_sh_link_hash_entry
*) h
;
6993 if (eh
->datalabel_got
.offset
!= (bfd_vma
) -1)
6997 Elf_Internal_Rela rel
;
7000 /* This symbol has a datalabel entry in the global offset table.
7004 srel
= htab
->srelgot
;
7005 BFD_ASSERT (sgot
!= NULL
&& srel
!= NULL
);
7007 rel
.r_offset
= (sgot
->output_section
->vma
7008 + sgot
->output_offset
7009 + (eh
->datalabel_got
.offset
&~ (bfd_vma
) 1));
7011 /* If this is a static link, or it is a -Bsymbolic link and the
7012 symbol is defined locally or was forced to be local because
7013 of a version file, we just want to emit a RELATIVE reloc.
7014 The entry in the global offset table will already have been
7015 initialized in the relocate_section function. */
7019 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
7020 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
7022 rel
.r_info
= ELF32_R_INFO (0, R_SH_RELATIVE
);
7023 rel
.r_addend
= (h
->root
.u
.def
.value
7024 + h
->root
.u
.def
.section
->output_section
->vma
7025 + h
->root
.u
.def
.section
->output_offset
);
7029 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
7030 + eh
->datalabel_got
.offset
);
7031 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_GLOB_DAT
);
7035 loc
= srel
->contents
;
7036 loc
+= srel
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7037 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7042 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
7045 Elf_Internal_Rela rel
;
7048 /* This symbol needs a copy reloc. Set it up. */
7050 BFD_ASSERT (h
->dynindx
!= -1
7051 && (h
->root
.type
== bfd_link_hash_defined
7052 || h
->root
.type
== bfd_link_hash_defweak
));
7054 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
7056 BFD_ASSERT (s
!= NULL
);
7058 rel
.r_offset
= (h
->root
.u
.def
.value
7059 + h
->root
.u
.def
.section
->output_section
->vma
7060 + h
->root
.u
.def
.section
->output_offset
);
7061 rel
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SH_COPY
);
7063 loc
= s
->contents
+ s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
7064 bfd_elf32_swap_reloca_out (output_bfd
, &rel
, loc
);
7067 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
7068 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
7069 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
7070 sym
->st_shndx
= SHN_ABS
;
7075 /* Finish up the dynamic sections. */
7078 sh_elf_finish_dynamic_sections (output_bfd
, info
)
7080 struct bfd_link_info
*info
;
7082 struct elf_sh_link_hash_table
*htab
;
7086 htab
= sh_elf_hash_table (info
);
7087 sgot
= htab
->sgotplt
;
7088 sdyn
= bfd_get_section_by_name (htab
->root
.dynobj
, ".dynamic");
7090 if (htab
->root
.dynamic_sections_created
)
7093 Elf32_External_Dyn
*dyncon
, *dynconend
;
7095 BFD_ASSERT (sgot
!= NULL
&& sdyn
!= NULL
);
7097 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
7098 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
7099 for (; dyncon
< dynconend
; dyncon
++)
7101 Elf_Internal_Dyn dyn
;
7103 #ifdef INCLUDE_SHMEDIA
7107 bfd_elf32_swap_dyn_in (htab
->root
.dynobj
, dyncon
, &dyn
);
7114 #ifdef INCLUDE_SHMEDIA
7116 name
= info
->init_function
;
7120 name
= info
->fini_function
;
7122 if (dyn
.d_un
.d_val
!= 0)
7124 struct elf_link_hash_entry
*h
;
7126 h
= elf_link_hash_lookup (&htab
->root
, name
,
7127 FALSE
, FALSE
, TRUE
);
7128 if (h
!= NULL
&& (h
->other
& STO_SH5_ISA32
))
7130 dyn
.d_un
.d_val
|= 1;
7131 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7138 s
= htab
->sgot
->output_section
;
7142 s
= htab
->srelplt
->output_section
;
7144 BFD_ASSERT (s
!= NULL
);
7145 dyn
.d_un
.d_ptr
= s
->vma
;
7146 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7150 s
= htab
->srelplt
->output_section
;
7151 BFD_ASSERT (s
!= NULL
);
7152 if (s
->_cooked_size
!= 0)
7153 dyn
.d_un
.d_val
= s
->_cooked_size
;
7155 dyn
.d_un
.d_val
= s
->_raw_size
;
7156 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7160 /* My reading of the SVR4 ABI indicates that the
7161 procedure linkage table relocs (DT_JMPREL) should be
7162 included in the overall relocs (DT_RELA). This is
7163 what Solaris does. However, UnixWare can not handle
7164 that case. Therefore, we override the DT_RELASZ entry
7165 here to make it not include the JMPREL relocs. Since
7166 the linker script arranges for .rela.plt to follow all
7167 other relocation sections, we don't have to worry
7168 about changing the DT_RELA entry. */
7169 if (htab
->srelplt
!= NULL
)
7171 s
= htab
->srelplt
->output_section
;
7172 if (s
->_cooked_size
!= 0)
7173 dyn
.d_un
.d_val
-= s
->_cooked_size
;
7175 dyn
.d_un
.d_val
-= s
->_raw_size
;
7177 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
7182 /* Fill in the first entry in the procedure linkage table. */
7184 if (splt
&& splt
->_raw_size
> 0)
7188 if (elf_sh_pic_plt_entry
== NULL
)
7190 elf_sh_pic_plt_entry
= (bfd_big_endian (output_bfd
) ?
7191 elf_sh_pic_plt_entry_be
:
7192 elf_sh_pic_plt_entry_le
);
7194 memcpy (splt
->contents
, elf_sh_pic_plt_entry
,
7195 elf_sh_sizeof_plt (info
));
7199 if (elf_sh_plt0_entry
== NULL
)
7201 elf_sh_plt0_entry
= (bfd_big_endian (output_bfd
) ?
7202 elf_sh_plt0_entry_be
:
7203 elf_sh_plt0_entry_le
);
7205 memcpy (splt
->contents
, elf_sh_plt0_entry
, PLT_ENTRY_SIZE
);
7206 #ifdef INCLUDE_SHMEDIA
7207 movi_shori_putval (output_bfd
,
7208 sgot
->output_section
->vma
7209 + sgot
->output_offset
,
7211 + elf_sh_plt0_gotplt_offset (info
));
7213 bfd_put_32 (output_bfd
,
7214 sgot
->output_section
->vma
+ sgot
->output_offset
+ 4,
7215 splt
->contents
+ elf_sh_plt0_gotid_offset (info
));
7216 bfd_put_32 (output_bfd
,
7217 sgot
->output_section
->vma
+ sgot
->output_offset
+ 8,
7218 splt
->contents
+ elf_sh_plt0_linker_offset (info
));
7222 /* UnixWare sets the entsize of .plt to 4, although that doesn't
7223 really seem like the right value. */
7224 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 4;
7228 /* Fill in the first three entries in the global offset table. */
7229 if (sgot
&& sgot
->_raw_size
> 0)
7232 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
7234 bfd_put_32 (output_bfd
,
7235 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
7237 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 4);
7238 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ 8);
7240 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
7246 static enum elf_reloc_type_class
7247 sh_elf_reloc_type_class (rela
)
7248 const Elf_Internal_Rela
*rela
;
7250 switch ((int) ELF32_R_TYPE (rela
->r_info
))
7253 return reloc_class_relative
;
7255 return reloc_class_plt
;
7257 return reloc_class_copy
;
7259 return reloc_class_normal
;
7263 /* Support for Linux core dump NOTE sections. */
7265 elf32_shlin_grok_prstatus (abfd
, note
)
7267 Elf_Internal_Note
*note
;
7270 unsigned int raw_size
;
7272 switch (note
->descsz
)
7277 case 168: /* Linux/SH */
7279 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
7282 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
7291 /* Make a ".reg/999" section. */
7292 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
7293 raw_size
, note
->descpos
+ offset
);
7297 elf32_shlin_grok_psinfo (abfd
, note
)
7299 Elf_Internal_Note
*note
;
7301 switch (note
->descsz
)
7306 case 124: /* Linux/SH elf_prpsinfo */
7307 elf_tdata (abfd
)->core_program
7308 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 28, 16);
7309 elf_tdata (abfd
)->core_command
7310 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 44, 80);
7313 /* Note that for some reason, a spurious space is tacked
7314 onto the end of the args in some (at least one anyway)
7315 implementations, so strip it off if it exists. */
7318 char *command
= elf_tdata (abfd
)->core_command
;
7319 int n
= strlen (command
);
7321 if (0 < n
&& command
[n
- 1] == ' ')
7322 command
[n
- 1] = '\0';
7328 #define TARGET_BIG_SYM bfd_elf32_sh_vec
7329 #define TARGET_BIG_NAME "elf32-sh"
7330 #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
7331 #define TARGET_LITTLE_NAME "elf32-shl"
7332 #define ELF_ARCH bfd_arch_sh
7333 #define ELF_MACHINE_CODE EM_SH
7334 #define ELF_MAXPAGESIZE 128
7336 #define elf_symbol_leading_char '_'
7338 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
7339 #define elf_info_to_howto sh_elf_info_to_howto
7340 #define bfd_elf32_bfd_relax_section sh_elf_relax_section
7341 #define elf_backend_relocate_section sh_elf_relocate_section
7342 #define bfd_elf32_bfd_get_relocated_section_contents \
7343 sh_elf_get_relocated_section_contents
7344 #define bfd_elf32_mkobject sh_elf_mkobject
7345 #define elf_backend_object_p sh_elf_object_p
7346 #define bfd_elf32_bfd_set_private_bfd_flags \
7347 sh_elf_set_private_flags
7348 #define bfd_elf32_bfd_copy_private_bfd_data \
7349 sh_elf_copy_private_data
7350 #define bfd_elf32_bfd_merge_private_bfd_data \
7351 sh_elf_merge_private_data
7353 #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
7354 #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
7355 #define elf_backend_check_relocs sh_elf_check_relocs
7356 #define elf_backend_copy_indirect_symbol \
7357 sh_elf_copy_indirect_symbol
7358 #define elf_backend_create_dynamic_sections \
7359 sh_elf_create_dynamic_sections
7360 #define bfd_elf32_bfd_link_hash_table_create \
7361 sh_elf_link_hash_table_create
7362 #define elf_backend_adjust_dynamic_symbol \
7363 sh_elf_adjust_dynamic_symbol
7364 #define elf_backend_size_dynamic_sections \
7365 sh_elf_size_dynamic_sections
7366 #define elf_backend_finish_dynamic_symbol \
7367 sh_elf_finish_dynamic_symbol
7368 #define elf_backend_finish_dynamic_sections \
7369 sh_elf_finish_dynamic_sections
7370 #define elf_backend_reloc_type_class sh_elf_reloc_type_class
7372 #define elf_backend_can_gc_sections 1
7373 #define elf_backend_can_refcount 1
7374 #define elf_backend_want_got_plt 1
7375 #define elf_backend_plt_readonly 1
7376 #define elf_backend_want_plt_sym 0
7377 #define elf_backend_got_header_size 12
7378 #define elf_backend_plt_header_size PLT_ENTRY_SIZE
7380 #ifndef INCLUDE_SHMEDIA
7382 #include "elf32-target.h"
7384 /* NetBSD support. */
7385 #undef TARGET_BIG_SYM
7386 #define TARGET_BIG_SYM bfd_elf32_shnbsd_vec
7387 #undef TARGET_BIG_NAME
7388 #define TARGET_BIG_NAME "elf32-sh-nbsd"
7389 #undef TARGET_LITTLE_SYM
7390 #define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec
7391 #undef TARGET_LITTLE_NAME
7392 #define TARGET_LITTLE_NAME "elf32-shl-nbsd"
7393 #undef ELF_MAXPAGESIZE
7394 #define ELF_MAXPAGESIZE 0x10000
7395 #undef elf_symbol_leading_char
7396 #define elf_symbol_leading_char 0
7398 #define elf32_bed elf32_sh_nbsd_bed
7400 #include "elf32-target.h"
7403 /* Linux support. */
7404 #undef TARGET_BIG_SYM
7405 #define TARGET_BIG_SYM bfd_elf32_shblin_vec
7406 #undef TARGET_BIG_NAME
7407 #define TARGET_BIG_NAME "elf32-shbig-linux"
7408 #undef TARGET_LITTLE_SYM
7409 #define TARGET_LITTLE_SYM bfd_elf32_shlin_vec
7410 #undef TARGET_LITTLE_NAME
7411 #define TARGET_LITTLE_NAME "elf32-sh-linux"
7413 #undef elf_backend_grok_prstatus
7414 #define elf_backend_grok_prstatus elf32_shlin_grok_prstatus
7415 #undef elf_backend_grok_psinfo
7416 #define elf_backend_grok_psinfo elf32_shlin_grok_psinfo
7418 #define elf32_bed elf32_sh_lin_bed
7420 #include "elf32-target.h"
7422 #endif /* INCLUDE_SHMEDIA */