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