1 /* Matsushita 10200 specific support for 32-bit ELF
2    Copyright (C) 1996-2014 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 bfd_boolean
27 mn10200_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int);
28 static bfd_boolean
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 	 2,
50 	 16,
51 	 FALSE,
52 	 0,
53 	 complain_overflow_bitfield,
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 	 2,
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 	 1,
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 	 0,
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 	 2,
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 	 0,
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 	 1,
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 	 2,
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 *
bfd_elf32_bfd_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)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 *
bfd_elf32_bfd_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)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 void
mn10200_info_to_howto(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)216 mn10200_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
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   BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX);
224   cache_ptr->howto = &elf_mn10200_howto_table[r_type];
225 }
226 
227 /* Perform a relocation as part of a final link.  */
228 
229 static bfd_reloc_status_type
mn10200_elf_final_link_relocate(reloc_howto_type * howto,bfd * input_bfd,bfd * output_bfd ATTRIBUTE_UNUSED,asection * input_section,bfd_byte * contents,bfd_vma offset,bfd_vma value,bfd_vma addend,struct bfd_link_info * info ATTRIBUTE_UNUSED,asection * sym_sec ATTRIBUTE_UNUSED,int is_local ATTRIBUTE_UNUSED)230 mn10200_elf_final_link_relocate (reloc_howto_type *howto,
231 				 bfd *input_bfd,
232 				 bfd *output_bfd ATTRIBUTE_UNUSED,
233 				 asection *input_section,
234 				 bfd_byte *contents,
235 				 bfd_vma offset,
236 				 bfd_vma value,
237 				 bfd_vma addend,
238 				 struct bfd_link_info *info ATTRIBUTE_UNUSED,
239 				 asection *sym_sec ATTRIBUTE_UNUSED,
240 				 int is_local ATTRIBUTE_UNUSED)
241 {
242   unsigned long r_type = howto->type;
243   bfd_byte *hit_data = contents + offset;
244 
245   switch (r_type)
246     {
247 
248     case R_MN10200_NONE:
249       return bfd_reloc_ok;
250 
251     case R_MN10200_32:
252       value += addend;
253       bfd_put_32 (input_bfd, value, hit_data);
254       return bfd_reloc_ok;
255 
256     case R_MN10200_16:
257       value += addend;
258 
259       if ((long) value > 0x7fff || (long) value < -0x8000)
260 	return bfd_reloc_overflow;
261 
262       bfd_put_16 (input_bfd, value, hit_data);
263       return bfd_reloc_ok;
264 
265     case R_MN10200_8:
266       value += addend;
267 
268       if ((long) value > 0x7f || (long) value < -0x80)
269 	return bfd_reloc_overflow;
270 
271       bfd_put_8 (input_bfd, value, hit_data);
272       return bfd_reloc_ok;
273 
274     case R_MN10200_24:
275       value += addend;
276 
277       if ((long) value > 0x7fffff || (long) value < -0x800000)
278 	return bfd_reloc_overflow;
279 
280       value &= 0xffffff;
281       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
282       bfd_put_32 (input_bfd, value, hit_data);
283       return bfd_reloc_ok;
284 
285     case R_MN10200_PCREL8:
286       value -= (input_section->output_section->vma
287 		+ input_section->output_offset);
288       value -= (offset + 1);
289       value += addend;
290 
291       if ((long) value > 0xff || (long) value < -0x100)
292 	return bfd_reloc_overflow;
293 
294       bfd_put_8 (input_bfd, value, hit_data);
295       return bfd_reloc_ok;
296 
297     case R_MN10200_PCREL16:
298       value -= (input_section->output_section->vma
299 		+ input_section->output_offset);
300       value -= (offset + 2);
301       value += addend;
302 
303       if ((long) value > 0xffff || (long) value < -0x10000)
304 	return bfd_reloc_overflow;
305 
306       bfd_put_16 (input_bfd, value, hit_data);
307       return bfd_reloc_ok;
308 
309     case R_MN10200_PCREL24:
310       value -= (input_section->output_section->vma
311 		+ input_section->output_offset);
312       value -= (offset + 3);
313       value += addend;
314 
315       if ((long) value > 0xffffff || (long) value < -0x1000000)
316 	return bfd_reloc_overflow;
317 
318       value &= 0xffffff;
319       value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
320       bfd_put_32 (input_bfd, value, hit_data);
321       return bfd_reloc_ok;
322 
323     default:
324       return bfd_reloc_notsupported;
325     }
326 }
327 
328 /* Relocate an MN10200 ELF section.  */
329 static bfd_boolean
mn10200_elf_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)330 mn10200_elf_relocate_section (bfd *output_bfd,
331 			      struct bfd_link_info *info,
332 			      bfd *input_bfd,
333 			      asection *input_section,
334 			      bfd_byte *contents,
335 			      Elf_Internal_Rela *relocs,
336 			      Elf_Internal_Sym *local_syms,
337 			      asection **local_sections)
338 {
339   Elf_Internal_Shdr *symtab_hdr;
340   struct elf_link_hash_entry **sym_hashes;
341   Elf_Internal_Rela *rel, *relend;
342 
343   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
344   sym_hashes = elf_sym_hashes (input_bfd);
345 
346   rel = relocs;
347   relend = relocs + input_section->reloc_count;
348   for (; rel < relend; rel++)
349     {
350       int r_type;
351       reloc_howto_type *howto;
352       unsigned long r_symndx;
353       Elf_Internal_Sym *sym;
354       asection *sec;
355       struct elf_link_hash_entry *h;
356       bfd_vma relocation;
357       bfd_reloc_status_type r;
358 
359       r_symndx = ELF32_R_SYM (rel->r_info);
360       r_type = ELF32_R_TYPE (rel->r_info);
361       howto = elf_mn10200_howto_table + r_type;
362 
363       h = NULL;
364       sym = NULL;
365       sec = NULL;
366       if (r_symndx < symtab_hdr->sh_info)
367 	{
368 	  sym = local_syms + r_symndx;
369 	  sec = local_sections[r_symndx];
370 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
371 	}
372       else
373 	{
374 	  bfd_boolean unresolved_reloc, warned, ignored;
375 
376 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
377 				   r_symndx, symtab_hdr, sym_hashes,
378 				   h, sec, relocation,
379 				   unresolved_reloc, warned, ignored);
380 	}
381 
382       if (sec != NULL && discarded_section (sec))
383 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
384 					 rel, 1, relend, howto, 0, contents);
385 
386       if (info->relocatable)
387 	continue;
388 
389       r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
390 					   input_section,
391 					   contents, rel->r_offset,
392 					   relocation, rel->r_addend,
393 					   info, sec, h == NULL);
394 
395       if (r != bfd_reloc_ok)
396 	{
397 	  const char *name;
398 	  const char *msg = (const char *) 0;
399 
400 	  if (h != NULL)
401 	    name = h->root.root.string;
402 	  else
403 	    {
404 	      name = (bfd_elf_string_from_elf_section
405 		      (input_bfd, symtab_hdr->sh_link, sym->st_name));
406 	      if (name == NULL || *name == '\0')
407 		name = bfd_section_name (input_bfd, sec);
408 	    }
409 
410 	  switch (r)
411 	    {
412 	    case bfd_reloc_overflow:
413 	      if (! ((*info->callbacks->reloc_overflow)
414 		     (info, (h ? &h->root : NULL), name, howto->name,
415 		      (bfd_vma) 0, input_bfd, input_section,
416 		      rel->r_offset)))
417 		return FALSE;
418 	      break;
419 
420 	    case bfd_reloc_undefined:
421 	      if (! ((*info->callbacks->undefined_symbol)
422 		     (info, name, input_bfd, input_section,
423 		      rel->r_offset, TRUE)))
424 		return FALSE;
425 	      break;
426 
427 	    case bfd_reloc_outofrange:
428 	      msg = _("internal error: out of range error");
429 	      goto common_error;
430 
431 	    case bfd_reloc_notsupported:
432 	      msg = _("internal error: unsupported relocation error");
433 	      goto common_error;
434 
435 	    case bfd_reloc_dangerous:
436 	      msg = _("internal error: dangerous error");
437 	      goto common_error;
438 
439 	    default:
440 	      msg = _("internal error: unknown error");
441 	      /* fall through */
442 
443 	    common_error:
444 	      if (!((*info->callbacks->warning)
445 		    (info, msg, name, input_bfd, input_section,
446 		     rel->r_offset)))
447 		return FALSE;
448 	      break;
449 	    }
450 	}
451     }
452 
453   return TRUE;
454 }
455 
456 /* Delete some bytes from a section while relaxing.  */
457 
458 static bfd_boolean
mn10200_elf_relax_delete_bytes(bfd * abfd,asection * sec,bfd_vma addr,int count)459 mn10200_elf_relax_delete_bytes (bfd *abfd, asection *sec,
460 				bfd_vma addr, int count)
461 {
462   Elf_Internal_Shdr *symtab_hdr;
463   unsigned int sec_shndx;
464   bfd_byte *contents;
465   Elf_Internal_Rela *irel, *irelend;
466   bfd_vma toaddr;
467   Elf_Internal_Sym *isym;
468   Elf_Internal_Sym *isymend;
469   struct elf_link_hash_entry **sym_hashes;
470   struct elf_link_hash_entry **end_hashes;
471   unsigned int symcount;
472 
473   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
474 
475   contents = elf_section_data (sec)->this_hdr.contents;
476 
477   toaddr = sec->size;
478 
479   irel = elf_section_data (sec)->relocs;
480   irelend = irel + sec->reloc_count;
481 
482   /* Actually delete the bytes.  */
483   memmove (contents + addr, contents + addr + count,
484 	   (size_t) (toaddr - addr - count));
485   sec->size -= count;
486 
487   /* Adjust all the relocs.  */
488   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
489     {
490       /* Get the new reloc address.  */
491       if ((irel->r_offset > addr
492 	   && irel->r_offset < toaddr))
493 	irel->r_offset -= count;
494     }
495 
496   /* Adjust the local symbols defined in this section.  */
497   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
498   isym = (Elf_Internal_Sym *) symtab_hdr->contents;
499   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
500     {
501       if (isym->st_shndx == sec_shndx
502 	  && isym->st_value > addr
503 	  && isym->st_value < toaddr)
504 	isym->st_value -= count;
505     }
506 
507   /* Now adjust the global symbols defined in this section.  */
508   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
509 	      - symtab_hdr->sh_info);
510   sym_hashes = elf_sym_hashes (abfd);
511   end_hashes = sym_hashes + symcount;
512   for (; sym_hashes < end_hashes; sym_hashes++)
513     {
514       struct elf_link_hash_entry *sym_hash = *sym_hashes;
515       if ((sym_hash->root.type == bfd_link_hash_defined
516 	   || sym_hash->root.type == bfd_link_hash_defweak)
517 	  && sym_hash->root.u.def.section == sec
518 	  && sym_hash->root.u.def.value > addr
519 	  && sym_hash->root.u.def.value < toaddr)
520 	{
521 	  sym_hash->root.u.def.value -= count;
522 	}
523     }
524 
525   return TRUE;
526 }
527 
528 /* This function handles relaxing for the mn10200.
529 
530    There are quite a few relaxing opportunities available on the mn10200:
531 
532 	* jsr:24 -> jsr:16 					   2 bytes
533 
534 	* jmp:24 -> jmp:16					   2 bytes
535 	* jmp:16 -> bra:8					   1 byte
536 
537 		* If the previous instruction is a conditional branch
538 		around the jump/bra, we may be able to reverse its condition
539 		and change its target to the jump's target.  The jump/bra
540 		can then be deleted.				   2 bytes
541 
542 	* mov abs24 -> mov abs16	2 byte savings
543 
544 	* Most instructions which accept imm24 can relax to imm16  2 bytes
545 	- Most instructions which accept imm16 can relax to imm8   1 byte
546 
547 	* Most instructions which accept d24 can relax to d16	   2 bytes
548 	- Most instructions which accept d16 can relax to d8	   1 byte
549 
550 	abs24, imm24, d24 all look the same at the reloc level.  It
551 	might make the code simpler if we had different relocs for
552 	the various relaxable operand types.
553 
554 	We don't handle imm16->imm8 or d16->d8 as they're very rare
555 	and somewhat more difficult to support.  */
556 
557 static bfd_boolean
mn10200_elf_relax_section(bfd * abfd,asection * sec,struct bfd_link_info * link_info,bfd_boolean * again)558 mn10200_elf_relax_section (bfd *abfd,
559 			   asection *sec,
560 			   struct bfd_link_info *link_info,
561 			   bfd_boolean *again)
562 {
563   Elf_Internal_Shdr *symtab_hdr;
564   Elf_Internal_Rela *internal_relocs;
565   Elf_Internal_Rela *irel, *irelend;
566   bfd_byte *contents = NULL;
567   Elf_Internal_Sym *isymbuf = NULL;
568 
569   /* Assume nothing changes.  */
570   *again = FALSE;
571 
572   /* We don't have to do anything for a relocatable link, if
573      this section does not have relocs, or if this is not a
574      code section.  */
575   if (link_info->relocatable
576       || (sec->flags & SEC_RELOC) == 0
577       || sec->reloc_count == 0
578       || (sec->flags & SEC_CODE) == 0)
579     return TRUE;
580 
581   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
582 
583   /* Get a copy of the native relocations.  */
584   internal_relocs = (_bfd_elf_link_read_relocs
585 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
586 		      link_info->keep_memory));
587   if (internal_relocs == NULL)
588     goto error_return;
589 
590   /* Walk through them looking for relaxing opportunities.  */
591   irelend = internal_relocs + sec->reloc_count;
592   for (irel = internal_relocs; irel < irelend; irel++)
593     {
594       bfd_vma symval;
595 
596       /* If this isn't something that can be relaxed, then ignore
597 	 this reloc.  */
598       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
599 	  || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
600 	  || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
601 	continue;
602 
603       /* Get the section contents if we haven't done so already.  */
604       if (contents == NULL)
605 	{
606 	  /* Get cached copy if it exists.  */
607 	  if (elf_section_data (sec)->this_hdr.contents != NULL)
608 	    contents = elf_section_data (sec)->this_hdr.contents;
609 	  else
610 	    {
611 	      /* Go get them off disk.  */
612 	      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
613 		goto error_return;
614 	    }
615 	}
616 
617       /* Read this BFD's local symbols if we haven't done so already.  */
618       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
619 	{
620 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
621 	  if (isymbuf == NULL)
622 	    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
623 					    symtab_hdr->sh_info, 0,
624 					    NULL, NULL, NULL);
625 	  if (isymbuf == NULL)
626 	    goto error_return;
627 	}
628 
629       /* Get the value of the symbol referred to by the reloc.  */
630       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
631 	{
632 	  /* A local symbol.  */
633 	  Elf_Internal_Sym *isym;
634 	  asection *sym_sec;
635 
636 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
637 	  if (isym->st_shndx == SHN_UNDEF)
638 	    sym_sec = bfd_und_section_ptr;
639 	  else if (isym->st_shndx == SHN_ABS)
640 	    sym_sec = bfd_abs_section_ptr;
641 	  else if (isym->st_shndx == SHN_COMMON)
642 	    sym_sec = bfd_com_section_ptr;
643 	  else
644 	    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
645 	  symval = (isym->st_value
646 		    + sym_sec->output_section->vma
647 		    + sym_sec->output_offset);
648 	}
649       else
650 	{
651 	  unsigned long indx;
652 	  struct elf_link_hash_entry *h;
653 
654 	  /* An external symbol.  */
655 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
656 	  h = elf_sym_hashes (abfd)[indx];
657 	  BFD_ASSERT (h != NULL);
658 	  if (h->root.type != bfd_link_hash_defined
659 	      && h->root.type != bfd_link_hash_defweak)
660 	    {
661 	      /* This appears to be a reference to an undefined
662                  symbol.  Just ignore it--it will be caught by the
663                  regular reloc processing.  */
664 	      continue;
665 	    }
666 
667 	  symval = (h->root.u.def.value
668 		    + h->root.u.def.section->output_section->vma
669 		    + h->root.u.def.section->output_offset);
670 	}
671 
672       /* For simplicity of coding, we are going to modify the section
673 	 contents, the section relocs, and the BFD symbol table.  We
674 	 must tell the rest of the code not to free up this
675 	 information.  It would be possible to instead create a table
676 	 of changes which have to be made, as is done in coff-mips.c;
677 	 that would be more work, but would require less memory when
678 	 the linker is run.  */
679 
680       /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
681 	 branch/call.  */
682       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
683 	{
684 	  bfd_vma value = symval;
685 
686 	  /* Deal with pc-relative gunk.  */
687 	  value -= (sec->output_section->vma + sec->output_offset);
688 	  value -= (irel->r_offset + 3);
689 	  value += irel->r_addend;
690 
691 	  /* See if the value will fit in 16 bits, note the high value is
692 	     0x7fff + 2 as the target will be two bytes closer if we are
693 	     able to relax.  */
694 	  if ((long) value < 0x8001 && (long) value > -0x8000)
695 	    {
696 	      unsigned char code;
697 
698 	      /* Get the opcode.  */
699 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
700 
701 	      if (code != 0xe0 && code != 0xe1)
702 		continue;
703 
704 	      /* Note that we've changed the relocs, section contents, etc.  */
705 	      elf_section_data (sec)->relocs = internal_relocs;
706 	      elf_section_data (sec)->this_hdr.contents = contents;
707 	      symtab_hdr->contents = (unsigned char *) isymbuf;
708 
709 	      /* Fix the opcode.  */
710 	      if (code == 0xe0)
711 		bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
712 	      else if (code == 0xe1)
713 		bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
714 
715 	      /* Fix the relocation's type.  */
716 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
717 					   R_MN10200_PCREL16);
718 
719 	      /* The opcode got shorter too, so we have to fix the offset.  */
720 	      irel->r_offset -= 1;
721 
722 	      /* Delete two bytes of data.  */
723 	      if (!mn10200_elf_relax_delete_bytes (abfd, sec,
724 						   irel->r_offset + 1, 2))
725 		goto error_return;
726 
727 	      /* That will change things, so, we should relax again.
728 		 Note that this is not required, and it may be slow.  */
729 	      *again = TRUE;
730 	    }
731 	}
732 
733       /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
734 	 branch.  */
735       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
736 	{
737 	  bfd_vma value = symval;
738 
739 	  /* Deal with pc-relative gunk.  */
740 	  value -= (sec->output_section->vma + sec->output_offset);
741 	  value -= (irel->r_offset + 2);
742 	  value += irel->r_addend;
743 
744 	  /* See if the value will fit in 8 bits, note the high value is
745 	     0x7f + 1 as the target will be one bytes closer if we are
746 	     able to relax.  */
747 	  if ((long) value < 0x80 && (long) value > -0x80)
748 	    {
749 	      unsigned char code;
750 
751 	      /* Get the opcode.  */
752 	      code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
753 
754 	      if (code != 0xfc)
755 		continue;
756 
757 	      /* Note that we've changed the relocs, section contents, etc.  */
758 	      elf_section_data (sec)->relocs = internal_relocs;
759 	      elf_section_data (sec)->this_hdr.contents = contents;
760 	      symtab_hdr->contents = (unsigned char *) isymbuf;
761 
762 	      /* Fix the opcode.  */
763 	      bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
764 
765 	      /* Fix the relocation's type.  */
766 	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
767 					   R_MN10200_PCREL8);
768 
769 	      /* Delete one byte of data.  */
770 	      if (!mn10200_elf_relax_delete_bytes (abfd, sec,
771 						   irel->r_offset + 1, 1))
772 		goto error_return;
773 
774 	      /* That will change things, so, we should relax again.
775 		 Note that this is not required, and it may be slow.  */
776 	      *again = TRUE;
777 	    }
778 	}
779 
780       /* Try to eliminate an unconditional 8 bit pc-relative branch
781 	 which immediately follows a conditional 8 bit pc-relative
782 	 branch around the unconditional branch.
783 
784 	    original:		new:
785 	    bCC lab1		bCC' lab2
786 	    bra lab2
787 	   lab1:	       lab1:
788 
789 	 This happens when the bCC can't reach lab2 at assembly time,
790 	 but due to other relaxations it can reach at link time.  */
791       if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
792 	{
793 	  Elf_Internal_Rela *nrel;
794 	  bfd_vma value = symval;
795 	  unsigned char code;
796 
797 	  /* Deal with pc-relative gunk.  */
798 	  value -= (sec->output_section->vma + sec->output_offset);
799 	  value -= (irel->r_offset + 1);
800 	  value += irel->r_addend;
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 (internal_relocs != NULL
1207       && elf_section_data (sec)->relocs != internal_relocs)
1208     free (internal_relocs);
1209 
1210   return TRUE;
1211 
1212  error_return:
1213   if (isymbuf != NULL
1214       && symtab_hdr->contents != (unsigned char *) isymbuf)
1215     free (isymbuf);
1216   if (contents != NULL
1217       && elf_section_data (sec)->this_hdr.contents != contents)
1218     free (contents);
1219   if (internal_relocs != NULL
1220       && elf_section_data (sec)->relocs != internal_relocs)
1221     free (internal_relocs);
1222 
1223   return FALSE;
1224 }
1225 
1226 /* Return TRUE if a symbol exists at the given address, else return
1227    FALSE.  */
1228 static bfd_boolean
mn10200_elf_symbol_address_p(bfd * abfd,asection * sec,Elf_Internal_Sym * isym,bfd_vma addr)1229 mn10200_elf_symbol_address_p (bfd *abfd,
1230 			      asection *sec,
1231 			      Elf_Internal_Sym *isym,
1232 			      bfd_vma addr)
1233 {
1234   Elf_Internal_Shdr *symtab_hdr;
1235   unsigned int sec_shndx;
1236   Elf_Internal_Sym *isymend;
1237   struct elf_link_hash_entry **sym_hashes;
1238   struct elf_link_hash_entry **end_hashes;
1239   unsigned int symcount;
1240 
1241   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1242 
1243   /* Examine all the local symbols.  */
1244   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1245   for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
1246     {
1247       if (isym->st_shndx == sec_shndx
1248 	  && isym->st_value == addr)
1249 	return TRUE;
1250     }
1251 
1252   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1253 	      - symtab_hdr->sh_info);
1254   sym_hashes = elf_sym_hashes (abfd);
1255   end_hashes = sym_hashes + symcount;
1256   for (; sym_hashes < end_hashes; sym_hashes++)
1257     {
1258       struct elf_link_hash_entry *sym_hash = *sym_hashes;
1259       if ((sym_hash->root.type == bfd_link_hash_defined
1260 	   || sym_hash->root.type == bfd_link_hash_defweak)
1261 	  && sym_hash->root.u.def.section == sec
1262 	  && sym_hash->root.u.def.value == addr)
1263 	return TRUE;
1264     }
1265 
1266   return FALSE;
1267 }
1268 
1269 /* This is a version of bfd_generic_get_relocated_section_contents
1270    which uses mn10200_elf_relocate_section.  */
1271 
1272 static bfd_byte *
mn10200_elf_get_relocated_section_contents(bfd * output_bfd,struct bfd_link_info * link_info,struct bfd_link_order * link_order,bfd_byte * data,bfd_boolean relocatable,asymbol ** symbols)1273 mn10200_elf_get_relocated_section_contents (bfd *output_bfd,
1274 					    struct bfd_link_info *link_info,
1275 					    struct bfd_link_order *link_order,
1276 					    bfd_byte *data,
1277 					    bfd_boolean relocatable,
1278 					    asymbol **symbols)
1279 {
1280   Elf_Internal_Shdr *symtab_hdr;
1281   asection *input_section = link_order->u.indirect.section;
1282   bfd *input_bfd = input_section->owner;
1283   asection **sections = NULL;
1284   Elf_Internal_Rela *internal_relocs = NULL;
1285   Elf_Internal_Sym *isymbuf = NULL;
1286 
1287   /* We only need to handle the case of relaxing, or of having a
1288      particular set of section contents, specially.  */
1289   if (relocatable
1290       || elf_section_data (input_section)->this_hdr.contents == NULL)
1291     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1292 						       link_order, data,
1293 						       relocatable,
1294 						       symbols);
1295 
1296   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1297 
1298   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1299 	  (size_t) input_section->size);
1300 
1301   if ((input_section->flags & SEC_RELOC) != 0
1302       && input_section->reloc_count > 0)
1303     {
1304       Elf_Internal_Sym *isym;
1305       Elf_Internal_Sym *isymend;
1306       asection **secpp;
1307       bfd_size_type amt;
1308 
1309       internal_relocs = (_bfd_elf_link_read_relocs
1310 			 (input_bfd, input_section, NULL,
1311 			  (Elf_Internal_Rela *) NULL, FALSE));
1312       if (internal_relocs == NULL)
1313 	goto error_return;
1314 
1315       if (symtab_hdr->sh_info != 0)
1316 	{
1317 	  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1318 	  if (isymbuf == NULL)
1319 	    isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1320 					    symtab_hdr->sh_info, 0,
1321 					    NULL, NULL, NULL);
1322 	  if (isymbuf == NULL)
1323 	    goto error_return;
1324 	}
1325 
1326       amt = symtab_hdr->sh_info;
1327       amt *= sizeof (asection *);
1328       sections = (asection **) bfd_malloc (amt);
1329       if (sections == NULL && amt != 0)
1330 	goto error_return;
1331 
1332       isymend = isymbuf + symtab_hdr->sh_info;
1333       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
1334 	{
1335 	  asection *isec;
1336 
1337 	  if (isym->st_shndx == SHN_UNDEF)
1338 	    isec = bfd_und_section_ptr;
1339 	  else if (isym->st_shndx == SHN_ABS)
1340 	    isec = bfd_abs_section_ptr;
1341 	  else if (isym->st_shndx == SHN_COMMON)
1342 	    isec = bfd_com_section_ptr;
1343 	  else
1344 	    isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
1345 
1346 	  *secpp = isec;
1347 	}
1348 
1349       if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
1350 				     input_section, data, internal_relocs,
1351 				     isymbuf, sections))
1352 	goto error_return;
1353 
1354       if (sections != NULL)
1355 	free (sections);
1356       if (isymbuf != NULL
1357 	  && symtab_hdr->contents != (unsigned char *) isymbuf)
1358 	free (isymbuf);
1359       if (elf_section_data (input_section)->relocs != internal_relocs)
1360 	free (internal_relocs);
1361     }
1362 
1363   return data;
1364 
1365  error_return:
1366   if (sections != NULL)
1367     free (sections);
1368   if (isymbuf != NULL
1369       && symtab_hdr->contents != (unsigned char *) isymbuf)
1370     free (isymbuf);
1371   if (internal_relocs != NULL
1372       && elf_section_data (input_section)->relocs != internal_relocs)
1373     free (internal_relocs);
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	0
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