1 /* M16C/M32C specific support for 32-bit ELF.
2 Copyright (C) 2005-2017 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 3 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 #include "libiberty.h"
27 /* Forward declarations. */
28 static reloc_howto_type
* m32c_reloc_type_lookup
29 (bfd
*, bfd_reloc_code_real_type
);
30 static void m32c_info_to_howto_rela
31 (bfd
*, arelent
*, Elf_Internal_Rela
*);
32 static bfd_boolean m32c_elf_relocate_section
33 (bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**);
34 static bfd_boolean m32c_elf_check_relocs
35 (bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*);
36 static bfd_boolean
m32c_elf_relax_delete_bytes (bfd
*, asection
*, bfd_vma
, int);
38 char * m32c_get_reloc (long reloc
);
39 void dump_symtab (bfd
*, void *, void *);
41 static bfd_boolean m32c_elf_relax_section
42 (bfd
*abfd
, asection
*sec
, struct bfd_link_info
*link_info
, bfd_boolean
*again
);
43 static bfd_reloc_status_type m32c_apply_reloc_24
44 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
47 static reloc_howto_type m32c_elf_howto_table
[] =
49 /* This reloc does nothing. */
50 HOWTO (R_M32C_NONE
, /* type */
52 3, /* size (0 = byte, 1 = short, 2 = long) */
54 FALSE
, /* pc_relative */
56 complain_overflow_dont
, /* complain_on_overflow */
57 bfd_elf_generic_reloc
, /* special_function */
58 "R_M32C_NONE", /* name */
59 FALSE
, /* partial_inplace */
62 FALSE
), /* pcrel_offset */
64 /* GCC intentionally overflows these next two in order to work
65 around limitations in the addressing modes, so don't complain
67 HOWTO (R_M32C_16
, /* type */
69 1, /* size (0 = byte, 1 = short, 2 = long) */
71 FALSE
, /* pc_relative */
73 complain_overflow_dont
, /* 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_dont
, /* complain_on_overflow */
88 m32c_apply_reloc_24
, /* 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 static reloc_howto_type
*
277 m32c_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
, const char *r_name
)
282 i
< sizeof (m32c_elf_howto_table
) / sizeof (m32c_elf_howto_table
[0]);
284 if (m32c_elf_howto_table
[i
].name
!= NULL
285 && strcasecmp (m32c_elf_howto_table
[i
].name
, r_name
) == 0)
286 return &m32c_elf_howto_table
[i
];
291 /* Set the howto pointer for an M32C ELF reloc. */
294 m32c_info_to_howto_rela
295 (bfd
* abfd ATTRIBUTE_UNUSED
,
297 Elf_Internal_Rela
* dst
)
301 r_type
= ELF32_R_TYPE (dst
->r_info
);
302 if (r_type
>= (unsigned int) R_M32C_max
)
304 /* xgettext:c-format */
305 _bfd_error_handler (_("%B: invalid M32C reloc number: %d"), abfd
, r_type
);
308 cache_ptr
->howto
= & m32c_elf_howto_table
[r_type
];
313 /* Apply R_M32C_24 relocations. We have to do this because it's not a
314 power-of-two size, and the generic code may think it overruns the
315 section if it's right at the end.
317 Must return something other than bfd_reloc_continue to avoid the
318 above problem. Typical return values include bfd_reloc_ok or
322 static bfd_reloc_status_type
m32c_apply_reloc_24 (bfd
*abfd ATTRIBUTE_UNUSED
,
323 arelent
*reloc_entry
,
325 void *vdata_start ATTRIBUTE_UNUSED
,
326 asection
*input_section
,
327 bfd
*ibfd ATTRIBUTE_UNUSED
,
328 char **error_msg ATTRIBUTE_UNUSED
)
331 bfd_reloc_status_type s
;
333 s
= bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
,
335 input_section
, ibfd
, error_msg
);
336 if (s
!= bfd_reloc_continue
)
339 /* Get symbol value. (Common symbols are special.) */
340 if (bfd_is_com_section (symbol
->section
))
343 relocation
= symbol
->value
;
345 relocation
+= symbol
->section
->output_offset
;
347 /* Add in supplied addend. */
348 relocation
+= reloc_entry
->addend
;
350 reloc_entry
->addend
= relocation
;
351 reloc_entry
->address
+= input_section
->output_offset
;
355 /* Relocate an M32C ELF section.
356 There is some attempt to make this function usable for many architectures,
357 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
358 if only to serve as a learning tool.
360 The RELOCATE_SECTION function is called by the new ELF backend linker
361 to handle the relocations for a section.
363 The relocs are always passed as Rela structures; if the section
364 actually uses Rel structures, the r_addend field will always be
367 This function is responsible for adjusting the section contents as
368 necessary, and (if using Rela relocs and generating a relocatable
369 output file) adjusting the reloc addend as necessary.
371 This function does not have to worry about setting the reloc
372 address or the reloc symbol index.
374 LOCAL_SYMS is a pointer to the swapped in local symbols.
376 LOCAL_SECTIONS is an array giving the section in the input file
377 corresponding to the st_shndx field of each local symbol.
379 The global hash table entry for the global symbols can be found
380 via elf_sym_hashes (input_bfd).
382 When generating relocatable output, this function must handle
383 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
384 going to be the section symbol corresponding to the output
385 section, which means that the addend must be adjusted
389 m32c_elf_relocate_section
390 (bfd
* output_bfd ATTRIBUTE_UNUSED
,
391 struct bfd_link_info
* info
,
393 asection
* input_section
,
395 Elf_Internal_Rela
* relocs
,
396 Elf_Internal_Sym
* local_syms
,
397 asection
** local_sections
)
399 Elf_Internal_Shdr
* symtab_hdr
;
400 struct elf_link_hash_entry
** sym_hashes
;
401 Elf_Internal_Rela
* rel
;
402 Elf_Internal_Rela
* relend
;
405 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
406 sym_hashes
= elf_sym_hashes (input_bfd
);
407 relend
= relocs
+ input_section
->reloc_count
;
409 splt
= elf_hash_table (info
)->splt
;
411 for (rel
= relocs
; rel
< relend
; rel
++)
413 reloc_howto_type
* howto
;
414 unsigned long r_symndx
;
415 Elf_Internal_Sym
* sym
;
417 struct elf_link_hash_entry
* h
;
419 bfd_reloc_status_type r
;
420 const char * name
= NULL
;
423 r_type
= ELF32_R_TYPE (rel
->r_info
);
425 /* These are only used for relaxing; we don't actually relocate
426 anything with them, so skip them. */
427 if (r_type
== R_M32C_RL_JUMP
428 || r_type
== R_M32C_RL_1ADDR
429 || r_type
== R_M32C_RL_2ADDR
)
432 r_symndx
= ELF32_R_SYM (rel
->r_info
);
434 howto
= m32c_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
440 if (r_symndx
< symtab_hdr
->sh_info
)
442 sym
= local_syms
+ r_symndx
;
443 sec
= local_sections
[r_symndx
];
444 relocation
= (sec
->output_section
->vma
448 name
= bfd_elf_string_from_elf_section
449 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
450 name
= (sym
->st_name
== 0) ? bfd_section_name (input_bfd
, sec
) : name
;
454 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
456 if (info
->wrap_hash
!= NULL
457 && (input_section
->flags
& SEC_DEBUGGING
) != 0)
458 h
= ((struct elf_link_hash_entry
*)
459 unwrap_hash_lookup (info
, input_bfd
, &h
->root
));
461 while (h
->root
.type
== bfd_link_hash_indirect
462 || h
->root
.type
== bfd_link_hash_warning
)
463 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
465 name
= h
->root
.root
.string
;
467 if (h
->root
.type
== bfd_link_hash_defined
468 || h
->root
.type
== bfd_link_hash_defweak
)
470 sec
= h
->root
.u
.def
.section
;
471 relocation
= (h
->root
.u
.def
.value
472 + sec
->output_section
->vma
473 + sec
->output_offset
);
475 else if (h
->root
.type
== bfd_link_hash_undefweak
)
477 else if (!bfd_link_relocatable (info
))
478 (*info
->callbacks
->undefined_symbol
) (info
, h
->root
.root
.string
,
479 input_bfd
, input_section
,
480 rel
->r_offset
, TRUE
);
483 if (sec
!= NULL
&& discarded_section (sec
))
484 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
485 rel
, 1, relend
, howto
, 0, contents
);
487 if (bfd_link_relocatable (info
))
489 /* This is a relocatable link. We don't have to change
490 anything, unless the reloc is against a section symbol,
491 in which case we have to adjust according to where the
492 section symbol winds up in the output section. */
493 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
494 rel
->r_addend
+= sec
->output_offset
;
498 switch (ELF32_R_TYPE (rel
->r_info
))
505 plt_offset
= &h
->plt
.offset
;
507 plt_offset
= elf_local_got_offsets (input_bfd
) + r_symndx
;
509 /* printf("%s: rel %x plt %d\n", h ? h->root.root.string : "(none)",
510 relocation, *plt_offset);*/
511 if (relocation
<= 0xffff)
513 /* If the symbol is in range for a 16-bit address, we should
514 have deallocated the plt entry in relax_section. */
515 BFD_ASSERT (*plt_offset
== (bfd_vma
) -1);
519 /* If the symbol is out of range for a 16-bit address,
520 we must have allocated a plt entry. */
521 BFD_ASSERT (*plt_offset
!= (bfd_vma
) -1);
523 /* If this is the first time we've processed this symbol,
524 fill in the plt entry with the correct symbol address. */
525 if ((*plt_offset
& 1) == 0)
529 x
= 0x000000fc; /* jmpf */
530 x
|= (relocation
<< 8) & 0xffffff00;
531 bfd_put_32 (input_bfd
, x
, splt
->contents
+ *plt_offset
);
535 relocation
= (splt
->output_section
->vma
536 + splt
->output_offset
537 + (*plt_offset
& -2));
540 char *newname
= bfd_malloc (strlen(name
)+5);
541 strcpy (newname
, name
);
542 strcat(newname
, ".plt");
543 _bfd_generic_link_add_one_symbol (info
,
546 BSF_FUNCTION
| BSF_WEAK
,
565 printf ("relocate %s at %06lx relocation %06lx addend %ld ",
566 m32c_elf_howto_table
[ELF32_R_TYPE(rel
->r_info
)].name
,
567 rel
->r_offset
+ input_section
->output_section
->vma
+ input_section
->output_offset
,
568 relocation
, rel
->r_addend
);
572 printf (" %02x", contents
[rel
->r_offset
+i
]);
576 switch (ELF32_R_TYPE(rel
->r_info
))
579 /* Like m32c_apply_reloc_24, we must handle this one separately. */
580 relocation
+= rel
->r_addend
;
582 /* Sanity check the address. */
583 if (rel
->r_offset
+ 3
584 > bfd_get_section_limit_octets (input_bfd
, input_section
))
585 r
= bfd_reloc_outofrange
;
588 bfd_put_8 (input_bfd
, relocation
& 0xff, contents
+ rel
->r_offset
);
589 bfd_put_8 (input_bfd
, (relocation
>> 8) & 0xff, contents
+ rel
->r_offset
+ 1);
590 bfd_put_8 (input_bfd
, (relocation
>> 16) & 0xff, contents
+ rel
->r_offset
+ 2);
597 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
598 contents
, rel
->r_offset
, relocation
,
603 if (r
!= bfd_reloc_ok
)
605 const char * msg
= (const char *) NULL
;
609 case bfd_reloc_overflow
:
610 (*info
->callbacks
->reloc_overflow
)
611 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
612 input_bfd
, input_section
, rel
->r_offset
);
615 case bfd_reloc_undefined
:
616 (*info
->callbacks
->undefined_symbol
)
617 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, TRUE
);
620 case bfd_reloc_outofrange
:
621 msg
= _("internal error: out of range error");
624 case bfd_reloc_notsupported
:
625 msg
= _("internal error: unsupported relocation error");
628 case bfd_reloc_dangerous
:
629 msg
= _("internal error: dangerous relocation");
633 msg
= _("internal error: unknown error");
638 (*info
->callbacks
->warning
) (info
, msg
, name
, input_bfd
,
639 input_section
, rel
->r_offset
);
646 /* We support 16-bit pointers to code above 64k by generating a thunk
647 below 64k containing a JMP instruction to the final address. */
650 m32c_elf_check_relocs
652 struct bfd_link_info
* info
,
654 const Elf_Internal_Rela
* relocs
)
656 Elf_Internal_Shdr
* symtab_hdr
;
657 struct elf_link_hash_entry
** sym_hashes
;
658 const Elf_Internal_Rela
* rel
;
659 const Elf_Internal_Rela
* rel_end
;
660 bfd_vma
*local_plt_offsets
;
664 if (bfd_link_relocatable (info
))
667 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
668 sym_hashes
= elf_sym_hashes (abfd
);
669 local_plt_offsets
= elf_local_got_offsets (abfd
);
671 dynobj
= elf_hash_table(info
)->dynobj
;
673 rel_end
= relocs
+ sec
->reloc_count
;
674 for (rel
= relocs
; rel
< rel_end
; rel
++)
676 struct elf_link_hash_entry
*h
;
677 unsigned long r_symndx
;
680 r_symndx
= ELF32_R_SYM (rel
->r_info
);
681 if (r_symndx
< symtab_hdr
->sh_info
)
685 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
686 while (h
->root
.type
== bfd_link_hash_indirect
687 || h
->root
.type
== bfd_link_hash_warning
)
688 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
690 /* PR15323, ref flags aren't set for references in the same
692 h
->root
.non_ir_ref_regular
= 1;
695 switch (ELF32_R_TYPE (rel
->r_info
))
697 /* This relocation describes a 16-bit pointer to a function.
698 We may need to allocate a thunk in low memory; reserve memory
702 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
703 splt
= elf_hash_table (info
)->splt
;
706 flagword flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
707 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
708 | SEC_READONLY
| SEC_CODE
);
709 splt
= bfd_make_section_anyway_with_flags (dynobj
, ".plt",
711 elf_hash_table (info
)->splt
= splt
;
713 || ! bfd_set_section_alignment (dynobj
, splt
, 1))
718 offset
= &h
->plt
.offset
;
721 if (local_plt_offsets
== NULL
)
726 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
727 local_plt_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
728 if (local_plt_offsets
== NULL
)
730 elf_local_got_offsets (abfd
) = local_plt_offsets
;
732 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
733 local_plt_offsets
[i
] = (bfd_vma
) -1;
735 offset
= &local_plt_offsets
[r_symndx
];
738 if (*offset
== (bfd_vma
) -1)
740 *offset
= splt
->size
;
750 /* This must exist if dynobj is ever set. */
753 m32c_elf_finish_dynamic_sections (bfd
*abfd ATTRIBUTE_UNUSED
,
754 struct bfd_link_info
*info
)
756 bfd
*dynobj
= elf_hash_table (info
)->dynobj
;
757 asection
*splt
= elf_hash_table (info
)->splt
;
759 /* As an extra sanity check, verify that all plt entries have
762 if (dynobj
!= NULL
&& splt
!= NULL
)
764 bfd_byte
*contents
= splt
->contents
;
765 unsigned int i
, size
= splt
->size
;
766 for (i
= 0; i
< size
; i
+= 4)
768 unsigned int x
= bfd_get_32 (dynobj
, contents
+ i
);
777 m32c_elf_always_size_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
778 struct bfd_link_info
*info
)
783 if (bfd_link_relocatable (info
))
786 dynobj
= elf_hash_table (info
)->dynobj
;
790 splt
= elf_hash_table (info
)->splt
;
791 BFD_ASSERT (splt
!= NULL
);
793 splt
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, splt
->size
);
794 if (splt
->contents
== NULL
)
800 /* Function to set the ELF flag bits. */
803 m32c_elf_set_private_flags (bfd
*abfd
, flagword flags
)
805 elf_elfheader (abfd
)->e_flags
= flags
;
806 elf_flags_init (abfd
) = TRUE
;
810 /* Merge backend specific data from an object file to the output
811 object file when linking. */
814 m32c_elf_merge_private_bfd_data (bfd
*ibfd
, struct bfd_link_info
*info
)
816 bfd
*obfd
= info
->output_bfd
;
817 flagword old_flags
, old_partial
;
818 flagword new_flags
, new_partial
;
819 bfd_boolean error
= FALSE
;
823 new_opt
[0] = old_opt
[0] = '\0';
824 new_flags
= elf_elfheader (ibfd
)->e_flags
;
825 old_flags
= elf_elfheader (obfd
)->e_flags
;
829 ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %s",
830 old_flags
, new_flags
, elf_flags_init (obfd
) ? "yes" : "no",
831 bfd_get_filename (ibfd
));
834 if (!elf_flags_init (obfd
))
836 /* First call, no flags set. */
837 elf_flags_init (obfd
) = TRUE
;
838 elf_elfheader (obfd
)->e_flags
= new_flags
;
841 else if (new_flags
== old_flags
)
842 /* Compatible flags are ok. */
845 else /* Possibly incompatible flags. */
847 /* Warn if different cpu is used (allow a specific cpu to override
849 new_partial
= (new_flags
& EF_M32C_CPU_MASK
);
850 old_partial
= (old_flags
& EF_M32C_CPU_MASK
);
851 if (new_partial
== old_partial
)
858 default: strcat (new_opt
, " -m16c"); break;
859 case EF_M32C_CPU_M16C
: strcat (new_opt
, " -m16c"); break;
860 case EF_M32C_CPU_M32C
: strcat (new_opt
, " -m32c"); break;
865 default: strcat (old_opt
, " -m16c"); break;
866 case EF_M32C_CPU_M16C
: strcat (old_opt
, " -m16c"); break;
867 case EF_M32C_CPU_M32C
: strcat (old_opt
, " -m32c"); break;
871 /* Print out any mismatches from above. */
876 /* xgettext:c-format */
877 (_("%B: compiled with %s and linked with modules compiled with %s"),
878 ibfd
, new_opt
, old_opt
);
881 new_flags
&= ~ EF_M32C_ALL_FLAGS
;
882 old_flags
&= ~ EF_M32C_ALL_FLAGS
;
884 /* Warn about any other mismatches. */
885 if (new_flags
!= old_flags
)
889 /* xgettext:c-format */
890 (_("%B: uses different e_flags (%#x) fields"
891 " than previous modules (%#x)"),
892 ibfd
, new_flags
, old_flags
);
897 bfd_set_error (bfd_error_bad_value
);
904 m32c_elf_print_private_bfd_data (bfd
*abfd
, void *ptr
)
906 FILE *file
= (FILE *) ptr
;
909 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
911 /* Print normal ELF private data. */
912 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
914 flags
= elf_elfheader (abfd
)->e_flags
;
915 fprintf (file
, _("private flags = 0x%lx:"), (unsigned long) flags
);
917 switch (flags
& EF_M32C_CPU_MASK
)
920 case EF_M32C_CPU_M16C
: fprintf (file
, " -m16c"); break;
921 case EF_M32C_CPU_M32C
: fprintf (file
, " -m32c"); break;
928 /* Return the MACH for an e_flags value. */
931 elf32_m32c_machine (bfd
*abfd
)
933 switch (elf_elfheader (abfd
)->e_flags
& EF_M32C_CPU_MASK
)
935 case EF_M32C_CPU_M16C
: return bfd_mach_m16c
;
936 case EF_M32C_CPU_M32C
: return bfd_mach_m32c
;
939 return bfd_mach_m16c
;
943 m32c_elf_object_p (bfd
*abfd
)
945 bfd_default_set_arch_mach (abfd
, bfd_arch_m32c
,
946 elf32_m32c_machine (abfd
));
953 dump_symtab (bfd
* abfd
, void *internal_syms
, void *external_syms
)
956 Elf_Internal_Sym
*isymbuf
;
957 Elf_Internal_Sym
*isymend
;
958 Elf_Internal_Sym
*isym
;
959 Elf_Internal_Shdr
*symtab_hdr
;
960 bfd_boolean free_internal
= 0, free_external
= 0;
962 char * st_info_stb_str
;
968 internal_syms
= bfd_malloc (1000);
973 external_syms
= bfd_malloc (1000);
977 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
978 locsymcount
= symtab_hdr
->sh_size
/ get_elf_backend_data(abfd
)->s
->sizeof_sym
;
980 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
981 symtab_hdr
->sh_info
, 0,
982 internal_syms
, external_syms
, NULL
);
984 isymbuf
= internal_syms
;
985 isymend
= isymbuf
+ locsymcount
;
987 for (isym
= isymbuf
; isym
< isymend
; isym
++)
989 switch (ELF_ST_TYPE (isym
->st_info
))
992 st_info_str
= "STT_FUNC";
996 st_info_str
= "STT_SECTION";
1000 st_info_str
= "STT_FILE";
1004 st_info_str
= "STT_OBJECT";
1008 st_info_str
= "STT_TLS";
1015 switch (ELF_ST_BIND (isym
->st_info
))
1018 st_info_stb_str
= "STB_LOCAL";
1022 st_info_stb_str
= "STB_GLOBAL";
1026 st_info_stb_str
= "";
1029 switch (ELF_ST_VISIBILITY (isym
->st_other
))
1032 st_other_str
= "STV_DEFAULT";
1036 st_other_str
= "STV_INTERNAL";
1040 st_other_str
= "STV_PROTECTED";
1047 switch (isym
->st_shndx
)
1050 st_shndx_str
= "SHN_ABS";
1054 st_shndx_str
= "SHN_COMMON";
1058 st_shndx_str
= "SHN_UNDEF";
1065 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
1066 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
1068 (unsigned long) isym
->st_value
,
1069 (unsigned long) isym
->st_size
,
1071 bfd_elf_string_from_elf_section (abfd
, symtab_hdr
->sh_link
,
1073 isym
->st_info
, st_info_str
, st_info_stb_str
,
1074 isym
->st_other
, st_other_str
,
1075 isym
->st_shndx
, st_shndx_str
);
1078 free (internal_syms
);
1080 free (external_syms
);
1084 m32c_get_reloc (long reloc
)
1086 if (0 <= reloc
&& reloc
< R_M32C_max
)
1087 return m32c_elf_howto_table
[reloc
].name
;
1093 /* Handle relaxing. */
1095 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1096 is within the low 64k, remove any entry for it in the plt. */
1098 struct relax_plt_data
1105 m32c_relax_plt_check (struct elf_link_hash_entry
*h
, void * xdata
)
1107 struct relax_plt_data
*data
= (struct relax_plt_data
*) xdata
;
1109 if (h
->plt
.offset
!= (bfd_vma
) -1)
1113 if (h
->root
.type
== bfd_link_hash_undefined
1114 || h
->root
.type
== bfd_link_hash_undefweak
)
1117 address
= (h
->root
.u
.def
.section
->output_section
->vma
1118 + h
->root
.u
.def
.section
->output_offset
1119 + h
->root
.u
.def
.value
);
1121 if (address
<= 0xffff)
1124 data
->splt
->size
-= 4;
1125 *data
->again
= TRUE
;
1132 /* A subroutine of m32c_elf_relax_section. If the global symbol H
1133 previously had a plt entry, give it a new entry offset. */
1136 m32c_relax_plt_realloc (struct elf_link_hash_entry
*h
, void * xdata
)
1138 bfd_vma
*entry
= (bfd_vma
*) xdata
;
1140 if (h
->plt
.offset
!= (bfd_vma
) -1)
1142 h
->plt
.offset
= *entry
;
1150 m32c_elf_relax_plt_section (asection
*splt
,
1151 struct bfd_link_info
*info
,
1154 struct relax_plt_data relax_plt_data
;
1157 /* Assume nothing changes. */
1160 if (bfd_link_relocatable (info
))
1163 /* Quick check for an empty plt. */
1164 if (splt
->size
== 0)
1167 /* Map across all global symbols; see which ones happen to
1168 fall in the low 64k. */
1169 relax_plt_data
.splt
= splt
;
1170 relax_plt_data
.again
= again
;
1171 elf_link_hash_traverse (elf_hash_table (info
), m32c_relax_plt_check
,
1174 /* Likewise for local symbols, though that's somewhat less convenient
1175 as we have to walk the list of input bfds and swap in symbol data. */
1176 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
1178 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1179 Elf_Internal_Shdr
*symtab_hdr
;
1180 Elf_Internal_Sym
*isymbuf
= NULL
;
1183 if (! local_plt_offsets
)
1186 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1187 if (symtab_hdr
->sh_info
!= 0)
1189 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1190 if (isymbuf
== NULL
)
1191 isymbuf
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
1192 symtab_hdr
->sh_info
, 0,
1194 if (isymbuf
== NULL
)
1198 for (idx
= 0; idx
< symtab_hdr
->sh_info
; ++idx
)
1200 Elf_Internal_Sym
*isym
;
1204 if (local_plt_offsets
[idx
] == (bfd_vma
) -1)
1207 isym
= &isymbuf
[idx
];
1208 if (isym
->st_shndx
== SHN_UNDEF
)
1210 else if (isym
->st_shndx
== SHN_ABS
)
1211 tsec
= bfd_abs_section_ptr
;
1212 else if (isym
->st_shndx
== SHN_COMMON
)
1213 tsec
= bfd_com_section_ptr
;
1215 tsec
= bfd_section_from_elf_index (ibfd
, isym
->st_shndx
);
1217 address
= (tsec
->output_section
->vma
1218 + tsec
->output_offset
1220 if (address
<= 0xffff)
1222 local_plt_offsets
[idx
] = -1;
1229 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
1231 if (! info
->keep_memory
)
1235 /* Cache the symbols for elf_link_input_bfd. */
1236 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
1241 /* If we changed anything, walk the symbols again to reallocate
1242 .plt entry addresses. */
1243 if (*again
&& splt
->size
> 0)
1247 elf_link_hash_traverse (elf_hash_table (info
),
1248 m32c_relax_plt_realloc
, &entry
);
1250 for (ibfd
= info
->input_bfds
; ibfd
; ibfd
= ibfd
->link
.next
)
1252 bfd_vma
*local_plt_offsets
= elf_local_got_offsets (ibfd
);
1253 unsigned int nlocals
= elf_tdata (ibfd
)->symtab_hdr
.sh_info
;
1256 if (! local_plt_offsets
)
1259 for (idx
= 0; idx
< nlocals
; ++idx
)
1260 if (local_plt_offsets
[idx
] != (bfd_vma
) -1)
1262 local_plt_offsets
[idx
] = entry
;
1272 compare_reloc (const void *e1
, const void *e2
)
1274 const Elf_Internal_Rela
*i1
= (const Elf_Internal_Rela
*) e1
;
1275 const Elf_Internal_Rela
*i2
= (const Elf_Internal_Rela
*) e2
;
1277 if (i1
->r_offset
== i2
->r_offset
)
1280 return i1
->r_offset
< i2
->r_offset
? -1 : 1;
1283 #define OFFSET_FOR_RELOC(rel) m32c_offset_for_reloc (abfd, rel, symtab_hdr, shndx_buf, intsyms)
1285 m32c_offset_for_reloc (bfd
*abfd
,
1286 Elf_Internal_Rela
*rel
,
1287 Elf_Internal_Shdr
*symtab_hdr
,
1288 Elf_External_Sym_Shndx
*shndx_buf ATTRIBUTE_UNUSED
,
1289 Elf_Internal_Sym
*intsyms
)
1293 /* Get the value of the symbol referred to by the reloc. */
1294 if (ELF32_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
1296 /* A local symbol. */
1297 Elf_Internal_Sym
*isym
;
1300 isym
= intsyms
+ ELF32_R_SYM (rel
->r_info
);
1301 ssec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
1302 symval
= isym
->st_value
;
1304 symval
+= ssec
->output_section
->vma
1305 + ssec
->output_offset
;
1310 struct elf_link_hash_entry
*h
;
1312 /* An external symbol. */
1313 indx
= ELF32_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
1314 h
= elf_sym_hashes (abfd
)[indx
];
1315 BFD_ASSERT (h
!= NULL
);
1317 if (h
->root
.type
!= bfd_link_hash_defined
1318 && h
->root
.type
!= bfd_link_hash_defweak
)
1319 /* This appears to be a reference to an undefined
1320 symbol. Just ignore it--it will be caught by the
1321 regular reloc processing. */
1324 symval
= (h
->root
.u
.def
.value
1325 + h
->root
.u
.def
.section
->output_section
->vma
1326 + h
->root
.u
.def
.section
->output_offset
);
1331 static int bytes_saved
= 0;
1333 static int bytes_to_reloc
[] = {
1341 /* What we use the bits in a relax reloc addend (R_M32C_RL_*) for. */
1343 /* Mask for the number of relocs associated with this insn. */
1344 #define RLA_RELOCS 0x0000000f
1345 /* Number of bytes gas emitted (before gas's relaxing) */
1346 #define RLA_NBYTES 0x00000ff0
1348 /* If the displacement is within the given range and the new encoding
1349 differs from the old encoding (the index), then the insn can be
1350 relaxed to the new encoding. */
1353 unsigned int max_disp
;
1354 unsigned char new_encoding
;
1357 static EncodingTable m16c_addr_encodings
[] = {
1358 { 0, 0, 0 }, /* R0 */
1359 { 0, 0, 1 }, /* R1 */
1360 { 0, 0, 2 }, /* R2 */
1361 { 0, 0, 3 }, /* R3 */
1362 { 0, 0, 4 }, /* A0 */
1363 { 0, 0, 5 }, /* A1 */
1364 { 0, 0, 6 }, /* [A0] */
1365 { 0, 0, 7 }, /* [A1] */
1366 { 1, 0, 6 }, /* udsp:8[A0] */
1367 { 1, 0, 7 }, /* udsp:8[A1] */
1368 { 1, 0, 10 }, /* udsp:8[SB] */
1369 { 1, 0, 11 }, /* sdsp:8[FB] */
1370 { 2, 255, 8 }, /* udsp:16[A0] */
1371 { 2, 255, 9 }, /* udsp:16[A1] */
1372 { 2, 255, 10 }, /* udsp:16[SB] */
1373 { 2, 0, 15 }, /* abs:16 */
1376 static EncodingTable m16c_jmpaddr_encodings
[] = {
1377 { 0, 0, 0 }, /* R0 */
1378 { 0, 0, 1 }, /* R1 */
1379 { 0, 0, 2 }, /* R2 */
1380 { 0, 0, 3 }, /* R3 */
1381 { 0, 0, 4 }, /* A0 */
1382 { 0, 0, 5 }, /* A1 */
1383 { 0, 0, 6 }, /* [A0] */
1384 { 0, 0, 7 }, /* [A1] */
1385 { 1, 0, 6 }, /* udsp:8[A0] */
1386 { 1, 0, 7 }, /* udsp:8[A1] */
1387 { 1, 0, 10 }, /* udsp:8[SB] */
1388 { 1, 0, 11 }, /* sdsp:8[FB] */
1389 { 3, 255, 8 }, /* udsp:20[A0] */
1390 { 3, 255, 9 }, /* udsp:20[A1] */
1391 { 2, 255, 10 }, /* udsp:16[SB] */
1392 { 2, 0, 15 }, /* abs:16 */
1395 static EncodingTable m32c_addr_encodings
[] = {
1396 { 0, 0, 0 }, /* [A0] */
1397 { 0, 0, 1 }, /* [A1] */
1398 { 0, 0, 2 }, /* A0 */
1399 { 0, 0, 3 }, /* A1 */
1400 { 1, 0, 0 }, /* udsp:8[A0] */
1401 { 1, 0, 1 }, /* udsp:8[A1] */
1402 { 1, 0, 6 }, /* udsp:8[SB] */
1403 { 1, 0, 7 }, /* sdsp:8[FB] */
1404 { 2, 255, 4 }, /* udsp:16[A0] */
1405 { 2, 255, 5 }, /* udsp:16[A1] */
1406 { 2, 255, 6 }, /* udsp:16[SB] */
1407 { 2, 127, 7 }, /* sdsp:16[FB] */
1408 { 3, 65535, 8 }, /* udsp:24[A0] */
1409 { 3, 65535, 9 }, /* udsp:24[A1] */
1410 { 3, 65535, 15 }, /* abs24 */
1411 { 2, 0, 15 }, /* abs16 */
1412 { 0, 0, 16 }, /* R2 */
1413 { 0, 0, 17 }, /* R3 */
1414 { 0, 0, 18 }, /* R0 */
1415 { 0, 0, 19 }, /* R1 */
1431 m32c_elf_relax_section
1434 struct bfd_link_info
* link_info
,
1435 bfd_boolean
* again
)
1437 Elf_Internal_Shdr
*symtab_hdr
;
1438 Elf_Internal_Shdr
*shndx_hdr
;
1439 Elf_Internal_Rela
*internal_relocs
;
1440 Elf_Internal_Rela
*free_relocs
= NULL
;
1441 Elf_Internal_Rela
*irel
, *irelend
, *srel
;
1442 bfd_byte
* contents
= NULL
;
1443 bfd_byte
* free_contents
= NULL
;
1444 Elf_Internal_Sym
*intsyms
= NULL
;
1445 Elf_Internal_Sym
*free_intsyms
= NULL
;
1446 Elf_External_Sym_Shndx
*shndx_buf
= NULL
;
1449 if (abfd
== elf_hash_table (link_info
)->dynobj
1450 && (sec
->flags
& SEC_LINKER_CREATED
) != 0
1451 && strcmp (sec
->name
, ".plt") == 0)
1452 return m32c_elf_relax_plt_section (sec
, link_info
, again
);
1454 /* Assume nothing changes. */
1457 machine
= elf32_m32c_machine (abfd
);
1459 /* We don't have to do anything for a relocatable link, if
1460 this section does not have relocs, or if this is not a
1462 if (bfd_link_relocatable (link_info
)
1463 || (sec
->flags
& SEC_RELOC
) == 0
1464 || sec
->reloc_count
== 0
1465 || (sec
->flags
& SEC_CODE
) == 0)
1468 symtab_hdr
= & elf_symtab_hdr (abfd
);
1469 if (elf_symtab_shndx_list (abfd
))
1470 shndx_hdr
= & elf_symtab_shndx_list (abfd
)->hdr
;
1474 /* Get the section contents. */
1475 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1476 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1477 /* Go get them off disk. */
1478 else if (!bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1481 /* Read this BFD's symbols. */
1482 /* Get cached copy if it exists. */
1483 if (symtab_hdr
->contents
!= NULL
)
1485 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1489 intsyms
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
, symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
1490 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
1493 if (shndx_hdr
&& shndx_hdr
->sh_size
!= 0)
1497 amt
= symtab_hdr
->sh_info
;
1498 amt
*= sizeof (Elf_External_Sym_Shndx
);
1499 shndx_buf
= (Elf_External_Sym_Shndx
*) bfd_malloc (amt
);
1500 if (shndx_buf
== NULL
)
1502 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0
1503 || bfd_bread (shndx_buf
, amt
, abfd
) != amt
)
1505 shndx_hdr
->contents
= (bfd_byte
*) shndx_buf
;
1508 /* Get a copy of the native relocations. */
1509 internal_relocs
= (_bfd_elf_link_read_relocs
1510 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
1511 link_info
->keep_memory
));
1512 if (internal_relocs
== NULL
)
1514 if (! link_info
->keep_memory
)
1515 free_relocs
= internal_relocs
;
1517 /* The RL_ relocs must be just before the operand relocs they go
1518 with, so we must sort them to guarantee this. */
1519 qsort (internal_relocs
, sec
->reloc_count
, sizeof (Elf_Internal_Rela
),
1522 /* Walk through them looking for relaxing opportunities. */
1523 irelend
= internal_relocs
+ sec
->reloc_count
;
1525 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1528 unsigned char *insn
, *gap
, *einsn
;
1530 bfd_signed_vma pcrel
;
1536 EncodingTable
*enctbl
;
1539 if (ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_JUMP
1540 && ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_1ADDR
1541 && ELF32_R_TYPE(irel
->r_info
) != R_M32C_RL_2ADDR
)
1546 /* There will always be room for the relaxed insn, since it is smaller
1547 than the one it would replace. */
1548 BFD_ASSERT (irel
->r_offset
< sec
->size
);
1550 insn
= contents
+ irel
->r_offset
;
1551 relax_relocs
= irel
->r_addend
% 16;
1553 /* Ok, we only have three relocs we care about, and they're all
1554 fake. The lower four bits of the addend is always the number
1555 of following relocs (hence the qsort above) that are assigned
1556 to this opcode. The next 8 bits of the addend indicates the
1557 number of bytes in the insn. We use the rest of them
1558 ourselves as flags for the more expensive operations (defines
1559 above). The three relocs are:
1561 RL_JUMP: This marks all direct jump insns. We check the
1562 displacement and replace them with shorter jumps if
1563 they're in range. We also use this to find JMP.S
1564 insns and manually shorten them when we delete bytes.
1565 We have to decode these insns to figure out what to
1568 RL_1ADDR: This is a :G or :Q insn, which has a single
1569 "standard" operand. We have to extract the type
1570 field, see if it's a wide displacement, then figure
1571 out if we can replace it with a narrow displacement.
1572 We don't have to decode these insns.
1574 RL_2ADDR: Similarly, but two "standard" operands. Note that
1575 r_addend may still be 1, as standard operands don't
1576 always have displacements. Gas shouldn't give us one
1577 with zero operands, but since we don't know which one
1578 has the displacement, we check them both anyway.
1580 These all point to the beginning of the insn itself, not the
1583 Note that we only relax one step at a time, relying on the
1584 linker to call us repeatedly. Thus, there is no code for
1585 JMP.A->JMP.B although that will happen in two steps.
1586 Likewise, for 2ADDR relaxes, we do one operand per cycle.
1589 /* Get the value of the symbol referred to by the reloc. Just
1590 in case this is the last reloc in the list, use the RL's
1591 addend to choose between this reloc (no addend) or the next
1592 (yes addend, which means at least one following reloc). */
1593 srel
= irel
+ (relax_relocs
? 1 : 0);
1594 symval
= OFFSET_FOR_RELOC (srel
);
1596 /* Setting gap_size nonzero is the flag which means "something
1600 new_type
= ELF32_R_TYPE(srel
->r_info
);
1602 pc
= sec
->output_section
->vma
+ sec
->output_offset
1604 pcrel
= symval
- pc
+ srel
->r_addend
;
1606 if (machine
== bfd_mach_m16c
)
1610 switch (ELF32_R_TYPE(irel
->r_info
))
1613 case R_M32C_RL_JUMP
:
1616 case 0xfe: /* jmp.b */
1617 if (pcrel
>= 2 && pcrel
<= 9)
1619 /* Relax JMP.B -> JMP.S. We need to get rid of
1620 the following reloc though. */
1621 insn
[0] = 0x60 | (pcrel
- 2);
1622 new_type
= R_M32C_NONE
;
1623 irel
->r_addend
= 0x10;
1629 case 0xf4: /* jmp.w */
1630 /* 128 is allowed because it will be one byte closer
1631 after relaxing. Likewise for all other pc-rel
1633 if (pcrel
<= 128 && pcrel
>= -128)
1635 /* Relax JMP.W -> JMP.B */
1638 new_type
= R_M32C_8_PCREL
;
1644 case 0xfc: /* jmp.a */
1645 if (pcrel
<= 32768 && pcrel
>= -32768)
1647 /* Relax JMP.A -> JMP.W */
1651 new_type
= R_M32C_16_PCREL
;
1657 case 0xfd: /* jsr.a */
1658 if (pcrel
<= 32768 && pcrel
>= -32768)
1660 /* Relax JSR.A -> JSR.W */
1664 new_type
= R_M32C_16_PCREL
;
1672 case R_M32C_RL_2ADDR
:
1673 /* xxxx xxxx srce dest [src-disp] [dest-disp]*/
1675 enctbl
= m16c_addr_encodings
;
1677 enc
= (insn
[1] >> 4) & 0x0f;
1680 if (srel
->r_offset
== irel
->r_offset
+ posn
1681 && e
->new_encoding
!= enc
1682 && symval
<= e
->max_disp
)
1685 insn
[1] |= e
->new_encoding
<< 4;
1686 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1687 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1688 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1691 if (relax_relocs
== 2)
1697 case R_M32C_RL_1ADDR
:
1698 /* xxxx xxxx xxxx dest [disp] */
1700 enctbl
= m16c_addr_encodings
;
1703 /* Check the opcode for jumps. We know it's safe to
1704 do this because all 2ADDR insns are at least two
1706 enc
= insn
[0] * 256 + insn
[1];
1713 enctbl
= m16c_jmpaddr_encodings
;
1717 /* srel, posn, and enc must be set here. */
1719 symval
= OFFSET_FOR_RELOC (srel
);
1720 enc
= insn
[1] & 0x0f;
1723 if (srel
->r_offset
== irel
->r_offset
+ posn
1724 && e
->new_encoding
!= enc
1725 && symval
<= e
->max_disp
)
1728 insn
[1] |= e
->new_encoding
;
1729 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1730 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1731 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1737 } /* Ends switch (reloc type) for m16c. */
1739 else /* machine == bfd_mach_m32c */
1743 switch (ELF32_R_TYPE(irel
->r_info
))
1746 case R_M32C_RL_JUMP
:
1749 case 0xbb: /* jmp.b */
1750 if (pcrel
>= 2 && pcrel
<= 9)
1753 /* Relax JMP.B -> JMP.S. We need to get rid of
1754 the following reloc though. */
1755 insn
[0] = 0x4a | ((p
<< 3) & 0x30) | (p
& 1);
1756 new_type
= R_M32C_NONE
;
1757 irel
->r_addend
= 0x10;
1763 case 0xce: /* jmp.w */
1764 if (pcrel
<= 128 && pcrel
>= -128)
1766 /* Relax JMP.W -> JMP.B */
1769 new_type
= R_M32C_8_PCREL
;
1775 case 0xcc: /* jmp.a */
1776 if (pcrel
<= 32768 && pcrel
>= -32768)
1778 /* Relax JMP.A -> JMP.W */
1782 new_type
= R_M32C_16_PCREL
;
1788 case 0xcd: /* jsr.a */
1789 if (pcrel
<= 32768 && pcrel
>= -32768)
1791 /* Relax JSR.A -> JSR.W */
1795 new_type
= R_M32C_16_PCREL
;
1803 case R_M32C_RL_2ADDR
:
1804 /* xSSS DDDx DDSS xxxx [src-disp] [dest-disp]*/
1810 /* prefix; remove it as far as the RL reloc is concerned. */
1815 enctbl
= m32c_addr_encodings
;
1816 enc
= ((einsn
[0] & 0x70) >> 2) | ((einsn
[1] & 0x30) >> 4);
1819 if (srel
->r_offset
== irel
->r_offset
+ posn
1820 && e
->new_encoding
!= enc
1821 && symval
<= e
->max_disp
)
1824 einsn
[0] |= (e
->new_encoding
& 0x1c) << 2;
1826 einsn
[1] |= (e
->new_encoding
& 0x03) << 4;
1827 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1828 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1829 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1832 if (relax_relocs
== 2)
1838 case R_M32C_RL_1ADDR
:
1839 /* xxxx DDDx DDxx xxxx [disp] */
1845 /* prefix; remove it as far as the RL reloc is concerned. */
1850 enctbl
= m32c_addr_encodings
;
1853 /* srel, posn, and enc must be set here. */
1855 symval
= OFFSET_FOR_RELOC (srel
);
1856 enc
= ((einsn
[0] & 0x0e) << 1) | ((einsn
[1] & 0xc0) >> 6);
1859 if (srel
->r_offset
== irel
->r_offset
+ posn
1860 && e
->new_encoding
!= enc
1861 && symval
<= e
->max_disp
)
1864 einsn
[0] |= (e
->new_encoding
& 0x1c) >> 1;
1866 einsn
[1] |= (e
->new_encoding
& 0x03) << 6;
1867 gap_size
= e
->bytes
- enctbl
[e
->new_encoding
].bytes
;
1868 gap
= insn
+ posn
+ enctbl
[e
->new_encoding
].bytes
;
1869 new_type
= bytes_to_reloc
[enctbl
[e
->new_encoding
].bytes
];
1875 } /* Ends switch (reloc type) for m32c. */
1883 srel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (srel
->r_info
), new_type
);
1885 /* Note that we've changed the relocs, section contents, etc. */
1886 elf_section_data (sec
)->relocs
= internal_relocs
;
1889 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1890 free_contents
= NULL
;
1892 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
1893 free_intsyms
= NULL
;
1895 bytes_saved
+= gap_size
;
1897 if (! m32c_elf_relax_delete_bytes(abfd
, sec
, gap
- contents
, gap_size
))
1900 } /* next relocation */
1902 if (free_relocs
!= NULL
)
1908 if (free_contents
!= NULL
)
1910 if (! link_info
->keep_memory
)
1911 free (free_contents
);
1912 /* Cache the section contents for elf_link_input_bfd. */
1914 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1916 free_contents
= NULL
;
1919 if (shndx_buf
!= NULL
)
1921 shndx_hdr
->contents
= NULL
;
1925 if (free_intsyms
!= NULL
)
1927 if (! link_info
->keep_memory
)
1928 free (free_intsyms
);
1929 /* Cache the symbols for elf_link_input_bfd. */
1932 symtab_hdr
->contents
= NULL
/* (unsigned char *) intsyms*/;
1935 free_intsyms
= NULL
;
1941 if (free_relocs
!= NULL
)
1943 if (free_contents
!= NULL
)
1944 free (free_contents
);
1945 if (shndx_buf
!= NULL
)
1947 shndx_hdr
->contents
= NULL
;
1950 if (free_intsyms
!= NULL
)
1951 free (free_intsyms
);
1955 /* Delete some bytes from a section while relaxing. */
1958 m32c_elf_relax_delete_bytes
1964 Elf_Internal_Shdr
*symtab_hdr
;
1965 Elf_Internal_Shdr
*shndx_hdr
;
1968 Elf_Internal_Rela
*irel
;
1969 Elf_Internal_Rela
*irelend
;
1971 Elf_Internal_Sym
*isym
;
1972 Elf_Internal_Sym
*isymend
;
1973 Elf_Internal_Sym
*intsyms
;
1974 Elf_External_Sym_Shndx
*shndx_buf
;
1975 Elf_External_Sym_Shndx
*shndx
;
1976 struct elf_link_hash_entry
** sym_hashes
;
1977 struct elf_link_hash_entry
** end_hashes
;
1978 unsigned int symcount
;
1980 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1984 irel
= elf_section_data (sec
)->relocs
;
1985 irelend
= irel
+ sec
->reloc_count
;
1987 /* Actually delete the bytes. */
1988 memmove (contents
+ addr
, contents
+ addr
+ count
, (size_t) (toaddr
- addr
- count
));
1991 /* Adjust all the relocs. */
1992 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1994 /* Get the new reloc address. */
1995 if (irel
->r_offset
> addr
&& irel
->r_offset
< toaddr
)
1996 irel
->r_offset
-= count
;
1998 if (ELF32_R_TYPE(irel
->r_info
) == R_M32C_RL_JUMP
1999 && irel
->r_addend
== 0x10 /* one byte insn, no relocs */
2000 && irel
->r_offset
+ 1 < addr
2001 && irel
->r_offset
+ 7 > addr
)
2004 unsigned char *insn
= &contents
[irel
->r_offset
];
2006 /* This is a JMP.S, which we have to manually update. */
2007 if (elf32_m32c_machine (abfd
) == bfd_mach_m16c
)
2009 if ((*insn
& 0xf8) != 0x60)
2015 if ((*insn
& 0xce) != 0x4a)
2017 disp
= ((disp
& 0x30) >> 3) | (disp
& 1);
2019 if (irel
->r_offset
+ disp
+ 2 >= addr
+count
)
2022 if (elf32_m32c_machine (abfd
) == bfd_mach_m16c
)
2024 *insn
= (*insn
& 0xf8) | disp
;
2028 *insn
= (*insn
& 0xce) | ((disp
& 6) << 3) | (disp
& 1);
2034 /* Adjust the local symbols defined in this section. */
2035 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
2036 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2038 isymend
= isym
+ symtab_hdr
->sh_info
;
2040 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2041 if (elf_symtab_shndx_list (abfd
))
2043 shndx_hdr
= & elf_symtab_shndx_list (abfd
)->hdr
;
2044 shndx_buf
= (Elf_External_Sym_Shndx
*) shndx_hdr
->contents
;
2053 for (; isym
< isymend
; isym
++, shndx
= (shndx
? shndx
+ 1 : NULL
))
2055 /* If the symbol is in the range of memory we just moved, we
2056 have to adjust its value. */
2057 if ((int) isym
->st_shndx
== sec_shndx
2058 && isym
->st_value
> addr
2059 && isym
->st_value
< toaddr
)
2061 isym
->st_value
-= count
;
2063 /* If the symbol *spans* the bytes we just deleted (i.e. it's
2064 *end* is in the moved bytes but it's *start* isn't), then we
2065 must adjust its size. */
2066 if ((int) isym
->st_shndx
== sec_shndx
2067 && isym
->st_value
< addr
2068 && isym
->st_value
+ isym
->st_size
> addr
2069 && isym
->st_value
+ isym
->st_size
< toaddr
)
2071 isym
->st_size
-= count
;
2075 /* Now adjust the global symbols defined in this section. */
2076 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
2077 - symtab_hdr
->sh_info
);
2078 sym_hashes
= elf_sym_hashes (abfd
);
2079 // sym_hashes += symtab_hdr->sh_info;
2080 end_hashes
= sym_hashes
+ symcount
;
2082 for (; sym_hashes
< end_hashes
; sym_hashes
++)
2084 struct elf_link_hash_entry
* sym_hash
= * sym_hashes
;
2087 (sym_hash
->root
.type
== bfd_link_hash_defined
2088 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
2089 && sym_hash
->root
.u
.def
.section
== sec
)
2091 if (sym_hash
->root
.u
.def
.value
> addr
2092 && sym_hash
->root
.u
.def
.value
< toaddr
)
2094 sym_hash
->root
.u
.def
.value
-= count
;
2096 if (sym_hash
->root
.u
.def
.value
< addr
2097 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
2098 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
< toaddr
)
2100 sym_hash
->size
-= count
;
2108 /* This is for versions of gcc prior to 4.3. */
2110 _bfd_m32c_elf_eh_frame_address_size (bfd
*abfd
,
2111 const asection
*sec ATTRIBUTE_UNUSED
)
2113 if ((elf_elfheader (abfd
)->e_flags
& EF_M32C_CPU_MASK
) == EF_M32C_CPU_M16C
)
2120 #define ELF_ARCH bfd_arch_m32c
2121 #define ELF_MACHINE_CODE EM_M32C
2122 #define ELF_MACHINE_ALT1 EM_M32C_OLD
2123 #define ELF_MAXPAGESIZE 0x100
2126 #define TARGET_BIG_SYM m32c_elf32_vec
2127 #define TARGET_BIG_NAME "elf32-m32c"
2129 #define TARGET_LITTLE_SYM m32c_elf32_vec
2130 #define TARGET_LITTLE_NAME "elf32-m32c"
2133 #define elf_info_to_howto_rel NULL
2134 #define elf_info_to_howto m32c_info_to_howto_rela
2135 #define elf_backend_object_p m32c_elf_object_p
2136 #define elf_backend_relocate_section m32c_elf_relocate_section
2137 #define elf_backend_check_relocs m32c_elf_check_relocs
2138 #define elf_backend_object_p m32c_elf_object_p
2139 #define elf_symbol_leading_char ('_')
2140 #define elf_backend_always_size_sections \
2141 m32c_elf_always_size_sections
2142 #define elf_backend_finish_dynamic_sections \
2143 m32c_elf_finish_dynamic_sections
2145 #define elf_backend_can_gc_sections 1
2146 #define elf_backend_eh_frame_address_size _bfd_m32c_elf_eh_frame_address_size
2148 #define bfd_elf32_bfd_reloc_type_lookup m32c_reloc_type_lookup
2149 #define bfd_elf32_bfd_reloc_name_lookup m32c_reloc_name_lookup
2150 #define bfd_elf32_bfd_relax_section m32c_elf_relax_section
2151 #define bfd_elf32_bfd_set_private_flags m32c_elf_set_private_flags
2152 #define bfd_elf32_bfd_merge_private_bfd_data m32c_elf_merge_private_bfd_data
2153 #define bfd_elf32_bfd_print_private_bfd_data m32c_elf_print_private_bfd_data
2155 #include "elf32-target.h"