Home | History | Annotate | Line # | Download | only in bfd
elf32-h8300.c revision 1.1.1.5.12.2
      1 /* BFD back-end for Renesas H8/300 ELF binaries.
      2    Copyright (C) 1993-2018 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 bfd_boolean elf32_h8_info_to_howto
     30   (bfd *, arelent *, Elf_Internal_Rela *);
     31 static bfd_boolean 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
     37   (bfd *, struct bfd_link_info *);
     38 static bfd_boolean elf32_h8_relax_section
     39   (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
     40 static bfd_boolean elf32_h8_relax_delete_bytes
     41   (bfd *, asection *, bfd_vma, int);
     42 static bfd_boolean elf32_h8_symbol_address_p (bfd *, asection *, bfd_vma);
     43 static bfd_byte *elf32_h8_get_relocated_section_contents
     44   (bfd *, struct bfd_link_info *, struct bfd_link_order *,
     45    bfd_byte *, bfd_boolean, asymbol **);
     46 static bfd_reloc_status_type elf32_h8_final_link_relocate
     47   (unsigned long, bfd *, bfd *, asection *,
     48    bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
     49    struct bfd_link_info *, asection *, int);
     50 static bfd_boolean elf32_h8_relocate_section
     51   (bfd *, struct bfd_link_info *, bfd *, asection *,
     52    bfd_byte *, Elf_Internal_Rela *,
     53    Elf_Internal_Sym *, asection **);
     54 static bfd_reloc_status_type special
     55   (bfd *, arelent *, asymbol *, 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 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
     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 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
     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 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
     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 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    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 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    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 bfd_boolean
    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 bfd_boolean
    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 bfd_boolean
    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 	  bfd_boolean 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 (input_bfd, 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 void
    589 elf32_h8_final_write_processing (bfd *abfd,
    590 				 bfd_boolean linker ATTRIBUTE_UNUSED)
    591 {
    592   unsigned long val;
    593 
    594   switch (bfd_get_mach (abfd))
    595     {
    596     default:
    597     case bfd_mach_h8300:
    598       val = E_H8_MACH_H8300;
    599       break;
    600 
    601     case bfd_mach_h8300h:
    602       val = E_H8_MACH_H8300H;
    603       break;
    604 
    605     case bfd_mach_h8300s:
    606       val = E_H8_MACH_H8300S;
    607       break;
    608 
    609     case bfd_mach_h8300hn:
    610       val = E_H8_MACH_H8300HN;
    611       break;
    612 
    613     case bfd_mach_h8300sn:
    614       val = E_H8_MACH_H8300SN;
    615       break;
    616 
    617     case bfd_mach_h8300sx:
    618       val = E_H8_MACH_H8300SX;
    619       break;
    620 
    621     case bfd_mach_h8300sxn:
    622       val = E_H8_MACH_H8300SXN;
    623       break;
    624     }
    625 
    626   elf_elfheader (abfd)->e_flags &= ~ (EF_H8_MACH);
    627   elf_elfheader (abfd)->e_flags |= val;
    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 bfd_boolean
    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 bfd_boolean
    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 bfd_boolean
    692 elf32_h8_relax_section (bfd *abfd, asection *sec,
    693 			struct bfd_link_info *link_info, bfd_boolean *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 (internal_relocs != NULL
   1470       && elf_section_data (sec)->relocs != internal_relocs)
   1471     free (internal_relocs);
   1472 
   1473   return TRUE;
   1474 
   1475  error_return:
   1476   if (isymbuf != NULL
   1477       && symtab_hdr->contents != (unsigned char *) isymbuf)
   1478     free (isymbuf);
   1479   if (contents != NULL
   1480       && elf_section_data (sec)->this_hdr.contents != contents)
   1481     free (contents);
   1482   if (internal_relocs != NULL
   1483       && elf_section_data (sec)->relocs != internal_relocs)
   1484     free (internal_relocs);
   1485   return FALSE;
   1486 }
   1487 
   1488 /* Delete some bytes from a section while relaxing.  */
   1489 
   1490 static bfd_boolean
   1491 elf32_h8_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count)
   1492 {
   1493   Elf_Internal_Shdr *symtab_hdr;
   1494   unsigned int sec_shndx;
   1495   bfd_byte *contents;
   1496   Elf_Internal_Rela *irel, *irelend;
   1497   Elf_Internal_Sym *isym;
   1498   Elf_Internal_Sym *isymend;
   1499   bfd_vma toaddr;
   1500   struct elf_link_hash_entry **sym_hashes;
   1501   struct elf_link_hash_entry **end_hashes;
   1502   unsigned int symcount;
   1503 
   1504   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1505 
   1506   contents = elf_section_data (sec)->this_hdr.contents;
   1507 
   1508   toaddr = sec->size;
   1509 
   1510   irel = elf_section_data (sec)->relocs;
   1511   irelend = irel + sec->reloc_count;
   1512 
   1513   /* Actually delete the bytes.  */
   1514   memmove (contents + addr, contents + addr + count,
   1515 	   (size_t) (toaddr - addr - count));
   1516   sec->size -= count;
   1517 
   1518   /* Adjust all the relocs.  */
   1519   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
   1520     {
   1521       /* Get the new reloc address.  */
   1522       if ((irel->r_offset > addr
   1523 	   && irel->r_offset <= toaddr))
   1524 	irel->r_offset -= count;
   1525     }
   1526 
   1527   /* Adjust the local symbols defined in this section.  */
   1528   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1529   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1530   isymend = isym + symtab_hdr->sh_info;
   1531   for (; isym < isymend; isym++)
   1532     {
   1533       if (isym->st_shndx == sec_shndx
   1534 	  && isym->st_value > addr
   1535 	  && isym->st_value <= toaddr)
   1536 	isym->st_value -= count;
   1537     }
   1538 
   1539   /* Now adjust the global symbols defined in this section.  */
   1540   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1541 	      - symtab_hdr->sh_info);
   1542   sym_hashes = elf_sym_hashes (abfd);
   1543   end_hashes = sym_hashes + symcount;
   1544   for (; sym_hashes < end_hashes; sym_hashes++)
   1545     {
   1546       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1547 
   1548       if ((sym_hash->root.type == bfd_link_hash_defined
   1549 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1550 	  && sym_hash->root.u.def.section == sec
   1551 	  && sym_hash->root.u.def.value > addr
   1552 	  && sym_hash->root.u.def.value <= toaddr)
   1553 	sym_hash->root.u.def.value -= count;
   1554     }
   1555 
   1556   return TRUE;
   1557 }
   1558 
   1559 /* Return TRUE if a symbol exists at the given address, else return
   1560    FALSE.  */
   1561 static bfd_boolean
   1562 elf32_h8_symbol_address_p (bfd *abfd, asection *sec, bfd_vma addr)
   1563 {
   1564   Elf_Internal_Shdr *symtab_hdr;
   1565   unsigned int sec_shndx;
   1566   Elf_Internal_Sym *isym;
   1567   Elf_Internal_Sym *isymend;
   1568   struct elf_link_hash_entry **sym_hashes;
   1569   struct elf_link_hash_entry **end_hashes;
   1570   unsigned int symcount;
   1571 
   1572   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1573 
   1574   /* Examine all the symbols.  */
   1575   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1576   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
   1577   isymend = isym + symtab_hdr->sh_info;
   1578   for (; isym < isymend; isym++)
   1579     {
   1580       if (isym->st_shndx == sec_shndx
   1581 	  && isym->st_value == addr)
   1582 	return TRUE;
   1583     }
   1584 
   1585   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1586 	      - symtab_hdr->sh_info);
   1587   sym_hashes = elf_sym_hashes (abfd);
   1588   end_hashes = sym_hashes + symcount;
   1589   for (; sym_hashes < end_hashes; sym_hashes++)
   1590     {
   1591       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1592       if ((sym_hash->root.type == bfd_link_hash_defined
   1593 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1594 	  && sym_hash->root.u.def.section == sec
   1595 	  && sym_hash->root.u.def.value == addr)
   1596 	return TRUE;
   1597     }
   1598 
   1599   return FALSE;
   1600 }
   1601 
   1602 /* This is a version of bfd_generic_get_relocated_section_contents
   1603    which uses elf32_h8_relocate_section.  */
   1604 
   1605 static bfd_byte *
   1606 elf32_h8_get_relocated_section_contents (bfd *output_bfd,
   1607 					 struct bfd_link_info *link_info,
   1608 					 struct bfd_link_order *link_order,
   1609 					 bfd_byte *data,
   1610 					 bfd_boolean relocatable,
   1611 					 asymbol **symbols)
   1612 {
   1613   Elf_Internal_Shdr *symtab_hdr;
   1614   asection *input_section = link_order->u.indirect.section;
   1615   bfd *input_bfd = input_section->owner;
   1616   asection **sections = NULL;
   1617   Elf_Internal_Rela *internal_relocs = NULL;
   1618   Elf_Internal_Sym *isymbuf = NULL;
   1619 
   1620   /* We only need to handle the case of relaxing, or of having a
   1621      particular set of section contents, specially.  */
   1622   if (relocatable
   1623       || elf_section_data (input_section)->this_hdr.contents == NULL)
   1624     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
   1625 						       link_order, data,
   1626 						       relocatable,
   1627 						       symbols);
   1628 
   1629   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1630 
   1631   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
   1632 	  (size_t) input_section->size);
   1633 
   1634   if ((input_section->flags & SEC_RELOC) != 0
   1635       && input_section->reloc_count > 0)
   1636     {
   1637       asection **secpp;
   1638       Elf_Internal_Sym *isym, *isymend;
   1639       bfd_size_type amt;
   1640 
   1641       internal_relocs = (_bfd_elf_link_read_relocs
   1642 			 (input_bfd, input_section, NULL,
   1643 			  (Elf_Internal_Rela *) NULL, FALSE));
   1644       if (internal_relocs == NULL)
   1645 	goto error_return;
   1646 
   1647       if (symtab_hdr->sh_info != 0)
   1648 	{
   1649 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1650 	  if (isymbuf == NULL)
   1651 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   1652 					    symtab_hdr->sh_info, 0,
   1653 					    NULL, NULL, NULL);
   1654 	  if (isymbuf == NULL)
   1655 	    goto error_return;
   1656 	}
   1657 
   1658       amt = symtab_hdr->sh_info;
   1659       amt *= sizeof (asection *);
   1660       sections = (asection **) bfd_malloc (amt);
   1661       if (sections == NULL && amt != 0)
   1662 	goto error_return;
   1663 
   1664       isymend = isymbuf + symtab_hdr->sh_info;
   1665       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
   1666 	{
   1667 	  asection *isec;
   1668 
   1669 	  if (isym->st_shndx == SHN_UNDEF)
   1670 	    isec = bfd_und_section_ptr;
   1671 	  else if (isym->st_shndx == SHN_ABS)
   1672 	    isec = bfd_abs_section_ptr;
   1673 	  else if (isym->st_shndx == SHN_COMMON)
   1674 	    isec = bfd_com_section_ptr;
   1675 	  else
   1676 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
   1677 
   1678 	  *secpp = isec;
   1679 	}
   1680 
   1681       if (! elf32_h8_relocate_section (output_bfd, link_info, input_bfd,
   1682 				       input_section, data, internal_relocs,
   1683 				       isymbuf, sections))
   1684 	goto error_return;
   1685 
   1686       if (sections != NULL)
   1687 	free (sections);
   1688       if (isymbuf != NULL
   1689 	  && symtab_hdr->contents != (unsigned char *) isymbuf)
   1690 	free (isymbuf);
   1691       if (elf_section_data (input_section)->relocs != internal_relocs)
   1692 	free (internal_relocs);
   1693     }
   1694 
   1695   return data;
   1696 
   1697  error_return:
   1698   if (sections != NULL)
   1699     free (sections);
   1700   if (isymbuf != NULL
   1701       && symtab_hdr->contents != (unsigned char *) isymbuf)
   1702     free (isymbuf);
   1703   if (internal_relocs != NULL
   1704       && elf_section_data (input_section)->relocs != internal_relocs)
   1705     free (internal_relocs);
   1706   return NULL;
   1707 }
   1708 
   1709 
   1710 #define TARGET_BIG_SYM			h8300_elf32_vec
   1711 #define TARGET_BIG_NAME			"elf32-h8300"
   1712 #define ELF_ARCH			bfd_arch_h8300
   1713 #define ELF_MACHINE_CODE		EM_H8_300
   1714 #define ELF_MAXPAGESIZE			0x1
   1715 #define bfd_elf32_bfd_reloc_type_lookup elf32_h8_reloc_type_lookup
   1716 #define bfd_elf32_bfd_reloc_name_lookup elf32_h8_reloc_name_lookup
   1717 #define elf_info_to_howto		elf32_h8_info_to_howto
   1718 #define elf_info_to_howto_rel		elf32_h8_info_to_howto_rel
   1719 
   1720 /* So we can set/examine bits in e_flags to get the specific
   1721    H8 architecture in use.  */
   1722 #define elf_backend_final_write_processing \
   1723   elf32_h8_final_write_processing
   1724 #define elf_backend_object_p \
   1725   elf32_h8_object_p
   1726 #define bfd_elf32_bfd_merge_private_bfd_data \
   1727   elf32_h8_merge_private_bfd_data
   1728 
   1729 /* ??? when elf_backend_relocate_section is not defined, elf32-target.h
   1730    defaults to using _bfd_generic_link_hash_table_create, but
   1731    bfd_elf_size_dynamic_sections uses
   1732    dynobj = elf_hash_table (info)->dynobj;
   1733    and thus requires an elf hash table.  */
   1734 #define bfd_elf32_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
   1735 
   1736 /* Use an H8 specific linker, not the ELF generic linker.  */
   1737 #define elf_backend_relocate_section elf32_h8_relocate_section
   1738 #define elf_backend_rela_normal		1
   1739 #define elf_backend_can_gc_sections	1
   1740 
   1741 /* And relaxing stuff.  */
   1742 #define bfd_elf32_bfd_relax_section     elf32_h8_relax_section
   1743 #define bfd_elf32_bfd_get_relocated_section_contents \
   1744 				elf32_h8_get_relocated_section_contents
   1745 
   1746 #define elf_symbol_leading_char '_'
   1747 
   1748 #include "elf32-target.h"
   1749 
   1750 #undef  TARGET_BIG_SYM
   1751 #define TARGET_BIG_SYM			h8300_elf32_linux_vec
   1752 #undef  TARGET_BIG_NAME
   1753 #define TARGET_BIG_NAME			"elf32-h8300-linux"
   1754 #undef  elf_symbol_leading_char
   1755 #define elf32_bed			elf32_h8300_linux_bed
   1756 
   1757 #include "elf32-target.h"
   1758