Support for more than 64k ELF sections.
[binutils.git] / bfd / elf-m10200.c
blobe514934fbbc7826b84c326db4218c43ac8045935
1 /* Matsushita 10200 specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
26 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
27 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
28 static void mn10200_info_to_howto
29 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
30 static boolean mn10200_elf_relax_delete_bytes
31 PARAMS ((bfd *, asection *, bfd_vma, int));
32 static boolean mn10200_elf_symbol_address_p
33 PARAMS ((bfd *, asection *, bfd_vma));
34 static bfd_reloc_status_type mn10200_elf_final_link_relocate
35 PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
36 bfd_byte *, bfd_vma, bfd_vma, bfd_vma,
37 struct bfd_link_info *, asection *, int));
38 static boolean mn10200_elf_relocate_section
39 PARAMS (( bfd *, struct bfd_link_info *, bfd *, asection *,
40 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *,
41 asection **));
42 static boolean mn10200_elf_relax_section
43 PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
44 static bfd_byte * mn10200_elf_get_relocated_section_contents
45 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
46 bfd_byte *, boolean, asymbol **));
48 /* We have to use RELA instructions since md_apply_fix3 in the assembler
49 does absolutely nothing. */
50 #define USE_RELA
52 enum reloc_type {
53 R_MN10200_NONE = 0,
54 R_MN10200_32,
55 R_MN10200_16,
56 R_MN10200_8,
57 R_MN10200_24,
58 R_MN10200_PCREL8,
59 R_MN10200_PCREL16,
60 R_MN10200_PCREL24,
61 R_MN10200_MAX
64 static reloc_howto_type elf_mn10200_howto_table[] = {
65 /* Dummy relocation. Does nothing. */
66 HOWTO (R_MN10200_NONE,
69 16,
70 false,
72 complain_overflow_bitfield,
73 bfd_elf_generic_reloc,
74 "R_MN10200_NONE",
75 false,
78 false),
79 /* Standard 32 bit reloc. */
80 HOWTO (R_MN10200_32,
83 32,
84 false,
86 complain_overflow_bitfield,
87 bfd_elf_generic_reloc,
88 "R_MN10200_32",
89 false,
90 0xffffffff,
91 0xffffffff,
92 false),
93 /* Standard 16 bit reloc. */
94 HOWTO (R_MN10200_16,
97 16,
98 false,
100 complain_overflow_bitfield,
101 bfd_elf_generic_reloc,
102 "R_MN10200_16",
103 false,
104 0xffff,
105 0xffff,
106 false),
107 /* Standard 8 bit reloc. */
108 HOWTO (R_MN10200_8,
112 false,
114 complain_overflow_bitfield,
115 bfd_elf_generic_reloc,
116 "R_MN10200_8",
117 false,
118 0xff,
119 0xff,
120 false),
121 /* Standard 24 bit reloc. */
122 HOWTO (R_MN10200_24,
126 false,
128 complain_overflow_bitfield,
129 bfd_elf_generic_reloc,
130 "R_MN10200_24",
131 false,
132 0xffffff,
133 0xffffff,
134 false),
135 /* Simple 8 pc-relative reloc. */
136 HOWTO (R_MN10200_PCREL8,
140 true,
142 complain_overflow_bitfield,
143 bfd_elf_generic_reloc,
144 "R_MN10200_PCREL8",
145 false,
146 0xff,
147 0xff,
148 true),
149 /* Simple 16 pc-relative reloc. */
150 HOWTO (R_MN10200_PCREL16,
154 true,
156 complain_overflow_bitfield,
157 bfd_elf_generic_reloc,
158 "R_MN10200_PCREL16",
159 false,
160 0xffff,
161 0xffff,
162 true),
163 /* Simple 32bit pc-relative reloc with a 1 byte adjustment
164 to get the pc-relative offset correct. */
165 HOWTO (R_MN10200_PCREL24,
169 true,
171 complain_overflow_bitfield,
172 bfd_elf_generic_reloc,
173 "R_MN10200_PCREL24",
174 false,
175 0xffffff,
176 0xffffff,
177 true),
180 struct mn10200_reloc_map {
181 bfd_reloc_code_real_type bfd_reloc_val;
182 unsigned char elf_reloc_val;
185 static const struct mn10200_reloc_map mn10200_reloc_map[] = {
186 { BFD_RELOC_NONE , R_MN10200_NONE , },
187 { BFD_RELOC_32 , R_MN10200_32 , },
188 { BFD_RELOC_16 , R_MN10200_16 , },
189 { BFD_RELOC_8 , R_MN10200_8 , },
190 { BFD_RELOC_24 , R_MN10200_24 , },
191 { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , },
192 { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, },
193 { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, },
196 static reloc_howto_type *
197 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
198 bfd *abfd ATTRIBUTE_UNUSED;
199 bfd_reloc_code_real_type code;
201 unsigned int i;
203 for (i = 0;
204 i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map);
205 i++)
207 if (mn10200_reloc_map[i].bfd_reloc_val == code)
208 return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val];
211 return NULL;
214 /* Set the howto pointer for an MN10200 ELF reloc. */
216 static void
217 mn10200_info_to_howto (abfd, cache_ptr, dst)
218 bfd *abfd ATTRIBUTE_UNUSED;
219 arelent *cache_ptr;
220 Elf32_Internal_Rela *dst;
222 unsigned int r_type;
224 r_type = ELF32_R_TYPE (dst->r_info);
225 BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX);
226 cache_ptr->howto = &elf_mn10200_howto_table[r_type];
229 /* Perform a relocation as part of a final link. */
231 static bfd_reloc_status_type
232 mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
233 input_section, contents, offset, value,
234 addend, info, sym_sec, is_local)
235 reloc_howto_type *howto;
236 bfd *input_bfd;
237 bfd *output_bfd ATTRIBUTE_UNUSED;
238 asection *input_section;
239 bfd_byte *contents;
240 bfd_vma offset;
241 bfd_vma value;
242 bfd_vma addend;
243 struct bfd_link_info *info ATTRIBUTE_UNUSED;
244 asection *sym_sec ATTRIBUTE_UNUSED;
245 int is_local ATTRIBUTE_UNUSED;
247 unsigned long r_type = howto->type;
248 bfd_byte *hit_data = contents + offset;
250 switch (r_type)
253 case R_MN10200_NONE:
254 return bfd_reloc_ok;
256 case R_MN10200_32:
257 value += addend;
258 bfd_put_32 (input_bfd, value, hit_data);
259 return bfd_reloc_ok;
261 case R_MN10200_16:
262 value += addend;
264 if ((long) value > 0x7fff || (long) value < -0x8000)
265 return bfd_reloc_overflow;
267 bfd_put_16 (input_bfd, value, hit_data);
268 return bfd_reloc_ok;
270 case R_MN10200_8:
271 value += addend;
273 if ((long) value > 0x7f || (long) value < -0x80)
274 return bfd_reloc_overflow;
276 bfd_put_8 (input_bfd, value, hit_data);
277 return bfd_reloc_ok;
279 case R_MN10200_24:
280 value += addend;
282 if ((long) value > 0x7fffff || (long) value < -0x800000)
283 return bfd_reloc_overflow;
285 value &= 0xffffff;
286 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
287 bfd_put_32 (input_bfd, value, hit_data);
288 return bfd_reloc_ok;
290 case R_MN10200_PCREL8:
291 value -= (input_section->output_section->vma
292 + input_section->output_offset);
293 value -= (offset + 1);
294 value += addend;
296 if ((long) value > 0xff || (long) value < -0x100)
297 return bfd_reloc_overflow;
299 bfd_put_8 (input_bfd, value, hit_data);
300 return bfd_reloc_ok;
302 case R_MN10200_PCREL16:
303 value -= (input_section->output_section->vma
304 + input_section->output_offset);
305 value -= (offset + 2);
306 value += addend;
308 if ((long) value > 0xffff || (long) value < -0x10000)
309 return bfd_reloc_overflow;
311 bfd_put_16 (input_bfd, value, hit_data);
312 return bfd_reloc_ok;
314 case R_MN10200_PCREL24:
315 value -= (input_section->output_section->vma
316 + input_section->output_offset);
317 value -= (offset + 3);
318 value += addend;
320 if ((long) value > 0xffffff || (long) value < -0x1000000)
321 return bfd_reloc_overflow;
323 value &= 0xffffff;
324 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000);
325 bfd_put_32 (input_bfd, value, hit_data);
326 return bfd_reloc_ok;
328 default:
329 return bfd_reloc_notsupported;
333 /* Relocate an MN10200 ELF section. */
334 static boolean
335 mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
336 contents, relocs, local_syms, local_sections)
337 bfd *output_bfd;
338 struct bfd_link_info *info;
339 bfd *input_bfd;
340 asection *input_section;
341 bfd_byte *contents;
342 Elf_Internal_Rela *relocs;
343 Elf_Internal_Sym *local_syms;
344 asection **local_sections;
346 Elf_Internal_Shdr *symtab_hdr;
347 struct elf_link_hash_entry **sym_hashes;
348 Elf_Internal_Rela *rel, *relend;
350 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
351 sym_hashes = elf_sym_hashes (input_bfd);
353 rel = relocs;
354 relend = relocs + input_section->reloc_count;
355 for (; rel < relend; rel++)
357 int r_type;
358 reloc_howto_type *howto;
359 unsigned long r_symndx;
360 Elf_Internal_Sym *sym;
361 asection *sec;
362 struct elf_link_hash_entry *h;
363 bfd_vma relocation;
364 bfd_reloc_status_type r;
366 r_symndx = ELF32_R_SYM (rel->r_info);
367 r_type = ELF32_R_TYPE (rel->r_info);
368 howto = elf_mn10200_howto_table + r_type;
370 if (info->relocateable)
372 /* This is a relocateable link. We don't have to change
373 anything, unless the reloc is against a section symbol,
374 in which case we have to adjust according to where the
375 section symbol winds up in the output section. */
376 if (r_symndx < symtab_hdr->sh_info)
378 sym = local_syms + r_symndx;
379 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
381 sec = local_sections[r_symndx];
382 rel->r_addend += sec->output_offset + sym->st_value;
386 continue;
389 /* This is a final link. */
390 h = NULL;
391 sym = NULL;
392 sec = NULL;
393 if (r_symndx < symtab_hdr->sh_info)
395 sym = local_syms + r_symndx;
396 sec = local_sections[r_symndx];
397 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
399 else
401 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
402 while (h->root.type == bfd_link_hash_indirect
403 || h->root.type == bfd_link_hash_warning)
404 h = (struct elf_link_hash_entry *) h->root.u.i.link;
405 if (h->root.type == bfd_link_hash_defined
406 || h->root.type == bfd_link_hash_defweak)
408 sec = h->root.u.def.section;
409 relocation = (h->root.u.def.value
410 + sec->output_section->vma
411 + sec->output_offset);
413 else if (h->root.type == bfd_link_hash_undefweak)
414 relocation = 0;
415 else
417 if (! ((*info->callbacks->undefined_symbol)
418 (info, h->root.root.string, input_bfd,
419 input_section, rel->r_offset, true)))
420 return false;
421 relocation = 0;
425 r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
426 input_section,
427 contents, rel->r_offset,
428 relocation, rel->r_addend,
429 info, sec, h == NULL);
431 if (r != bfd_reloc_ok)
433 const char *name;
434 const char *msg = (const char *) 0;
436 if (h != NULL)
437 name = h->root.root.string;
438 else
440 name = (bfd_elf_string_from_elf_section
441 (input_bfd, symtab_hdr->sh_link, sym->st_name));
442 if (name == NULL || *name == '\0')
443 name = bfd_section_name (input_bfd, sec);
446 switch (r)
448 case bfd_reloc_overflow:
449 if (! ((*info->callbacks->reloc_overflow)
450 (info, name, howto->name, (bfd_vma) 0,
451 input_bfd, input_section, rel->r_offset)))
452 return false;
453 break;
455 case bfd_reloc_undefined:
456 if (! ((*info->callbacks->undefined_symbol)
457 (info, name, input_bfd, input_section,
458 rel->r_offset, true)))
459 return false;
460 break;
462 case bfd_reloc_outofrange:
463 msg = _("internal error: out of range error");
464 goto common_error;
466 case bfd_reloc_notsupported:
467 msg = _("internal error: unsupported relocation error");
468 goto common_error;
470 case bfd_reloc_dangerous:
471 msg = _("internal error: dangerous error");
472 goto common_error;
474 default:
475 msg = _("internal error: unknown error");
476 /* fall through */
478 common_error:
479 if (!((*info->callbacks->warning)
480 (info, msg, name, input_bfd, input_section,
481 rel->r_offset)))
482 return false;
483 break;
488 return true;
491 /* This function handles relaxing for the mn10200.
493 There's quite a few relaxing opportunites available on the mn10200:
495 * jsr:24 -> jsr:16 2 bytes
497 * jmp:24 -> jmp:16 2 bytes
498 * jmp:16 -> bra:8 1 byte
500 * If the previous instruction is a conditional branch
501 around the jump/bra, we may be able to reverse its condition
502 and change its target to the jump's target. The jump/bra
503 can then be deleted. 2 bytes
505 * mov abs24 -> mov abs16 2 byte savings
507 * Most instructions which accept imm24 can relax to imm16 2 bytes
508 - Most instructions which accept imm16 can relax to imm8 1 byte
510 * Most instructions which accept d24 can relax to d16 2 bytes
511 - Most instructions which accept d16 can relax to d8 1 byte
513 abs24, imm24, d24 all look the same at the reloc level. It
514 might make the code simpler if we had different relocs for
515 the various relaxable operand types.
517 We don't handle imm16->imm8 or d16->d8 as they're very rare
518 and somewhat more difficult to support. */
520 static boolean
521 mn10200_elf_relax_section (abfd, sec, link_info, again)
522 bfd *abfd;
523 asection *sec;
524 struct bfd_link_info *link_info;
525 boolean *again;
527 Elf_Internal_Shdr *symtab_hdr;
528 Elf_Internal_Shdr *shndx_hdr;
529 Elf_Internal_Rela *internal_relocs;
530 Elf_Internal_Rela *free_relocs = NULL;
531 Elf_Internal_Rela *irel, *irelend;
532 bfd_byte *contents = NULL;
533 bfd_byte *free_contents = NULL;
534 Elf32_External_Sym *extsyms = NULL;
535 Elf32_External_Sym *free_extsyms = NULL;
536 Elf_External_Sym_Shndx *shndx_buf = NULL;
538 /* Assume nothing changes. */
539 *again = false;
541 /* We don't have to do anything for a relocateable link, if
542 this section does not have relocs, or if this is not a
543 code section. */
544 if (link_info->relocateable
545 || (sec->flags & SEC_RELOC) == 0
546 || sec->reloc_count == 0
547 || (sec->flags & SEC_CODE) == 0)
548 return true;
550 /* If this is the first time we have been called for this section,
551 initialize the cooked size. */
552 if (sec->_cooked_size == 0)
553 sec->_cooked_size = sec->_raw_size;
555 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
556 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
558 /* Get a copy of the native relocations. */
559 internal_relocs = (_bfd_elf32_link_read_relocs
560 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
561 link_info->keep_memory));
562 if (internal_relocs == NULL)
563 goto error_return;
564 if (! link_info->keep_memory)
565 free_relocs = internal_relocs;
567 /* Walk through them looking for relaxing opportunities. */
568 irelend = internal_relocs + sec->reloc_count;
569 for (irel = internal_relocs; irel < irelend; irel++)
571 bfd_vma symval;
573 /* If this isn't something that can be relaxed, then ignore
574 this reloc. */
575 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE
576 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8
577 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX)
578 continue;
580 /* Get the section contents if we haven't done so already. */
581 if (contents == NULL)
583 /* Get cached copy if it exists. */
584 if (elf_section_data (sec)->this_hdr.contents != NULL)
585 contents = elf_section_data (sec)->this_hdr.contents;
586 else
588 /* Go get them off disk. */
589 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
590 if (contents == NULL)
591 goto error_return;
592 free_contents = contents;
594 if (! bfd_get_section_contents (abfd, sec, contents,
595 (file_ptr) 0, sec->_raw_size))
596 goto error_return;
600 /* Read this BFD's symbols if we haven't done so already. */
601 if (extsyms == NULL)
603 /* Get cached copy if it exists. */
604 if (symtab_hdr->contents != NULL)
605 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
606 else
608 /* Go get them off disk. */
609 bfd_size_type amt;
611 amt = symtab_hdr->sh_info;
612 amt *= sizeof (Elf32_External_Sym);
613 extsyms = (Elf32_External_Sym *) bfd_malloc (amt);
614 if (extsyms == NULL)
615 goto error_return;
616 free_extsyms = extsyms;
617 if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
618 || bfd_bread ((PTR) extsyms, amt, abfd) != amt)
619 goto error_return;
620 symtab_hdr->contents = (bfd_byte *) extsyms;
623 if (shndx_hdr->sh_size != 0)
625 bfd_size_type amt;
627 amt = symtab_hdr->sh_info;
628 amt *= sizeof (Elf_External_Sym_Shndx);
629 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
630 if (shndx_buf == NULL)
631 goto error_return;
632 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
633 || bfd_bread ((PTR) shndx_buf, amt, abfd) != amt)
634 goto error_return;
635 shndx_hdr->contents = (bfd_byte *) shndx_buf;
639 /* Get the value of the symbol referred to by the reloc. */
640 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
642 /* A local symbol. */
643 Elf32_External_Sym *esym;
644 Elf_External_Sym_Shndx *shndx;
645 Elf_Internal_Sym isym;
646 asection *sym_sec;
648 esym = extsyms + ELF32_R_SYM (irel->r_info);
649 shndx = shndx_buf + (shndx_buf ? ELF32_R_SYM (irel->r_info) : 0);
650 bfd_elf32_swap_symbol_in (abfd, esym, shndx, &isym);
652 if (isym.st_shndx == SHN_UNDEF)
653 sym_sec = bfd_und_section_ptr;
654 else if (isym.st_shndx == SHN_ABS)
655 sym_sec = bfd_abs_section_ptr;
656 else if (isym.st_shndx == SHN_COMMON)
657 sym_sec = bfd_com_section_ptr;
658 else
659 sym_sec = bfd_section_from_elf_index (abfd, isym.st_shndx);
660 symval = (isym.st_value
661 + sym_sec->output_section->vma
662 + sym_sec->output_offset);
664 else
666 unsigned long indx;
667 struct elf_link_hash_entry *h;
669 /* An external symbol. */
670 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
671 h = elf_sym_hashes (abfd)[indx];
672 BFD_ASSERT (h != NULL);
673 if (h->root.type != bfd_link_hash_defined
674 && h->root.type != bfd_link_hash_defweak)
676 /* This appears to be a reference to an undefined
677 symbol. Just ignore it--it will be caught by the
678 regular reloc processing. */
679 continue;
682 symval = (h->root.u.def.value
683 + h->root.u.def.section->output_section->vma
684 + h->root.u.def.section->output_offset);
687 /* For simplicity of coding, we are going to modify the section
688 contents, the section relocs, and the BFD symbol table. We
689 must tell the rest of the code not to free up this
690 information. It would be possible to instead create a table
691 of changes which have to be made, as is done in coff-mips.c;
692 that would be more work, but would require less memory when
693 the linker is run. */
695 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
696 branch/call. */
697 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24)
699 bfd_vma value = symval;
701 /* Deal with pc-relative gunk. */
702 value -= (sec->output_section->vma + sec->output_offset);
703 value -= (irel->r_offset + 3);
704 value += irel->r_addend;
706 /* See if the value will fit in 16 bits, note the high value is
707 0x7fff + 2 as the target will be two bytes closer if we are
708 able to relax. */
709 if ((long) value < 0x8001 && (long) value > -0x8000)
711 unsigned char code;
713 /* Get the opcode. */
714 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
716 if (code != 0xe0 && code != 0xe1)
717 continue;
719 /* Note that we've changed the relocs, section contents, etc. */
720 elf_section_data (sec)->relocs = internal_relocs;
721 free_relocs = NULL;
723 elf_section_data (sec)->this_hdr.contents = contents;
724 free_contents = NULL;
726 free_extsyms = NULL;
728 /* Fix the opcode. */
729 if (code == 0xe0)
730 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2);
731 else if (code == 0xe1)
732 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2);
734 /* Fix the relocation's type. */
735 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
736 R_MN10200_PCREL16);
738 /* The opcode got shorter too, so we have to fix the offset. */
739 irel->r_offset -= 1;
741 /* Delete two bytes of data. */
742 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
743 irel->r_offset + 1, 2))
744 goto error_return;
746 /* That will change things, so, we should relax again.
747 Note that this is not required, and it may be slow. */
748 *again = true;
752 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
753 branch. */
754 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16)
756 bfd_vma value = symval;
758 /* Deal with pc-relative gunk. */
759 value -= (sec->output_section->vma + sec->output_offset);
760 value -= (irel->r_offset + 2);
761 value += irel->r_addend;
763 /* See if the value will fit in 8 bits, note the high value is
764 0x7f + 1 as the target will be one bytes closer if we are
765 able to relax. */
766 if ((long) value < 0x80 && (long) value > -0x80)
768 unsigned char code;
770 /* Get the opcode. */
771 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
773 if (code != 0xfc)
774 continue;
776 /* Note that we've changed the relocs, section contents, etc. */
777 elf_section_data (sec)->relocs = internal_relocs;
778 free_relocs = NULL;
780 elf_section_data (sec)->this_hdr.contents = contents;
781 free_contents = NULL;
783 free_extsyms = NULL;
785 /* Fix the opcode. */
786 bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1);
788 /* Fix the relocation's type. */
789 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
790 R_MN10200_PCREL8);
792 /* Delete one byte of data. */
793 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
794 irel->r_offset + 1, 1))
795 goto error_return;
797 /* That will change things, so, we should relax again.
798 Note that this is not required, and it may be slow. */
799 *again = true;
803 /* Try to eliminate an unconditional 8 bit pc-relative branch
804 which immediately follows a conditional 8 bit pc-relative
805 branch around the unconditional branch.
807 original: new:
808 bCC lab1 bCC' lab2
809 bra lab2
810 lab1: lab1:
812 This happens when the bCC can't reach lab2 at assembly time,
813 but due to other relaxations it can reach at link time. */
814 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8)
816 Elf_Internal_Rela *nrel;
817 bfd_vma value = symval;
818 unsigned char code;
820 /* Deal with pc-relative gunk. */
821 value -= (sec->output_section->vma + sec->output_offset);
822 value -= (irel->r_offset + 1);
823 value += irel->r_addend;
825 /* Do nothing if this reloc is the last byte in the section. */
826 if (irel->r_offset == sec->_cooked_size)
827 continue;
829 /* See if the next instruction is an unconditional pc-relative
830 branch, more often than not this test will fail, so we
831 test it first to speed things up. */
832 code = bfd_get_8 (abfd, contents + irel->r_offset + 1);
833 if (code != 0xea)
834 continue;
836 /* Also make sure the next relocation applies to the next
837 instruction and that it's a pc-relative 8 bit branch. */
838 nrel = irel + 1;
839 if (nrel == irelend
840 || irel->r_offset + 2 != nrel->r_offset
841 || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8)
842 continue;
844 /* Make sure our destination immediately follows the
845 unconditional branch. */
846 if (symval != (sec->output_section->vma + sec->output_offset
847 + irel->r_offset + 3))
848 continue;
850 /* Now make sure we are a conditional branch. This may not
851 be necessary, but why take the chance.
853 Note these checks assume that R_MN10200_PCREL8 relocs
854 only occur on bCC and bCCx insns. If they occured
855 elsewhere, we'd need to know the start of this insn
856 for this check to be accurate. */
857 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
858 if (code != 0xe0 && code != 0xe1 && code != 0xe2
859 && code != 0xe3 && code != 0xe4 && code != 0xe5
860 && code != 0xe6 && code != 0xe7 && code != 0xe8
861 && code != 0xe9 && code != 0xec && code != 0xed
862 && code != 0xee && code != 0xef && code != 0xfc
863 && code != 0xfd && code != 0xfe && code != 0xff)
864 continue;
866 /* We also have to be sure there is no symbol/label
867 at the unconditional branch. */
868 if (mn10200_elf_symbol_address_p (abfd, sec, irel->r_offset + 1))
869 continue;
871 /* Note that we've changed the relocs, section contents, etc. */
872 elf_section_data (sec)->relocs = internal_relocs;
873 free_relocs = NULL;
875 elf_section_data (sec)->this_hdr.contents = contents;
876 free_contents = NULL;
878 free_extsyms = NULL;
880 /* Reverse the condition of the first branch. */
881 switch (code)
883 case 0xfc:
884 code = 0xfd;
885 break;
886 case 0xfd:
887 code = 0xfc;
888 break;
889 case 0xfe:
890 code = 0xff;
891 break;
892 case 0xff:
893 code = 0xfe;
894 break;
895 case 0xe8:
896 code = 0xe9;
897 break;
898 case 0xe9:
899 code = 0xe8;
900 break;
901 case 0xe0:
902 code = 0xe2;
903 break;
904 case 0xe2:
905 code = 0xe0;
906 break;
907 case 0xe3:
908 code = 0xe1;
909 break;
910 case 0xe1:
911 code = 0xe3;
912 break;
913 case 0xe4:
914 code = 0xe6;
915 break;
916 case 0xe6:
917 code = 0xe4;
918 break;
919 case 0xe7:
920 code = 0xe5;
921 break;
922 case 0xe5:
923 code = 0xe7;
924 break;
925 case 0xec:
926 code = 0xed;
927 break;
928 case 0xed:
929 code = 0xec;
930 break;
931 case 0xee:
932 code = 0xef;
933 break;
934 case 0xef:
935 code = 0xee;
936 break;
938 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
940 /* Set the reloc type and symbol for the first branch
941 from the second branch. */
942 irel->r_info = nrel->r_info;
944 /* Make the reloc for the second branch a null reloc. */
945 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info),
946 R_MN10200_NONE);
948 /* Delete two bytes of data. */
949 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
950 irel->r_offset + 1, 2))
951 goto error_return;
953 /* That will change things, so, we should relax again.
954 Note that this is not required, and it may be slow. */
955 *again = true;
958 /* Try to turn a 24bit immediate, displacement or absolute address
959 into a 16bit immediate, displacement or absolute address. */
960 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24)
962 bfd_vma value = symval;
964 /* See if the value will fit in 16 bits.
965 We allow any 16bit match here. We prune those we can't
966 handle below. */
967 if ((long) value < 0x7fff && (long) value > -0x8000)
969 unsigned char code;
971 /* All insns which have 24bit operands are 5 bytes long,
972 the first byte will always be 0xf4, but we double check
973 it just in case. */
975 /* Get the first opcode. */
976 code = bfd_get_8 (abfd, contents + irel->r_offset - 2);
978 if (code != 0xf4)
979 continue;
981 /* Get the second opcode. */
982 code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
984 switch (code & 0xfc)
986 /* mov imm24,dn -> mov imm16,dn */
987 case 0x70:
988 /* Not safe if the high bit is on as relaxing may
989 move the value out of high mem and thus not fit
990 in a signed 16bit value. */
991 if (value & 0x8000)
992 continue;
994 /* Note that we've changed the reldection contents, etc. */
995 elf_section_data (sec)->relocs = internal_relocs;
996 free_relocs = NULL;
998 elf_section_data (sec)->this_hdr.contents = contents;
999 free_contents = NULL;
1001 free_extsyms = NULL;
1003 /* Fix the opcode. */
1004 bfd_put_8 (abfd, 0xf8 + (code & 0x03),
1005 contents + irel->r_offset - 2);
1007 /* Fix the relocation's type. */
1008 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1009 R_MN10200_16);
1011 /* The opcode got shorter too, so we have to fix the
1012 offset. */
1013 irel->r_offset -= 1;
1015 /* Delete two bytes of data. */
1016 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1017 irel->r_offset + 1, 2))
1018 goto error_return;
1020 /* That will change things, so, we should relax again.
1021 Note that this is not required, and it may be slow. */
1022 *again = true;
1023 break;
1025 /* mov imm24,an -> mov imm16,an
1026 cmp imm24,an -> cmp imm16,an
1027 mov (abs24),dn -> mov (abs16),dn
1028 mov dn,(abs24) -> mov dn,(abs16)
1029 movb dn,(abs24) -> movb dn,(abs16)
1030 movbu (abs24),dn -> movbu (abs16),dn */
1031 case 0x74:
1032 case 0x7c:
1033 case 0xc0:
1034 case 0x40:
1035 case 0x44:
1036 case 0xc8:
1037 /* Note that we've changed the reldection contents, etc. */
1038 elf_section_data (sec)->relocs = internal_relocs;
1039 free_relocs = NULL;
1041 elf_section_data (sec)->this_hdr.contents = contents;
1042 free_contents = NULL;
1044 free_extsyms = NULL;
1046 if ((code & 0xfc) == 0x74)
1047 code = 0xdc + (code & 0x03);
1048 else if ((code & 0xfc) == 0x7c)
1049 code = 0xec + (code & 0x03);
1050 else if ((code & 0xfc) == 0xc0)
1051 code = 0xc8 + (code & 0x03);
1052 else if ((code & 0xfc) == 0x40)
1053 code = 0xc0 + (code & 0x03);
1054 else if ((code & 0xfc) == 0x44)
1055 code = 0xc4 + (code & 0x03);
1056 else if ((code & 0xfc) == 0xc8)
1057 code = 0xcc + (code & 0x03);
1059 /* Fix the opcode. */
1060 bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
1062 /* Fix the relocation's type. */
1063 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1064 R_MN10200_16);
1066 /* The opcode got shorter too, so we have to fix the
1067 offset. */
1068 irel->r_offset -= 1;
1070 /* Delete two bytes of data. */
1071 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1072 irel->r_offset + 1, 2))
1073 goto error_return;
1075 /* That will change things, so, we should relax again.
1076 Note that this is not required, and it may be slow. */
1077 *again = true;
1078 break;
1080 /* cmp imm24,dn -> cmp imm16,dn
1081 mov (abs24),an -> mov (abs16),an
1082 mov an,(abs24) -> mov an,(abs16)
1083 add imm24,dn -> add imm16,dn
1084 add imm24,an -> add imm16,an
1085 sub imm24,dn -> sub imm16,dn
1086 sub imm24,an -> sub imm16,an
1087 And all d24->d16 in memory ops. */
1088 case 0x78:
1089 case 0xd0:
1090 case 0x50:
1091 case 0x60:
1092 case 0x64:
1093 case 0x68:
1094 case 0x6c:
1095 case 0x80:
1096 case 0xf0:
1097 case 0x00:
1098 case 0x10:
1099 case 0xb0:
1100 case 0x30:
1101 case 0xa0:
1102 case 0x20:
1103 case 0x90:
1104 /* Not safe if the high bit is on as relaxing may
1105 move the value out of high mem and thus not fit
1106 in a signed 16bit value. */
1107 if (((code & 0xfc) == 0x78
1108 || (code & 0xfc) == 0x60
1109 || (code & 0xfc) == 0x64
1110 || (code & 0xfc) == 0x68
1111 || (code & 0xfc) == 0x6c
1112 || (code & 0xfc) == 0x80
1113 || (code & 0xfc) == 0xf0
1114 || (code & 0xfc) == 0x00
1115 || (code & 0xfc) == 0x10
1116 || (code & 0xfc) == 0xb0
1117 || (code & 0xfc) == 0x30
1118 || (code & 0xfc) == 0xa0
1119 || (code & 0xfc) == 0x20
1120 || (code & 0xfc) == 0x90)
1121 && (value & 0x8000) != 0)
1122 continue;
1124 /* Note that we've changed the reldection contents, etc. */
1125 elf_section_data (sec)->relocs = internal_relocs;
1126 free_relocs = NULL;
1128 elf_section_data (sec)->this_hdr.contents = contents;
1129 free_contents = NULL;
1131 free_extsyms = NULL;
1133 /* Fix the opcode. */
1134 bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2);
1136 if ((code & 0xfc) == 0x78)
1137 code = 0x48 + (code & 0x03);
1138 else if ((code & 0xfc) == 0xd0)
1139 code = 0x30 + (code & 0x03);
1140 else if ((code & 0xfc) == 0x50)
1141 code = 0x20 + (code & 0x03);
1142 else if ((code & 0xfc) == 0x60)
1143 code = 0x18 + (code & 0x03);
1144 else if ((code & 0xfc) == 0x64)
1145 code = 0x08 + (code & 0x03);
1146 else if ((code & 0xfc) == 0x68)
1147 code = 0x1c + (code & 0x03);
1148 else if ((code & 0xfc) == 0x6c)
1149 code = 0x0c + (code & 0x03);
1150 else if ((code & 0xfc) == 0x80)
1151 code = 0xc0 + (code & 0x07);
1152 else if ((code & 0xfc) == 0xf0)
1153 code = 0xb0 + (code & 0x07);
1154 else if ((code & 0xfc) == 0x00)
1155 code = 0x80 + (code & 0x07);
1156 else if ((code & 0xfc) == 0x10)
1157 code = 0xa0 + (code & 0x07);
1158 else if ((code & 0xfc) == 0xb0)
1159 code = 0x70 + (code & 0x07);
1160 else if ((code & 0xfc) == 0x30)
1161 code = 0x60 + (code & 0x07);
1162 else if ((code & 0xfc) == 0xa0)
1163 code = 0xd0 + (code & 0x07);
1164 else if ((code & 0xfc) == 0x20)
1165 code = 0x90 + (code & 0x07);
1166 else if ((code & 0xfc) == 0x90)
1167 code = 0x50 + (code & 0x07);
1169 bfd_put_8 (abfd, code, contents + irel->r_offset - 1);
1171 /* Fix the relocation's type. */
1172 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1173 R_MN10200_16);
1175 /* Delete one bytes of data. */
1176 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1177 irel->r_offset + 2, 1))
1178 goto error_return;
1180 /* That will change things, so, we should relax again.
1181 Note that this is not required, and it may be slow. */
1182 *again = true;
1183 break;
1185 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1186 case 0xc4:
1187 /* Note that we've changed the reldection contents, etc. */
1188 elf_section_data (sec)->relocs = internal_relocs;
1189 free_relocs = NULL;
1191 elf_section_data (sec)->this_hdr.contents = contents;
1192 free_contents = NULL;
1194 free_extsyms = NULL;
1196 bfd_put_8 (abfd, 0xcc + (code & 0x03),
1197 contents + irel->r_offset - 2);
1199 bfd_put_8 (abfd, 0xb8 + (code & 0x03),
1200 contents + irel->r_offset - 1);
1202 /* Fix the relocation's type. */
1203 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1204 R_MN10200_16);
1206 /* The reloc will be applied one byte in front of its
1207 current location. */
1208 irel->r_offset -= 1;
1210 /* Delete one bytes of data. */
1211 if (!mn10200_elf_relax_delete_bytes (abfd, sec,
1212 irel->r_offset + 2, 1))
1213 goto error_return;
1215 /* That will change things, so, we should relax again.
1216 Note that this is not required, and it may be slow. */
1217 *again = true;
1218 break;
1224 if (free_relocs != NULL)
1225 free (free_relocs);
1227 if (free_contents != NULL)
1229 if (! link_info->keep_memory)
1230 free (free_contents);
1231 else
1233 /* Cache the section contents for elf_link_input_bfd. */
1234 elf_section_data (sec)->this_hdr.contents = contents;
1238 if (shndx_buf != NULL)
1240 shndx_hdr->contents = NULL;
1241 free (shndx_buf);
1244 if (free_extsyms != NULL)
1246 if (! link_info->keep_memory)
1248 symtab_hdr->contents = NULL;
1249 free (free_extsyms);
1253 return true;
1255 error_return:
1256 if (free_relocs != NULL)
1257 free (free_relocs);
1258 if (free_contents != NULL)
1259 free (free_contents);
1260 if (shndx_buf != NULL)
1262 shndx_hdr->contents = NULL;
1263 free (shndx_buf);
1265 if (free_extsyms != NULL)
1267 symtab_hdr->contents = NULL;
1268 free (free_extsyms);
1271 return false;
1274 /* Delete some bytes from a section while relaxing. */
1276 static boolean
1277 mn10200_elf_relax_delete_bytes (abfd, sec, addr, count)
1278 bfd *abfd;
1279 asection *sec;
1280 bfd_vma addr;
1281 int count;
1283 Elf_Internal_Shdr *symtab_hdr;
1284 Elf_Internal_Shdr *shndx_hdr;
1285 Elf32_External_Sym *extsyms;
1286 unsigned int sec_shndx;
1287 bfd_byte *contents;
1288 Elf_Internal_Rela *irel, *irelend;
1289 Elf_Internal_Rela *irelalign;
1290 bfd_vma toaddr;
1291 Elf32_External_Sym *esym, *esymend;
1292 Elf_External_Sym_Shndx *shndx;
1293 struct elf_link_hash_entry **sym_hashes;
1294 struct elf_link_hash_entry **end_hashes;
1295 unsigned int symcount;
1297 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1298 extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1300 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1302 contents = elf_section_data (sec)->this_hdr.contents;
1304 /* The deletion must stop at the next ALIGN reloc for an aligment
1305 power larger than the number of bytes we are deleting. */
1307 irelalign = NULL;
1308 toaddr = sec->_cooked_size;
1310 irel = elf_section_data (sec)->relocs;
1311 irelend = irel + sec->reloc_count;
1313 /* Actually delete the bytes. */
1314 memmove (contents + addr, contents + addr + count,
1315 (size_t) (toaddr - addr - count));
1316 sec->_cooked_size -= count;
1318 /* Adjust all the relocs. */
1319 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1321 /* Get the new reloc address. */
1322 if ((irel->r_offset > addr
1323 && irel->r_offset < toaddr))
1324 irel->r_offset -= count;
1327 /* Adjust the local symbols defined in this section. */
1328 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1329 shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
1330 esym = extsyms;
1331 esymend = esym + symtab_hdr->sh_info;
1332 for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
1334 Elf_Internal_Sym isym;
1335 Elf_External_Sym_Shndx dummy;
1337 bfd_elf32_swap_symbol_in (abfd, esym, shndx, &isym);
1339 if (isym.st_shndx == sec_shndx
1340 && isym.st_value > addr
1341 && isym.st_value < toaddr)
1343 isym.st_value -= count;
1344 bfd_elf32_swap_symbol_out (abfd, &isym, (PTR) esym, (PTR) &dummy);
1348 /* Now adjust the global symbols defined in this section. */
1349 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1350 - symtab_hdr->sh_info);
1351 sym_hashes = elf_sym_hashes (abfd);
1352 end_hashes = sym_hashes + symcount;
1353 for (; sym_hashes < end_hashes; sym_hashes++)
1355 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1356 if ((sym_hash->root.type == bfd_link_hash_defined
1357 || sym_hash->root.type == bfd_link_hash_defweak)
1358 && sym_hash->root.u.def.section == sec
1359 && sym_hash->root.u.def.value > addr
1360 && sym_hash->root.u.def.value < toaddr)
1362 sym_hash->root.u.def.value -= count;
1366 return true;
1369 /* Return true if a symbol exists at the given address, else return
1370 false. */
1371 static boolean
1372 mn10200_elf_symbol_address_p (abfd, sec, addr)
1373 bfd *abfd;
1374 asection *sec;
1375 bfd_vma addr;
1377 Elf_Internal_Shdr *symtab_hdr;
1378 Elf_Internal_Shdr *shndx_hdr;
1379 unsigned int sec_shndx;
1380 Elf32_External_Sym *esym, *esymend;
1381 Elf_External_Sym_Shndx *shndx;
1382 struct elf_link_hash_entry **sym_hashes;
1383 struct elf_link_hash_entry **end_hashes;
1384 unsigned int symcount;
1386 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1388 /* Examine all the symbols. */
1389 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1390 shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
1391 shndx = (Elf_External_Sym_Shndx *) shndx_hdr->contents;
1392 esym = (Elf32_External_Sym *) symtab_hdr->contents;
1393 esymend = esym + symtab_hdr->sh_info;
1394 for (; esym < esymend; esym++, shndx = (shndx ? shndx + 1 : NULL))
1396 Elf_Internal_Sym isym;
1398 bfd_elf32_swap_symbol_in (abfd, esym, shndx, &isym);
1400 if (isym.st_shndx == sec_shndx
1401 && isym.st_value == addr)
1402 return true;
1405 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1406 - symtab_hdr->sh_info);
1407 sym_hashes = elf_sym_hashes (abfd);
1408 end_hashes = sym_hashes + symcount;
1409 for (; sym_hashes < end_hashes; sym_hashes++)
1411 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1412 if ((sym_hash->root.type == bfd_link_hash_defined
1413 || sym_hash->root.type == bfd_link_hash_defweak)
1414 && sym_hash->root.u.def.section == sec
1415 && sym_hash->root.u.def.value == addr)
1416 return true;
1419 return false;
1422 /* This is a version of bfd_generic_get_relocated_section_contents
1423 which uses mn10200_elf_relocate_section. */
1425 static bfd_byte *
1426 mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
1427 data, relocateable, symbols)
1428 bfd *output_bfd;
1429 struct bfd_link_info *link_info;
1430 struct bfd_link_order *link_order;
1431 bfd_byte *data;
1432 boolean relocateable;
1433 asymbol **symbols;
1435 Elf_Internal_Shdr *symtab_hdr;
1436 Elf_Internal_Shdr *shndx_hdr;
1437 asection *input_section = link_order->u.indirect.section;
1438 bfd *input_bfd = input_section->owner;
1439 asection **sections = NULL;
1440 Elf_Internal_Rela *internal_relocs = NULL;
1441 Elf32_External_Sym *external_syms = NULL;
1442 Elf_External_Sym_Shndx *shndx_buf = NULL;
1443 Elf_External_Sym_Shndx *shndx;
1444 Elf_Internal_Sym *internal_syms = NULL;
1446 /* We only need to handle the case of relaxing, or of having a
1447 particular set of section contents, specially. */
1448 if (relocateable
1449 || elf_section_data (input_section)->this_hdr.contents == NULL)
1450 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1451 link_order, data,
1452 relocateable,
1453 symbols);
1455 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1456 shndx_hdr = &elf_tdata (input_bfd)->symtab_shndx_hdr;
1458 memcpy (data, elf_section_data (input_section)->this_hdr.contents,
1459 (size_t) input_section->_raw_size);
1461 if ((input_section->flags & SEC_RELOC) != 0
1462 && input_section->reloc_count > 0)
1464 Elf_Internal_Sym *isymp;
1465 asection **secpp;
1466 Elf32_External_Sym *esym, *esymend;
1467 bfd_size_type amt;
1469 if (symtab_hdr->contents != NULL)
1470 external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
1471 else if (symtab_hdr->sh_info != 0)
1473 amt = symtab_hdr->sh_info;
1474 amt *= sizeof (Elf32_External_Sym);
1475 external_syms = (Elf32_External_Sym *) bfd_malloc (amt);
1476 if (external_syms == NULL)
1477 goto error_return;
1478 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1479 || bfd_bread ((PTR) external_syms, amt, input_bfd) != amt)
1480 goto error_return;
1483 if (symtab_hdr->sh_info != 0 && shndx_hdr->sh_size != 0)
1485 amt = symtab_hdr->sh_info;
1486 amt *= sizeof (Elf_External_Sym_Shndx);
1487 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
1488 if (shndx_buf == NULL)
1489 goto error_return;
1490 if (bfd_seek (input_bfd, shndx_hdr->sh_offset, SEEK_SET) != 0
1491 || bfd_bread ((PTR) shndx_buf, amt, input_bfd) != amt)
1492 goto error_return;
1495 internal_relocs = (_bfd_elf32_link_read_relocs
1496 (input_bfd, input_section, (PTR) NULL,
1497 (Elf_Internal_Rela *) NULL, false));
1498 if (internal_relocs == NULL)
1499 goto error_return;
1501 amt = symtab_hdr->sh_info;
1502 amt *= sizeof (Elf_Internal_Sym);
1503 internal_syms = (Elf_Internal_Sym *) bfd_malloc (amt);
1504 if (internal_syms == NULL && amt != 0)
1505 goto error_return;
1507 amt = symtab_hdr->sh_info;
1508 amt *= sizeof (asection *);
1509 sections = (asection **) bfd_malloc (amt);
1510 if (sections == NULL && amt != 0)
1511 goto error_return;
1513 for (isymp = internal_syms, secpp = sections, shndx = shndx_buf,
1514 esym = external_syms, esymend = esym + symtab_hdr->sh_info;
1515 esym < esymend;
1516 ++esym, ++isymp, ++secpp, shndx = (shndx ? shndx + 1 : NULL))
1518 asection *isec;
1520 bfd_elf32_swap_symbol_in (input_bfd, esym, shndx, isymp);
1522 if (isymp->st_shndx == SHN_UNDEF)
1523 isec = bfd_und_section_ptr;
1524 else if (isymp->st_shndx == SHN_ABS)
1525 isec = bfd_abs_section_ptr;
1526 else if (isymp->st_shndx == SHN_COMMON)
1527 isec = bfd_com_section_ptr;
1528 else
1529 isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
1531 *secpp = isec;
1534 if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd,
1535 input_section, data, internal_relocs,
1536 internal_syms, sections))
1537 goto error_return;
1539 if (sections != NULL)
1540 free (sections);
1541 if (internal_syms != NULL)
1542 free (internal_syms);
1543 if (shndx_buf != NULL)
1544 free (shndx_buf);
1545 if (external_syms != NULL && symtab_hdr->contents == NULL)
1546 free (external_syms);
1547 if (internal_relocs != elf_section_data (input_section)->relocs)
1548 free (internal_relocs);
1551 return data;
1553 error_return:
1554 if (internal_relocs != NULL
1555 && internal_relocs != elf_section_data (input_section)->relocs)
1556 free (internal_relocs);
1557 if (shndx_buf != NULL)
1558 free (shndx_buf);
1559 if (external_syms != NULL && symtab_hdr->contents == NULL)
1560 free (external_syms);
1561 if (internal_syms != NULL)
1562 free (internal_syms);
1563 if (sections != NULL)
1564 free (sections);
1565 return NULL;
1568 #define TARGET_LITTLE_SYM bfd_elf32_mn10200_vec
1569 #define TARGET_LITTLE_NAME "elf32-mn10200"
1570 #define ELF_ARCH bfd_arch_mn10200
1571 #define ELF_MACHINE_CODE EM_MN10200
1572 #define ELF_MACHINE_ALT1 EM_CYGNUS_MN10200
1573 #define ELF_MAXPAGESIZE 0x1000
1575 #define elf_info_to_howto mn10200_info_to_howto
1576 #define elf_info_to_howto_rel 0
1577 #define elf_backend_relocate_section mn10200_elf_relocate_section
1578 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section
1579 #define bfd_elf32_bfd_get_relocated_section_contents \
1580 mn10200_elf_get_relocated_section_contents
1582 #define elf_symbol_leading_char '_'
1584 #include "elf32-target.h"