1 /* BFD back-end for Renesas H8/300 ELF binaries.
2    Copyright (C) 1993-2016 Free Software Foundation, Inc.
3 
4    This file is part of BFD, the Binary File Descriptor library.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/h8.h"
26 
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 *, void *, asection *, bfd *, char **);
55 
56 /* This does not include any relocation information, but should be
57    good enough for GDB or objdump to read the file.  */
58 
59 static reloc_howto_type h8_elf_howto_table[] =
60 {
61 #define R_H8_NONE_X 0
62   HOWTO (R_H8_NONE,		/* type */
63 	 0,			/* rightshift */
64 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
65 	 0,			/* bitsize */
66 	 FALSE,			/* pc_relative */
67 	 0,			/* bitpos */
68 	 complain_overflow_dont,/* complain_on_overflow */
69 	 special,		/* special_function */
70 	 "R_H8_NONE",		/* name */
71 	 FALSE,			/* partial_inplace */
72 	 0,			/* src_mask */
73 	 0,			/* dst_mask */
74 	 FALSE),		/* pcrel_offset */
75 #define R_H8_DIR32_X (R_H8_NONE_X + 1)
76   HOWTO (R_H8_DIR32,		/* type */
77 	 0,			/* rightshift */
78 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
79 	 32,			/* bitsize */
80 	 FALSE,			/* pc_relative */
81 	 0,			/* bitpos */
82 	 complain_overflow_dont,/* complain_on_overflow */
83 	 special,		/* special_function */
84 	 "R_H8_DIR32",		/* name */
85 	 FALSE,			/* partial_inplace */
86 	 0,			/* src_mask */
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 */
91 	 0,			/* rightshift */
92 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
93 	 16,			/* bitsize */
94 	 FALSE,			/* pc_relative */
95 	 0,			/* bitpos */
96 	 complain_overflow_dont,/* complain_on_overflow */
97 	 special,		/* special_function */
98 	 "R_H8_DIR16",		/* name */
99 	 FALSE,			/* partial_inplace */
100 	 0,			/* src_mask */
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 */
105 	 0,			/* rightshift */
106 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
107 	 8,			/* bitsize */
108 	 FALSE,			/* pc_relative */
109 	 0,			/* bitpos */
110 	 complain_overflow_dont,/* complain_on_overflow */
111 	 special,		/* special_function */
112 	 "R_H8_DIR8",		/* name */
113 	 FALSE,			/* partial_inplace */
114 	 0,			/* src_mask */
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 */
119 	 0,			/* rightshift */
120 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
121 	 16,			/* bitsize */
122 	 FALSE,			/* pc_relative */
123 	 0,			/* bitpos */
124 	 complain_overflow_bitfield, /* complain_on_overflow */
125 	 special,		/* special_function */
126 	 "R_H8_DIR16A8",	/* name */
127 	 FALSE,			/* partial_inplace */
128 	 0,			/* src_mask */
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 */
133 	 0,			/* rightshift */
134 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
135 	 16,			/* bitsize */
136 	 FALSE,			/* pc_relative */
137 	 0,			/* bitpos */
138 	 complain_overflow_bitfield, /* complain_on_overflow */
139 	 special,		/* special_function */
140 	 "R_H8_DIR16R8",	/* name */
141 	 FALSE,			/* partial_inplace */
142 	 0,			/* src_mask */
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 */
147 	 0,			/* rightshift */
148 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
149 	 24,			/* bitsize */
150 	 FALSE,			/* pc_relative */
151 	 0,			/* bitpos */
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 */
161 	 0,			/* rightshift */
162 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
163 	 24,			/* bitsize */
164 	 FALSE,			/* pc_relative */
165 	 0,			/* bitpos */
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 */
175 	 0,			/* rightshift */
176 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
177 	 32,			/* bitsize */
178 	 FALSE,			/* pc_relative */
179 	 0,			/* bitpos */
180 	 complain_overflow_dont,/* complain_on_overflow */
181 	 special,		/* special_function */
182 	 "R_H8_DIR32A16",	/* name */
183 	 FALSE,			/* partial_inplace */
184 	 0,			/* src_mask */
185 	 0xffffffff,		/* dst_mask */
186 	 FALSE),		/* pcrel_offset */
187 #define R_H8_DISP32A16_X (R_H8_DIR32A16_X + 1)
188   HOWTO (R_H8_DISP32A16,	/* type */
189 	 0,			/* rightshift */
190 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
191 	 32,			/* bitsize */
192 	 FALSE,			/* pc_relative */
193 	 0,			/* bitpos */
194 	 complain_overflow_dont,/* complain_on_overflow */
195 	 special,		/* special_function */
196 	 "R_H8_DISP32A16",	/* name */
197 	 FALSE,			/* partial_inplace */
198 	 0,			/* src_mask */
199 	 0xffffffff,		/* dst_mask */
200 	 FALSE),		/* pcrel_offset */
201 #define R_H8_PCREL16_X (R_H8_DISP32A16_X + 1)
202   HOWTO (R_H8_PCREL16,		/* type */
203 	 0,			/* rightshift */
204 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
205 	 16,			/* bitsize */
206 	 TRUE,			/* pc_relative */
207 	 0,			/* bitpos */
208 	 complain_overflow_signed,/* complain_on_overflow */
209 	 special,		/* special_function */
210 	 "R_H8_PCREL16",	/* name */
211 	 FALSE,			/* partial_inplace */
212 	 0xffff,		/* src_mask */
213 	 0xffff,		/* dst_mask */
214 	 TRUE),			/* pcrel_offset */
215 #define R_H8_PCREL8_X (R_H8_PCREL16_X + 1)
216   HOWTO (R_H8_PCREL8,		/* type */
217 	 0,			/* rightshift */
218 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
219 	 8,			/* bitsize */
220 	 TRUE,			/* pc_relative */
221 	 0,			/* bitpos */
222 	 complain_overflow_signed,/* complain_on_overflow */
223 	 special,		/* special_function */
224 	 "R_H8_PCREL8",		/* name */
225 	 FALSE,			/* partial_inplace */
226 	 0xff,			/* src_mask */
227 	 0xff,			/* dst_mask */
228 	 TRUE),			/* pcrel_offset */
229 };
230 
231 /* This structure is used to map BFD reloc codes to H8 ELF relocs.  */
232 
233 struct elf_reloc_map {
234   bfd_reloc_code_real_type bfd_reloc_val;
235   unsigned char howto_index;
236 };
237 
238 /* An array mapping BFD reloc codes to H8 ELF relocs.  */
239 
240 static const struct elf_reloc_map h8_reloc_map[] = {
241   { BFD_RELOC_NONE, R_H8_NONE_X },
242   { BFD_RELOC_32, R_H8_DIR32_X },
243   { BFD_RELOC_16, R_H8_DIR16_X },
244   { BFD_RELOC_8, R_H8_DIR8_X },
245   { BFD_RELOC_H8_DIR16A8, R_H8_DIR16A8_X },
246   { BFD_RELOC_H8_DIR16R8, R_H8_DIR16R8_X },
247   { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
248   { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
249   { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
250   { BFD_RELOC_H8_DISP32A16, R_H8_DISP32A16_X },
251   { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
252   { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
253 };
254 
255 
256 static reloc_howto_type *
elf32_h8_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)257 elf32_h8_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
258 			    bfd_reloc_code_real_type code)
259 {
260   unsigned int i;
261 
262   for (i = 0; i < sizeof (h8_reloc_map) / sizeof (struct elf_reloc_map); i++)
263     {
264       if (h8_reloc_map[i].bfd_reloc_val == code)
265 	return &h8_elf_howto_table[(int) h8_reloc_map[i].howto_index];
266     }
267   return NULL;
268 }
269 
270 static reloc_howto_type *
elf32_h8_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)271 elf32_h8_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
272 			    const char *r_name)
273 {
274   unsigned int i;
275 
276   for (i = 0;
277        i < sizeof (h8_elf_howto_table) / sizeof (h8_elf_howto_table[0]);
278        i++)
279     if (h8_elf_howto_table[i].name != NULL
280 	&& strcasecmp (h8_elf_howto_table[i].name, r_name) == 0)
281       return &h8_elf_howto_table[i];
282 
283   return NULL;
284 }
285 
286 static void
elf32_h8_info_to_howto(bfd * abfd ATTRIBUTE_UNUSED,arelent * bfd_reloc,Elf_Internal_Rela * elf_reloc)287 elf32_h8_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
288 			Elf_Internal_Rela *elf_reloc)
289 {
290   unsigned int r;
291   unsigned int i;
292 
293   r = ELF32_R_TYPE (elf_reloc->r_info);
294   for (i = 0; i < sizeof (h8_elf_howto_table) / sizeof (reloc_howto_type); i++)
295     if (h8_elf_howto_table[i].type == r)
296       {
297 	bfd_reloc->howto = &h8_elf_howto_table[i];
298 	return;
299       }
300   abort ();
301 }
302 
303 static void
elf32_h8_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * bfd_reloc,Elf_Internal_Rela * elf_reloc ATTRIBUTE_UNUSED)304 elf32_h8_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
305 			    Elf_Internal_Rela *elf_reloc ATTRIBUTE_UNUSED)
306 {
307   unsigned int r;
308 
309   abort ();
310   r = ELF32_R_TYPE (elf_reloc->r_info);
311   bfd_reloc->howto = &h8_elf_howto_table[r];
312 }
313 
314 /* Special handling for H8/300 relocs.
315    We only come here for pcrel stuff and return normally if not an -r link.
316    When doing -r, we can't do any arithmetic for the pcrel stuff, because
317    we support relaxing on the H8/300 series chips.  */
318 static bfd_reloc_status_type
special(bfd * abfd ATTRIBUTE_UNUSED,arelent * reloc_entry ATTRIBUTE_UNUSED,asymbol * symbol ATTRIBUTE_UNUSED,void * data ATTRIBUTE_UNUSED,asection * input_section ATTRIBUTE_UNUSED,bfd * output_bfd,char ** error_message ATTRIBUTE_UNUSED)319 special (bfd *abfd ATTRIBUTE_UNUSED,
320 	 arelent *reloc_entry ATTRIBUTE_UNUSED,
321 	 asymbol *symbol ATTRIBUTE_UNUSED,
322 	 void * data ATTRIBUTE_UNUSED,
323 	 asection *input_section ATTRIBUTE_UNUSED,
324 	 bfd *output_bfd,
325 	 char **error_message ATTRIBUTE_UNUSED)
326 {
327   if (output_bfd == (bfd *) NULL)
328     return bfd_reloc_continue;
329 
330   /* Adjust the reloc address to that in the output section.  */
331   reloc_entry->address += input_section->output_offset;
332   return bfd_reloc_ok;
333 }
334 
335 /* Perform a relocation as part of a final link.  */
336 static bfd_reloc_status_type
elf32_h8_final_link_relocate(unsigned long r_type,bfd * input_bfd,bfd * output_bfd ATTRIBUTE_UNUSED,asection * input_section ATTRIBUTE_UNUSED,bfd_byte * contents,bfd_vma offset,bfd_vma value,bfd_vma addend,struct bfd_link_info * info ATTRIBUTE_UNUSED,asection * sym_sec ATTRIBUTE_UNUSED,int is_local ATTRIBUTE_UNUSED)337 elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
338 			      bfd *output_bfd ATTRIBUTE_UNUSED,
339 			      asection *input_section ATTRIBUTE_UNUSED,
340 			      bfd_byte *contents, bfd_vma offset,
341 			      bfd_vma value, bfd_vma addend,
342 			      struct bfd_link_info *info ATTRIBUTE_UNUSED,
343 			      asection *sym_sec ATTRIBUTE_UNUSED,
344 			      int is_local ATTRIBUTE_UNUSED)
345 {
346   bfd_byte *hit_data = contents + offset;
347 
348   switch (r_type)
349     {
350     case R_H8_NONE:
351       return bfd_reloc_ok;
352 
353     case R_H8_DIR32:
354     case R_H8_DIR32A16:
355     case R_H8_DISP32A16:
356     case R_H8_DIR24A8:
357       value += addend;
358       bfd_put_32 (input_bfd, value, hit_data);
359       return bfd_reloc_ok;
360 
361     case R_H8_DIR16:
362     case R_H8_DIR16A8:
363     case R_H8_DIR16R8:
364       value += addend;
365       bfd_put_16 (input_bfd, value, hit_data);
366       return bfd_reloc_ok;
367 
368     /* AKA R_RELBYTE */
369     case R_H8_DIR8:
370       value += addend;
371 
372       bfd_put_8 (input_bfd, value, hit_data);
373       return bfd_reloc_ok;
374 
375     case R_H8_DIR24R8:
376       value += addend;
377 
378       /* HIT_DATA is the address for the first byte for the relocated
379 	 value.  Subtract 1 so that we can manipulate the data in 32-bit
380 	 hunks.  */
381       hit_data--;
382 
383       /* Clear out the top byte in value.  */
384       value &= 0xffffff;
385 
386       /* Retrieve the type byte for value from the section contents.  */
387       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
388 
389       /* Now scribble it out in one 32-bit hunk.  */
390       bfd_put_32 (input_bfd, value, hit_data);
391       return bfd_reloc_ok;
392 
393     case R_H8_PCREL16:
394       value -= (input_section->output_section->vma
395 		+ input_section->output_offset);
396       value -= offset;
397       value += addend;
398 
399       /* The value is relative to the start of the instruction,
400 	 not the relocation offset.  Subtract 2 to account for
401 	 this minor issue.  */
402       value -= 2;
403 
404       bfd_put_16 (input_bfd, value, hit_data);
405       return bfd_reloc_ok;
406 
407     case R_H8_PCREL8:
408       value -= (input_section->output_section->vma
409 		+ input_section->output_offset);
410       value -= offset;
411       value += addend;
412 
413       /* The value is relative to the start of the instruction,
414 	 not the relocation offset.  Subtract 1 to account for
415 	 this minor issue.  */
416       value -= 1;
417 
418       bfd_put_8 (input_bfd, value, hit_data);
419       return bfd_reloc_ok;
420 
421     default:
422       return bfd_reloc_notsupported;
423     }
424 }
425 
426 /* Relocate an H8 ELF section.  */
427 static bfd_boolean
elf32_h8_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)428 elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
429 			   bfd *input_bfd, asection *input_section,
430 			   bfd_byte *contents, Elf_Internal_Rela *relocs,
431 			   Elf_Internal_Sym *local_syms,
432 			   asection **local_sections)
433 {
434   Elf_Internal_Shdr *symtab_hdr;
435   struct elf_link_hash_entry **sym_hashes;
436   Elf_Internal_Rela *rel, *relend;
437 
438   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
439   sym_hashes = elf_sym_hashes (input_bfd);
440 
441   rel = relocs;
442   relend = relocs + input_section->reloc_count;
443   for (; rel < relend; rel++)
444     {
445       unsigned int r_type;
446       unsigned long r_symndx;
447       Elf_Internal_Sym *sym;
448       asection *sec;
449       struct elf_link_hash_entry *h;
450       bfd_vma relocation;
451       bfd_reloc_status_type r;
452       arelent bfd_reloc;
453       reloc_howto_type *howto;
454 
455       elf32_h8_info_to_howto (input_bfd, &bfd_reloc, rel);
456       howto = bfd_reloc.howto;
457 
458       r_symndx = ELF32_R_SYM (rel->r_info);
459       r_type = ELF32_R_TYPE (rel->r_info);
460       h = NULL;
461       sym = NULL;
462       sec = NULL;
463       if (r_symndx < symtab_hdr->sh_info)
464 	{
465 	  sym = local_syms + r_symndx;
466 	  sec = local_sections[r_symndx];
467 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
468 	}
469       else
470 	{
471 	  bfd_boolean unresolved_reloc, warned, ignored;
472 
473 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
474 				   r_symndx, symtab_hdr, sym_hashes,
475 				   h, sec, relocation,
476 				   unresolved_reloc, warned, ignored);
477 	}
478 
479       if (sec != NULL && discarded_section (sec))
480 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
481 					 rel, 1, relend, howto, 0, contents);
482 
483       if (bfd_link_relocatable (info))
484 	continue;
485 
486       r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
487 					input_section,
488 					contents, rel->r_offset,
489 					relocation, rel->r_addend,
490 					info, sec, h == NULL);
491 
492       if (r != bfd_reloc_ok)
493 	{
494 	  const char *name;
495 	  const char *msg = (const char *) 0;
496 
497 	  if (h != NULL)
498 	    name = h->root.root.string;
499 	  else
500 	    {
501 	      name = (bfd_elf_string_from_elf_section
502 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
503 	      if (name == NULL || *name == '\0')
504 		name = bfd_section_name (input_bfd, sec);
505 	    }
506 
507 	  switch (r)
508 	    {
509 	    case bfd_reloc_overflow:
510 	      (*info->callbacks->reloc_overflow)
511 		(info, (h ? &h->root : NULL), name, howto->name,
512 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
513 	      break;
514 
515 	    case bfd_reloc_undefined:
516 	      (*info->callbacks->undefined_symbol)
517 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
518 	      break;
519 
520 	    case bfd_reloc_outofrange:
521 	      msg = _("internal error: out of range error");
522 	      goto common_error;
523 
524 	    case bfd_reloc_notsupported:
525 	      msg = _("internal error: unsupported relocation error");
526 	      goto common_error;
527 
528 	    case bfd_reloc_dangerous:
529 	      msg = _("internal error: dangerous error");
530 	      goto common_error;
531 
532 	    default:
533 	      msg = _("internal error: unknown error");
534 	      /* fall through */
535 
536 	    common_error:
537 	      (*info->callbacks->warning) (info, msg, name, input_bfd,
538 					   input_section, rel->r_offset);
539 	      break;
540 	    }
541 	}
542     }
543 
544   return TRUE;
545 }
546 
547 /* Object files encode the specific H8 model they were compiled
548    for in the ELF flags field.
549 
550    Examine that field and return the proper BFD machine type for
551    the object file.  */
552 static unsigned long
elf32_h8_mach(flagword flags)553 elf32_h8_mach (flagword flags)
554 {
555   switch (flags & EF_H8_MACH)
556     {
557     case E_H8_MACH_H8300:
558     default:
559       return bfd_mach_h8300;
560 
561     case E_H8_MACH_H8300H:
562       return bfd_mach_h8300h;
563 
564     case E_H8_MACH_H8300S:
565       return bfd_mach_h8300s;
566 
567     case E_H8_MACH_H8300HN:
568       return bfd_mach_h8300hn;
569 
570     case E_H8_MACH_H8300SN:
571       return bfd_mach_h8300sn;
572 
573     case E_H8_MACH_H8300SX:
574       return bfd_mach_h8300sx;
575 
576     case E_H8_MACH_H8300SXN:
577       return bfd_mach_h8300sxn;
578     }
579 }
580 
581 /* The final processing done just before writing out a H8 ELF object
582    file.  We use this opportunity to encode the BFD machine type
583    into the flags field in the object file.  */
584 
585 static void
elf32_h8_final_write_processing(bfd * abfd,bfd_boolean linker ATTRIBUTE_UNUSED)586 elf32_h8_final_write_processing (bfd *abfd,
587 				 bfd_boolean linker ATTRIBUTE_UNUSED)
588 {
589   unsigned long val;
590 
591   switch (bfd_get_mach (abfd))
592     {
593     default:
594     case bfd_mach_h8300:
595       val = E_H8_MACH_H8300;
596       break;
597 
598     case bfd_mach_h8300h:
599       val = E_H8_MACH_H8300H;
600       break;
601 
602     case bfd_mach_h8300s:
603       val = E_H8_MACH_H8300S;
604       break;
605 
606     case bfd_mach_h8300hn:
607       val = E_H8_MACH_H8300HN;
608       break;
609 
610     case bfd_mach_h8300sn:
611       val = E_H8_MACH_H8300SN;
612       break;
613 
614     case bfd_mach_h8300sx:
615       val = E_H8_MACH_H8300SX;
616       break;
617 
618     case bfd_mach_h8300sxn:
619       val = E_H8_MACH_H8300SXN;
620       break;
621     }
622 
623   elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
624   elf_elfheader (abfd)->e_flags |= val;
625 }
626 
627 /* Return nonzero if ABFD represents a valid H8 ELF object file; also
628    record the encoded machine type found in the ELF flags.  */
629 
630 static bfd_boolean
elf32_h8_object_p(bfd * abfd)631 elf32_h8_object_p (bfd *abfd)
632 {
633   bfd_default_set_arch_mach (abfd, bfd_arch_h8300,
634 			     elf32_h8_mach (elf_elfheader (abfd)->e_flags));
635   return TRUE;
636 }
637 
638 /* Merge backend specific data from an object file to the output
639    object file when linking.  The only data we need to copy at this
640    time is the architecture/machine information.  */
641 
642 static bfd_boolean
elf32_h8_merge_private_bfd_data(bfd * ibfd,bfd * obfd)643 elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
644 {
645   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
646       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
647     return TRUE;
648 
649   if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
650       && bfd_get_mach (obfd) < bfd_get_mach (ibfd))
651     {
652       if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
653 			       bfd_get_mach (ibfd)))
654 	return FALSE;
655     }
656 
657   return TRUE;
658 }
659 
660 /* This function handles relaxing for the H8..
661 
662    There are a few relaxing opportunities available on the H8:
663 
664      jmp/jsr:24    ->    bra/bsr:8		2 bytes
665      The jmp may be completely eliminated if the previous insn is a
666      conditional branch to the insn after the jump.  In that case
667      we invert the branch and delete the jump and save 4 bytes.
668 
669      bCC:16          ->    bCC:8                  2 bytes
670      bsr:16          ->    bsr:8                  2 bytes
671 
672      bset:16	     ->    bset:8                 2 bytes
673      bset:24/32	     ->    bset:8                 4 bytes
674      (also applicable to other bit manipulation instructions)
675 
676      mov.b:16	     ->    mov.b:8                2 bytes
677      mov.b:24/32     ->    mov.b:8                4 bytes
678 
679      bset:24/32	     ->    bset:16                2 bytes
680      (also applicable to other bit manipulation instructions)
681 
682      mov.[bwl]:24/32 ->    mov.[bwl]:16           2 bytes
683 
684      mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)  4 bytes.  */
685 
686 static bfd_boolean
elf32_h8_relax_section(bfd * abfd,asection * sec,struct bfd_link_info * link_info,bfd_boolean * again)687 elf32_h8_relax_section (bfd *abfd, asection *sec,
688 			struct bfd_link_info *link_info, bfd_boolean *again)
689 {
690   Elf_Internal_Shdr *symtab_hdr;
691   Elf_Internal_Rela *internal_relocs;
692   Elf_Internal_Rela *irel, *irelend;
693   bfd_byte *contents = NULL;
694   Elf_Internal_Sym *isymbuf = NULL;
695   static asection *last_input_section = NULL;
696   static Elf_Internal_Rela *last_reloc = NULL;
697 
698   /* Assume nothing changes.  */
699   *again = FALSE;
700 
701   /* We don't have to do anything for a relocatable link, if
702      this section does not have relocs, or if this is not a
703      code section.  */
704   if (bfd_link_relocatable (link_info)
705       || (sec->flags & SEC_RELOC) == 0
706       || sec->reloc_count == 0
707       || (sec->flags & SEC_CODE) == 0)
708     return TRUE;
709 
710   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
711 
712   /* Get a copy of the native relocations.  */
713   internal_relocs = (_bfd_elf_link_read_relocs
714 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
715 		      link_info->keep_memory));
716   if (internal_relocs == NULL)
717     goto error_return;
718 
719   if (sec != last_input_section)
720     last_reloc = NULL;
721 
722   last_input_section = sec;
723 
724   /* Walk through the relocs looking for relaxing opportunities.  */
725   irelend = internal_relocs + sec->reloc_count;
726   for (irel = internal_relocs; irel < irelend; irel++)
727     {
728       bfd_vma symval;
729 
730       {
731 	arelent bfd_reloc;
732 
733 	elf32_h8_info_to_howto (abfd, &bfd_reloc, irel);
734       }
735       /* Keep track of the previous reloc so that we can delete
736 	 some long jumps created by the compiler.  */
737       if (irel != internal_relocs)
738 	last_reloc = irel - 1;
739 
740       switch(ELF32_R_TYPE (irel->r_info))
741 	{
742 	case R_H8_DIR24R8:
743 	case R_H8_PCREL16:
744 	case R_H8_DIR16A8:
745 	case R_H8_DIR24A8:
746 	case R_H8_DIR32A16:
747 	case R_H8_DISP32A16:
748 	  break;
749 	default:
750 	  continue;
751 	}
752 
753       /* Get the section contents if we haven't done so already.  */
754       if (contents == NULL)
755 	{
756 	  /* Get cached copy if it exists.  */
757 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
758 	    contents = elf_section_data (sec)->this_hdr.contents;
759 	  else
760 	    {
761 	      /* Go get them off disk.  */
762 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
763 		goto error_return;
764 	    }
765 	}
766 
767       /* Read this BFD's local symbols if we haven't done so already.  */
768       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
769 	{
770 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
771 	  if (isymbuf == NULL)
772 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
773 					    symtab_hdr->sh_info, 0,
774 					    NULL, NULL, NULL);
775 	  if (isymbuf == NULL)
776 	    goto error_return;
777 	}
778 
779       /* Get the value of the symbol referred to by the reloc.  */
780       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
781 	{
782 	  /* A local symbol.  */
783 	  Elf_Internal_Sym *isym;
784 	  asection *sym_sec;
785 
786 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
787 	  sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
788 	  symval = isym->st_value;
789 	  /* If the reloc is absolute, it will not have
790 	     a symbol or section associated with it.  */
791 	  if (sym_sec)
792 	    symval += sym_sec->output_section->vma
793 	      + sym_sec->output_offset;
794 	}
795       else
796 	{
797 	  unsigned long indx;
798 	  struct elf_link_hash_entry *h;
799 
800 	  /* An external symbol.  */
801 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
802 	  h = elf_sym_hashes (abfd)[indx];
803 	  BFD_ASSERT (h != NULL);
804 	  if (h->root.type != bfd_link_hash_defined
805 	      && h->root.type != bfd_link_hash_defweak)
806 	    {
807 	      /* This appears to be a reference to an undefined
808                  symbol.  Just ignore it--it will be caught by the
809                  regular reloc processing.  */
810 	      continue;
811 	    }
812 
813 	  symval = (h->root.u.def.value
814 		    + h->root.u.def.section->output_section->vma
815 		    + h->root.u.def.section->output_offset);
816 	}
817 
818       /* For simplicity of coding, we are going to modify the section
819 	 contents, the section relocs, and the BFD symbol table.  We
820 	 must tell the rest of the code not to free up this
821 	 information.  It would be possible to instead create a table
822 	 of changes which have to be made, as is done in coff-mips.c;
823 	 that would be more work, but would require less memory when
824 	 the linker is run.  */
825       switch (ELF32_R_TYPE (irel->r_info))
826 	{
827 	  /* Try to turn a 24-bit absolute branch/call into an 8-bit
828 	     pc-relative branch/call.  */
829 	case R_H8_DIR24R8:
830 	  {
831 	    bfd_vma value = symval + irel->r_addend;
832 	    bfd_vma dot, gap;
833 
834 	    /* Get the address of this instruction.  */
835 	    dot = (sec->output_section->vma
836 		   + sec->output_offset + irel->r_offset - 1);
837 
838 	    /* Compute the distance from this insn to the branch target.  */
839 	    gap = value - dot;
840 
841 	    /* If the distance is within -126..+130 inclusive, then we can
842 	       relax this jump.  +130 is valid since the target will move
843 	       two bytes closer if we do relax this branch.  */
844 	    if ((int) gap >= -126 && (int) gap <= 130)
845 	      {
846 		unsigned char code;
847 
848 		/* Note that we've changed the relocs, section contents,
849 		   etc.  */
850 		elf_section_data (sec)->relocs = internal_relocs;
851 		elf_section_data (sec)->this_hdr.contents = contents;
852 		symtab_hdr->contents = (unsigned char *) isymbuf;
853 
854 		/* Get the instruction code being relaxed.  */
855 		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
856 
857 		/* If the previous instruction conditionally jumped around
858 		   this instruction, we may be able to reverse the condition
859 		   and redirect the previous instruction to the target of
860 		   this instruction.
861 
862 		   Such sequences are used by the compiler to deal with
863 		   long conditional branches.
864 
865 		   Only perform this optimisation for jumps (code 0x5a) not
866 		   subroutine calls, as otherwise it could transform:
867 
868 		   mov.w   r0,r0
869 		   beq     .L1
870 		   jsr     @_bar
871 		   .L1:   rts
872 		   _bar:  rts
873 		   into:
874 		   mov.w   r0,r0
875 		   bne     _bar
876 		   rts
877 		   _bar:  rts
878 
879 		   which changes the call (jsr) into a branch (bne).  */
880 		if (code == 0x5a	/* jmp24.  */
881 		    && (int) gap <= 130
882 		    && (int) gap >= -128
883 		    && last_reloc
884 		    && ELF32_R_TYPE (last_reloc->r_info) == R_H8_PCREL8
885 		    && ELF32_R_SYM (last_reloc->r_info) < symtab_hdr->sh_info)
886 		  {
887 		    bfd_vma last_value;
888 		    asection *last_sym_sec;
889 		    Elf_Internal_Sym *last_sym;
890 
891 		    /* We will need to examine the symbol used by the
892 		       previous relocation.  */
893 
894 		    last_sym = isymbuf + ELF32_R_SYM (last_reloc->r_info);
895 		    last_sym_sec
896 		      = bfd_section_from_elf_index (abfd, last_sym->st_shndx);
897 		    last_value = (last_sym->st_value
898 				  + last_sym_sec->output_section->vma
899 				  + last_sym_sec->output_offset);
900 
901 		    /* Verify that the previous relocation was for a
902 		       branch around this instruction and that no symbol
903 		       exists at the current location.  */
904 		    if (last_value == dot + 4
905 			&& last_reloc->r_offset + 2 == irel->r_offset
906 			&& ! elf32_h8_symbol_address_p (abfd, sec, dot))
907 		      {
908 			/* We can eliminate this jump.  Twiddle the
909 			   previous relocation as necessary.  */
910 			irel->r_info
911 			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
912 					  ELF32_R_TYPE (R_H8_NONE));
913 
914 			last_reloc->r_info
915 			  = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
916 					  ELF32_R_TYPE (R_H8_PCREL8));
917 			last_reloc->r_addend = irel->r_addend;
918 
919 			code = bfd_get_8 (abfd,
920 					  contents + last_reloc->r_offset - 1);
921 			code ^= 1;
922 			bfd_put_8 (abfd,
923 				   code,
924 				   contents + last_reloc->r_offset - 1);
925 
926 			/* Delete four bytes of data.  */
927 			if (!elf32_h8_relax_delete_bytes (abfd, sec,
928 							  irel->r_offset - 1,
929 							  4))
930 			  goto error_return;
931 
932 			*again = TRUE;
933 			break;
934 		      }
935 		  }
936 
937 		if (code == 0x5e)
938 		  /* This is jsr24  */
939 		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);	/* bsr8. */
940 		else if (code == 0x5a)
941 		  /* This is jmp24  */
942 		  bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);	/* bra8. */
943 		else
944 		  abort ();
945 
946 		/* Fix the relocation's type.  */
947 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
948 					     R_H8_PCREL8);
949 
950 		/* Delete two bytes of data.  */
951 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
952 						  irel->r_offset + 1, 2))
953 		  goto error_return;
954 
955 		/* That will change things, so, we should relax again.
956 		   Note that this is not required, and it may be slow.  */
957 		*again = TRUE;
958 	      }
959 	    break;
960 	  }
961 
962 	  /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
963 	     branch.  */
964 	case R_H8_PCREL16:
965 	  {
966 	    bfd_vma value = symval + irel->r_addend;
967 	    bfd_vma dot;
968 	    bfd_vma gap;
969 
970 	    /* Get the address of this instruction.  */
971 	    dot = (sec->output_section->vma
972 		   + sec->output_offset
973 		   + irel->r_offset - 2);
974 
975 	    gap = value - dot;
976 
977 	    /* If the distance is within -126..+130 inclusive, then we can
978 	       relax this jump.  +130 is valid since the target will move
979 	       two bytes closer if we do relax this branch.  */
980 	    if ((int) gap >= -126 && (int) gap <= 130)
981 	      {
982 		unsigned char code;
983 
984 		/* Note that we've changed the relocs, section contents,
985 		   etc.  */
986 		elf_section_data (sec)->relocs = internal_relocs;
987 		elf_section_data (sec)->this_hdr.contents = contents;
988 		symtab_hdr->contents = (unsigned char *) isymbuf;
989 
990 		/* Get the opcode.  */
991 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
992 
993 		if (code == 0x58)
994 		  {
995 		    /* bCC:16 -> bCC:8 */
996 		    /* Get the second byte of the original insn, which
997 		       contains the condition code.  */
998 		    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
999 
1000 		    /* Compute the first byte of the relaxed
1001 		       instruction.  The original sequence 0x58 0xX0
1002 		       is relaxed to 0x4X, where X represents the
1003 		       condition code.  */
1004 		    code &= 0xf0;
1005 		    code >>= 4;
1006 		    code |= 0x40;
1007 		    bfd_put_8 (abfd, code, contents + irel->r_offset - 2); /* bCC:8.  */
1008 		  }
1009 		else if (code == 0x5c)	/* bsr16.  */
1010 		  /* This is bsr.  */
1011 		  bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);  /* bsr8.  */
1012 		else
1013 		  /* Might be MOVSD.  */
1014 		  break;
1015 
1016 		/* Fix the relocation's type.  */
1017 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1018 					     R_H8_PCREL8);
1019 		irel->r_offset--;
1020 
1021 		/* Delete two bytes of data.  */
1022 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1023 						  irel->r_offset + 1, 2))
1024 		  goto error_return;
1025 
1026 		/* That will change things, so, we should relax again.
1027 		   Note that this is not required, and it may be slow.  */
1028 		*again = TRUE;
1029 	      }
1030 	    break;
1031 	  }
1032 
1033 	  /* This is a 16-bit absolute address in one of the following
1034 	     instructions:
1035 
1036 	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1037 	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1038 	     "mov.b"
1039 
1040 	     We may relax this into an 8-bit absolute address if it's in
1041 	     the right range.  */
1042 	case R_H8_DIR16A8:
1043 	  {
1044 	    bfd_vma value;
1045 
1046 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1047 	    if (value >= 0xffffff00u)
1048 	      {
1049 		unsigned char code;
1050 		unsigned char temp_code;
1051 
1052 		/* Note that we've changed the relocs, section contents,
1053 		   etc.  */
1054 		elf_section_data (sec)->relocs = internal_relocs;
1055 		elf_section_data (sec)->this_hdr.contents = contents;
1056 		symtab_hdr->contents = (unsigned char *) isymbuf;
1057 
1058 		/* Get the opcode.  */
1059 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1060 
1061 		/* All instructions with R_H8_DIR16A8 start with
1062 		   0x6a.  */
1063 		if (code != 0x6a)
1064 		  abort ();
1065 
1066 		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1067 		/* If this is a mov.b instruction, clear the lower
1068 		   nibble, which contains the source/destination
1069 		   register number.  */
1070 		if ((temp_code & 0x10) != 0x10)
1071 		  temp_code &= 0xf0;
1072 
1073 		switch (temp_code)
1074 		  {
1075 		  case 0x00:
1076 		    /* This is mov.b @aa:16,Rd.  */
1077 		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1078 			       contents + irel->r_offset - 2);
1079 		    break;
1080 		  case 0x80:
1081 		    /* This is mov.b Rs,@aa:16.  */
1082 		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1083 			       contents + irel->r_offset - 2);
1084 		    break;
1085 		  case 0x18:
1086 		    /* This is a bit-maniputation instruction that
1087 		       stores one bit into memory, one of "bclr",
1088 		       "bist", "bnot", "bset", and "bst".  */
1089 		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1090 		    break;
1091 		  case 0x10:
1092 		    /* This is a bit-maniputation instruction that
1093 		       loads one bit from memory, one of "band",
1094 		       "biand", "bild", "bior", "bixor", "bld", "bor",
1095 		       "btst", and "bxor".  */
1096 		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1097 		    break;
1098 		  default:
1099 		    abort ();
1100 		  }
1101 
1102 		/* Fix the relocation's type.  */
1103 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1104 					     R_H8_DIR8);
1105 
1106 		/* Move the relocation.  */
1107 		irel->r_offset--;
1108 
1109 		/* Delete two bytes of data.  */
1110 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1111 						  irel->r_offset + 1, 2))
1112 		  goto error_return;
1113 
1114 		/* That will change things, so, we should relax again.
1115 		   Note that this is not required, and it may be slow.  */
1116 		*again = TRUE;
1117 	      }
1118 	    break;
1119 	  }
1120 
1121 	  /* This is a 24-bit absolute address in one of the following
1122 	     instructions:
1123 
1124 	     "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
1125 	     "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
1126 	     "mov.b"
1127 
1128 	     We may relax this into an 8-bit absolute address if it's in
1129 	     the right range.  */
1130 	case R_H8_DIR24A8:
1131 	  {
1132 	    bfd_vma value;
1133 
1134 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1135 	    if (value >= 0xffffff00u)
1136 	      {
1137 		unsigned char code;
1138 		unsigned char temp_code;
1139 
1140 		/* Note that we've changed the relocs, section contents,
1141 		   etc.  */
1142 		elf_section_data (sec)->relocs = internal_relocs;
1143 		elf_section_data (sec)->this_hdr.contents = contents;
1144 		symtab_hdr->contents = (unsigned char *) isymbuf;
1145 
1146 		/* Get the opcode.  */
1147 		code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1148 
1149 		/* All instructions with R_H8_DIR24A8 start with
1150 		   0x6a.  */
1151 		if (code != 0x6a)
1152 		  abort ();
1153 
1154 		temp_code = code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1155 
1156 		/* If this is a mov.b instruction, clear the lower
1157 		   nibble, which contains the source/destination
1158 		   register number.  */
1159 		if ((temp_code & 0x30) != 0x30)
1160 		  temp_code &= 0xf0;
1161 
1162 		switch (temp_code)
1163 		  {
1164 		  case 0x20:
1165 		    /* This is mov.b @aa:24/32,Rd.  */
1166 		    bfd_put_8 (abfd, (code & 0xf) | 0x20,
1167 			       contents + irel->r_offset - 2);
1168 		    break;
1169 		  case 0xa0:
1170 		    /* This is mov.b Rs,@aa:24/32.  */
1171 		    bfd_put_8 (abfd, (code & 0xf) | 0x30,
1172 			       contents + irel->r_offset - 2);
1173 		    break;
1174 		  case 0x38:
1175 		    /* This is a bit-maniputation instruction that
1176 		       stores one bit into memory, one of "bclr",
1177 		       "bist", "bnot", "bset", and "bst".  */
1178 		    bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2);
1179 		    break;
1180 		  case 0x30:
1181 		    /* This is a bit-maniputation instruction that
1182 		       loads one bit from memory, one of "band",
1183 		       "biand", "bild", "bior", "bixor", "bld", "bor",
1184 		       "btst", and "bxor".  */
1185 		    bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2);
1186 		    break;
1187 		  default:
1188 		    abort();
1189 		  }
1190 
1191 		/* Fix the relocation's type.  */
1192 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1193 					     R_H8_DIR8);
1194 		irel->r_offset--;
1195 
1196 		/* Delete four bytes of data.  */
1197 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1198 						  irel->r_offset + 1, 4))
1199 		  goto error_return;
1200 
1201 		/* That will change things, so, we should relax again.
1202 		   Note that this is not required, and it may be slow.  */
1203 		*again = TRUE;
1204 		break;
1205 	      }
1206 	  }
1207 
1208 	  /* Fall through.  */
1209 
1210 	  /* This is a 24-/32-bit absolute address in one of the
1211 	     following instructions:
1212 
1213 	     "band", "bclr", "biand", "bild", "bior", "bist",
1214 	     "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
1215 	     "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
1216 
1217 	     We may relax this into an 16-bit absolute address if it's
1218 	     in the right range.  */
1219 	case R_H8_DIR32A16:
1220 	  {
1221 	    bfd_vma value;
1222 
1223 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1224 	    if (value <= 0x7fff || value >= 0xffff8000u)
1225 	      {
1226 		unsigned char code;
1227 		unsigned char op0, op1, op2, op3;
1228 		unsigned char *op_ptr;
1229 
1230 		/* Note that we've changed the relocs, section contents,
1231 		   etc.  */
1232 		elf_section_data (sec)->relocs = internal_relocs;
1233 		elf_section_data (sec)->this_hdr.contents = contents;
1234 		symtab_hdr->contents = (unsigned char *) isymbuf;
1235 
1236 		if (irel->r_offset >= 4)
1237 		  {
1238 		    /* Check for 4-byte MOVA relaxation (SH-specific).  */
1239 		    int second_reloc = 0;
1240 
1241 		    op_ptr = contents + irel->r_offset - 4;
1242 
1243 		    if (last_reloc)
1244 		      {
1245 			arelent bfd_reloc;
1246 			reloc_howto_type *h;
1247 			bfd_vma last_reloc_size;
1248 
1249 			elf32_h8_info_to_howto (abfd, &bfd_reloc, last_reloc);
1250 			h = bfd_reloc.howto;
1251 			last_reloc_size = 1 << h->size;
1252 			if (last_reloc->r_offset + last_reloc_size
1253 			    == irel->r_offset)
1254 			  {
1255 			    op_ptr -= last_reloc_size;
1256 			    second_reloc = 1;
1257 			  }
1258 		      }
1259 
1260 		    if (irel + 1 < irelend)
1261 		      {
1262 			Elf_Internal_Rela *next_reloc = irel + 1;
1263 			arelent bfd_reloc;
1264 			reloc_howto_type *h;
1265 			bfd_vma next_reloc_size;
1266 
1267 			elf32_h8_info_to_howto (abfd, &bfd_reloc, next_reloc);
1268 			h = bfd_reloc.howto;
1269 			next_reloc_size = 1 << h->size;
1270 			if (next_reloc->r_offset + next_reloc_size
1271 			    == irel->r_offset)
1272 			  {
1273 			    op_ptr -= next_reloc_size;
1274 			    second_reloc = 1;
1275 			  }
1276 		      }
1277 
1278 		    op0 = bfd_get_8 (abfd, op_ptr + 0);
1279 		    op1 = bfd_get_8 (abfd, op_ptr + 1);
1280 		    op2 = bfd_get_8 (abfd, op_ptr + 2);
1281 		    op3 = bfd_get_8 (abfd, op_ptr + 3);
1282 
1283 		    if (op0 == 0x01
1284 			&& (op1 & 0xdf) == 0x5f
1285 			&& (op2 & 0x40) == 0x40
1286 			&& (op3 & 0x80) == 0x80)
1287 		      {
1288 			if ((op2 & 0x08) == 0)
1289 			  second_reloc = 1;
1290 
1291 			if (second_reloc)
1292 			  {
1293 			    op3 &= ~0x08;
1294 			    bfd_put_8 (abfd, op3, op_ptr + 3);
1295 			  }
1296 			else
1297 			  {
1298 			    op2 &= ~0x08;
1299 			    bfd_put_8 (abfd, op2, op_ptr + 2);
1300 			  }
1301 			goto r_h8_dir32a16_common;
1302 		      }
1303 		  }
1304 
1305 		/* Now check for short version of MOVA.  (SH-specific) */
1306 		op_ptr = contents + irel->r_offset - 2;
1307 		op0 = bfd_get_8 (abfd, op_ptr + 0);
1308 		op1 = bfd_get_8 (abfd, op_ptr + 1);
1309 
1310 		if (op0 == 0x7a
1311 		    && (op1 & 0x88) == 0x80)
1312 		  {
1313 		    op1 |= 0x08;
1314 		    bfd_put_8 (abfd, op1, op_ptr + 1);
1315 		    goto r_h8_dir32a16_common;
1316 		  }
1317 
1318 		/* Get the opcode.  */
1319 		code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1320 
1321 		/* Fix the opcode.  For all the instructions that
1322 		   belong to this relaxation, we simply need to turn
1323 		   off bit 0x20 in the previous byte.  */
1324 		code &= ~0x20;
1325 
1326 		bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1327 
1328 	      r_h8_dir32a16_common:
1329 		/* Fix the relocation's type.  */
1330 		irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1331 					     R_H8_DIR16);
1332 
1333 		/* Delete two bytes of data.  */
1334 		if (!elf32_h8_relax_delete_bytes (abfd, sec,
1335 						  irel->r_offset + 1, 2))
1336 		  goto error_return;
1337 
1338 		/* That will change things, so, we should relax again.
1339 		   Note that this is not required, and it may be slow.  */
1340 		*again = TRUE;
1341 	      }
1342 	    break;	/* case R_H8_DIR32A16 */
1343 	  }
1344 
1345 	case R_H8_DISP32A16:
1346 	  /* mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)  4 bytes
1347 	     It is assured that instruction uses at least 4 bytes opcode before
1348 	     reloc entry addressing mode "register indirect with displacement"
1349 	     relaxing options (all saving 4 bytes):
1350 	     0x78 0sss0000 0x6A 0010dddd disp:32  mov.b @(d:32,ERs),Rd  ->
1351 	     0x6E 0sssdddd disp:16  mov.b @(d:16,ERs),Rd
1352 	     0x78 0sss0000 0x6B 0010dddd disp:32  mov.w @(d:32,ERs),Rd  ->
1353 	     0x6F 0sssdddd disp:16  mov.w @(d:16,ERs),Rd
1354 	     0x01 0x00 0x78 0sss0000 0x6B 00100ddd disp:32  mov.l @(d:32,ERs),ERd ->
1355 	     0x01 0x00 0x6F 0sss0ddd disp:16  mov.l @(d:16,ERs),ERd
1356 
1357 	     0x78 0ddd0000 0x6A 1010ssss disp:32  mov.b Rs,@(d:32,ERd)  ->
1358 	     0x6E 1dddssss disp:16  mov.b Rs,@(d:16,ERd)
1359 	     0x78 0ddd0000 0x6B 1010ssss disp:32  mov.w Rs,@(d:32,ERd)  ->
1360 	     0x6F 1dddssss disp:16  mov.w Rs,@(d:16,ERd)
1361 	     0x01 0x00 0x78 xddd0000 0x6B 10100sss disp:32  mov.l ERs,@(d:32,ERd) ->
1362 	     0x01 0x00 0x6F 1ddd0sss disp:16  mov.l ERs,@(d:16,ERd)
1363 	     mov.l prefix 0x01 0x00 can be left as is and mov.l handled same
1364 	     as mov.w/  */
1365 	  {
1366 	    bfd_vma value;
1367 
1368 	    value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
1369 	    if (value <= 0x7fff || value >= 0xffff8000u)
1370 	      {
1371 		unsigned char op0, op1, op2, op3, op0n, op1n;
1372 		int relax = 0;
1373 
1374 		/* Note that we've changed the relocs, section contents,
1375 		   etc.  */
1376 		elf_section_data (sec)->relocs = internal_relocs;
1377 		elf_section_data (sec)->this_hdr.contents = contents;
1378 		symtab_hdr->contents = (unsigned char *) isymbuf;
1379 
1380 		if (irel->r_offset >= 4)
1381 		  {
1382 		    op0 = bfd_get_8 (abfd, contents + irel->r_offset - 4);
1383 		    op1 = bfd_get_8 (abfd, contents + irel->r_offset - 3);
1384 		    op2 = bfd_get_8 (abfd, contents + irel->r_offset - 2);
1385 		    op3 = bfd_get_8 (abfd, contents + irel->r_offset - 1);
1386 
1387 		    if (op0 == 0x78)
1388 		      {
1389 			switch(op2)
1390 			  {
1391 			  case 0x6A:
1392 			    if ((op1 & 0x8F) == 0x00 && (op3 & 0x70) == 0x20)
1393 			      {
1394 				/* mov.b.  */
1395 				op0n = 0x6E;
1396 				relax = 1;
1397 			      }
1398 			    break;
1399 			  case 0x6B:
1400 			    if ((op1 & 0x0F) == 0x00 && (op3 & 0x70) == 0x20)
1401 			      {
1402 				/* mov.w/l.  */
1403 				op0n = 0x6F;
1404 				relax = 1;
1405 			      }
1406 			    break;
1407 			  default:
1408 			    break;
1409 			  }
1410 		      }
1411 		  }
1412 
1413 		if (relax)
1414 		  {
1415 		    op1n = (op3 & 0x8F) | (op1 & 0x70);
1416 		    bfd_put_8 (abfd, op0n, contents + irel->r_offset - 4);
1417 		    bfd_put_8 (abfd, op1n, contents + irel->r_offset - 3);
1418 
1419 		    /* Fix the relocation's type.  */
1420 		    irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_H8_DIR16);
1421 		    irel->r_offset -= 2;
1422 
1423 		    /* Delete four bytes of data.  */
1424 		    if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset + 2, 4))
1425 		      goto error_return;
1426 
1427 		    /* That will change things, so, we should relax again.
1428 		       Note that this is not required, and it may be slow.  */
1429 		    *again = TRUE;
1430 		  }
1431 	      }
1432 	  }
1433 	  break;
1434 
1435 	default:
1436 	  break;
1437 	}
1438     }
1439 
1440   if (isymbuf != NULL
1441       && symtab_hdr->contents != (unsigned char *) isymbuf)
1442     {
1443       if (! link_info->keep_memory)
1444 	free (isymbuf);
1445       else
1446 	symtab_hdr->contents = (unsigned char *) isymbuf;
1447     }
1448 
1449   if (contents != NULL
1450       && elf_section_data (sec)->this_hdr.contents != contents)
1451     {
1452       if (! link_info->keep_memory)
1453 	free (contents);
1454       else
1455 	{
1456 	  /* Cache the section contents for elf_link_input_bfd.  */
1457 	  elf_section_data (sec)->this_hdr.contents = contents;
1458 	}
1459     }
1460 
1461   if (internal_relocs != NULL
1462       && elf_section_data (sec)->relocs != internal_relocs)
1463     free (internal_relocs);
1464 
1465   return TRUE;
1466 
1467  error_return:
1468   if (isymbuf != NULL
1469       && symtab_hdr->contents != (unsigned char *) isymbuf)
1470     free (isymbuf);
1471   if (contents != NULL
1472       && elf_section_data (sec)->this_hdr.contents != contents)
1473     free (contents);
1474   if (internal_relocs != NULL
1475       && elf_section_data (sec)->relocs != internal_relocs)
1476     free (internal_relocs);
1477   return FALSE;
1478 }
1479 
1480 /* Delete some bytes from a section while relaxing.  */
1481 
1482 static bfd_boolean
elf32_h8_relax_delete_bytes(bfd * abfd,asection * sec,bfd_vma addr,int count)1483 elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
1484 {
1485   Elf_Internal_Shdr *symtab_hdr;
1486   unsigned int sec_shndx;
1487   bfd_byte *contents;
1488   Elf_Internal_Rela *irel, *irelend;
1489   Elf_Internal_Sym *isym;
1490   Elf_Internal_Sym *isymend;
1491   bfd_vma toaddr;
1492   struct elf_link_hash_entry **sym_hashes;
1493   struct elf_link_hash_entry **end_hashes;
1494   unsigned int symcount;
1495 
1496   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1497 
1498   contents = elf_section_data (sec)->this_hdr.contents;
1499 
1500   toaddr = sec->size;
1501 
1502   irel = elf_section_data (sec)->relocs;
1503   irelend = irel + sec->reloc_count;
1504 
1505   /* Actually delete the bytes.  */
1506   memmove (contents + addr, contents + addr + count,
1507 	   (size_t) (toaddr - addr - count));
1508   sec->size -= count;
1509 
1510   /* Adjust all the relocs.  */
1511   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1512     {
1513       /* Get the new reloc address.  */
1514       if ((irel->r_offset > addr
1515 	   && irel->r_offset <= toaddr))
1516 	irel->r_offset -= count;
1517     }
1518 
1519   /* Adjust the local symbols defined in this section.  */
1520   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1521   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1522   isymend = isym + symtab_hdr->sh_info;
1523   for (; isym < isymend; isym++)
1524     {
1525       if (isym->st_shndx == sec_shndx
1526 	  && isym->st_value > addr
1527 	  && isym->st_value <= toaddr)
1528 	isym->st_value -= count;
1529     }
1530 
1531   /* Now adjust the global symbols defined in this section.  */
1532   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1533 	      - symtab_hdr->sh_info);
1534   sym_hashes = elf_sym_hashes (abfd);
1535   end_hashes = sym_hashes + symcount;
1536   for (; sym_hashes < end_hashes; sym_hashes++)
1537     {
1538       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1539 
1540       if ((sym_hash->root.type == bfd_link_hash_defined
1541 	   || sym_hash->root.type == bfd_link_hash_defweak)
1542 	  && sym_hash->root.u.def.section == sec
1543 	  && sym_hash->root.u.def.value > addr
1544 	  && sym_hash->root.u.def.value <= toaddr)
1545 	sym_hash->root.u.def.value -= count;
1546     }
1547 
1548   return TRUE;
1549 }
1550 
1551 /* Return TRUE if a symbol exists at the given address, else return
1552    FALSE.  */
1553 static bfd_boolean
elf32_h8_symbol_address_p(bfd * abfd,asection * sec,bfd_vma addr)1554 elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
1555 {
1556   Elf_Internal_Shdr *symtab_hdr;
1557   unsigned int sec_shndx;
1558   Elf_Internal_Sym *isym;
1559   Elf_Internal_Sym *isymend;
1560   struct elf_link_hash_entry **sym_hashes;
1561   struct elf_link_hash_entry **end_hashes;
1562   unsigned int symcount;
1563 
1564   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1565 
1566   /* Examine all the symbols.  */
1567   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1568   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1569   isymend = isym + symtab_hdr->sh_info;
1570   for (; isym < isymend; isym++)
1571     {
1572       if (isym->st_shndx == sec_shndx
1573 	  && isym->st_value == addr)
1574 	return TRUE;
1575     }
1576 
1577   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1578 	      - symtab_hdr->sh_info);
1579   sym_hashes = elf_sym_hashes (abfd);
1580   end_hashes = sym_hashes + symcount;
1581   for (; sym_hashes < end_hashes; sym_hashes++)
1582     {
1583       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1584       if ((sym_hash->root.type == bfd_link_hash_defined
1585 	   || sym_hash->root.type == bfd_link_hash_defweak)
1586 	  && sym_hash->root.u.def.section == sec
1587 	  && sym_hash->root.u.def.value == addr)
1588 	return TRUE;
1589     }
1590 
1591   return FALSE;
1592 }
1593 
1594 /* This is a version of bfd_generic_get_relocated_section_contents
1595    which uses elf32_h8_relocate_section.  */
1596 
1597 static bfd_byte *
elf32_h8_get_relocated_section_contents(bfd * output_bfd,struct bfd_link_info * link_info,struct bfd_link_order * link_order,bfd_byte * data,bfd_boolean relocatable,asymbol ** symbols)1598 elf32_h8_get_relocated_section_contents (bfd *output_bfd,
1599 					 struct bfd_link_info *link_info,
1600 					 struct bfd_link_order *link_order,
1601 					 bfd_byte *data,
1602 					 bfd_boolean relocatable,
1603 					 asymbol **symbols)
1604 {
1605   Elf_Internal_Shdr *symtab_hdr;
1606   asection *input_section = link_order->u.indirect.section;
1607   bfd *input_bfd = input_section->owner;
1608   asection **sections = NULL;
1609   Elf_Internal_Rela *internal_relocs = NULL;
1610   Elf_Internal_Sym *isymbuf = NULL;
1611 
1612   /* We only need to handle the case of relaxing, or of having a
1613      particular set of section contents, specially.  */
1614   if (relocatable
1615       || elf_section_data (input_section)->this_hdr.contents == NULL)
1616     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1617 						       link_order, data,
1618 						       relocatable,
1619 						       symbols);
1620 
1621   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1622 
1623   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1624 	  (size_t) input_section->size);
1625 
1626   if ((input_section->flags & SEC_RELOC) != 0
1627       && input_section->reloc_count > 0)
1628     {
1629       asection **secpp;
1630       Elf_Internal_Sym *isym, *isymend;
1631       bfd_size_type amt;
1632 
1633       internal_relocs = (_bfd_elf_link_read_relocs
1634 			 (input_bfd, input_section, NULL,
1635 			  (Elf_Internal_Rela *) NULL, FALSE));
1636       if (internal_relocs == NULL)
1637 	goto error_return;
1638 
1639       if (symtab_hdr->sh_info != 0)
1640 	{
1641 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1642 	  if (isymbuf == NULL)
1643 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1644 					    symtab_hdr->sh_info, 0,
1645 					    NULL, NULL, NULL);
1646 	  if (isymbuf == NULL)
1647 	    goto error_return;
1648 	}
1649 
1650       amt = symtab_hdr->sh_info;
1651       amt *= sizeof (asection *);
1652       sections = (asection **) bfd_malloc (amt);
1653       if (sections == NULL && amt != 0)
1654 	goto error_return;
1655 
1656       isymend = isymbuf + symtab_hdr->sh_info;
1657       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1658 	{
1659 	  asection *isec;
1660 
1661 	  if (isym->st_shndx == SHN_UNDEF)
1662 	    isec = bfd_und_section_ptr;
1663 	  else if (isym->st_shndx == SHN_ABS)
1664 	    isec = bfd_abs_section_ptr;
1665 	  else if (isym->st_shndx == SHN_COMMON)
1666 	    isec = bfd_com_section_ptr;
1667 	  else
1668 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1669 
1670 	  *secpp = isec;
1671 	}
1672 
1673       if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
1674 				       input_section, data, internal_relocs,
1675 				       isymbuf, sections))
1676 	goto error_return;
1677 
1678       if (sections != NULL)
1679 	free (sections);
1680       if (isymbuf != NULL
1681 	  && symtab_hdr->contents != (unsigned char *) isymbuf)
1682 	free (isymbuf);
1683       if (elf_section_data (input_section)->relocs != internal_relocs)
1684 	free (internal_relocs);
1685     }
1686 
1687   return data;
1688 
1689  error_return:
1690   if (sections != NULL)
1691     free (sections);
1692   if (isymbuf != NULL
1693       && symtab_hdr->contents != (unsigned char *) isymbuf)
1694     free (isymbuf);
1695   if (internal_relocs != NULL
1696       && elf_section_data (input_section)->relocs != internal_relocs)
1697     free (internal_relocs);
1698   return NULL;
1699 }
1700 
1701 
1702 #define TARGET_BIG_SYM			h8300_elf32_vec
1703 #define TARGET_BIG_NAME			"elf32-h8300"
1704 #define ELF_ARCH			bfd_arch_h8300
1705 #define ELF_MACHINE_CODE		EM_H8_300
1706 #define ELF_MAXPAGESIZE			0x1
1707 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
1708 #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
1709 #define elf_info_to_howto		elf32_h8_info_to_howto
1710 #define elf_info_to_howto_rel		elf32_h8_info_to_howto_rel
1711 
1712 /* So we can set/examine bits in e_flags to get the specific
1713    H8 architecture in use.  */
1714 #define elf_backend_final_write_processing \
1715   elf32_h8_final_write_processing
1716 #define elf_backend_object_p \
1717   elf32_h8_object_p
1718 #define bfd_elf32_bfd_merge_private_bfd_data \
1719   elf32_h8_merge_private_bfd_data
1720 
1721 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
1722    defaults to using _bfd_generic_link_hash_table_create, but
1723    bfd_elf_size_dynamic_sections uses
1724    dynobj = elf_hash_table (info)->dynobj;
1725    and thus requires an elf hash table.  */
1726 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
1727 
1728 /* Use an H8 specific linker, not the ELF generic linker.  */
1729 #define elf_backend_relocate_section elf32_h8_relocate_section
1730 #define elf_backend_rela_normal		1
1731 #define elf_backend_can_gc_sections	1
1732 
1733 /* And relaxing stuff.  */
1734 #define bfd_elf32_bfd_relax_section     elf32_h8_relax_section
1735 #define bfd_elf32_bfd_get_relocated_section_contents \
1736                                 elf32_h8_get_relocated_section_contents
1737 
1738 #define elf_symbol_leading_char '_'
1739 
1740 #include "elf32-target.h"
1741 
1742 #undef  TARGET_BIG_SYM
1743 #define TARGET_BIG_SYM			h8300_elf32_linux_vec
1744 #undef  TARGET_BIG_NAME
1745 #define TARGET_BIG_NAME			"elf32-h8300-linux"
1746 #undef  elf_symbol_leading_char
1747 #define elf32_bed			elf32_h8300_linux_bed
1748 
1749 #include "elf32-target.h"
1750