1 /* BFD back-end for Renesas H8/300 ELF binaries.
2 Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
28 static reloc_howto_type *elf32_h8_reloc_type_lookup
29 (bfd *abfd, bfd_reloc_code_real_type code);
30 static void elf32_h8_info_to_howto
31 (bfd *, arelent *, Elf_Internal_Rela *);
32 static void elf32_h8_info_to_howto_rel
33 (bfd *, arelent *, Elf_Internal_Rela *);
34 static unsigned long elf32_h8_mach (flagword);
35 static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
36 static bfd_boolean elf32_h8_object_p (bfd *);
37 static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
38 static bfd_boolean elf32_h8_relax_section
39 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
40 static bfd_boolean elf32_h8_relax_delete_bytes
41 (bfd *, asection *, bfd_vma, int);
42 static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
43 static bfd_byte *elf32_h8_get_relocated_section_contents
44 (bfd *, struct bfd_link_info *, struct bfd_link_order *,
45 bfd_byte *, bfd_boolean, asymbol **);
46 static bfd_reloc_status_type elf32_h8_final_link_relocate
47 (unsigned long, bfd *, bfd *, asection *,
48 bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
49 struct bfd_link_info *, asection *, int);
50 static bfd_boolean elf32_h8_relocate_section
51 (bfd *, struct bfd_link_info *, bfd *, asection *,
52 bfd_byte *, Elf_Internal_Rela *,
53 Elf_Internal_Sym *, asection **);
54 static bfd_reloc_status_type special
55 (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
57 /* This does not include any relocation information, but should be
58 good enough for GDB or objdump to read the file. */
60 static reloc_howto_type h8_elf_howto_table[] = {
62 HOWTO (R_H8_NONE, /* type */
64 0, /* size (0 = byte, 1 = short, 2 = long) */
66 FALSE, /* pc_relative */
68 complain_overflow_dont,/* complain_on_overflow */
69 special, /* special_function */
70 "R_H8_NONE", /* name */
71 FALSE, /* partial_inplace */
74 FALSE), /* pcrel_offset */
75 #define R_H8_DIR32_X (R_H8_NONE_X + 1)
76 HOWTO (R_H8_DIR32, /* type */
78 2, /* size (0 = byte, 1 = short, 2 = long) */
80 FALSE, /* pc_relative */
82 complain_overflow_dont,/* complain_on_overflow */
83 special, /* special_function */
84 "R_H8_DIR32", /* name */
85 FALSE, /* partial_inplace */
87 0xffffffff, /* dst_mask */
88 FALSE), /* pcrel_offset */
89 #define R_H8_DIR16_X (R_H8_DIR32_X + 1)
90 HOWTO (R_H8_DIR16, /* type */
92 1, /* size (0 = byte, 1 = short, 2 = long) */
94 FALSE, /* pc_relative */
96 complain_overflow_dont,/* complain_on_overflow */
97 special, /* special_function */
98 "R_H8_DIR16", /* name */
99 FALSE, /* partial_inplace */
101 0x0000ffff, /* dst_mask */
102 FALSE), /* pcrel_offset */
103 #define R_H8_DIR8_X (R_H8_DIR16_X + 1)
104 HOWTO (R_H8_DIR8, /* type */
106 0, /* size (0 = byte, 1 = short, 2 = long) */
108 FALSE, /* pc_relative */
110 complain_overflow_dont,/* complain_on_overflow */
111 special, /* special_function */
112 "R_H8_DIR8", /* name */
113 FALSE, /* partial_inplace */
115 0x000000ff, /* dst_mask */
116 FALSE), /* pcrel_offset */
117 #define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
118 HOWTO (R_H8_DIR16A8, /* type */
120 1, /* size (0 = byte, 1 = short, 2 = long) */
122 FALSE, /* pc_relative */
124 complain_overflow_bitfield, /* complain_on_overflow */
125 special, /* special_function */
126 "R_H8_DIR16A8", /* name */
127 FALSE, /* partial_inplace */
129 0x0000ffff, /* dst_mask */
130 FALSE), /* pcrel_offset */
131 #define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
132 HOWTO (R_H8_DIR16R8, /* type */
134 1, /* size (0 = byte, 1 = short, 2 = long) */
136 FALSE, /* pc_relative */
138 complain_overflow_bitfield, /* complain_on_overflow */
139 special, /* special_function */
140 "R_H8_DIR16R8", /* name */
141 FALSE, /* partial_inplace */
143 0x0000ffff, /* dst_mask */
144 FALSE), /* pcrel_offset */
145 #define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
146 HOWTO (R_H8_DIR24A8, /* type */
148 2, /* size (0 = byte, 1 = short, 2 = long) */
150 FALSE, /* pc_relative */
152 complain_overflow_bitfield, /* complain_on_overflow */
153 special, /* special_function */
154 "R_H8_DIR24A8", /* name */
155 TRUE, /* partial_inplace */
156 0xff000000, /* src_mask */
157 0x00ffffff, /* dst_mask */
158 FALSE), /* pcrel_offset */
159 #define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
160 HOWTO (R_H8_DIR24R8, /* type */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
164 FALSE, /* pc_relative */
166 complain_overflow_bitfield, /* complain_on_overflow */
167 special, /* special_function */
168 "R_H8_DIR24R8", /* name */
169 TRUE, /* partial_inplace */
170 0xff000000, /* src_mask */
171 0x00ffffff, /* dst_mask */
172 FALSE), /* pcrel_offset */
173 #define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
174 HOWTO (R_H8_DIR32A16, /* type */
176 2, /* size (0 = byte, 1 = short, 2 = long) */
178 FALSE, /* pc_relative */
180 complain_overflow_dont,/* complain_on_overflow */
181 special, /* special_function */
182 "R_H8_DIR32A16", /* name */
183 FALSE, /* partial_inplace */
185 0xffffffff, /* dst_mask */
186 FALSE), /* pcrel_offset */
187 #define R_H8_PCREL16_X (R_H8_DIR32A16_X + 1)
188 HOWTO (R_H8_PCREL16, /* type */
190 1, /* size (0 = byte, 1 = short, 2 = long) */
192 TRUE, /* pc_relative */
194 complain_overflow_signed,/* complain_on_overflow */
195 special, /* special_function */
196 "R_H8_PCREL16", /* name */
197 FALSE, /* partial_inplace */
198 0xffff, /* src_mask */
199 0xffff, /* dst_mask */
200 TRUE), /* pcrel_offset */
201 #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
202 HOWTO (R_H8_PCREL8, /* type */
204 0, /* size (0 = byte, 1 = short, 2 = long) */
206 TRUE, /* pc_relative */
208 complain_overflow_signed,/* complain_on_overflow */
209 special, /* special_function */
210 "R_H8_PCREL8", /* name */
211 FALSE, /* partial_inplace */
214 TRUE), /* pcrel_offset */
217 /* This structure is used to map BFD reloc codes to H8 ELF relocs. */
219 struct elf_reloc_map {
220 bfd_reloc_code_real_type bfd_reloc_val;
221 unsigned char howto_index;
224 /* An array mapping BFD reloc codes to H8 ELF relocs. */
226 static const struct elf_reloc_map h8_reloc_map[] = {
227 { BFD_RELOC_NONE, R_H8_NONE_X },
228 { BFD_RELOC_32, R_H8_DIR32_X },
229 { BFD_RELOC_16, R_H8_DIR16_X },
230 { BFD_RELOC_8, R_H8_DIR8_X },
231 { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
232 { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
233 { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
234 { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
235 { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
236 { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
237 { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
241 static reloc_howto_type *
242 elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
243 bfd_reloc_code_real_type code)
247 for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
249 if (h8_reloc_map[i].bfd_reloc_val == code)
250 return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
255 static reloc_howto_type *
256 elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
262 i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
264 if (h8_elf_howto_table[i].name != NULL
265 && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
266 return &h8_elf_howto_table[i];
272 elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
273 Elf_Internal_Rela *elf_reloc)
278 r = ELF32_R_TYPE (elf_reloc->r_info);
279 for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
280 if (h8_elf_howto_table[i].type == r)
282 bfd_reloc->howto = &h8_elf_howto_table[i];
289 elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
290 Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
295 r = ELF32_R_TYPE (elf_reloc->r_info);
296 bfd_reloc->howto = &h8_elf_howto_table[r];
299 /* Special handling for H8/300 relocs.
300 We only come here for pcrel stuff and return normally if not an -r link.
301 When doing -r, we can't do any arithmetic for the pcrel stuff, because
302 we support relaxing on the H8/300 series chips. */
303 static bfd_reloc_status_type
304 special (bfd *abfd ATTRIBUTE_UNUSED,
305 arelent *reloc_entry ATTRIBUTE_UNUSED,
306 asymbol *symbol ATTRIBUTE_UNUSED,
307 PTR data ATTRIBUTE_UNUSED,
308 asection *input_section ATTRIBUTE_UNUSED,
310 char **error_message ATTRIBUTE_UNUSED)
312 if (output_bfd == (bfd *) NULL)
313 return bfd_reloc_continue;
315 /* Adjust the reloc address to that in the output section. */
316 reloc_entry->address += input_section->output_offset;
320 /* Perform a relocation as part of a final link. */
321 static bfd_reloc_status_type
322 elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
323 bfd *output_bfd ATTRIBUTE_UNUSED,
324 asection *input_section ATTRIBUTE_UNUSED,
325 bfd_byte *contents, bfd_vma offset,
326 bfd_vma value, bfd_vma addend,
327 struct bfd_link_info *info ATTRIBUTE_UNUSED,
328 asection *sym_sec ATTRIBUTE_UNUSED,
329 int is_local ATTRIBUTE_UNUSED)
331 bfd_byte *hit_data = contents + offset;
342 bfd_put_32 (input_bfd, value, hit_data);
349 bfd_put_16 (input_bfd, value, hit_data);
356 bfd_put_8 (input_bfd, value, hit_data);
362 /* HIT_DATA is the address for the first byte for the relocated
363 value. Subtract 1 so that we can manipulate the data in 32-bit
367 /* Clear out the top byte in value. */
370 /* Retrieve the type byte for value from the section contents. */
371 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
373 /* Now scribble it out in one 32-bit hunk. */
374 bfd_put_32 (input_bfd, value, hit_data);
378 value -= (input_section->output_section->vma
379 + input_section->output_offset);
383 /* The value is relative to the start of the instruction,
384 not the relocation offset. Subtract 2 to account for
388 bfd_put_16 (input_bfd, value, hit_data);
392 value -= (input_section->output_section->vma
393 + input_section->output_offset);
397 /* The value is relative to the start of the instruction,
398 not the relocation offset. Subtract 1 to account for
402 bfd_put_8 (input_bfd, value, hit_data);
406 return bfd_reloc_notsupported;
410 /* Relocate an H8 ELF section. */
412 elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
413 bfd *input_bfd, asection *input_section,
414 bfd_byte *contents, Elf_Internal_Rela *relocs,
415 Elf_Internal_Sym *local_syms,
416 asection **local_sections)
418 Elf_Internal_Shdr *symtab_hdr;
419 struct elf_link_hash_entry **sym_hashes;
420 Elf_Internal_Rela *rel, *relend;
422 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
423 sym_hashes = elf_sym_hashes (input_bfd);
426 relend = relocs + input_section->reloc_count;
427 for (; rel < relend; rel++)
430 unsigned long r_symndx;
431 Elf_Internal_Sym *sym;
433 struct elf_link_hash_entry *h;
435 bfd_reloc_status_type r;
437 reloc_howto_type *howto;
439 elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
440 howto = bfd_reloc.howto;
442 r_symndx = ELF32_R_SYM (rel->r_info);
443 r_type = ELF32_R_TYPE (rel->r_info);
447 if (r_symndx < symtab_hdr->sh_info)
449 sym = local_syms + r_symndx;
450 sec = local_sections[r_symndx];
451 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
455 bfd_boolean unresolved_reloc, warned;
457 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
458 r_symndx, symtab_hdr, sym_hashes,
460 unresolved_reloc, warned);
463 if (sec != NULL && discarded_section (sec))
464 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
465 rel, relend, howto, contents);
467 if (info->relocatable)
470 r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
472 contents, rel->r_offset,
473 relocation, rel->r_addend,
474 info, sec, h == NULL);
476 if (r != bfd_reloc_ok)
479 const char *msg = (const char *) 0;
482 name = h->root.root.string;
485 name = (bfd_elf_string_from_elf_section
486 (input_bfd, symtab_hdr->sh_link, sym->st_name));
487 if (name == NULL || *name == '\0')
488 name = bfd_section_name (input_bfd, sec);
493 case bfd_reloc_overflow:
494 if (! ((*info->callbacks->reloc_overflow)
495 (info, (h ? &h->root : NULL), name, howto->name,
496 (bfd_vma) 0, input_bfd, input_section,
501 case bfd_reloc_undefined:
502 if (! ((*info->callbacks->undefined_symbol)
503 (info, name, input_bfd, input_section,
504 rel->r_offset, TRUE)))
508 case bfd_reloc_outofrange:
509 msg = _("internal error: out of range error");
512 case bfd_reloc_notsupported:
513 msg = _("internal error: unsupported relocation error");
516 case bfd_reloc_dangerous:
517 msg = _("internal error: dangerous error");
521 msg = _("internal error: unknown error");
525 if (!((*info->callbacks->warning)
526 (info, msg, name, input_bfd, input_section,
537 /* Object files encode the specific H8 model they were compiled
538 for in the ELF flags field.
540 Examine that field and return the proper BFD machine type for
543 elf32_h8_mach (flagword flags)
545 switch (flags & EF_H8_MACH)
547 case E_H8_MACH_H8300:
549 return bfd_mach_h8300;
551 case E_H8_MACH_H8300H:
552 return bfd_mach_h8300h;
554 case E_H8_MACH_H8300S:
555 return bfd_mach_h8300s;
557 case E_H8_MACH_H8300HN:
558 return bfd_mach_h8300hn;
560 case E_H8_MACH_H8300SN:
561 return bfd_mach_h8300sn;
563 case E_H8_MACH_H8300SX:
564 return bfd_mach_h8300sx;
566 case E_H8_MACH_H8300SXN:
567 return bfd_mach_h8300sxn;
571 /* The final processing done just before writing out a H8 ELF object
572 file. We use this opportunity to encode the BFD machine type
573 into the flags field in the object file. */
576 elf32_h8_final_write_processing (bfd *abfd,
577 bfd_boolean linker ATTRIBUTE_UNUSED)
581 switch (bfd_get_mach (abfd))
585 val = E_H8_MACH_H8300;
588 case bfd_mach_h8300h:
589 val = E_H8_MACH_H8300H;
592 case bfd_mach_h8300s:
593 val = E_H8_MACH_H8300S;
596 case bfd_mach_h8300hn:
597 val = E_H8_MACH_H8300HN;
600 case bfd_mach_h8300sn:
601 val = E_H8_MACH_H8300SN;
604 case bfd_mach_h8300sx:
605 val = E_H8_MACH_H8300SX;
608 case bfd_mach_h8300sxn:
609 val = E_H8_MACH_H8300SXN;
613 elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
614 elf_elfheader (abfd)->e_flags |= val;
617 /* Return nonzero if ABFD represents a valid H8 ELF object file; also
618 record the encoded machine type found in the ELF flags. */
621 elf32_h8_object_p (bfd *abfd)
623 bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
624 elf32_h8_mach (elf_elfheader (abfd)->e_flags));
628 /* Merge backend specific data from an object file to the output
629 object file when linking. The only data we need to copy at this
630 time is the architecture/machine information. */
633 elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
635 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
636 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
639 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
640 && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
642 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
643 bfd_get_mach (ibfd)))
650 /* This function handles relaxing for the H8..
652 There are a few relaxing opportunities available on the H8:
654 jmp/jsr:24 -> bra/bsr:8 2 bytes
655 The jmp may be completely eliminated if the previous insn is a
656 conditional branch to the insn after the jump. In that case
657 we invert the branch and delete the jump and save 4 bytes.
659 bCC:16 -> bCC:8 2 bytes
660 bsr:16 -> bsr:8 2 bytes
662 bset:16 -> bset:8 2 bytes
663 bset:24/32 -> bset:8 4 bytes
664 (also applicable to other bit manipulation instructions)
666 mov.b:16 -> mov.b:8 2 bytes
667 mov.b:24/32 -> mov.b:8 4 bytes
669 bset:24/32 -> bset:16 2 bytes
670 (also applicable to other bit manipulation instructions)
672 mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
675 elf32_h8_relax_section (bfd *abfd, asection *sec,
676 struct bfd_link_info *link_info, bfd_boolean *again)
678 Elf_Internal_Shdr *symtab_hdr;
679 Elf_Internal_Rela *internal_relocs;
680 Elf_Internal_Rela *irel, *irelend;
681 bfd_byte *contents = NULL;
682 Elf_Internal_Sym *isymbuf = NULL;
683 static asection *last_input_section = NULL;
684 static Elf_Internal_Rela *last_reloc = NULL;
686 /* Assume nothing changes. */
689 /* We don't have to do anything for a relocatable link, if
690 this section does not have relocs, or if this is not a
692 if (link_info->relocatable
693 || (sec->flags & SEC_RELOC) == 0
694 || sec->reloc_count == 0
695 || (sec->flags & SEC_CODE) == 0)
698 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
700 /* Get a copy of the native relocations. */
701 internal_relocs = (_bfd_elf_link_read_relocs
702 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
703 link_info->keep_memory));
704 if (internal_relocs == NULL)
707 if (sec != last_input_section)
710 last_input_section = sec;
712 /* Walk through the relocs looking for relaxing opportunities. */
713 irelend = internal_relocs + sec->reloc_count;
714 for (irel = internal_relocs; irel < irelend; irel++)
721 elf32_h8_info_to_howto (abfd, &bfd_reloc, irel);
723 /* Keep track of the previous reloc so that we can delete
724 some long jumps created by the compiler. */
725 if (irel != internal_relocs)
726 last_reloc = irel - 1;
728 if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
729 && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
730 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
731 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
732 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
735 /* Get the section contents if we haven't done so already. */
736 if (contents == NULL)
738 /* Get cached copy if it exists. */
739 if (elf_section_data (sec)->this_hdr.contents != NULL)
740 contents = elf_section_data (sec)->this_hdr.contents;
743 /* Go get them off disk. */
744 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
749 /* Read this BFD's local symbols if we haven't done so already. */
750 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
752 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
754 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
755 symtab_hdr->sh_info, 0,
761 /* Get the value of the symbol referred to by the reloc. */
762 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
764 /* A local symbol. */
765 Elf_Internal_Sym *isym;
768 isym = isymbuf + ELF32_R_SYM (irel->r_info);
769 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
770 symval = isym->st_value;
771 /* If the reloc is absolute, it will not have
772 a symbol or section associated with it. */
774 symval += sym_sec->output_section->vma
775 + sym_sec->output_offset;
780 struct elf_link_hash_entry *h;
782 /* An external symbol. */
783 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
784 h = elf_sym_hashes (abfd)[indx];
785 BFD_ASSERT (h != NULL);
786 if (h->root.type != bfd_link_hash_defined
787 && h->root.type != bfd_link_hash_defweak)
789 /* This appears to be a reference to an undefined
790 symbol. Just ignore it--it will be caught by the
791 regular reloc processing. */
795 symval = (h->root.u.def.value
796 + h->root.u.def.section->output_section->vma
797 + h->root.u.def.section->output_offset);
800 /* For simplicity of coding, we are going to modify the section
801 contents, the section relocs, and the BFD symbol table. We
802 must tell the rest of the code not to free up this
803 information. It would be possible to instead create a table
804 of changes which have to be made, as is done in coff-mips.c;
805 that would be more work, but would require less memory when
806 the linker is run. */
807 switch (ELF32_R_TYPE (irel->r_info))
809 /* Try to turn a 24-bit absolute branch/call into an 8-bit
810 pc-relative branch/call. */
813 bfd_vma value = symval + irel->r_addend;
816 /* Get the address of this instruction. */
817 dot = (sec->output_section->vma
818 + sec->output_offset + irel->r_offset - 1);
820 /* Compute the distance from this insn to the branch target. */
823 /* If the distance is within -126..+130 inclusive, then we can
824 relax this jump. +130 is valid since the target will move
825 two bytes closer if we do relax this branch. */
826 if ((int) gap >= -126 && (int) gap <= 130)
830 /* Note that we've changed the relocs, section contents,
832 elf_section_data (sec)->relocs = internal_relocs;
833 elf_section_data (sec)->this_hdr.contents = contents;
834 symtab_hdr->contents = (unsigned char *) isymbuf;
836 /* Get the instruction code being relaxed. */
837 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
839 /* If the previous instruction conditionally jumped around
840 this instruction, we may be able to reverse the condition
841 and redirect the previous instruction to the target of
844 Such sequences are used by the compiler to deal with
845 long conditional branches.
847 Only perform this optimisation for jumps (code 0x5a) not
848 subroutine calls, as otherwise it could transform:
861 which changes the call (jsr) into a branch (bne). */
866 && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
867 && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
870 asection *last_sym_sec;
871 Elf_Internal_Sym *last_sym;
873 /* We will need to examine the symbol used by the
874 previous relocation. */
876 last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
878 = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
879 last_value = (last_sym->st_value
880 + last_sym_sec->output_section->vma
881 + last_sym_sec->output_offset);
883 /* Verify that the previous relocation was for a
884 branch around this instruction and that no symbol
885 exists at the current location. */
886 if (last_value == dot + 4
887 && last_reloc->r_offset + 2 == irel->r_offset
888 && ! elf32_h8_symbol_address_p (abfd, sec, dot))
890 /* We can eliminate this jump. Twiddle the
891 previous relocation as necessary. */
893 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
894 ELF32_R_TYPE (R_H8_NONE));
897 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
898 ELF32_R_TYPE (R_H8_PCREL8));
899 last_reloc->r_addend = irel->r_addend;
901 code = bfd_get_8 (abfd,
902 contents + last_reloc->r_offset - 1);
906 contents + last_reloc->r_offset - 1);
908 /* Delete four bytes of data. */
909 if (!elf32_h8_relax_delete_bytes (abfd, sec,
921 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
922 else if (code == 0x5a)
924 bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
928 /* Fix the relocation's type. */
929 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
932 /* Delete two bytes of data. */
933 if (!elf32_h8_relax_delete_bytes (abfd, sec,
934 irel->r_offset + 1, 2))
937 /* That will change things, so, we should relax again.
938 Note that this is not required, and it may be slow. */
944 /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
948 bfd_vma value = symval + irel->r_addend;
952 /* Get the address of this instruction. */
953 dot = (sec->output_section->vma
955 + irel->r_offset - 2);
959 /* If the distance is within -126..+130 inclusive, then we can
960 relax this jump. +130 is valid since the target will move
961 two bytes closer if we do relax this branch. */
962 if ((int) gap >= -126 && (int) gap <= 130)
966 /* Note that we've changed the relocs, section contents,
968 elf_section_data (sec)->relocs = internal_relocs;
969 elf_section_data (sec)->this_hdr.contents = contents;
970 symtab_hdr->contents = (unsigned char *) isymbuf;
972 /* Get the opcode. */
973 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
977 /* bCC:16 -> bCC:8 */
978 /* Get the second byte of the original insn, which
979 contains the condition code. */
980 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
982 /* Compute the fisrt byte of the relaxed
983 instruction. The original sequence 0x58 0xX0
984 is relaxed to 0x4X, where X represents the
989 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
991 else if (code == 0x5c)
993 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
995 /* Might be MOVSD. */
998 /* Fix the relocation's type. */
999 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1003 /* Delete two bytes of data. */
1004 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1005 irel->r_offset + 1, 2))
1008 /* That will change things, so, we should relax again.
1009 Note that this is not required, and it may be slow. */
1015 /* This is a 16-bit absolute address in one of the following
1018 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1019 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1022 We may relax this into an 8-bit absolute address if it's in
1028 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1029 if (value >= 0xffffff00u)
1032 unsigned char temp_code;
1034 /* Note that we've changed the relocs, section contents,
1036 elf_section_data (sec)->relocs = internal_relocs;
1037 elf_section_data (sec)->this_hdr.contents = contents;
1038 symtab_hdr->contents = (unsigned char *) isymbuf;
1040 /* Get the opcode. */
1041 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1043 /* All instructions with R_H8_DIR16A8 start with
1048 temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1049 /* If this is a mov.b instruction, clear the lower
1050 nibble, which contains the source/destination
1052 if ((temp_code & 0x10) != 0x10)
1058 /* This is mov.b @aa:16,Rd. */
1059 bfd_put_8 (abfd, (code & 0xf) | 0x20,
1060 contents + irel->r_offset - 2);
1063 /* This is mov.b Rs,@aa:16. */
1064 bfd_put_8 (abfd, (code & 0xf) | 0x30,
1065 contents + irel->r_offset - 2);
1068 /* This is a bit-maniputation instruction that
1069 stores one bit into memory, one of "bclr",
1070 "bist", "bnot", "bset", and "bst". */
1071 bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1074 /* This is a bit-maniputation instruction that
1075 loads one bit from memory, one of "band",
1076 "biand", "bild", "bior", "bixor", "bld", "bor",
1077 "btst", and "bxor". */
1078 bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1084 /* Fix the relocation's type. */
1085 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1088 /* Move the relocation. */
1091 /* Delete two bytes of data. */
1092 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1093 irel->r_offset + 1, 2))
1096 /* That will change things, so, we should relax again.
1097 Note that this is not required, and it may be slow. */
1103 /* This is a 24-bit absolute address in one of the following
1106 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1107 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1110 We may relax this into an 8-bit absolute address if it's in
1116 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1117 if (value >= 0xffffff00u)
1120 unsigned char temp_code;
1122 /* Note that we've changed the relocs, section contents,
1124 elf_section_data (sec)->relocs = internal_relocs;
1125 elf_section_data (sec)->this_hdr.contents = contents;
1126 symtab_hdr->contents = (unsigned char *) isymbuf;
1128 /* Get the opcode. */
1129 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1131 /* All instructions with R_H8_DIR24A8 start with
1136 temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1138 /* If this is a mov.b instruction, clear the lower
1139 nibble, which contains the source/destination
1141 if ((temp_code & 0x30) != 0x30)
1147 /* This is mov.b @aa:24/32,Rd. */
1148 bfd_put_8 (abfd, (code & 0xf) | 0x20,
1149 contents + irel->r_offset - 2);
1152 /* This is mov.b Rs,@aa:24/32. */
1153 bfd_put_8 (abfd, (code & 0xf) | 0x30,
1154 contents + irel->r_offset - 2);
1157 /* This is a bit-maniputation instruction that
1158 stores one bit into memory, one of "bclr",
1159 "bist", "bnot", "bset", and "bst". */
1160 bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1163 /* This is a bit-maniputation instruction that
1164 loads one bit from memory, one of "band",
1165 "biand", "bild", "bior", "bixor", "bld", "bor",
1166 "btst", and "bxor". */
1167 bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1173 /* Fix the relocation's type. */
1174 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1178 /* Delete two bytes of data. */
1179 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1180 irel->r_offset + 1, 4))
1183 /* That will change things, so, we should relax again.
1184 Note that this is not required, and it may be slow. */
1192 /* This is a 24-/32-bit absolute address in one of the
1193 following instructions:
1195 "band", "bclr", "biand", "bild", "bior", "bist",
1196 "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1197 "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1199 We may relax this into an 16-bit absolute address if it's
1200 in the right range. */
1205 value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1206 if (value <= 0x7fff || value >= 0xffff8000u)
1209 unsigned char op0, op1, op2, op3;
1210 unsigned char *op_ptr;
1212 /* Note that we've changed the relocs, section contents,
1214 elf_section_data (sec)->relocs = internal_relocs;
1215 elf_section_data (sec)->this_hdr.contents = contents;
1216 symtab_hdr->contents = (unsigned char *) isymbuf;
1218 if (irel->r_offset >= 4)
1220 /* Check for 4-byte MOVA relaxation. */
1221 int second_reloc = 0;
1223 op_ptr = contents + irel->r_offset - 4;
1228 reloc_howto_type *h;
1229 bfd_vma last_reloc_size;
1231 elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc);
1232 h = bfd_reloc.howto;
1233 last_reloc_size = 1 << h->size;
1234 if (last_reloc->r_offset + last_reloc_size
1237 op_ptr -= last_reloc_size;
1243 Elf_Internal_Rela *next_reloc = irel + 1;
1245 reloc_howto_type *h;
1246 bfd_vma next_reloc_size;
1248 elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc);
1249 h = bfd_reloc.howto;
1250 next_reloc_size = 1 << h->size;
1251 if (next_reloc->r_offset + next_reloc_size
1254 op_ptr -= next_reloc_size;
1259 op0 = bfd_get_8 (abfd, op_ptr + 0);
1260 op1 = bfd_get_8 (abfd, op_ptr + 1);
1261 op2 = bfd_get_8 (abfd, op_ptr + 2);
1262 op3 = bfd_get_8 (abfd, op_ptr + 3);
1265 && (op1 & 0xdf) == 0x5f
1266 && (op2 & 0x40) == 0x40
1267 && (op3 & 0x80) == 0x80)
1269 if ((op2 & 0x08) == 0)
1275 bfd_put_8 (abfd, op3, op_ptr + 3);
1280 bfd_put_8 (abfd, op2, op_ptr + 2);
1282 goto r_h8_dir32a16_common;
1286 /* Now check for short version of MOVA. */
1287 op_ptr = contents + irel->r_offset - 2;
1288 op0 = bfd_get_8 (abfd, op_ptr + 0);
1289 op1 = bfd_get_8 (abfd, op_ptr + 1);
1292 && (op1 & 0x88) == 0x80)
1295 bfd_put_8 (abfd, op1, op_ptr + 1);
1296 goto r_h8_dir32a16_common;
1299 /* Get the opcode. */
1300 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1302 /* Fix the opcode. For all the instructions that
1303 belong to this relaxation, we simply need to turn
1304 off bit 0x20 in the previous byte. */
1307 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1309 r_h8_dir32a16_common:
1310 /* Fix the relocation's type. */
1311 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1314 /* Delete two bytes of data. */
1315 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1316 irel->r_offset + 1, 2))
1319 /* That will change things, so, we should relax again.
1320 Note that this is not required, and it may be slow. */
1332 && symtab_hdr->contents != (unsigned char *) isymbuf)
1334 if (! link_info->keep_memory)
1337 symtab_hdr->contents = (unsigned char *) isymbuf;
1340 if (contents != NULL
1341 && elf_section_data (sec)->this_hdr.contents != contents)
1343 if (! link_info->keep_memory)
1347 /* Cache the section contents for elf_link_input_bfd. */
1348 elf_section_data (sec)->this_hdr.contents = contents;
1352 if (internal_relocs != NULL
1353 && elf_section_data (sec)->relocs != internal_relocs)
1354 free (internal_relocs);
1360 && symtab_hdr->contents != (unsigned char *) isymbuf)
1362 if (contents != NULL
1363 && elf_section_data (sec)->this_hdr.contents != contents)
1365 if (internal_relocs != NULL
1366 && elf_section_data (sec)->relocs != internal_relocs)
1367 free (internal_relocs);
1371 /* Delete some bytes from a section while relaxing. */
1374 elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1376 Elf_Internal_Shdr *symtab_hdr;
1377 unsigned int sec_shndx;
1379 Elf_Internal_Rela *irel, *irelend;
1380 Elf_Internal_Sym *isym;
1381 Elf_Internal_Sym *isymend;
1383 struct elf_link_hash_entry **sym_hashes;
1384 struct elf_link_hash_entry **end_hashes;
1385 unsigned int symcount;
1387 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1389 contents = elf_section_data (sec)->this_hdr.contents;
1393 irel = elf_section_data (sec)->relocs;
1394 irelend = irel + sec->reloc_count;
1396 /* Actually delete the bytes. */
1397 memmove (contents + addr, contents + addr + count,
1398 (size_t) (toaddr - addr - count));
1401 /* Adjust all the relocs. */
1402 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1404 /* Get the new reloc address. */
1405 if ((irel->r_offset > addr
1406 && irel->r_offset < toaddr))
1407 irel->r_offset -= count;
1410 /* Adjust the local symbols defined in this section. */
1411 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1412 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1413 isymend = isym + symtab_hdr->sh_info;
1414 for (; isym < isymend; isym++)
1416 if (isym->st_shndx == sec_shndx
1417 && isym->st_value > addr
1418 && isym->st_value < toaddr)
1419 isym->st_value -= count;
1422 /* Now adjust the global symbols defined in this section. */
1423 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1424 - symtab_hdr->sh_info);
1425 sym_hashes = elf_sym_hashes (abfd);
1426 end_hashes = sym_hashes + symcount;
1427 for (; sym_hashes < end_hashes; sym_hashes++)
1429 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1430 if ((sym_hash->root.type == bfd_link_hash_defined
1431 || sym_hash->root.type == bfd_link_hash_defweak)
1432 && sym_hash->root.u.def.section == sec
1433 && sym_hash->root.u.def.value > addr
1434 && sym_hash->root.u.def.value < toaddr)
1436 sym_hash->root.u.def.value -= count;
1443 /* Return TRUE if a symbol exists at the given address, else return
1446 elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1448 Elf_Internal_Shdr *symtab_hdr;
1449 unsigned int sec_shndx;
1450 Elf_Internal_Sym *isym;
1451 Elf_Internal_Sym *isymend;
1452 struct elf_link_hash_entry **sym_hashes;
1453 struct elf_link_hash_entry **end_hashes;
1454 unsigned int symcount;
1456 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1458 /* Examine all the symbols. */
1459 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1460 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1461 isymend = isym + symtab_hdr->sh_info;
1462 for (; isym < isymend; isym++)
1464 if (isym->st_shndx == sec_shndx
1465 && isym->st_value == addr)
1469 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1470 - symtab_hdr->sh_info);
1471 sym_hashes = elf_sym_hashes (abfd);
1472 end_hashes = sym_hashes + symcount;
1473 for (; sym_hashes < end_hashes; sym_hashes++)
1475 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1476 if ((sym_hash->root.type == bfd_link_hash_defined
1477 || sym_hash->root.type == bfd_link_hash_defweak)
1478 && sym_hash->root.u.def.section == sec
1479 && sym_hash->root.u.def.value == addr)
1486 /* This is a version of bfd_generic_get_relocated_section_contents
1487 which uses elf32_h8_relocate_section. */
1490 elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1491 struct bfd_link_info *link_info,
1492 struct bfd_link_order *link_order,
1494 bfd_boolean relocatable,
1497 Elf_Internal_Shdr *symtab_hdr;
1498 asection *input_section = link_order->u.indirect.section;
1499 bfd *input_bfd = input_section->owner;
1500 asection **sections = NULL;
1501 Elf_Internal_Rela *internal_relocs = NULL;
1502 Elf_Internal_Sym *isymbuf = NULL;
1504 /* We only need to handle the case of relaxing, or of having a
1505 particular set of section contents, specially. */
1507 || elf_section_data (input_section)->this_hdr.contents == NULL)
1508 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1513 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1515 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1516 (size_t) input_section->size);
1518 if ((input_section->flags & SEC_RELOC) != 0
1519 && input_section->reloc_count > 0)
1522 Elf_Internal_Sym *isym, *isymend;
1525 internal_relocs = (_bfd_elf_link_read_relocs
1526 (input_bfd, input_section, (PTR) NULL,
1527 (Elf_Internal_Rela *) NULL, FALSE));
1528 if (internal_relocs == NULL)
1531 if (symtab_hdr->sh_info != 0)
1533 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1534 if (isymbuf == NULL)
1535 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1536 symtab_hdr->sh_info, 0,
1538 if (isymbuf == NULL)
1542 amt = symtab_hdr->sh_info;
1543 amt *= sizeof (asection *);
1544 sections = (asection **) bfd_malloc (amt);
1545 if (sections == NULL && amt != 0)
1548 isymend = isymbuf + symtab_hdr->sh_info;
1549 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1553 if (isym->st_shndx == SHN_UNDEF)
1554 isec = bfd_und_section_ptr;
1555 else if (isym->st_shndx == SHN_ABS)
1556 isec = bfd_abs_section_ptr;
1557 else if (isym->st_shndx == SHN_COMMON)
1558 isec = bfd_com_section_ptr;
1560 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1565 if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1566 input_section, data, internal_relocs,
1570 if (sections != NULL)
1573 && symtab_hdr->contents != (unsigned char *) isymbuf)
1575 if (elf_section_data (input_section)->relocs != internal_relocs)
1576 free (internal_relocs);
1582 if (sections != NULL)
1585 && symtab_hdr->contents != (unsigned char *) isymbuf)
1587 if (internal_relocs != NULL
1588 && elf_section_data (input_section)->relocs != internal_relocs)
1589 free (internal_relocs);
1594 #define TARGET_BIG_SYM bfd_elf32_h8300_vec
1595 #define TARGET_BIG_NAME "elf32-h8300"
1596 #define ELF_ARCH bfd_arch_h8300
1597 #define ELF_MACHINE_CODE EM_H8_300
1598 #define ELF_MAXPAGESIZE 0x1
1599 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1600 #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1601 #define elf_info_to_howto elf32_h8_info_to_howto
1602 #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1604 /* So we can set/examine bits in e_flags to get the specific
1605 H8 architecture in use. */
1606 #define elf_backend_final_write_processing \
1607 elf32_h8_final_write_processing
1608 #define elf_backend_object_p \
1610 #define bfd_elf32_bfd_merge_private_bfd_data \
1611 elf32_h8_merge_private_bfd_data
1613 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1614 defaults to using _bfd_generic_link_hash_table_create, but
1615 bfd_elf_size_dynamic_sections uses
1616 dynobj = elf_hash_table (info)->dynobj;
1617 and thus requires an elf hash table. */
1618 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1620 /* Use an H8 specific linker, not the ELF generic linker. */
1621 #define elf_backend_relocate_section elf32_h8_relocate_section
1622 #define elf_backend_rela_normal 1
1623 #define elf_backend_can_gc_sections 1
1625 /* And relaxing stuff. */
1626 #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1627 #define bfd_elf32_bfd_get_relocated_section_contents \
1628 elf32_h8_get_relocated_section_contents
1630 #define elf_symbol_leading_char '_'
1632 #include "elf32-target.h"