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