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