1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
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. */
21 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
22 dependencies. As is the gas & simulator code or the v850. */
30 #include "libiberty.h"
32 /* Sign-extend a 24-bit number. */
33 #define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)
35 static reloc_howto_type
*v850_elf_reloc_type_lookup
36 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
37 static void v850_elf_info_to_howto_rel
38 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rel
*));
39 static void v850_elf_info_to_howto_rela
40 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rela
*));
41 static bfd_reloc_status_type v850_elf_reloc
42 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
43 static boolean v850_elf_is_local_label_name
44 PARAMS ((bfd
*, const char *));
45 static boolean v850_elf_relocate_section
46 PARAMS((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
47 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
48 static bfd_reloc_status_type v850_elf_perform_relocation
49 PARAMS ((bfd
*, int, bfd_vma
, bfd_byte
*));
50 static boolean v850_elf_check_relocs
51 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*, const Elf_Internal_Rela
*));
52 static void remember_hi16s_reloc
53 PARAMS ((bfd
*, bfd_vma
, bfd_byte
*));
54 static bfd_byte
* find_remembered_hi16s_reloc
55 PARAMS ((bfd_vma
, boolean
*));
56 static bfd_reloc_status_type v850_elf_final_link_relocate
57 PARAMS ((reloc_howto_type
*, bfd
*, bfd
*, asection
*, bfd_byte
*, bfd_vma
,
58 bfd_vma
, bfd_vma
, struct bfd_link_info
*, asection
*, int));
59 static boolean v850_elf_object_p
61 static boolean v850_elf_fake_sections
62 PARAMS ((bfd
*, Elf32_Internal_Shdr
*, asection
*));
63 static void v850_elf_final_write_processing
64 PARAMS ((bfd
*, boolean
));
65 static boolean v850_elf_set_private_flags
66 PARAMS ((bfd
*, flagword
));
67 static boolean v850_elf_copy_private_bfd_data
68 PARAMS ((bfd
*, bfd
*));
69 static boolean v850_elf_merge_private_bfd_data
70 PARAMS ((bfd
*, bfd
*));
71 static boolean v850_elf_print_private_bfd_data
72 PARAMS ((bfd
*, PTR
));
73 static boolean v850_elf_section_from_bfd_section
74 PARAMS ((bfd
*, Elf32_Internal_Shdr
*, asection
*, int *));
75 static void v850_elf_symbol_processing
76 PARAMS ((bfd
*, asymbol
*));
77 static boolean v850_elf_add_symbol_hook
78 PARAMS ((bfd
*, struct bfd_link_info
*, const Elf_Internal_Sym
*,
79 const char **, flagword
*, asection
**, bfd_vma
*));
80 static boolean v850_elf_link_output_symbol_hook
81 PARAMS ((bfd
*, struct bfd_link_info
*, const char *,
82 Elf_Internal_Sym
*, asection
*));
83 static boolean v850_elf_section_from_shdr
84 PARAMS ((bfd
*, Elf_Internal_Shdr
*, char *));
85 static boolean v850_elf_gc_sweep_hook
86 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
87 const Elf_Internal_Rela
*));
88 static asection
* v850_elf_gc_mark_hook
89 PARAMS ((bfd
*, struct bfd_link_info
*,
90 Elf_Internal_Rela
*, struct elf_link_hash_entry
*,
93 /* Note: It is REQUIRED that the 'type' value of each entry
94 in this array match the index of the entry in the array. */
95 static reloc_howto_type v850_elf_howto_table
[] =
97 /* This reloc does nothing. */
98 HOWTO (R_V850_NONE
, /* type */
100 2, /* size (0 = byte, 1 = short, 2 = long) */
102 false, /* pc_relative */
104 complain_overflow_bitfield
, /* complain_on_overflow */
105 bfd_elf_generic_reloc
, /* special_function */
106 "R_V850_NONE", /* name */
107 false, /* partial_inplace */
110 false), /* pcrel_offset */
112 /* A PC relative 9 bit branch. */
113 HOWTO (R_V850_9_PCREL
, /* type */
115 2, /* size (0 = byte, 1 = short, 2 = long) */
117 true, /* pc_relative */
119 complain_overflow_bitfield
, /* complain_on_overflow */
120 v850_elf_reloc
, /* special_function */
121 "R_V850_9_PCREL", /* name */
122 false, /* partial_inplace */
123 0x00ffffff, /* src_mask */
124 0x00ffffff, /* dst_mask */
125 true), /* pcrel_offset */
127 /* A PC relative 22 bit branch. */
128 HOWTO (R_V850_22_PCREL
, /* type */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
132 true, /* pc_relative */
134 complain_overflow_signed
, /* complain_on_overflow */
135 v850_elf_reloc
, /* special_function */
136 "R_V850_22_PCREL", /* name */
137 false, /* partial_inplace */
138 0x07ffff80, /* src_mask */
139 0x07ffff80, /* dst_mask */
140 true), /* pcrel_offset */
142 /* High 16 bits of symbol value. */
143 HOWTO (R_V850_HI16_S
, /* type */
145 1, /* size (0 = byte, 1 = short, 2 = long) */
147 false, /* pc_relative */
149 complain_overflow_dont
, /* complain_on_overflow */
150 v850_elf_reloc
, /* special_function */
151 "R_V850_HI16_S", /* name */
152 false, /* partial_inplace */
153 0xffff, /* src_mask */
154 0xffff, /* dst_mask */
155 false), /* pcrel_offset */
157 /* High 16 bits of symbol value. */
158 HOWTO (R_V850_HI16
, /* type */
160 1, /* size (0 = byte, 1 = short, 2 = long) */
162 false, /* pc_relative */
164 complain_overflow_dont
, /* complain_on_overflow */
165 v850_elf_reloc
, /* special_function */
166 "R_V850_HI16", /* name */
167 false, /* partial_inplace */
168 0xffff, /* src_mask */
169 0xffff, /* dst_mask */
170 false), /* pcrel_offset */
172 /* Low 16 bits of symbol value. */
173 HOWTO (R_V850_LO16
, /* type */
175 1, /* size (0 = byte, 1 = short, 2 = long) */
177 false, /* pc_relative */
179 complain_overflow_dont
, /* complain_on_overflow */
180 v850_elf_reloc
, /* special_function */
181 "R_V850_LO16", /* name */
182 false, /* partial_inplace */
183 0xffff, /* src_mask */
184 0xffff, /* dst_mask */
185 false), /* pcrel_offset */
187 /* Simple 32bit reloc. */
188 HOWTO (R_V850_32
, /* type */
190 2, /* size (0 = byte, 1 = short, 2 = long) */
192 false, /* pc_relative */
194 complain_overflow_dont
, /* complain_on_overflow */
195 v850_elf_reloc
, /* special_function */
196 "R_V850_32", /* name */
197 false, /* partial_inplace */
198 0xffffffff, /* src_mask */
199 0xffffffff, /* dst_mask */
200 false), /* pcrel_offset */
202 /* Simple 16bit reloc. */
203 HOWTO (R_V850_16
, /* type */
205 1, /* size (0 = byte, 1 = short, 2 = long) */
207 false, /* pc_relative */
209 complain_overflow_dont
, /* complain_on_overflow */
210 bfd_elf_generic_reloc
, /* special_function */
211 "R_V850_16", /* name */
212 false, /* partial_inplace */
213 0xffff, /* src_mask */
214 0xffff, /* dst_mask */
215 false), /* pcrel_offset */
217 /* Simple 8bit reloc. */
218 HOWTO (R_V850_8
, /* type */
220 0, /* size (0 = byte, 1 = short, 2 = long) */
222 false, /* pc_relative */
224 complain_overflow_dont
, /* complain_on_overflow */
225 bfd_elf_generic_reloc
, /* special_function */
226 "R_V850_8", /* name */
227 false, /* partial_inplace */
230 false), /* pcrel_offset */
232 /* 16 bit offset from the short data area pointer. */
233 HOWTO (R_V850_SDA_16_16_OFFSET
, /* type */
235 1, /* size (0 = byte, 1 = short, 2 = long) */
237 false, /* pc_relative */
239 complain_overflow_dont
, /* complain_on_overflow */
240 v850_elf_reloc
, /* special_function */
241 "R_V850_SDA_16_16_OFFSET", /* name */
242 false, /* partial_inplace */
243 0xffff, /* src_mask */
244 0xffff, /* dst_mask */
245 false), /* pcrel_offset */
247 /* 15 bit offset from the short data area pointer. */
248 HOWTO (R_V850_SDA_15_16_OFFSET
, /* type */
250 1, /* size (0 = byte, 1 = short, 2 = long) */
252 false, /* pc_relative */
254 complain_overflow_dont
, /* complain_on_overflow */
255 v850_elf_reloc
, /* special_function */
256 "R_V850_SDA_15_16_OFFSET", /* name */
257 false, /* partial_inplace */
258 0xfffe, /* src_mask */
259 0xfffe, /* dst_mask */
260 false), /* pcrel_offset */
262 /* 16 bit offset from the zero data area pointer. */
263 HOWTO (R_V850_ZDA_16_16_OFFSET
, /* type */
265 1, /* size (0 = byte, 1 = short, 2 = long) */
267 false, /* pc_relative */
269 complain_overflow_dont
, /* complain_on_overflow */
270 v850_elf_reloc
, /* special_function */
271 "R_V850_ZDA_16_16_OFFSET", /* name */
272 false, /* partial_inplace */
273 0xffff, /* src_mask */
274 0xffff, /* dst_mask */
275 false), /* pcrel_offset */
277 /* 15 bit offset from the zero data area pointer. */
278 HOWTO (R_V850_ZDA_15_16_OFFSET
, /* type */
280 1, /* size (0 = byte, 1 = short, 2 = long) */
282 false, /* pc_relative */
284 complain_overflow_dont
, /* complain_on_overflow */
285 v850_elf_reloc
, /* special_function */
286 "R_V850_ZDA_15_16_OFFSET", /* name */
287 false, /* partial_inplace */
288 0xfffe, /* src_mask */
289 0xfffe, /* dst_mask */
290 false), /* pcrel_offset */
292 /* 6 bit offset from the tiny data area pointer. */
293 HOWTO (R_V850_TDA_6_8_OFFSET
, /* type */
295 1, /* size (0 = byte, 1 = short, 2 = long) */
297 false, /* pc_relative */
299 complain_overflow_dont
, /* complain_on_overflow */
300 v850_elf_reloc
, /* special_function */
301 "R_V850_TDA_6_8_OFFSET", /* name */
302 false, /* partial_inplace */
305 false), /* pcrel_offset */
307 /* 8 bit offset from the tiny data area pointer. */
308 HOWTO (R_V850_TDA_7_8_OFFSET
, /* type */
310 1, /* size (0 = byte, 1 = short, 2 = long) */
312 false, /* pc_relative */
314 complain_overflow_dont
, /* complain_on_overflow */
315 v850_elf_reloc
, /* special_function */
316 "R_V850_TDA_7_8_OFFSET", /* name */
317 false, /* partial_inplace */
320 false), /* pcrel_offset */
322 /* 7 bit offset from the tiny data area pointer. */
323 HOWTO (R_V850_TDA_7_7_OFFSET
, /* type */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
327 false, /* pc_relative */
329 complain_overflow_dont
, /* complain_on_overflow */
330 v850_elf_reloc
, /* special_function */
331 "R_V850_TDA_7_7_OFFSET", /* name */
332 false, /* partial_inplace */
335 false), /* pcrel_offset */
337 /* 16 bit offset from the tiny data area pointer! */
338 HOWTO (R_V850_TDA_16_16_OFFSET
, /* type */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
342 false, /* pc_relative */
344 complain_overflow_dont
, /* complain_on_overflow */
345 v850_elf_reloc
, /* special_function */
346 "R_V850_TDA_16_16_OFFSET", /* name */
347 false, /* partial_inplace */
348 0xffff, /* src_mask */
349 0xfff, /* dst_mask */
350 false), /* pcrel_offset */
352 /* 5 bit offset from the tiny data area pointer. */
353 HOWTO (R_V850_TDA_4_5_OFFSET
, /* type */
355 1, /* size (0 = byte, 1 = short, 2 = long) */
357 false, /* pc_relative */
359 complain_overflow_dont
, /* complain_on_overflow */
360 v850_elf_reloc
, /* special_function */
361 "R_V850_TDA_4_5_OFFSET", /* name */
362 false, /* partial_inplace */
365 false), /* pcrel_offset */
367 /* 4 bit offset from the tiny data area pointer. */
368 HOWTO (R_V850_TDA_4_4_OFFSET
, /* type */
370 1, /* size (0 = byte, 1 = short, 2 = long) */
372 false, /* pc_relative */
374 complain_overflow_dont
, /* complain_on_overflow */
375 v850_elf_reloc
, /* special_function */
376 "R_V850_TDA_4_4_OFFSET", /* name */
377 false, /* partial_inplace */
380 false), /* pcrel_offset */
382 /* 16 bit offset from the short data area pointer. */
383 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET
, /* type */
385 2, /* size (0 = byte, 1 = short, 2 = long) */
387 false, /* pc_relative */
389 complain_overflow_dont
, /* complain_on_overflow */
390 v850_elf_reloc
, /* special_function */
391 "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
392 false, /* partial_inplace */
393 0xfffe0020, /* src_mask */
394 0xfffe0020, /* dst_mask */
395 false), /* pcrel_offset */
397 /* 16 bit offset from the zero data area pointer. */
398 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET
, /* type */
400 2, /* size (0 = byte, 1 = short, 2 = long) */
402 false, /* pc_relative */
404 complain_overflow_dont
, /* complain_on_overflow */
405 v850_elf_reloc
, /* special_function */
406 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
407 false, /* partial_inplace */
408 0xfffe0020, /* src_mask */
409 0xfffe0020, /* dst_mask */
410 false), /* pcrel_offset */
412 /* 6 bit offset from the call table base pointer. */
413 HOWTO (R_V850_CALLT_6_7_OFFSET
, /* type */
415 1, /* size (0 = byte, 1 = short, 2 = long) */
417 false, /* pc_relative */
419 complain_overflow_dont
, /* complain_on_overflow */
420 v850_elf_reloc
, /* special_function */
421 "R_V850_CALLT_6_7_OFFSET", /* name */
422 false, /* partial_inplace */
425 false), /* pcrel_offset */
427 /* 16 bit offset from the call table base pointer. */
428 HOWTO (R_V850_CALLT_16_16_OFFSET
, /* type */
430 1, /* size (0 = byte, 1 = short, 2 = long) */
432 false, /* pc_relative */
434 complain_overflow_dont
, /* complain_on_overflow */
435 v850_elf_reloc
, /* special_function */
436 "R_V850_CALLT_16_16_OFFSET", /* name */
437 false, /* partial_inplace */
438 0xffff, /* src_mask */
439 0xffff, /* dst_mask */
440 false), /* pcrel_offset */
442 /* GNU extension to record C++ vtable hierarchy */
443 HOWTO (R_V850_GNU_VTINHERIT
, /* type */
445 2, /* size (0 = byte, 1 = short, 2 = long) */
447 false, /* pc_relative */
449 complain_overflow_dont
, /* complain_on_overflow */
450 NULL
, /* special_function */
451 "R_V850_GNU_VTINHERIT", /* name */
452 false, /* partial_inplace */
455 false), /* pcrel_offset */
457 /* GNU extension to record C++ vtable member usage */
458 HOWTO (R_V850_GNU_VTENTRY
, /* type */
460 2, /* size (0 = byte, 1 = short, 2 = long) */
462 false, /* pc_relative */
464 complain_overflow_dont
, /* complain_on_overflow */
465 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
466 "R_V850_GNU_VTENTRY", /* name */
467 false, /* partial_inplace */
470 false), /* pcrel_offset */
474 /* Map BFD reloc types to V850 ELF reloc types. */
476 struct v850_elf_reloc_map
478 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
480 bfd_reloc_code_real_type bfd_reloc_val
;
481 unsigned char elf_reloc_val
;
484 static const struct v850_elf_reloc_map v850_elf_reloc_map
[] =
486 { BFD_RELOC_NONE
, R_V850_NONE
},
487 { BFD_RELOC_V850_9_PCREL
, R_V850_9_PCREL
},
488 { BFD_RELOC_V850_22_PCREL
, R_V850_22_PCREL
},
489 { BFD_RELOC_HI16_S
, R_V850_HI16_S
},
490 { BFD_RELOC_HI16
, R_V850_HI16
},
491 { BFD_RELOC_LO16
, R_V850_LO16
},
492 { BFD_RELOC_32
, R_V850_32
},
493 { BFD_RELOC_16
, R_V850_16
},
494 { BFD_RELOC_8
, R_V850_8
},
495 { BFD_RELOC_V850_SDA_16_16_OFFSET
, R_V850_SDA_16_16_OFFSET
},
496 { BFD_RELOC_V850_SDA_15_16_OFFSET
, R_V850_SDA_15_16_OFFSET
},
497 { BFD_RELOC_V850_ZDA_16_16_OFFSET
, R_V850_ZDA_16_16_OFFSET
},
498 { BFD_RELOC_V850_ZDA_15_16_OFFSET
, R_V850_ZDA_15_16_OFFSET
},
499 { BFD_RELOC_V850_TDA_6_8_OFFSET
, R_V850_TDA_6_8_OFFSET
},
500 { BFD_RELOC_V850_TDA_7_8_OFFSET
, R_V850_TDA_7_8_OFFSET
},
501 { BFD_RELOC_V850_TDA_7_7_OFFSET
, R_V850_TDA_7_7_OFFSET
},
502 { BFD_RELOC_V850_TDA_16_16_OFFSET
, R_V850_TDA_16_16_OFFSET
},
503 { BFD_RELOC_V850_TDA_4_5_OFFSET
, R_V850_TDA_4_5_OFFSET
},
504 { BFD_RELOC_V850_TDA_4_4_OFFSET
, R_V850_TDA_4_4_OFFSET
},
505 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
, R_V850_SDA_16_16_SPLIT_OFFSET
},
506 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
, R_V850_ZDA_16_16_SPLIT_OFFSET
},
507 { BFD_RELOC_V850_CALLT_6_7_OFFSET
, R_V850_CALLT_6_7_OFFSET
},
508 { BFD_RELOC_V850_CALLT_16_16_OFFSET
, R_V850_CALLT_16_16_OFFSET
},
509 { BFD_RELOC_VTABLE_INHERIT
, R_V850_GNU_VTINHERIT
},
510 { BFD_RELOC_VTABLE_ENTRY
, R_V850_GNU_VTENTRY
},
514 /* Map a bfd relocation into the appropriate howto structure. */
516 static reloc_howto_type
*
517 v850_elf_reloc_type_lookup (abfd
, code
)
518 bfd
* abfd ATTRIBUTE_UNUSED
;
519 bfd_reloc_code_real_type code
;
523 for (i
= ARRAY_SIZE (v850_elf_reloc_map
); i
--;)
524 if (v850_elf_reloc_map
[i
].bfd_reloc_val
== code
)
526 BFD_ASSERT (v850_elf_howto_table
[code
].type
== v850_elf_reloc_map
[i
].elf_reloc_val
);
528 return v850_elf_howto_table
+ code
;
534 /* Set the howto pointer for an V850 ELF reloc. */
537 v850_elf_info_to_howto_rel (abfd
, cache_ptr
, dst
)
538 bfd
* abfd ATTRIBUTE_UNUSED
;
540 Elf32_Internal_Rel
* dst
;
544 r_type
= ELF32_R_TYPE (dst
->r_info
);
545 BFD_ASSERT (r_type
< (unsigned int) R_V850_max
);
546 cache_ptr
->howto
= &v850_elf_howto_table
[r_type
];
549 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
551 v850_elf_info_to_howto_rela (abfd
, cache_ptr
, dst
)
552 bfd
* abfd ATTRIBUTE_UNUSED
;
554 Elf32_Internal_Rela
*dst
;
558 r_type
= ELF32_R_TYPE (dst
->r_info
);
559 BFD_ASSERT (r_type
< (unsigned int) R_V850_max
);
560 cache_ptr
->howto
= &v850_elf_howto_table
[r_type
];
563 /* Look through the relocs for a section during the first phase, and
564 allocate space in the global offset table or procedure linkage
568 v850_elf_check_relocs (abfd
, info
, sec
, relocs
)
570 struct bfd_link_info
* info
;
572 const Elf_Internal_Rela
* relocs
;
576 Elf_Internal_Shdr
*symtab_hdr
;
577 struct elf_link_hash_entry
**sym_hashes
;
578 const Elf_Internal_Rela
*rel
;
579 const Elf_Internal_Rela
*rel_end
;
581 enum v850_reloc_type r_type
;
583 const char *common
= (const char *)0;
585 if (info
->relocateable
)
589 fprintf (stderr
, "v850_elf_check_relocs called for section %s in %s\n",
590 bfd_get_section_name (abfd
, sec
),
591 bfd_get_filename (abfd
));
594 dynobj
= elf_hash_table (info
)->dynobj
;
595 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
596 sym_hashes
= elf_sym_hashes (abfd
);
599 rel_end
= relocs
+ sec
->reloc_count
;
600 for (rel
= relocs
; rel
< rel_end
; rel
++)
602 unsigned long r_symndx
;
603 struct elf_link_hash_entry
*h
;
605 r_symndx
= ELF32_R_SYM (rel
->r_info
);
606 if (r_symndx
< symtab_hdr
->sh_info
)
609 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
611 r_type
= (enum v850_reloc_type
) ELF32_R_TYPE (rel
->r_info
);
617 case R_V850_22_PCREL
:
624 case R_V850_CALLT_6_7_OFFSET
:
625 case R_V850_CALLT_16_16_OFFSET
:
628 /* This relocation describes the C++ object vtable hierarchy.
629 Reconstruct it for later use during GC. */
630 case R_V850_GNU_VTINHERIT
:
631 if (!_bfd_elf32_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
635 /* This relocation describes which C++ vtable entries
636 are actually used. Record for later use during GC. */
637 case R_V850_GNU_VTENTRY
:
638 if (!_bfd_elf32_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
642 case R_V850_SDA_16_16_SPLIT_OFFSET
:
643 case R_V850_SDA_16_16_OFFSET
:
644 case R_V850_SDA_15_16_OFFSET
:
645 other
= V850_OTHER_SDA
;
647 goto small_data_common
;
649 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
650 case R_V850_ZDA_16_16_OFFSET
:
651 case R_V850_ZDA_15_16_OFFSET
:
652 other
= V850_OTHER_ZDA
;
654 goto small_data_common
;
656 case R_V850_TDA_4_5_OFFSET
:
657 case R_V850_TDA_4_4_OFFSET
:
658 case R_V850_TDA_6_8_OFFSET
:
659 case R_V850_TDA_7_8_OFFSET
:
660 case R_V850_TDA_7_7_OFFSET
:
661 case R_V850_TDA_16_16_OFFSET
:
662 other
= V850_OTHER_TDA
;
666 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
671 /* Flag which type of relocation was used. */
673 if ((h
->other
& V850_OTHER_MASK
) != (other
& V850_OTHER_MASK
)
674 && (h
->other
& V850_OTHER_ERROR
) == 0)
677 static char buff
[200]; /* XXX */
679 switch (h
->other
& V850_OTHER_MASK
)
682 msg
= _("Variable `%s' cannot occupy in multiple small data regions");
684 case V850_OTHER_SDA
| V850_OTHER_ZDA
| V850_OTHER_TDA
:
685 msg
= _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
687 case V850_OTHER_SDA
| V850_OTHER_ZDA
:
688 msg
= _("Variable `%s' cannot be in both small and zero data regions simultaneously");
690 case V850_OTHER_SDA
| V850_OTHER_TDA
:
691 msg
= _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
693 case V850_OTHER_ZDA
| V850_OTHER_TDA
:
694 msg
= _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
698 sprintf (buff
, msg
, h
->root
.root
.string
);
699 info
->callbacks
->warning (info
, buff
, h
->root
.root
.string
,
700 abfd
, h
->root
.u
.def
.section
, 0);
702 bfd_set_error (bfd_error_bad_value
);
703 h
->other
|= V850_OTHER_ERROR
;
708 if (h
&& h
->root
.type
== bfd_link_hash_common
710 && !strcmp (bfd_get_section_name (abfd
, h
->root
.u
.c
.p
->section
), "COMMON"))
714 section
= h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
, common
);
715 section
->flags
|= SEC_IS_COMMON
;
719 fprintf (stderr
, "v850_elf_check_relocs, found %s relocation for %s%s\n",
720 v850_elf_howto_table
[ (int)r_type
].name
,
721 (h
&& h
->root
.root
.string
) ? h
->root
.root
.string
: "<unknown>",
722 (h
->root
.type
== bfd_link_hash_common
) ? ", symbol is common" : "");
731 /* In the old version, when an entry was checked out from the table,
732 it was deleted. This produced an error if the entry was needed
733 more than once, as the second attempted retry failed.
735 In the current version, the entry is not deleted, instead we set
736 the field 'found' to true. If a second lookup matches the same
737 entry, then we know that the hi16s reloc has already been updated
738 and does not need to be updated a second time.
740 TODO - TOFIX: If it is possible that we need to restore 2 different
741 addresses from the same table entry, where the first generates an
742 overflow, whilst the second do not, then this code will fail. */
744 typedef struct hi16s_location
748 unsigned long counter
;
750 struct hi16s_location
* next
;
754 static hi16s_location
* previous_hi16s
;
755 static hi16s_location
* free_hi16s
;
756 static unsigned long hi16s_counter
;
759 remember_hi16s_reloc (abfd
, addend
, address
)
764 hi16s_location
* entry
= NULL
;
766 /* Find a free structure. */
767 if (free_hi16s
== NULL
)
768 free_hi16s
= (hi16s_location
*) bfd_zalloc (abfd
, sizeof (* free_hi16s
));
771 free_hi16s
= free_hi16s
->next
;
773 entry
->addend
= addend
;
774 entry
->address
= address
;
775 entry
->counter
= hi16s_counter
++;
776 entry
->found
= false;
777 entry
->next
= previous_hi16s
;
778 previous_hi16s
= entry
;
780 /* Cope with wrap around of our counter. */
781 if (hi16s_counter
== 0)
783 /* XXX - Assume that all counter entries differ only in their low 16 bits. */
784 for (entry
= previous_hi16s
; entry
!= NULL
; entry
= entry
->next
)
785 entry
->counter
&= 0xffff;
787 hi16s_counter
= 0x10000;
794 find_remembered_hi16s_reloc (addend
, already_found
)
796 boolean
* already_found
;
798 hi16s_location
* match
= NULL
;
799 hi16s_location
* entry
;
800 hi16s_location
* previous
= NULL
;
801 hi16s_location
* prev
;
804 /* Search the table. Record the most recent entry that matches. */
805 for (entry
= previous_hi16s
; entry
; entry
= entry
->next
)
807 if (entry
->addend
== addend
808 && (match
== NULL
|| match
->counter
< entry
->counter
))
820 /* Extract the address. */
821 addr
= match
->address
;
823 /* Remeber if this entry has already been used before. */
825 * already_found
= match
->found
;
827 /* Note that this entry has now been used. */
833 /* FIXME: The code here probably ought to be removed and the code in reloc.c
834 allowed to do its stuff instead. At least for most of the relocs, anwyay. */
836 static bfd_reloc_status_type
837 v850_elf_perform_relocation (abfd
, r_type
, addend
, address
)
844 bfd_signed_vma saddend
= (bfd_signed_vma
) addend
;
849 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
850 return bfd_reloc_notsupported
;
853 bfd_put_32 (abfd
, addend
, address
);
856 case R_V850_22_PCREL
:
857 if (saddend
> 0x1fffff || saddend
< -0x200000)
858 return bfd_reloc_overflow
;
860 if ((addend
% 2) != 0)
861 return bfd_reloc_dangerous
;
863 insn
= bfd_get_32 (abfd
, address
);
865 insn
|= (((addend
& 0xfffe) << 16) | ((addend
& 0x3f0000) >> 16));
866 bfd_put_32 (abfd
, insn
, address
);
870 if (saddend
> 0xff || saddend
< -0x100)
871 return bfd_reloc_overflow
;
873 if ((addend
% 2) != 0)
874 return bfd_reloc_dangerous
;
876 insn
= bfd_get_16 (abfd
, address
);
878 insn
|= ((addend
& 0x1f0) << 7) | ((addend
& 0x0e) << 3);
882 addend
+= (bfd_get_16 (abfd
, address
) << 16);
883 addend
= (addend
>> 16);
888 /* Remember where this relocation took place. */
889 remember_hi16s_reloc (abfd
, addend
, address
);
891 addend
+= (bfd_get_16 (abfd
, address
) << 16);
892 addend
= (addend
>> 16) + ((addend
& 0x8000) != 0);
894 /* This relocation cannot overflow. */
902 /* Calculate the sum of the value stored in the instruction and the
903 addend and check for overflow from the low 16 bits into the high
904 16 bits. The assembler has already done some of this: If the
905 value stored in the instruction has its 15th bit set, (counting
906 from zero) then the assembler will have added 1 to the value
907 stored in the associated HI16S reloc. So for example, these
910 movhi hi( fred ), r0, r1
911 movea lo( fred ), r1, r1
913 will store 0 in the value fields for the MOVHI and MOVEA instructions
914 and addend will be the address of fred, but for these instructions:
916 movhi hi( fred + 0x123456), r0, r1
917 movea lo( fred + 0x123456), r1, r1
919 the value stored in the MOVHI instruction will be 0x12 and the value
920 stored in the MOVEA instruction will be 0x3456. If however the
923 movhi hi( fred + 0x10ffff), r0, r1
924 movea lo( fred + 0x10ffff), r1, r1
926 then the value stored in the MOVHI instruction would be 0x11 (not
927 0x10) and the value stored in the MOVEA instruction would be 0xffff.
928 Thus (assuming for the moment that the addend is 0), at run time the
929 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
930 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
931 the instructions were:
933 movhi hi( fred - 1), r0, r1
934 movea lo( fred - 1), r1, r1
936 then 0 is stored in the MOVHI instruction and -1 is stored in the
939 Overflow can occur if the addition of the value stored in the
940 instruction plus the addend sets the 15th bit when before it was clear.
941 This is because the 15th bit will be sign extended into the high part,
942 thus reducing its value by one, but since the 15th bit was originally
943 clear, the assembler will not have added 1 to the previous HI16S reloc
944 to compensate for this effect. For example:
946 movhi hi( fred + 0x123456), r0, r1
947 movea lo( fred + 0x123456), r1, r1
949 The value stored in HI16S reloc is 0x12, the value stored in the LO16
950 reloc is 0x3456. If we assume that the address of fred is 0x00007000
951 then the relocations become:
953 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
954 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
956 but when the instructions are executed, the MOVEA instruction's value
957 is signed extended, so the sum becomes:
962 0x0011a456 but 'fred + 0x123456' = 0x0012a456
964 Note that if the 15th bit was set in the value stored in the LO16
965 reloc, then we do not have to do anything:
967 movhi hi( fred + 0x10ffff), r0, r1
968 movea lo( fred + 0x10ffff), r1, r1
970 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
971 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
976 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
978 Overflow can also occur if the computation carries into the 16th bit
979 and it also results in the 15th bit having the same value as the 15th
980 bit of the original value. What happens is that the HI16S reloc
981 will have already examined the 15th bit of the original value and
982 added 1 to the high part if the bit is set. This compensates for the
983 sign extension of 15th bit of the result of the computation. But now
984 there is a carry into the 16th bit, and this has not been allowed for.
986 So, for example if fred is at address 0xf000:
988 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
989 movea lo( fred + 0xffff), r1, r1
991 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
992 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
997 0x0000efff but 'fred + 0xffff' = 0x0001efff
999 Similarly, if the 15th bit remains clear, but overflow occurs into
1000 the 16th bit then (assuming the address of fred is 0xf000):
1002 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1003 movea lo( fred + 0x7000), r1, r1
1005 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
1006 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1011 0x00006fff but 'fred + 0x7000' = 0x00016fff
1013 Note - there is no need to change anything if a carry occurs, and the
1014 15th bit changes its value from being set to being clear, as the HI16S
1015 reloc will have already added in 1 to the high part for us:
1017 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
1018 movea lo( fred + 0xffff), r1, r1
1020 HI16S: 0x0001 + (0x00007000 >> 16)
1021 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1024 + 0x00006fff (bit 15 not set, so the top half is zero)
1026 0x00016fff which is right (assuming that fred is at 0x7000)
1028 but if the 15th bit goes from being clear to being set, then we must
1029 once again handle overflow:
1031 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1032 movea lo( fred + 0x7000), r1, r1
1034 HI16S: 0x0000 + (0x0000ffff >> 16)
1035 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
1038 + 0x00006fff (bit 15 not set, so the top half is zero)
1040 0x00006fff which is wrong (assuming that fred is at 0xffff). */
1044 insn
= bfd_get_16 (abfd
, address
);
1045 result
= insn
+ addend
;
1047 #define BIT15_SET(x) ((x) & 0x8000)
1048 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
1050 if ((BIT15_SET (result
) && ! BIT15_SET (addend
))
1051 || (OVERFLOWS (addend
, insn
)
1052 && ((! BIT15_SET (insn
)) || (BIT15_SET (addend
)))))
1054 boolean already_updated
;
1055 bfd_byte
* hi16s_address
= find_remembered_hi16s_reloc
1056 (addend
, & already_updated
);
1058 /* Amend the matching HI16_S relocation. */
1059 if (hi16s_address
!= NULL
)
1061 if (! already_updated
)
1063 insn
= bfd_get_16 (abfd
, hi16s_address
);
1065 bfd_put_16 (abfd
, insn
, hi16s_address
);
1070 fprintf (stderr
, _("FAILED to find previous HI16 reloc\n"));
1071 return bfd_reloc_overflow
;
1075 /* Do not complain if value has top bit set, as this has been anticipated. */
1076 insn
= result
& 0xffff;
1081 addend
+= (char) bfd_get_8 (abfd
, address
);
1083 saddend
= (bfd_signed_vma
) addend
;
1085 if (saddend
> 0x7f || saddend
< -0x80)
1086 return bfd_reloc_overflow
;
1088 bfd_put_8 (abfd
, addend
, address
);
1089 return bfd_reloc_ok
;
1091 case R_V850_CALLT_16_16_OFFSET
:
1092 addend
+= bfd_get_16 (abfd
, address
);
1094 saddend
= (bfd_signed_vma
) addend
;
1096 if (saddend
> 0xffff || saddend
< 0)
1097 return bfd_reloc_overflow
;
1105 case R_V850_SDA_16_16_OFFSET
:
1106 case R_V850_ZDA_16_16_OFFSET
:
1107 case R_V850_TDA_16_16_OFFSET
:
1108 addend
+= bfd_get_16 (abfd
, address
);
1110 saddend
= (bfd_signed_vma
) addend
;
1112 if (saddend
> 0x7fff || saddend
< -0x8000)
1113 return bfd_reloc_overflow
;
1118 case R_V850_SDA_15_16_OFFSET
:
1119 case R_V850_ZDA_15_16_OFFSET
:
1120 insn
= bfd_get_16 (abfd
, address
);
1121 addend
+= (insn
& 0xfffe);
1123 saddend
= (bfd_signed_vma
) addend
;
1125 if (saddend
> 0x7ffe || saddend
< -0x8000)
1126 return bfd_reloc_overflow
;
1129 return bfd_reloc_dangerous
;
1131 insn
= (addend
& ~1) | (insn
& 1);
1134 case R_V850_TDA_6_8_OFFSET
:
1135 insn
= bfd_get_16 (abfd
, address
);
1136 addend
+= ((insn
& 0x7e) << 1);
1138 saddend
= (bfd_signed_vma
) addend
;
1140 if (saddend
> 0xfc || saddend
< 0)
1141 return bfd_reloc_overflow
;
1144 return bfd_reloc_dangerous
;
1147 insn
|= (addend
>> 1);
1150 case R_V850_TDA_7_8_OFFSET
:
1151 insn
= bfd_get_16 (abfd
, address
);
1152 addend
+= ((insn
& 0x7f) << 1);
1154 saddend
= (bfd_signed_vma
) addend
;
1156 if (saddend
> 0xfe || saddend
< 0)
1157 return bfd_reloc_overflow
;
1160 return bfd_reloc_dangerous
;
1163 insn
|= (addend
>> 1);
1166 case R_V850_TDA_7_7_OFFSET
:
1167 insn
= bfd_get_16 (abfd
, address
);
1168 addend
+= insn
& 0x7f;
1170 saddend
= (bfd_signed_vma
) addend
;
1172 if (saddend
> 0x7f || saddend
< 0)
1173 return bfd_reloc_overflow
;
1179 case R_V850_TDA_4_5_OFFSET
:
1180 insn
= bfd_get_16 (abfd
, address
);
1181 addend
+= ((insn
& 0xf) << 1);
1183 saddend
= (bfd_signed_vma
) addend
;
1185 if (saddend
> 0x1e || saddend
< 0)
1186 return bfd_reloc_overflow
;
1189 return bfd_reloc_dangerous
;
1192 insn
|= (addend
>> 1);
1195 case R_V850_TDA_4_4_OFFSET
:
1196 insn
= bfd_get_16 (abfd
, address
);
1197 addend
+= insn
& 0xf;
1199 saddend
= (bfd_signed_vma
) addend
;
1201 if (saddend
> 0xf || saddend
< 0)
1202 return bfd_reloc_overflow
;
1208 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
1209 case R_V850_SDA_16_16_SPLIT_OFFSET
:
1210 insn
= bfd_get_32 (abfd
, address
);
1211 addend
+= ((insn
& 0xfffe0000) >> 16) + ((insn
& 0x20) >> 5);
1213 saddend
= (bfd_signed_vma
) addend
;
1215 if (saddend
> 0x7fff || saddend
< -0x8000)
1216 return bfd_reloc_overflow
;
1219 insn
|= (addend
& 1) << 5;
1220 insn
|= (addend
& ~1) << 16;
1222 bfd_put_32 (abfd
, insn
, address
);
1223 return bfd_reloc_ok
;
1225 case R_V850_CALLT_6_7_OFFSET
:
1226 insn
= bfd_get_16 (abfd
, address
);
1227 addend
+= ((insn
& 0x3f) << 1);
1229 saddend
= (bfd_signed_vma
) addend
;
1231 if (saddend
> 0x7e || saddend
< 0)
1232 return bfd_reloc_overflow
;
1235 return bfd_reloc_dangerous
;
1238 insn
|= (addend
>> 1);
1241 case R_V850_GNU_VTINHERIT
:
1242 case R_V850_GNU_VTENTRY
:
1243 return bfd_reloc_ok
;
1247 bfd_put_16 (abfd
, insn
, address
);
1248 return bfd_reloc_ok
;
1251 /* Insert the addend into the instruction. */
1253 static bfd_reloc_status_type
1254 v850_elf_reloc (abfd
, reloc
, symbol
, data
, isection
, obfd
, err
)
1255 bfd
* abfd ATTRIBUTE_UNUSED
;
1258 PTR data ATTRIBUTE_UNUSED
;
1259 asection
* isection
;
1261 char ** err ATTRIBUTE_UNUSED
;
1265 /* If there is an output BFD,
1266 and the symbol is not a section name (which is only defined at final link time),
1267 and either we are not putting the addend into the instruction
1268 or the addend is zero, so there is nothing to add into the instruction
1269 then just fixup the address and return. */
1270 if (obfd
!= (bfd
*) NULL
1271 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1272 && (! reloc
->howto
->partial_inplace
1273 || reloc
->addend
== 0))
1275 reloc
->address
+= isection
->output_offset
;
1276 return bfd_reloc_ok
;
1279 else if (obfd
!= NULL
)
1280 return bfd_reloc_continue
;
1283 /* Catch relocs involving undefined symbols. */
1284 if (bfd_is_und_section (symbol
->section
)
1285 && (symbol
->flags
& BSF_WEAK
) == 0
1287 return bfd_reloc_undefined
;
1289 /* We handle final linking of some relocs ourselves. */
1291 /* Is the address of the relocation really within the section? */
1292 if (reloc
->address
> isection
->_cooked_size
)
1293 return bfd_reloc_outofrange
;
1295 /* Work out which section the relocation is targetted at and the
1296 initial relocation command value. */
1298 /* Get symbol value. (Common symbols are special.) */
1299 if (bfd_is_com_section (symbol
->section
))
1302 relocation
= symbol
->value
;
1304 /* Convert input-section-relative symbol value to absolute + addend. */
1305 relocation
+= symbol
->section
->output_section
->vma
;
1306 relocation
+= symbol
->section
->output_offset
;
1307 relocation
+= reloc
->addend
;
1309 #if 0 /* Since this reloc is going to be processed later on, we should
1310 not make it pc-relative here. To test this, try assembling and
1311 linking this program:
1319 .section ".foo","ax"
1323 if (reloc
->howto
->pc_relative
== true)
1325 /* Here the variable relocation holds the final address of the
1326 symbol we are relocating against, plus any addend. */
1327 relocation
-= isection
->output_section
->vma
+ isection
->output_offset
;
1329 /* Deal with pcrel_offset. */
1330 relocation
-= reloc
->address
;
1333 reloc
->addend
= relocation
;
1334 return bfd_reloc_ok
;
1338 v850_elf_is_local_label_name (abfd
, name
)
1339 bfd
* abfd ATTRIBUTE_UNUSED
;
1342 return ( (name
[0] == '.' && (name
[1] == 'L' || name
[1] == '.'))
1343 || (name
[0] == '_' && name
[1] == '.' && name
[2] == 'L' && name
[3] == '_'));
1346 /* Perform a relocation as part of a final link. */
1348 static bfd_reloc_status_type
1349 v850_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
1350 input_section
, contents
, offset
, value
,
1351 addend
, info
, sym_sec
, is_local
)
1352 reloc_howto_type
* howto
;
1354 bfd
* output_bfd ATTRIBUTE_UNUSED
;
1355 asection
* input_section
;
1356 bfd_byte
* contents
;
1360 struct bfd_link_info
* info
;
1362 int is_local ATTRIBUTE_UNUSED
;
1364 unsigned long r_type
= howto
->type
;
1365 bfd_byte
* hit_data
= contents
+ offset
;
1367 /* Adjust the value according to the relocation. */
1370 case R_V850_9_PCREL
:
1371 value
-= (input_section
->output_section
->vma
1372 + input_section
->output_offset
);
1376 case R_V850_22_PCREL
:
1377 value
-= (input_section
->output_section
->vma
1378 + input_section
->output_offset
1381 /* If the sign extension will corrupt the value then we have overflowed. */
1382 if (((value
& 0xff000000) != 0x0) && ((value
& 0xff000000) != 0xff000000))
1383 return bfd_reloc_overflow
;
1385 /* Only the bottom 24 bits of the PC are valid */
1386 value
= SEXT24 (value
);
1397 case R_V850_ZDA_15_16_OFFSET
:
1398 case R_V850_ZDA_16_16_OFFSET
:
1399 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
1400 if (sym_sec
== NULL
)
1401 return bfd_reloc_undefined
;
1403 value
-= sym_sec
->output_section
->vma
;
1406 case R_V850_SDA_15_16_OFFSET
:
1407 case R_V850_SDA_16_16_OFFSET
:
1408 case R_V850_SDA_16_16_SPLIT_OFFSET
:
1411 struct bfd_link_hash_entry
* h
;
1413 if (sym_sec
== NULL
)
1414 return bfd_reloc_undefined
;
1416 /* Get the value of __gp. */
1417 h
= bfd_link_hash_lookup (info
->hash
, "__gp", false, false, true);
1418 if (h
== (struct bfd_link_hash_entry
*) NULL
1419 || h
->type
!= bfd_link_hash_defined
)
1420 return bfd_reloc_other
;
1422 gp
= (h
->u
.def
.value
1423 + h
->u
.def
.section
->output_section
->vma
1424 + h
->u
.def
.section
->output_offset
);
1426 value
-= sym_sec
->output_section
->vma
;
1427 value
-= (gp
- sym_sec
->output_section
->vma
);
1431 case R_V850_TDA_4_4_OFFSET
:
1432 case R_V850_TDA_4_5_OFFSET
:
1433 case R_V850_TDA_16_16_OFFSET
:
1434 case R_V850_TDA_7_7_OFFSET
:
1435 case R_V850_TDA_7_8_OFFSET
:
1436 case R_V850_TDA_6_8_OFFSET
:
1439 struct bfd_link_hash_entry
* h
;
1441 /* Get the value of __ep. */
1442 h
= bfd_link_hash_lookup (info
->hash
, "__ep", false, false, true);
1443 if (h
== (struct bfd_link_hash_entry
*) NULL
1444 || h
->type
!= bfd_link_hash_defined
)
1445 /* Actually this indicates that __ep could not be found. */
1446 return bfd_reloc_continue
;
1448 ep
= (h
->u
.def
.value
1449 + h
->u
.def
.section
->output_section
->vma
1450 + h
->u
.def
.section
->output_offset
);
1456 case R_V850_CALLT_6_7_OFFSET
:
1459 struct bfd_link_hash_entry
* h
;
1461 /* Get the value of __ctbp. */
1462 h
= bfd_link_hash_lookup (info
->hash
, "__ctbp", false, false, true);
1463 if (h
== (struct bfd_link_hash_entry
*) NULL
1464 || h
->type
!= bfd_link_hash_defined
)
1465 /* Actually this indicates that __ctbp could not be found. */
1466 return bfd_reloc_dangerous
+ 1;
1468 ctbp
= (h
->u
.def
.value
1469 + h
->u
.def
.section
->output_section
->vma
1470 + h
->u
.def
.section
->output_offset
);
1475 case R_V850_CALLT_16_16_OFFSET
:
1478 struct bfd_link_hash_entry
* h
;
1480 if (sym_sec
== NULL
)
1481 return bfd_reloc_undefined
;
1483 /* Get the value of __ctbp. */
1484 h
= bfd_link_hash_lookup (info
->hash
, "__ctbp", false, false, true);
1485 if (h
== (struct bfd_link_hash_entry
*) NULL
1486 || h
->type
!= bfd_link_hash_defined
)
1487 return (bfd_reloc_dangerous
+ 1);
1489 ctbp
= (h
->u
.def
.value
1490 + h
->u
.def
.section
->output_section
->vma
1491 + h
->u
.def
.section
->output_offset
);
1493 value
-= sym_sec
->output_section
->vma
;
1494 value
-= (ctbp
- sym_sec
->output_section
->vma
);
1499 case R_V850_GNU_VTINHERIT
:
1500 case R_V850_GNU_VTENTRY
:
1501 return bfd_reloc_ok
;
1504 return bfd_reloc_notsupported
;
1507 /* Perform the relocation. */
1508 return v850_elf_perform_relocation (input_bfd
, r_type
, value
+ addend
, hit_data
);
1511 /* Relocate an V850 ELF section. */
1514 v850_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1515 contents
, relocs
, local_syms
, local_sections
)
1517 struct bfd_link_info
* info
;
1519 asection
* input_section
;
1520 bfd_byte
* contents
;
1521 Elf_Internal_Rela
* relocs
;
1522 Elf_Internal_Sym
* local_syms
;
1523 asection
** local_sections
;
1525 Elf_Internal_Shdr
* symtab_hdr
;
1526 struct elf_link_hash_entry
** sym_hashes
;
1527 Elf_Internal_Rela
* rel
;
1528 Elf_Internal_Rela
* relend
;
1530 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1531 sym_hashes
= elf_sym_hashes (input_bfd
);
1533 if (sym_hashes
== NULL
)
1535 info
->callbacks
->warning
1536 (info
, "no hash table available", NULL
, input_bfd
, input_section
, 0);
1541 /* Reset the list of remembered HI16S relocs to empty. */
1542 free_hi16s
= previous_hi16s
;
1543 previous_hi16s
= NULL
;
1547 relend
= relocs
+ input_section
->reloc_count
;
1548 for (; rel
< relend
; rel
++)
1551 reloc_howto_type
* howto
;
1552 unsigned long r_symndx
;
1553 Elf_Internal_Sym
* sym
;
1555 struct elf_link_hash_entry
* h
;
1557 bfd_reloc_status_type r
;
1559 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1560 r_type
= ELF32_R_TYPE (rel
->r_info
);
1562 if (r_type
== R_V850_GNU_VTENTRY
1563 || r_type
== R_V850_GNU_VTINHERIT
)
1566 howto
= v850_elf_howto_table
+ r_type
;
1568 if (info
->relocateable
)
1570 /* This is a relocateable link. We don't have to change
1571 anything, unless the reloc is against a section symbol,
1572 in which case we have to adjust according to where the
1573 section symbol winds up in the output section. */
1574 if (r_symndx
< symtab_hdr
->sh_info
)
1576 sym
= local_syms
+ r_symndx
;
1577 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1579 sec
= local_sections
[r_symndx
];
1580 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
1587 /* This is a final link. */
1591 if (r_symndx
< symtab_hdr
->sh_info
)
1593 sym
= local_syms
+ r_symndx
;
1594 sec
= local_sections
[r_symndx
];
1595 relocation
= (sec
->output_section
->vma
1596 + sec
->output_offset
1602 name
= bfd_elf_string_from_elf_section (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
1603 name
= (name
== NULL
) ? "<none>" : name
;
1604 fprintf (stderr
, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
1605 sec
->name
, name
, sym
->st_name
,
1606 sec
->output_section
->vma
, sec
->output_offset
, sym
->st_value
, rel
->r_addend
);
1612 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1614 while (h
->root
.type
== bfd_link_hash_indirect
1615 || h
->root
.type
== bfd_link_hash_warning
)
1616 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1618 if (h
->root
.type
== bfd_link_hash_defined
1619 || h
->root
.type
== bfd_link_hash_defweak
)
1621 sec
= h
->root
.u
.def
.section
;
1622 relocation
= (h
->root
.u
.def
.value
1623 + sec
->output_section
->vma
1624 + sec
->output_offset
);
1626 fprintf (stderr
, "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
1627 sec
->name
, h
->root
.root
.string
, h
->root
.u
.def
.value
, sec
->output_section
->vma
, sec
->output_offset
, relocation
);
1630 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1633 fprintf (stderr
, "undefined: sec: %s, name: %s\n",
1634 sec
->name
, h
->root
.root
.string
);
1640 if (! ((*info
->callbacks
->undefined_symbol
)
1641 (info
, h
->root
.root
.string
, input_bfd
,
1642 input_section
, rel
->r_offset
, true)))
1645 fprintf (stderr
, "unknown: name: %s\n", h
->root
.root
.string
);
1651 /* FIXME: We should use the addend, but the COFF relocations don't. */
1652 r
= v850_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
1654 contents
, rel
->r_offset
,
1655 relocation
, rel
->r_addend
,
1656 info
, sec
, h
== NULL
);
1658 if (r
!= bfd_reloc_ok
)
1661 const char * msg
= (const char *)0;
1664 name
= h
->root
.root
.string
;
1667 name
= (bfd_elf_string_from_elf_section
1668 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
1669 if (name
== NULL
|| *name
== '\0')
1670 name
= bfd_section_name (input_bfd
, sec
);
1675 case bfd_reloc_overflow
:
1676 if (! ((*info
->callbacks
->reloc_overflow
)
1677 (info
, name
, howto
->name
, (bfd_vma
) 0,
1678 input_bfd
, input_section
, rel
->r_offset
)))
1682 case bfd_reloc_undefined
:
1683 if (! ((*info
->callbacks
->undefined_symbol
)
1684 (info
, name
, input_bfd
, input_section
,
1685 rel
->r_offset
, true)))
1689 case bfd_reloc_outofrange
:
1690 msg
= _("internal error: out of range error");
1693 case bfd_reloc_notsupported
:
1694 msg
= _("internal error: unsupported relocation error");
1697 case bfd_reloc_dangerous
:
1698 msg
= _("internal error: dangerous relocation");
1701 case bfd_reloc_other
:
1702 msg
= _("could not locate special linker symbol __gp");
1705 case bfd_reloc_continue
:
1706 msg
= _("could not locate special linker symbol __ep");
1709 case (bfd_reloc_dangerous
+ 1):
1710 msg
= _("could not locate special linker symbol __ctbp");
1714 msg
= _("internal error: unknown error");
1718 if (!((*info
->callbacks
->warning
)
1719 (info
, msg
, name
, input_bfd
, input_section
,
1731 v850_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
1732 bfd
*abfd ATTRIBUTE_UNUSED
;
1733 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1734 asection
*sec ATTRIBUTE_UNUSED
;
1735 const Elf_Internal_Rela
*relocs ATTRIBUTE_UNUSED
;
1737 /* No got and plt entries for v850-elf. */
1742 v850_elf_gc_mark_hook (abfd
, info
, rel
, h
, sym
)
1744 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1745 Elf_Internal_Rela
*rel
;
1746 struct elf_link_hash_entry
*h
;
1747 Elf_Internal_Sym
*sym
;
1751 switch (ELF32_R_TYPE (rel
->r_info
))
1753 case R_V850_GNU_VTINHERIT
:
1754 case R_V850_GNU_VTENTRY
:
1758 switch (h
->root
.type
)
1760 case bfd_link_hash_defined
:
1761 case bfd_link_hash_defweak
:
1762 return h
->root
.u
.def
.section
;
1764 case bfd_link_hash_common
:
1765 return h
->root
.u
.c
.p
->section
;
1774 if (!(elf_bad_symtab (abfd
)
1775 && ELF_ST_BIND (sym
->st_info
) != STB_LOCAL
)
1776 && ! ((sym
->st_shndx
<= 0 || sym
->st_shndx
>= SHN_LORESERVE
)
1777 && sym
->st_shndx
!= SHN_COMMON
))
1779 return bfd_section_from_elf_index (abfd
, sym
->st_shndx
);
1785 /* Set the right machine number. */
1788 v850_elf_object_p (abfd
)
1791 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1794 case E_V850_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, 0); break;
1795 case E_V850E_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e
); break;
1796 case E_V850EA_ARCH
: (void) bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850ea
); break;
1801 /* Store the machine number in the flags field. */
1804 v850_elf_final_write_processing (abfd
, linker
)
1806 boolean linker ATTRIBUTE_UNUSED
;
1810 switch (bfd_get_mach (abfd
))
1813 case 0: val
= E_V850_ARCH
; break;
1814 case bfd_mach_v850e
: val
= E_V850E_ARCH
; break;
1815 case bfd_mach_v850ea
: val
= E_V850EA_ARCH
; break;
1818 elf_elfheader (abfd
)->e_flags
&=~ EF_V850_ARCH
;
1819 elf_elfheader (abfd
)->e_flags
|= val
;
1822 /* Function to keep V850 specific file flags. */
1825 v850_elf_set_private_flags (abfd
, flags
)
1829 BFD_ASSERT (!elf_flags_init (abfd
)
1830 || elf_elfheader (abfd
)->e_flags
== flags
);
1832 elf_elfheader (abfd
)->e_flags
= flags
;
1833 elf_flags_init (abfd
) = true;
1837 /* Copy backend specific data from one object module to another. */
1840 v850_elf_copy_private_bfd_data (ibfd
, obfd
)
1844 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1845 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1848 BFD_ASSERT (!elf_flags_init (obfd
)
1849 || (elf_elfheader (obfd
)->e_flags
1850 == elf_elfheader (ibfd
)->e_flags
));
1852 elf_gp (obfd
) = elf_gp (ibfd
);
1853 elf_elfheader (obfd
)->e_flags
= elf_elfheader (ibfd
)->e_flags
;
1854 elf_flags_init (obfd
) = true;
1859 /* Merge backend specific data from an object file
1860 to the output object file when linking. */
1862 v850_elf_merge_private_bfd_data (ibfd
, obfd
)
1869 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1870 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1873 in_flags
= elf_elfheader (ibfd
)->e_flags
;
1874 out_flags
= elf_elfheader (obfd
)->e_flags
;
1876 if (! elf_flags_init (obfd
))
1878 /* If the input is the default architecture then do not
1879 bother setting the flags for the output architecture,
1880 instead allow future merges to do this. If no future
1881 merges ever set these flags then they will retain their
1882 unitialised values, which surprise surprise, correspond
1883 to the default values. */
1884 if (bfd_get_arch_info (ibfd
)->the_default
)
1887 elf_flags_init (obfd
) = true;
1888 elf_elfheader (obfd
)->e_flags
= in_flags
;
1890 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
1891 && bfd_get_arch_info (obfd
)->the_default
)
1892 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
1897 /* Check flag compatibility. */
1898 if (in_flags
== out_flags
)
1901 if ((in_flags
& EF_V850_ARCH
) != (out_flags
& EF_V850_ARCH
)
1902 && (in_flags
& EF_V850_ARCH
) != E_V850_ARCH
)
1903 _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
1904 bfd_get_filename (ibfd
));
1909 /* Display the flags field. */
1912 v850_elf_print_private_bfd_data (abfd
, ptr
)
1916 FILE * file
= (FILE *) ptr
;
1918 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
1920 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
1922 /* xgettext:c-format */
1923 fprintf (file
, _("private flags = %lx: "), elf_elfheader (abfd
)->e_flags
);
1925 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1928 case E_V850_ARCH
: fprintf (file
, _("v850 architecture")); break;
1929 case E_V850E_ARCH
: fprintf (file
, _("v850e architecture")); break;
1930 case E_V850EA_ARCH
: fprintf (file
, _("v850ea architecture")); break;
1938 /* V850 ELF uses four common sections. One is the usual one, and the
1939 others are for (small) objects in one of the special data areas:
1940 small, tiny and zero. All the objects are kept together, and then
1941 referenced via the gp register, the ep register or the r0 register
1942 respectively, which yields smaller, faster assembler code. This
1943 approach is copied from elf32-mips.c. */
1945 static asection v850_elf_scom_section
;
1946 static asymbol v850_elf_scom_symbol
;
1947 static asymbol
* v850_elf_scom_symbol_ptr
;
1948 static asection v850_elf_tcom_section
;
1949 static asymbol v850_elf_tcom_symbol
;
1950 static asymbol
* v850_elf_tcom_symbol_ptr
;
1951 static asection v850_elf_zcom_section
;
1952 static asymbol v850_elf_zcom_symbol
;
1953 static asymbol
* v850_elf_zcom_symbol_ptr
;
1955 /* Given a BFD section, try to locate the
1956 corresponding ELF section index. */
1959 v850_elf_section_from_bfd_section (abfd
, hdr
, sec
, retval
)
1960 bfd
* abfd ATTRIBUTE_UNUSED
;
1961 Elf32_Internal_Shdr
* hdr ATTRIBUTE_UNUSED
;
1965 if (strcmp (bfd_get_section_name (abfd
, sec
), ".scommon") == 0)
1966 *retval
= SHN_V850_SCOMMON
;
1967 else if (strcmp (bfd_get_section_name (abfd
, sec
), ".tcommon") == 0)
1968 *retval
= SHN_V850_TCOMMON
;
1969 else if (strcmp (bfd_get_section_name (abfd
, sec
), ".zcommon") == 0)
1970 *retval
= SHN_V850_ZCOMMON
;
1977 /* Handle the special V850 section numbers that a symbol may use. */
1980 v850_elf_symbol_processing (abfd
, asym
)
1984 elf_symbol_type
* elfsym
= (elf_symbol_type
*) asym
;
1985 unsigned short index
;
1987 index
= elfsym
->internal_elf_sym
.st_shndx
;
1989 /* If the section index is an "ordinary" index, then it may
1990 refer to a v850 specific section created by the assembler.
1991 Check the section's type and change the index it matches.
1993 FIXME: Should we alter the st_shndx field as well ? */
1995 if (index
< elf_elfheader(abfd
)[0].e_shnum
)
1996 switch (elf_elfsections(abfd
)[index
]->sh_type
)
1998 case SHT_V850_SCOMMON
:
1999 index
= SHN_V850_SCOMMON
;
2002 case SHT_V850_TCOMMON
:
2003 index
= SHN_V850_TCOMMON
;
2006 case SHT_V850_ZCOMMON
:
2007 index
= SHN_V850_ZCOMMON
;
2016 case SHN_V850_SCOMMON
:
2017 if (v850_elf_scom_section
.name
== NULL
)
2019 /* Initialize the small common section. */
2020 v850_elf_scom_section
.name
= ".scommon";
2021 v850_elf_scom_section
.flags
= SEC_IS_COMMON
| SEC_ALLOC
| SEC_DATA
;
2022 v850_elf_scom_section
.output_section
= & v850_elf_scom_section
;
2023 v850_elf_scom_section
.symbol
= & v850_elf_scom_symbol
;
2024 v850_elf_scom_section
.symbol_ptr_ptr
= & v850_elf_scom_symbol_ptr
;
2025 v850_elf_scom_symbol
.name
= ".scommon";
2026 v850_elf_scom_symbol
.flags
= BSF_SECTION_SYM
;
2027 v850_elf_scom_symbol
.section
= & v850_elf_scom_section
;
2028 v850_elf_scom_symbol_ptr
= & v850_elf_scom_symbol
;
2030 asym
->section
= & v850_elf_scom_section
;
2031 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
2034 case SHN_V850_TCOMMON
:
2035 if (v850_elf_tcom_section
.name
== NULL
)
2037 /* Initialize the tcommon section. */
2038 v850_elf_tcom_section
.name
= ".tcommon";
2039 v850_elf_tcom_section
.flags
= SEC_IS_COMMON
;
2040 v850_elf_tcom_section
.output_section
= & v850_elf_tcom_section
;
2041 v850_elf_tcom_section
.symbol
= & v850_elf_tcom_symbol
;
2042 v850_elf_tcom_section
.symbol_ptr_ptr
= & v850_elf_tcom_symbol_ptr
;
2043 v850_elf_tcom_symbol
.name
= ".tcommon";
2044 v850_elf_tcom_symbol
.flags
= BSF_SECTION_SYM
;
2045 v850_elf_tcom_symbol
.section
= & v850_elf_tcom_section
;
2046 v850_elf_tcom_symbol_ptr
= & v850_elf_tcom_symbol
;
2048 asym
->section
= & v850_elf_tcom_section
;
2049 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
2052 case SHN_V850_ZCOMMON
:
2053 if (v850_elf_zcom_section
.name
== NULL
)
2055 /* Initialize the zcommon section. */
2056 v850_elf_zcom_section
.name
= ".zcommon";
2057 v850_elf_zcom_section
.flags
= SEC_IS_COMMON
;
2058 v850_elf_zcom_section
.output_section
= & v850_elf_zcom_section
;
2059 v850_elf_zcom_section
.symbol
= & v850_elf_zcom_symbol
;
2060 v850_elf_zcom_section
.symbol_ptr_ptr
= & v850_elf_zcom_symbol_ptr
;
2061 v850_elf_zcom_symbol
.name
= ".zcommon";
2062 v850_elf_zcom_symbol
.flags
= BSF_SECTION_SYM
;
2063 v850_elf_zcom_symbol
.section
= & v850_elf_zcom_section
;
2064 v850_elf_zcom_symbol_ptr
= & v850_elf_zcom_symbol
;
2066 asym
->section
= & v850_elf_zcom_section
;
2067 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
2072 /* Hook called by the linker routine which adds symbols from an object
2073 file. We must handle the special v850 section numbers here. */
2076 v850_elf_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
2078 struct bfd_link_info
* info ATTRIBUTE_UNUSED
;
2079 const Elf_Internal_Sym
* sym
;
2080 const char ** namep ATTRIBUTE_UNUSED
;
2081 flagword
* flagsp ATTRIBUTE_UNUSED
;
2085 int index
= sym
->st_shndx
;
2087 /* If the section index is an "ordinary" index, then it may
2088 refer to a v850 specific section created by the assembler.
2089 Check the section's type and change the index it matches.
2091 FIXME: Should we alter the st_shndx field as well ? */
2093 if (index
< elf_elfheader(abfd
)[0].e_shnum
)
2094 switch (elf_elfsections(abfd
)[index
]->sh_type
)
2096 case SHT_V850_SCOMMON
:
2097 index
= SHN_V850_SCOMMON
;
2100 case SHT_V850_TCOMMON
:
2101 index
= SHN_V850_TCOMMON
;
2104 case SHT_V850_ZCOMMON
:
2105 index
= SHN_V850_ZCOMMON
;
2114 case SHN_V850_SCOMMON
:
2115 *secp
= bfd_make_section_old_way (abfd
, ".scommon");
2116 (*secp
)->flags
|= SEC_IS_COMMON
;
2117 *valp
= sym
->st_size
;
2120 case SHN_V850_TCOMMON
:
2121 *secp
= bfd_make_section_old_way (abfd
, ".tcommon");
2122 (*secp
)->flags
|= SEC_IS_COMMON
;
2123 *valp
= sym
->st_size
;
2126 case SHN_V850_ZCOMMON
:
2127 *secp
= bfd_make_section_old_way (abfd
, ".zcommon");
2128 (*secp
)->flags
|= SEC_IS_COMMON
;
2129 *valp
= sym
->st_size
;
2137 v850_elf_link_output_symbol_hook (abfd
, info
, name
, sym
, input_sec
)
2138 bfd
* abfd ATTRIBUTE_UNUSED
;
2139 struct bfd_link_info
* info ATTRIBUTE_UNUSED
;
2140 const char * name ATTRIBUTE_UNUSED
;
2141 Elf_Internal_Sym
* sym
;
2142 asection
* input_sec
;
2144 /* If we see a common symbol, which implies a relocatable link, then
2145 if a symbol was in a special common section in an input file, mark
2146 it as a special common in the output file. */
2148 if (sym
->st_shndx
== SHN_COMMON
)
2150 if (strcmp (input_sec
->name
, ".scommon") == 0)
2151 sym
->st_shndx
= SHN_V850_SCOMMON
;
2152 else if (strcmp (input_sec
->name
, ".tcommon") == 0)
2153 sym
->st_shndx
= SHN_V850_TCOMMON
;
2154 else if (strcmp (input_sec
->name
, ".zcommon") == 0)
2155 sym
->st_shndx
= SHN_V850_ZCOMMON
;
2162 v850_elf_section_from_shdr (abfd
, hdr
, name
)
2164 Elf_Internal_Shdr
* hdr
;
2167 /* There ought to be a place to keep ELF backend specific flags, but
2168 at the moment there isn't one. We just keep track of the
2169 sections by their name, instead. */
2171 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
))
2174 switch (hdr
->sh_type
)
2176 case SHT_V850_SCOMMON
:
2177 case SHT_V850_TCOMMON
:
2178 case SHT_V850_ZCOMMON
:
2179 if (! bfd_set_section_flags (abfd
, hdr
->bfd_section
,
2180 (bfd_get_section_flags (abfd
,
2189 /* Set the correct type for a V850 ELF section. We do this
2190 by the section name, which is a hack, but ought to work. */
2193 v850_elf_fake_sections (abfd
, hdr
, sec
)
2194 bfd
* abfd ATTRIBUTE_UNUSED
;
2195 Elf32_Internal_Shdr
* hdr
;
2198 register const char * name
;
2200 name
= bfd_get_section_name (abfd
, sec
);
2202 if (strcmp (name
, ".scommon") == 0)
2204 hdr
->sh_type
= SHT_V850_SCOMMON
;
2206 else if (strcmp (name
, ".tcommon") == 0)
2208 hdr
->sh_type
= SHT_V850_TCOMMON
;
2210 else if (strcmp (name
, ".zcommon") == 0)
2211 hdr
->sh_type
= SHT_V850_ZCOMMON
;
2216 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
2217 #define TARGET_LITTLE_NAME "elf32-v850"
2218 #define ELF_ARCH bfd_arch_v850
2219 #define ELF_MACHINE_CODE EM_CYGNUS_V850
2220 #define ELF_MAXPAGESIZE 0x1000
2222 #define elf_info_to_howto v850_elf_info_to_howto_rela
2223 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
2225 #define elf_backend_check_relocs v850_elf_check_relocs
2226 #define elf_backend_relocate_section v850_elf_relocate_section
2227 #define elf_backend_object_p v850_elf_object_p
2228 #define elf_backend_final_write_processing v850_elf_final_write_processing
2229 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
2230 #define elf_backend_symbol_processing v850_elf_symbol_processing
2231 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
2232 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
2233 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
2234 #define elf_backend_fake_sections v850_elf_fake_sections
2235 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
2236 #define elf_backend_gc_sweep_hook v850_elf_gc_sweep_hook
2238 #define elf_backend_can_gc_sections 1
2240 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
2241 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
2242 #define bfd_elf32_bfd_copy_private_bfd_data v850_elf_copy_private_bfd_data
2243 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
2244 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
2245 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
2247 #define elf_symbol_leading_char '_'
2249 #include "elf32-target.h"