Home | History | Annotate | Line # | Download | only in bfd
elf-m10200.c revision 1.1.1.8
      1 /* Matsushita 10200 specific support for 32-bit ELF
      2    Copyright (C) 1996-2025 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 
     26 static bool
     27 mn10200_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
     28 static bool
     29 mn10200_elf_symbol_address_p (bfd *, asection *, Elf_Internal_Sym *, bfd_vma);
     30 
     31 enum reloc_type
     32 {
     33   R_MN10200_NONE = 0,
     34   R_MN10200_32,
     35   R_MN10200_16,
     36   R_MN10200_8,
     37   R_MN10200_24,
     38   R_MN10200_PCREL8,
     39   R_MN10200_PCREL16,
     40   R_MN10200_PCREL24,
     41   R_MN10200_MAX
     42 };
     43 
     44 static reloc_howto_type elf_mn10200_howto_table[] =
     45 {
     46   /* Dummy relocation.  Does nothing.  */
     47   HOWTO (R_MN10200_NONE,
     48 	 0,
     49 	 0,
     50 	 0,
     51 	 false,
     52 	 0,
     53 	 complain_overflow_dont,
     54 	 bfd_elf_generic_reloc,
     55 	 "R_MN10200_NONE",
     56 	 false,
     57 	 0,
     58 	 0,
     59 	 false),
     60   /* Standard 32 bit reloc.  */
     61   HOWTO (R_MN10200_32,
     62 	 0,
     63 	 4,
     64 	 32,
     65 	 false,
     66 	 0,
     67 	 complain_overflow_bitfield,
     68 	 bfd_elf_generic_reloc,
     69 	 "R_MN10200_32",
     70 	 false,
     71 	 0xffffffff,
     72 	 0xffffffff,
     73 	 false),
     74   /* Standard 16 bit reloc.  */
     75   HOWTO (R_MN10200_16,
     76 	 0,
     77 	 2,
     78 	 16,
     79 	 false,
     80 	 0,
     81 	 complain_overflow_bitfield,
     82 	 bfd_elf_generic_reloc,
     83 	 "R_MN10200_16",
     84 	 false,
     85 	 0xffff,
     86 	 0xffff,
     87 	 false),
     88   /* Standard 8 bit reloc.  */
     89   HOWTO (R_MN10200_8,
     90 	 0,
     91 	 1,
     92 	 8,
     93 	 false,
     94 	 0,
     95 	 complain_overflow_bitfield,
     96 	 bfd_elf_generic_reloc,
     97 	 "R_MN10200_8",
     98 	 false,
     99 	 0xff,
    100 	 0xff,
    101 	 false),
    102   /* Standard 24 bit reloc.  */
    103   HOWTO (R_MN10200_24,
    104 	 0,
    105 	 4,
    106 	 24,
    107 	 false,
    108 	 0,
    109 	 complain_overflow_bitfield,
    110 	 bfd_elf_generic_reloc,
    111 	 "R_MN10200_24",
    112 	 false,
    113 	 0xffffff,
    114 	 0xffffff,
    115 	 false),
    116   /* Simple 8 pc-relative reloc.  */
    117   HOWTO (R_MN10200_PCREL8,
    118 	 0,
    119 	 1,
    120 	 8,
    121 	 true,
    122 	 0,
    123 	 complain_overflow_bitfield,
    124 	 bfd_elf_generic_reloc,
    125 	 "R_MN10200_PCREL8",
    126 	 false,
    127 	 0xff,
    128 	 0xff,
    129 	 true),
    130   /* Simple 16 pc-relative reloc.  */
    131   HOWTO (R_MN10200_PCREL16,
    132 	 0,
    133 	 2,
    134 	 16,
    135 	 true,
    136 	 0,
    137 	 complain_overflow_bitfield,
    138 	 bfd_elf_generic_reloc,
    139 	 "R_MN10200_PCREL16",
    140 	 false,
    141 	 0xffff,
    142 	 0xffff,
    143 	 true),
    144   /* Simple 32bit pc-relative reloc with a 1 byte adjustment
    145      to get the pc-relative offset correct.  */
    146   HOWTO (R_MN10200_PCREL24,
    147 	 0,
    148 	 4,
    149 	 24,
    150 	 true,
    151 	 0,
    152 	 complain_overflow_bitfield,
    153 	 bfd_elf_generic_reloc,
    154 	 "R_MN10200_PCREL24",
    155 	 false,
    156 	 0xffffff,
    157 	 0xffffff,
    158 	 true),
    159 };
    160 
    161 struct mn10200_reloc_map
    162 {
    163   bfd_reloc_code_real_type bfd_reloc_val;
    164   unsigned char elf_reloc_val;
    165 };
    166 
    167 static const struct mn10200_reloc_map mn10200_reloc_map[] =
    168 {
    169   { BFD_RELOC_NONE    , R_MN10200_NONE   , },
    170   { BFD_RELOC_32      , R_MN10200_32     , },
    171   { BFD_RELOC_16      , R_MN10200_16     , },
    172   { BFD_RELOC_8       , R_MN10200_8      , },
    173   { BFD_RELOC_24      , R_MN10200_24     , },
    174   { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , },
    175   { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, },
    176   { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, },
    177 };
    178 
    179 static reloc_howto_type *
    180 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    181 				 bfd_reloc_code_real_type code)
    182 {
    183   unsigned int i;
    184 
    185   for (i = 0;
    186        i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map);
    187        i++)
    188     {
    189       if (mn10200_reloc_map[i].bfd_reloc_val == code)
    190 	return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val];
    191     }
    192 
    193   return NULL;
    194 }
    195 
    196 static reloc_howto_type *
    197 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    198 				 const char *r_name)
    199 {
    200   unsigned int i;
    201 
    202   for (i = 0;
    203        i < (sizeof (elf_mn10200_howto_table)
    204 	    / sizeof (elf_mn10200_howto_table[0]));
    205        i++)
    206     if (elf_mn10200_howto_table[i].name != NULL
    207 	&& strcasecmp (elf_mn10200_howto_table[i].name, r_name) == 0)
    208       return &elf_mn10200_howto_table[i];
    209 
    210   return NULL;
    211 }
    212 
    213 /* Set the howto pointer for an MN10200 ELF reloc.  */
    214 
    215 static bool
    216 mn10200_info_to_howto (bfd *abfd,
    217 		       arelent *cache_ptr,
    218 		       Elf_Internal_Rela *dst)
    219 {
    220   unsigned int r_type;
    221 
    222   r_type = ELF32_R_TYPE (dst->r_info);
    223   if (r_type >= (unsigned int) R_MN10200_MAX)
    224     {
    225       /* xgettext:c-format */
    226       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    227 			  abfd, r_type);
    228       bfd_set_error (bfd_error_bad_value);
    229       return false;
    230     }
    231 
    232   cache_ptr->howto = &elf_mn10200_howto_table[r_type];
    233   return cache_ptr->howto != NULL;
    234 }
    235 
    236 /* Perform a relocation as part of a final link.  */
    237 
    238 static bfd_reloc_status_type
    239 mn10200_elf_final_link_relocate (reloc_howto_type *howto,
    240 				 bfd *input_bfd,
    241 				 bfd *output_bfd ATTRIBUTE_UNUSED,
    242 				 asection *input_section,
    243 				 bfd_byte *contents,
    244 				 bfd_vma offset,
    245 				 bfd_vma value,
    246 				 bfd_vma addend,
    247 				 struct bfd_link_info *info ATTRIBUTE_UNUSED,
    248 				 asection *sym_sec ATTRIBUTE_UNUSED,
    249 				 int is_local ATTRIBUTE_UNUSED)
    250 {
    251   unsigned long r_type = howto->type;
    252   bfd_byte *hit_data = contents + offset;
    253 
    254   switch (r_type)
    255     {
    256 
    257     case R_MN10200_NONE:
    258       return bfd_reloc_ok;
    259 
    260     case R_MN10200_32:
    261       value += addend;
    262       bfd_put_32 (input_bfd, value, hit_data);
    263       return bfd_reloc_ok;
    264 
    265     case R_MN10200_16:
    266       value += addend;
    267 
    268       if ((long) value > 0x7fff || (long) value < -0x8000)
    269 	return bfd_reloc_overflow;
    270 
    271       bfd_put_16 (input_bfd, value, hit_data);
    272       return bfd_reloc_ok;
    273 
    274     case R_MN10200_8:
    275       value += addend;
    276 
    277       if ((long) value > 0x7f || (long) value < -0x80)
    278 	return bfd_reloc_overflow;
    279 
    280       bfd_put_8 (input_bfd, value, hit_data);
    281       return bfd_reloc_ok;
    282 
    283     case R_MN10200_24:
    284       value += addend;
    285 
    286       if ((long) value > 0x7fffff || (long) value < -0x800000)
    287 	return bfd_reloc_overflow;
    288 
    289       value &= 0xffffff;
    290       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
    291       bfd_put_32 (input_bfd, value, hit_data);
    292       return bfd_reloc_ok;
    293 
    294     case R_MN10200_PCREL8:
    295       value -= (input_section->output_section->vma
    296 		+ input_section->output_offset);
    297       value -= (offset + 1);
    298       value += addend;
    299 
    300       if ((long) value > 0xff || (long) value < -0x100)
    301 	return bfd_reloc_overflow;
    302 
    303       bfd_put_8 (input_bfd, value, hit_data);
    304       return bfd_reloc_ok;
    305 
    306     case R_MN10200_PCREL16:
    307       value -= (input_section->output_section->vma
    308 		+ input_section->output_offset);
    309       value -= (offset + 2);
    310       value += addend;
    311 
    312       if ((long) value > 0xffff || (long) value < -0x10000)
    313 	return bfd_reloc_overflow;
    314 
    315       bfd_put_16 (input_bfd, value, hit_data);
    316       return bfd_reloc_ok;
    317 
    318     case R_MN10200_PCREL24:
    319       value -= (input_section->output_section->vma
    320 		+ input_section->output_offset);
    321       value -= (offset + 3);
    322       value += addend;
    323 
    324       if ((long) value > 0xffffff || (long) value < -0x1000000)
    325 	return bfd_reloc_overflow;
    326 
    327       value &= 0xffffff;
    328       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
    329       bfd_put_32 (input_bfd, value, hit_data);
    330       return bfd_reloc_ok;
    331 
    332     default:
    333       return bfd_reloc_notsupported;
    334     }
    335 }
    336 
    337 /* Relocate an MN10200 ELF section.  */
    339 static int
    340 mn10200_elf_relocate_section (bfd *output_bfd,
    341 			      struct bfd_link_info *info,
    342 			      bfd *input_bfd,
    343 			      asection *input_section,
    344 			      bfd_byte *contents,
    345 			      Elf_Internal_Rela *relocs,
    346 			      Elf_Internal_Sym *local_syms,
    347 			      asection **local_sections)
    348 {
    349   Elf_Internal_Shdr *symtab_hdr;
    350   struct elf_link_hash_entry **sym_hashes;
    351   Elf_Internal_Rela *rel, *relend;
    352 
    353   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    354   sym_hashes = elf_sym_hashes (input_bfd);
    355 
    356   rel = relocs;
    357   relend = relocs + input_section->reloc_count;
    358   for (; rel < relend; rel++)
    359     {
    360       int r_type;
    361       reloc_howto_type *howto;
    362       unsigned long r_symndx;
    363       Elf_Internal_Sym *sym;
    364       asection *sec;
    365       struct elf_link_hash_entry *h;
    366       bfd_vma relocation;
    367       bfd_reloc_status_type r;
    368 
    369       r_symndx = ELF32_R_SYM (rel->r_info);
    370       r_type = ELF32_R_TYPE (rel->r_info);
    371       howto = elf_mn10200_howto_table + r_type;
    372 
    373       h = NULL;
    374       sym = NULL;
    375       sec = NULL;
    376       if (r_symndx < symtab_hdr->sh_info)
    377 	{
    378 	  sym = local_syms + r_symndx;
    379 	  sec = local_sections[r_symndx];
    380 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
    381 	}
    382       else
    383 	{
    384 	  bool unresolved_reloc, warned, ignored;
    385 
    386 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
    387 				   r_symndx, symtab_hdr, sym_hashes,
    388 				   h, sec, relocation,
    389 				   unresolved_reloc, warned, ignored);
    390 	}
    391 
    392       if (sec != NULL && discarded_section (sec))
    393 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
    394 					 rel, 1, relend, howto, 0, contents);
    395 
    396       if (bfd_link_relocatable (info))
    397 	continue;
    398 
    399       r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
    400 					   input_section,
    401 					   contents, rel->r_offset,
    402 					   relocation, rel->r_addend,
    403 					   info, sec, h == NULL);
    404 
    405       if (r != bfd_reloc_ok)
    406 	{
    407 	  const char *name;
    408 	  const char *msg = (const char *) 0;
    409 
    410 	  if (h != NULL)
    411 	    name = h->root.root.string;
    412 	  else
    413 	    {
    414 	      name = (bfd_elf_string_from_elf_section
    415 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
    416 	      if (name == NULL || *name == '\0')
    417 		name = bfd_section_name (sec);
    418 	    }
    419 
    420 	  switch (r)
    421 	    {
    422 	    case bfd_reloc_overflow:
    423 	      (*info->callbacks->reloc_overflow)
    424 		(info, (h ? &h->root : NULL), name, howto->name,
    425 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
    426 	      break;
    427 
    428 	    case bfd_reloc_undefined:
    429 	      (*info->callbacks->undefined_symbol) (info, name, input_bfd,
    430 						    input_section,
    431 						    rel->r_offset, true);
    432 	      break;
    433 
    434 	    case bfd_reloc_outofrange:
    435 	      msg = _("internal error: out of range error");
    436 	      goto common_error;
    437 
    438 	    case bfd_reloc_notsupported:
    439 	      msg = _("internal error: unsupported relocation error");
    440 	      goto common_error;
    441 
    442 	    case bfd_reloc_dangerous:
    443 	      msg = _("internal error: dangerous error");
    444 	      goto common_error;
    445 
    446 	    default:
    447 	      msg = _("internal error: unknown error");
    448 	      /* fall through */
    449 
    450 	    common_error:
    451 	      (*info->callbacks->warning) (info, msg, name, input_bfd,
    452 					   input_section, rel->r_offset);
    453 	      break;
    454 	    }
    455 	}
    456     }
    457 
    458   return true;
    459 }
    460 
    461 /* Delete some bytes from a section while relaxing.  */
    462 
    463 static bool
    464 mn10200_elf_relax_delete_bytes (bfd *abfd, asection *sec,
    465 				bfd_vma addr, int count)
    466 {
    467   Elf_Internal_Shdr *symtab_hdr;
    468   unsigned int sec_shndx;
    469   bfd_byte *contents;
    470   Elf_Internal_Rela *irel, *irelend;
    471   bfd_vma toaddr;
    472   Elf_Internal_Sym *isym;
    473   Elf_Internal_Sym *isymend;
    474   struct elf_link_hash_entry **sym_hashes;
    475   struct elf_link_hash_entry **end_hashes;
    476   unsigned int symcount;
    477 
    478   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
    479 
    480   contents = elf_section_data (sec)->this_hdr.contents;
    481 
    482   toaddr = sec->size;
    483 
    484   irel = elf_section_data (sec)->relocs;
    485   irelend = irel + sec->reloc_count;
    486 
    487   /* Actually delete the bytes.  */
    488   memmove (contents + addr, contents + addr + count,
    489 	   (size_t) (toaddr - addr - count));
    490   sec->size -= count;
    491 
    492   /* Adjust all the relocs.  */
    493   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
    494     {
    495       /* Get the new reloc address.  */
    496       if ((irel->r_offset > addr
    497 	   && irel->r_offset < toaddr))
    498 	irel->r_offset -= count;
    499     }
    500 
    501   /* Adjust the local symbols defined in this section.  */
    502   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    503   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
    504   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
    505     {
    506       if (isym->st_shndx == sec_shndx
    507 	  && isym->st_value > addr
    508 	  && isym->st_value < toaddr)
    509 	isym->st_value -= count;
    510     }
    511 
    512   /* Now adjust the global symbols defined in this section.  */
    513   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
    514 	      - symtab_hdr->sh_info);
    515   sym_hashes = elf_sym_hashes (abfd);
    516   end_hashes = sym_hashes + symcount;
    517   for (; sym_hashes < end_hashes; sym_hashes++)
    518     {
    519       struct elf_link_hash_entry *sym_hash = *sym_hashes;
    520       if ((sym_hash->root.type == bfd_link_hash_defined
    521 	   || sym_hash->root.type == bfd_link_hash_defweak)
    522 	  && sym_hash->root.u.def.section == sec
    523 	  && sym_hash->root.u.def.value > addr
    524 	  && sym_hash->root.u.def.value < toaddr)
    525 	{
    526 	  sym_hash->root.u.def.value -= count;
    527 	}
    528     }
    529 
    530   return true;
    531 }
    532 
    533 /* This function handles relaxing for the mn10200.
    534 
    535    There are quite a few relaxing opportunities available on the mn10200:
    536 
    537 	* jsr:24 -> jsr:16					   2 bytes
    538 
    539 	* jmp:24 -> jmp:16					   2 bytes
    540 	* jmp:16 -> bra:8					   1 byte
    541 
    542 		* If the previous instruction is a conditional branch
    543 		around the jump/bra, we may be able to reverse its condition
    544 		and change its target to the jump's target.  The jump/bra
    545 		can then be deleted.				   2 bytes
    546 
    547 	* mov abs24 -> mov abs16	2 byte savings
    548 
    549 	* Most instructions which accept imm24 can relax to imm16  2 bytes
    550 	- Most instructions which accept imm16 can relax to imm8   1 byte
    551 
    552 	* Most instructions which accept d24 can relax to d16	   2 bytes
    553 	- Most instructions which accept d16 can relax to d8	   1 byte
    554 
    555 	abs24, imm24, d24 all look the same at the reloc level.  It
    556 	might make the code simpler if we had different relocs for
    557 	the various relaxable operand types.
    558 
    559 	We don't handle imm16->imm8 or d16->d8 as they're very rare
    560 	and somewhat more difficult to support.  */
    561 
    562 static bool
    563 mn10200_elf_relax_section (bfd *abfd,
    564 			   asection *sec,
    565 			   struct bfd_link_info *link_info,
    566 			   bool *again)
    567 {
    568   Elf_Internal_Shdr *symtab_hdr;
    569   Elf_Internal_Rela *internal_relocs;
    570   Elf_Internal_Rela *irel, *irelend;
    571   bfd_byte *contents = NULL;
    572   Elf_Internal_Sym *isymbuf = NULL;
    573 
    574   /* Assume nothing changes.  */
    575   *again = false;
    576 
    577   /* We don't have to do anything for a relocatable link, if
    578      this section does not have relocs, or if this is not a
    579      code section.  */
    580   if (bfd_link_relocatable (link_info)
    581       || sec->reloc_count == 0
    582       || (sec->flags & SEC_RELOC) == 0
    583       || (sec->flags & SEC_HAS_CONTENTS) == 0
    584       || (sec->flags & SEC_CODE) == 0)
    585     return true;
    586 
    587   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    588 
    589   /* Get a copy of the native relocations.  */
    590   internal_relocs = (_bfd_elf_link_read_relocs
    591 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
    592 		      link_info->keep_memory));
    593   if (internal_relocs == NULL)
    594     goto error_return;
    595 
    596   /* Walk through them looking for relaxing opportunities.  */
    597   irelend = internal_relocs + sec->reloc_count;
    598   for (irel = internal_relocs; irel < irelend; irel++)
    599     {
    600       bfd_vma symval;
    601 
    602       /* If this isn't something that can be relaxed, then ignore
    603 	 this reloc.  */
    604       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
    605 	  || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
    606 	  || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
    607 	continue;
    608 
    609       /* Get the section contents if we haven't done so already.  */
    610       if (contents == NULL)
    611 	{
    612 	  /* Get cached copy if it exists.  */
    613 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
    614 	    contents = elf_section_data (sec)->this_hdr.contents;
    615 	  else
    616 	    {
    617 	      /* Go get them off disk.  */
    618 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
    619 		goto error_return;
    620 	    }
    621 	}
    622 
    623       /* Read this BFD's local symbols if we haven't done so already.  */
    624       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
    625 	{
    626 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
    627 	  if (isymbuf == NULL)
    628 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
    629 					    symtab_hdr->sh_info, 0,
    630 					    NULL, NULL, NULL);
    631 	  if (isymbuf == NULL)
    632 	    goto error_return;
    633 	}
    634 
    635       /* Get the value of the symbol referred to by the reloc.  */
    636       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
    637 	{
    638 	  /* A local symbol.  */
    639 	  Elf_Internal_Sym *isym;
    640 	  asection *sym_sec;
    641 
    642 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
    643 	  if (isym->st_shndx == SHN_UNDEF)
    644 	    sym_sec = bfd_und_section_ptr;
    645 	  else if (isym->st_shndx == SHN_ABS)
    646 	    sym_sec = bfd_abs_section_ptr;
    647 	  else if (isym->st_shndx == SHN_COMMON)
    648 	    sym_sec = bfd_com_section_ptr;
    649 	  else
    650 	    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
    651 	  symval = (isym->st_value
    652 		    + sym_sec->output_section->vma
    653 		    + sym_sec->output_offset);
    654 	}
    655       else
    656 	{
    657 	  unsigned long indx;
    658 	  struct elf_link_hash_entry *h;
    659 
    660 	  /* An external symbol.  */
    661 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
    662 	  h = elf_sym_hashes (abfd)[indx];
    663 	  BFD_ASSERT (h != NULL);
    664 	  if (h->root.type != bfd_link_hash_defined
    665 	      && h->root.type != bfd_link_hash_defweak)
    666 	    {
    667 	      /* This appears to be a reference to an undefined
    668 		 symbol.  Just ignore it--it will be caught by the
    669 		 regular reloc processing.  */
    670 	      continue;
    671 	    }
    672 
    673 	  symval = (h->root.u.def.value
    674 		    + h->root.u.def.section->output_section->vma
    675 		    + h->root.u.def.section->output_offset);
    676 	}
    677 
    678       /* For simplicity of coding, we are going to modify the section
    679 	 contents, the section relocs, and the BFD symbol table.  We
    680 	 must tell the rest of the code not to free up this
    681 	 information.  It would be possible to instead create a table
    682 	 of changes which have to be made, as is done in coff-mips.c;
    683 	 that would be more work, but would require less memory when
    684 	 the linker is run.  */
    685 
    686       /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
    687 	 branch/call.  */
    688       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
    689 	{
    690 	  bfd_vma value = symval;
    691 
    692 	  /* Deal with pc-relative gunk.  */
    693 	  value -= (sec->output_section->vma + sec->output_offset);
    694 	  value -= (irel->r_offset + 3);
    695 	  value += irel->r_addend;
    696 
    697 	  /* See if the value will fit in 16 bits, note the high value is
    698 	     0x7fff + 2 as the target will be two bytes closer if we are
    699 	     able to relax.  */
    700 	  if ((long) value < 0x8001 && (long) value > -0x8000)
    701 	    {
    702 	      unsigned char code;
    703 
    704 	      /* Get the opcode.  */
    705 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
    706 
    707 	      if (code != 0xe0 && code != 0xe1)
    708 		continue;
    709 
    710 	      /* Note that we've changed the relocs, section contents, etc.  */
    711 	      elf_section_data (sec)->relocs = internal_relocs;
    712 	      elf_section_data (sec)->this_hdr.contents = contents;
    713 	      symtab_hdr->contents = (unsigned char *) isymbuf;
    714 
    715 	      /* Fix the opcode.  */
    716 	      if (code == 0xe0)
    717 		bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
    718 	      else if (code == 0xe1)
    719 		bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
    720 
    721 	      /* Fix the relocation's type.  */
    722 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    723 					   R_MN10200_PCREL16);
    724 
    725 	      /* The opcode got shorter too, so we have to fix the offset.  */
    726 	      irel->r_offset -= 1;
    727 
    728 	      /* Delete two bytes of data.  */
    729 	      if (!mn10200_elf_relax_delete_bytes (abfd, sec,
    730 						   irel->r_offset + 1, 2))
    731 		goto error_return;
    732 
    733 	      /* That will change things, so, we should relax again.
    734 		 Note that this is not required, and it may be slow.  */
    735 	      *again = true;
    736 	    }
    737 	}
    738 
    739       /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
    740 	 branch.  */
    741       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
    742 	{
    743 	  bfd_vma value = symval;
    744 
    745 	  /* Deal with pc-relative gunk.  */
    746 	  value -= (sec->output_section->vma + sec->output_offset);
    747 	  value -= (irel->r_offset + 2);
    748 	  value += irel->r_addend;
    749 
    750 	  /* See if the value will fit in 8 bits, note the high value is
    751 	     0x7f + 1 as the target will be one bytes closer if we are
    752 	     able to relax.  */
    753 	  if ((long) value < 0x80 && (long) value > -0x80)
    754 	    {
    755 	      unsigned char code;
    756 
    757 	      /* Get the opcode.  */
    758 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
    759 
    760 	      if (code != 0xfc)
    761 		continue;
    762 
    763 	      /* Note that we've changed the relocs, section contents, etc.  */
    764 	      elf_section_data (sec)->relocs = internal_relocs;
    765 	      elf_section_data (sec)->this_hdr.contents = contents;
    766 	      symtab_hdr->contents = (unsigned char *) isymbuf;
    767 
    768 	      /* Fix the opcode.  */
    769 	      bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
    770 
    771 	      /* Fix the relocation's type.  */
    772 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    773 					   R_MN10200_PCREL8);
    774 
    775 	      /* Delete one byte of data.  */
    776 	      if (!mn10200_elf_relax_delete_bytes (abfd, sec,
    777 						   irel->r_offset + 1, 1))
    778 		goto error_return;
    779 
    780 	      /* That will change things, so, we should relax again.
    781 		 Note that this is not required, and it may be slow.  */
    782 	      *again = true;
    783 	    }
    784 	}
    785 
    786       /* Try to eliminate an unconditional 8 bit pc-relative branch
    787 	 which immediately follows a conditional 8 bit pc-relative
    788 	 branch around the unconditional branch.
    789 
    790 	    original:		new:
    791 	    bCC lab1		bCC' lab2
    792 	    bra lab2
    793 	   lab1:	       lab1:
    794 
    795 	 This happens when the bCC can't reach lab2 at assembly time,
    796 	 but due to other relaxations it can reach at link time.  */
    797       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
    798 	{
    799 	  Elf_Internal_Rela *nrel;
    800 	  unsigned char code;
    801 
    802 	  /* Do nothing if this reloc is the last byte in the section.  */
    803 	  if (irel->r_offset == sec->size)
    804 	    continue;
    805 
    806 	  /* See if the next instruction is an unconditional pc-relative
    807 	     branch, more often than not this test will fail, so we
    808 	     test it first to speed things up.  */
    809 	  code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
    810 	  if (code != 0xea)
    811 	    continue;
    812 
    813 	  /* Also make sure the next relocation applies to the next
    814 	     instruction and that it's a pc-relative 8 bit branch.  */
    815 	  nrel = irel + 1;
    816 	  if (nrel == irelend
    817 	      || irel->r_offset + 2 != nrel->r_offset
    818 	      || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8)
    819 	    continue;
    820 
    821 	  /* Make sure our destination immediately follows the
    822 	     unconditional branch.  */
    823 	  if (symval != (sec->output_section->vma + sec->output_offset
    824 			 + irel->r_offset + 3))
    825 	    continue;
    826 
    827 	  /* Now make sure we are a conditional branch.  This may not
    828 	     be necessary, but why take the chance.
    829 
    830 	     Note these checks assume that R_MN10200_PCREL8 relocs
    831 	     only occur on bCC and bCCx insns.  If they occured
    832 	     elsewhere, we'd need to know the start of this insn
    833 	     for this check to be accurate.  */
    834 	  code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
    835 	  if (code != 0xe0 && code != 0xe1 && code != 0xe2
    836 	      && code != 0xe3 && code != 0xe4 && code != 0xe5
    837 	      && code != 0xe6 && code != 0xe7 && code != 0xe8
    838 	      && code != 0xe9 && code != 0xec && code != 0xed
    839 	      && code != 0xee && code != 0xef && code != 0xfc
    840 	      && code != 0xfd && code != 0xfe && code != 0xff)
    841 	    continue;
    842 
    843 	  /* We also have to be sure there is no symbol/label
    844 	     at the unconditional branch.  */
    845 	  if (mn10200_elf_symbol_address_p (abfd, sec, isymbuf,
    846 					    irel->r_offset + 1))
    847 	    continue;
    848 
    849 	  /* Note that we've changed the relocs, section contents, etc.  */
    850 	  elf_section_data (sec)->relocs = internal_relocs;
    851 	  elf_section_data (sec)->this_hdr.contents = contents;
    852 	  symtab_hdr->contents = (unsigned char *) isymbuf;
    853 
    854 	  /* Reverse the condition of the first branch.  */
    855 	  switch (code)
    856 	    {
    857 	    case 0xfc:
    858 	      code = 0xfd;
    859 	      break;
    860 	    case 0xfd:
    861 	      code = 0xfc;
    862 	      break;
    863 	    case 0xfe:
    864 	      code = 0xff;
    865 	      break;
    866 	    case 0xff:
    867 	      code = 0xfe;
    868 	      break;
    869 	    case 0xe8:
    870 	      code = 0xe9;
    871 	      break;
    872 	    case 0xe9:
    873 	      code = 0xe8;
    874 	      break;
    875 	    case 0xe0:
    876 	      code = 0xe2;
    877 	      break;
    878 	    case 0xe2:
    879 	      code = 0xe0;
    880 	      break;
    881 	    case 0xe3:
    882 	      code = 0xe1;
    883 	      break;
    884 	    case 0xe1:
    885 	      code = 0xe3;
    886 	      break;
    887 	    case 0xe4:
    888 	      code = 0xe6;
    889 	      break;
    890 	    case 0xe6:
    891 	      code = 0xe4;
    892 	      break;
    893 	    case 0xe7:
    894 	      code = 0xe5;
    895 	      break;
    896 	    case 0xe5:
    897 	      code = 0xe7;
    898 	      break;
    899 	    case 0xec:
    900 	      code = 0xed;
    901 	      break;
    902 	    case 0xed:
    903 	      code = 0xec;
    904 	      break;
    905 	    case 0xee:
    906 	      code = 0xef;
    907 	      break;
    908 	    case 0xef:
    909 	      code = 0xee;
    910 	      break;
    911 	    }
    912 	  bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
    913 
    914 	  /* Set the reloc type and symbol for the first branch
    915 	     from the second branch.  */
    916 	  irel->r_info = nrel->r_info;
    917 
    918 	  /* Make the reloc for the second branch a null reloc.  */
    919 	  nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
    920 				       R_MN10200_NONE);
    921 
    922 	  /* Delete two bytes of data.  */
    923 	  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
    924 					       irel->r_offset + 1, 2))
    925 	    goto error_return;
    926 
    927 	  /* That will change things, so, we should relax again.
    928 	     Note that this is not required, and it may be slow.  */
    929 	  *again = true;
    930 	}
    931 
    932       /* Try to turn a 24bit immediate, displacement or absolute address
    933 	 into a 16bit immediate, displacement or absolute address.  */
    934       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24)
    935 	{
    936 	  bfd_vma value = symval;
    937 
    938 	  /* See if the value will fit in 16 bits.
    939 	     We allow any 16bit match here.  We prune those we can't
    940 	     handle below.  */
    941 	  if ((long) value < 0x7fff && (long) value > -0x8000)
    942 	    {
    943 	      unsigned char code;
    944 
    945 	      /* All insns which have 24bit operands are 5 bytes long,
    946 		 the first byte will always be 0xf4, but we double check
    947 		 it just in case.  */
    948 
    949 	      /* Get the first opcode.  */
    950 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
    951 
    952 	      if (code != 0xf4)
    953 		continue;
    954 
    955 	      /* Get the second opcode.  */
    956 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
    957 
    958 	      switch (code & 0xfc)
    959 		{
    960 		/* mov imm24,dn -> mov imm16,dn */
    961 		case 0x70:
    962 		  /* Not safe if the high bit is on as relaxing may
    963 		     move the value out of high mem and thus not fit
    964 		     in a signed 16bit value.  */
    965 		  if (value & 0x8000)
    966 		    continue;
    967 
    968 		  /* Note that we've changed the relocation contents, etc.  */
    969 		  elf_section_data (sec)->relocs = internal_relocs;
    970 		  elf_section_data (sec)->this_hdr.contents = contents;
    971 		  symtab_hdr->contents = (unsigned char *) isymbuf;
    972 
    973 		  /* Fix the opcode.  */
    974 		  bfd_put_8 (abfd, 0xf8 + (code & 0x03),
    975 			     contents + irel->r_offset - 2);
    976 
    977 		  /* Fix the relocation's type.  */
    978 		  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
    979 					       R_MN10200_16);
    980 
    981 		  /* The opcode got shorter too, so we have to fix the
    982 		     offset.  */
    983 		  irel->r_offset -= 1;
    984 
    985 		  /* Delete two bytes of data.  */
    986 		  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
    987 						       irel->r_offset + 1, 2))
    988 		    goto error_return;
    989 
    990 		  /* That will change things, so, we should relax again.
    991 		     Note that this is not required, and it may be slow.  */
    992 		  *again = true;
    993 		  break;
    994 
    995 		/* mov imm24,an -> mov imm16,an
    996 		   cmp imm24,an -> cmp imm16,an
    997 		   mov (abs24),dn -> mov (abs16),dn
    998 		   mov dn,(abs24) -> mov dn,(abs16)
    999 		   movb dn,(abs24) -> movb dn,(abs16)
   1000 		   movbu (abs24),dn -> movbu (abs16),dn */
   1001 		case 0x74:
   1002 		case 0x7c:
   1003 		case 0xc0:
   1004 		case 0x40:
   1005 		case 0x44:
   1006 		case 0xc8:
   1007 		  /* Note that we've changed the relocation contents, etc.  */
   1008 		  elf_section_data (sec)->relocs = internal_relocs;
   1009 		  elf_section_data (sec)->this_hdr.contents = contents;
   1010 		  symtab_hdr->contents = (unsigned char *) isymbuf;
   1011 
   1012 		  if ((code & 0xfc) == 0x74)
   1013 		    code = 0xdc + (code & 0x03);
   1014 		  else if ((code & 0xfc) == 0x7c)
   1015 		    code = 0xec + (code & 0x03);
   1016 		  else if ((code & 0xfc) == 0xc0)
   1017 		    code = 0xc8 + (code & 0x03);
   1018 		  else if ((code & 0xfc) == 0x40)
   1019 		    code = 0xc0 + (code & 0x03);
   1020 		  else if ((code & 0xfc) == 0x44)
   1021 		    code = 0xc4 + (code & 0x03);
   1022 		  else if ((code & 0xfc) == 0xc8)
   1023 		    code = 0xcc + (code & 0x03);
   1024 
   1025 		  /* Fix the opcode.  */
   1026 		  bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
   1027 
   1028 		  /* Fix the relocation's type.  */
   1029 		  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1030 					       R_MN10200_16);
   1031 
   1032 		  /* The opcode got shorter too, so we have to fix the
   1033 		     offset.  */
   1034 		  irel->r_offset -= 1;
   1035 
   1036 		  /* Delete two bytes of data.  */
   1037 		  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
   1038 						       irel->r_offset + 1, 2))
   1039 		    goto error_return;
   1040 
   1041 		  /* That will change things, so, we should relax again.
   1042 		     Note that this is not required, and it may be slow.  */
   1043 		  *again = true;
   1044 		  break;
   1045 
   1046 		/* cmp imm24,dn -> cmp imm16,dn
   1047 		   mov (abs24),an -> mov (abs16),an
   1048 		   mov an,(abs24) -> mov an,(abs16)
   1049 		   add imm24,dn -> add imm16,dn
   1050 		   add imm24,an -> add imm16,an
   1051 		   sub imm24,dn -> sub imm16,dn
   1052 		   sub imm24,an -> sub imm16,an
   1053 		   And all d24->d16 in memory ops.  */
   1054 		case 0x78:
   1055 		case 0xd0:
   1056 		case 0x50:
   1057 		case 0x60:
   1058 		case 0x64:
   1059 		case 0x68:
   1060 		case 0x6c:
   1061 		case 0x80:
   1062 		case 0xf0:
   1063 		case 0x00:
   1064 		case 0x10:
   1065 		case 0xb0:
   1066 		case 0x30:
   1067 		case 0xa0:
   1068 		case 0x20:
   1069 		case 0x90:
   1070 		  /* Not safe if the high bit is on as relaxing may
   1071 		     move the value out of high mem and thus not fit
   1072 		     in a signed 16bit value.  */
   1073 		  if (((code & 0xfc) == 0x78
   1074 		       || (code & 0xfc) == 0x60
   1075 		       || (code & 0xfc) == 0x64
   1076 		       || (code & 0xfc) == 0x68
   1077 		       || (code & 0xfc) == 0x6c
   1078 		       || (code & 0xfc) == 0x80
   1079 		       || (code & 0xfc) == 0xf0
   1080 		       || (code & 0xfc) == 0x00
   1081 		       || (code & 0xfc) == 0x10
   1082 		       || (code & 0xfc) == 0xb0
   1083 		       || (code & 0xfc) == 0x30
   1084 		       || (code & 0xfc) == 0xa0
   1085 		       || (code & 0xfc) == 0x20
   1086 		       || (code & 0xfc) == 0x90)
   1087 		      && (value & 0x8000) != 0)
   1088 		    continue;
   1089 
   1090 		  /* Note that we've changed the relocation contents, etc.  */
   1091 		  elf_section_data (sec)->relocs = internal_relocs;
   1092 		  elf_section_data (sec)->this_hdr.contents = contents;
   1093 		  symtab_hdr->contents = (unsigned char *) isymbuf;
   1094 
   1095 		  /* Fix the opcode.  */
   1096 		  bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2);
   1097 
   1098 		  if ((code & 0xfc) == 0x78)
   1099 		    code = 0x48 + (code & 0x03);
   1100 		  else if ((code & 0xfc) == 0xd0)
   1101 		    code = 0x30 + (code & 0x03);
   1102 		  else if ((code & 0xfc) == 0x50)
   1103 		    code = 0x20 + (code & 0x03);
   1104 		  else if ((code & 0xfc) == 0x60)
   1105 		    code = 0x18 + (code & 0x03);
   1106 		  else if ((code & 0xfc) == 0x64)
   1107 		    code = 0x08 + (code & 0x03);
   1108 		  else if ((code & 0xfc) == 0x68)
   1109 		    code = 0x1c + (code & 0x03);
   1110 		  else if ((code & 0xfc) == 0x6c)
   1111 		    code = 0x0c + (code & 0x03);
   1112 		  else if ((code & 0xfc) == 0x80)
   1113 		    code = 0xc0 + (code & 0x07);
   1114 		  else if ((code & 0xfc) == 0xf0)
   1115 		    code = 0xb0 + (code & 0x07);
   1116 		  else if ((code & 0xfc) == 0x00)
   1117 		    code = 0x80 + (code & 0x07);
   1118 		  else if ((code & 0xfc) == 0x10)
   1119 		    code = 0xa0 + (code & 0x07);
   1120 		  else if ((code & 0xfc) == 0xb0)
   1121 		    code = 0x70 + (code & 0x07);
   1122 		  else if ((code & 0xfc) == 0x30)
   1123 		    code = 0x60 + (code & 0x07);
   1124 		  else if ((code & 0xfc) == 0xa0)
   1125 		    code = 0xd0 + (code & 0x07);
   1126 		  else if ((code & 0xfc) == 0x20)
   1127 		    code = 0x90 + (code & 0x07);
   1128 		  else if ((code & 0xfc) == 0x90)
   1129 		    code = 0x50 + (code & 0x07);
   1130 
   1131 		  bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
   1132 
   1133 		  /* Fix the relocation's type.  */
   1134 		  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1135 					       R_MN10200_16);
   1136 
   1137 		  /* Delete one bytes of data.  */
   1138 		  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
   1139 						       irel->r_offset + 2, 1))
   1140 		    goto error_return;
   1141 
   1142 		  /* That will change things, so, we should relax again.
   1143 		     Note that this is not required, and it may be slow.  */
   1144 		  *again = true;
   1145 		  break;
   1146 
   1147 		/* movb (abs24),dn ->movbu (abs16),dn extxb bn */
   1148 		case 0xc4:
   1149 		  /* Note that we've changed the reldection contents, etc.  */
   1150 		  elf_section_data (sec)->relocs = internal_relocs;
   1151 		  elf_section_data (sec)->this_hdr.contents = contents;
   1152 		  symtab_hdr->contents = (unsigned char *) isymbuf;
   1153 
   1154 		  bfd_put_8 (abfd, 0xcc + (code & 0x03),
   1155 			     contents + irel->r_offset - 2);
   1156 
   1157 		  bfd_put_8 (abfd, 0xb8 + (code & 0x03),
   1158 			     contents + irel->r_offset - 1);
   1159 
   1160 		  /* Fix the relocation's type.  */
   1161 		  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
   1162 					       R_MN10200_16);
   1163 
   1164 		  /* The reloc will be applied one byte in front of its
   1165 		     current location.  */
   1166 		  irel->r_offset -= 1;
   1167 
   1168 		  /* Delete one bytes of data.  */
   1169 		  if (!mn10200_elf_relax_delete_bytes (abfd, sec,
   1170 						       irel->r_offset + 2, 1))
   1171 		    goto error_return;
   1172 
   1173 		  /* That will change things, so, we should relax again.
   1174 		     Note that this is not required, and it may be slow.  */
   1175 		  *again = true;
   1176 		  break;
   1177 		}
   1178 	    }
   1179 	}
   1180     }
   1181 
   1182   if (isymbuf != NULL
   1183       && symtab_hdr->contents != (unsigned char *) isymbuf)
   1184     {
   1185       if (! link_info->keep_memory)
   1186 	free (isymbuf);
   1187       else
   1188 	{
   1189 	  /* Cache the symbols for elf_link_input_bfd.  */
   1190 	  symtab_hdr->contents = (unsigned char *) isymbuf;
   1191 	}
   1192     }
   1193 
   1194   if (contents != NULL
   1195       && elf_section_data (sec)->this_hdr.contents != contents)
   1196     {
   1197       if (! link_info->keep_memory)
   1198 	free (contents);
   1199       else
   1200 	{
   1201 	  /* Cache the section contents for elf_link_input_bfd.  */
   1202 	  elf_section_data (sec)->this_hdr.contents = contents;
   1203 	}
   1204     }
   1205 
   1206   if (elf_section_data (sec)->relocs != internal_relocs)
   1207     free (internal_relocs);
   1208 
   1209   return true;
   1210 
   1211  error_return:
   1212   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1213     free (isymbuf);
   1214   if (elf_section_data (sec)->this_hdr.contents != contents)
   1215     free (contents);
   1216   if (elf_section_data (sec)->relocs != internal_relocs)
   1217     free (internal_relocs);
   1218 
   1219   return false;
   1220 }
   1221 
   1222 /* Return TRUE if a symbol exists at the given address, else return
   1223    FALSE.  */
   1224 static bool
   1225 mn10200_elf_symbol_address_p (bfd *abfd,
   1226 			      asection *sec,
   1227 			      Elf_Internal_Sym *isym,
   1228 			      bfd_vma addr)
   1229 {
   1230   Elf_Internal_Shdr *symtab_hdr;
   1231   unsigned int sec_shndx;
   1232   Elf_Internal_Sym *isymend;
   1233   struct elf_link_hash_entry **sym_hashes;
   1234   struct elf_link_hash_entry **end_hashes;
   1235   unsigned int symcount;
   1236 
   1237   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
   1238 
   1239   /* Examine all the local symbols.  */
   1240   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1241   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
   1242     {
   1243       if (isym->st_shndx == sec_shndx
   1244 	  && isym->st_value == addr)
   1245 	return true;
   1246     }
   1247 
   1248   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
   1249 	      - symtab_hdr->sh_info);
   1250   sym_hashes = elf_sym_hashes (abfd);
   1251   end_hashes = sym_hashes + symcount;
   1252   for (; sym_hashes < end_hashes; sym_hashes++)
   1253     {
   1254       struct elf_link_hash_entry *sym_hash = *sym_hashes;
   1255       if ((sym_hash->root.type == bfd_link_hash_defined
   1256 	   || sym_hash->root.type == bfd_link_hash_defweak)
   1257 	  && sym_hash->root.u.def.section == sec
   1258 	  && sym_hash->root.u.def.value == addr)
   1259 	return true;
   1260     }
   1261 
   1262   return false;
   1263 }
   1264 
   1265 /* This is a version of bfd_generic_get_relocated_section_contents
   1266    which uses mn10200_elf_relocate_section.  */
   1267 
   1268 static bfd_byte *
   1269 mn10200_elf_get_relocated_section_contents (bfd *output_bfd,
   1270 					    struct bfd_link_info *link_info,
   1271 					    struct bfd_link_order *link_order,
   1272 					    bfd_byte *data,
   1273 					    bool relocatable,
   1274 					    asymbol **symbols)
   1275 {
   1276   Elf_Internal_Shdr *symtab_hdr;
   1277   asection *input_section = link_order->u.indirect.section;
   1278   bfd *input_bfd = input_section->owner;
   1279   asection **sections = NULL;
   1280   Elf_Internal_Rela *internal_relocs = NULL;
   1281   Elf_Internal_Sym *isymbuf = NULL;
   1282 
   1283   /* We only need to handle the case of relaxing, or of having a
   1284      particular set of section contents, specially.  */
   1285   if (relocatable
   1286       || elf_section_data (input_section)->this_hdr.contents == NULL)
   1287     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
   1288 						       link_order, data,
   1289 						       relocatable,
   1290 						       symbols);
   1291 
   1292   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1293 
   1294   bfd_byte *orig_data = data;
   1295   if (data == NULL)
   1296     {
   1297       data = bfd_malloc (input_section->size);
   1298       if (data == NULL)
   1299 	return NULL;
   1300     }
   1301   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
   1302 	  (size_t) input_section->size);
   1303 
   1304   if ((input_section->flags & SEC_RELOC) != 0
   1305       && input_section->reloc_count > 0)
   1306     {
   1307       Elf_Internal_Sym *isym;
   1308       Elf_Internal_Sym *isymend;
   1309       asection **secpp;
   1310       bfd_size_type amt;
   1311 
   1312       internal_relocs = (_bfd_elf_link_read_relocs
   1313 			 (input_bfd, input_section, NULL,
   1314 			  (Elf_Internal_Rela *) NULL, false));
   1315       if (internal_relocs == NULL)
   1316 	goto error_return;
   1317 
   1318       if (symtab_hdr->sh_info != 0)
   1319 	{
   1320 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   1321 	  if (isymbuf == NULL)
   1322 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
   1323 					    symtab_hdr->sh_info, 0,
   1324 					    NULL, NULL, NULL);
   1325 	  if (isymbuf == NULL)
   1326 	    goto error_return;
   1327 	}
   1328 
   1329       amt = symtab_hdr->sh_info;
   1330       amt *= sizeof (asection *);
   1331       sections = (asection **) bfd_malloc (amt);
   1332       if (sections == NULL && amt != 0)
   1333 	goto error_return;
   1334 
   1335       isymend = isymbuf + symtab_hdr->sh_info;
   1336       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
   1337 	{
   1338 	  asection *isec;
   1339 
   1340 	  if (isym->st_shndx == SHN_UNDEF)
   1341 	    isec = bfd_und_section_ptr;
   1342 	  else if (isym->st_shndx == SHN_ABS)
   1343 	    isec = bfd_abs_section_ptr;
   1344 	  else if (isym->st_shndx == SHN_COMMON)
   1345 	    isec = bfd_com_section_ptr;
   1346 	  else
   1347 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
   1348 
   1349 	  *secpp = isec;
   1350 	}
   1351 
   1352       if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
   1353 				     input_section, data, internal_relocs,
   1354 				     isymbuf, sections))
   1355 	goto error_return;
   1356 
   1357       free (sections);
   1358       if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1359 	free (isymbuf);
   1360       if (elf_section_data (input_section)->relocs != internal_relocs)
   1361 	free (internal_relocs);
   1362     }
   1363 
   1364   return data;
   1365 
   1366  error_return:
   1367   free (sections);
   1368   if (symtab_hdr->contents != (unsigned char *) isymbuf)
   1369     free (isymbuf);
   1370   if (elf_section_data (input_section)->relocs != internal_relocs)
   1371     free (internal_relocs);
   1372   if (orig_data == NULL)
   1373     free (data);
   1374   return NULL;
   1375 }
   1376 
   1377 #define TARGET_LITTLE_SYM	mn10200_elf32_vec
   1378 #define TARGET_LITTLE_NAME	"elf32-mn10200"
   1379 #define ELF_ARCH		bfd_arch_mn10200
   1380 #define ELF_MACHINE_CODE	EM_MN10200
   1381 #define ELF_MACHINE_ALT1	EM_CYGNUS_MN10200
   1382 #define ELF_MAXPAGESIZE		0x1000
   1383 
   1384 #define elf_backend_rela_normal 1
   1385 #define elf_info_to_howto	mn10200_info_to_howto
   1386 #define elf_info_to_howto_rel	NULL
   1387 #define elf_backend_relocate_section mn10200_elf_relocate_section
   1388 #define bfd_elf32_bfd_relax_section	mn10200_elf_relax_section
   1389 #define bfd_elf32_bfd_get_relocated_section_contents \
   1390 				mn10200_elf_get_relocated_section_contents
   1391 
   1392 #define elf_symbol_leading_char '_'
   1393 
   1394 #include "elf32-target.h"
   1395