1 /* Matsushita 10200 specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
26 static reloc_howto_type
*bfd_elf32_bfd_reloc_type_lookup
27 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
28 static void mn10200_info_to_howto
29 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
30 static bfd_boolean mn10200_elf_relax_delete_bytes
31 PARAMS ((bfd
*, asection
*, bfd_vma
, int));
32 static bfd_boolean mn10200_elf_symbol_address_p
33 PARAMS ((bfd
*, asection
*, Elf_Internal_Sym
*, bfd_vma
));
34 static bfd_reloc_status_type mn10200_elf_final_link_relocate
35 PARAMS ((reloc_howto_type
*, bfd
*, bfd
*, asection
*,
36 bfd_byte
*, bfd_vma
, bfd_vma
, bfd_vma
,
37 struct bfd_link_info
*, asection
*, int));
38 static bfd_boolean mn10200_elf_relocate_section
39 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*,
40 bfd_byte
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*,
42 static bfd_boolean mn10200_elf_relax_section
43 PARAMS ((bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*));
44 static bfd_byte
* mn10200_elf_get_relocated_section_contents
45 PARAMS ((bfd
*, struct bfd_link_info
*, struct bfd_link_order
*,
46 bfd_byte
*, bfd_boolean
, asymbol
**));
60 static reloc_howto_type elf_mn10200_howto_table
[] = {
61 /* Dummy relocation. Does nothing. */
62 HOWTO (R_MN10200_NONE
,
68 complain_overflow_bitfield
,
69 bfd_elf_generic_reloc
,
75 /* Standard 32 bit reloc. */
82 complain_overflow_bitfield
,
83 bfd_elf_generic_reloc
,
89 /* Standard 16 bit reloc. */
96 complain_overflow_bitfield
,
97 bfd_elf_generic_reloc
,
103 /* Standard 8 bit reloc. */
110 complain_overflow_bitfield
,
111 bfd_elf_generic_reloc
,
117 /* Standard 24 bit reloc. */
124 complain_overflow_bitfield
,
125 bfd_elf_generic_reloc
,
131 /* Simple 8 pc-relative reloc. */
132 HOWTO (R_MN10200_PCREL8
,
138 complain_overflow_bitfield
,
139 bfd_elf_generic_reloc
,
145 /* Simple 16 pc-relative reloc. */
146 HOWTO (R_MN10200_PCREL16
,
152 complain_overflow_bitfield
,
153 bfd_elf_generic_reloc
,
159 /* Simple 32bit pc-relative reloc with a 1 byte adjustment
160 to get the pc-relative offset correct. */
161 HOWTO (R_MN10200_PCREL24
,
167 complain_overflow_bitfield
,
168 bfd_elf_generic_reloc
,
176 struct mn10200_reloc_map
{
177 bfd_reloc_code_real_type bfd_reloc_val
;
178 unsigned char elf_reloc_val
;
181 static const struct mn10200_reloc_map mn10200_reloc_map
[] = {
182 { BFD_RELOC_NONE
, R_MN10200_NONE
, },
183 { BFD_RELOC_32
, R_MN10200_32
, },
184 { BFD_RELOC_16
, R_MN10200_16
, },
185 { BFD_RELOC_8
, R_MN10200_8
, },
186 { BFD_RELOC_24
, R_MN10200_24
, },
187 { BFD_RELOC_8_PCREL
, R_MN10200_PCREL8
, },
188 { BFD_RELOC_16_PCREL
, R_MN10200_PCREL16
, },
189 { BFD_RELOC_24_PCREL
, R_MN10200_PCREL24
, },
192 static reloc_howto_type
*
193 bfd_elf32_bfd_reloc_type_lookup (abfd
, code
)
194 bfd
*abfd ATTRIBUTE_UNUSED
;
195 bfd_reloc_code_real_type code
;
200 i
< sizeof (mn10200_reloc_map
) / sizeof (struct mn10200_reloc_map
);
203 if (mn10200_reloc_map
[i
].bfd_reloc_val
== code
)
204 return &elf_mn10200_howto_table
[mn10200_reloc_map
[i
].elf_reloc_val
];
210 /* Set the howto pointer for an MN10200 ELF reloc. */
213 mn10200_info_to_howto (abfd
, cache_ptr
, dst
)
214 bfd
*abfd ATTRIBUTE_UNUSED
;
216 Elf_Internal_Rela
*dst
;
220 r_type
= ELF32_R_TYPE (dst
->r_info
);
221 BFD_ASSERT (r_type
< (unsigned int) R_MN10200_MAX
);
222 cache_ptr
->howto
= &elf_mn10200_howto_table
[r_type
];
225 /* Perform a relocation as part of a final link. */
227 static bfd_reloc_status_type
228 mn10200_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
229 input_section
, contents
, offset
, value
,
230 addend
, info
, sym_sec
, is_local
)
231 reloc_howto_type
*howto
;
233 bfd
*output_bfd ATTRIBUTE_UNUSED
;
234 asection
*input_section
;
239 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
240 asection
*sym_sec ATTRIBUTE_UNUSED
;
241 int is_local ATTRIBUTE_UNUSED
;
243 unsigned long r_type
= howto
->type
;
244 bfd_byte
*hit_data
= contents
+ offset
;
254 bfd_put_32 (input_bfd
, value
, hit_data
);
260 if ((long) value
> 0x7fff || (long) value
< -0x8000)
261 return bfd_reloc_overflow
;
263 bfd_put_16 (input_bfd
, value
, hit_data
);
269 if ((long) value
> 0x7f || (long) value
< -0x80)
270 return bfd_reloc_overflow
;
272 bfd_put_8 (input_bfd
, value
, hit_data
);
278 if ((long) value
> 0x7fffff || (long) value
< -0x800000)
279 return bfd_reloc_overflow
;
282 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
283 bfd_put_32 (input_bfd
, value
, hit_data
);
286 case R_MN10200_PCREL8
:
287 value
-= (input_section
->output_section
->vma
288 + input_section
->output_offset
);
289 value
-= (offset
+ 1);
292 if ((long) value
> 0xff || (long) value
< -0x100)
293 return bfd_reloc_overflow
;
295 bfd_put_8 (input_bfd
, value
, hit_data
);
298 case R_MN10200_PCREL16
:
299 value
-= (input_section
->output_section
->vma
300 + input_section
->output_offset
);
301 value
-= (offset
+ 2);
304 if ((long) value
> 0xffff || (long) value
< -0x10000)
305 return bfd_reloc_overflow
;
307 bfd_put_16 (input_bfd
, value
, hit_data
);
310 case R_MN10200_PCREL24
:
311 value
-= (input_section
->output_section
->vma
312 + input_section
->output_offset
);
313 value
-= (offset
+ 3);
316 if ((long) value
> 0xffffff || (long) value
< -0x1000000)
317 return bfd_reloc_overflow
;
320 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
321 bfd_put_32 (input_bfd
, value
, hit_data
);
325 return bfd_reloc_notsupported
;
329 /* Relocate an MN10200 ELF section. */
331 mn10200_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
332 contents
, relocs
, local_syms
, local_sections
)
334 struct bfd_link_info
*info
;
336 asection
*input_section
;
338 Elf_Internal_Rela
*relocs
;
339 Elf_Internal_Sym
*local_syms
;
340 asection
**local_sections
;
342 Elf_Internal_Shdr
*symtab_hdr
;
343 struct elf_link_hash_entry
**sym_hashes
;
344 Elf_Internal_Rela
*rel
, *relend
;
346 if (info
->relocatable
)
349 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
350 sym_hashes
= elf_sym_hashes (input_bfd
);
353 relend
= relocs
+ input_section
->reloc_count
;
354 for (; rel
< relend
; rel
++)
357 reloc_howto_type
*howto
;
358 unsigned long r_symndx
;
359 Elf_Internal_Sym
*sym
;
361 struct elf_link_hash_entry
*h
;
363 bfd_reloc_status_type r
;
365 r_symndx
= ELF32_R_SYM (rel
->r_info
);
366 r_type
= ELF32_R_TYPE (rel
->r_info
);
367 howto
= elf_mn10200_howto_table
+ r_type
;
372 if (r_symndx
< symtab_hdr
->sh_info
)
374 sym
= local_syms
+ r_symndx
;
375 sec
= local_sections
[r_symndx
];
376 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
380 bfd_boolean unresolved_reloc
, warned
;
382 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
383 r_symndx
, symtab_hdr
, sym_hashes
,
385 unresolved_reloc
, warned
);
388 r
= mn10200_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
390 contents
, rel
->r_offset
,
391 relocation
, rel
->r_addend
,
392 info
, sec
, h
== NULL
);
394 if (r
!= bfd_reloc_ok
)
397 const char *msg
= (const char *) 0;
400 name
= h
->root
.root
.string
;
403 name
= (bfd_elf_string_from_elf_section
404 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
405 if (name
== NULL
|| *name
== '\0')
406 name
= bfd_section_name (input_bfd
, sec
);
411 case bfd_reloc_overflow
:
412 if (! ((*info
->callbacks
->reloc_overflow
)
413 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
414 (bfd_vma
) 0, input_bfd
, input_section
,
419 case bfd_reloc_undefined
:
420 if (! ((*info
->callbacks
->undefined_symbol
)
421 (info
, name
, input_bfd
, input_section
,
422 rel
->r_offset
, TRUE
)))
426 case bfd_reloc_outofrange
:
427 msg
= _("internal error: out of range error");
430 case bfd_reloc_notsupported
:
431 msg
= _("internal error: unsupported relocation error");
434 case bfd_reloc_dangerous
:
435 msg
= _("internal error: dangerous error");
439 msg
= _("internal error: unknown error");
443 if (!((*info
->callbacks
->warning
)
444 (info
, msg
, name
, input_bfd
, input_section
,
455 /* This function handles relaxing for the mn10200.
457 There are quite a few relaxing opportunities available on the mn10200:
459 * jsr:24 -> jsr:16 2 bytes
461 * jmp:24 -> jmp:16 2 bytes
462 * jmp:16 -> bra:8 1 byte
464 * If the previous instruction is a conditional branch
465 around the jump/bra, we may be able to reverse its condition
466 and change its target to the jump's target. The jump/bra
467 can then be deleted. 2 bytes
469 * mov abs24 -> mov abs16 2 byte savings
471 * Most instructions which accept imm24 can relax to imm16 2 bytes
472 - Most instructions which accept imm16 can relax to imm8 1 byte
474 * Most instructions which accept d24 can relax to d16 2 bytes
475 - Most instructions which accept d16 can relax to d8 1 byte
477 abs24, imm24, d24 all look the same at the reloc level. It
478 might make the code simpler if we had different relocs for
479 the various relaxable operand types.
481 We don't handle imm16->imm8 or d16->d8 as they're very rare
482 and somewhat more difficult to support. */
485 mn10200_elf_relax_section (abfd
, sec
, link_info
, again
)
488 struct bfd_link_info
*link_info
;
491 Elf_Internal_Shdr
*symtab_hdr
;
492 Elf_Internal_Rela
*internal_relocs
;
493 Elf_Internal_Rela
*irel
, *irelend
;
494 bfd_byte
*contents
= NULL
;
495 Elf_Internal_Sym
*isymbuf
= NULL
;
497 /* Assume nothing changes. */
500 /* We don't have to do anything for a relocatable link, if
501 this section does not have relocs, or if this is not a
503 if (link_info
->relocatable
504 || (sec
->flags
& SEC_RELOC
) == 0
505 || sec
->reloc_count
== 0
506 || (sec
->flags
& SEC_CODE
) == 0)
509 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
511 /* Get a copy of the native relocations. */
512 internal_relocs
= (_bfd_elf_link_read_relocs
513 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
514 link_info
->keep_memory
));
515 if (internal_relocs
== NULL
)
518 /* Walk through them looking for relaxing opportunities. */
519 irelend
= internal_relocs
+ sec
->reloc_count
;
520 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
524 /* If this isn't something that can be relaxed, then ignore
526 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_NONE
527 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_8
528 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_MAX
)
531 /* Get the section contents if we haven't done so already. */
532 if (contents
== NULL
)
534 /* Get cached copy if it exists. */
535 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
536 contents
= elf_section_data (sec
)->this_hdr
.contents
;
539 /* Go get them off disk. */
540 if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
545 /* Read this BFD's local symbols if we haven't done so already. */
546 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
548 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
550 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
551 symtab_hdr
->sh_info
, 0,
557 /* Get the value of the symbol referred to by the reloc. */
558 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
560 /* A local symbol. */
561 Elf_Internal_Sym
*isym
;
564 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
565 if (isym
->st_shndx
== SHN_UNDEF
)
566 sym_sec
= bfd_und_section_ptr
;
567 else if (isym
->st_shndx
== SHN_ABS
)
568 sym_sec
= bfd_abs_section_ptr
;
569 else if (isym
->st_shndx
== SHN_COMMON
)
570 sym_sec
= bfd_com_section_ptr
;
572 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
573 symval
= (isym
->st_value
574 + sym_sec
->output_section
->vma
575 + sym_sec
->output_offset
);
580 struct elf_link_hash_entry
*h
;
582 /* An external symbol. */
583 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
584 h
= elf_sym_hashes (abfd
)[indx
];
585 BFD_ASSERT (h
!= NULL
);
586 if (h
->root
.type
!= bfd_link_hash_defined
587 && h
->root
.type
!= bfd_link_hash_defweak
)
589 /* This appears to be a reference to an undefined
590 symbol. Just ignore it--it will be caught by the
591 regular reloc processing. */
595 symval
= (h
->root
.u
.def
.value
596 + h
->root
.u
.def
.section
->output_section
->vma
597 + h
->root
.u
.def
.section
->output_offset
);
600 /* For simplicity of coding, we are going to modify the section
601 contents, the section relocs, and the BFD symbol table. We
602 must tell the rest of the code not to free up this
603 information. It would be possible to instead create a table
604 of changes which have to be made, as is done in coff-mips.c;
605 that would be more work, but would require less memory when
606 the linker is run. */
608 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
610 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL24
)
612 bfd_vma value
= symval
;
614 /* Deal with pc-relative gunk. */
615 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
616 value
-= (irel
->r_offset
+ 3);
617 value
+= irel
->r_addend
;
619 /* See if the value will fit in 16 bits, note the high value is
620 0x7fff + 2 as the target will be two bytes closer if we are
622 if ((long) value
< 0x8001 && (long) value
> -0x8000)
626 /* Get the opcode. */
627 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
629 if (code
!= 0xe0 && code
!= 0xe1)
632 /* Note that we've changed the relocs, section contents, etc. */
633 elf_section_data (sec
)->relocs
= internal_relocs
;
634 elf_section_data (sec
)->this_hdr
.contents
= contents
;
635 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
637 /* Fix the opcode. */
639 bfd_put_8 (abfd
, 0xfc, contents
+ irel
->r_offset
- 2);
640 else if (code
== 0xe1)
641 bfd_put_8 (abfd
, 0xfd, contents
+ irel
->r_offset
- 2);
643 /* Fix the relocation's type. */
644 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
647 /* The opcode got shorter too, so we have to fix the offset. */
650 /* Delete two bytes of data. */
651 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
652 irel
->r_offset
+ 1, 2))
655 /* That will change things, so, we should relax again.
656 Note that this is not required, and it may be slow. */
661 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
663 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL16
)
665 bfd_vma value
= symval
;
667 /* Deal with pc-relative gunk. */
668 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
669 value
-= (irel
->r_offset
+ 2);
670 value
+= irel
->r_addend
;
672 /* See if the value will fit in 8 bits, note the high value is
673 0x7f + 1 as the target will be one bytes closer if we are
675 if ((long) value
< 0x80 && (long) value
> -0x80)
679 /* Get the opcode. */
680 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
685 /* Note that we've changed the relocs, section contents, etc. */
686 elf_section_data (sec
)->relocs
= internal_relocs
;
687 elf_section_data (sec
)->this_hdr
.contents
= contents
;
688 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
690 /* Fix the opcode. */
691 bfd_put_8 (abfd
, 0xea, contents
+ irel
->r_offset
- 1);
693 /* Fix the relocation's type. */
694 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
697 /* Delete one byte of data. */
698 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
699 irel
->r_offset
+ 1, 1))
702 /* That will change things, so, we should relax again.
703 Note that this is not required, and it may be slow. */
708 /* Try to eliminate an unconditional 8 bit pc-relative branch
709 which immediately follows a conditional 8 bit pc-relative
710 branch around the unconditional branch.
717 This happens when the bCC can't reach lab2 at assembly time,
718 but due to other relaxations it can reach at link time. */
719 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL8
)
721 Elf_Internal_Rela
*nrel
;
722 bfd_vma value
= symval
;
725 /* Deal with pc-relative gunk. */
726 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
727 value
-= (irel
->r_offset
+ 1);
728 value
+= irel
->r_addend
;
730 /* Do nothing if this reloc is the last byte in the section. */
731 if (irel
->r_offset
== sec
->size
)
734 /* See if the next instruction is an unconditional pc-relative
735 branch, more often than not this test will fail, so we
736 test it first to speed things up. */
737 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
741 /* Also make sure the next relocation applies to the next
742 instruction and that it's a pc-relative 8 bit branch. */
745 || irel
->r_offset
+ 2 != nrel
->r_offset
746 || ELF32_R_TYPE (nrel
->r_info
) != (int) R_MN10200_PCREL8
)
749 /* Make sure our destination immediately follows the
750 unconditional branch. */
751 if (symval
!= (sec
->output_section
->vma
+ sec
->output_offset
752 + irel
->r_offset
+ 3))
755 /* Now make sure we are a conditional branch. This may not
756 be necessary, but why take the chance.
758 Note these checks assume that R_MN10200_PCREL8 relocs
759 only occur on bCC and bCCx insns. If they occured
760 elsewhere, we'd need to know the start of this insn
761 for this check to be accurate. */
762 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
763 if (code
!= 0xe0 && code
!= 0xe1 && code
!= 0xe2
764 && code
!= 0xe3 && code
!= 0xe4 && code
!= 0xe5
765 && code
!= 0xe6 && code
!= 0xe7 && code
!= 0xe8
766 && code
!= 0xe9 && code
!= 0xec && code
!= 0xed
767 && code
!= 0xee && code
!= 0xef && code
!= 0xfc
768 && code
!= 0xfd && code
!= 0xfe && code
!= 0xff)
771 /* We also have to be sure there is no symbol/label
772 at the unconditional branch. */
773 if (mn10200_elf_symbol_address_p (abfd
, sec
, isymbuf
,
777 /* Note that we've changed the relocs, section contents, etc. */
778 elf_section_data (sec
)->relocs
= internal_relocs
;
779 elf_section_data (sec
)->this_hdr
.contents
= contents
;
780 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
782 /* Reverse the condition of the first branch. */
840 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
842 /* Set the reloc type and symbol for the first branch
843 from the second branch. */
844 irel
->r_info
= nrel
->r_info
;
846 /* Make the reloc for the second branch a null reloc. */
847 nrel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (nrel
->r_info
),
850 /* Delete two bytes of data. */
851 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
852 irel
->r_offset
+ 1, 2))
855 /* That will change things, so, we should relax again.
856 Note that this is not required, and it may be slow. */
860 /* Try to turn a 24bit immediate, displacement or absolute address
861 into a 16bit immediate, displacement or absolute address. */
862 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_24
)
864 bfd_vma value
= symval
;
866 /* See if the value will fit in 16 bits.
867 We allow any 16bit match here. We prune those we can't
869 if ((long) value
< 0x7fff && (long) value
> -0x8000)
873 /* All insns which have 24bit operands are 5 bytes long,
874 the first byte will always be 0xf4, but we double check
877 /* Get the first opcode. */
878 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
883 /* Get the second opcode. */
884 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
888 /* mov imm24,dn -> mov imm16,dn */
890 /* Not safe if the high bit is on as relaxing may
891 move the value out of high mem and thus not fit
892 in a signed 16bit value. */
896 /* Note that we've changed the relocation contents, etc. */
897 elf_section_data (sec
)->relocs
= internal_relocs
;
898 elf_section_data (sec
)->this_hdr
.contents
= contents
;
899 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
901 /* Fix the opcode. */
902 bfd_put_8 (abfd
, 0xf8 + (code
& 0x03),
903 contents
+ irel
->r_offset
- 2);
905 /* Fix the relocation's type. */
906 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
909 /* The opcode got shorter too, so we have to fix the
913 /* Delete two bytes of data. */
914 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
915 irel
->r_offset
+ 1, 2))
918 /* That will change things, so, we should relax again.
919 Note that this is not required, and it may be slow. */
923 /* mov imm24,an -> mov imm16,an
924 cmp imm24,an -> cmp imm16,an
925 mov (abs24),dn -> mov (abs16),dn
926 mov dn,(abs24) -> mov dn,(abs16)
927 movb dn,(abs24) -> movb dn,(abs16)
928 movbu (abs24),dn -> movbu (abs16),dn */
935 /* Note that we've changed the relocation contents, etc. */
936 elf_section_data (sec
)->relocs
= internal_relocs
;
937 elf_section_data (sec
)->this_hdr
.contents
= contents
;
938 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
940 if ((code
& 0xfc) == 0x74)
941 code
= 0xdc + (code
& 0x03);
942 else if ((code
& 0xfc) == 0x7c)
943 code
= 0xec + (code
& 0x03);
944 else if ((code
& 0xfc) == 0xc0)
945 code
= 0xc8 + (code
& 0x03);
946 else if ((code
& 0xfc) == 0x40)
947 code
= 0xc0 + (code
& 0x03);
948 else if ((code
& 0xfc) == 0x44)
949 code
= 0xc4 + (code
& 0x03);
950 else if ((code
& 0xfc) == 0xc8)
951 code
= 0xcc + (code
& 0x03);
953 /* Fix the opcode. */
954 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
956 /* Fix the relocation's type. */
957 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
960 /* The opcode got shorter too, so we have to fix the
964 /* Delete two bytes of data. */
965 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
966 irel
->r_offset
+ 1, 2))
969 /* That will change things, so, we should relax again.
970 Note that this is not required, and it may be slow. */
974 /* cmp imm24,dn -> cmp imm16,dn
975 mov (abs24),an -> mov (abs16),an
976 mov an,(abs24) -> mov an,(abs16)
977 add imm24,dn -> add imm16,dn
978 add imm24,an -> add imm16,an
979 sub imm24,dn -> sub imm16,dn
980 sub imm24,an -> sub imm16,an
981 And all d24->d16 in memory ops. */
998 /* Not safe if the high bit is on as relaxing may
999 move the value out of high mem and thus not fit
1000 in a signed 16bit value. */
1001 if (((code
& 0xfc) == 0x78
1002 || (code
& 0xfc) == 0x60
1003 || (code
& 0xfc) == 0x64
1004 || (code
& 0xfc) == 0x68
1005 || (code
& 0xfc) == 0x6c
1006 || (code
& 0xfc) == 0x80
1007 || (code
& 0xfc) == 0xf0
1008 || (code
& 0xfc) == 0x00
1009 || (code
& 0xfc) == 0x10
1010 || (code
& 0xfc) == 0xb0
1011 || (code
& 0xfc) == 0x30
1012 || (code
& 0xfc) == 0xa0
1013 || (code
& 0xfc) == 0x20
1014 || (code
& 0xfc) == 0x90)
1015 && (value
& 0x8000) != 0)
1018 /* Note that we've changed the relocation contents, etc. */
1019 elf_section_data (sec
)->relocs
= internal_relocs
;
1020 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1021 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1023 /* Fix the opcode. */
1024 bfd_put_8 (abfd
, 0xf7, contents
+ irel
->r_offset
- 2);
1026 if ((code
& 0xfc) == 0x78)
1027 code
= 0x48 + (code
& 0x03);
1028 else if ((code
& 0xfc) == 0xd0)
1029 code
= 0x30 + (code
& 0x03);
1030 else if ((code
& 0xfc) == 0x50)
1031 code
= 0x20 + (code
& 0x03);
1032 else if ((code
& 0xfc) == 0x60)
1033 code
= 0x18 + (code
& 0x03);
1034 else if ((code
& 0xfc) == 0x64)
1035 code
= 0x08 + (code
& 0x03);
1036 else if ((code
& 0xfc) == 0x68)
1037 code
= 0x1c + (code
& 0x03);
1038 else if ((code
& 0xfc) == 0x6c)
1039 code
= 0x0c + (code
& 0x03);
1040 else if ((code
& 0xfc) == 0x80)
1041 code
= 0xc0 + (code
& 0x07);
1042 else if ((code
& 0xfc) == 0xf0)
1043 code
= 0xb0 + (code
& 0x07);
1044 else if ((code
& 0xfc) == 0x00)
1045 code
= 0x80 + (code
& 0x07);
1046 else if ((code
& 0xfc) == 0x10)
1047 code
= 0xa0 + (code
& 0x07);
1048 else if ((code
& 0xfc) == 0xb0)
1049 code
= 0x70 + (code
& 0x07);
1050 else if ((code
& 0xfc) == 0x30)
1051 code
= 0x60 + (code
& 0x07);
1052 else if ((code
& 0xfc) == 0xa0)
1053 code
= 0xd0 + (code
& 0x07);
1054 else if ((code
& 0xfc) == 0x20)
1055 code
= 0x90 + (code
& 0x07);
1056 else if ((code
& 0xfc) == 0x90)
1057 code
= 0x50 + (code
& 0x07);
1059 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1061 /* Fix the relocation's type. */
1062 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1065 /* Delete one bytes of data. */
1066 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1067 irel
->r_offset
+ 2, 1))
1070 /* That will change things, so, we should relax again.
1071 Note that this is not required, and it may be slow. */
1075 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1077 /* Note that we've changed the reldection contents, etc. */
1078 elf_section_data (sec
)->relocs
= internal_relocs
;
1079 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1080 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1082 bfd_put_8 (abfd
, 0xcc + (code
& 0x03),
1083 contents
+ irel
->r_offset
- 2);
1085 bfd_put_8 (abfd
, 0xb8 + (code
& 0x03),
1086 contents
+ irel
->r_offset
- 1);
1088 /* Fix the relocation's type. */
1089 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1092 /* The reloc will be applied one byte in front of its
1093 current location. */
1094 irel
->r_offset
-= 1;
1096 /* Delete one bytes of data. */
1097 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1098 irel
->r_offset
+ 2, 1))
1101 /* That will change things, so, we should relax again.
1102 Note that this is not required, and it may be slow. */
1111 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1113 if (! link_info
->keep_memory
)
1117 /* Cache the symbols for elf_link_input_bfd. */
1118 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1122 if (contents
!= NULL
1123 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1125 if (! link_info
->keep_memory
)
1129 /* Cache the section contents for elf_link_input_bfd. */
1130 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1134 if (internal_relocs
!= NULL
1135 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1136 free (internal_relocs
);
1142 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1144 if (contents
!= NULL
1145 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1147 if (internal_relocs
!= NULL
1148 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1149 free (internal_relocs
);
1154 /* Delete some bytes from a section while relaxing. */
1157 mn10200_elf_relax_delete_bytes (abfd
, sec
, addr
, count
)
1163 Elf_Internal_Shdr
*symtab_hdr
;
1164 unsigned int sec_shndx
;
1166 Elf_Internal_Rela
*irel
, *irelend
;
1167 Elf_Internal_Rela
*irelalign
;
1169 Elf_Internal_Sym
*isym
;
1170 Elf_Internal_Sym
*isymend
;
1171 struct elf_link_hash_entry
**sym_hashes
;
1172 struct elf_link_hash_entry
**end_hashes
;
1173 unsigned int symcount
;
1175 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1177 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1179 /* The deletion must stop at the next ALIGN reloc for an aligment
1180 power larger than the number of bytes we are deleting. */
1185 irel
= elf_section_data (sec
)->relocs
;
1186 irelend
= irel
+ sec
->reloc_count
;
1188 /* Actually delete the bytes. */
1189 memmove (contents
+ addr
, contents
+ addr
+ count
,
1190 (size_t) (toaddr
- addr
- count
));
1193 /* Adjust all the relocs. */
1194 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1196 /* Get the new reloc address. */
1197 if ((irel
->r_offset
> addr
1198 && irel
->r_offset
< toaddr
))
1199 irel
->r_offset
-= count
;
1202 /* Adjust the local symbols defined in this section. */
1203 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1204 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1205 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1207 if (isym
->st_shndx
== sec_shndx
1208 && isym
->st_value
> addr
1209 && isym
->st_value
< toaddr
)
1210 isym
->st_value
-= count
;
1213 /* Now adjust the global symbols defined in this section. */
1214 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1215 - symtab_hdr
->sh_info
);
1216 sym_hashes
= elf_sym_hashes (abfd
);
1217 end_hashes
= sym_hashes
+ symcount
;
1218 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1220 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1221 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1222 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1223 && sym_hash
->root
.u
.def
.section
== sec
1224 && sym_hash
->root
.u
.def
.value
> addr
1225 && sym_hash
->root
.u
.def
.value
< toaddr
)
1227 sym_hash
->root
.u
.def
.value
-= count
;
1234 /* Return TRUE if a symbol exists at the given address, else return
1237 mn10200_elf_symbol_address_p (abfd
, sec
, isym
, addr
)
1240 Elf_Internal_Sym
*isym
;
1243 Elf_Internal_Shdr
*symtab_hdr
;
1244 unsigned int sec_shndx
;
1245 Elf_Internal_Sym
*isymend
;
1246 struct elf_link_hash_entry
**sym_hashes
;
1247 struct elf_link_hash_entry
**end_hashes
;
1248 unsigned int symcount
;
1250 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1252 /* Examine all the local symbols. */
1253 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1254 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1256 if (isym
->st_shndx
== sec_shndx
1257 && isym
->st_value
== addr
)
1261 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1262 - symtab_hdr
->sh_info
);
1263 sym_hashes
= elf_sym_hashes (abfd
);
1264 end_hashes
= sym_hashes
+ symcount
;
1265 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1267 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1268 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1269 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1270 && sym_hash
->root
.u
.def
.section
== sec
1271 && sym_hash
->root
.u
.def
.value
== addr
)
1278 /* This is a version of bfd_generic_get_relocated_section_contents
1279 which uses mn10200_elf_relocate_section. */
1282 mn10200_elf_get_relocated_section_contents (output_bfd
, link_info
, link_order
,
1283 data
, relocatable
, symbols
)
1285 struct bfd_link_info
*link_info
;
1286 struct bfd_link_order
*link_order
;
1288 bfd_boolean relocatable
;
1291 Elf_Internal_Shdr
*symtab_hdr
;
1292 asection
*input_section
= link_order
->u
.indirect
.section
;
1293 bfd
*input_bfd
= input_section
->owner
;
1294 asection
**sections
= NULL
;
1295 Elf_Internal_Rela
*internal_relocs
= NULL
;
1296 Elf_Internal_Sym
*isymbuf
= NULL
;
1298 /* We only need to handle the case of relaxing, or of having a
1299 particular set of section contents, specially. */
1301 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1302 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1307 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1309 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1310 (size_t) input_section
->size
);
1312 if ((input_section
->flags
& SEC_RELOC
) != 0
1313 && input_section
->reloc_count
> 0)
1315 Elf_Internal_Sym
*isym
;
1316 Elf_Internal_Sym
*isymend
;
1320 internal_relocs
= (_bfd_elf_link_read_relocs
1321 (input_bfd
, input_section
, (PTR
) NULL
,
1322 (Elf_Internal_Rela
*) NULL
, FALSE
));
1323 if (internal_relocs
== NULL
)
1326 if (symtab_hdr
->sh_info
!= 0)
1328 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1329 if (isymbuf
== NULL
)
1330 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
1331 symtab_hdr
->sh_info
, 0,
1333 if (isymbuf
== NULL
)
1337 amt
= symtab_hdr
->sh_info
;
1338 amt
*= sizeof (asection
*);
1339 sections
= (asection
**) bfd_malloc (amt
);
1340 if (sections
== NULL
&& amt
!= 0)
1343 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1344 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
1348 if (isym
->st_shndx
== SHN_UNDEF
)
1349 isec
= bfd_und_section_ptr
;
1350 else if (isym
->st_shndx
== SHN_ABS
)
1351 isec
= bfd_abs_section_ptr
;
1352 else if (isym
->st_shndx
== SHN_COMMON
)
1353 isec
= bfd_com_section_ptr
;
1355 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
1360 if (! mn10200_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
1361 input_section
, data
, internal_relocs
,
1365 if (sections
!= NULL
)
1368 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1370 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1371 free (internal_relocs
);
1377 if (sections
!= NULL
)
1380 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1382 if (internal_relocs
!= NULL
1383 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
1384 free (internal_relocs
);
1388 #define TARGET_LITTLE_SYM bfd_elf32_mn10200_vec
1389 #define TARGET_LITTLE_NAME "elf32-mn10200"
1390 #define ELF_ARCH bfd_arch_mn10200
1391 #define ELF_MACHINE_CODE EM_MN10200
1392 #define ELF_MACHINE_ALT1 EM_CYGNUS_MN10200
1393 #define ELF_MAXPAGESIZE 0x1000
1395 #define elf_backend_rela_normal 1
1396 #define elf_info_to_howto mn10200_info_to_howto
1397 #define elf_info_to_howto_rel 0
1398 #define elf_backend_relocate_section mn10200_elf_relocate_section
1399 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section
1400 #define bfd_elf32_bfd_get_relocated_section_contents \
1401 mn10200_elf_get_relocated_section_contents
1403 #define elf_symbol_leading_char '_'
1405 #include "elf32-target.h"