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