1 /* BFD back-end for Renesas H8/300 ELF binaries.
2 Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
3 2007 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 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
27 static reloc_howto_type *elf32_h8_reloc_type_lookup
28 (bfd *abfd, bfd_reloc_code_real_type code);
29 static void elf32_h8_info_to_howto
30 (bfd *, arelent *, Elf_Internal_Rela *);
31 static void elf32_h8_info_to_howto_rel
32 (bfd *, arelent *, Elf_Internal_Rela *);
33 static unsigned long elf32_h8_mach (flagword);
34 static void elf32_h8_final_write_processing (bfd *, bfd_boolean);
35 static bfd_boolean elf32_h8_object_p (bfd *);
36 static bfd_boolean elf32_h8_merge_private_bfd_data (bfd *, bfd *);
37 static bfd_boolean elf32_h8_relax_section
38 (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
39 static bfd_boolean elf32_h8_relax_delete_bytes
40 (bfd *, asection *, bfd_vma, int);
41 static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
42 static bfd_byte *elf32_h8_get_relocated_section_contents
43 (bfd *, struct bfd_link_info *, struct bfd_link_order *,
44 bfd_byte *, bfd_boolean, asymbol **);
45 static bfd_reloc_status_type elf32_h8_final_link_relocate
46 (unsigned long, bfd *, bfd *, asection *,
47 bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
48 struct bfd_link_info *, asection *, int);
49 static bfd_boolean elf32_h8_relocate_section
50 (bfd *, struct bfd_link_info *, bfd *, asection *,
51 bfd_byte *, Elf_Internal_Rela *,
52 Elf_Internal_Sym *, asection **);
53 static bfd_reloc_status_type special
54 (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **);
56 /* This does not include any relocation information, but should be
57 good enough for GDB or objdump to read the file. */
59 static reloc_howto_type h8_elf_howto_table[] = {
61 HOWTO (R_H8_NONE, /* type */
63 0, /* size (0 = byte, 1 = short, 2 = long) */
65 FALSE, /* pc_relative */
67 complain_overflow_dont,/* complain_on_overflow */
68 special, /* special_function */
69 "R_H8_NONE", /* name */
70 FALSE, /* partial_inplace */
73 FALSE), /* pcrel_offset */
74 #define R_H8_DIR32_X (R_H8_NONE_X + 1)
75 HOWTO (R_H8_DIR32, /* type */
77 2, /* size (0 = byte, 1 = short, 2 = long) */
79 FALSE, /* pc_relative */
81 complain_overflow_dont,/* complain_on_overflow */
82 special, /* special_function */
83 "R_H8_DIR32", /* name */
84 FALSE, /* partial_inplace */
86 0xffffffff, /* dst_mask */
87 FALSE), /* pcrel_offset */
88 #define R_H8_DIR16_X (R_H8_DIR32_X + 1)
89 HOWTO (R_H8_DIR16, /* type */
91 1, /* size (0 = byte, 1 = short, 2 = long) */
93 FALSE, /* pc_relative */
95 complain_overflow_dont,/* complain_on_overflow */
96 special, /* special_function */
97 "R_H8_DIR16", /* name */
98 FALSE, /* partial_inplace */
100 0x0000ffff, /* dst_mask */
101 FALSE), /* pcrel_offset */
102 #define R_H8_DIR8_X (R_H8_DIR16_X + 1)
103 HOWTO (R_H8_DIR8, /* type */
105 0, /* size (0 = byte, 1 = short, 2 = long) */
107 FALSE, /* pc_relative */
109 complain_overflow_dont,/* complain_on_overflow */
110 special, /* special_function */
111 "R_H8_DIR8", /* name */
112 FALSE, /* partial_inplace */
114 0x000000ff, /* dst_mask */
115 FALSE), /* pcrel_offset */
116 #define R_H8_DIR16A8_X (R_H8_DIR8_X + 1)
117 HOWTO (R_H8_DIR16A8, /* type */
119 1, /* size (0 = byte, 1 = short, 2 = long) */
121 FALSE, /* pc_relative */
123 complain_overflow_bitfield, /* complain_on_overflow */
124 special, /* special_function */
125 "R_H8_DIR16A8", /* name */
126 FALSE, /* partial_inplace */
128 0x0000ffff, /* dst_mask */
129 FALSE), /* pcrel_offset */
130 #define R_H8_DIR16R8_X (R_H8_DIR16A8_X + 1)
131 HOWTO (R_H8_DIR16R8, /* type */
133 1, /* size (0 = byte, 1 = short, 2 = long) */
135 FALSE, /* pc_relative */
137 complain_overflow_bitfield, /* complain_on_overflow */
138 special, /* special_function */
139 "R_H8_DIR16R8", /* name */
140 FALSE, /* partial_inplace */
142 0x0000ffff, /* dst_mask */
143 FALSE), /* pcrel_offset */
144 #define R_H8_DIR24A8_X (R_H8_DIR16R8_X + 1)
145 HOWTO (R_H8_DIR24A8, /* type */
147 2, /* size (0 = byte, 1 = short, 2 = long) */
149 FALSE, /* pc_relative */
151 complain_overflow_bitfield, /* complain_on_overflow */
152 special, /* special_function */
153 "R_H8_DIR24A8", /* name */
154 TRUE, /* partial_inplace */
155 0xff000000, /* src_mask */
156 0x00ffffff, /* dst_mask */
157 FALSE), /* pcrel_offset */
158 #define R_H8_DIR24R8_X (R_H8_DIR24A8_X + 1)
159 HOWTO (R_H8_DIR24R8, /* type */
161 2, /* size (0 = byte, 1 = short, 2 = long) */
163 FALSE, /* pc_relative */
165 complain_overflow_bitfield, /* complain_on_overflow */
166 special, /* special_function */
167 "R_H8_DIR24R8", /* name */
168 TRUE, /* partial_inplace */
169 0xff000000, /* src_mask */
170 0x00ffffff, /* dst_mask */
171 FALSE), /* pcrel_offset */
172 #define R_H8_DIR32A16_X (R_H8_DIR24R8_X + 1)
173 HOWTO (R_H8_DIR32A16, /* type */
175 2, /* size (0 = byte, 1 = short, 2 = long) */
177 FALSE, /* pc_relative */
179 complain_overflow_dont,/* complain_on_overflow */
180 special, /* special_function */
181 "R_H8_DIR32A16", /* name */
182 FALSE, /* partial_inplace */
184 0xffffffff, /* dst_mask */
185 FALSE), /* pcrel_offset */
186 #define R_H8_PCREL16_X (R_H8_DIR32A16_X + 1)
187 HOWTO (R_H8_PCREL16, /* type */
189 1, /* size (0 = byte, 1 = short, 2 = long) */
191 TRUE, /* pc_relative */
193 complain_overflow_signed,/* complain_on_overflow */
194 special, /* special_function */
195 "R_H8_PCREL16", /* name */
196 FALSE, /* partial_inplace */
197 0xffff, /* src_mask */
198 0xffff, /* dst_mask */
199 TRUE), /* pcrel_offset */
200 #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
201 HOWTO (R_H8_PCREL8, /* type */
203 0, /* size (0 = byte, 1 = short, 2 = long) */
205 TRUE, /* pc_relative */
207 complain_overflow_signed,/* complain_on_overflow */
208 special, /* special_function */
209 "R_H8_PCREL8", /* name */
210 FALSE, /* partial_inplace */
213 TRUE), /* pcrel_offset */
216 /* This structure is used to map BFD reloc codes to H8 ELF relocs. */
218 struct elf_reloc_map {
219 bfd_reloc_code_real_type bfd_reloc_val;
220 unsigned char howto_index;
223 /* An array mapping BFD reloc codes to H8 ELF relocs. */
225 static const struct elf_reloc_map h8_reloc_map[] = {
226 { BFD_RELOC_NONE, R_H8_NONE_X },
227 { BFD_RELOC_32, R_H8_DIR32_X },
228 { BFD_RELOC_16, R_H8_DIR16_X },
229 { BFD_RELOC_8, R_H8_DIR8_X },
230 { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
231 { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
232 { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
233 { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
234 { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
235 { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
236 { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
240 static reloc_howto_type *
241 elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
242 bfd_reloc_code_real_type code)
246 for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
248 if (h8_reloc_map[i].bfd_reloc_val == code)
249 return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
254 static reloc_howto_type *
255 elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
261 i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
263 if (h8_elf_howto_table[i].name != NULL
264 && strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
265 return &h8_elf_howto_table[i];
271 elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
272 Elf_Internal_Rela *elf_reloc)
277 r = ELF32_R_TYPE (elf_reloc->r_info);
278 for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
279 if (h8_elf_howto_table[i].type == r)
281 bfd_reloc->howto = &h8_elf_howto_table[i];
288 elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
289 Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
294 r = ELF32_R_TYPE (elf_reloc->r_info);
295 bfd_reloc->howto = &h8_elf_howto_table[r];
298 /* Special handling for H8/300 relocs.
299 We only come here for pcrel stuff and return normally if not an -r link.
300 When doing -r, we can't do any arithmetic for the pcrel stuff, because
301 we support relaxing on the H8/300 series chips. */
302 static bfd_reloc_status_type
303 special (bfd *abfd ATTRIBUTE_UNUSED,
304 arelent *reloc_entry ATTRIBUTE_UNUSED,
305 asymbol *symbol ATTRIBUTE_UNUSED,
306 PTR data ATTRIBUTE_UNUSED,
307 asection *input_section ATTRIBUTE_UNUSED,
309 char **error_message ATTRIBUTE_UNUSED)
311 if (output_bfd == (bfd *) NULL)
312 return bfd_reloc_continue;
314 /* Adjust the reloc address to that in the output section. */
315 reloc_entry->address += input_section->output_offset;
319 /* Perform a relocation as part of a final link. */
320 static bfd_reloc_status_type
321 elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
322 bfd *output_bfd ATTRIBUTE_UNUSED,
323 asection *input_section ATTRIBUTE_UNUSED,
324 bfd_byte *contents, bfd_vma offset,
325 bfd_vma value, bfd_vma addend,
326 struct bfd_link_info *info ATTRIBUTE_UNUSED,
327 asection *sym_sec ATTRIBUTE_UNUSED,
328 int is_local ATTRIBUTE_UNUSED)
330 bfd_byte *hit_data = contents + offset;
341 bfd_put_32 (input_bfd, value, hit_data);
348 bfd_put_16 (input_bfd, value, hit_data);
355 bfd_put_8 (input_bfd, value, hit_data);
361 /* HIT_DATA is the address for the first byte for the relocated
362 value. Subtract 1 so that we can manipulate the data in 32-bit
366 /* Clear out the top byte in value. */
369 /* Retrieve the type byte for value from the section contents. */
370 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
372 /* Now scribble it out in one 32-bit hunk. */
373 bfd_put_32 (input_bfd, value, hit_data);
377 value -= (input_section->output_section->vma
378 + input_section->output_offset);
382 /* The value is relative to the start of the instruction,
383 not the relocation offset. Subtract 2 to account for
387 bfd_put_16 (input_bfd, value, hit_data);
391 value -= (input_section->output_section->vma
392 + input_section->output_offset);
396 /* The value is relative to the start of the instruction,
397 not the relocation offset. Subtract 1 to account for
401 bfd_put_8 (input_bfd, value, hit_data);
405 return bfd_reloc_notsupported;
409 /* Relocate an H8 ELF section. */
411 elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
412 bfd *input_bfd, asection *input_section,
413 bfd_byte *contents, Elf_Internal_Rela *relocs,
414 Elf_Internal_Sym *local_syms,
415 asection **local_sections)
417 Elf_Internal_Shdr *symtab_hdr;
418 struct elf_link_hash_entry **sym_hashes;
419 Elf_Internal_Rela *rel, *relend;
421 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
422 sym_hashes = elf_sym_hashes (input_bfd);
425 relend = relocs + input_section->reloc_count;
426 for (; rel < relend; rel++)
429 unsigned long r_symndx;
430 Elf_Internal_Sym *sym;
432 struct elf_link_hash_entry *h;
434 bfd_reloc_status_type r;
436 reloc_howto_type *howto;
438 elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
439 howto = bfd_reloc.howto;
441 r_symndx = ELF32_R_SYM (rel->r_info);
442 r_type = ELF32_R_TYPE (rel->r_info);
446 if (r_symndx < symtab_hdr->sh_info)
448 sym = local_syms + r_symndx;
449 sec = local_sections[r_symndx];
450 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
454 bfd_boolean unresolved_reloc, warned;
456 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
457 r_symndx, symtab_hdr, sym_hashes,
459 unresolved_reloc, warned);
462 if (sec != NULL && elf_discarded_section (sec))
464 /* For relocs against symbols from removed linkonce sections,
465 or sections discarded by a linker script, we just want the
466 section contents zeroed. Avoid any special processing. */
467 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
473 if (info->relocatable)
476 r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
478 contents, rel->r_offset,
479 relocation, rel->r_addend,
480 info, sec, h == NULL);
482 if (r != bfd_reloc_ok)
485 const char *msg = (const char *) 0;
488 name = h->root.root.string;
491 name = (bfd_elf_string_from_elf_section
492 (input_bfd, symtab_hdr->sh_link, sym->st_name));
493 if (name == NULL || *name == '\0')
494 name = bfd_section_name (input_bfd, sec);
499 case bfd_reloc_overflow:
500 if (! ((*info->callbacks->reloc_overflow)
501 (info, (h ? &h->root : NULL), name, howto->name,
502 (bfd_vma) 0, input_bfd, input_section,
507 case bfd_reloc_undefined:
508 if (! ((*info->callbacks->undefined_symbol)
509 (info, name, input_bfd, input_section,
510 rel->r_offset, TRUE)))
514 case bfd_reloc_outofrange:
515 msg = _("internal error: out of range error");
518 case bfd_reloc_notsupported:
519 msg = _("internal error: unsupported relocation error");
522 case bfd_reloc_dangerous:
523 msg = _("internal error: dangerous error");
527 msg = _("internal error: unknown error");
531 if (!((*info->callbacks->warning)
532 (info, msg, name, input_bfd, input_section,
543 /* Object files encode the specific H8 model they were compiled
544 for in the ELF flags field.
546 Examine that field and return the proper BFD machine type for
549 elf32_h8_mach (flagword flags)
551 switch (flags & EF_H8_MACH)
553 case E_H8_MACH_H8300:
555 return bfd_mach_h8300;
557 case E_H8_MACH_H8300H:
558 return bfd_mach_h8300h;
560 case E_H8_MACH_H8300S:
561 return bfd_mach_h8300s;
563 case E_H8_MACH_H8300HN:
564 return bfd_mach_h8300hn;
566 case E_H8_MACH_H8300SN:
567 return bfd_mach_h8300sn;
569 case E_H8_MACH_H8300SX:
570 return bfd_mach_h8300sx;
572 case E_H8_MACH_H8300SXN:
573 return bfd_mach_h8300sxn;
577 /* The final processing done just before writing out a H8 ELF object
578 file. We use this opportunity to encode the BFD machine type
579 into the flags field in the object file. */
582 elf32_h8_final_write_processing (bfd *abfd,
583 bfd_boolean linker ATTRIBUTE_UNUSED)
587 switch (bfd_get_mach (abfd))
591 val = E_H8_MACH_H8300;
594 case bfd_mach_h8300h:
595 val = E_H8_MACH_H8300H;
598 case bfd_mach_h8300s:
599 val = E_H8_MACH_H8300S;
602 case bfd_mach_h8300hn:
603 val = E_H8_MACH_H8300HN;
606 case bfd_mach_h8300sn:
607 val = E_H8_MACH_H8300SN;
610 case bfd_mach_h8300sx:
611 val = E_H8_MACH_H8300SX;
614 case bfd_mach_h8300sxn:
615 val = E_H8_MACH_H8300SXN;
619 elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
620 elf_elfheader (abfd)->e_flags |= val;
623 /* Return nonzero if ABFD represents a valid H8 ELF object file; also
624 record the encoded machine type found in the ELF flags. */
627 elf32_h8_object_p (bfd *abfd)
629 bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
630 elf32_h8_mach (elf_elfheader (abfd)->e_flags));
634 /* Merge backend specific data from an object file to the output
635 object file when linking. The only data we need to copy at this
636 time is the architecture/machine information. */
639 elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
641 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
642 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
645 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
646 && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
648 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
649 bfd_get_mach (ibfd)))
656 /* This function handles relaxing for the H8..
658 There are a few relaxing opportunities available on the H8:
660 jmp/jsr:24 -> bra/bsr:8 2 bytes
661 The jmp may be completely eliminated if the previous insn is a
662 conditional branch to the insn after the jump. In that case
663 we invert the branch and delete the jump and save 4 bytes.
665 bCC:16 -> bCC:8 2 bytes
666 bsr:16 -> bsr:8 2 bytes
668 bset:16 -> bset:8 2 bytes
669 bset:24/32 -> bset:8 4 bytes
670 (also applicable to other bit manipulation instructions)
672 mov.b:16 -> mov.b:8 2 bytes
673 mov.b:24/32 -> mov.b:8 4 bytes
675 bset:24/32 -> bset:16 2 bytes
676 (also applicable to other bit manipulation instructions)
678 mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
681 elf32_h8_relax_section (bfd *abfd, asection *sec,
682 struct bfd_link_info *link_info, bfd_boolean *again)
684 Elf_Internal_Shdr *symtab_hdr;
685 Elf_Internal_Rela *internal_relocs;
686 Elf_Internal_Rela *irel, *irelend;
687 bfd_byte *contents = NULL;
688 Elf_Internal_Sym *isymbuf = NULL;
689 static asection *last_input_section = NULL;
690 static Elf_Internal_Rela *last_reloc = NULL;
692 /* Assume nothing changes. */
695 /* We don't have to do anything for a relocatable link, if
696 this section does not have relocs, or if this is not a
698 if (link_info->relocatable
699 || (sec->flags & SEC_RELOC) == 0
700 || sec->reloc_count == 0
701 || (sec->flags & SEC_CODE) == 0)
704 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
706 /* Get a copy of the native relocations. */
707 internal_relocs = (_bfd_elf_link_read_relocs
708 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
709 link_info->keep_memory));
710 if (internal_relocs == NULL)
713 if (sec != last_input_section)
716 last_input_section = sec;
718 /* Walk through the relocs looking for relaxing opportunities. */
719 irelend = internal_relocs + sec->reloc_count;
720 for (irel = internal_relocs; irel < irelend; irel++)
724 /* Keep track of the previous reloc so that we can delete
725 some long jumps created by the compiler. */
726 if (irel != internal_relocs)
727 last_reloc = irel - 1;
729 if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
730 && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
731 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
732 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
733 && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
736 /* Get the section contents if we haven't done so already. */
737 if (contents == NULL)
739 /* Get cached copy if it exists. */
740 if (elf_section_data (sec)->this_hdr.contents != NULL)
741 contents = elf_section_data (sec)->this_hdr.contents;
744 /* Go get them off disk. */
745 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
750 /* Read this BFD's local symbols if we haven't done so already. */
751 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
753 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
755 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
756 symtab_hdr->sh_info, 0,
762 /* Get the value of the symbol referred to by the reloc. */
763 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
765 /* A local symbol. */
766 Elf_Internal_Sym *isym;
769 isym = isymbuf + ELF32_R_SYM (irel->r_info);
770 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
771 symval = isym->st_value;
772 /* If the reloc is absolute, it will not have
773 a symbol or section associated with it. */
775 symval += sym_sec->output_section->vma
776 + sym_sec->output_offset;
781 struct elf_link_hash_entry *h;
783 /* An external symbol. */
784 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
785 h = elf_sym_hashes (abfd)[indx];
786 BFD_ASSERT (h != NULL);
787 if (h->root.type != bfd_link_hash_defined
788 && h->root.type != bfd_link_hash_defweak)
790 /* This appears to be a reference to an undefined
791 symbol. Just ignore it--it will be caught by the
792 regular reloc processing. */
796 symval = (h->root.u.def.value
797 + h->root.u.def.section->output_section->vma
798 + h->root.u.def.section->output_offset);
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. */
808 switch (ELF32_R_TYPE (irel->r_info))
810 /* Try to turn a 24-bit absolute branch/call into an 8-bit
811 pc-relative branch/call. */
814 bfd_vma value = symval + irel->r_addend;
817 /* Get the address of this instruction. */
818 dot = (sec->output_section->vma
819 + sec->output_offset + irel->r_offset - 1);
821 /* Compute the distance from this insn to the branch target. */
824 /* If the distance is within -126..+130 inclusive, then we can
825 relax this jump. +130 is valid since the target will move
826 two bytes closer if we do relax this branch. */
827 if ((int) gap >= -126 && (int) gap <= 130)
831 /* Note that we've changed the relocs, section contents,
833 elf_section_data (sec)->relocs = internal_relocs;
834 elf_section_data (sec)->this_hdr.contents = contents;
835 symtab_hdr->contents = (unsigned char *) isymbuf;
837 /* Get the instruction code being relaxed. */
838 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
840 /* If the previous instruction conditionally jumped around
841 this instruction, we may be able to reverse the condition
842 and redirect the previous instruction to the target of
845 Such sequences are used by the compiler to deal with
846 long conditional branches.
848 Only perform this optimisation for jumps (code 0x5a) not
849 subroutine calls, as otherwise it could transform:
862 which changes the call (jsr) into a branch (bne). */
867 && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
868 && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
871 asection *last_sym_sec;
872 Elf_Internal_Sym *last_sym;
874 /* We will need to examine the symbol used by the
875 previous relocation. */
877 last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
879 = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
880 last_value = (last_sym->st_value
881 + last_sym_sec->output_section->vma
882 + last_sym_sec->output_offset);
884 /* Verify that the previous relocation was for a
885 branch around this instruction and that no symbol
886 exists at the current location. */
887 if (last_value == dot + 4
888 && last_reloc->r_offset + 2 == irel->r_offset
889 && ! elf32_h8_symbol_address_p (abfd, sec, dot))
891 /* We can eliminate this jump. Twiddle the
892 previous relocation as necessary. */
894 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
895 ELF32_R_TYPE (R_H8_NONE));
898 = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
899 ELF32_R_TYPE (R_H8_PCREL8));
900 last_reloc->r_addend = irel->r_addend;
902 code = bfd_get_8 (abfd,
903 contents + last_reloc->r_offset - 1);
907 contents + last_reloc->r_offset - 1);
909 /* Delete four bytes of data. */
910 if (!elf32_h8_relax_delete_bytes (abfd, sec,
922 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
923 else if (code == 0x5a)
925 bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
929 /* Fix the relocation's type. */
930 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
933 /* Delete two bytes of data. */
934 if (!elf32_h8_relax_delete_bytes (abfd, sec,
935 irel->r_offset + 1, 2))
938 /* That will change things, so, we should relax again.
939 Note that this is not required, and it may be slow. */
945 /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
949 bfd_vma value = symval + irel->r_addend;
953 /* Get the address of this instruction. */
954 dot = (sec->output_section->vma
956 + irel->r_offset - 2);
960 /* If the distance is within -126..+130 inclusive, then we can
961 relax this jump. +130 is valid since the target will move
962 two bytes closer if we do relax this branch. */
963 if ((int) gap >= -126 && (int) gap <= 130)
967 /* Note that we've changed the relocs, section contents,
969 elf_section_data (sec)->relocs = internal_relocs;
970 elf_section_data (sec)->this_hdr.contents = contents;
971 symtab_hdr->contents = (unsigned char *) isymbuf;
973 /* Get the opcode. */
974 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
978 /* bCC:16 -> bCC:8 */
979 /* Get the second byte of the original insn, which
980 contains the condition code. */
981 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
983 /* Compute the fisrt byte of the relaxed
984 instruction. The original sequence 0x58 0xX0
985 is relaxed to 0x4X, where X represents the
990 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
992 else if (code == 0x5c)
994 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
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)
1210 /* Note that we've changed the relocs, section contents,
1212 elf_section_data (sec)->relocs = internal_relocs;
1213 elf_section_data (sec)->this_hdr.contents = contents;
1214 symtab_hdr->contents = (unsigned char *) isymbuf;
1216 /* Get the opcode. */
1217 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1219 /* Fix the opcode. For all the instructions that
1220 belong to this relaxation, we simply need to turn
1221 off bit 0x20 in the previous byte. */
1224 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1226 /* Fix the relocation's type. */
1227 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1230 /* Delete two bytes of data. */
1231 if (!elf32_h8_relax_delete_bytes (abfd, sec,
1232 irel->r_offset + 1, 2))
1235 /* That will change things, so, we should relax again.
1236 Note that this is not required, and it may be slow. */
1248 && symtab_hdr->contents != (unsigned char *) isymbuf)
1250 if (! link_info->keep_memory)
1253 symtab_hdr->contents = (unsigned char *) isymbuf;
1256 if (contents != NULL
1257 && elf_section_data (sec)->this_hdr.contents != contents)
1259 if (! link_info->keep_memory)
1263 /* Cache the section contents for elf_link_input_bfd. */
1264 elf_section_data (sec)->this_hdr.contents = contents;
1268 if (internal_relocs != NULL
1269 && elf_section_data (sec)->relocs != internal_relocs)
1270 free (internal_relocs);
1276 && symtab_hdr->contents != (unsigned char *) isymbuf)
1278 if (contents != NULL
1279 && elf_section_data (sec)->this_hdr.contents != contents)
1281 if (internal_relocs != NULL
1282 && elf_section_data (sec)->relocs != internal_relocs)
1283 free (internal_relocs);
1287 /* Delete some bytes from a section while relaxing. */
1290 elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1292 Elf_Internal_Shdr *symtab_hdr;
1293 unsigned int sec_shndx;
1295 Elf_Internal_Rela *irel, *irelend;
1296 Elf_Internal_Rela *irelalign;
1297 Elf_Internal_Sym *isym;
1298 Elf_Internal_Sym *isymend;
1300 struct elf_link_hash_entry **sym_hashes;
1301 struct elf_link_hash_entry **end_hashes;
1302 unsigned int symcount;
1304 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1306 contents = elf_section_data (sec)->this_hdr.contents;
1308 /* The deletion must stop at the next ALIGN reloc for an aligment
1309 power larger than the number of bytes we are deleting. */
1314 irel = elf_section_data (sec)->relocs;
1315 irelend = irel + sec->reloc_count;
1317 /* Actually delete the bytes. */
1318 memmove (contents + addr, contents + addr + count,
1319 (size_t) (toaddr - addr - count));
1322 /* Adjust all the relocs. */
1323 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1325 /* Get the new reloc address. */
1326 if ((irel->r_offset > addr
1327 && irel->r_offset < toaddr))
1328 irel->r_offset -= count;
1331 /* Adjust the local symbols defined in this section. */
1332 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1333 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1334 isymend = isym + symtab_hdr->sh_info;
1335 for (; isym < isymend; isym++)
1337 if (isym->st_shndx == sec_shndx
1338 && isym->st_value > addr
1339 && isym->st_value < toaddr)
1340 isym->st_value -= count;
1343 /* Now adjust the global symbols defined in this section. */
1344 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1345 - symtab_hdr->sh_info);
1346 sym_hashes = elf_sym_hashes (abfd);
1347 end_hashes = sym_hashes + symcount;
1348 for (; sym_hashes < end_hashes; sym_hashes++)
1350 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1351 if ((sym_hash->root.type == bfd_link_hash_defined
1352 || sym_hash->root.type == bfd_link_hash_defweak)
1353 && sym_hash->root.u.def.section == sec
1354 && sym_hash->root.u.def.value > addr
1355 && sym_hash->root.u.def.value < toaddr)
1357 sym_hash->root.u.def.value -= count;
1364 /* Return TRUE if a symbol exists at the given address, else return
1367 elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1369 Elf_Internal_Shdr *symtab_hdr;
1370 unsigned int sec_shndx;
1371 Elf_Internal_Sym *isym;
1372 Elf_Internal_Sym *isymend;
1373 struct elf_link_hash_entry **sym_hashes;
1374 struct elf_link_hash_entry **end_hashes;
1375 unsigned int symcount;
1377 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1379 /* Examine all the symbols. */
1380 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1381 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1382 isymend = isym + symtab_hdr->sh_info;
1383 for (; isym < isymend; isym++)
1385 if (isym->st_shndx == sec_shndx
1386 && isym->st_value == addr)
1390 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1391 - symtab_hdr->sh_info);
1392 sym_hashes = elf_sym_hashes (abfd);
1393 end_hashes = sym_hashes + symcount;
1394 for (; sym_hashes < end_hashes; sym_hashes++)
1396 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1397 if ((sym_hash->root.type == bfd_link_hash_defined
1398 || sym_hash->root.type == bfd_link_hash_defweak)
1399 && sym_hash->root.u.def.section == sec
1400 && sym_hash->root.u.def.value == addr)
1407 /* This is a version of bfd_generic_get_relocated_section_contents
1408 which uses elf32_h8_relocate_section. */
1411 elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1412 struct bfd_link_info *link_info,
1413 struct bfd_link_order *link_order,
1415 bfd_boolean relocatable,
1418 Elf_Internal_Shdr *symtab_hdr;
1419 asection *input_section = link_order->u.indirect.section;
1420 bfd *input_bfd = input_section->owner;
1421 asection **sections = NULL;
1422 Elf_Internal_Rela *internal_relocs = NULL;
1423 Elf_Internal_Sym *isymbuf = NULL;
1425 /* We only need to handle the case of relaxing, or of having a
1426 particular set of section contents, specially. */
1428 || elf_section_data (input_section)->this_hdr.contents == NULL)
1429 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1434 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1436 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1437 (size_t) input_section->size);
1439 if ((input_section->flags & SEC_RELOC) != 0
1440 && input_section->reloc_count > 0)
1443 Elf_Internal_Sym *isym, *isymend;
1446 internal_relocs = (_bfd_elf_link_read_relocs
1447 (input_bfd, input_section, (PTR) NULL,
1448 (Elf_Internal_Rela *) NULL, FALSE));
1449 if (internal_relocs == NULL)
1452 if (symtab_hdr->sh_info != 0)
1454 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1455 if (isymbuf == NULL)
1456 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1457 symtab_hdr->sh_info, 0,
1459 if (isymbuf == NULL)
1463 amt = symtab_hdr->sh_info;
1464 amt *= sizeof (asection *);
1465 sections = (asection **) bfd_malloc (amt);
1466 if (sections == NULL && amt != 0)
1469 isymend = isymbuf + symtab_hdr->sh_info;
1470 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1474 if (isym->st_shndx == SHN_UNDEF)
1475 isec = bfd_und_section_ptr;
1476 else if (isym->st_shndx == SHN_ABS)
1477 isec = bfd_abs_section_ptr;
1478 else if (isym->st_shndx == SHN_COMMON)
1479 isec = bfd_com_section_ptr;
1481 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1486 if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1487 input_section, data, internal_relocs,
1491 if (sections != NULL)
1494 && symtab_hdr->contents != (unsigned char *) isymbuf)
1496 if (elf_section_data (input_section)->relocs != internal_relocs)
1497 free (internal_relocs);
1503 if (sections != NULL)
1506 && symtab_hdr->contents != (unsigned char *) isymbuf)
1508 if (internal_relocs != NULL
1509 && elf_section_data (input_section)->relocs != internal_relocs)
1510 free (internal_relocs);
1515 #define TARGET_BIG_SYM bfd_elf32_h8300_vec
1516 #define TARGET_BIG_NAME "elf32-h8300"
1517 #define ELF_ARCH bfd_arch_h8300
1518 #define ELF_MACHINE_CODE EM_H8_300
1519 #define ELF_MAXPAGESIZE 0x1
1520 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1521 #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1522 #define elf_info_to_howto elf32_h8_info_to_howto
1523 #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1525 /* So we can set/examine bits in e_flags to get the specific
1526 H8 architecture in use. */
1527 #define elf_backend_final_write_processing \
1528 elf32_h8_final_write_processing
1529 #define elf_backend_object_p \
1531 #define bfd_elf32_bfd_merge_private_bfd_data \
1532 elf32_h8_merge_private_bfd_data
1534 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1535 defaults to using _bfd_generic_link_hash_table_create, but
1536 bfd_elf_size_dynamic_sections uses
1537 dynobj = elf_hash_table (info)->dynobj;
1538 and thus requires an elf hash table. */
1539 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1541 /* Use an H8 specific linker, not the ELF generic linker. */
1542 #define elf_backend_relocate_section elf32_h8_relocate_section
1543 #define elf_backend_rela_normal 1
1544 #define elf_backend_can_gc_sections 1
1546 /* And relaxing stuff. */
1547 #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1548 #define bfd_elf32_bfd_get_relocated_section_contents \
1549 elf32_h8_get_relocated_section_contents
1552 #include "elf32-target.h"