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