1 /* Matsushita 10200 specific support for 32-bit ELF
2 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 static reloc_howto_type
*bfd_elf32_bfd_reloc_type_lookup
26 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
27 static void mn10200_info_to_howto
28 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rela
*));
29 static boolean mn10200_elf_relax_delete_bytes
30 PARAMS ((bfd
*, asection
*, bfd_vma
, int));
31 static boolean mn10200_elf_symbol_address_p
32 PARAMS ((bfd
*, asection
*, Elf32_External_Sym
*, bfd_vma
));
34 /* We have to use RELA instructions since md_apply_fix3 in the assembler
35 does absolutely nothing. */
51 static reloc_howto_type elf_mn10200_howto_table
[] =
53 /* Dummy relocation. Does nothing. */
54 HOWTO (R_MN10200_NONE
,
60 complain_overflow_bitfield
,
61 bfd_elf_generic_reloc
,
67 /* Standard 32 bit reloc. */
74 complain_overflow_bitfield
,
75 bfd_elf_generic_reloc
,
81 /* Standard 16 bit reloc. */
88 complain_overflow_bitfield
,
89 bfd_elf_generic_reloc
,
95 /* Standard 8 bit reloc. */
102 complain_overflow_bitfield
,
103 bfd_elf_generic_reloc
,
109 /* Standard 24 bit reloc. */
116 complain_overflow_bitfield
,
117 bfd_elf_generic_reloc
,
123 /* Simple 8 pc-relative reloc. */
124 HOWTO (R_MN10200_PCREL8
,
130 complain_overflow_bitfield
,
131 bfd_elf_generic_reloc
,
137 /* Simple 16 pc-relative reloc. */
138 HOWTO (R_MN10200_PCREL16
,
144 complain_overflow_bitfield
,
145 bfd_elf_generic_reloc
,
151 /* Simple 32bit pc-relative reloc with a 1 byte adjustment
152 to get the pc-relative offset correct. */
153 HOWTO (R_MN10200_PCREL24
,
159 complain_overflow_bitfield
,
160 bfd_elf_generic_reloc
,
168 struct mn10200_reloc_map
170 bfd_reloc_code_real_type bfd_reloc_val
;
171 unsigned char elf_reloc_val
;
174 static const struct mn10200_reloc_map mn10200_reloc_map
[] =
176 { BFD_RELOC_NONE
, R_MN10200_NONE
, },
177 { BFD_RELOC_32
, R_MN10200_32
, },
178 { BFD_RELOC_16
, R_MN10200_16
, },
179 { BFD_RELOC_8
, R_MN10200_8
, },
180 { BFD_RELOC_24
, R_MN10200_24
, },
181 { BFD_RELOC_8_PCREL
, R_MN10200_PCREL8
, },
182 { BFD_RELOC_16_PCREL
, R_MN10200_PCREL16
, },
183 { BFD_RELOC_24_PCREL
, R_MN10200_PCREL24
, },
186 static reloc_howto_type
*
187 bfd_elf32_bfd_reloc_type_lookup (abfd
, code
)
188 bfd
*abfd ATTRIBUTE_UNUSED
;
189 bfd_reloc_code_real_type code
;
194 i
< sizeof (mn10200_reloc_map
) / sizeof (struct mn10200_reloc_map
);
197 if (mn10200_reloc_map
[i
].bfd_reloc_val
== code
)
198 return &elf_mn10200_howto_table
[mn10200_reloc_map
[i
].elf_reloc_val
];
204 /* Set the howto pointer for an MN10200 ELF reloc. */
207 mn10200_info_to_howto (abfd
, cache_ptr
, dst
)
208 bfd
*abfd ATTRIBUTE_UNUSED
;
210 Elf32_Internal_Rela
*dst
;
214 r_type
= ELF32_R_TYPE (dst
->r_info
);
215 BFD_ASSERT (r_type
< (unsigned int) R_MN10200_MAX
);
216 cache_ptr
->howto
= &elf_mn10200_howto_table
[r_type
];
219 /* Perform a relocation as part of a final link. */
220 static bfd_reloc_status_type
221 mn10200_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
222 input_section
, contents
, offset
, value
,
223 addend
, info
, sym_sec
, is_local
)
224 reloc_howto_type
*howto
;
226 bfd
*output_bfd ATTRIBUTE_UNUSED
;
227 asection
*input_section
;
232 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
233 asection
*sym_sec ATTRIBUTE_UNUSED
;
234 int is_local ATTRIBUTE_UNUSED
;
236 unsigned long r_type
= howto
->type
;
237 bfd_byte
*hit_data
= contents
+ offset
;
247 bfd_put_32 (input_bfd
, value
, hit_data
);
253 if ((long)value
> 0x7fff || (long)value
< -0x8000)
254 return bfd_reloc_overflow
;
256 bfd_put_16 (input_bfd
, value
, hit_data
);
262 if ((long)value
> 0x7f || (long)value
< -0x80)
263 return bfd_reloc_overflow
;
265 bfd_put_8 (input_bfd
, value
, hit_data
);
271 if ((long)value
> 0x7fffff || (long)value
< -0x800000)
272 return bfd_reloc_overflow
;
275 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
276 bfd_put_32 (input_bfd
, value
, hit_data
);
279 case R_MN10200_PCREL8
:
280 value
-= (input_section
->output_section
->vma
281 + input_section
->output_offset
);
282 value
-= (offset
+ 1);
285 if ((long)value
> 0xff || (long)value
< -0x100)
286 return bfd_reloc_overflow
;
288 bfd_put_8 (input_bfd
, value
, hit_data
);
291 case R_MN10200_PCREL16
:
292 value
-= (input_section
->output_section
->vma
293 + input_section
->output_offset
);
294 value
-= (offset
+ 2);
297 if ((long)value
> 0xffff || (long)value
< -0x10000)
298 return bfd_reloc_overflow
;
300 bfd_put_16 (input_bfd
, value
, hit_data
);
303 case R_MN10200_PCREL24
:
304 value
-= (input_section
->output_section
->vma
305 + input_section
->output_offset
);
306 value
-= (offset
+ 3);
309 if ((long)value
> 0xffffff || (long)value
< -0x1000000)
310 return bfd_reloc_overflow
;
313 value
|= (bfd_get_32 (input_bfd
, hit_data
) & 0xff000000);
314 bfd_put_32 (input_bfd
, value
, hit_data
);
318 return bfd_reloc_notsupported
;
322 /* Relocate an MN10200 ELF section. */
324 mn10200_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
325 contents
, relocs
, local_syms
, local_sections
)
327 struct bfd_link_info
*info
;
329 asection
*input_section
;
331 Elf_Internal_Rela
*relocs
;
332 Elf_Internal_Sym
*local_syms
;
333 asection
**local_sections
;
335 Elf_Internal_Shdr
*symtab_hdr
;
336 struct elf_link_hash_entry
**sym_hashes
;
337 Elf_Internal_Rela
*rel
, *relend
;
339 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
340 sym_hashes
= elf_sym_hashes (input_bfd
);
343 relend
= relocs
+ input_section
->reloc_count
;
344 for (; rel
< relend
; rel
++)
347 reloc_howto_type
*howto
;
348 unsigned long r_symndx
;
349 Elf_Internal_Sym
*sym
;
351 struct elf_link_hash_entry
*h
;
353 bfd_reloc_status_type r
;
355 r_symndx
= ELF32_R_SYM (rel
->r_info
);
356 r_type
= ELF32_R_TYPE (rel
->r_info
);
357 howto
= elf_mn10200_howto_table
+ r_type
;
359 if (info
->relocateable
)
361 /* This is a relocateable link. We don't have to change
362 anything, unless the reloc is against a section symbol,
363 in which case we have to adjust according to where the
364 section symbol winds up in the output section. */
365 if (r_symndx
< symtab_hdr
->sh_info
)
367 sym
= local_syms
+ r_symndx
;
368 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
370 sec
= local_sections
[r_symndx
];
371 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
378 /* This is a final link. */
382 if (r_symndx
< symtab_hdr
->sh_info
)
384 sym
= local_syms
+ r_symndx
;
385 sec
= local_sections
[r_symndx
];
386 relocation
= (sec
->output_section
->vma
392 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
393 while (h
->root
.type
== bfd_link_hash_indirect
394 || h
->root
.type
== bfd_link_hash_warning
)
395 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
396 if (h
->root
.type
== bfd_link_hash_defined
397 || h
->root
.type
== bfd_link_hash_defweak
)
399 sec
= h
->root
.u
.def
.section
;
400 relocation
= (h
->root
.u
.def
.value
401 + sec
->output_section
->vma
402 + sec
->output_offset
);
404 else if (h
->root
.type
== bfd_link_hash_undefweak
)
408 if (! ((*info
->callbacks
->undefined_symbol
)
409 (info
, h
->root
.root
.string
, input_bfd
,
410 input_section
, rel
->r_offset
, true)))
416 r
= mn10200_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
418 contents
, rel
->r_offset
,
419 relocation
, rel
->r_addend
,
420 info
, sec
, h
== NULL
);
422 if (r
!= bfd_reloc_ok
)
425 const char *msg
= (const char *)0;
428 name
= h
->root
.root
.string
;
431 name
= (bfd_elf_string_from_elf_section
432 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
433 if (name
== NULL
|| *name
== '\0')
434 name
= bfd_section_name (input_bfd
, sec
);
439 case bfd_reloc_overflow
:
440 if (! ((*info
->callbacks
->reloc_overflow
)
441 (info
, name
, howto
->name
, (bfd_vma
) 0,
442 input_bfd
, input_section
, rel
->r_offset
)))
446 case bfd_reloc_undefined
:
447 if (! ((*info
->callbacks
->undefined_symbol
)
448 (info
, name
, input_bfd
, input_section
,
449 rel
->r_offset
, true)))
453 case bfd_reloc_outofrange
:
454 msg
= _("internal error: out of range error");
457 case bfd_reloc_notsupported
:
458 msg
= _("internal error: unsupported relocation error");
461 case bfd_reloc_dangerous
:
462 msg
= _("internal error: dangerous error");
466 msg
= _("internal error: unknown error");
470 if (!((*info
->callbacks
->warning
)
471 (info
, msg
, name
, input_bfd
, input_section
,
482 /* This function handles relaxing for the mn10200.
484 There's quite a few relaxing opportunites available on the mn10200:
486 * jsr:24 -> jsr:16 2 bytes
488 * jmp:24 -> jmp:16 2 bytes
489 * jmp:16 -> bra:8 1 byte
491 * If the previous instruction is a conditional branch
492 around the jump/bra, we may be able to reverse its condition
493 and change its target to the jump's target. The jump/bra
494 can then be deleted. 2 bytes
496 * mov abs24 -> mov abs16 2 byte savings
498 * Most instructions which accept imm24 can relax to imm16 2 bytes
499 - Most instructions which accept imm16 can relax to imm8 1 byte
501 * Most instructions which accept d24 can relax to d16 2 bytes
502 - Most instructions which accept d16 can relax to d8 1 byte
504 abs24, imm24, d24 all look the same at the reloc level. It
505 might make the code simpler if we had different relocs for
506 the various relaxable operand types.
508 We don't handle imm16->imm8 or d16->d8 as they're very rare
509 and somewhat more difficult to support. */
512 mn10200_elf_relax_section (abfd
, sec
, link_info
, again
)
515 struct bfd_link_info
*link_info
;
518 Elf_Internal_Shdr
*symtab_hdr
;
519 Elf_Internal_Rela
*internal_relocs
;
520 Elf_Internal_Rela
*free_relocs
= NULL
;
521 Elf_Internal_Rela
*irel
, *irelend
;
522 bfd_byte
*contents
= NULL
;
523 bfd_byte
*free_contents
= NULL
;
524 Elf32_External_Sym
*extsyms
= NULL
;
525 Elf32_External_Sym
*free_extsyms
= NULL
;
527 /* Assume nothing changes. */
530 /* We don't have to do anything for a relocateable link, if
531 this section does not have relocs, or if this is not a
533 if (link_info
->relocateable
534 || (sec
->flags
& SEC_RELOC
) == 0
535 || sec
->reloc_count
== 0
536 || (sec
->flags
& SEC_CODE
) == 0)
539 /* If this is the first time we have been called for this section,
540 initialize the cooked size. */
541 if (sec
->_cooked_size
== 0)
542 sec
->_cooked_size
= sec
->_raw_size
;
544 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
546 /* Get a copy of the native relocations. */
547 internal_relocs
= (_bfd_elf32_link_read_relocs
548 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
549 link_info
->keep_memory
));
550 if (internal_relocs
== NULL
)
552 if (! link_info
->keep_memory
)
553 free_relocs
= internal_relocs
;
555 /* Walk through them looking for relaxing opportunities. */
556 irelend
= internal_relocs
+ sec
->reloc_count
;
557 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
561 /* If this isn't something that can be relaxed, then ignore
563 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_NONE
564 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_8
565 || ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_MAX
)
568 /* Get the section contents if we haven't done so already. */
569 if (contents
== NULL
)
571 /* Get cached copy if it exists. */
572 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
573 contents
= elf_section_data (sec
)->this_hdr
.contents
;
576 /* Go get them off disk. */
577 contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
578 if (contents
== NULL
)
580 free_contents
= contents
;
582 if (! bfd_get_section_contents (abfd
, sec
, contents
,
583 (file_ptr
) 0, sec
->_raw_size
))
588 /* Read this BFD's symbols if we haven't done so already. */
591 /* Get cached copy if it exists. */
592 if (symtab_hdr
->contents
!= NULL
)
593 extsyms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
596 /* Go get them off disk. */
597 extsyms
= ((Elf32_External_Sym
*)
598 bfd_malloc (symtab_hdr
->sh_size
));
601 free_extsyms
= extsyms
;
602 if (bfd_seek (abfd
, symtab_hdr
->sh_offset
, SEEK_SET
) != 0
603 || (bfd_read (extsyms
, 1, symtab_hdr
->sh_size
, abfd
)
604 != symtab_hdr
->sh_size
))
609 /* Get the value of the symbol referred to by the reloc. */
610 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
612 Elf_Internal_Sym isym
;
615 /* A local symbol. */
616 bfd_elf32_swap_symbol_in (abfd
,
617 extsyms
+ ELF32_R_SYM (irel
->r_info
),
620 sym_sec
= bfd_section_from_elf_index (abfd
, isym
.st_shndx
);
621 symval
= (isym
.st_value
622 + sym_sec
->output_section
->vma
623 + sym_sec
->output_offset
);
628 struct elf_link_hash_entry
*h
;
630 /* An external symbol. */
631 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
632 h
= elf_sym_hashes (abfd
)[indx
];
633 BFD_ASSERT (h
!= NULL
);
634 if (h
->root
.type
!= bfd_link_hash_defined
635 && h
->root
.type
!= bfd_link_hash_defweak
)
637 /* This appears to be a reference to an undefined
638 symbol. Just ignore it--it will be caught by the
639 regular reloc processing. */
643 symval
= (h
->root
.u
.def
.value
644 + h
->root
.u
.def
.section
->output_section
->vma
645 + h
->root
.u
.def
.section
->output_offset
);
648 /* For simplicity of coding, we are going to modify the section
649 contents, the section relocs, and the BFD symbol table. We
650 must tell the rest of the code not to free up this
651 information. It would be possible to instead create a table
652 of changes which have to be made, as is done in coff-mips.c;
653 that would be more work, but would require less memory when
654 the linker is run. */
656 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative
658 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL24
)
660 bfd_vma value
= symval
;
662 /* Deal with pc-relative gunk. */
663 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
664 value
-= (irel
->r_offset
+ 3);
665 value
+= irel
->r_addend
;
667 /* See if the value will fit in 16 bits, note the high value is
668 0x7fff + 2 as the target will be two bytes closer if we are
670 if ((long)value
< 0x8001 && (long)value
> -0x8000)
674 /* Get the opcode. */
675 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
677 if (code
!= 0xe0 && code
!= 0xe1)
680 /* Note that we've changed the relocs, section contents, etc. */
681 elf_section_data (sec
)->relocs
= internal_relocs
;
684 elf_section_data (sec
)->this_hdr
.contents
= contents
;
685 free_contents
= NULL
;
687 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
690 /* Fix the opcode. */
692 bfd_put_8 (abfd
, 0xfc, contents
+ irel
->r_offset
- 2);
693 else if (code
== 0xe1)
694 bfd_put_8 (abfd
, 0xfd, contents
+ irel
->r_offset
- 2);
696 /* Fix the relocation's type. */
697 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
700 /* The opcode got shorter too, so we have to fix the offset. */
703 /* Delete two bytes of data. */
704 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
705 irel
->r_offset
+ 1, 2))
708 /* That will change things, so, we should relax again.
709 Note that this is not required, and it may be slow. */
714 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative
716 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL16
)
718 bfd_vma value
= symval
;
720 /* Deal with pc-relative gunk. */
721 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
722 value
-= (irel
->r_offset
+ 2);
723 value
+= irel
->r_addend
;
725 /* See if the value will fit in 8 bits, note the high value is
726 0x7f + 1 as the target will be one bytes closer if we are
728 if ((long)value
< 0x80 && (long)value
> -0x80)
732 /* Get the opcode. */
733 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
738 /* Note that we've changed the relocs, section contents, etc. */
739 elf_section_data (sec
)->relocs
= internal_relocs
;
742 elf_section_data (sec
)->this_hdr
.contents
= contents
;
743 free_contents
= NULL
;
745 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
748 /* Fix the opcode. */
749 bfd_put_8 (abfd
, 0xea, contents
+ irel
->r_offset
- 1);
751 /* Fix the relocation's type. */
752 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
755 /* Delete one byte of data. */
756 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
757 irel
->r_offset
+ 1, 1))
760 /* That will change things, so, we should relax again.
761 Note that this is not required, and it may be slow. */
766 /* Try to eliminate an unconditional 8 bit pc-relative branch
767 which immediately follows a conditional 8 bit pc-relative
768 branch around the unconditional branch.
775 This happens when the bCC can't reach lab2 at assembly time,
776 but due to other relaxations it can reach at link time. */
777 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_PCREL8
)
779 Elf_Internal_Rela
*nrel
;
780 bfd_vma value
= symval
;
783 /* Deal with pc-relative gunk. */
784 value
-= (sec
->output_section
->vma
+ sec
->output_offset
);
785 value
-= (irel
->r_offset
+ 1);
786 value
+= irel
->r_addend
;
788 /* Do nothing if this reloc is the last byte in the section. */
789 if (irel
->r_offset
== sec
->_cooked_size
)
792 /* See if the next instruction is an unconditional pc-relative
793 branch, more often than not this test will fail, so we
794 test it first to speed things up. */
795 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
+ 1);
799 /* Also make sure the next relocation applies to the next
800 instruction and that it's a pc-relative 8 bit branch. */
803 || irel
->r_offset
+ 2 != nrel
->r_offset
804 || ELF32_R_TYPE (nrel
->r_info
) != (int) R_MN10200_PCREL8
)
807 /* Make sure our destination immediately follows the
808 unconditional branch. */
809 if (symval
!= (sec
->output_section
->vma
+ sec
->output_offset
810 + irel
->r_offset
+ 3))
813 /* Now make sure we are a conditional branch. This may not
814 be necessary, but why take the chance.
816 Note these checks assume that R_MN10200_PCREL8 relocs
817 only occur on bCC and bCCx insns. If they occured
818 elsewhere, we'd need to know the start of this insn
819 for this check to be accurate. */
820 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
821 if (code
!= 0xe0 && code
!= 0xe1 && code
!= 0xe2
822 && code
!= 0xe3 && code
!= 0xe4 && code
!= 0xe5
823 && code
!= 0xe6 && code
!= 0xe7 && code
!= 0xe8
824 && code
!= 0xe9 && code
!= 0xec && code
!= 0xed
825 && code
!= 0xee && code
!= 0xef && code
!= 0xfc
826 && code
!= 0xfd && code
!= 0xfe && code
!= 0xff)
829 /* We also have to be sure there is no symbol/label
830 at the unconditional branch. */
831 if (mn10200_elf_symbol_address_p (abfd
, sec
, extsyms
,
835 /* Note that we've changed the relocs, section contents, etc. */
836 elf_section_data (sec
)->relocs
= internal_relocs
;
839 elf_section_data (sec
)->this_hdr
.contents
= contents
;
840 free_contents
= NULL
;
842 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
845 /* Reverse the condition of the first branch. */
903 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
905 /* Set the reloc type and symbol for the first branch
906 from the second branch. */
907 irel
->r_info
= nrel
->r_info
;
909 /* Make the reloc for the second branch a null reloc. */
910 nrel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (nrel
->r_info
),
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 /* Try to turn a 24bit immediate, displacement or absolute address
924 into a 16bit immediate, displacement or absolute address. */
925 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_MN10200_24
)
927 bfd_vma value
= symval
;
929 /* See if the value will fit in 16 bits.
930 We allow any 16bit match here. We prune those we can't
932 if ((long)value
< 0x7fff && (long)value
> -0x8000)
936 /* All insns which have 24bit operands are 5 bytes long,
937 the first byte will always be 0xf4, but we double check
940 /* Get the first opcode. */
941 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 2);
946 /* Get the second opcode. */
947 code
= bfd_get_8 (abfd
, contents
+ irel
->r_offset
- 1);
951 /* mov imm24,dn -> mov imm16,dn */
953 /* Not safe if the high bit is on as relaxing may
954 move the value out of high mem and thus not fit
955 in a signed 16bit value. */
959 /* Note that we've changed the reldection contents, etc. */
960 elf_section_data (sec
)->relocs
= internal_relocs
;
963 elf_section_data (sec
)->this_hdr
.contents
= contents
;
964 free_contents
= NULL
;
966 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
969 /* Fix the opcode. */
970 bfd_put_8 (abfd
, 0xf8 + (code
& 0x03),
971 contents
+ irel
->r_offset
- 2);
973 /* Fix the relocation's type. */
974 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
977 /* The opcode got shorter too, so we have to fix the
981 /* Delete two bytes of data. */
982 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
983 irel
->r_offset
+ 1, 2))
986 /* That will change things, so, we should relax again.
987 Note that this is not required, and it may be slow. */
991 /* mov imm24,an -> mov imm16,an
992 cmp imm24,an -> cmp imm16,an
993 mov (abs24),dn -> mov (abs16),dn
994 mov dn,(abs24) -> mov dn,(abs16)
995 movb dn,(abs24) -> movb dn,(abs16)
996 movbu (abs24),dn -> movbu (abs16),dn */
1003 /* Note that we've changed the reldection contents, etc. */
1004 elf_section_data (sec
)->relocs
= internal_relocs
;
1007 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1008 free_contents
= NULL
;
1010 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
1011 free_extsyms
= NULL
;
1013 if ((code
& 0xfc) == 0x74)
1014 code
= 0xdc + (code
& 0x03);
1015 else if ((code
& 0xfc) == 0x7c)
1016 code
= 0xec + (code
& 0x03);
1017 else if ((code
& 0xfc) == 0xc0)
1018 code
= 0xc8 + (code
& 0x03);
1019 else if ((code
& 0xfc) == 0x40)
1020 code
= 0xc0 + (code
& 0x03);
1021 else if ((code
& 0xfc) == 0x44)
1022 code
= 0xc4 + (code
& 0x03);
1023 else if ((code
& 0xfc) == 0xc8)
1024 code
= 0xcc + (code
& 0x03);
1026 /* Fix the opcode. */
1027 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 2);
1029 /* Fix the relocation's type. */
1030 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1033 /* The opcode got shorter too, so we have to fix the
1035 irel
->r_offset
-= 1;
1037 /* Delete two bytes of data. */
1038 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1039 irel
->r_offset
+ 1, 2))
1042 /* That will change things, so, we should relax again.
1043 Note that this is not required, and it may be slow. */
1047 /* cmp imm24,dn -> cmp imm16,dn
1048 mov (abs24),an -> mov (abs16),an
1049 mov an,(abs24) -> mov an,(abs16)
1050 add imm24,dn -> add imm16,dn
1051 add imm24,an -> add imm16,an
1052 sub imm24,dn -> sub imm16,dn
1053 sub imm24,an -> sub imm16,an
1054 And all d24->d16 in memory ops. */
1071 /* Not safe if the high bit is on as relaxing may
1072 move the value out of high mem and thus not fit
1073 in a signed 16bit value. */
1074 if (((code
& 0xfc) == 0x78
1075 || (code
& 0xfc) == 0x60
1076 || (code
& 0xfc) == 0x64
1077 || (code
& 0xfc) == 0x68
1078 || (code
& 0xfc) == 0x6c
1079 || (code
& 0xfc) == 0x80
1080 || (code
& 0xfc) == 0xf0
1081 || (code
& 0xfc) == 0x00
1082 || (code
& 0xfc) == 0x10
1083 || (code
& 0xfc) == 0xb0
1084 || (code
& 0xfc) == 0x30
1085 || (code
& 0xfc) == 0xa0
1086 || (code
& 0xfc) == 0x20
1087 || (code
& 0xfc) == 0x90)
1088 && (value
& 0x8000) != 0)
1091 /* Note that we've changed the reldection contents, etc. */
1092 elf_section_data (sec
)->relocs
= internal_relocs
;
1095 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1096 free_contents
= NULL
;
1098 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
1099 free_extsyms
= NULL
;
1101 /* Fix the opcode. */
1102 bfd_put_8 (abfd
, 0xf7, contents
+ irel
->r_offset
- 2);
1104 if ((code
& 0xfc) == 0x78)
1105 code
= 0x48 + (code
& 0x03);
1106 else if ((code
& 0xfc) == 0xd0)
1107 code
= 0x30 + (code
& 0x03);
1108 else if ((code
& 0xfc) == 0x50)
1109 code
= 0x20 + (code
& 0x03);
1110 else if ((code
& 0xfc) == 0x60)
1111 code
= 0x18 + (code
& 0x03);
1112 else if ((code
& 0xfc) == 0x64)
1113 code
= 0x08 + (code
& 0x03);
1114 else if ((code
& 0xfc) == 0x68)
1115 code
= 0x1c + (code
& 0x03);
1116 else if ((code
& 0xfc) == 0x6c)
1117 code
= 0x0c + (code
& 0x03);
1118 else if ((code
& 0xfc) == 0x80)
1119 code
= 0xc0 + (code
& 0x07);
1120 else if ((code
& 0xfc) == 0xf0)
1121 code
= 0xb0 + (code
& 0x07);
1122 else if ((code
& 0xfc) == 0x00)
1123 code
= 0x80 + (code
& 0x07);
1124 else if ((code
& 0xfc) == 0x10)
1125 code
= 0xa0 + (code
& 0x07);
1126 else if ((code
& 0xfc) == 0xb0)
1127 code
= 0x70 + (code
& 0x07);
1128 else if ((code
& 0xfc) == 0x30)
1129 code
= 0x60 + (code
& 0x07);
1130 else if ((code
& 0xfc) == 0xa0)
1131 code
= 0xd0 + (code
& 0x07);
1132 else if ((code
& 0xfc) == 0x20)
1133 code
= 0x90 + (code
& 0x07);
1134 else if ((code
& 0xfc) == 0x90)
1135 code
= 0x50 + (code
& 0x07);
1137 bfd_put_8 (abfd
, code
, contents
+ irel
->r_offset
- 1);
1139 /* Fix the relocation's type. */
1140 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1143 /* Delete one bytes of data. */
1144 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1145 irel
->r_offset
+ 2, 1))
1148 /* That will change things, so, we should relax again.
1149 Note that this is not required, and it may be slow. */
1153 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */
1155 /* Note that we've changed the reldection contents, etc. */
1156 elf_section_data (sec
)->relocs
= internal_relocs
;
1159 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1160 free_contents
= NULL
;
1162 symtab_hdr
->contents
= (bfd_byte
*) extsyms
;
1163 free_extsyms
= NULL
;
1165 bfd_put_8 (abfd
, 0xcc + (code
& 0x03),
1166 contents
+ irel
->r_offset
- 2);
1168 bfd_put_8 (abfd
, 0xb8 + (code
& 0x03),
1169 contents
+ irel
->r_offset
- 1);
1171 /* Fix the relocation's type. */
1172 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
1175 /* The reloc will be applied one byte in front of its
1176 current location. */
1177 irel
->r_offset
-= 1;
1179 /* Delete one bytes of data. */
1180 if (!mn10200_elf_relax_delete_bytes (abfd
, sec
,
1181 irel
->r_offset
+ 2, 1))
1184 /* That will change things, so, we should relax again.
1185 Note that this is not required, and it may be slow. */
1193 if (free_relocs
!= NULL
)
1199 if (free_contents
!= NULL
)
1201 if (! link_info
->keep_memory
)
1202 free (free_contents
);
1205 /* Cache the section contents for elf_link_input_bfd. */
1206 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1208 free_contents
= NULL
;
1211 if (free_extsyms
!= NULL
)
1213 if (! link_info
->keep_memory
)
1214 free (free_extsyms
);
1217 /* Cache the symbols for elf_link_input_bfd. */
1218 symtab_hdr
->contents
= extsyms
;
1220 free_extsyms
= NULL
;
1226 if (free_relocs
!= NULL
)
1228 if (free_contents
!= NULL
)
1229 free (free_contents
);
1230 if (free_extsyms
!= NULL
)
1231 free (free_extsyms
);
1235 /* Delete some bytes from a section while relaxing. */
1238 mn10200_elf_relax_delete_bytes (abfd
, sec
, addr
, count
)
1244 Elf_Internal_Shdr
*symtab_hdr
;
1245 Elf32_External_Sym
*extsyms
;
1248 Elf_Internal_Rela
*irel
, *irelend
;
1249 Elf_Internal_Rela
*irelalign
;
1251 Elf32_External_Sym
*esym
, *esymend
;
1252 struct elf_link_hash_entry
*sym_hash
;
1254 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1255 extsyms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
1257 shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1259 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1261 /* The deletion must stop at the next ALIGN reloc for an aligment
1262 power larger than the number of bytes we are deleting. */
1265 toaddr
= sec
->_cooked_size
;
1267 irel
= elf_section_data (sec
)->relocs
;
1268 irelend
= irel
+ sec
->reloc_count
;
1270 /* Actually delete the bytes. */
1271 memmove (contents
+ addr
, contents
+ addr
+ count
, toaddr
- addr
- count
);
1272 sec
->_cooked_size
-= count
;
1274 /* Adjust all the relocs. */
1275 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1277 /* Get the new reloc address. */
1278 if ((irel
->r_offset
> addr
1279 && irel
->r_offset
< toaddr
))
1280 irel
->r_offset
-= count
;
1283 /* Adjust the local symbols defined in this section. */
1285 esymend
= esym
+ symtab_hdr
->sh_info
;
1286 for (; esym
< esymend
; esym
++)
1288 Elf_Internal_Sym isym
;
1290 bfd_elf32_swap_symbol_in (abfd
, esym
, &isym
);
1292 if (isym
.st_shndx
== shndx
1293 && isym
.st_value
> addr
1294 && isym
.st_value
< toaddr
)
1296 isym
.st_value
-= count
;
1297 bfd_elf32_swap_symbol_out (abfd
, &isym
, esym
);
1301 /* Now adjust the global symbols defined in this section. */
1302 esym
= extsyms
+ symtab_hdr
->sh_info
;
1303 esymend
= extsyms
+ (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
));
1304 for (index
= 0; esym
< esymend
; esym
++, index
++)
1306 Elf_Internal_Sym isym
;
1308 bfd_elf32_swap_symbol_in (abfd
, esym
, &isym
);
1309 sym_hash
= elf_sym_hashes (abfd
)[index
];
1310 if (isym
.st_shndx
== shndx
1311 && ((sym_hash
)->root
.type
== bfd_link_hash_defined
1312 || (sym_hash
)->root
.type
== bfd_link_hash_defweak
)
1313 && (sym_hash
)->root
.u
.def
.section
== sec
1314 && (sym_hash
)->root
.u
.def
.value
> addr
1315 && (sym_hash
)->root
.u
.def
.value
< toaddr
)
1317 (sym_hash
)->root
.u
.def
.value
-= count
;
1324 /* Return true if a symbol exists at the given address, else return
1327 mn10200_elf_symbol_address_p (abfd
, sec
, extsyms
, addr
)
1330 Elf32_External_Sym
*extsyms
;
1333 Elf_Internal_Shdr
*symtab_hdr
;
1335 Elf32_External_Sym
*esym
, *esymend
;
1336 struct elf_link_hash_entry
**sym_hash
, **sym_hash_end
;
1338 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1339 shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1341 /* Examine all the symbols. */
1343 esymend
= esym
+ symtab_hdr
->sh_info
;
1344 for (; esym
< esymend
; esym
++)
1346 Elf_Internal_Sym isym
;
1348 bfd_elf32_swap_symbol_in (abfd
, esym
, &isym
);
1350 if (isym
.st_shndx
== shndx
1351 && isym
.st_value
== addr
)
1355 sym_hash
= elf_sym_hashes (abfd
);
1356 sym_hash_end
= (sym_hash
1357 + (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1358 - symtab_hdr
->sh_info
));
1359 for (; sym_hash
< sym_hash_end
; sym_hash
++)
1361 if (((*sym_hash
)->root
.type
== bfd_link_hash_defined
1362 || (*sym_hash
)->root
.type
== bfd_link_hash_defweak
)
1363 && (*sym_hash
)->root
.u
.def
.section
== sec
1364 && (*sym_hash
)->root
.u
.def
.value
== addr
)
1370 /* This is a version of bfd_generic_get_relocated_section_contents
1371 which uses mn10200_elf_relocate_section. */
1374 mn10200_elf_get_relocated_section_contents (output_bfd
, link_info
, link_order
,
1375 data
, relocateable
, symbols
)
1377 struct bfd_link_info
*link_info
;
1378 struct bfd_link_order
*link_order
;
1380 boolean relocateable
;
1383 Elf_Internal_Shdr
*symtab_hdr
;
1384 asection
*input_section
= link_order
->u
.indirect
.section
;
1385 bfd
*input_bfd
= input_section
->owner
;
1386 asection
**sections
= NULL
;
1387 Elf_Internal_Rela
*internal_relocs
= NULL
;
1388 Elf32_External_Sym
*external_syms
= NULL
;
1389 Elf_Internal_Sym
*internal_syms
= NULL
;
1391 /* We only need to handle the case of relaxing, or of having a
1392 particular set of section contents, specially. */
1394 || elf_section_data (input_section
)->this_hdr
.contents
== NULL
)
1395 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1400 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1402 memcpy (data
, elf_section_data (input_section
)->this_hdr
.contents
,
1403 input_section
->_raw_size
);
1405 if ((input_section
->flags
& SEC_RELOC
) != 0
1406 && input_section
->reloc_count
> 0)
1408 Elf_Internal_Sym
*isymp
;
1410 Elf32_External_Sym
*esym
, *esymend
;
1412 if (symtab_hdr
->contents
!= NULL
)
1413 external_syms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
1416 external_syms
= ((Elf32_External_Sym
*)
1417 bfd_malloc (symtab_hdr
->sh_info
1418 * sizeof (Elf32_External_Sym
)));
1419 if (external_syms
== NULL
&& symtab_hdr
->sh_info
> 0)
1421 if (bfd_seek (input_bfd
, symtab_hdr
->sh_offset
, SEEK_SET
) != 0
1422 || (bfd_read (external_syms
, sizeof (Elf32_External_Sym
),
1423 symtab_hdr
->sh_info
, input_bfd
)
1424 != (symtab_hdr
->sh_info
* sizeof (Elf32_External_Sym
))))
1428 internal_relocs
= (_bfd_elf32_link_read_relocs
1429 (input_bfd
, input_section
, (PTR
) NULL
,
1430 (Elf_Internal_Rela
*) NULL
, false));
1431 if (internal_relocs
== NULL
)
1434 internal_syms
= ((Elf_Internal_Sym
*)
1435 bfd_malloc (symtab_hdr
->sh_info
1436 * sizeof (Elf_Internal_Sym
)));
1437 if (internal_syms
== NULL
&& symtab_hdr
->sh_info
> 0)
1440 sections
= (asection
**) bfd_malloc (symtab_hdr
->sh_info
1441 * sizeof (asection
*));
1442 if (sections
== NULL
&& symtab_hdr
->sh_info
> 0)
1445 isymp
= internal_syms
;
1447 esym
= external_syms
;
1448 esymend
= esym
+ symtab_hdr
->sh_info
;
1449 for (; esym
< esymend
; ++esym
, ++isymp
, ++secpp
)
1453 bfd_elf32_swap_symbol_in (input_bfd
, esym
, isymp
);
1455 if (isymp
->st_shndx
== SHN_UNDEF
)
1456 isec
= bfd_und_section_ptr
;
1457 else if (isymp
->st_shndx
> 0 && isymp
->st_shndx
< SHN_LORESERVE
)
1458 isec
= bfd_section_from_elf_index (input_bfd
, isymp
->st_shndx
);
1459 else if (isymp
->st_shndx
== SHN_ABS
)
1460 isec
= bfd_abs_section_ptr
;
1461 else if (isymp
->st_shndx
== SHN_COMMON
)
1462 isec
= bfd_com_section_ptr
;
1472 if (! mn10200_elf_relocate_section (output_bfd
, link_info
, input_bfd
,
1473 input_section
, data
, internal_relocs
,
1474 internal_syms
, sections
))
1477 if (sections
!= NULL
)
1480 if (internal_syms
!= NULL
)
1481 free (internal_syms
);
1482 internal_syms
= NULL
;
1483 if (external_syms
!= NULL
&& symtab_hdr
->contents
== NULL
)
1484 free (external_syms
);
1485 external_syms
= NULL
;
1486 if (internal_relocs
!= elf_section_data (input_section
)->relocs
)
1487 free (internal_relocs
);
1488 internal_relocs
= NULL
;
1494 if (internal_relocs
!= NULL
1495 && internal_relocs
!= elf_section_data (input_section
)->relocs
)
1496 free (internal_relocs
);
1497 if (external_syms
!= NULL
&& symtab_hdr
->contents
== NULL
)
1498 free (external_syms
);
1499 if (internal_syms
!= NULL
)
1500 free (internal_syms
);
1501 if (sections
!= NULL
)
1506 #define TARGET_LITTLE_SYM bfd_elf32_mn10200_vec
1507 #define TARGET_LITTLE_NAME "elf32-mn10200"
1508 #define ELF_ARCH bfd_arch_mn10200
1509 #define ELF_MACHINE_CODE EM_CYGNUS_MN10200
1510 #define ELF_MAXPAGESIZE 0x1000
1512 #define elf_info_to_howto mn10200_info_to_howto
1513 #define elf_info_to_howto_rel 0
1514 #define elf_backend_relocate_section mn10200_elf_relocate_section
1515 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section
1516 #define bfd_elf32_bfd_get_relocated_section_contents \
1517 mn10200_elf_get_relocated_section_contents
1519 #define elf_symbol_leading_char '_'
1521 #include "elf32-target.h"