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 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
&& elf_discarded_section (sec
))
465 /* For relocs against symbols from removed linkonce sections,
466 or sections discarded by a linker script, we just want the
467 section contents zeroed. Avoid any special processing. */
468 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
474 if (info
->relocatable
)
477 r
= elf32_h8_final_link_relocate (r_type
, input_bfd
, output_bfd
,
479 contents
, rel
->r_offset
,
480 relocation
, rel
->r_addend
,
481 info
, sec
, h
== NULL
);
483 if (r
!= bfd_reloc_ok
)
486 const char *msg
= (const char *) 0;
489 name
= h
->root
.root
.string
;
492 name
= (bfd_elf_string_from_elf_section
493 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
494 if (name
== NULL
|| *name
== '\0')
495 name
= bfd_section_name (input_bfd
, sec
);
500 case bfd_reloc_overflow
:
501 if (! ((*info
->callbacks
->reloc_overflow
)
502 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
503 (bfd_vma
) 0, input_bfd
, input_section
,
508 case bfd_reloc_undefined
:
509 if (! ((*info
->callbacks
->undefined_symbol
)
510 (info
, name
, input_bfd
, input_section
,
511 rel
->r_offset
, TRUE
)))
515 case bfd_reloc_outofrange
:
516 msg
= _("internal error: out of range error");
519 case bfd_reloc_notsupported
:
520 msg
= _("internal error: unsupported relocation error");
523 case bfd_reloc_dangerous
:
524 msg
= _("internal error: dangerous error");
528 msg
= _("internal error: unknown error");
532 if (!((*info
->callbacks
->warning
)
533 (info
, msg
, name
, input_bfd
, input_section
,
544 /* Object files encode the specific H8 model they were compiled
545 for in the ELF flags field.
547 Examine that field and return the proper BFD machine type for
550 elf32_h8_mach (flagword flags
)
552 switch (flags
& EF_H8_MACH
)
554 case E_H8_MACH_H8300
:
556 return bfd_mach_h8300
;
558 case E_H8_MACH_H8300H
:
559 return bfd_mach_h8300h
;
561 case E_H8_MACH_H8300S
:
562 return bfd_mach_h8300s
;
564 case E_H8_MACH_H8300HN
:
565 return bfd_mach_h8300hn
;
567 case E_H8_MACH_H8300SN
:
568 return bfd_mach_h8300sn
;
570 case E_H8_MACH_H8300SX
:
571 return bfd_mach_h8300sx
;
573 case E_H8_MACH_H8300SXN
:
574 return bfd_mach_h8300sxn
;
578 /* The final processing done just before writing out a H8 ELF object
579 file. We use this opportunity to encode the BFD machine type
580 into the flags field in the object file. */
583 elf32_h8_final_write_processing (bfd
*abfd
,
584 bfd_boolean linker ATTRIBUTE_UNUSED
)
588 switch (bfd_get_mach (abfd
))
592 val
= E_H8_MACH_H8300
;
595 case bfd_mach_h8300h
:
596 val
= E_H8_MACH_H8300H
;
599 case bfd_mach_h8300s
:
600 val
= E_H8_MACH_H8300S
;
603 case bfd_mach_h8300hn
:
604 val
= E_H8_MACH_H8300HN
;
607 case bfd_mach_h8300sn
:
608 val
= E_H8_MACH_H8300SN
;
611 case bfd_mach_h8300sx
:
612 val
= E_H8_MACH_H8300SX
;
615 case bfd_mach_h8300sxn
:
616 val
= E_H8_MACH_H8300SXN
;
620 elf_elfheader (abfd
)->e_flags
&= ~ (EF_H8_MACH
);
621 elf_elfheader (abfd
)->e_flags
|= val
;
624 /* Return nonzero if ABFD represents a valid H8 ELF object file; also
625 record the encoded machine type found in the ELF flags. */
628 elf32_h8_object_p (bfd
*abfd
)
630 bfd_default_set_arch_mach (abfd
, bfd_arch_h8300
,
631 elf32_h8_mach (elf_elfheader (abfd
)->e_flags
));
635 /* Merge backend specific data from an object file to the output
636 object file when linking. The only data we need to copy at this
637 time is the architecture/machine information. */
640 elf32_h8_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
642 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
643 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
646 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
647 && bfd_get_mach (obfd
) < bfd_get_mach (ibfd
))
649 if (! bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
650 bfd_get_mach (ibfd
)))
657 /* This function handles relaxing for the H8..
659 There are a few relaxing opportunities available on the H8:
661 jmp/jsr:24 -> bra/bsr:8 2 bytes
662 The jmp may be completely eliminated if the previous insn is a
663 conditional branch to the insn after the jump. In that case
664 we invert the branch and delete the jump and save 4 bytes.
666 bCC:16 -> bCC:8 2 bytes
667 bsr:16 -> bsr:8 2 bytes
669 bset:16 -> bset:8 2 bytes
670 bset:24/32 -> bset:8 4 bytes
671 (also applicable to other bit manipulation instructions)
673 mov.b:16 -> mov.b:8 2 bytes
674 mov.b:24/32 -> mov.b:8 4 bytes
676 bset:24/32 -> bset:16 2 bytes
677 (also applicable to other bit manipulation instructions)
679 mov.[bwl]:24/32 -> mov.[bwl]:16 2 bytes */
682 elf32_h8_relax_section (bfd
*abfd
, asection
*sec
,
683 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
685 Elf_Internal_Shdr
*symtab_hdr
;
686 Elf_Internal_Rela
*internal_relocs
;
687 Elf_Internal_Rela
*irel
, *irelend
;
688 bfd_byte
*contents
= NULL
;
689 Elf_Internal_Sym
*isymbuf
= NULL
;
690 static asection
*last_input_section
= NULL
;
691 static Elf_Internal_Rela
*last_reloc
= NULL
;
693 /* Assume nothing changes. */
696 /* We don't have to do anything for a relocatable link, if
697 this section does not have relocs, or if this is not a
699 if (link_info
->relocatable
700 || (sec
->flags
& SEC_RELOC
) == 0
701 || sec
->reloc_count
== 0
702 || (sec
->flags
& SEC_CODE
) == 0)
705 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
707 /* Get a copy of the native relocations. */
708 internal_relocs
= (_bfd_elf_link_read_relocs
709 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
710 link_info
->keep_memory
));
711 if (internal_relocs
== NULL
)
714 if (sec
!= last_input_section
)
717 last_input_section
= sec
;
719 /* Walk through the relocs looking for relaxing opportunities. */
720 irelend
= internal_relocs
+ sec
->reloc_count
;
721 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
729 elf32_h8_info_to_howto (abfd
, &bfd_reloc
, irel
);
732 /* Keep track of the previous reloc so that we can delete
733 some long jumps created by the compiler. */
734 if (irel
!= internal_relocs
)
735 last_reloc
= irel
- 1;
737 if (ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR24R8
738 && ELF32_R_TYPE (irel
->r_info
) != R_H8_PCREL16
739 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR16A8
740 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR24A8
741 && ELF32_R_TYPE (irel
->r_info
) != R_H8_DIR32A16
)
744 /* Get the section contents if we haven't done so already. */
745 if (contents
== NULL
)
747 /* Get cached copy if it exists. */
748 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
749 contents
= elf_section_data (sec
)->this_hdr
.contents
;
752 /* Go get them off disk. */
753 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
758 /* Read this BFD's local symbols if we haven't done so already. */
759 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
761 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
763 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
764 symtab_hdr
->sh_info
, 0,
770 /* Get the value of the symbol referred to by the reloc. */
771 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
773 /* A local symbol. */
774 Elf_Internal_Sym
*isym
;
777 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
778 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
779 symval
= isym
->st_value
;
780 /* If the reloc is absolute, it will not have
781 a symbol or section associated with it. */
783 symval
+= sym_sec
->output_section
->vma
784 + sym_sec
->output_offset
;
789 struct elf_link_hash_entry
*h
;
791 /* An external symbol. */
792 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
793 h
= elf_sym_hashes (abfd
)[indx
];
794 BFD_ASSERT (h
!= NULL
);
795 if (h
->root
.type
!= bfd_link_hash_defined
796 && h
->root
.type
!= bfd_link_hash_defweak
)
798 /* This appears to be a reference to an undefined
799 symbol. Just ignore it--it will be caught by the
800 regular reloc processing. */
804 symval
= (h
->root
.u
.def
.value
805 + h
->root
.u
.def
.section
->output_section
->vma
806 + h
->root
.u
.def
.section
->output_offset
);
809 /* For simplicity of coding, we are going to modify the section
810 contents, the section relocs, and the BFD symbol table. We
811 must tell the rest of the code not to free up this
812 information. It would be possible to instead create a table
813 of changes which have to be made, as is done in coff-mips.c;
814 that would be more work, but would require less memory when
815 the linker is run. */
816 switch (ELF32_R_TYPE (irel
->r_info
))
818 /* Try to turn a 24-bit absolute branch/call into an 8-bit
819 pc-relative branch/call. */
822 bfd_vma value
= symval
+ irel
->r_addend
;
825 /* Get the address of this instruction. */
826 dot
= (sec
->output_section
->vma
827 + sec
->output_offset
+ irel
->r_offset
- 1);
829 /* Compute the distance from this insn to the branch target. */
832 /* If the distance is within -126..+130 inclusive, then we can
833 relax this jump. +130 is valid since the target will move
834 two bytes closer if we do relax this branch. */
835 if ((int) gap
>= -126 && (int) gap
<= 130)
839 /* Note that we've changed the relocs, section contents,
841 elf_section_data (sec
)->relocs
= internal_relocs
;
842 elf_section_data (sec
)->this_hdr
.contents
= contents
;
843 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
845 /* Get the instruction code being relaxed. */
846 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
848 /* If the previous instruction conditionally jumped around
849 this instruction, we may be able to reverse the condition
850 and redirect the previous instruction to the target of
853 Such sequences are used by the compiler to deal with
854 long conditional branches.
856 Only perform this optimisation for jumps (code 0x5a) not
857 subroutine calls, as otherwise it could transform:
870 which changes the call (jsr) into a branch (bne). */
875 && ELF32_R_TYPE (last_reloc
->r_info
) == R_H8_PCREL8
876 && ELF32_R_SYM (last_reloc
->r_info
) < symtab_hdr
->sh_info
)
879 asection
*last_sym_sec
;
880 Elf_Internal_Sym
*last_sym
;
882 /* We will need to examine the symbol used by the
883 previous relocation. */
885 last_sym
= isymbuf
+ ELF32_R_SYM (last_reloc
->r_info
);
887 = bfd_section_from_elf_index (abfd
, last_sym
->st_shndx
);
888 last_value
= (last_sym
->st_value
889 + last_sym_sec
->output_section
->vma
890 + last_sym_sec
->output_offset
);
892 /* Verify that the previous relocation was for a
893 branch around this instruction and that no symbol
894 exists at the current location. */
895 if (last_value
== dot
+ 4
896 && last_reloc
->r_offset
+ 2 == irel
->r_offset
897 && ! elf32_h8_symbol_address_p (abfd
, sec
, dot
))
899 /* We can eliminate this jump. Twiddle the
900 previous relocation as necessary. */
902 = ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
903 ELF32_R_TYPE (R_H8_NONE
));
906 = ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
907 ELF32_R_TYPE (R_H8_PCREL8
));
908 last_reloc
->r_addend
= irel
->r_addend
;
910 code
= bfd_get_8 (abfd
,
911 contents
+ last_reloc
->r_offset
- 1);
915 contents
+ last_reloc
->r_offset
- 1);
917 /* Delete four bytes of data. */
918 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
930 bfd_put_8 (abfd
, 0x55, contents
+ irel
->r_offset
- 1);
931 else if (code
== 0x5a)
933 bfd_put_8 (abfd
, 0x40, contents
+ irel
->r_offset
- 1);
937 /* Fix the relocation's type. */
938 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
941 /* Delete two bytes of data. */
942 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
943 irel
->r_offset
+ 1, 2))
946 /* That will change things, so, we should relax again.
947 Note that this is not required, and it may be slow. */
953 /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
957 bfd_vma value
= symval
+ irel
->r_addend
;
961 /* Get the address of this instruction. */
962 dot
= (sec
->output_section
->vma
964 + irel
->r_offset
- 2);
968 /* If the distance is within -126..+130 inclusive, then we can
969 relax this jump. +130 is valid since the target will move
970 two bytes closer if we do relax this branch. */
971 if ((int) gap
>= -126 && (int) gap
<= 130)
975 /* Note that we've changed the relocs, section contents,
977 elf_section_data (sec
)->relocs
= internal_relocs
;
978 elf_section_data (sec
)->this_hdr
.contents
= contents
;
979 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
981 /* Get the opcode. */
982 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
986 /* bCC:16 -> bCC:8 */
987 /* Get the second byte of the original insn, which
988 contains the condition code. */
989 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
991 /* Compute the fisrt byte of the relaxed
992 instruction. The original sequence 0x58 0xX0
993 is relaxed to 0x4X, where X represents the
998 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
1000 else if (code
== 0x5c)
1002 bfd_put_8 (abfd
, 0x55, contents
+ irel
->r_offset
- 2);
1004 /* Might be MOVSD. */
1007 /* Fix the relocation's type. */
1008 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1012 /* Delete two bytes of data. */
1013 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1014 irel
->r_offset
+ 1, 2))
1017 /* That will change things, so, we should relax again.
1018 Note that this is not required, and it may be slow. */
1024 /* This is a 16-bit absolute address in one of the following
1027 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1028 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1031 We may relax this into an 8-bit absolute address if it's in
1037 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1038 if (value
>= 0xffffff00u
)
1041 unsigned char temp_code
;
1043 /* Note that we've changed the relocs, section contents,
1045 elf_section_data (sec
)->relocs
= internal_relocs
;
1046 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1047 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1049 /* Get the opcode. */
1050 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
1052 /* All instructions with R_H8_DIR16A8 start with
1057 temp_code
= code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1058 /* If this is a mov.b instruction, clear the lower
1059 nibble, which contains the source/destination
1061 if ((temp_code
& 0x10) != 0x10)
1067 /* This is mov.b @aa:16,Rd. */
1068 bfd_put_8 (abfd
, (code
& 0xf) | 0x20,
1069 contents
+ irel
->r_offset
- 2);
1072 /* This is mov.b Rs,@aa:16. */
1073 bfd_put_8 (abfd
, (code
& 0xf) | 0x30,
1074 contents
+ irel
->r_offset
- 2);
1077 /* This is a bit-maniputation instruction that
1078 stores one bit into memory, one of "bclr",
1079 "bist", "bnot", "bset", and "bst". */
1080 bfd_put_8 (abfd
, 0x7f, contents
+ irel
->r_offset
- 2);
1083 /* This is a bit-maniputation instruction that
1084 loads one bit from memory, one of "band",
1085 "biand", "bild", "bior", "bixor", "bld", "bor",
1086 "btst", and "bxor". */
1087 bfd_put_8 (abfd
, 0x7e, contents
+ irel
->r_offset
- 2);
1093 /* Fix the relocation's type. */
1094 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1097 /* Move the relocation. */
1100 /* Delete two bytes of data. */
1101 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1102 irel
->r_offset
+ 1, 2))
1105 /* That will change things, so, we should relax again.
1106 Note that this is not required, and it may be slow. */
1112 /* This is a 24-bit absolute address in one of the following
1115 "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1116 "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1119 We may relax this into an 8-bit absolute address if it's in
1125 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1126 if (value
>= 0xffffff00u
)
1129 unsigned char temp_code
;
1131 /* Note that we've changed the relocs, section contents,
1133 elf_section_data (sec
)->relocs
= internal_relocs
;
1134 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1135 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1137 /* Get the opcode. */
1138 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
1140 /* All instructions with R_H8_DIR24A8 start with
1145 temp_code
= code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1147 /* If this is a mov.b instruction, clear the lower
1148 nibble, which contains the source/destination
1150 if ((temp_code
& 0x30) != 0x30)
1156 /* This is mov.b @aa:24/32,Rd. */
1157 bfd_put_8 (abfd
, (code
& 0xf) | 0x20,
1158 contents
+ irel
->r_offset
- 2);
1161 /* This is mov.b Rs,@aa:24/32. */
1162 bfd_put_8 (abfd
, (code
& 0xf) | 0x30,
1163 contents
+ irel
->r_offset
- 2);
1166 /* This is a bit-maniputation instruction that
1167 stores one bit into memory, one of "bclr",
1168 "bist", "bnot", "bset", and "bst". */
1169 bfd_put_8 (abfd
, 0x7f, contents
+ irel
->r_offset
- 2);
1172 /* This is a bit-maniputation instruction that
1173 loads one bit from memory, one of "band",
1174 "biand", "bild", "bior", "bixor", "bld", "bor",
1175 "btst", and "bxor". */
1176 bfd_put_8 (abfd
, 0x7e, contents
+ irel
->r_offset
- 2);
1182 /* Fix the relocation's type. */
1183 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1187 /* Delete two bytes of data. */
1188 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1189 irel
->r_offset
+ 1, 4))
1192 /* That will change things, so, we should relax again.
1193 Note that this is not required, and it may be slow. */
1201 /* This is a 24-/32-bit absolute address in one of the
1202 following instructions:
1204 "band", "bclr", "biand", "bild", "bior", "bist",
1205 "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1206 "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1208 We may relax this into an 16-bit absolute address if it's
1209 in the right range. */
1214 value
= bfd_h8300_pad_address (abfd
, symval
+ irel
->r_addend
);
1215 if (value
<= 0x7fff || value
>= 0xffff8000u
)
1218 unsigned char op0
, op1
, op2
, op3
;
1219 unsigned char *op_ptr
;
1221 /* Note that we've changed the relocs, section contents,
1223 elf_section_data (sec
)->relocs
= internal_relocs
;
1224 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1225 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1227 if (irel
->r_offset
>= 4)
1229 /* Check for 4-byte MOVA relaxation. */
1230 int second_reloc
= 0;
1232 op_ptr
= contents
+ irel
->r_offset
- 4;
1237 reloc_howto_type
*h
;
1238 bfd_vma last_reloc_size
;
1240 elf32_h8_info_to_howto (abfd
, &bfd_reloc
, last_reloc
);
1241 h
= bfd_reloc
.howto
;
1242 last_reloc_size
= 1 << h
->size
;
1243 if (last_reloc
->r_offset
+ last_reloc_size
1246 op_ptr
-= last_reloc_size
;
1252 Elf_Internal_Rela
*next_reloc
= irel
+ 1;
1254 reloc_howto_type
*h
;
1255 bfd_vma next_reloc_size
;
1257 elf32_h8_info_to_howto (abfd
, &bfd_reloc
, next_reloc
);
1258 h
= bfd_reloc
.howto
;
1259 next_reloc_size
= 1 << h
->size
;
1260 if (next_reloc
->r_offset
+ next_reloc_size
1263 op_ptr
-= next_reloc_size
;
1268 op0
= bfd_get_8 (abfd
, op_ptr
+ 0);
1269 op1
= bfd_get_8 (abfd
, op_ptr
+ 1);
1270 op2
= bfd_get_8 (abfd
, op_ptr
+ 2);
1271 op3
= bfd_get_8 (abfd
, op_ptr
+ 3);
1274 && (op1
& 0xdf) == 0x5f
1275 && (op2
& 0x40) == 0x40
1276 && (op3
& 0x80) == 0x80)
1278 if ((op2
& 0x08) == 0)
1284 bfd_put_8 (abfd
, op3
, op_ptr
+ 3);
1289 bfd_put_8 (abfd
, op2
, op_ptr
+ 2);
1291 goto r_h8_dir32a16_common
;
1295 /* Now check for short version of MOVA. */
1296 op_ptr
= contents
+ irel
->r_offset
- 2;
1297 op0
= bfd_get_8 (abfd
, op_ptr
+ 0);
1298 op1
= bfd_get_8 (abfd
, op_ptr
+ 1);
1301 && (op1
& 0x88) == 0x80)
1304 bfd_put_8 (abfd
, op1
, op_ptr
+ 1);
1305 goto r_h8_dir32a16_common
;
1308 /* Get the opcode. */
1309 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
1311 /* Fix the opcode. For all the instructions that
1312 belong to this relaxation, we simply need to turn
1313 off bit 0x20 in the previous byte. */
1316 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1318 r_h8_dir32a16_common
:
1319 /* Fix the relocation's type. */
1320 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1323 /* Delete two bytes of data. */
1324 if (!elf32_h8_relax_delete_bytes (abfd
, sec
,
1325 irel
->r_offset
+ 1, 2))
1328 /* That will change things, so, we should relax again.
1329 Note that this is not required, and it may be slow. */
1341 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1343 if (! link_info
->keep_memory
)
1346 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1349 if (contents
!= NULL
1350 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1352 if (! link_info
->keep_memory
)
1356 /* Cache the section contents for elf_link_input_bfd. */
1357 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1361 if (internal_relocs
!= NULL
1362 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1363 free (internal_relocs
);
1369 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1371 if (contents
!= NULL
1372 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1374 if (internal_relocs
!= NULL
1375 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1376 free (internal_relocs
);
1380 /* Delete some bytes from a section while relaxing. */
1383 elf32_h8_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, int count
)
1385 Elf_Internal_Shdr
*symtab_hdr
;
1386 unsigned int sec_shndx
;
1388 Elf_Internal_Rela
*irel
, *irelend
;
1389 Elf_Internal_Rela
*irelalign
;
1390 Elf_Internal_Sym
*isym
;
1391 Elf_Internal_Sym
*isymend
;
1393 struct elf_link_hash_entry
**sym_hashes
;
1394 struct elf_link_hash_entry
**end_hashes
;
1395 unsigned int symcount
;
1397 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1399 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1401 /* The deletion must stop at the next ALIGN reloc for an aligment
1402 power larger than the number of bytes we are deleting. */
1407 irel
= elf_section_data (sec
)->relocs
;
1408 irelend
= irel
+ sec
->reloc_count
;
1410 /* Actually delete the bytes. */
1411 memmove (contents
+ addr
, contents
+ addr
+ count
,
1412 (size_t) (toaddr
- addr
- count
));
1415 /* Adjust all the relocs. */
1416 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1418 /* Get the new reloc address. */
1419 if ((irel
->r_offset
> addr
1420 && irel
->r_offset
< toaddr
))
1421 irel
->r_offset
-= count
;
1424 /* Adjust the local symbols defined in this section. */
1425 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1426 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1427 isymend
= isym
+ symtab_hdr
->sh_info
;
1428 for (; isym
< isymend
; isym
++)
1430 if (isym
->st_shndx
== sec_shndx
1431 && isym
->st_value
> addr
1432 && isym
->st_value
< toaddr
)
1433 isym
->st_value
-= count
;
1436 /* Now adjust the global symbols defined in this section. */
1437 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1438 - symtab_hdr
->sh_info
);
1439 sym_hashes
= elf_sym_hashes (abfd
);
1440 end_hashes
= sym_hashes
+ symcount
;
1441 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1443 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1444 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1445 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1446 && sym_hash
->root
.u
.def
.section
== sec
1447 && sym_hash
->root
.u
.def
.value
> addr
1448 && sym_hash
->root
.u
.def
.value
< toaddr
)
1450 sym_hash
->root
.u
.def
.value
-= count
;
1457 /* Return TRUE if a symbol exists at the given address, else return
1460 elf32_h8_symbol_address_p (bfd
*abfd
, asection
*sec
, bfd_vma addr
)
1462 Elf_Internal_Shdr
*symtab_hdr
;
1463 unsigned int sec_shndx
;
1464 Elf_Internal_Sym
*isym
;
1465 Elf_Internal_Sym
*isymend
;
1466 struct elf_link_hash_entry
**sym_hashes
;
1467 struct elf_link_hash_entry
**end_hashes
;
1468 unsigned int symcount
;
1470 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1472 /* Examine all the symbols. */
1473 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1474 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1475 isymend
= isym
+ symtab_hdr
->sh_info
;
1476 for (; isym
< isymend
; isym
++)
1478 if (isym
->st_shndx
== sec_shndx
1479 && isym
->st_value
== addr
)
1483 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1484 - symtab_hdr
->sh_info
);
1485 sym_hashes
= elf_sym_hashes (abfd
);
1486 end_hashes
= sym_hashes
+ symcount
;
1487 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1489 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1490 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1491 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1492 && sym_hash
->root
.u
.def
.section
== sec
1493 && sym_hash
->root
.u
.def
.value
== addr
)
1500 /* This is a version of bfd_generic_get_relocated_section_contents
1501 which uses elf32_h8_relocate_section. */
1504 elf32_h8_get_relocated_section_contents (bfd
*output_bfd
,
1505 struct bfd_link_info
*link_info
,
1506 struct bfd_link_order
*link_order
,
1508 bfd_boolean relocatable
,
1511 Elf_Internal_Shdr
*symtab_hdr
;
1512 asection
*input_section
= link_order
->u
.indirect
.section
;
1513 bfd
*input_bfd
= input_section
->owner
;
1514 asection
**sections
= NULL
;
1515 Elf_Internal_Rela
*internal_relocs
= NULL
;
1516 Elf_Internal_Sym
*isymbuf
= NULL
;
1518 /* We only need to handle the case of relaxing, or of having a
1519 particular set of section contents, specially. */
1521 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1522 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1527 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1529 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1530 (size_t) input_section
->size
);
1532 if ((input_section
->flags
& SEC_RELOC
) != 0
1533 && input_section
->reloc_count
> 0)
1536 Elf_Internal_Sym
*isym
, *isymend
;
1539 internal_relocs
= (_bfd_elf_link_read_relocs
1540 (input_bfd
, input_section
, (PTR
) NULL
,
1541 (Elf_Internal_Rela
*) NULL
, FALSE
));
1542 if (internal_relocs
== NULL
)
1545 if (symtab_hdr
->sh_info
!= 0)
1547 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1548 if (isymbuf
== NULL
)
1549 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
1550 symtab_hdr
->sh_info
, 0,
1552 if (isymbuf
== NULL
)
1556 amt
= symtab_hdr
->sh_info
;
1557 amt
*= sizeof (asection
*);
1558 sections
= (asection
**) bfd_malloc (amt
);
1559 if (sections
== NULL
&& amt
!= 0)
1562 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1563 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
1567 if (isym
->st_shndx
== SHN_UNDEF
)
1568 isec
= bfd_und_section_ptr
;
1569 else if (isym
->st_shndx
== SHN_ABS
)
1570 isec
= bfd_abs_section_ptr
;
1571 else if (isym
->st_shndx
== SHN_COMMON
)
1572 isec
= bfd_com_section_ptr
;
1574 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
1579 if (! elf32_h8_relocate_section (output_bfd
, link_info
, input_bfd
,
1580 input_section
, data
, internal_relocs
,
1584 if (sections
!= NULL
)
1587 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1589 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1590 free (internal_relocs
);
1596 if (sections
!= NULL
)
1599 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1601 if (internal_relocs
!= NULL
1602 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
1603 free (internal_relocs
);
1608 #define TARGET_BIG_SYM bfd_elf32_h8300_vec
1609 #define TARGET_BIG_NAME "elf32-h8300"
1610 #define ELF_ARCH bfd_arch_h8300
1611 #define ELF_MACHINE_CODE EM_H8_300
1612 #define ELF_MAXPAGESIZE 0x1
1613 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1614 #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1615 #define elf_info_to_howto elf32_h8_info_to_howto
1616 #define elf_info_to_howto_rel elf32_h8_info_to_howto_rel
1618 /* So we can set/examine bits in e_flags to get the specific
1619 H8 architecture in use. */
1620 #define elf_backend_final_write_processing \
1621 elf32_h8_final_write_processing
1622 #define elf_backend_object_p \
1624 #define bfd_elf32_bfd_merge_private_bfd_data \
1625 elf32_h8_merge_private_bfd_data
1627 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1628 defaults to using _bfd_generic_link_hash_table_create, but
1629 bfd_elf_size_dynamic_sections uses
1630 dynobj = elf_hash_table (info)->dynobj;
1631 and thus requires an elf hash table. */
1632 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1634 /* Use an H8 specific linker, not the ELF generic linker. */
1635 #define elf_backend_relocate_section elf32_h8_relocate_section
1636 #define elf_backend_rela_normal 1
1637 #define elf_backend_can_gc_sections 1
1639 /* And relaxing stuff. */
1640 #define bfd_elf32_bfd_relax_section elf32_h8_relax_section
1641 #define bfd_elf32_bfd_get_relocated_section_contents \
1642 elf32_h8_get_relocated_section_contents
1645 #include "elf32-target.h"