1 /* Hitachi SH specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Ian Lance Taylor, Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 static bfd_reloc_status_type sh_elf_reloc
29 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
30 static bfd_reloc_status_type sh_elf_ignore_reloc
31 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
32 static reloc_howto_type *sh_elf_reloc_type_lookup
33 PARAMS ((bfd *, bfd_reloc_code_real_type));
34 static void sh_elf_info_to_howto
35 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
36 static boolean sh_elf_relax_section
37 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
38 static boolean sh_elf_relax_delete_bytes
39 PARAMS ((bfd *, asection *, bfd_vma, int));
40 static boolean sh_elf_align_loads
41 PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, boolean *));
42 static boolean sh_elf_swap_insns
43 PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
44 static boolean sh_elf_relocate_section
45 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
46 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
47 static bfd_byte *sh_elf_get_relocated_section_contents
48 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
49 bfd_byte *, boolean, asymbol **));
51 static reloc_howto_type sh_elf_howto_table[] =
54 HOWTO (R_SH_NONE, /* type */
56 0, /* size (0 = byte, 1 = short, 2 = long) */
58 false, /* pc_relative */
60 complain_overflow_dont, /* complain_on_overflow */
61 sh_elf_reloc, /* special_function */
62 "R_SH_NONE", /* name */
63 false, /* partial_inplace */
66 false), /* pcrel_offset */
68 /* 32 bit absolute relocation. Setting partial_inplace to true and
69 src_mask to a non-zero value is similar to the COFF toolchain. */
70 HOWTO (R_SH_DIR32, /* type */
72 2, /* size (0 = byte, 1 = short, 2 = long) */
74 false, /* pc_relative */
76 complain_overflow_bitfield, /* complain_on_overflow */
77 sh_elf_reloc, /* special_function */
78 "R_SH_DIR32", /* name */
79 true, /* partial_inplace */
80 0xffffffff, /* src_mask */
81 0xffffffff, /* dst_mask */
82 false), /* pcrel_offset */
84 /* 32 bit PC relative relocation. */
85 HOWTO (R_SH_REL32, /* type */
87 2, /* size (0 = byte, 1 = short, 2 = long) */
89 true, /* pc_relative */
91 complain_overflow_signed, /* complain_on_overflow */
92 sh_elf_reloc, /* special_function */
93 "R_SH_REL32", /* name */
94 false, /* partial_inplace */
96 0xffffffff, /* dst_mask */
97 true), /* pcrel_offset */
99 /* 8 bit PC relative branch divided by 2. */
100 HOWTO (R_SH_DIR8WPN, /* type */
102 1, /* size (0 = byte, 1 = short, 2 = long) */
104 true, /* pc_relative */
106 complain_overflow_signed, /* complain_on_overflow */
107 sh_elf_reloc, /* special_function */
108 "R_SH_DIR8WPN", /* name */
109 true, /* partial_inplace */
112 true), /* pcrel_offset */
114 /* 12 bit PC relative branch divided by 2. */
115 HOWTO (R_SH_IND12W, /* type */
117 1, /* size (0 = byte, 1 = short, 2 = long) */
119 true, /* pc_relative */
121 complain_overflow_signed, /* complain_on_overflow */
122 sh_elf_reloc, /* special_function */
123 "R_SH_IND12W", /* name */
124 true, /* partial_inplace */
125 0xfff, /* src_mask */
126 0xfff, /* dst_mask */
127 true), /* pcrel_offset */
129 /* 8 bit unsigned PC relative divided by 4. */
130 HOWTO (R_SH_DIR8WPL, /* type */
132 1, /* size (0 = byte, 1 = short, 2 = long) */
134 true, /* pc_relative */
136 complain_overflow_unsigned, /* complain_on_overflow */
137 sh_elf_reloc, /* special_function */
138 "R_SH_DIR8WPL", /* name */
139 true, /* partial_inplace */
142 true), /* pcrel_offset */
144 /* 8 bit unsigned PC relative divided by 2. */
145 HOWTO (R_SH_DIR8WPZ, /* type */
147 1, /* size (0 = byte, 1 = short, 2 = long) */
149 true, /* pc_relative */
151 complain_overflow_unsigned, /* complain_on_overflow */
152 sh_elf_reloc, /* special_function */
153 "R_SH_DIR8WPZ", /* name */
154 true, /* partial_inplace */
157 true), /* pcrel_offset */
159 /* 8 bit GBR relative. FIXME: This only makes sense if we have some
160 special symbol for the GBR relative area, and that is not
162 HOWTO (R_SH_DIR8BP, /* type */
164 1, /* size (0 = byte, 1 = short, 2 = long) */
166 false, /* pc_relative */
168 complain_overflow_unsigned, /* complain_on_overflow */
169 sh_elf_reloc, /* special_function */
170 "R_SH_DIR8BP", /* name */
171 false, /* partial_inplace */
174 true), /* pcrel_offset */
176 /* 8 bit GBR relative divided by 2. FIXME: This only makes sense if
177 we have some special symbol for the GBR relative area, and that
178 is not implemented. */
179 HOWTO (R_SH_DIR8W, /* type */
181 1, /* size (0 = byte, 1 = short, 2 = long) */
183 false, /* pc_relative */
185 complain_overflow_unsigned, /* complain_on_overflow */
186 sh_elf_reloc, /* special_function */
187 "R_SH_DIR8W", /* name */
188 false, /* partial_inplace */
191 true), /* pcrel_offset */
193 /* 8 bit GBR relative divided by 4. FIXME: This only makes sense if
194 we have some special symbol for the GBR relative area, and that
195 is not implemented. */
196 HOWTO (R_SH_DIR8L, /* type */
198 1, /* size (0 = byte, 1 = short, 2 = long) */
200 false, /* pc_relative */
202 complain_overflow_unsigned, /* complain_on_overflow */
203 sh_elf_reloc, /* special_function */
204 "R_SH_DIR8L", /* name */
205 false, /* partial_inplace */
208 true), /* pcrel_offset */
226 /* The remaining relocs are a GNU extension used for relaxing. The
227 final pass of the linker never needs to do anything with any of
228 these relocs. Any required operations are handled by the
231 /* A 16 bit switch table entry. This is generated for an expression
232 such as ``.word L1 - L2''. The offset holds the difference
233 between the reloc address and L2. */
234 HOWTO (R_SH_SWITCH16, /* type */
236 1, /* size (0 = byte, 1 = short, 2 = long) */
238 false, /* pc_relative */
240 complain_overflow_unsigned, /* complain_on_overflow */
241 sh_elf_ignore_reloc, /* special_function */
242 "R_SH_SWITCH16", /* name */
243 false, /* partial_inplace */
246 true), /* pcrel_offset */
248 /* A 32 bit switch table entry. This is generated for an expression
249 such as ``.long L1 - L2''. The offset holds the difference
250 between the reloc address and L2. */
251 HOWTO (R_SH_SWITCH32, /* type */
253 2, /* size (0 = byte, 1 = short, 2 = long) */
255 false, /* pc_relative */
257 complain_overflow_unsigned, /* complain_on_overflow */
258 sh_elf_ignore_reloc, /* special_function */
259 "R_SH_SWITCH32", /* name */
260 false, /* partial_inplace */
263 true), /* pcrel_offset */
265 /* Indicates a .uses pseudo-op. The compiler will generate .uses
266 pseudo-ops when it finds a function call which can be relaxed.
267 The offset field holds the PC relative offset to the instruction
268 which loads the register used in the function call. */
269 HOWTO (R_SH_USES, /* type */
271 1, /* size (0 = byte, 1 = short, 2 = long) */
273 false, /* pc_relative */
275 complain_overflow_unsigned, /* complain_on_overflow */
276 sh_elf_ignore_reloc, /* special_function */
277 "R_SH_USES", /* name */
278 false, /* partial_inplace */
281 true), /* pcrel_offset */
283 /* The assembler will generate this reloc for addresses referred to
284 by the register loads associated with USES relocs. The offset
285 field holds the number of times the address is referenced in the
287 HOWTO (R_SH_COUNT, /* type */
289 1, /* size (0 = byte, 1 = short, 2 = long) */
291 false, /* pc_relative */
293 complain_overflow_unsigned, /* complain_on_overflow */
294 sh_elf_ignore_reloc, /* special_function */
295 "R_SH_COUNT", /* name */
296 false, /* partial_inplace */
299 true), /* pcrel_offset */
301 /* Indicates an alignment statement. The offset field is the power
302 of 2 to which subsequent portions of the object file must be
304 HOWTO (R_SH_ALIGN, /* type */
306 1, /* size (0 = byte, 1 = short, 2 = long) */
308 false, /* pc_relative */
310 complain_overflow_unsigned, /* complain_on_overflow */
311 sh_elf_ignore_reloc, /* special_function */
312 "R_SH_ALIGN", /* name */
313 false, /* partial_inplace */
316 true), /* pcrel_offset */
318 /* The assembler will generate this reloc before a block of
319 instructions. A section should be processed as assumining it
320 contains data, unless this reloc is seen. */
321 HOWTO (R_SH_CODE, /* type */
323 1, /* size (0 = byte, 1 = short, 2 = long) */
325 false, /* pc_relative */
327 complain_overflow_unsigned, /* complain_on_overflow */
328 sh_elf_ignore_reloc, /* special_function */
329 "R_SH_CODE", /* name */
330 false, /* partial_inplace */
333 true), /* pcrel_offset */
335 /* The assembler will generate this reloc after a block of
336 instructions when it sees data that is not instructions. */
337 HOWTO (R_SH_DATA, /* type */
339 1, /* size (0 = byte, 1 = short, 2 = long) */
341 false, /* pc_relative */
343 complain_overflow_unsigned, /* complain_on_overflow */
344 sh_elf_ignore_reloc, /* special_function */
345 "R_SH_DATA", /* name */
346 false, /* partial_inplace */
349 true), /* pcrel_offset */
351 /* The assembler generates this reloc for each label within a block
352 of instructions. This permits the linker to avoid swapping
353 instructions which are the targets of branches. */
354 HOWTO (R_SH_LABEL, /* type */
356 1, /* size (0 = byte, 1 = short, 2 = long) */
358 false, /* pc_relative */
360 complain_overflow_unsigned, /* complain_on_overflow */
361 sh_elf_ignore_reloc, /* special_function */
362 "R_SH_LABEL", /* name */
363 false, /* partial_inplace */
366 true), /* pcrel_offset */
368 /* An 8 bit switch table entry. This is generated for an expression
369 such as ``.word L1 - L2''. The offset holds the difference
370 between the reloc address and L2. */
371 HOWTO (R_SH_SWITCH8, /* type */
373 0, /* size (0 = byte, 1 = short, 2 = long) */
375 false, /* pc_relative */
377 complain_overflow_unsigned, /* complain_on_overflow */
378 sh_elf_ignore_reloc, /* special_function */
379 "R_SH_SWITCH8", /* name */
380 false, /* partial_inplace */
383 true), /* pcrel_offset */
385 /* GNU extension to record C++ vtable hierarchy */
386 HOWTO (R_SH_GNU_VTINHERIT, /* type */
388 2, /* size (0 = byte, 1 = short, 2 = long) */
390 false, /* pc_relative */
392 complain_overflow_dont, /* complain_on_overflow */
393 NULL, /* special_function */
394 "R_SH_GNU_VTINHERIT", /* name */
395 false, /* partial_inplace */
398 false), /* pcrel_offset */
400 /* GNU extension to record C++ vtable member usage */
401 HOWTO (R_SH_GNU_VTENTRY, /* type */
403 2, /* size (0 = byte, 1 = short, 2 = long) */
405 false, /* pc_relative */
407 complain_overflow_dont, /* complain_on_overflow */
408 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
409 "R_SH_GNU_VTENTRY", /* name */
410 false, /* partial_inplace */
413 false), /* pcrel_offset */
417 /* This function is used for normal relocs. This is like the COFF
418 function, and is almost certainly incorrect for other ELF targets. */
420 static bfd_reloc_status_type
421 sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
424 arelent *reloc_entry;
427 asection *input_section;
429 char **error_message;
433 enum elf_sh_reloc_type r_type;
434 bfd_vma addr = reloc_entry->address;
435 bfd_byte *hit_data = addr + (bfd_byte *) data;
437 r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
439 if (output_bfd != NULL)
441 /* Partial linking--do nothing. */
442 reloc_entry->address += input_section->output_offset;
446 /* Almost all relocs have to do with relaxing. If any work must be
447 done for them, it has been done in sh_relax_section. */
448 if (r_type != R_SH_DIR32
449 && (r_type != R_SH_IND12W
450 || (symbol_in->flags & BSF_LOCAL) != 0))
453 if (symbol_in != NULL
454 && bfd_is_und_section (symbol_in->section))
455 return bfd_reloc_undefined;
457 if (bfd_is_com_section (symbol_in->section))
460 sym_value = (symbol_in->value +
461 symbol_in->section->output_section->vma +
462 symbol_in->section->output_offset);
467 insn = bfd_get_32 (abfd, hit_data);
468 insn += sym_value + reloc_entry->addend;
469 bfd_put_32 (abfd, insn, hit_data);
472 insn = bfd_get_16 (abfd, hit_data);
473 sym_value += reloc_entry->addend;
474 sym_value -= (input_section->output_section->vma
475 + input_section->output_offset
478 sym_value += (insn & 0xfff) << 1;
481 insn = (insn & 0xf000) | (sym_value & 0xfff);
482 bfd_put_16 (abfd, insn, hit_data);
483 if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
484 return bfd_reloc_overflow;
494 /* This function is used for relocs which are only used for relaxing,
495 which the linker should otherwise ignore. */
497 static bfd_reloc_status_type
498 sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
499 output_bfd, error_message)
501 arelent *reloc_entry;
504 asection *input_section;
506 char **error_message;
508 if (output_bfd != NULL)
509 reloc_entry->address += input_section->output_offset;
513 /* This structure is used to map BFD reloc codes to SH ELF relocs. */
517 bfd_reloc_code_real_type bfd_reloc_val;
518 unsigned char elf_reloc_val;
521 /* An array mapping BFD reloc codes to SH ELF relocs. */
523 static const struct elf_reloc_map sh_reloc_map[] =
525 { BFD_RELOC_NONE, R_SH_NONE },
526 { BFD_RELOC_32, R_SH_DIR32 },
527 { BFD_RELOC_CTOR, R_SH_DIR32 },
528 { BFD_RELOC_32_PCREL, R_SH_REL32 },
529 { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
530 { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
531 { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
532 { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
533 { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
534 { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
535 { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
536 { BFD_RELOC_SH_USES, R_SH_USES },
537 { BFD_RELOC_SH_COUNT, R_SH_COUNT },
538 { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
539 { BFD_RELOC_SH_CODE, R_SH_CODE },
540 { BFD_RELOC_SH_DATA, R_SH_DATA },
541 { BFD_RELOC_SH_LABEL, R_SH_LABEL },
542 { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
543 { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
546 /* Given a BFD reloc code, return the howto structure for the
547 corresponding SH ELf reloc. */
549 static reloc_howto_type *
550 sh_elf_reloc_type_lookup (abfd, code)
552 bfd_reloc_code_real_type code;
556 for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
558 if (sh_reloc_map[i].bfd_reloc_val == code)
559 return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
565 /* Given an ELF reloc, fill in the howto field of a relent. */
568 sh_elf_info_to_howto (abfd, cache_ptr, dst)
571 Elf_Internal_Rela *dst;
575 r = ELF32_R_TYPE (dst->r_info);
577 BFD_ASSERT (r < (unsigned int) R_SH_max);
578 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
580 cache_ptr->howto = &sh_elf_howto_table[r];
583 /* This function handles relaxing for SH ELF. See the corresponding
584 function in coff-sh.c for a description of what this does. FIXME:
585 There is a lot of duplication here between this code and the COFF
586 specific code. The format of relocs and symbols is wound deeply
587 into this code, but it would still be better if the duplication
588 could be eliminated somehow. Note in particular that although both
589 functions use symbols like R_SH_CODE, those symbols have different
590 values; in coff-sh.c they come from include/coff/sh.h, whereas here
591 they come from enum elf_sh_reloc_type in include/elf/sh.h. */
594 sh_elf_relax_section (abfd, sec, link_info, again)
597 struct bfd_link_info *link_info;
600 Elf_Internal_Shdr *symtab_hdr;
601 Elf_Internal_Rela *internal_relocs;
602 Elf_Internal_Rela *free_relocs = NULL;
604 Elf_Internal_Rela *irel, *irelend;
605 bfd_byte *contents = NULL;
606 bfd_byte *free_contents = NULL;
607 Elf32_External_Sym *extsyms = NULL;
608 Elf32_External_Sym *free_extsyms = NULL;
612 if (link_info->relocateable
613 || (sec->flags & SEC_RELOC) == 0
614 || sec->reloc_count == 0)
617 /* If this is the first time we have been called for this section,
618 initialize the cooked size. */
619 if (sec->_cooked_size == 0)
620 sec->_cooked_size = sec->_raw_size;
622 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
624 internal_relocs = (_bfd_elf32_link_read_relocs
625 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
626 link_info->keep_memory));
627 if (internal_relocs == NULL)
629 if (! link_info->keep_memory)
630 free_relocs = internal_relocs;
634 irelend = internal_relocs + sec->reloc_count;
635 for (irel = internal_relocs; irel < irelend; irel++)
637 bfd_vma laddr, paddr, symval;
639 Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
642 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
645 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
648 /* Get the section contents. */
649 if (contents == NULL)
651 if (elf_section_data (sec)->this_hdr.contents != NULL)
652 contents = elf_section_data (sec)->this_hdr.contents;
655 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
656 if (contents == NULL)
658 free_contents = contents;
660 if (! bfd_get_section_contents (abfd, sec, contents,
661 (file_ptr) 0, sec->_raw_size))
666 /* The r_addend field of the R_SH_USES reloc will point us to
667 the register load. The 4 is because the r_addend field is
668 computed as though it were a jump offset, which are based
669 from 4 bytes after the jump instruction. */
670 laddr = irel->r_offset + 4 + irel->r_addend;
671 if (laddr >= sec->_raw_size)
673 (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
674 bfd_get_filename (abfd),
675 (unsigned long) irel->r_offset);
678 insn = bfd_get_16 (abfd, contents + laddr);
680 /* If the instruction is not mov.l NN,rN, we don't know what to
682 if ((insn & 0xf000) != 0xd000)
684 ((*_bfd_error_handler)
685 (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
686 bfd_get_filename (abfd), (unsigned long) irel->r_offset, insn));
690 /* Get the address from which the register is being loaded. The
691 displacement in the mov.l instruction is quadrupled. It is a
692 displacement from four bytes after the movl instruction, but,
693 before adding in the PC address, two least significant bits
694 of the PC are cleared. We assume that the section is aligned
695 on a four byte boundary. */
698 paddr += (laddr + 4) &~ 3;
699 if (paddr >= sec->_raw_size)
701 ((*_bfd_error_handler)
702 (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
703 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
707 /* Get the reloc for the address from which the register is
708 being loaded. This reloc will tell us which function is
709 actually being called. */
710 for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
711 if (irelfn->r_offset == paddr
712 && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
714 if (irelfn >= irelend)
716 ((*_bfd_error_handler)
717 (_("%s: 0x%lx: warning: could not find expected reloc"),
718 bfd_get_filename (abfd), (unsigned long) paddr));
722 /* Read this BFD's symbols if we haven't done so already. */
725 if (symtab_hdr->contents != NULL)
726 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
729 extsyms = ((Elf32_External_Sym *)
730 bfd_malloc (symtab_hdr->sh_size));
733 free_extsyms = extsyms;
734 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
735 || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
736 != symtab_hdr->sh_size))
741 /* Get the value of the symbol referred to by the reloc. */
742 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
744 Elf_Internal_Sym isym;
746 /* A local symbol. */
747 bfd_elf32_swap_symbol_in (abfd,
748 extsyms + ELF32_R_SYM (irelfn->r_info),
751 if (isym.st_shndx != _bfd_elf_section_from_bfd_section (abfd, sec))
753 ((*_bfd_error_handler)
754 (_("%s: 0x%lx: warning: symbol in unexpected section"),
755 bfd_get_filename (abfd), (unsigned long) paddr));
759 symval = (isym.st_value
760 + sec->output_section->vma
761 + sec->output_offset);
766 struct elf_link_hash_entry *h;
768 indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
769 h = elf_sym_hashes (abfd)[indx];
770 BFD_ASSERT (h != NULL);
771 if (h->root.type != bfd_link_hash_defined
772 && h->root.type != bfd_link_hash_defweak)
774 /* This appears to be a reference to an undefined
775 symbol. Just ignore it--it will be caught by the
776 regular reloc processing. */
780 symval = (h->root.u.def.value
781 + h->root.u.def.section->output_section->vma
782 + h->root.u.def.section->output_offset);
785 symval += bfd_get_32 (abfd, contents + paddr);
787 /* See if this function call can be shortened. */
790 + sec->output_section->vma
793 if (foff < -0x1000 || foff >= 0x1000)
795 /* After all that work, we can't shorten this function call. */
799 /* Shorten the function call. */
801 /* For simplicity of coding, we are going to modify the section
802 contents, the section relocs, and the BFD symbol table. We
803 must tell the rest of the code not to free up this
804 information. It would be possible to instead create a table
805 of changes which have to be made, as is done in coff-mips.c;
806 that would be more work, but would require less memory when
807 the linker is run. */
809 elf_section_data (sec)->relocs = internal_relocs;
812 elf_section_data (sec)->this_hdr.contents = contents;
813 free_contents = NULL;
815 symtab_hdr->contents = (bfd_byte *) extsyms;
818 /* Replace the jsr with a bsr. */
820 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
821 replace the jsr with a bsr. */
822 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
823 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
825 /* If this needs to be changed because of future relaxing,
826 it will be handled here like other internal IND12W
829 0xb000 | ((foff >> 1) & 0xfff),
830 contents + irel->r_offset);
834 /* We can't fully resolve this yet, because the external
835 symbol value may be changed by future relaxing. We let
836 the final link phase handle it. */
837 bfd_put_16 (abfd, 0xb000, contents + irel->r_offset);
840 /* See if there is another R_SH_USES reloc referring to the same
842 for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
843 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
844 && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
846 if (irelscan < irelend)
848 /* Some other function call depends upon this register load,
849 and we have not yet converted that function call.
850 Indeed, we may never be able to convert it. There is
851 nothing else we can do at this point. */
855 /* Look for a R_SH_COUNT reloc on the location where the
856 function address is stored. Do this before deleting any
857 bytes, to avoid confusion about the address. */
858 for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
859 if (irelcount->r_offset == paddr
860 && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
863 /* Delete the register load. */
864 if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
867 /* That will change things, so, just in case it permits some
868 other function call to come within range, we should relax
869 again. Note that this is not required, and it may be slow. */
872 /* Now check whether we got a COUNT reloc. */
873 if (irelcount >= irelend)
875 ((*_bfd_error_handler)
876 (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
877 bfd_get_filename (abfd), (unsigned long) paddr));
881 /* The number of uses is stored in the r_addend field. We've
883 if (irelcount->r_addend == 0)
885 ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
886 bfd_get_filename (abfd),
887 (unsigned long) paddr));
891 --irelcount->r_addend;
893 /* If there are no more uses, we can delete the address. Reload
894 the address from irelfn, in case it was changed by the
895 previous call to sh_elf_relax_delete_bytes. */
896 if (irelcount->r_addend == 0)
898 if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
902 /* We've done all we can with that function call. */
905 /* Look for load and store instructions that we can align on four
911 /* Get the section contents. */
912 if (contents == NULL)
914 if (elf_section_data (sec)->this_hdr.contents != NULL)
915 contents = elf_section_data (sec)->this_hdr.contents;
918 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
919 if (contents == NULL)
921 free_contents = contents;
923 if (! bfd_get_section_contents (abfd, sec, contents,
924 (file_ptr) 0, sec->_raw_size))
929 if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
935 elf_section_data (sec)->relocs = internal_relocs;
938 elf_section_data (sec)->this_hdr.contents = contents;
939 free_contents = NULL;
941 symtab_hdr->contents = (bfd_byte *) extsyms;
946 if (free_relocs != NULL)
952 if (free_contents != NULL)
954 if (! link_info->keep_memory)
955 free (free_contents);
958 /* Cache the section contents for elf_link_input_bfd. */
959 elf_section_data (sec)->this_hdr.contents = contents;
961 free_contents = NULL;
964 if (free_extsyms != NULL)
966 if (! link_info->keep_memory)
970 /* Cache the symbols for elf_link_input_bfd. */
971 symtab_hdr->contents = extsyms;
979 if (free_relocs != NULL)
981 if (free_contents != NULL)
982 free (free_contents);
983 if (free_extsyms != NULL)
988 /* Delete some bytes from a section while relaxing. FIXME: There is a
989 lot of duplication between this function and sh_relax_delete_bytes
993 sh_elf_relax_delete_bytes (abfd, sec, addr, count)
999 Elf_Internal_Shdr *symtab_hdr;
1000 Elf32_External_Sym *extsyms;
1003 Elf_Internal_Rela *irel, *irelend;
1004 Elf_Internal_Rela *irelalign;
1006 Elf32_External_Sym *esym, *esymend;
1007 struct elf_link_hash_entry *sym_hash;
1010 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1011 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1013 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1015 contents = elf_section_data (sec)->this_hdr.contents;
1017 /* The deletion must stop at the next ALIGN reloc for an aligment
1018 power larger than the number of bytes we are deleting. */
1021 toaddr = sec->_cooked_size;
1023 irel = elf_section_data (sec)->relocs;
1024 irelend = irel + sec->reloc_count;
1025 for (; irel < irelend; irel++)
1027 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1028 && irel->r_offset > addr
1029 && count < (1 << irel->r_addend))
1032 toaddr = irel->r_offset;
1037 /* Actually delete the bytes. */
1038 memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1039 if (irelalign == NULL)
1040 sec->_cooked_size -= count;
1045 #define NOP_OPCODE (0x0009)
1047 BFD_ASSERT ((count & 1) == 0);
1048 for (i = 0; i < count; i += 2)
1049 bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
1052 /* Adjust all the relocs. */
1053 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1055 bfd_vma nraddr, stop;
1058 Elf_Internal_Sym sym;
1059 int off, adjust, oinsn;
1060 bfd_signed_vma voff = 0;
1063 /* Get the new reloc address. */
1064 nraddr = irel->r_offset;
1065 if ((irel->r_offset > addr
1066 && irel->r_offset < toaddr)
1067 || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1068 && irel->r_offset == toaddr))
1071 /* See if this reloc was for the bytes we have deleted, in which
1072 case we no longer care about it. Don't delete relocs which
1073 represent addresses, though. */
1074 if (irel->r_offset >= addr
1075 && irel->r_offset < addr + count
1076 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
1077 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
1078 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
1079 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
1080 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1083 /* If this is a PC relative reloc, see if the range it covers
1084 includes the bytes we have deleted. */
1085 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1094 start = irel->r_offset;
1095 insn = bfd_get_16 (abfd, contents + nraddr);
1099 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1102 start = stop = addr;
1106 /* If this reloc is against a symbol defined in this
1107 section, and the symbol will not be adjusted below, we
1108 must check the addend to see it will put the value in
1109 range to be adjusted, and hence must be changed. */
1110 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1112 bfd_elf32_swap_symbol_in (abfd,
1113 extsyms + ELF32_R_SYM (irel->r_info),
1115 if (sym.st_shndx == shndx
1116 && (sym.st_value <= addr
1117 || sym.st_value >= toaddr))
1121 val = bfd_get_32 (abfd, contents + nraddr);
1122 val += sym.st_value;
1123 if (val > addr && val < toaddr)
1124 bfd_put_32 (abfd, val - count, contents + nraddr);
1127 start = stop = addr;
1134 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1138 if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
1139 start = stop = addr;
1145 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1151 stop = start + 4 + off * 2;
1156 stop = (start &~ (bfd_vma) 3) + 4 + off * 4;
1162 /* These relocs types represent
1164 The r_offset field holds the difference between the reloc
1165 address and L1. That is the start of the reloc, and
1166 adding in the contents gives us the top. We must adjust
1167 both the r_offset field and the section contents. */
1169 start = irel->r_offset;
1170 stop = (bfd_vma) ((bfd_signed_vma) start - (long) irel->r_addend);
1174 && (stop <= addr || stop >= toaddr))
1175 irel->r_addend += count;
1176 else if (stop > addr
1178 && (start <= addr || start >= toaddr))
1179 irel->r_addend -= count;
1183 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1184 voff = bfd_get_signed_16 (abfd, contents + nraddr);
1185 else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1186 voff = bfd_get_8 (abfd, contents + nraddr);
1188 voff = bfd_get_signed_32 (abfd, contents + nraddr);
1189 stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1194 start = irel->r_offset;
1195 stop = (bfd_vma) ((bfd_signed_vma) start
1196 + (long) irel->r_addend
1203 && (stop <= addr || stop >= toaddr))
1205 else if (stop > addr
1207 && (start <= addr || start >= toaddr))
1216 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1225 if ((oinsn & 0xff00) != (insn & 0xff00))
1227 bfd_put_16 (abfd, insn, contents + nraddr);
1232 if ((oinsn & 0xf000) != (insn & 0xf000))
1234 bfd_put_16 (abfd, insn, contents + nraddr);
1238 BFD_ASSERT (adjust == count || count >= 4);
1243 if ((irel->r_offset & 3) == 0)
1246 if ((oinsn & 0xff00) != (insn & 0xff00))
1248 bfd_put_16 (abfd, insn, contents + nraddr);
1253 if (voff < - 0x8000 || voff >= 0x8000)
1255 bfd_put_signed_16 (abfd, voff, contents + nraddr);
1260 bfd_put_signed_32 (abfd, voff, contents + nraddr);
1264 irel->r_addend += adjust;
1270 ((*_bfd_error_handler)
1271 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1272 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1273 bfd_set_error (bfd_error_bad_value);
1278 irel->r_offset = nraddr;
1281 /* Look through all the other sections. If there contain any IMM32
1282 relocs against internal symbols which we are not going to adjust
1283 below, we may need to adjust the addends. */
1284 for (o = abfd->sections; o != NULL; o = o->next)
1286 Elf_Internal_Rela *internal_relocs;
1287 Elf_Internal_Rela *irelscan, *irelscanend;
1288 bfd_byte *ocontents;
1291 || (o->flags & SEC_RELOC) == 0
1292 || o->reloc_count == 0)
1295 /* We always cache the relocs. Perhaps, if info->keep_memory is
1296 false, we should free them, if we are permitted to, when we
1297 leave sh_coff_relax_section. */
1298 internal_relocs = (_bfd_elf32_link_read_relocs
1299 (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1301 if (internal_relocs == NULL)
1305 irelscanend = internal_relocs + o->reloc_count;
1306 for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1308 Elf_Internal_Sym sym;
1310 if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1313 if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1316 bfd_elf32_swap_symbol_in (abfd,
1317 extsyms + ELF32_R_SYM (irelscan->r_info),
1320 if (sym.st_shndx == shndx
1321 && (sym.st_value <= addr
1322 || sym.st_value >= toaddr))
1326 if (ocontents == NULL)
1328 if (elf_section_data (o)->this_hdr.contents != NULL)
1329 ocontents = elf_section_data (o)->this_hdr.contents;
1332 /* We always cache the section contents.
1333 Perhaps, if info->keep_memory is false, we
1334 should free them, if we are permitted to,
1335 when we leave sh_coff_relax_section. */
1336 ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1337 if (ocontents == NULL)
1339 if (! bfd_get_section_contents (abfd, o, ocontents,
1343 elf_section_data (o)->this_hdr.contents = ocontents;
1347 val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1348 val += sym.st_value;
1349 if (val > addr && val < toaddr)
1350 bfd_put_32 (abfd, val - count,
1351 ocontents + irelscan->r_offset);
1356 /* Adjust the local symbols defined in this section. */
1358 esymend = esym + symtab_hdr->sh_info;
1359 for (; esym < esymend; esym++)
1361 Elf_Internal_Sym isym;
1363 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1365 if (isym.st_shndx == shndx
1366 && isym.st_value > addr
1367 && isym.st_value < toaddr)
1369 isym.st_value -= count;
1370 bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1374 /* Now adjust the global symbols defined in this section. */
1375 esym = extsyms + symtab_hdr->sh_info;
1376 esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1377 for (index = 0; esym < esymend; esym++, index++)
1379 Elf_Internal_Sym isym;
1381 bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1382 sym_hash = elf_sym_hashes (abfd)[index];
1383 if (isym.st_shndx == shndx
1384 && ((sym_hash)->root.type == bfd_link_hash_defined
1385 || (sym_hash)->root.type == bfd_link_hash_defweak)
1386 && (sym_hash)->root.u.def.section == sec
1387 && (sym_hash)->root.u.def.value > addr
1388 && (sym_hash)->root.u.def.value < toaddr)
1390 (sym_hash)->root.u.def.value -= count;
1394 /* See if we can move the ALIGN reloc forward. We have adjusted
1395 r_offset for it already. */
1396 if (irelalign != NULL)
1398 bfd_vma alignto, alignaddr;
1400 alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1401 alignaddr = BFD_ALIGN (irelalign->r_offset,
1402 1 << irelalign->r_addend);
1403 if (alignto != alignaddr)
1405 /* Tail recursion. */
1406 return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1407 alignto - alignaddr);
1414 /* Look for loads and stores which we can align to four byte
1415 boundaries. This is like sh_align_loads in coff-sh.c. */
1418 sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped)
1421 Elf_Internal_Rela *internal_relocs;
1425 Elf_Internal_Rela *irel, *irelend;
1426 bfd_vma *labels = NULL;
1427 bfd_vma *label, *label_end;
1431 irelend = internal_relocs + sec->reloc_count;
1433 /* Get all the addresses with labels on them. */
1434 labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
1438 for (irel = internal_relocs; irel < irelend; irel++)
1440 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1442 *label_end = irel->r_offset;
1447 /* Note that the assembler currently always outputs relocs in
1448 address order. If that ever changes, this code will need to sort
1449 the label values and the relocs. */
1453 for (irel = internal_relocs; irel < irelend; irel++)
1455 bfd_vma start, stop;
1457 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1460 start = irel->r_offset;
1462 for (irel++; irel < irelend; irel++)
1463 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1466 stop = irel->r_offset;
1468 stop = sec->_cooked_size;
1470 if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1471 (PTR) internal_relocs, &label,
1472 label_end, start, stop, pswapped))
1486 /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */
1489 sh_elf_swap_insns (abfd, sec, relocs, contents, addr)
1496 Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1497 unsigned short i1, i2;
1498 Elf_Internal_Rela *irel, *irelend;
1500 /* Swap the instructions themselves. */
1501 i1 = bfd_get_16 (abfd, contents + addr);
1502 i2 = bfd_get_16 (abfd, contents + addr + 2);
1503 bfd_put_16 (abfd, i2, contents + addr);
1504 bfd_put_16 (abfd, i1, contents + addr + 2);
1506 /* Adjust all reloc addresses. */
1507 irelend = internal_relocs + sec->reloc_count;
1508 for (irel = internal_relocs; irel < irelend; irel++)
1510 enum elf_sh_reloc_type type;
1513 /* There are a few special types of relocs that we don't want to
1514 adjust. These relocs do not apply to the instruction itself,
1515 but are only associated with the address. */
1516 type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1517 if (type == R_SH_ALIGN
1518 || type == R_SH_CODE
1519 || type == R_SH_DATA
1520 || type == R_SH_LABEL)
1523 /* If an R_SH_USES reloc points to one of the addresses being
1524 swapped, we must adjust it. It would be incorrect to do this
1525 for a jump, though, since we want to execute both
1526 instructions after the jump. (We have avoided swapping
1527 around a label, so the jump will not wind up executing an
1528 instruction it shouldn't). */
1529 if (type == R_SH_USES)
1533 off = irel->r_offset + 4 + irel->r_addend;
1535 irel->r_offset += 2;
1536 else if (off == addr + 2)
1537 irel->r_offset -= 2;
1540 if (irel->r_offset == addr)
1542 irel->r_offset += 2;
1545 else if (irel->r_offset == addr + 2)
1547 irel->r_offset -= 2;
1556 unsigned short insn, oinsn;
1559 loc = contents + irel->r_offset;
1568 insn = bfd_get_16 (abfd, loc);
1571 if ((oinsn & 0xff00) != (insn & 0xff00))
1573 bfd_put_16 (abfd, insn, loc);
1577 insn = bfd_get_16 (abfd, loc);
1580 if ((oinsn & 0xf000) != (insn & 0xf000))
1582 bfd_put_16 (abfd, insn, loc);
1586 /* This reloc ignores the least significant 3 bits of
1587 the program counter before adding in the offset.
1588 This means that if ADDR is at an even address, the
1589 swap will not affect the offset. If ADDR is an at an
1590 odd address, then the instruction will be crossing a
1591 four byte boundary, and must be adjusted. */
1592 if ((addr & 3) != 0)
1594 insn = bfd_get_16 (abfd, loc);
1597 if ((oinsn & 0xff00) != (insn & 0xff00))
1599 bfd_put_16 (abfd, insn, loc);
1607 ((*_bfd_error_handler)
1608 (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1609 bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1610 bfd_set_error (bfd_error_bad_value);
1619 /* Relocate an SH ELF section. */
1622 sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1623 contents, relocs, local_syms, local_sections)
1625 struct bfd_link_info *info;
1627 asection *input_section;
1629 Elf_Internal_Rela *relocs;
1630 Elf_Internal_Sym *local_syms;
1631 asection **local_sections;
1633 Elf_Internal_Shdr *symtab_hdr;
1634 struct elf_link_hash_entry **sym_hashes;
1635 Elf_Internal_Rela *rel, *relend;
1637 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1638 sym_hashes = elf_sym_hashes (input_bfd);
1641 relend = relocs + input_section->reloc_count;
1642 for (; rel < relend; rel++)
1645 reloc_howto_type *howto;
1646 unsigned long r_symndx;
1647 Elf_Internal_Sym *sym;
1649 struct elf_link_hash_entry *h;
1651 bfd_vma addend = (bfd_vma)0;
1652 bfd_reloc_status_type r;
1654 r_symndx = ELF32_R_SYM (rel->r_info);
1656 if (info->relocateable)
1658 /* This is a relocateable link. We don't have to change
1659 anything, unless the reloc is against a section symbol,
1660 in which case we have to adjust according to where the
1661 section symbol winds up in the output section. */
1662 if (r_symndx < symtab_hdr->sh_info)
1664 sym = local_syms + r_symndx;
1665 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1667 sec = local_sections[r_symndx];
1668 rel->r_addend += sec->output_offset + sym->st_value;
1675 r_type = ELF32_R_TYPE (rel->r_info);
1677 /* Many of the relocs are only used for relaxing, and are
1678 handled entirely by the relaxation code. */
1679 if (r_type > (int) R_SH_LAST_INVALID_RELOC)
1683 || r_type >= (int) R_SH_FIRST_INVALID_RELOC)
1685 bfd_set_error (bfd_error_bad_value);
1689 /* FIXME: This is certainly incorrect. However, it is how the
1690 COFF linker works. */
1691 if (r_type != (int) R_SH_DIR32
1692 && r_type != (int) R_SH_IND12W)
1695 howto = sh_elf_howto_table + r_type;
1697 /* This is a final link. */
1701 if (r_symndx < symtab_hdr->sh_info)
1703 /* There is nothing to be done for an internal IND12W
1704 relocation. FIXME: This is probably wrong, but it's how
1705 the COFF relocations work. */
1706 if (r_type == (int) R_SH_IND12W)
1708 sym = local_syms + r_symndx;
1709 sec = local_sections[r_symndx];
1710 relocation = (sec->output_section->vma
1711 + sec->output_offset
1716 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1717 while (h->root.type == bfd_link_hash_indirect
1718 || h->root.type == bfd_link_hash_warning)
1719 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1720 if (h->root.type == bfd_link_hash_defined
1721 || h->root.type == bfd_link_hash_defweak)
1723 sec = h->root.u.def.section;
1724 relocation = (h->root.u.def.value
1725 + sec->output_section->vma
1726 + sec->output_offset);
1728 else if (h->root.type == bfd_link_hash_undefweak)
1732 if (! ((*info->callbacks->undefined_symbol)
1733 (info, h->root.root.string, input_bfd,
1734 input_section, rel->r_offset)))
1740 /* FIXME: This is how the COFF relocations work. */
1741 if (r_type == (int) R_SH_IND12W)
1744 switch ((int)r_type)
1746 case (int)R_SH_DIR32:
1747 addend = rel->r_addend;
1751 /* COFF relocs don't use the addend. The addend is used for R_SH_DIR32
1752 to be compatible with other compilers. */
1753 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1754 contents, rel->r_offset,
1755 relocation, addend);
1757 if (r != bfd_reloc_ok)
1762 case bfd_reloc_outofrange:
1764 case bfd_reloc_overflow:
1769 name = h->root.root.string;
1772 name = (bfd_elf_string_from_elf_section
1773 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1777 name = bfd_section_name (input_bfd, sec);
1779 if (! ((*info->callbacks->reloc_overflow)
1780 (info, name, howto->name, (bfd_vma) 0,
1781 input_bfd, input_section, rel->r_offset)))
1792 /* This is a version of bfd_generic_get_relocated_section_contents
1793 which uses sh_elf_relocate_section. */
1796 sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1797 data, relocateable, symbols)
1799 struct bfd_link_info *link_info;
1800 struct bfd_link_order *link_order;
1802 boolean relocateable;
1805 Elf_Internal_Shdr *symtab_hdr;
1806 asection *input_section = link_order->u.indirect.section;
1807 bfd *input_bfd = input_section->owner;
1808 asection **sections = NULL;
1809 Elf_Internal_Rela *internal_relocs = NULL;
1810 Elf32_External_Sym *external_syms = NULL;
1811 Elf_Internal_Sym *internal_syms = NULL;
1813 /* We only need to handle the case of relaxing, or of having a
1814 particular set of section contents, specially. */
1816 || elf_section_data (input_section)->this_hdr.contents == NULL)
1817 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1822 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1824 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1825 input_section->_raw_size);
1827 if ((input_section->flags & SEC_RELOC) != 0
1828 && input_section->reloc_count > 0)
1830 Elf_Internal_Sym *isymp;
1832 Elf32_External_Sym *esym, *esymend;
1834 if (symtab_hdr->contents != NULL)
1835 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1838 external_syms = ((Elf32_External_Sym *)
1839 bfd_malloc (symtab_hdr->sh_info
1840 * sizeof (Elf32_External_Sym)));
1841 if (external_syms == NULL && symtab_hdr->sh_info > 0)
1843 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1844 || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
1845 symtab_hdr->sh_info, input_bfd)
1846 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
1850 internal_relocs = (_bfd_elf32_link_read_relocs
1851 (input_bfd, input_section, (PTR) NULL,
1852 (Elf_Internal_Rela *) NULL, false));
1853 if (internal_relocs == NULL)
1856 internal_syms = ((Elf_Internal_Sym *)
1857 bfd_malloc (symtab_hdr->sh_info
1858 * sizeof (Elf_Internal_Sym)));
1859 if (internal_syms == NULL && symtab_hdr->sh_info > 0)
1862 sections = (asection **) bfd_malloc (symtab_hdr->sh_info
1863 * sizeof (asection *));
1864 if (sections == NULL && symtab_hdr->sh_info > 0)
1867 isymp = internal_syms;
1869 esym = external_syms;
1870 esymend = esym + symtab_hdr->sh_info;
1871 for (; esym < esymend; ++esym, ++isymp, ++secpp)
1875 bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
1877 if (isymp->st_shndx == SHN_UNDEF)
1878 isec = bfd_und_section_ptr;
1879 else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
1880 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1881 else if (isymp->st_shndx == SHN_ABS)
1882 isec = bfd_abs_section_ptr;
1883 else if (isymp->st_shndx == SHN_COMMON)
1884 isec = bfd_com_section_ptr;
1894 if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
1895 input_section, data, internal_relocs,
1896 internal_syms, sections))
1899 if (sections != NULL)
1902 if (internal_syms != NULL)
1903 free (internal_syms);
1904 internal_syms = NULL;
1905 if (external_syms != NULL && symtab_hdr->contents == NULL)
1906 free (external_syms);
1907 external_syms = NULL;
1908 if (internal_relocs != elf_section_data (input_section)->relocs)
1909 free (internal_relocs);
1910 internal_relocs = NULL;
1916 if (internal_relocs != NULL
1917 && internal_relocs != elf_section_data (input_section)->relocs)
1918 free (internal_relocs);
1919 if (external_syms != NULL && symtab_hdr->contents == NULL)
1920 free (external_syms);
1921 if (internal_syms != NULL)
1922 free (internal_syms);
1923 if (sections != NULL)
1928 sh_elf_gc_mark_hook (abfd, info, rel, h, sym)
1930 struct bfd_link_info *info;
1931 Elf_Internal_Rela *rel;
1932 struct elf_link_hash_entry *h;
1933 Elf_Internal_Sym *sym;
1937 switch (ELF32_R_TYPE (rel->r_info))
1939 case R_SH_GNU_VTINHERIT:
1940 case R_SH_GNU_VTENTRY:
1944 switch (h->root.type)
1946 case bfd_link_hash_defined:
1947 case bfd_link_hash_defweak:
1948 return h->root.u.def.section;
1950 case bfd_link_hash_common:
1951 return h->root.u.c.p->section;
1957 if (!(elf_bad_symtab (abfd)
1958 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1959 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1960 && sym->st_shndx != SHN_COMMON))
1962 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1969 sh_elf_gc_sweep_hook (abfd, info, sec, relocs)
1971 struct bfd_link_info *info;
1973 const Elf_Internal_Rela *relocs;
1975 /* we don't use got and plt entries for sh. */
1979 /* Look through the relocs for a section during the first phase.
1980 Since we don't do .gots or .plts, we just need to consider the
1981 virtual table relocs for gc. */
1984 sh_elf_check_relocs (abfd, info, sec, relocs)
1986 struct bfd_link_info *info;
1988 const Elf_Internal_Rela *relocs;
1990 Elf_Internal_Shdr *symtab_hdr;
1991 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
1992 const Elf_Internal_Rela *rel;
1993 const Elf_Internal_Rela *rel_end;
1995 if (info->relocateable)
1998 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1999 sym_hashes = elf_sym_hashes (abfd);
2000 sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
2001 if (!elf_bad_symtab (abfd))
2002 sym_hashes_end -= symtab_hdr->sh_info;
2004 rel_end = relocs + sec->reloc_count;
2005 for (rel = relocs; rel < rel_end; rel++)
2007 struct elf_link_hash_entry *h;
2008 unsigned long r_symndx;
2010 r_symndx = ELF32_R_SYM (rel->r_info);
2011 if (r_symndx < symtab_hdr->sh_info)
2014 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2016 switch (ELF32_R_TYPE (rel->r_info))
2018 /* This relocation describes the C++ object vtable hierarchy.
2019 Reconstruct it for later use during GC. */
2020 case R_SH_GNU_VTINHERIT:
2021 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2025 /* This relocation describes which C++ vtable entries are actually
2026 used. Record for later use during GC. */
2027 case R_SH_GNU_VTENTRY:
2028 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2037 #define TARGET_BIG_SYM bfd_elf32_sh_vec
2038 #define TARGET_BIG_NAME "elf32-sh"
2039 #define TARGET_LITTLE_SYM bfd_elf32_shl_vec
2040 #define TARGET_LITTLE_NAME "elf32-shl"
2041 #define ELF_ARCH bfd_arch_sh
2042 #define ELF_MACHINE_CODE EM_SH
2043 #define ELF_MAXPAGESIZE 0x1
2045 #define elf_symbol_leading_char '_'
2047 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
2048 #define elf_info_to_howto sh_elf_info_to_howto
2049 #define bfd_elf32_bfd_relax_section sh_elf_relax_section
2050 #define elf_backend_relocate_section sh_elf_relocate_section
2051 #define bfd_elf32_bfd_get_relocated_section_contents \
2052 sh_elf_get_relocated_section_contents
2053 #define bfd_elf32_bfd_merge_private_bfd_data \
2054 _bfd_generic_verify_endian_match
2056 #define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
2057 #define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
2058 #define elf_backend_check_relocs sh_elf_check_relocs
2060 #define elf_backend_can_gc_sections 1
2061 #include "elf32-target.h"