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
];
255 elf32_h8_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*bfd_reloc
,
256 Elf_Internal_Rela
*elf_reloc
)
261 r
= ELF32_R_TYPE (elf_reloc
->r_info
);
262 for (i
= 0; i
< sizeof (h8_elf_howto_table
) / sizeof (reloc_howto_type
); i
++)
263 if (h8_elf_howto_table
[i
].type
== r
)
265 bfd_reloc
->howto
= &h8_elf_howto_table
[i
];
272 elf32_h8_info_to_howto_rel (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*bfd_reloc
,
273 Elf_Internal_Rela
*elf_reloc ATTRIBUTE_UNUSED
)
278 r
= ELF32_R_TYPE (elf_reloc
->r_info
);
279 bfd_reloc
->howto
= &h8_elf_howto_table
[r
];
282 /* Special handling for H8/300 relocs.
283 We only come here for pcrel stuff and return normally if not an -r link.
284 When doing -r, we can't do any arithmetic for the pcrel stuff, because
285 we support relaxing on the H8/300 series chips. */
286 static bfd_reloc_status_type
287 special (bfd
*abfd ATTRIBUTE_UNUSED
,
288 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
289 asymbol
*symbol ATTRIBUTE_UNUSED
,
290 PTR data ATTRIBUTE_UNUSED
,
291 asection
*input_section ATTRIBUTE_UNUSED
,
293 char **error_message ATTRIBUTE_UNUSED
)
295 if (output_bfd
== (bfd
*) NULL
)
296 return bfd_reloc_continue
;
298 /* Adjust the reloc address to that in the output section. */
299 reloc_entry
->address
+= input_section
->output_offset
;
303 /* Perform a relocation as part of a final link. */
304 static bfd_reloc_status_type
305 elf32_h8_final_link_relocate (unsigned long r_type
, bfd
*input_bfd
,
306 bfd
*output_bfd ATTRIBUTE_UNUSED
,
307 asection
*input_section ATTRIBUTE_UNUSED
,
308 bfd_byte
*contents
, bfd_vma offset
,
309 bfd_vma value
, bfd_vma addend
,
310 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
311 asection
*sym_sec ATTRIBUTE_UNUSED
,
312 int is_local ATTRIBUTE_UNUSED
)
314 bfd_byte
*hit_data
= contents
+ offset
;
325 bfd_put_32 (input_bfd
, value
, hit_data
);
332 bfd_put_16 (input_bfd
, value
, hit_data
);
339 bfd_put_8 (input_bfd
, value
, hit_data
);
345 /* HIT_DATA is the address for the first byte for the relocated
346 value. Subtract 1 so that we can manipulate the data in 32-bit
350 /* Clear out the top byte in value. */
353 /* Retrieve the type byte for value from the section contents. */
354 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
356 /* Now scribble it out in one 32-bit hunk. */
357 bfd_put_32 (input_bfd
, value
, hit_data
);
361 value
-= (input_section
->output_section
->vma
362 + input_section
->output_offset
);
366 /* The value is relative to the start of the instruction,
367 not the relocation offset. Subtract 2 to account for
371 bfd_put_16 (input_bfd
, value
, hit_data
);
375 value
-= (input_section
->output_section
->vma
376 + input_section
->output_offset
);
380 /* The value is relative to the start of the instruction,
381 not the relocation offset. Subtract 1 to account for
385 bfd_put_8 (input_bfd
, value
, hit_data
);
389 return bfd_reloc_notsupported
;
393 /* Relocate an H8 ELF section. */
395 elf32_h8_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
396 bfd
*input_bfd
, asection
*input_section
,
397 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
398 Elf_Internal_Sym
*local_syms
,
399 asection
**local_sections
)
401 Elf_Internal_Shdr
*symtab_hdr
;
402 struct elf_link_hash_entry
**sym_hashes
;
403 Elf_Internal_Rela
*rel
, *relend
;
405 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
406 sym_hashes
= elf_sym_hashes (input_bfd
);
409 relend
= relocs
+ input_section
->reloc_count
;
410 for (; rel
< relend
; rel
++)
413 unsigned long r_symndx
;
414 Elf_Internal_Sym
*sym
;
416 struct elf_link_hash_entry
*h
;
418 bfd_reloc_status_type r
;
420 reloc_howto_type
*howto
;
422 elf32_h8_info_to_howto (input_bfd
, &bfd_reloc
, rel
);
423 howto
= bfd_reloc
.howto
;
425 r_symndx
= ELF32_R_SYM (rel
->r_info
);
426 r_type
= ELF32_R_TYPE (rel
->r_info
);
430 if (r_symndx
< symtab_hdr
->sh_info
)
432 sym
= local_syms
+ r_symndx
;
433 sec
= local_sections
[r_symndx
];
434 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
438 bfd_boolean unresolved_reloc
, warned
;
440 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
441 r_symndx
, symtab_hdr
, sym_hashes
,
443 unresolved_reloc
, warned
);
446 if (sec
!= NULL
&& elf_discarded_section (sec
))
448 /* For relocs against symbols from removed linkonce sections,
449 or sections discarded by a linker script, we just want the
450 section contents zeroed. Avoid any special processing. */
451 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
457 if (info
->relocatable
)
460 r
= elf32_h8_final_link_relocate (r_type
, input_bfd
, output_bfd
,
462 contents
, rel
->r_offset
,
463 relocation
, rel
->r_addend
,
464 info
, sec
, h
== NULL
);
466 if (r
!= bfd_reloc_ok
)
469 const char *msg
= (const char *) 0;
472 name
= h
->root
.root
.string
;
475 name
= (bfd_elf_string_from_elf_section
476 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
477 if (name
== NULL
|| *name
== '\0')
478 name
= bfd_section_name (input_bfd
, sec
);
483 case bfd_reloc_overflow
:
484 if (! ((*info
->callbacks
->reloc_overflow
)
485 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
486 (bfd_vma
) 0, input_bfd
, input_section
,
491 case bfd_reloc_undefined
:
492 if (! ((*info
->callbacks
->undefined_symbol
)
493 (info
, name
, input_bfd
, input_section
,
494 rel
->r_offset
, TRUE
)))
498 case bfd_reloc_outofrange
:
499 msg
= _("internal error: out of range error");
502 case bfd_reloc_notsupported
:
503 msg
= _("internal error: unsupported relocation error");
506 case bfd_reloc_dangerous
:
507 msg
= _("internal error: dangerous error");
511 msg
= _("internal error: unknown error");
515 if (!((*info
->callbacks
->warning
)
516 (info
, msg
, name
, input_bfd
, input_section
,
527 /* Object files encode the specific H8 model they were compiled
528 for in the ELF flags field.
530 Examine that field and return the proper BFD machine type for
533 elf32_h8_mach (flagword flags
)
535 switch (flags
& EF_H8_MACH
)
537 case E_H8_MACH_H8300
:
539 return bfd_mach_h8300
;
541 case E_H8_MACH_H8300H
:
542 return bfd_mach_h8300h
;
544 case E_H8_MACH_H8300S
:
545 return bfd_mach_h8300s
;
547 case E_H8_MACH_H8300HN
:
548 return bfd_mach_h8300hn
;
550 case E_H8_MACH_H8300SN
:
551 return bfd_mach_h8300sn
;
553 case E_H8_MACH_H8300SX
:
554 return bfd_mach_h8300sx
;
556 case E_H8_MACH_H8300SXN
:
557 return bfd_mach_h8300sxn
;
561 /* The final processing done just before writing out a H8 ELF object
562 file. We use this opportunity to encode the BFD machine type
563 into the flags field in the object file. */
566 elf32_h8_final_write_processing (bfd
*abfd
,
567 bfd_boolean linker ATTRIBUTE_UNUSED
)
571 switch (bfd_get_mach (abfd
))
575 val
= E_H8_MACH_H8300
;
578 case bfd_mach_h8300h
:
579 val
= E_H8_MACH_H8300H
;
582 case bfd_mach_h8300s
:
583 val
= E_H8_MACH_H8300S
;
586 case bfd_mach_h8300hn
:
587 val
= E_H8_MACH_H8300HN
;
590 case bfd_mach_h8300sn
:
591 val
= E_H8_MACH_H8300SN
;
594 case bfd_mach_h8300sx
:
595 val
= E_H8_MACH_H8300SX
;
598 case bfd_mach_h8300sxn
:
599 val
= E_H8_MACH_H8300SXN
;
603 elf_elfheader (abfd
)->e_flags
&= ~ (EF_H8_MACH
);
604 elf_elfheader (abfd
)->e_flags
|= val
;
607 /* Return nonzero if ABFD represents a valid H8 ELF object file; also
608 record the encoded machine type found in the ELF flags. */
611 elf32_h8_object_p (bfd
*abfd
)
613 bfd_default_set_arch_mach (abfd
, bfd_arch_h8300
,
614 elf32_h8_mach (elf_elfheader (abfd
)->e_flags
));
618 /* Merge backend specific data from an object file to the output
619 object file when linking. The only data we need to copy at this
620 time is the architecture/machine information. */
623 elf32_h8_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
625 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
626 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
629 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
630 && bfd_get_mach (obfd
) < bfd_get_mach (ibfd
))
632 if (! bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
633 bfd_get_mach (ibfd
)))
640 /* This function handles relaxing for the H8..
642 There are a few relaxing opportunities available on the H8:
644 jmp/jsr:24 -> bra/bsr:8 2 bytes
645 The jmp may be completely eliminated if the previous insn is a
646 conditional branch to the insn after the jump. In that case
647 we invert the branch and delete the jump and save 4 bytes.
649 bCC:16 -> bCC:8 2 bytes
650 bsr:16 -> bsr:8 2 bytes
652 bset:16 -> bset:8 2 bytes
653 bset:24/32 -> bset:8 4 bytes
654 (also applicable to other bit manipulation instructions)
656 mov.b:16 -> mov.b:8 2 bytes
657 mov.b:24/32 -> mov.b:8 4 bytes
659 bset:24/32 -> bset:16 2 bytes
660 (also applicable to other bit manipulation instructions)
662 mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
665 elf32_h8_relax_section (bfd
*abfd
, asection
*sec
,
666 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
668 Elf_Internal_Shdr
*symtab_hdr
;
669 Elf_Internal_Rela
*internal_relocs
;
670 Elf_Internal_Rela
*irel
, *irelend
;
671 bfd_byte
*contents
= NULL
;
672 Elf_Internal_Sym
*isymbuf
= NULL
;
673 static asection
*last_input_section
= NULL
;
674 static Elf_Internal_Rela
*last_reloc
= NULL
;
676 /* Assume nothing changes. */
679 /* We don't have to do anything for a relocatable link, if
680 this section does not have relocs, or if this is not a
682 if (link_info
->relocatable
683 || (sec
->flags
& SEC_RELOC
) == 0
684 || sec
->reloc_count
== 0
685 || (sec
->flags
& SEC_CODE
) == 0)
688 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
690 /* Get a copy of the native relocations. */
691 internal_relocs
= (_bfd_elf_link_read_relocs
692 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
693 link_info
->keep_memory
));
694 if (internal_relocs
== NULL
)
697 if (sec
!= last_input_section
)
700 last_input_section
= sec
;
702 /* Walk through the relocs looking for relaxing opportunities. */
703 irelend
= internal_relocs
+ sec
->reloc_count
;
704 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
708 /* Keep track of the previous reloc so that we can delete
709 some long jumps created by the compiler. */
710 if (irel
!= internal_relocs
)
711 last_reloc
= irel
- 1;
713 if (ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR24R8
714 && ELF32_R_TYPE (irel
->r_info
) != R_H8_PCREL16
715 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR16A8
716 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR24A8
717 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR32A16
)
720 /* Get the section contents if we haven't done so already. */
721 if (contents
== NULL
)
723 /* Get cached copy if it exists. */
724 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
725 contents
= elf_section_data (sec
)->this_hdr
.contents
;
728 /* Go get them off disk. */
729 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
734 /* Read this BFD's local symbols if we haven't done so already. */
735 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
737 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
739 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
740 symtab_hdr
->sh_info
, 0,
746 /* Get the value of the symbol referred to by the reloc. */
747 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
749 /* A local symbol. */
750 Elf_Internal_Sym
*isym
;
753 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
754 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
755 symval
= isym
->st_value
;
756 /* If the reloc is absolute, it will not have
757 a symbol or section associated with it. */
759 symval
+= sym_sec
->output_section
->vma
760 + sym_sec
->output_offset
;
765 struct elf_link_hash_entry
*h
;
767 /* An external symbol. */
768 indx
= ELF32_R_SYM (irel
->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 /* For simplicity of coding, we are going to modify the section
786 contents, the section relocs, and the BFD symbol table. We
787 must tell the rest of the code not to free up this
788 information. It would be possible to instead create a table
789 of changes which have to be made, as is done in coff-mips.c;
790 that would be more work, but would require less memory when
791 the linker is run. */
792 switch (ELF32_R_TYPE (irel
->r_info
))
794 /* Try to turn a 24-bit absolute branch/call into an 8-bit
795 pc-relative branch/call. */
798 bfd_vma value
= symval
+ irel
->r_addend
;
801 /* Get the address of this instruction. */
802 dot
= (sec
->output_section
->vma
803 + sec
->output_offset
+ irel
->r_offset
- 1);
805 /* Compute the distance from this insn to the branch target. */
808 /* If the distance is within -126..+130 inclusive, then we can
809 relax this jump. +130 is valid since the target will move
810 two bytes closer if we do relax this branch. */
811 if ((int) gap
>= -126 && (int) gap
<= 130)
815 /* Note that we've changed the relocs, section contents,
817 elf_section_data (sec
)->relocs
= internal_relocs
;
818 elf_section_data (sec
)->this_hdr
.contents
= contents
;
819 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
821 /* Get the instruction code being relaxed. */
822 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
824 /* If the previous instruction conditionally jumped around
825 this instruction, we may be able to reverse the condition
826 and redirect the previous instruction to the target of
829 Such sequences are used by the compiler to deal with
830 long conditional branches.
832 Only perform this optimisation for jumps (code 0x5a) not
833 subroutine calls, as otherwise it could transform:
846 which changes the call (jsr) into a branch (bne). */
851 && ELF32_R_TYPE (last_reloc
->r_info
) == R_H8_PCREL8
852 && ELF32_R_SYM (last_reloc
->r_info
) < symtab_hdr
->sh_info
)
855 asection
*last_sym_sec
;
856 Elf_Internal_Sym
*last_sym
;
858 /* We will need to examine the symbol used by the
859 previous relocation. */
861 last_sym
= isymbuf
+ ELF32_R_SYM (last_reloc
->r_info
);
863 = bfd_section_from_elf_index (abfd
, last_sym
->st_shndx
);
864 last_value
= (last_sym
->st_value
865 + last_sym_sec
->output_section
->vma
866 + last_sym_sec
->output_offset
);
868 /* Verify that the previous relocation was for a
869 branch around this instruction and that no symbol
870 exists at the current location. */
871 if (last_value
== dot
+ 4
872 && last_reloc
->r_offset
+ 2 == irel
->r_offset
873 && ! elf32_h8_symbol_address_p (abfd
, sec
, dot
))
875 /* We can eliminate this jump. Twiddle the
876 previous relocation as necessary. */
878 = ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
879 ELF32_R_TYPE (R_H8_NONE
));
882 = ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
883 ELF32_R_TYPE (R_H8_PCREL8
));
884 last_reloc
->r_addend
= irel
->r_addend
;
886 code
= bfd_get_8 (abfd
,
887 contents
+ last_reloc
->r_offset
- 1);
891 contents
+ last_reloc
->r_offset
- 1);
893 /* Delete four bytes of data. */
894 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
906 bfd_put_8 (abfd
, 0x55, contents
+ irel
->r_offset
- 1);
907 else if (code
== 0x5a)
909 bfd_put_8 (abfd
, 0x40, contents
+ irel
->r_offset
- 1);
913 /* Fix the relocation's type. */
914 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
917 /* Delete two bytes of data. */
918 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
919 irel
->r_offset
+ 1, 2))
922 /* That will change things, so, we should relax again.
923 Note that this is not required, and it may be slow. */
929 /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
933 bfd_vma value
= symval
+ irel
->r_addend
;
937 /* Get the address of this instruction. */
938 dot
= (sec
->output_section
->vma
940 + irel
->r_offset
- 2);
944 /* If the distance is within -126..+130 inclusive, then we can
945 relax this jump. +130 is valid since the target will move
946 two bytes closer if we do relax this branch. */
947 if ((int) gap
>= -126 && (int) gap
<= 130)
951 /* Note that we've changed the relocs, section contents,
953 elf_section_data (sec
)->relocs
= internal_relocs
;
954 elf_section_data (sec
)->this_hdr
.contents
= contents
;
955 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
957 /* Get the opcode. */
958 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
962 /* bCC:16 -> bCC:8 */
963 /* Get the second byte of the original insn, which
964 contains the condition code. */
965 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
967 /* Compute the fisrt byte of the relaxed
968 instruction. The original sequence 0x58 0xX0
969 is relaxed to 0x4X, where X represents the
974 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
976 else if (code
== 0x5c)
978 bfd_put_8 (abfd
, 0x55, contents
+ irel
->r_offset
- 2);
982 /* Fix the relocation's type. */
983 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
987 /* Delete two bytes of data. */
988 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
989 irel
->r_offset
+ 1, 2))
992 /* That will change things, so, we should relax again.
993 Note that this is not required, and it may be slow. */
999 /* This is a 16-bit absolute address in one of the following
1002 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1003 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1006 We may relax this into an 8-bit absolute address if it's in
1012 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1013 if (value
>= 0xffffff00u
)
1016 unsigned char temp_code
;
1018 /* Note that we've changed the relocs, section contents,
1020 elf_section_data (sec
)->relocs
= internal_relocs
;
1021 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1022 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1024 /* Get the opcode. */
1025 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
1027 /* All instructions with R_H8_DIR16A8 start with
1032 temp_code
= code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1033 /* If this is a mov.b instruction, clear the lower
1034 nibble, which contains the source/destination
1036 if ((temp_code
& 0x10) != 0x10)
1042 /* This is mov.b @aa:16,Rd. */
1043 bfd_put_8 (abfd
, (code
& 0xf) | 0x20,
1044 contents
+ irel
->r_offset
- 2);
1047 /* This is mov.b Rs,@aa:16. */
1048 bfd_put_8 (abfd
, (code
& 0xf) | 0x30,
1049 contents
+ irel
->r_offset
- 2);
1052 /* This is a bit-maniputation instruction that
1053 stores one bit into memory, one of "bclr",
1054 "bist", "bnot", "bset", and "bst". */
1055 bfd_put_8 (abfd
, 0x7f, contents
+ irel
->r_offset
- 2);
1058 /* This is a bit-maniputation instruction that
1059 loads one bit from memory, one of "band",
1060 "biand", "bild", "bior", "bixor", "bld", "bor",
1061 "btst", and "bxor". */
1062 bfd_put_8 (abfd
, 0x7e, contents
+ irel
->r_offset
- 2);
1068 /* Fix the relocation's type. */
1069 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1072 /* Move the relocation. */
1075 /* Delete two bytes of data. */
1076 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1077 irel
->r_offset
+ 1, 2))
1080 /* That will change things, so, we should relax again.
1081 Note that this is not required, and it may be slow. */
1087 /* This is a 24-bit absolute address in one of the following
1090 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1091 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1094 We may relax this into an 8-bit absolute address if it's in
1100 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1101 if (value
>= 0xffffff00u
)
1104 unsigned char temp_code
;
1106 /* Note that we've changed the relocs, section contents,
1108 elf_section_data (sec
)->relocs
= internal_relocs
;
1109 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1110 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1112 /* Get the opcode. */
1113 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
1115 /* All instructions with R_H8_DIR24A8 start with
1120 temp_code
= code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1122 /* If this is a mov.b instruction, clear the lower
1123 nibble, which contains the source/destination
1125 if ((temp_code
& 0x30) != 0x30)
1131 /* This is mov.b @aa:24/32,Rd. */
1132 bfd_put_8 (abfd
, (code
& 0xf) | 0x20,
1133 contents
+ irel
->r_offset
- 2);
1136 /* This is mov.b Rs,@aa:24/32. */
1137 bfd_put_8 (abfd
, (code
& 0xf) | 0x30,
1138 contents
+ irel
->r_offset
- 2);
1141 /* This is a bit-maniputation instruction that
1142 stores one bit into memory, one of "bclr",
1143 "bist", "bnot", "bset", and "bst". */
1144 bfd_put_8 (abfd
, 0x7f, contents
+ irel
->r_offset
- 2);
1147 /* This is a bit-maniputation instruction that
1148 loads one bit from memory, one of "band",
1149 "biand", "bild", "bior", "bixor", "bld", "bor",
1150 "btst", and "bxor". */
1151 bfd_put_8 (abfd
, 0x7e, contents
+ irel
->r_offset
- 2);
1157 /* Fix the relocation's type. */
1158 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1162 /* Delete two bytes of data. */
1163 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1164 irel
->r_offset
+ 1, 4))
1167 /* That will change things, so, we should relax again.
1168 Note that this is not required, and it may be slow. */
1176 /* This is a 24-/32-bit absolute address in one of the
1177 following instructions:
1179 "band", "bclr", "biand", "bild", "bior", "bist",
1180 "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1181 "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1183 We may relax this into an 16-bit absolute address if it's
1184 in the right range. */
1189 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1190 if (value
<= 0x7fff || value
>= 0xffff8000u
)
1194 /* Note that we've changed the relocs, section contents,
1196 elf_section_data (sec
)->relocs
= internal_relocs
;
1197 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1198 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1200 /* Get the opcode. */
1201 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1203 /* Fix the opcode. For all the instructions that
1204 belong to this relaxation, we simply need to turn
1205 off bit 0x20 in the previous byte. */
1208 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1210 /* Fix the relocation's type. */
1211 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1214 /* Delete two bytes of data. */
1215 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1216 irel
->r_offset
+ 1, 2))
1219 /* That will change things, so, we should relax again.
1220 Note that this is not required, and it may be slow. */
1232 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1234 if (! link_info
->keep_memory
)
1237 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1240 if (contents
!= NULL
1241 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1243 if (! link_info
->keep_memory
)
1247 /* Cache the section contents for elf_link_input_bfd. */
1248 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1252 if (internal_relocs
!= NULL
1253 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1254 free (internal_relocs
);
1260 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1262 if (contents
!= NULL
1263 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1265 if (internal_relocs
!= NULL
1266 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1267 free (internal_relocs
);
1271 /* Delete some bytes from a section while relaxing. */
1274 elf32_h8_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, int count
)
1276 Elf_Internal_Shdr
*symtab_hdr
;
1277 unsigned int sec_shndx
;
1279 Elf_Internal_Rela
*irel
, *irelend
;
1280 Elf_Internal_Rela
*irelalign
;
1281 Elf_Internal_Sym
*isym
;
1282 Elf_Internal_Sym
*isymend
;
1284 struct elf_link_hash_entry
**sym_hashes
;
1285 struct elf_link_hash_entry
**end_hashes
;
1286 unsigned int symcount
;
1288 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1290 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1292 /* The deletion must stop at the next ALIGN reloc for an aligment
1293 power larger than the number of bytes we are deleting. */
1298 irel
= elf_section_data (sec
)->relocs
;
1299 irelend
= irel
+ sec
->reloc_count
;
1301 /* Actually delete the bytes. */
1302 memmove (contents
+ addr
, contents
+ addr
+ count
,
1303 (size_t) (toaddr
- addr
- count
));
1306 /* Adjust all the relocs. */
1307 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1309 /* Get the new reloc address. */
1310 if ((irel
->r_offset
> addr
1311 && irel
->r_offset
< toaddr
))
1312 irel
->r_offset
-= count
;
1315 /* Adjust the local symbols defined in this section. */
1316 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1317 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1318 isymend
= isym
+ symtab_hdr
->sh_info
;
1319 for (; isym
< isymend
; isym
++)
1321 if (isym
->st_shndx
== sec_shndx
1322 && isym
->st_value
> addr
1323 && isym
->st_value
< toaddr
)
1324 isym
->st_value
-= count
;
1327 /* Now adjust the global symbols defined in this section. */
1328 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1329 - symtab_hdr
->sh_info
);
1330 sym_hashes
= elf_sym_hashes (abfd
);
1331 end_hashes
= sym_hashes
+ symcount
;
1332 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1334 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1335 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1336 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1337 && sym_hash
->root
.u
.def
.section
== sec
1338 && sym_hash
->root
.u
.def
.value
> addr
1339 && sym_hash
->root
.u
.def
.value
< toaddr
)
1341 sym_hash
->root
.u
.def
.value
-= count
;
1348 /* Return TRUE if a symbol exists at the given address, else return
1351 elf32_h8_symbol_address_p (bfd
*abfd
, asection
*sec
, bfd_vma addr
)
1353 Elf_Internal_Shdr
*symtab_hdr
;
1354 unsigned int sec_shndx
;
1355 Elf_Internal_Sym
*isym
;
1356 Elf_Internal_Sym
*isymend
;
1357 struct elf_link_hash_entry
**sym_hashes
;
1358 struct elf_link_hash_entry
**end_hashes
;
1359 unsigned int symcount
;
1361 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1363 /* Examine all the symbols. */
1364 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1365 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1366 isymend
= isym
+ symtab_hdr
->sh_info
;
1367 for (; isym
< isymend
; isym
++)
1369 if (isym
->st_shndx
== sec_shndx
1370 && isym
->st_value
== addr
)
1374 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1375 - symtab_hdr
->sh_info
);
1376 sym_hashes
= elf_sym_hashes (abfd
);
1377 end_hashes
= sym_hashes
+ symcount
;
1378 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1380 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1381 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1382 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1383 && sym_hash
->root
.u
.def
.section
== sec
1384 && sym_hash
->root
.u
.def
.value
== addr
)
1391 /* This is a version of bfd_generic_get_relocated_section_contents
1392 which uses elf32_h8_relocate_section. */
1395 elf32_h8_get_relocated_section_contents (bfd
*output_bfd
,
1396 struct bfd_link_info
*link_info
,
1397 struct bfd_link_order
*link_order
,
1399 bfd_boolean relocatable
,
1402 Elf_Internal_Shdr
*symtab_hdr
;
1403 asection
*input_section
= link_order
->u
.indirect
.section
;
1404 bfd
*input_bfd
= input_section
->owner
;
1405 asection
**sections
= NULL
;
1406 Elf_Internal_Rela
*internal_relocs
= NULL
;
1407 Elf_Internal_Sym
*isymbuf
= NULL
;
1409 /* We only need to handle the case of relaxing, or of having a
1410 particular set of section contents, specially. */
1412 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1413 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1418 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1420 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1421 (size_t) input_section
->size
);
1423 if ((input_section
->flags
& SEC_RELOC
) != 0
1424 && input_section
->reloc_count
> 0)
1427 Elf_Internal_Sym
*isym
, *isymend
;
1430 internal_relocs
= (_bfd_elf_link_read_relocs
1431 (input_bfd
, input_section
, (PTR
) NULL
,
1432 (Elf_Internal_Rela
*) NULL
, FALSE
));
1433 if (internal_relocs
== NULL
)
1436 if (symtab_hdr
->sh_info
!= 0)
1438 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1439 if (isymbuf
== NULL
)
1440 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
1441 symtab_hdr
->sh_info
, 0,
1443 if (isymbuf
== NULL
)
1447 amt
= symtab_hdr
->sh_info
;
1448 amt
*= sizeof (asection
*);
1449 sections
= (asection
**) bfd_malloc (amt
);
1450 if (sections
== NULL
&& amt
!= 0)
1453 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1454 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
1458 if (isym
->st_shndx
== SHN_UNDEF
)
1459 isec
= bfd_und_section_ptr
;
1460 else if (isym
->st_shndx
== SHN_ABS
)
1461 isec
= bfd_abs_section_ptr
;
1462 else if (isym
->st_shndx
== SHN_COMMON
)
1463 isec
= bfd_com_section_ptr
;
1465 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
1470 if (! elf32_h8_relocate_section (output_bfd
, link_info
, input_bfd
,
1471 input_section
, data
, internal_relocs
,
1475 if (sections
!= NULL
)
1478 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1480 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1481 free (internal_relocs
);
1487 if (sections
!= NULL
)
1490 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1492 if (internal_relocs
!= NULL
1493 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
1494 free (internal_relocs
);
1499 #define TARGET_BIG_SYM bfd_elf32_h8300_vec
1500 #define TARGET_BIG_NAME "elf32-h8300"
1501 #define ELF_ARCH bfd_arch_h8300
1502 #define ELF_MACHINE_CODE EM_H8_300
1503 #define ELF_MAXPAGESIZE 0x1
1504 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1505 #define elf_info_to_howto elf32_h8_info_to_howto
1506 #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1508 /* So we can set/examine bits in e_flags to get the specific
1509 H8 architecture in use. */
1510 #define elf_backend_final_write_processing \
1511 elf32_h8_final_write_processing
1512 #define elf_backend_object_p \
1514 #define bfd_elf32_bfd_merge_private_bfd_data \
1515 elf32_h8_merge_private_bfd_data
1517 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1518 defaults to using _bfd_generic_link_hash_table_create, but
1519 bfd_elf_size_dynamic_sections uses
1520 dynobj = elf_hash_table (info)->dynobj;
1521 and thus requires an elf hash table. */
1522 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1524 /* Use an H8 specific linker, not the ELF generic linker. */
1525 #define elf_backend_relocate_section elf32_h8_relocate_section
1526 #define elf_backend_rela_normal 1
1527 #define elf_backend_can_gc_sections 1
1529 /* And relaxing stuff. */
1530 #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1531 #define bfd_elf32_bfd_get_relocated_section_contents \
1532 elf32_h8_get_relocated_section_contents
1535 #include "elf32-target.h"