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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
, name
, howto
->name
, (bfd_vma
) 0,
414 input_bfd
, input_section
, rel
->r_offset
)))
418 case bfd_reloc_undefined
:
419 if (! ((*info
->callbacks
->undefined_symbol
)
420 (info
, name
, input_bfd
, input_section
,
421 rel
->r_offset
, TRUE
)))
425 case bfd_reloc_outofrange
:
426 msg
= _("internal error: out of range error");
429 case bfd_reloc_notsupported
:
430 msg
= _("internal error: unsupported relocation error");
433 case bfd_reloc_dangerous
:
434 msg
= _("internal error: dangerous error");
438 msg
= _("internal error: unknown error");
442 if (!((*info
->callbacks
->warning
)
443 (info
, msg
, name
, input_bfd
, input_section
,
454 /* This function handles relaxing for the mn10200.
456 There are quite a few relaxing opportunities available on the mn10200:
458 * jsr:24 -> jsr:16 2 bytes
460 * jmp:24 -> jmp:16 2 bytes
461 * jmp:16 -> bra:8 1 byte
463 * If the previous instruction is a conditional branch
464 around the jump/bra, we may be able to reverse its condition
465 and change its target to the jump's target. The jump/bra
466 can then be deleted. 2 bytes
468 * mov abs24 -> mov abs16 2 byte savings
470 * Most instructions which accept imm24 can relax to imm16 2 bytes
471 - Most instructions which accept imm16 can relax to imm8 1 byte
473 * Most instructions which accept d24 can relax to d16 2 bytes
474 - Most instructions which accept d16 can relax to d8 1 byte
476 abs24, imm24, d24 all look the same at the reloc level. It
477 might make the code simpler if we had different relocs for
478 the various relaxable operand types.
480 We don't handle imm16->imm8 or d16->d8 as they're very rare
481 and somewhat more difficult to support. */
484 mn10200_elf_relax_section (abfd
, sec
, link_info
, again
)
487 struct bfd_link_info
*link_info
;
490 Elf_Internal_Shdr
*symtab_hdr
;
491 Elf_Internal_Rela
*internal_relocs
;
492 Elf_Internal_Rela
*irel
, *irelend
;
493 bfd_byte
*contents
= NULL
;
494 Elf_Internal_Sym
*isymbuf
= NULL
;
496 /* Assume nothing changes. */
499 /* We don't have to do anything for a relocatable link, if
500 this section does not have relocs, or if this is not a
502 if (link_info
->relocatable
503 || (sec
->flags
& SEC_RELOC
) == 0
504 || sec
->reloc_count
== 0
505 || (sec
->flags
& SEC_CODE
) == 0)
508 /* If this is the first time we have been called for this section,
509 initialize the cooked size. */
510 if (sec
->_cooked_size
== 0)
511 sec
->_cooked_size
= sec
->_raw_size
;
513 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
515 /* Get a copy of the native relocations. */
516 internal_relocs
= (_bfd_elf_link_read_relocs
517 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
518 link_info
->keep_memory
));
519 if (internal_relocs
== NULL
)
522 /* Walk through them looking for relaxing opportunities. */
523 irelend
= internal_relocs
+ sec
->reloc_count
;
524 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
528 /* If this isn't something that can be relaxed, then ignore
530 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_NONE
531 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_8
532 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_MAX
)
535 /* Get the section contents if we haven't done so already. */
536 if (contents
== NULL
)
538 /* Get cached copy if it exists. */
539 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
540 contents
= elf_section_data (sec
)->this_hdr
.contents
;
543 /* Go get them off disk. */
544 contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
545 if (contents
== NULL
)
548 if (! bfd_get_section_contents (abfd
, sec
, contents
,
549 (file_ptr
) 0, sec
->_raw_size
))
554 /* Read this BFD's local symbols if we haven't done so already. */
555 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
557 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
559 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
560 symtab_hdr
->sh_info
, 0,
566 /* Get the value of the symbol referred to by the reloc. */
567 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
569 /* A local symbol. */
570 Elf_Internal_Sym
*isym
;
573 isym
= isymbuf
+ ELF32_R_SYM (irel
->r_info
);
574 if (isym
->st_shndx
== SHN_UNDEF
)
575 sym_sec
= bfd_und_section_ptr
;
576 else if (isym
->st_shndx
== SHN_ABS
)
577 sym_sec
= bfd_abs_section_ptr
;
578 else if (isym
->st_shndx
== SHN_COMMON
)
579 sym_sec
= bfd_com_section_ptr
;
581 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
582 symval
= (isym
->st_value
583 + sym_sec
->output_section
->vma
584 + sym_sec
->output_offset
);
589 struct elf_link_hash_entry
*h
;
591 /* An external symbol. */
592 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
593 h
= elf_sym_hashes (abfd
)[indx
];
594 BFD_ASSERT (h
!= NULL
);
595 if (h
->root
.type
!= bfd_link_hash_defined
596 && h
->root
.type
!= bfd_link_hash_defweak
)
598 /* This appears to be a reference to an undefined
599 symbol. Just ignore it--it will be caught by the
600 regular reloc processing. */
604 symval
= (h
->root
.u
.def
.value
605 + h
->root
.u
.def
.section
->output_section
->vma
606 + h
->root
.u
.def
.section
->output_offset
);
609 /* For simplicity of coding, we are going to modify the section
610 contents, the section relocs, and the BFD symbol table. We
611 must tell the rest of the code not to free up this
612 information. It would be possible to instead create a table
613 of changes which have to be made, as is done in coff-mips.c;
614 that would be more work, but would require less memory when
615 the linker is run. */
617 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
619 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL24
)
621 bfd_vma value
= symval
;
623 /* Deal with pc-relative gunk. */
624 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
625 value
-= (irel
->r_offset
+ 3);
626 value
+= irel
->r_addend
;
628 /* See if the value will fit in 16 bits, note the high value is
629 0x7fff + 2 as the target will be two bytes closer if we are
631 if ((long) value
< 0x8001 && (long) value
> -0x8000)
635 /* Get the opcode. */
636 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
638 if (code
!= 0xe0 && code
!= 0xe1)
641 /* Note that we've changed the relocs, section contents, etc. */
642 elf_section_data (sec
)->relocs
= internal_relocs
;
643 elf_section_data (sec
)->this_hdr
.contents
= contents
;
644 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
646 /* Fix the opcode. */
648 bfd_put_8 (abfd
, 0xfc, contents
+ irel
->r_offset
- 2);
649 else if (code
== 0xe1)
650 bfd_put_8 (abfd
, 0xfd, contents
+ irel
->r_offset
- 2);
652 /* Fix the relocation's type. */
653 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
656 /* The opcode got shorter too, so we have to fix the offset. */
659 /* Delete two bytes of data. */
660 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
661 irel
->r_offset
+ 1, 2))
664 /* That will change things, so, we should relax again.
665 Note that this is not required, and it may be slow. */
670 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
672 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL16
)
674 bfd_vma value
= symval
;
676 /* Deal with pc-relative gunk. */
677 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
678 value
-= (irel
->r_offset
+ 2);
679 value
+= irel
->r_addend
;
681 /* See if the value will fit in 8 bits, note the high value is
682 0x7f + 1 as the target will be one bytes closer if we are
684 if ((long) value
< 0x80 && (long) value
> -0x80)
688 /* Get the opcode. */
689 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
694 /* Note that we've changed the relocs, section contents, etc. */
695 elf_section_data (sec
)->relocs
= internal_relocs
;
696 elf_section_data (sec
)->this_hdr
.contents
= contents
;
697 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
699 /* Fix the opcode. */
700 bfd_put_8 (abfd
, 0xea, contents
+ irel
->r_offset
- 1);
702 /* Fix the relocation's type. */
703 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
706 /* Delete one byte of data. */
707 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
708 irel
->r_offset
+ 1, 1))
711 /* That will change things, so, we should relax again.
712 Note that this is not required, and it may be slow. */
717 /* Try to eliminate an unconditional 8 bit pc-relative branch
718 which immediately follows a conditional 8 bit pc-relative
719 branch around the unconditional branch.
726 This happens when the bCC can't reach lab2 at assembly time,
727 but due to other relaxations it can reach at link time. */
728 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL8
)
730 Elf_Internal_Rela
*nrel
;
731 bfd_vma value
= symval
;
734 /* Deal with pc-relative gunk. */
735 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
736 value
-= (irel
->r_offset
+ 1);
737 value
+= irel
->r_addend
;
739 /* Do nothing if this reloc is the last byte in the section. */
740 if (irel
->r_offset
== sec
->_cooked_size
)
743 /* See if the next instruction is an unconditional pc-relative
744 branch, more often than not this test will fail, so we
745 test it first to speed things up. */
746 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
750 /* Also make sure the next relocation applies to the next
751 instruction and that it's a pc-relative 8 bit branch. */
754 || irel
->r_offset
+ 2 != nrel
->r_offset
755 || ELF32_R_TYPE (nrel
->r_info
) != (int) R_MN10200_PCREL8
)
758 /* Make sure our destination immediately follows the
759 unconditional branch. */
760 if (symval
!= (sec
->output_section
->vma
+ sec
->output_offset
761 + irel
->r_offset
+ 3))
764 /* Now make sure we are a conditional branch. This may not
765 be necessary, but why take the chance.
767 Note these checks assume that R_MN10200_PCREL8 relocs
768 only occur on bCC and bCCx insns. If they occured
769 elsewhere, we'd need to know the start of this insn
770 for this check to be accurate. */
771 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
772 if (code
!= 0xe0 && code
!= 0xe1 && code
!= 0xe2
773 && code
!= 0xe3 && code
!= 0xe4 && code
!= 0xe5
774 && code
!= 0xe6 && code
!= 0xe7 && code
!= 0xe8
775 && code
!= 0xe9 && code
!= 0xec && code
!= 0xed
776 && code
!= 0xee && code
!= 0xef && code
!= 0xfc
777 && code
!= 0xfd && code
!= 0xfe && code
!= 0xff)
780 /* We also have to be sure there is no symbol/label
781 at the unconditional branch. */
782 if (mn10200_elf_symbol_address_p (abfd
, sec
, isymbuf
,
786 /* Note that we've changed the relocs, section contents, etc. */
787 elf_section_data (sec
)->relocs
= internal_relocs
;
788 elf_section_data (sec
)->this_hdr
.contents
= contents
;
789 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
791 /* Reverse the condition of the first branch. */
849 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
851 /* Set the reloc type and symbol for the first branch
852 from the second branch. */
853 irel
->r_info
= nrel
->r_info
;
855 /* Make the reloc for the second branch a null reloc. */
856 nrel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (nrel
->r_info
),
859 /* Delete two bytes of data. */
860 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
861 irel
->r_offset
+ 1, 2))
864 /* That will change things, so, we should relax again.
865 Note that this is not required, and it may be slow. */
869 /* Try to turn a 24bit immediate, displacement or absolute address
870 into a 16bit immediate, displacement or absolute address. */
871 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_24
)
873 bfd_vma value
= symval
;
875 /* See if the value will fit in 16 bits.
876 We allow any 16bit match here. We prune those we can't
878 if ((long) value
< 0x7fff && (long) value
> -0x8000)
882 /* All insns which have 24bit operands are 5 bytes long,
883 the first byte will always be 0xf4, but we double check
886 /* Get the first opcode. */
887 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
892 /* Get the second opcode. */
893 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
897 /* mov imm24,dn -> mov imm16,dn */
899 /* Not safe if the high bit is on as relaxing may
900 move the value out of high mem and thus not fit
901 in a signed 16bit value. */
905 /* Note that we've changed the relocation contents, etc. */
906 elf_section_data (sec
)->relocs
= internal_relocs
;
907 elf_section_data (sec
)->this_hdr
.contents
= contents
;
908 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
910 /* Fix the opcode. */
911 bfd_put_8 (abfd
, 0xf8 + (code
& 0x03),
912 contents
+ irel
->r_offset
- 2);
914 /* Fix the relocation's type. */
915 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
918 /* The opcode got shorter too, so we have to fix the
922 /* Delete two bytes of data. */
923 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
924 irel
->r_offset
+ 1, 2))
927 /* That will change things, so, we should relax again.
928 Note that this is not required, and it may be slow. */
932 /* mov imm24,an -> mov imm16,an
933 cmp imm24,an -> cmp imm16,an
934 mov (abs24),dn -> mov (abs16),dn
935 mov dn,(abs24) -> mov dn,(abs16)
936 movb dn,(abs24) -> movb dn,(abs16)
937 movbu (abs24),dn -> movbu (abs16),dn */
944 /* Note that we've changed the relocation contents, etc. */
945 elf_section_data (sec
)->relocs
= internal_relocs
;
946 elf_section_data (sec
)->this_hdr
.contents
= contents
;
947 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
949 if ((code
& 0xfc) == 0x74)
950 code
= 0xdc + (code
& 0x03);
951 else if ((code
& 0xfc) == 0x7c)
952 code
= 0xec + (code
& 0x03);
953 else if ((code
& 0xfc) == 0xc0)
954 code
= 0xc8 + (code
& 0x03);
955 else if ((code
& 0xfc) == 0x40)
956 code
= 0xc0 + (code
& 0x03);
957 else if ((code
& 0xfc) == 0x44)
958 code
= 0xc4 + (code
& 0x03);
959 else if ((code
& 0xfc) == 0xc8)
960 code
= 0xcc + (code
& 0x03);
962 /* Fix the opcode. */
963 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
965 /* Fix the relocation's type. */
966 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
969 /* The opcode got shorter too, so we have to fix the
973 /* Delete two bytes of data. */
974 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
975 irel
->r_offset
+ 1, 2))
978 /* That will change things, so, we should relax again.
979 Note that this is not required, and it may be slow. */
983 /* cmp imm24,dn -> cmp imm16,dn
984 mov (abs24),an -> mov (abs16),an
985 mov an,(abs24) -> mov an,(abs16)
986 add imm24,dn -> add imm16,dn
987 add imm24,an -> add imm16,an
988 sub imm24,dn -> sub imm16,dn
989 sub imm24,an -> sub imm16,an
990 And all d24->d16 in memory ops. */
1007 /* Not safe if the high bit is on as relaxing may
1008 move the value out of high mem and thus not fit
1009 in a signed 16bit value. */
1010 if (((code
& 0xfc) == 0x78
1011 || (code
& 0xfc) == 0x60
1012 || (code
& 0xfc) == 0x64
1013 || (code
& 0xfc) == 0x68
1014 || (code
& 0xfc) == 0x6c
1015 || (code
& 0xfc) == 0x80
1016 || (code
& 0xfc) == 0xf0
1017 || (code
& 0xfc) == 0x00
1018 || (code
& 0xfc) == 0x10
1019 || (code
& 0xfc) == 0xb0
1020 || (code
& 0xfc) == 0x30
1021 || (code
& 0xfc) == 0xa0
1022 || (code
& 0xfc) == 0x20
1023 || (code
& 0xfc) == 0x90)
1024 && (value
& 0x8000) != 0)
1027 /* Note that we've changed the relocation contents, etc. */
1028 elf_section_data (sec
)->relocs
= internal_relocs
;
1029 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1030 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1032 /* Fix the opcode. */
1033 bfd_put_8 (abfd
, 0xf7, contents
+ irel
->r_offset
- 2);
1035 if ((code
& 0xfc) == 0x78)
1036 code
= 0x48 + (code
& 0x03);
1037 else if ((code
& 0xfc) == 0xd0)
1038 code
= 0x30 + (code
& 0x03);
1039 else if ((code
& 0xfc) == 0x50)
1040 code
= 0x20 + (code
& 0x03);
1041 else if ((code
& 0xfc) == 0x60)
1042 code
= 0x18 + (code
& 0x03);
1043 else if ((code
& 0xfc) == 0x64)
1044 code
= 0x08 + (code
& 0x03);
1045 else if ((code
& 0xfc) == 0x68)
1046 code
= 0x1c + (code
& 0x03);
1047 else if ((code
& 0xfc) == 0x6c)
1048 code
= 0x0c + (code
& 0x03);
1049 else if ((code
& 0xfc) == 0x80)
1050 code
= 0xc0 + (code
& 0x07);
1051 else if ((code
& 0xfc) == 0xf0)
1052 code
= 0xb0 + (code
& 0x07);
1053 else if ((code
& 0xfc) == 0x00)
1054 code
= 0x80 + (code
& 0x07);
1055 else if ((code
& 0xfc) == 0x10)
1056 code
= 0xa0 + (code
& 0x07);
1057 else if ((code
& 0xfc) == 0xb0)
1058 code
= 0x70 + (code
& 0x07);
1059 else if ((code
& 0xfc) == 0x30)
1060 code
= 0x60 + (code
& 0x07);
1061 else if ((code
& 0xfc) == 0xa0)
1062 code
= 0xd0 + (code
& 0x07);
1063 else if ((code
& 0xfc) == 0x20)
1064 code
= 0x90 + (code
& 0x07);
1065 else if ((code
& 0xfc) == 0x90)
1066 code
= 0x50 + (code
& 0x07);
1068 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1070 /* Fix the relocation's type. */
1071 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1074 /* Delete one bytes of data. */
1075 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1076 irel
->r_offset
+ 2, 1))
1079 /* That will change things, so, we should relax again.
1080 Note that this is not required, and it may be slow. */
1084 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1086 /* Note that we've changed the reldection contents, etc. */
1087 elf_section_data (sec
)->relocs
= internal_relocs
;
1088 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1089 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1091 bfd_put_8 (abfd
, 0xcc + (code
& 0x03),
1092 contents
+ irel
->r_offset
- 2);
1094 bfd_put_8 (abfd
, 0xb8 + (code
& 0x03),
1095 contents
+ irel
->r_offset
- 1);
1097 /* Fix the relocation's type. */
1098 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1101 /* The reloc will be applied one byte in front of its
1102 current location. */
1103 irel
->r_offset
-= 1;
1105 /* Delete one bytes of data. */
1106 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1107 irel
->r_offset
+ 2, 1))
1110 /* That will change things, so, we should relax again.
1111 Note that this is not required, and it may be slow. */
1120 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1122 if (! link_info
->keep_memory
)
1126 /* Cache the symbols for elf_link_input_bfd. */
1127 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1131 if (contents
!= NULL
1132 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1134 if (! link_info
->keep_memory
)
1138 /* Cache the section contents for elf_link_input_bfd. */
1139 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1143 if (internal_relocs
!= NULL
1144 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1145 free (internal_relocs
);
1151 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1153 if (contents
!= NULL
1154 && elf_section_data (sec
)->this_hdr
.contents
!= contents
)
1156 if (internal_relocs
!= NULL
1157 && elf_section_data (sec
)->relocs
!= internal_relocs
)
1158 free (internal_relocs
);
1163 /* Delete some bytes from a section while relaxing. */
1166 mn10200_elf_relax_delete_bytes (abfd
, sec
, addr
, count
)
1172 Elf_Internal_Shdr
*symtab_hdr
;
1173 unsigned int sec_shndx
;
1175 Elf_Internal_Rela
*irel
, *irelend
;
1176 Elf_Internal_Rela
*irelalign
;
1178 Elf_Internal_Sym
*isym
;
1179 Elf_Internal_Sym
*isymend
;
1180 struct elf_link_hash_entry
**sym_hashes
;
1181 struct elf_link_hash_entry
**end_hashes
;
1182 unsigned int symcount
;
1184 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1186 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1188 /* The deletion must stop at the next ALIGN reloc for an aligment
1189 power larger than the number of bytes we are deleting. */
1192 toaddr
= sec
->_cooked_size
;
1194 irel
= elf_section_data (sec
)->relocs
;
1195 irelend
= irel
+ sec
->reloc_count
;
1197 /* Actually delete the bytes. */
1198 memmove (contents
+ addr
, contents
+ addr
+ count
,
1199 (size_t) (toaddr
- addr
- count
));
1200 sec
->_cooked_size
-= count
;
1202 /* Adjust all the relocs. */
1203 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1205 /* Get the new reloc address. */
1206 if ((irel
->r_offset
> addr
1207 && irel
->r_offset
< toaddr
))
1208 irel
->r_offset
-= count
;
1211 /* Adjust the local symbols defined in this section. */
1212 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1213 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1214 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1216 if (isym
->st_shndx
== sec_shndx
1217 && isym
->st_value
> addr
1218 && isym
->st_value
< toaddr
)
1219 isym
->st_value
-= count
;
1222 /* Now adjust the global symbols defined in this section. */
1223 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1224 - symtab_hdr
->sh_info
);
1225 sym_hashes
= elf_sym_hashes (abfd
);
1226 end_hashes
= sym_hashes
+ symcount
;
1227 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1229 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1230 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1231 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1232 && sym_hash
->root
.u
.def
.section
== sec
1233 && sym_hash
->root
.u
.def
.value
> addr
1234 && sym_hash
->root
.u
.def
.value
< toaddr
)
1236 sym_hash
->root
.u
.def
.value
-= count
;
1243 /* Return TRUE if a symbol exists at the given address, else return
1246 mn10200_elf_symbol_address_p (abfd
, sec
, isym
, addr
)
1249 Elf_Internal_Sym
*isym
;
1252 Elf_Internal_Shdr
*symtab_hdr
;
1253 unsigned int sec_shndx
;
1254 Elf_Internal_Sym
*isymend
;
1255 struct elf_link_hash_entry
**sym_hashes
;
1256 struct elf_link_hash_entry
**end_hashes
;
1257 unsigned int symcount
;
1259 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1261 /* Examine all the local symbols. */
1262 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1263 for (isymend
= isym
+ symtab_hdr
->sh_info
; isym
< isymend
; isym
++)
1265 if (isym
->st_shndx
== sec_shndx
1266 && isym
->st_value
== addr
)
1270 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1271 - symtab_hdr
->sh_info
);
1272 sym_hashes
= elf_sym_hashes (abfd
);
1273 end_hashes
= sym_hashes
+ symcount
;
1274 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1276 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1277 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1278 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1279 && sym_hash
->root
.u
.def
.section
== sec
1280 && sym_hash
->root
.u
.def
.value
== addr
)
1287 /* This is a version of bfd_generic_get_relocated_section_contents
1288 which uses mn10200_elf_relocate_section. */
1291 mn10200_elf_get_relocated_section_contents (output_bfd
, link_info
, link_order
,
1292 data
, relocatable
, symbols
)
1294 struct bfd_link_info
*link_info
;
1295 struct bfd_link_order
*link_order
;
1297 bfd_boolean relocatable
;
1300 Elf_Internal_Shdr
*symtab_hdr
;
1301 asection
*input_section
= link_order
->u
.indirect
.section
;
1302 bfd
*input_bfd
= input_section
->owner
;
1303 asection
**sections
= NULL
;
1304 Elf_Internal_Rela
*internal_relocs
= NULL
;
1305 Elf_Internal_Sym
*isymbuf
= NULL
;
1307 /* We only need to handle the case of relaxing, or of having a
1308 particular set of section contents, specially. */
1310 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1311 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1316 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1318 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1319 (size_t) input_section
->_raw_size
);
1321 if ((input_section
->flags
& SEC_RELOC
) != 0
1322 && input_section
->reloc_count
> 0)
1324 Elf_Internal_Sym
*isym
;
1325 Elf_Internal_Sym
*isymend
;
1329 internal_relocs
= (_bfd_elf_link_read_relocs
1330 (input_bfd
, input_section
, (PTR
) NULL
,
1331 (Elf_Internal_Rela
*) NULL
, FALSE
));
1332 if (internal_relocs
== NULL
)
1335 if (symtab_hdr
->sh_info
!= 0)
1337 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1338 if (isymbuf
== NULL
)
1339 isymbuf
= bfd_elf_get_elf_syms (input_bfd
, symtab_hdr
,
1340 symtab_hdr
->sh_info
, 0,
1342 if (isymbuf
== NULL
)
1346 amt
= symtab_hdr
->sh_info
;
1347 amt
*= sizeof (asection
*);
1348 sections
= (asection
**) bfd_malloc (amt
);
1349 if (sections
== NULL
&& amt
!= 0)
1352 isymend
= isymbuf
+ symtab_hdr
->sh_info
;
1353 for (isym
= isymbuf
, secpp
= sections
; isym
< isymend
; ++isym
, ++secpp
)
1357 if (isym
->st_shndx
== SHN_UNDEF
)
1358 isec
= bfd_und_section_ptr
;
1359 else if (isym
->st_shndx
== SHN_ABS
)
1360 isec
= bfd_abs_section_ptr
;
1361 else if (isym
->st_shndx
== SHN_COMMON
)
1362 isec
= bfd_com_section_ptr
;
1364 isec
= bfd_section_from_elf_index (input_bfd
, isym
->st_shndx
);
1369 if (! mn10200_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
1370 input_section
, data
, internal_relocs
,
1374 if (sections
!= NULL
)
1377 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1379 if (elf_section_data (input_section
)->relocs
!= internal_relocs
)
1380 free (internal_relocs
);
1386 if (sections
!= NULL
)
1389 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1391 if (internal_relocs
!= NULL
1392 && elf_section_data (input_section
)->relocs
!= internal_relocs
)
1393 free (internal_relocs
);
1397 #define TARGET_LITTLE_SYM bfd_elf32_mn10200_vec
1398 #define TARGET_LITTLE_NAME "elf32-mn10200"
1399 #define ELF_ARCH bfd_arch_mn10200
1400 #define ELF_MACHINE_CODE EM_MN10200
1401 #define ELF_MACHINE_ALT1 EM_CYGNUS_MN10200
1402 #define ELF_MAXPAGESIZE 0x1000
1404 #define elf_backend_rela_normal 1
1405 #define elf_info_to_howto mn10200_info_to_howto
1406 #define elf_info_to_howto_rel 0
1407 #define elf_backend_relocate_section mn10200_elf_relocate_section
1408 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section
1409 #define bfd_elf32_bfd_get_relocated_section_contents \
1410 mn10200_elf_get_relocated_section_contents
1412 #define elf_symbol_leading_char '_'
1414 #include "elf32-target.h"