1 /* M16C/M32C specific support for 32-bit ELF.
2 Copyright (C) 2005, 2006
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 #include "libiberty.h"
28 /* Forward declarations. */
29 static reloc_howto_type
* m32c_reloc_type_lookup
30 (bfd
*, bfd_reloc_code_real_type
);
31 static void m32c_info_to_howto_rela
32 (bfd
*, arelent
*, Elf_Internal_Rela
*);
33 static bfd_boolean m32c_elf_relocate_section
34 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**);
35 static bfd_boolean m32c_elf_gc_sweep_hook
36 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
37 static asection
* m32c_elf_gc_mark_hook
38 (asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*, struct elf_link_hash_entry
*, Elf_Internal_Sym
*);
39 static bfd_boolean m32c_elf_check_relocs
40 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
41 static bfd_boolean
m32c_elf_relax_delete_bytes (bfd
*, asection
*, bfd_vma
, int);
43 char * m32c_get_reloc (long reloc
);
44 void dump_symtab (bfd
*, void *, void *);
46 static bfd_boolean m32c_elf_relax_section
47 (bfd
*abfd
, asection
*sec
, struct bfd_link_info
*link_info
, bfd_boolean
*again
);
50 static reloc_howto_type m32c_elf_howto_table
[] =
52 /* This reloc does nothing. */
53 HOWTO (R_M32C_NONE
, /* type */
55 0, /* size (0 = byte, 1 = short, 2 = long) */
57 FALSE
, /* pc_relative */
59 complain_overflow_bitfield
, /* complain_on_overflow */
60 bfd_elf_generic_reloc
, /* special_function */
61 "R_M32C_NONE", /* name */
62 FALSE
, /* partial_inplace */
65 FALSE
), /* pcrel_offset */
67 HOWTO (R_M32C_16
, /* type */
69 1, /* size (0 = byte, 1 = short, 2 = long) */
71 FALSE
, /* pc_relative */
73 complain_overflow_bitfield
, /* complain_on_overflow */
74 bfd_elf_generic_reloc
, /* special_function */
75 "R_M32C_16", /* name */
76 FALSE
, /* partial_inplace */
78 0xffff, /* dst_mask */
79 FALSE
), /* pcrel_offset */
81 HOWTO (R_M32C_24
, /* type */
83 2, /* size (0 = byte, 1 = short, 2 = long) */
85 FALSE
, /* pc_relative */
87 complain_overflow_bitfield
, /* complain_on_overflow */
88 bfd_elf_generic_reloc
, /* special_function */
89 "R_M32C_24", /* name */
90 FALSE
, /* partial_inplace */
92 0xffffff, /* dst_mask */
93 FALSE
), /* pcrel_offset */
95 HOWTO (R_M32C_32
, /* type */
97 2, /* size (0 = byte, 1 = short, 2 = long) */
99 FALSE
, /* pc_relative */
101 complain_overflow_bitfield
, /* complain_on_overflow */
102 bfd_elf_generic_reloc
, /* special_function */
103 "R_M32C_32", /* name */
104 FALSE
, /* partial_inplace */
106 0xffffffff, /* dst_mask */
107 FALSE
), /* pcrel_offset */
109 HOWTO (R_M32C_8_PCREL
, /* type */
111 0, /* size (0 = byte, 1 = short, 2 = long) */
113 TRUE
, /* pc_relative */
115 complain_overflow_signed
, /* complain_on_overflow */
116 bfd_elf_generic_reloc
, /* special_function */
117 "R_M32C_8_PCREL", /* name */
118 FALSE
, /* partial_inplace */
121 TRUE
), /* pcrel_offset */
123 HOWTO (R_M32C_16_PCREL
, /* type */
125 1, /* size (0 = byte, 1 = short, 2 = long) */
127 TRUE
, /* pc_relative */
129 complain_overflow_signed
, /* complain_on_overflow */
130 bfd_elf_generic_reloc
, /* special_function */
131 "R_M32C_16_PCREL", /* name */
132 FALSE
, /* partial_inplace */
134 0xffff, /* dst_mask */
135 TRUE
), /* pcrel_offset */
137 HOWTO (R_M32C_8
, /* type */
139 0, /* size (0 = byte, 1 = short, 2 = long) */
141 FALSE
, /* pc_relative */
143 complain_overflow_unsigned
, /* complain_on_overflow */
144 bfd_elf_generic_reloc
, /* special_function */
145 "R_M32C_8", /* name */
146 FALSE
, /* partial_inplace */
149 FALSE
), /* pcrel_offset */
151 HOWTO (R_M32C_LO16
, /* type */
153 1, /* size (0 = byte, 1 = short, 2 = long) */
155 FALSE
, /* pc_relative */
157 complain_overflow_dont
, /* complain_on_overflow */
158 bfd_elf_generic_reloc
, /* special_function */
159 "R_M32C_LO16", /* name */
160 FALSE
, /* partial_inplace */
162 0xffff, /* dst_mask */
163 FALSE
), /* pcrel_offset */
165 HOWTO (R_M32C_HI8
, /* type */
167 0, /* size (0 = byte, 1 = short, 2 = long) */
169 FALSE
, /* pc_relative */
171 complain_overflow_dont
, /* complain_on_overflow */
172 bfd_elf_generic_reloc
, /* special_function */
173 "R_M32C_HI8", /* name */
174 FALSE
, /* partial_inplace */
177 FALSE
), /* pcrel_offset */
179 HOWTO (R_M32C_HI16
, /* type */
181 1, /* size (0 = byte, 1 = short, 2 = long) */
183 FALSE
, /* pc_relative */
185 complain_overflow_dont
, /* complain_on_overflow */
186 bfd_elf_generic_reloc
, /* special_function */
187 "R_M32C_HI16", /* name */
188 FALSE
, /* partial_inplace */
190 0xffff, /* dst_mask */
191 FALSE
), /* pcrel_offset */
193 HOWTO (R_M32C_RL_JUMP
, /* type */
195 0, /* size (0 = byte, 1 = short, 2 = long) */
197 FALSE
, /* pc_relative */
199 complain_overflow_signed
, /* complain_on_overflow */
200 bfd_elf_generic_reloc
, /* special_function */
201 "R_M32C_RL_JUMP", /* name */
202 FALSE
, /* partial_inplace */
205 FALSE
), /* pcrel_offset */
207 HOWTO (R_M32C_RL_1ADDR
, /* type */
209 0, /* size (0 = byte, 1 = short, 2 = long) */
211 FALSE
, /* pc_relative */
213 complain_overflow_signed
, /* complain_on_overflow */
214 bfd_elf_generic_reloc
, /* special_function */
215 "R_M32C_RL_1ADDR", /* name */
216 FALSE
, /* partial_inplace */
219 FALSE
), /* pcrel_offset */
221 HOWTO (R_M32C_RL_2ADDR
, /* type */
223 0, /* size (0 = byte, 1 = short, 2 = long) */
225 FALSE
, /* pc_relative */
227 complain_overflow_signed
, /* complain_on_overflow */
228 bfd_elf_generic_reloc
, /* special_function */
229 "R_M32C_RL_2ADDR", /* name */
230 FALSE
, /* partial_inplace */
233 FALSE
), /* pcrel_offset */
237 /* Map BFD reloc types to M32C ELF reloc types. */
239 struct m32c_reloc_map
241 bfd_reloc_code_real_type bfd_reloc_val
;
242 unsigned int m32c_reloc_val
;
245 static const struct m32c_reloc_map m32c_reloc_map
[] =
247 { BFD_RELOC_NONE
, R_M32C_NONE
},
248 { BFD_RELOC_16
, R_M32C_16
},
249 { BFD_RELOC_24
, R_M32C_24
},
250 { BFD_RELOC_32
, R_M32C_32
},
251 { BFD_RELOC_8_PCREL
, R_M32C_8_PCREL
},
252 { BFD_RELOC_16_PCREL
, R_M32C_16_PCREL
},
253 { BFD_RELOC_8
, R_M32C_8
},
254 { BFD_RELOC_LO16
, R_M32C_LO16
},
255 { BFD_RELOC_HI16
, R_M32C_HI16
},
256 { BFD_RELOC_M32C_HI8
, R_M32C_HI8
},
257 { BFD_RELOC_M32C_RL_JUMP
, R_M32C_RL_JUMP
},
258 { BFD_RELOC_M32C_RL_1ADDR
, R_M32C_RL_1ADDR
},
259 { BFD_RELOC_M32C_RL_2ADDR
, R_M32C_RL_2ADDR
}
262 static reloc_howto_type
*
263 m32c_reloc_type_lookup
264 (bfd
* abfd ATTRIBUTE_UNUSED
,
265 bfd_reloc_code_real_type code
)
269 for (i
= ARRAY_SIZE (m32c_reloc_map
); --i
;)
270 if (m32c_reloc_map
[i
].bfd_reloc_val
== code
)
271 return & m32c_elf_howto_table
[m32c_reloc_map
[i
].m32c_reloc_val
];
276 /* Set the howto pointer for an M32C ELF reloc. */
279 m32c_info_to_howto_rela
280 (bfd
* abfd ATTRIBUTE_UNUSED
,
282 Elf_Internal_Rela
* dst
)
286 r_type
= ELF32_R_TYPE (dst
->r_info
);
287 BFD_ASSERT (r_type
< (unsigned int) R_M32C_max
);
288 cache_ptr
->howto
= & m32c_elf_howto_table
[r_type
];
293 /* Relocate an M32C ELF section.
294 There is some attempt to make this function usable for many architectures,
295 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
296 if only to serve as a learning tool.
298 The RELOCATE_SECTION function is called by the new ELF backend linker
299 to handle the relocations for a section.
301 The relocs are always passed as Rela structures; if the section
302 actually uses Rel structures, the r_addend field will always be
305 This function is responsible for adjusting the section contents as
306 necessary, and (if using Rela relocs and generating a relocatable
307 output file) adjusting the reloc addend as necessary.
309 This function does not have to worry about setting the reloc
310 address or the reloc symbol index.
312 LOCAL_SYMS is a pointer to the swapped in local symbols.
314 LOCAL_SECTIONS is an array giving the section in the input file
315 corresponding to the st_shndx field of each local symbol.
317 The global hash table entry for the global symbols can be found
318 via elf_sym_hashes (input_bfd).
320 When generating relocatable output, this function must handle
321 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
322 going to be the section symbol corresponding to the output
323 section, which means that the addend must be adjusted
327 m32c_elf_relocate_section
328 (bfd
* output_bfd ATTRIBUTE_UNUSED
,
329 struct bfd_link_info
* info
,
331 asection
* input_section
,
333 Elf_Internal_Rela
* relocs
,
334 Elf_Internal_Sym
* local_syms
,
335 asection
** local_sections
)
337 Elf_Internal_Shdr
* symtab_hdr
;
338 struct elf_link_hash_entry
** sym_hashes
;
339 Elf_Internal_Rela
* rel
;
340 Elf_Internal_Rela
* relend
;
344 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
345 sym_hashes
= elf_sym_hashes (input_bfd
);
346 relend
= relocs
+ input_section
->reloc_count
;
348 dynobj
= elf_hash_table (info
)->dynobj
;
351 splt
= bfd_get_section_by_name (dynobj
, ".plt");
353 for (rel
= relocs
; rel
< relend
; rel
++)
355 reloc_howto_type
* howto
;
356 unsigned long r_symndx
;
357 Elf_Internal_Sym
* sym
;
359 struct elf_link_hash_entry
* h
;
361 bfd_reloc_status_type r
;
362 const char * name
= NULL
;
365 r_type
= ELF32_R_TYPE (rel
->r_info
);
367 /* These are only used for relaxing; we don't actually relocate
368 anything with them, so skip them. */
369 if (r_type
== R_M32C_RL_JUMP
370 || r_type
== R_M32C_RL_1ADDR
371 || r_type
== R_M32C_RL_2ADDR
)
374 r_symndx
= ELF32_R_SYM (rel
->r_info
);
376 if (info
->relocatable
)
378 /* This is a relocatable link. We don't have to change
379 anything, unless the reloc is against a section symbol,
380 in which case we have to adjust according to where the
381 section symbol winds up in the output section. */
382 if (r_symndx
< symtab_hdr
->sh_info
)
384 sym
= local_syms
+ r_symndx
;
386 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
388 sec
= local_sections
[r_symndx
];
389 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
396 /* This is a final link. */
397 howto
= m32c_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
402 if (r_symndx
< symtab_hdr
->sh_info
)
404 sym
= local_syms
+ r_symndx
;
405 sec
= local_sections
[r_symndx
];
406 relocation
= (sec
->output_section
->vma
410 name
= bfd_elf_string_from_elf_section
411 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
412 name
= (sym
->st_name
== 0) ? bfd_section_name (input_bfd
, sec
) : name
;
416 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
418 while (h
->root
.type
== bfd_link_hash_indirect
419 || h
->root
.type
== bfd_link_hash_warning
)
420 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
422 name
= h
->root
.root
.string
;
424 if (h
->root
.type
== bfd_link_hash_defined
425 || h
->root
.type
== bfd_link_hash_defweak
)
427 sec
= h
->root
.u
.def
.section
;
428 relocation
= (h
->root
.u
.def
.value
429 + sec
->output_section
->vma
430 + sec
->output_offset
);
432 else if (h
->root
.type
== bfd_link_hash_undefweak
)
438 if (! ((*info
->callbacks
->undefined_symbol
)
439 (info
, h
->root
.root
.string
, input_bfd
,
440 input_section
, rel
->r_offset
, TRUE
)))
446 switch (ELF32_R_TYPE (rel
->r_info
))
453 plt_offset
= &h
->plt
.offset
;
455 plt_offset
= elf_local_got_offsets (input_bfd
) + r_symndx
;
457 /* printf("%s: rel %x plt %d\n", h ? h->root.root.string : "(none)",
458 relocation, *plt_offset);*/
459 if (relocation
<= 0xffff)
461 /* If the symbol is in range for a 16-bit address, we should
462 have deallocated the plt entry in relax_section. */
463 BFD_ASSERT (*plt_offset
== (bfd_vma
) -1);
467 /* If the symbol is out of range for a 16-bit address,
468 we must have allocated a plt entry. */
469 BFD_ASSERT (*plt_offset
!= (bfd_vma
) -1);
471 /* If this is the first time we've processed this symbol,
472 fill in the plt entry with the correct symbol address. */
473 if ((*plt_offset
& 1) == 0)
477 x
= 0x000000fc; /* jmpf */
478 x
|= (relocation
<< 8) & 0xffffff00;
479 bfd_put_32 (input_bfd
, x
, splt
->contents
+ *plt_offset
);
483 relocation
= (splt
->output_section
->vma
484 + splt
->output_offset
485 + (*plt_offset
& -2));
488 char *newname
= bfd_malloc (strlen(name
)+5);
489 strcpy (newname
, name
);
490 strcat(newname
, ".plt");
491 _bfd_generic_link_add_one_symbol (info
,
494 BSF_FUNCTION
| BSF_WEAK
,
513 printf ("relocate %s at %06lx relocation %06lx addend %ld ",
514 m32c_elf_howto_table
[ELF32_R_TYPE(rel
->r_info
)].name
,
515 rel
->r_offset
+ input_section
->output_section
->vma
+ input_section
->output_offset
,
516 relocation
, rel
->r_addend
);
520 printf (" %02x", contents
[rel
->r_offset
+i
]);
524 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
525 contents
, rel
->r_offset
, relocation
,
528 if (r
!= bfd_reloc_ok
)
530 const char * msg
= (const char *) NULL
;
534 case bfd_reloc_overflow
:
535 r
= info
->callbacks
->reloc_overflow
536 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
537 input_bfd
, input_section
, rel
->r_offset
);
540 case bfd_reloc_undefined
:
541 r
= info
->callbacks
->undefined_symbol
542 (info
, name
, input_bfd
, input_section
, rel
->r_offset
,
546 case bfd_reloc_outofrange
:
547 msg
= _("internal error: out of range error");
550 case bfd_reloc_notsupported
:
551 msg
= _("internal error: unsupported relocation error");
554 case bfd_reloc_dangerous
:
555 msg
= _("internal error: dangerous relocation");
559 msg
= _("internal error: unknown error");
564 r
= info
->callbacks
->warning
565 (info
, msg
, name
, input_bfd
, input_section
, rel
->r_offset
);
575 /* Return the section that should be marked against GC for a given
579 m32c_elf_gc_mark_hook
581 struct bfd_link_info
* info ATTRIBUTE_UNUSED
,
582 Elf_Internal_Rela
* rel
,
583 struct elf_link_hash_entry
* h
,
584 Elf_Internal_Sym
* sym
)
588 switch (ELF32_R_TYPE (rel
->r_info
))
591 switch (h
->root
.type
)
593 case bfd_link_hash_defined
:
594 case bfd_link_hash_defweak
:
595 return h
->root
.u
.def
.section
;
597 case bfd_link_hash_common
:
598 return h
->root
.u
.c
.p
->section
;
607 if (!(elf_bad_symtab (sec
->owner
)
608 && ELF_ST_BIND (sym
->st_info
) != STB_LOCAL
)
609 && ! ((sym
->st_shndx
<= 0 || sym
->st_shndx
>= SHN_LORESERVE
)
610 && sym
->st_shndx
!= SHN_COMMON
))
612 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
619 /* Update the got entry reference counts for the section being removed. */
622 m32c_elf_gc_sweep_hook
623 (bfd
* abfd ATTRIBUTE_UNUSED
,
624 struct bfd_link_info
* info ATTRIBUTE_UNUSED
,
625 asection
* sec ATTRIBUTE_UNUSED
,
626 const Elf_Internal_Rela
* relocs ATTRIBUTE_UNUSED
)
631 /* We support 16-bit pointers to code above 64k by generating a thunk
632 below 64k containing a JMP instruction to the final address. */
635 m32c_elf_check_relocs
637 struct bfd_link_info
* info
,
639 const Elf_Internal_Rela
* relocs
)
641 Elf_Internal_Shdr
* symtab_hdr
;
642 struct elf_link_hash_entry
** sym_hashes
;
643 struct elf_link_hash_entry
** sym_hashes_end
;
644 const Elf_Internal_Rela
* rel
;
645 const Elf_Internal_Rela
* rel_end
;
646 bfd_vma
*local_plt_offsets
;
650 if (info
->relocatable
)
653 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
654 sym_hashes
= elf_sym_hashes (abfd
);
655 local_plt_offsets
= elf_local_got_offsets (abfd
);
657 dynobj
= elf_hash_table(info
)->dynobj
;
659 sym_hashes_end
= sym_hashes
+ symtab_hdr
->sh_size
/sizeof (Elf32_External_Sym
);
660 if (!elf_bad_symtab (abfd
))
661 sym_hashes_end
-= symtab_hdr
->sh_info
;
663 rel_end
= relocs
+ sec
->reloc_count
;
664 for (rel
= relocs
; rel
< rel_end
; rel
++)
666 struct elf_link_hash_entry
*h
;
667 unsigned long r_symndx
;
670 r_symndx
= ELF32_R_SYM (rel
->r_info
);
671 if (r_symndx
< symtab_hdr
->sh_info
)
675 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
676 while (h
->root
.type
== bfd_link_hash_indirect
677 || h
->root
.type
== bfd_link_hash_warning
)
678 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
681 switch (ELF32_R_TYPE (rel
->r_info
))
683 /* This relocation describes a 16-bit pointer to a function.
684 We may need to allocate a thunk in low memory; reserve memory
688 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
691 splt
= bfd_get_section_by_name (dynobj
, ".plt");
694 flagword flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
695 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
696 | SEC_READONLY
| SEC_CODE
);
697 splt
= bfd_make_section_with_flags (dynobj
, ".plt", flags
);
699 || ! bfd_set_section_alignment (dynobj
, splt
, 1))
705 offset
= &h
->plt
.offset
;
708 if (local_plt_offsets
== NULL
)
713 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
714 local_plt_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
715 if (local_plt_offsets
== NULL
)
717 elf_local_got_offsets (abfd
) = local_plt_offsets
;
719 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
720 local_plt_offsets
[i
] = (bfd_vma
) -1;
722 offset
= &local_plt_offsets
[r_symndx
];
725 if (*offset
== (bfd_vma
) -1)
727 *offset
= splt
->size
;
737 /* This must exist if dynobj is ever set. */
740 m32c_elf_finish_dynamic_sections (bfd
*abfd ATTRIBUTE_UNUSED
,
741 struct bfd_link_info
*info
)
746 /* As an extra sanity check, verify that all plt entries have
749 if ((dynobj
= elf_hash_table (info
)->dynobj
) != NULL
750 && (splt
= bfd_get_section_by_name (dynobj
, ".plt")) != NULL
)
752 bfd_byte
*contents
= splt
->contents
;
753 unsigned int i
, size
= splt
->size
;
754 for (i
= 0; i
< size
; i
+= 4)
756 unsigned int x
= bfd_get_32 (dynobj
, contents
+ i
);
765 m32c_elf_always_size_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
766 struct bfd_link_info
*info
)
771 if (info
->relocatable
)
774 dynobj
= elf_hash_table (info
)->dynobj
;
778 splt
= bfd_get_section_by_name (dynobj
, ".plt");
779 BFD_ASSERT (splt
!= NULL
);
781 splt
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, splt
->size
);
782 if (splt
->contents
== NULL
)
788 /* Function to set the ELF flag bits. */
791 m32c_elf_set_private_flags (bfd
*abfd
, flagword flags
)
793 elf_elfheader (abfd
)->e_flags
= flags
;
794 elf_flags_init (abfd
) = TRUE
;
798 /* Merge backend specific data from an object file to the output
799 object file when linking. */
802 m32c_elf_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
804 flagword old_flags
, old_partial
;
805 flagword new_flags
, new_partial
;
806 bfd_boolean error
= FALSE
;
810 new_opt
[0] = old_opt
[0] = '\0';
811 new_flags
= elf_elfheader (ibfd
)->e_flags
;
812 old_flags
= elf_elfheader (obfd
)->e_flags
;
815 (*_bfd_error_handler
) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
816 old_flags
, new_flags
, elf_flags_init (obfd
) ? "yes" : "no",
817 bfd_get_filename (ibfd
));
820 if (!elf_flags_init (obfd
))
822 /* First call, no flags set. */
823 elf_flags_init (obfd
) = TRUE
;
824 elf_elfheader (obfd
)->e_flags
= new_flags
;
827 else if (new_flags
== old_flags
)
828 /* Compatible flags are ok. */
831 else /* Possibly incompatible flags. */
833 /* Warn if different cpu is used (allow a specific cpu to override
835 new_partial
= (new_flags
& EF_M32C_CPU_MASK
);
836 old_partial
= (old_flags
& EF_M32C_CPU_MASK
);
837 if (new_partial
== old_partial
)
844 default: strcat (new_opt
, " -m16c"); break;
845 case EF_M32C_CPU_M16C
: strcat (new_opt
, " -m16c"); break;
846 case EF_M32C_CPU_M32C
: strcat (new_opt
, " -m32c"); break;
851 default: strcat (old_opt
, " -m16c"); break;
852 case EF_M32C_CPU_M16C
: strcat (old_opt
, " -m16c"); break;
853 case EF_M32C_CPU_M32C
: strcat (old_opt
, " -m32c"); break;
857 /* Print out any mismatches from above. */
861 (*_bfd_error_handler
)
862 (_("%s: compiled with %s and linked with modules compiled with %s"),
863 bfd_get_filename (ibfd
), new_opt
, old_opt
);
866 new_flags
&= ~ EF_M32C_ALL_FLAGS
;
867 old_flags
&= ~ EF_M32C_ALL_FLAGS
;
869 /* Warn about any other mismatches. */
870 if (new_flags
!= old_flags
)
873 (*_bfd_error_handler
)
874 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
875 bfd_get_filename (ibfd
), (long)new_flags
, (long)old_flags
);
880 bfd_set_error (bfd_error_bad_value
);
887 m32c_elf_print_private_bfd_data (bfd
*abfd
, PTR ptr
)
889 FILE *file
= (FILE *) ptr
;
892 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
894 /* Print normal ELF private data. */
895 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
897 flags
= elf_elfheader (abfd
)->e_flags
;
898 fprintf (file
, _("private flags = 0x%lx:"), (long)flags
);
900 switch (flags
& EF_M32C_CPU_MASK
)
903 case EF_M32C_CPU_M16C
: fprintf (file
, " -m16c"); break;
904 case EF_M32C_CPU_M32C
: fprintf (file
, " -m32c"); break;
911 /* Return the MACH for an e_flags value. */
914 elf32_m32c_machine (bfd
*abfd
)
916 switch (elf_elfheader (abfd
)->e_flags
& EF_M32C_CPU_MASK
)
918 case EF_M32C_CPU_M16C
: return bfd_mach_m16c
;
919 case EF_M32C_CPU_M32C
: return bfd_mach_m32c
;
922 return bfd_mach_m16c
;
926 m32c_elf_object_p (bfd
*abfd
)
928 bfd_default_set_arch_mach (abfd
, bfd_arch_m32c
,
929 elf32_m32c_machine (abfd
));
936 dump_symtab (bfd
* abfd
, void *internal_syms
, void *external_syms
)
939 Elf_Internal_Sym
*isymbuf
;
940 Elf_Internal_Sym
*isymend
;
941 Elf_Internal_Sym
*isym
;
942 Elf_Internal_Shdr
*symtab_hdr
;
943 bfd_boolean free_internal
= 0, free_external
= 0;
945 char * st_info_stb_str
;
951 internal_syms
= bfd_malloc (1000);
956 external_syms
= bfd_malloc (1000);
960 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
961 locsymcount
= symtab_hdr
->sh_size
/ get_elf_backend_data(abfd
)->s
->sizeof_sym
;
963 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
964 symtab_hdr
->sh_info
, 0,
965 internal_syms
, external_syms
, NULL
);
967 isymbuf
= internal_syms
;
968 isymend
= isymbuf
+ locsymcount
;
970 for (isym
= isymbuf
; isym
< isymend
; isym
++)
972 switch (ELF_ST_TYPE (isym
->st_info
))
974 case STT_FUNC
: st_info_str
= "STT_FUNC";
975 case STT_SECTION
: st_info_str
= "STT_SECTION";
976 case STT_FILE
: st_info_str
= "STT_FILE";
977 case STT_OBJECT
: st_info_str
= "STT_OBJECT";
978 case STT_TLS
: st_info_str
= "STT_TLS";
979 default: st_info_str
= "";
981 switch (ELF_ST_BIND (isym
->st_info
))
983 case STB_LOCAL
: st_info_stb_str
= "STB_LOCAL";
984 case STB_GLOBAL
: st_info_stb_str
= "STB_GLOBAL";
985 default: st_info_stb_str
= "";
987 switch (ELF_ST_VISIBILITY (isym
->st_other
))
989 case STV_DEFAULT
: st_other_str
= "STV_DEFAULT";
990 case STV_INTERNAL
: st_other_str
= "STV_INTERNAL";
991 case STV_PROTECTED
: st_other_str
= "STV_PROTECTED";
992 default: st_other_str
= "";
994 switch (isym
->st_shndx
)
996 case SHN_ABS
: st_shndx_str
= "SHN_ABS";
997 case SHN_COMMON
: st_shndx_str
= "SHN_COMMON";
998 case SHN_UNDEF
: st_shndx_str
= "SHN_UNDEF";
999 default: st_shndx_str
= "";
1002 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
1003 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
1005 (unsigned long) isym
->st_value
,
1006 (unsigned long) isym
->st_size
,
1008 bfd_elf_string_from_elf_section (abfd
, symtab_hdr
->sh_link
,
1010 isym
->st_info
, st_info_str
, st_info_stb_str
,
1011 isym
->st_other
, st_other_str
,
1012 isym
->st_shndx
, st_shndx_str
);
1015 free (internal_syms
);
1017 free (external_syms
);
1021 m32c_get_reloc (long reloc
)
1023 if (0 <= reloc
&& reloc
< R_M32C_max
)
1024 return m32c_elf_howto_table
[reloc
].name
;
1030 /* Handle relaxing. */
1032 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1033 is within the low 64k, remove any entry for it in the plt. */
1035 struct relax_plt_data
1042 m32c_relax_plt_check (struct elf_link_hash_entry
*h
,
1045 struct relax_plt_data
*data
= (struct relax_plt_data
*) xdata
;
1047 if (h
->root
.type
== bfd_link_hash_warning
)
1048 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1050 if (h
->plt
.offset
!= (bfd_vma
) -1)
1054 if (h
->root
.type
== bfd_link_hash_undefined
1055 || h
->root
.type
== bfd_link_hash_undefweak
)
1058 address
= (h
->root
.u
.def
.section
->output_section
->vma
1059 + h
->root
.u
.def
.section
->output_offset
1060 + h
->root
.u
.def
.value
);
1062 if (address
<= 0xffff)
1065 data
->splt
->size
-= 4;
1066 *data
->again
= TRUE
;
1073 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1074 previously had a plt entry, give it a new entry offset. */
1077 m32c_relax_plt_realloc (struct elf_link_hash_entry
*h
,
1080 bfd_vma
*entry
= (bfd_vma
*) xdata
;
1082 if (h
->root
.type
== bfd_link_hash_warning
)
1083 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1085 if (h
->plt
.offset
!= (bfd_vma
) -1)
1087 h
->plt
.offset
= *entry
;
1095 m32c_elf_relax_plt_section (bfd
*dynobj
,
1097 struct bfd_link_info
*info
,
1100 struct relax_plt_data relax_plt_data
;
1103 /* Assume nothing changes. */
1106 if (info
->relocatable
)
1109 /* We only relax the .plt section at the moment. */
1110 if (dynobj
!= elf_hash_table (info
)->dynobj
1111 || strcmp (splt
->name
, ".plt") != 0)
1114 /* Quick check for an empty plt. */
1115 if (splt
->size
== 0)
1118 /* Map across all global symbols; see which ones happen to
1119 fall in the low 64k. */
1120 relax_plt_data
.splt
= splt
;
1121 relax_plt_data
.again
= again
;
1122 elf_link_hash_traverse (elf_hash_table (info
), m32c_relax_plt_check
,
1125 /* Likewise for local symbols, though that's somewhat less convenient
1126 as we have to walk the list of input bfds and swap in symbol data. */
1127 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
1129 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1130 Elf_Internal_Shdr
*symtab_hdr
;
1131 Elf_Internal_Sym
*isymbuf
= NULL
;
1134 if (! local_plt_offsets
)
1137 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1138 if (symtab_hdr
->sh_info
!= 0)
1140 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1141 if (isymbuf
== NULL
)
1142 isymbuf
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
1143 symtab_hdr
->sh_info
, 0,
1145 if (isymbuf
== NULL
)
1149 for (idx
= 0; idx
< symtab_hdr
->sh_info
; ++idx
)
1151 Elf_Internal_Sym
*isym
;
1155 if (local_plt_offsets
[idx
] == (bfd_vma
) -1)
1158 isym
= &isymbuf
[idx
];
1159 if (isym
->st_shndx
== SHN_UNDEF
)
1161 else if (isym
->st_shndx
== SHN_ABS
)
1162 tsec
= bfd_abs_section_ptr
;
1163 else if (isym
->st_shndx
== SHN_COMMON
)
1164 tsec
= bfd_com_section_ptr
;
1166 tsec
= bfd_section_from_elf_index (ibfd
, isym
->st_shndx
);
1168 address
= (tsec
->output_section
->vma
1169 + tsec
->output_offset
1171 if (address
<= 0xffff)
1173 local_plt_offsets
[idx
] = -1;
1180 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1182 if (! info
->keep_memory
)
1186 /* Cache the symbols for elf_link_input_bfd. */
1187 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1192 /* If we changed anything, walk the symbols again to reallocate
1193 .plt entry addresses. */
1194 if (*again
&& splt
->size
> 0)
1198 elf_link_hash_traverse (elf_hash_table (info
),
1199 m32c_relax_plt_realloc
, &entry
);
1201 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
1203 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1204 unsigned int nlocals
= elf_tdata (ibfd
)->symtab_hdr
.sh_info
;
1207 if (! local_plt_offsets
)
1210 for (idx
= 0; idx
< nlocals
; ++idx
)
1211 if (local_plt_offsets
[idx
] != (bfd_vma
) -1)
1213 local_plt_offsets
[idx
] = entry
;
1223 compare_reloc (const void *e1
, const void *e2
)
1225 const Elf_Internal_Rela
*i1
= (const Elf_Internal_Rela
*) e1
;
1226 const Elf_Internal_Rela
*i2
= (const Elf_Internal_Rela
*) e2
;
1228 if (i1
->r_offset
== i2
->r_offset
)
1231 return i1
->r_offset
< i2
->r_offset
? -1 : 1;
1234 #define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1236 m32c_offset_for_reloc (bfd
*abfd
,
1237 Elf_Internal_Rela
*rel
,
1238 Elf_Internal_Shdr
*symtab_hdr
,
1239 Elf_External_Sym_Shndx
*shndx_buf
,
1240 Elf_Internal_Sym
*intsyms
)
1244 /* Get the value of the symbol referred to by the reloc. */
1245 if (ELF32_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
1247 /* A local symbol. */
1248 Elf_Internal_Sym
*isym
;
1249 Elf_External_Sym_Shndx
*shndx
;
1253 isym
= intsyms
+ ELF32_R_SYM (rel
->r_info
);
1254 ssec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1255 shndx
= shndx_buf
+ (shndx_buf
? ELF32_R_SYM (rel
->r_info
) : 0);
1257 symval
= isym
->st_value
;
1259 symval
+= ssec
->output_section
->vma
1260 + ssec
->output_offset
;
1265 struct elf_link_hash_entry
*h
;
1267 /* An external symbol. */
1268 indx
= ELF32_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
1269 h
= elf_sym_hashes (abfd
)[indx
];
1270 BFD_ASSERT (h
!= NULL
);
1272 if (h
->root
.type
!= bfd_link_hash_defined
1273 && h
->root
.type
!= bfd_link_hash_defweak
)
1274 /* This appears to be a reference to an undefined
1275 symbol. Just ignore it--it will be caught by the
1276 regular reloc processing. */
1279 symval
= (h
->root
.u
.def
.value
1280 + h
->root
.u
.def
.section
->output_section
->vma
1281 + h
->root
.u
.def
.section
->output_offset
);
1286 static int bytes_saved
= 0;
1288 static int bytes_to_reloc
[] = {
1296 /* What we use the bits in a relax reloc addend (R_M32C_RL_*) for. */
1298 /* Mask for the number of relocs associated with this insn. */
1299 #define RLA_RELOCS 0x0000000f
1300 /* Number of bytes gas emitted (before gas's relaxing) */
1301 #define RLA_NBYTES 0x00000ff0
1303 /* If the displacement is within the given range and the new encoding
1304 differs from the old encoding (the index), then the insn can be
1305 relaxed to the new encoding. */
1308 unsigned int max_disp
;
1309 unsigned char new_encoding
;
1312 static EncodingTable m16c_addr_encodings
[] = {
1313 { 0, 0, 0 }, /* R0 */
1314 { 0, 0, 1 }, /* R1 */
1315 { 0, 0, 2 }, /* R2 */
1316 { 0, 0, 3 }, /* R3 */
1317 { 0, 0, 4 }, /* A0 */
1318 { 0, 0, 5 }, /* A1 */
1319 { 0, 0, 6 }, /* [A0] */
1320 { 0, 0, 7 }, /* [A1] */
1321 { 1, 0, 6 }, /* udsp:8[A0] */
1322 { 1, 0, 7 }, /* udsp:8[A1] */
1323 { 1, 0, 10 }, /* udsp:8[SB] */
1324 { 1, 0, 11 }, /* sdsp:8[FB] */
1325 { 2, 255, 8 }, /* udsp:16[A0] */
1326 { 2, 255, 9 }, /* udsp:16[A1] */
1327 { 2, 255, 10 }, /* udsp:16[SB] */
1328 { 2, 0, 15 }, /* abs:16 */
1331 static EncodingTable m16c_jmpaddr_encodings
[] = {
1332 { 0, 0, 0 }, /* R0 */
1333 { 0, 0, 1 }, /* R1 */
1334 { 0, 0, 2 }, /* R2 */
1335 { 0, 0, 3 }, /* R3 */
1336 { 0, 0, 4 }, /* A0 */
1337 { 0, 0, 5 }, /* A1 */
1338 { 0, 0, 6 }, /* [A0] */
1339 { 0, 0, 7 }, /* [A1] */
1340 { 1, 0, 6 }, /* udsp:8[A0] */
1341 { 1, 0, 7 }, /* udsp:8[A1] */
1342 { 1, 0, 10 }, /* udsp:8[SB] */
1343 { 1, 0, 11 }, /* sdsp:8[FB] */
1344 { 3, 255, 8 }, /* udsp:20[A0] */
1345 { 3, 255, 9 }, /* udsp:20[A1] */
1346 { 2, 255, 10 }, /* udsp:16[SB] */
1347 { 2, 0, 15 }, /* abs:16 */
1350 static EncodingTable m32c_addr_encodings
[] = {
1351 { 0, 0, 0 }, /* [A0] */
1352 { 0, 0, 1 }, /* [A1] */
1353 { 0, 0, 2 }, /* A0 */
1354 { 0, 0, 3 }, /* A1 */
1355 { 1, 0, 0 }, /* udsp:8[A0] */
1356 { 1, 0, 1 }, /* udsp:8[A1] */
1357 { 1, 0, 6 }, /* udsp:8[SB] */
1358 { 1, 0, 7 }, /* sdsp:8[FB] */
1359 { 2, 255, 4 }, /* udsp:16[A0] */
1360 { 2, 255, 5 }, /* udsp:16[A1] */
1361 { 2, 255, 6 }, /* udsp:16[SB] */
1362 { 2, 127, 7 }, /* sdsp:16[FB] */
1363 { 3, 65535, 8 }, /* udsp:24[A0] */
1364 { 3, 65535, 9 }, /* udsp:24[A1] */
1365 { 3, 65535, 15 }, /* abs24 */
1366 { 2, 0, 15 }, /* abs16 */
1367 { 0, 0, 16 }, /* R2 */
1368 { 0, 0, 17 }, /* R3 */
1369 { 0, 0, 18 }, /* R0 */
1370 { 0, 0, 19 }, /* R1 */
1386 m32c_elf_relax_section
1389 struct bfd_link_info
* link_info
,
1390 bfd_boolean
* again
)
1392 Elf_Internal_Shdr
*symtab_hdr
;
1393 Elf_Internal_Shdr
*shndx_hdr
;
1394 Elf_Internal_Rela
*internal_relocs
;
1395 Elf_Internal_Rela
*free_relocs
= NULL
;
1396 Elf_Internal_Rela
*irel
, *irelend
, *srel
;
1397 bfd_byte
* contents
= NULL
;
1398 bfd_byte
* free_contents
= NULL
;
1399 Elf_Internal_Sym
*intsyms
= NULL
;
1400 Elf_Internal_Sym
*free_intsyms
= NULL
;
1401 Elf_External_Sym_Shndx
*shndx_buf
= NULL
;
1404 if (abfd
== elf_hash_table (link_info
)->dynobj
1405 && strcmp (sec
->name
, ".plt") == 0)
1406 return m32c_elf_relax_plt_section (abfd
, sec
, link_info
, again
);
1408 /* Assume nothing changes. */
1411 machine
= elf32_m32c_machine (abfd
);
1413 /* We don't have to do anything for a relocatable link, if
1414 this section does not have relocs, or if this is not a
1416 if (link_info
->relocatable
1417 || (sec
->flags
& SEC_RELOC
) == 0
1418 || sec
->reloc_count
== 0
1419 || (sec
->flags
& SEC_CODE
) == 0)
1422 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1423 shndx_hdr
= &elf_tdata (abfd
)->symtab_shndx_hdr
;
1425 /* Get the section contents. */
1426 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1427 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1428 /* Go get them off disk. */
1429 else if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1432 /* Read this BFD's symbols. */
1433 /* Get cached copy if it exists. */
1434 if (symtab_hdr
->contents
!= NULL
)
1436 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1440 intsyms
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
, symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
1441 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
1444 if (shndx_hdr
->sh_size
!= 0)
1448 amt
= symtab_hdr
->sh_info
;
1449 amt
*= sizeof (Elf_External_Sym_Shndx
);
1450 shndx_buf
= (Elf_External_Sym_Shndx
*) bfd_malloc (amt
);
1451 if (shndx_buf
== NULL
)
1453 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0
1454 || bfd_bread ((PTR
) shndx_buf
, amt
, abfd
) != amt
)
1456 shndx_hdr
->contents
= (bfd_byte
*) shndx_buf
;
1459 /* Get a copy of the native relocations. */
1460 internal_relocs
= (_bfd_elf_link_read_relocs
1461 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
1462 link_info
->keep_memory
));
1463 if (internal_relocs
== NULL
)
1465 if (! link_info
->keep_memory
)
1466 free_relocs
= internal_relocs
;
1468 /* The RL_ relocs must be just before the operand relocs they go
1469 with, so we must sort them to guarantee this. */
1470 qsort (internal_relocs
, sec
->reloc_count
, sizeof (Elf_Internal_Rela
),
1473 /* Walk through them looking for relaxing opportunities. */
1474 irelend
= internal_relocs
+ sec
->reloc_count
;
1476 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1479 unsigned char *insn
, *gap
, *einsn
;
1481 bfd_signed_vma pcrel
;
1487 EncodingTable
*enctbl
;
1490 if (ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_JUMP
1491 && ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_1ADDR
1492 && ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_2ADDR
)
1497 /* There will always be room for the relaxed insn, since it is smaller
1498 than the one it would replace. */
1499 BFD_ASSERT (irel
->r_offset
< sec
->size
);
1501 insn
= contents
+ irel
->r_offset
;
1502 relax_relocs
= irel
->r_addend
% 16;
1504 /* Ok, we only have three relocs we care about, and they're all
1505 fake. The lower four bits of the addend is always the number
1506 of following relocs (hence the qsort above) that are assigned
1507 to this opcode. The next 8 bits of the addend indicates the
1508 number of bytes in the insn. We use the rest of them
1509 ourselves as flags for the more expensive operations (defines
1510 above). The three relocs are:
1512 RL_JUMP: This marks all direct jump insns. We check the
1513 displacement and replace them with shorter jumps if
1514 they're in range. We also use this to find JMP.S
1515 insns and manually shorten them when we delete bytes.
1516 We have to decode these insns to figure out what to
1519 RL_1ADDR: This is a :G or :Q insn, which has a single
1520 "standard" operand. We have to extract the type
1521 field, see if it's a wide displacement, then figure
1522 out if we can replace it with a narrow displacement.
1523 We don't have to decode these insns.
1525 RL_2ADDR: Similarly, but two "standard" operands. Note that
1526 r_addend may still be 1, as standard operands don't
1527 always have displacements. Gas shouldn't give us one
1528 with zero operands, but since we don't know which one
1529 has the displacement, we check them both anyway.
1531 These all point to the beginning of the insn itself, not the
1534 Note that we only relax one step at a time, relying on the
1535 linker to call us repeatedly. Thus, there is no code for
1536 JMP.A->JMP.B although that will happen in two steps.
1537 Likewise, for 2ADDR relaxes, we do one operand per cycle.
1540 /* Get the value of the symbol referred to by the reloc. Just
1541 in case this is the last reloc in the list, use the RL's
1542 addend to choose between this reloc (no addend) or the next
1543 (yes addend, which means at least one following reloc). */
1544 srel
= irel
+ (relax_relocs
? 1 : 0);
1545 symval
= OFFSET_FOR_RELOC (srel
);
1547 /* Setting gap_size nonzero is the flag which means "something
1551 new_type
= ELF32_R_TYPE(srel
->r_info
);
1553 pc
= sec
->output_section
->vma
+ sec
->output_offset
1555 pcrel
= symval
- pc
+ srel
->r_addend
;
1557 if (machine
== bfd_mach_m16c
)
1561 switch (ELF32_R_TYPE(irel
->r_info
))
1564 case R_M32C_RL_JUMP
:
1567 case 0xfe: /* jmp.b */
1568 if (pcrel
>= 2 && pcrel
<= 9)
1570 /* Relax JMP.B -> JMP.S. We need to get rid of
1571 the following reloc though. */
1572 insn
[0] = 0x60 | (pcrel
- 2);
1573 new_type
= R_M32C_NONE
;
1574 irel
->r_addend
= 0x10;
1580 case 0xf4: /* jmp.w */
1581 /* 128 is allowed because it will be one byte closer
1582 after relaxing. Likewise for all other pc-rel
1584 if (pcrel
<= 128 && pcrel
>= -128)
1586 /* Relax JMP.W -> JMP.B */
1589 new_type
= R_M32C_8_PCREL
;
1595 case 0xfc: /* jmp.a */
1596 if (pcrel
<= 32768 && pcrel
>= -32768)
1598 /* Relax JMP.A -> JMP.W */
1602 new_type
= R_M32C_16_PCREL
;
1608 case 0xfd: /* jsr.a */
1609 if (pcrel
<= 32768 && pcrel
>= -32768)
1611 /* Relax JSR.A -> JSR.W */
1615 new_type
= R_M32C_16_PCREL
;
1623 case R_M32C_RL_2ADDR
:
1624 /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1626 enctbl
= m16c_addr_encodings
;
1628 enc
= (insn
[1] >> 4) & 0x0f;
1631 if (srel
->r_offset
== irel
->r_offset
+ posn
1632 && e
->new_encoding
!= enc
1633 && symval
<= e
->max_disp
)
1636 insn
[1] |= e
->new_encoding
<< 4;
1637 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1638 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1639 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1642 if (relax_relocs
== 2)
1648 case R_M32C_RL_1ADDR
:
1649 /* xxxx xxxx xxxx dest [disp] */
1651 enctbl
= m16c_addr_encodings
;
1654 /* Check the opcode for jumps. We know it's safe to
1655 do this because all 2ADDR insns are at least two
1657 enc
= insn
[0] * 256 + insn
[1];
1664 enctbl
= m16c_jmpaddr_encodings
;
1668 /* srel, posn, and enc must be set here. */
1670 symval
= OFFSET_FOR_RELOC (srel
);
1671 enc
= insn
[1] & 0x0f;
1674 if (srel
->r_offset
== irel
->r_offset
+ posn
1675 && e
->new_encoding
!= enc
1676 && symval
<= e
->max_disp
)
1679 insn
[1] |= e
->new_encoding
;
1680 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1681 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1682 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1688 } /* Ends switch (reloc type) for m16c. */
1690 else /* machine == bfd_mach_m32c */
1694 switch (ELF32_R_TYPE(irel
->r_info
))
1697 case R_M32C_RL_JUMP
:
1700 case 0xbb: /* jmp.b */
1701 if (pcrel
>= 2 && pcrel
<= 9)
1704 /* Relax JMP.B -> JMP.S. We need to get rid of
1705 the following reloc though. */
1706 insn
[0] = 0x4a | ((p
<< 3) & 0x30) | (p
& 1);
1707 new_type
= R_M32C_NONE
;
1708 irel
->r_addend
= 0x10;
1714 case 0xce: /* jmp.w */
1715 if (pcrel
<= 128 && pcrel
>= -128)
1717 /* Relax JMP.W -> JMP.B */
1720 new_type
= R_M32C_8_PCREL
;
1726 case 0xcc: /* jmp.a */
1727 if (pcrel
<= 32768 && pcrel
>= -32768)
1729 /* Relax JMP.A -> JMP.W */
1733 new_type
= R_M32C_16_PCREL
;
1739 case 0xcd: /* jsr.a */
1740 if (pcrel
<= 32768 && pcrel
>= -32768)
1742 /* Relax JSR.A -> JSR.W */
1746 new_type
= R_M32C_16_PCREL
;
1754 case R_M32C_RL_2ADDR
:
1755 /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1761 /* prefix; remove it as far as the RL reloc is concerned. */
1766 enctbl
= m32c_addr_encodings
;
1767 enc
= ((einsn
[0] & 0x70) >> 2) | ((einsn
[1] & 0x30) >> 4);
1770 if (srel
->r_offset
== irel
->r_offset
+ posn
1771 && e
->new_encoding
!= enc
1772 && symval
<= e
->max_disp
)
1775 einsn
[0] |= (e
->new_encoding
& 0x1c) << 2;
1777 einsn
[1] |= (e
->new_encoding
& 0x03) << 4;
1778 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1779 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1780 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1783 if (relax_relocs
== 2)
1789 case R_M32C_RL_1ADDR
:
1790 /* xxxx DDDx DDxx xxxx [disp] */
1796 /* prefix; remove it as far as the RL reloc is concerned. */
1801 enctbl
= m32c_addr_encodings
;
1804 /* srel, posn, and enc must be set here. */
1806 symval
= OFFSET_FOR_RELOC (srel
);
1807 enc
= ((einsn
[0] & 0x0e) << 1) | ((einsn
[1] & 0xc0) >> 6);
1810 if (srel
->r_offset
== irel
->r_offset
+ posn
1811 && e
->new_encoding
!= enc
1812 && symval
<= e
->max_disp
)
1815 einsn
[0] |= (e
->new_encoding
& 0x1c) >> 1;
1817 einsn
[1] |= (e
->new_encoding
& 0x03) << 6;
1818 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1819 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1820 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1826 } /* Ends switch (reloc type) for m32c. */
1834 srel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (srel
->r_info
), new_type
);
1836 /* Note that we've changed the relocs, section contents, etc. */
1837 elf_section_data (sec
)->relocs
= internal_relocs
;
1840 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1841 free_contents
= NULL
;
1843 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
1844 free_intsyms
= NULL
;
1846 bytes_saved
+= gap_size
;
1848 if (! m32c_elf_relax_delete_bytes(abfd
, sec
, gap
- contents
, gap_size
))
1851 } /* next relocation */
1853 if (free_relocs
!= NULL
)
1859 if (free_contents
!= NULL
)
1861 if (! link_info
->keep_memory
)
1862 free (free_contents
);
1863 /* Cache the section contents for elf_link_input_bfd. */
1865 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1867 free_contents
= NULL
;
1870 if (shndx_buf
!= NULL
)
1872 shndx_hdr
->contents
= NULL
;
1876 if (free_intsyms
!= NULL
)
1878 if (! link_info
->keep_memory
)
1879 free (free_intsyms
);
1880 /* Cache the symbols for elf_link_input_bfd. */
1883 symtab_hdr
->contents
= NULL
/* (unsigned char *) intsyms*/;
1886 free_intsyms
= NULL
;
1892 if (free_relocs
!= NULL
)
1894 if (free_contents
!= NULL
)
1895 free (free_contents
);
1896 if (shndx_buf
!= NULL
)
1898 shndx_hdr
->contents
= NULL
;
1901 if (free_intsyms
!= NULL
)
1902 free (free_intsyms
);
1906 /* Delete some bytes from a section while relaxing. */
1909 m32c_elf_relax_delete_bytes
1915 Elf_Internal_Shdr
*symtab_hdr
;
1916 Elf_Internal_Shdr
*shndx_hdr
;
1919 Elf_Internal_Rela
*irel
;
1920 Elf_Internal_Rela
*irelend
;
1921 Elf_Internal_Rela
*irelalign
;
1923 Elf_Internal_Sym
*isym
;
1924 Elf_Internal_Sym
*isymend
;
1925 Elf_Internal_Sym
*intsyms
;
1926 Elf_External_Sym_Shndx
*shndx_buf
;
1927 Elf_External_Sym_Shndx
*shndx
;
1928 struct elf_link_hash_entry
** sym_hashes
;
1929 struct elf_link_hash_entry
** end_hashes
;
1930 unsigned int symcount
;
1932 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1934 /* The deletion must stop at the next ALIGN reloc for an aligment
1935 power larger than the number of bytes we are deleting. */
1939 irel
= elf_section_data (sec
)->relocs
;
1940 irelend
= irel
+ sec
->reloc_count
;
1942 /* Actually delete the bytes. */
1943 memmove (contents
+ addr
, contents
+ addr
+ count
, (size_t) (toaddr
- addr
- count
));
1946 /* Adjust all the relocs. */
1947 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1949 /* Get the new reloc address. */
1950 if (irel
->r_offset
> addr
&& irel
->r_offset
< toaddr
)
1951 irel
->r_offset
-= count
;
1953 if (ELF32_R_TYPE(irel
->r_info
) == R_M32C_RL_JUMP
1954 && irel
->r_addend
== 0x10 /* one byte insn, no relocs */
1955 && irel
->r_offset
+ 1 < addr
1956 && irel
->r_offset
+ 7 > addr
)
1959 unsigned char *insn
= &contents
[irel
->r_offset
];
1961 /* This is a JMP.S, which we have to manually update. */
1962 if (elf32_m32c_machine (abfd
) == bfd_mach_m16c
)
1964 if ((*insn
& 0xf8) != 0x60)
1970 if ((*insn
& 0xce) != 0x4a)
1972 disp
= ((disp
& 0x30) >> 3) | (disp
& 1);
1974 if (irel
->r_offset
+ disp
+ 2 >= addr
+count
)
1977 if (elf32_m32c_machine (abfd
) == bfd_mach_m16c
)
1979 *insn
= (*insn
& 0xf8) | disp
;
1983 *insn
= (*insn
& 0xce) | ((disp
& 6) << 3) | (disp
& 1);
1989 /* Adjust the local symbols defined in this section. */
1990 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
1991 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1993 isymend
= isym
+ symtab_hdr
->sh_info
;
1995 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1996 shndx_hdr
= & elf_tdata (abfd
)->symtab_shndx_hdr
;
1997 shndx_buf
= (Elf_External_Sym_Shndx
*) shndx_hdr
->contents
;
2000 for (; isym
< isymend
; isym
++, shndx
= (shndx
? shndx
+ 1 : NULL
))
2003 if ((int) isym
->st_shndx
== sec_shndx
2004 && isym
->st_value
> addr
2005 && isym
->st_value
< toaddr
)
2007 isym
->st_value
-= count
;
2011 /* Now adjust the global symbols defined in this section. */
2012 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2013 - symtab_hdr
->sh_info
);
2014 sym_hashes
= elf_sym_hashes (abfd
);
2015 // sym_hashes += symtab_hdr->sh_info;
2016 end_hashes
= sym_hashes
+ symcount
;
2018 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2020 struct elf_link_hash_entry
* sym_hash
= * sym_hashes
;
2023 ( sym_hash
->root
.type
== bfd_link_hash_defined
2024 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2025 && sym_hash
->root
.u
.def
.section
== sec
2026 && sym_hash
->root
.u
.def
.value
> addr
2027 && sym_hash
->root
.u
.def
.value
< toaddr
)
2029 sym_hash
->root
.u
.def
.value
-= count
;
2037 #define ELF_ARCH bfd_arch_m32c
2038 #define ELF_MACHINE_CODE EM_M32C
2039 #define ELF_MAXPAGESIZE 0x1000
2042 #define TARGET_BIG_SYM bfd_elf32_m32c_vec
2043 #define TARGET_BIG_NAME "elf32-m32c"
2045 #define TARGET_LITTLE_SYM bfd_elf32_m32c_vec
2046 #define TARGET_LITTLE_NAME "elf32-m32c"
2049 #define elf_info_to_howto_rel NULL
2050 #define elf_info_to_howto m32c_info_to_howto_rela
2051 #define elf_backend_object_p m32c_elf_object_p
2052 #define elf_backend_relocate_section m32c_elf_relocate_section
2053 #define elf_backend_gc_mark_hook m32c_elf_gc_mark_hook
2054 #define elf_backend_gc_sweep_hook m32c_elf_gc_sweep_hook
2055 #define elf_backend_check_relocs m32c_elf_check_relocs
2056 #define elf_backend_object_p m32c_elf_object_p
2057 #define elf_symbol_leading_char ('_')
2058 #define elf_backend_always_size_sections \
2059 m32c_elf_always_size_sections
2060 #define elf_backend_finish_dynamic_sections \
2061 m32c_elf_finish_dynamic_sections
2063 #define elf_backend_can_gc_sections 1
2065 #define bfd_elf32_bfd_reloc_type_lookup m32c_reloc_type_lookup
2066 #define bfd_elf32_bfd_relax_section m32c_elf_relax_section
2067 #define bfd_elf32_bfd_set_private_flags m32c_elf_set_private_flags
2068 #define bfd_elf32_bfd_merge_private_bfd_data m32c_elf_merge_private_bfd_data
2069 #define bfd_elf32_bfd_print_private_bfd_data m32c_elf_print_private_bfd_data
2071 #include "elf32-target.h"