1 /* V850-specific support for 32-bit ELF
2 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
21 dependencies. As is the gas & simulator code or the v850. */
30 /* sign-extend a 24-bit number */
31 #define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)
33 static reloc_howto_type *v850_elf_reloc_type_lookup
34 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
35 static void v850_elf_info_to_howto_rel
36 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
37 static void v850_elf_info_to_howto_rela
38 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
39 static bfd_reloc_status_type v850_elf_reloc
40 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
41 static boolean v850_elf_is_local_label_name
42 PARAMS ((bfd *, const char *));
43 static boolean v850_elf_relocate_section
44 PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
45 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
46 static bfd_reloc_status_type v850_elf_perform_relocation
47 PARAMS ((bfd *, int, bfd_vma, bfd_byte *));
48 static boolean v850_elf_check_relocs
49 PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
50 static void remember_hi16s_reloc
51 PARAMS ((bfd *, bfd_vma, bfd_byte *));
52 static bfd_byte * find_remembered_hi16s_reloc
53 PARAMS ((bfd_vma, boolean *));
54 static bfd_reloc_status_type v850_elf_final_link_relocate
55 PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
56 bfd_vma, bfd_vma, struct bfd_link_info *, asection *, int));
57 static boolean v850_elf_object_p
59 static boolean v850_elf_fake_sections
60 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
61 static void v850_elf_final_write_processing
62 PARAMS ((bfd *, boolean));
63 static boolean v850_elf_set_private_flags
64 PARAMS ((bfd *, flagword));
65 static boolean v850_elf_copy_private_bfd_data
66 PARAMS ((bfd *, bfd *));
67 static boolean v850_elf_merge_private_bfd_data
68 PARAMS ((bfd *, bfd *));
69 static boolean v850_elf_print_private_bfd_data
70 PARAMS ((bfd *, PTR));
71 static boolean v850_elf_section_from_bfd_section
72 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
73 static void v850_elf_symbol_processing
74 PARAMS ((bfd *, asymbol *));
75 static boolean v850_elf_add_symbol_hook
76 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
77 const char **, flagword *, asection **, bfd_vma *));
78 static boolean v850_elf_link_output_symbol_hook
79 PARAMS ((bfd *, struct bfd_link_info *, const char *,
80 Elf_Internal_Sym *, asection *));
81 static boolean v850_elf_section_from_shdr
82 PARAMS ((bfd *, Elf_Internal_Shdr *, char *));
84 /* Note: It is REQUIRED that the 'type' value of each entry in this array
85 match the index of the entry in the array. */
86 static reloc_howto_type v850_elf_howto_table[] =
88 /* This reloc does nothing. */
89 HOWTO (R_V850_NONE, /* type */
91 2, /* size (0 = byte, 1 = short, 2 = long) */
93 false, /* pc_relative */
95 complain_overflow_bitfield, /* complain_on_overflow */
96 bfd_elf_generic_reloc, /* special_function */
97 "R_V850_NONE", /* name */
98 false, /* partial_inplace */
101 false), /* pcrel_offset */
103 /* A PC relative 9 bit branch. */
104 HOWTO (R_V850_9_PCREL, /* type */
106 2, /* size (0 = byte, 1 = short, 2 = long) */
108 true, /* pc_relative */
110 complain_overflow_bitfield, /* complain_on_overflow */
111 v850_elf_reloc, /* special_function */
112 "R_V850_9_PCREL", /* name */
113 false, /* partial_inplace */
114 0x00ffffff, /* src_mask */
115 0x00ffffff, /* dst_mask */
116 true), /* pcrel_offset */
118 /* A PC relative 22 bit branch. */
119 HOWTO (R_V850_22_PCREL, /* type */
121 2, /* size (0 = byte, 1 = short, 2 = long) */
123 true, /* pc_relative */
125 complain_overflow_signed, /* complain_on_overflow */
126 v850_elf_reloc, /* special_function */
127 "R_V850_22_PCREL", /* name */
128 false, /* partial_inplace */
129 0x07ffff80, /* src_mask */
130 0x07ffff80, /* dst_mask */
131 true), /* pcrel_offset */
133 /* High 16 bits of symbol value. */
134 HOWTO (R_V850_HI16_S, /* type */
136 1, /* size (0 = byte, 1 = short, 2 = long) */
138 false, /* pc_relative */
140 complain_overflow_dont, /* complain_on_overflow */
141 v850_elf_reloc, /* special_function */
142 "R_V850_HI16_S", /* name */
143 false, /* partial_inplace */
144 0xffff, /* src_mask */
145 0xffff, /* dst_mask */
146 false), /* pcrel_offset */
148 /* High 16 bits of symbol value. */
149 HOWTO (R_V850_HI16, /* type */
151 1, /* size (0 = byte, 1 = short, 2 = long) */
153 false, /* pc_relative */
155 complain_overflow_dont, /* complain_on_overflow */
156 v850_elf_reloc, /* special_function */
157 "R_V850_HI16", /* name */
158 false, /* partial_inplace */
159 0xffff, /* src_mask */
160 0xffff, /* dst_mask */
161 false), /* pcrel_offset */
163 /* Low 16 bits of symbol value. */
164 HOWTO (R_V850_LO16, /* type */
166 1, /* size (0 = byte, 1 = short, 2 = long) */
168 false, /* pc_relative */
170 complain_overflow_dont, /* complain_on_overflow */
171 v850_elf_reloc, /* special_function */
172 "R_V850_LO16", /* name */
173 false, /* partial_inplace */
174 0xffff, /* src_mask */
175 0xffff, /* dst_mask */
176 false), /* pcrel_offset */
178 /* Simple 32bit reloc. */
179 HOWTO (R_V850_32, /* type */
181 2, /* size (0 = byte, 1 = short, 2 = long) */
183 false, /* pc_relative */
185 complain_overflow_dont, /* complain_on_overflow */
186 v850_elf_reloc, /* special_function */
187 "R_V850_32", /* name */
188 false, /* partial_inplace */
189 0xffffffff, /* src_mask */
190 0xffffffff, /* dst_mask */
191 false), /* pcrel_offset */
193 /* Simple 16bit reloc. */
194 HOWTO (R_V850_16, /* type */
196 1, /* size (0 = byte, 1 = short, 2 = long) */
198 false, /* pc_relative */
200 complain_overflow_dont, /* complain_on_overflow */
201 bfd_elf_generic_reloc, /* special_function */
202 "R_V850_16", /* name */
203 false, /* partial_inplace */
204 0xffff, /* src_mask */
205 0xffff, /* dst_mask */
206 false), /* pcrel_offset */
208 /* Simple 8bit reloc. */
209 HOWTO (R_V850_8, /* type */
211 0, /* size (0 = byte, 1 = short, 2 = long) */
213 false, /* pc_relative */
215 complain_overflow_dont, /* complain_on_overflow */
216 bfd_elf_generic_reloc, /* special_function */
217 "R_V850_8", /* name */
218 false, /* partial_inplace */
221 false), /* pcrel_offset */
223 /* 16 bit offset from the short data area pointer. */
224 HOWTO (R_V850_SDA_16_16_OFFSET, /* type */
226 1, /* size (0 = byte, 1 = short, 2 = long) */
228 false, /* pc_relative */
230 complain_overflow_dont, /* complain_on_overflow */
231 v850_elf_reloc, /* special_function */
232 "R_V850_SDA_16_16_OFFSET", /* name */
233 false, /* partial_inplace */
234 0xffff, /* src_mask */
235 0xffff, /* dst_mask */
236 false), /* pcrel_offset */
238 /* 15 bit offset from the short data area pointer. */
239 HOWTO (R_V850_SDA_15_16_OFFSET, /* type */
241 1, /* size (0 = byte, 1 = short, 2 = long) */
243 false, /* pc_relative */
245 complain_overflow_dont, /* complain_on_overflow */
246 v850_elf_reloc, /* special_function */
247 "R_V850_SDA_15_16_OFFSET", /* name */
248 false, /* partial_inplace */
249 0xfffe, /* src_mask */
250 0xfffe, /* dst_mask */
251 false), /* pcrel_offset */
253 /* 16 bit offset from the zero data area pointer. */
254 HOWTO (R_V850_ZDA_16_16_OFFSET, /* type */
256 1, /* size (0 = byte, 1 = short, 2 = long) */
258 false, /* pc_relative */
260 complain_overflow_dont, /* complain_on_overflow */
261 v850_elf_reloc, /* special_function */
262 "R_V850_ZDA_16_16_OFFSET", /* name */
263 false, /* partial_inplace */
264 0xffff, /* src_mask */
265 0xffff, /* dst_mask */
266 false), /* pcrel_offset */
268 /* 15 bit offset from the zero data area pointer. */
269 HOWTO (R_V850_ZDA_15_16_OFFSET, /* type */
271 1, /* size (0 = byte, 1 = short, 2 = long) */
273 false, /* pc_relative */
275 complain_overflow_dont, /* complain_on_overflow */
276 v850_elf_reloc, /* special_function */
277 "R_V850_ZDA_15_16_OFFSET", /* name */
278 false, /* partial_inplace */
279 0xfffe, /* src_mask */
280 0xfffe, /* dst_mask */
281 false), /* pcrel_offset */
283 /* 6 bit offset from the tiny data area pointer. */
284 HOWTO (R_V850_TDA_6_8_OFFSET, /* type */
286 1, /* size (0 = byte, 1 = short, 2 = long) */
288 false, /* pc_relative */
290 complain_overflow_dont, /* complain_on_overflow */
291 v850_elf_reloc, /* special_function */
292 "R_V850_TDA_6_8_OFFSET", /* name */
293 false, /* partial_inplace */
296 false), /* pcrel_offset */
298 /* 8 bit offset from the tiny data area pointer. */
299 HOWTO (R_V850_TDA_7_8_OFFSET, /* type */
301 1, /* size (0 = byte, 1 = short, 2 = long) */
303 false, /* pc_relative */
305 complain_overflow_dont, /* complain_on_overflow */
306 v850_elf_reloc, /* special_function */
307 "R_V850_TDA_7_8_OFFSET", /* name */
308 false, /* partial_inplace */
311 false), /* pcrel_offset */
313 /* 7 bit offset from the tiny data area pointer. */
314 HOWTO (R_V850_TDA_7_7_OFFSET, /* type */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
318 false, /* pc_relative */
320 complain_overflow_dont, /* complain_on_overflow */
321 v850_elf_reloc, /* special_function */
322 "R_V850_TDA_7_7_OFFSET", /* name */
323 false, /* partial_inplace */
326 false), /* pcrel_offset */
328 /* 16 bit offset from the tiny data area pointer! */
329 HOWTO (R_V850_TDA_16_16_OFFSET, /* type */
331 1, /* size (0 = byte, 1 = short, 2 = long) */
333 false, /* pc_relative */
335 complain_overflow_dont, /* complain_on_overflow */
336 v850_elf_reloc, /* special_function */
337 "R_V850_TDA_16_16_OFFSET", /* name */
338 false, /* partial_inplace */
339 0xffff, /* src_mask */
340 0xfff, /* dst_mask */
341 false), /* pcrel_offset */
343 /* 5 bit offset from the tiny data area pointer. */
344 HOWTO (R_V850_TDA_4_5_OFFSET, /* type */
346 1, /* size (0 = byte, 1 = short, 2 = long) */
348 false, /* pc_relative */
350 complain_overflow_dont, /* complain_on_overflow */
351 v850_elf_reloc, /* special_function */
352 "R_V850_TDA_4_5_OFFSET", /* name */
353 false, /* partial_inplace */
356 false), /* pcrel_offset */
358 /* 4 bit offset from the tiny data area pointer. */
359 HOWTO (R_V850_TDA_4_4_OFFSET, /* type */
361 1, /* size (0 = byte, 1 = short, 2 = long) */
363 false, /* pc_relative */
365 complain_overflow_dont, /* complain_on_overflow */
366 v850_elf_reloc, /* special_function */
367 "R_V850_TDA_4_4_OFFSET", /* name */
368 false, /* partial_inplace */
371 false), /* pcrel_offset */
373 /* 16 bit offset from the short data area pointer. */
374 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET, /* type */
376 2, /* size (0 = byte, 1 = short, 2 = long) */
378 false, /* pc_relative */
380 complain_overflow_dont, /* complain_on_overflow */
381 v850_elf_reloc, /* special_function */
382 "R_V850_SDA_16_16_SPLIT_OFFSET",/* name */
383 false, /* partial_inplace */
384 0xfffe0020, /* src_mask */
385 0xfffe0020, /* dst_mask */
386 false), /* pcrel_offset */
388 /* 16 bit offset from the zero data area pointer. */
389 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET, /* type */
391 2, /* size (0 = byte, 1 = short, 2 = long) */
393 false, /* pc_relative */
395 complain_overflow_dont, /* complain_on_overflow */
396 v850_elf_reloc, /* special_function */
397 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* name */
398 false, /* partial_inplace */
399 0xfffe0020, /* src_mask */
400 0xfffe0020, /* dst_mask */
401 false), /* pcrel_offset */
403 /* 6 bit offset from the call table base pointer. */
404 HOWTO (R_V850_CALLT_6_7_OFFSET, /* type */
406 1, /* size (0 = byte, 1 = short, 2 = long) */
408 false, /* pc_relative */
410 complain_overflow_dont, /* complain_on_overflow */
411 v850_elf_reloc, /* special_function */
412 "R_V850_CALLT_6_7_OFFSET", /* name */
413 false, /* partial_inplace */
416 false), /* pcrel_offset */
418 /* 16 bit offset from the call table base pointer. */
419 HOWTO (R_V850_CALLT_16_16_OFFSET, /* type */
421 1, /* size (0 = byte, 1 = short, 2 = long) */
423 false, /* pc_relative */
425 complain_overflow_dont, /* complain_on_overflow */
426 v850_elf_reloc, /* special_function */
427 "R_V850_CALLT_16_16_OFFSET", /* name */
428 false, /* partial_inplace */
429 0xffff, /* src_mask */
430 0xffff, /* dst_mask */
431 false), /* pcrel_offset */
433 /* GNU extension to record C++ vtable hierarchy */
434 HOWTO (R_V850_GNU_VTINHERIT, /* type */
436 2, /* size (0 = byte, 1 = short, 2 = long) */
438 false, /* pc_relative */
440 complain_overflow_dont, /* complain_on_overflow */
441 NULL, /* special_function */
442 "R_V850_GNU_VTINHERIT", /* name */
443 false, /* partial_inplace */
446 false), /* pcrel_offset */
448 /* GNU extension to record C++ vtable member usage */
449 HOWTO (R_V850_GNU_VTENTRY, /* type */
451 2, /* size (0 = byte, 1 = short, 2 = long) */
453 false, /* pc_relative */
455 complain_overflow_dont, /* complain_on_overflow */
456 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
457 "R_V850_GNU_VTENTRY", /* name */
458 false, /* partial_inplace */
461 false), /* pcrel_offset */
465 /* Map BFD reloc types to V850 ELF reloc types. */
467 struct v850_elf_reloc_map
469 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
471 bfd_reloc_code_real_type bfd_reloc_val;
472 unsigned char elf_reloc_val;
475 static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
477 { BFD_RELOC_NONE, R_V850_NONE },
478 { BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL },
479 { BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL },
480 { BFD_RELOC_HI16_S, R_V850_HI16_S },
481 { BFD_RELOC_HI16, R_V850_HI16 },
482 { BFD_RELOC_LO16, R_V850_LO16 },
483 { BFD_RELOC_32, R_V850_32 },
484 { BFD_RELOC_16, R_V850_16 },
485 { BFD_RELOC_8, R_V850_8 },
486 { BFD_RELOC_V850_SDA_16_16_OFFSET, R_V850_SDA_16_16_OFFSET },
487 { BFD_RELOC_V850_SDA_15_16_OFFSET, R_V850_SDA_15_16_OFFSET },
488 { BFD_RELOC_V850_ZDA_16_16_OFFSET, R_V850_ZDA_16_16_OFFSET },
489 { BFD_RELOC_V850_ZDA_15_16_OFFSET, R_V850_ZDA_15_16_OFFSET },
490 { BFD_RELOC_V850_TDA_6_8_OFFSET, R_V850_TDA_6_8_OFFSET },
491 { BFD_RELOC_V850_TDA_7_8_OFFSET, R_V850_TDA_7_8_OFFSET },
492 { BFD_RELOC_V850_TDA_7_7_OFFSET, R_V850_TDA_7_7_OFFSET },
493 { BFD_RELOC_V850_TDA_16_16_OFFSET, R_V850_TDA_16_16_OFFSET },
494 { BFD_RELOC_V850_TDA_4_5_OFFSET, R_V850_TDA_4_5_OFFSET },
495 { BFD_RELOC_V850_TDA_4_4_OFFSET, R_V850_TDA_4_4_OFFSET },
496 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, R_V850_SDA_16_16_SPLIT_OFFSET },
497 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, R_V850_ZDA_16_16_SPLIT_OFFSET },
498 { BFD_RELOC_V850_CALLT_6_7_OFFSET, R_V850_CALLT_6_7_OFFSET },
499 { BFD_RELOC_V850_CALLT_16_16_OFFSET, R_V850_CALLT_16_16_OFFSET },
500 { BFD_RELOC_VTABLE_INHERIT, R_V850_GNU_VTINHERIT },
501 { BFD_RELOC_VTABLE_ENTRY, R_V850_GNU_VTENTRY },
505 /* Map a bfd relocation into the appropriate howto structure */
506 static reloc_howto_type *
507 v850_elf_reloc_type_lookup (abfd, code)
508 bfd * abfd ATTRIBUTE_UNUSED;
509 bfd_reloc_code_real_type code;
514 i < sizeof (v850_elf_reloc_map) / sizeof (struct v850_elf_reloc_map);
517 if (v850_elf_reloc_map[i].bfd_reloc_val == code)
519 BFD_ASSERT (v850_elf_howto_table[v850_elf_reloc_map[i].elf_reloc_val].type == v850_elf_reloc_map[i].elf_reloc_val);
521 return & v850_elf_howto_table[v850_elf_reloc_map[i].elf_reloc_val];
528 /* Set the howto pointer for an V850 ELF reloc. */
530 v850_elf_info_to_howto_rel (abfd, cache_ptr, dst)
531 bfd * abfd ATTRIBUTE_UNUSED;
533 Elf32_Internal_Rel * dst;
537 r_type = ELF32_R_TYPE (dst->r_info);
538 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
539 cache_ptr->howto = &v850_elf_howto_table[r_type];
542 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
544 v850_elf_info_to_howto_rela (abfd, cache_ptr, dst)
545 bfd * abfd ATTRIBUTE_UNUSED;
547 Elf32_Internal_Rela *dst;
551 r_type = ELF32_R_TYPE (dst->r_info);
552 BFD_ASSERT (r_type < (unsigned int) R_V850_max);
553 cache_ptr->howto = &v850_elf_howto_table[r_type];
556 /* Look through the relocs for a section during the first phase, and
557 allocate space in the global offset table or procedure linkage
561 v850_elf_check_relocs (abfd, info, sec, relocs)
563 struct bfd_link_info * info;
565 const Elf_Internal_Rela * relocs;
569 Elf_Internal_Shdr *symtab_hdr;
570 struct elf_link_hash_entry **sym_hashes;
571 const Elf_Internal_Rela *rel;
572 const Elf_Internal_Rela *rel_end;
574 enum v850_reloc_type r_type;
576 const char *common = (const char *)0;
578 if (info->relocateable)
582 fprintf (stderr, "v850_elf_check_relocs called for section %s in %s\n",
583 bfd_get_section_name (abfd, sec),
584 bfd_get_filename (abfd));
587 dynobj = elf_hash_table (info)->dynobj;
588 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
589 sym_hashes = elf_sym_hashes (abfd);
592 rel_end = relocs + sec->reloc_count;
593 for (rel = relocs; rel < rel_end; rel++)
595 unsigned long r_symndx;
596 struct elf_link_hash_entry *h;
598 r_symndx = ELF32_R_SYM (rel->r_info);
599 if (r_symndx < symtab_hdr->sh_info)
602 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
604 r_type = (enum v850_reloc_type) ELF32_R_TYPE (rel->r_info);
610 case R_V850_22_PCREL:
617 case R_V850_CALLT_6_7_OFFSET:
618 case R_V850_CALLT_16_16_OFFSET:
621 /* This relocation describes the C++ object vtable hierarchy.
622 Reconstruct it for later use during GC. */
623 case R_V850_GNU_VTINHERIT:
624 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
628 /* This relocation describes which C++ vtable entries are actually
629 used. Record for later use during GC. */
630 case R_V850_GNU_VTENTRY:
631 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
635 case R_V850_SDA_16_16_SPLIT_OFFSET:
636 case R_V850_SDA_16_16_OFFSET:
637 case R_V850_SDA_15_16_OFFSET:
638 other = V850_OTHER_SDA;
640 goto small_data_common;
642 case R_V850_ZDA_16_16_SPLIT_OFFSET:
643 case R_V850_ZDA_16_16_OFFSET:
644 case R_V850_ZDA_15_16_OFFSET:
645 other = V850_OTHER_ZDA;
647 goto small_data_common;
649 case R_V850_TDA_4_5_OFFSET:
650 case R_V850_TDA_4_4_OFFSET:
651 case R_V850_TDA_6_8_OFFSET:
652 case R_V850_TDA_7_8_OFFSET:
653 case R_V850_TDA_7_7_OFFSET:
654 case R_V850_TDA_16_16_OFFSET:
655 other = V850_OTHER_TDA;
659 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
664 h->other |= other; /* flag which type of relocation was used */
665 if ((h->other & V850_OTHER_MASK) != (other & V850_OTHER_MASK)
666 && (h->other & V850_OTHER_ERROR) == 0)
669 static char buff[200]; /* XXX */
671 switch (h->other & V850_OTHER_MASK)
674 msg = _("Variable `%s' cannot occupy in multiple small data regions");
676 case V850_OTHER_SDA | V850_OTHER_ZDA | V850_OTHER_TDA:
677 msg = _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
679 case V850_OTHER_SDA | V850_OTHER_ZDA:
680 msg = _("Variable `%s' cannot be in both small and zero data regions simultaneously");
682 case V850_OTHER_SDA | V850_OTHER_TDA:
683 msg = _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
685 case V850_OTHER_ZDA | V850_OTHER_TDA:
686 msg = _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
690 sprintf (buff, msg, h->root.root.string);
691 info->callbacks->warning (info, buff, h->root.root.string,
692 abfd, h->root.u.def.section, 0);
694 bfd_set_error (bfd_error_bad_value);
695 h->other |= V850_OTHER_ERROR;
700 if (h && h->root.type == bfd_link_hash_common
702 && !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
704 asection *section = h->root.u.c.p->section = bfd_make_section_old_way (abfd, common);
705 section->flags |= SEC_IS_COMMON;
709 fprintf (stderr, "v850_elf_check_relocs, found %s relocation for %s%s\n",
710 v850_elf_howto_table[ (int)r_type ].name,
711 (h && h->root.root.string) ? h->root.root.string : "<unknown>",
712 (h->root.type == bfd_link_hash_common) ? ", symbol is common" : "");
722 * In the old version, when an entry was checked out from the table,
723 * it was deleted. This produced an error if the entry was needed
724 * more than once, as the second attempted retry failed.
726 * In the current version, the entry is not deleted, instead we set
727 * the field 'found' to true. If a second lookup matches the same
728 * entry, then we know that the hi16s reloc has already been updated
729 * and does not need to be updated a second time.
731 * TODO - TOFIX: If it is possible that we need to restore 2 different
732 * addresses from the same table entry, where the first generates an
733 * overflow, whilst the second do not, then this code will fail.
736 typedef struct hi16s_location
740 unsigned long counter;
742 struct hi16s_location * next;
746 static hi16s_location * previous_hi16s;
747 static hi16s_location * free_hi16s;
748 static unsigned long hi16s_counter;
751 remember_hi16s_reloc (abfd, addend, address)
756 hi16s_location * entry = NULL;
758 /* Find a free structure. */
759 if (free_hi16s == NULL)
760 free_hi16s = (hi16s_location *) bfd_zalloc (abfd, sizeof (* free_hi16s));
763 free_hi16s = free_hi16s->next;
765 entry->addend = addend;
766 entry->address = address;
767 entry->counter = hi16s_counter ++;
768 entry->found = false;
769 entry->next = previous_hi16s;
770 previous_hi16s = entry;
772 /* Cope with wrap around of our counter. */
773 if (hi16s_counter == 0)
775 /* XXX - Assume that all counter entries differ only in their low 16 bits. */
776 for (entry = previous_hi16s; entry != NULL; entry = entry->next)
777 entry->counter &= 0xffff;
779 hi16s_counter = 0x10000;
786 find_remembered_hi16s_reloc (addend, already_found)
788 boolean * already_found;
790 hi16s_location * match = NULL;
791 hi16s_location * entry;
792 hi16s_location * previous = NULL;
793 hi16s_location * prev;
796 /* Search the table. Record the most recent entry that matches. */
797 for (entry = previous_hi16s; entry; entry = entry->next)
799 if (entry->addend == addend
800 && (match == NULL || match->counter < entry->counter))
812 /* Extract the address. */
813 addr = match->address;
815 /* Remeber if this entry has already been used before. */
817 * already_found = match->found;
819 /* Note that this entry has now been used. */
825 /* FIXME: The code here probably ought to be removed and the code in reloc.c
826 allowed to do its stuff instead. At least for most of the relocs, anwyay. */
827 static bfd_reloc_status_type
828 v850_elf_perform_relocation (abfd, r_type, addend, address)
835 bfd_signed_vma saddend = (bfd_signed_vma) addend;
840 /* fprintf (stderr, "reloc type %d not SUPPORTED\n", r_type ); */
841 return bfd_reloc_notsupported;
844 bfd_put_32 (abfd, addend, address);
847 case R_V850_22_PCREL:
848 if (saddend > 0x1fffff || saddend < -0x200000)
849 return bfd_reloc_overflow;
851 if ((addend % 2) != 0)
852 return bfd_reloc_dangerous;
854 insn = bfd_get_32 (abfd, address);
856 insn |= (((addend & 0xfffe) << 16) | ((addend & 0x3f0000) >> 16));
857 bfd_put_32 (abfd, insn, address);
861 if (saddend > 0xff || saddend < -0x100)
862 return bfd_reloc_overflow;
864 if ((addend % 2) != 0)
865 return bfd_reloc_dangerous;
867 insn = bfd_get_16 (abfd, address);
869 insn |= ((addend & 0x1f0) << 7) | ((addend & 0x0e) << 3);
873 addend += (bfd_get_16 (abfd, address) << 16);
874 addend = (addend >> 16);
879 /* Remember where this relocation took place. */
880 remember_hi16s_reloc (abfd, addend, address);
882 addend += (bfd_get_16 (abfd, address) << 16);
883 addend = (addend >> 16) + ((addend & 0x8000) != 0);
885 /* This relocation cannot overflow. */
893 /* Calculate the sum of the value stored in the instruction and the
894 addend and check for overflow from the low 16 bits into the high
895 16 bits. The assembler has already done some of this: If the
896 value stored in the instruction has its 15th bit set, (counting
897 from zero) then the assembler will have added 1 to the value
898 stored in the associated HI16S reloc. So for example, these
901 movhi hi( fred ), r0, r1
902 movea lo( fred ), r1, r1
904 will store 0 in the value fields for the MOVHI and MOVEA instructions
905 and addend will be the address of fred, but for these instructions:
907 movhi hi( fred + 0x123456), r0, r1
908 movea lo( fred + 0x123456), r1, r1
910 the value stored in the MOVHI instruction will be 0x12 and the value
911 stored in the MOVEA instruction will be 0x3456. If however the
914 movhi hi( fred + 0x10ffff), r0, r1
915 movea lo( fred + 0x10ffff), r1, r1
917 then the value stored in the MOVHI instruction would be 0x11 (not
918 0x10) and the value stored in the MOVEA instruction would be 0xffff.
919 Thus (assuming for the moment that the addend is 0), at run time the
920 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
921 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
922 the instructions were:
924 movhi hi( fred - 1), r0, r1
925 movea lo( fred - 1), r1, r1
927 then 0 is stored in the MOVHI instruction and -1 is stored in the
930 Overflow can occur if the addition of the value stored in the
931 instruction plus the addend sets the 15th bit when before it was clear.
932 This is because the 15th bit will be sign extended into the high part,
933 thus reducing its value by one, but since the 15th bit was originally
934 clear, the assembler will not have added 1 to the previous HI16S reloc
935 to compensate for this effect. For example:
937 movhi hi( fred + 0x123456), r0, r1
938 movea lo( fred + 0x123456), r1, r1
940 The value stored in HI16S reloc is 0x12, the value stored in the LO16
941 reloc is 0x3456. If we assume that the address of fred is 0x00007000
942 then the relocations become:
944 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
945 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
947 but when the instructions are executed, the MOVEA instruction's value
948 is signed extended, so the sum becomes:
953 0x0011a456 but 'fred + 0x123456' = 0x0012a456
955 Note that if the 15th bit was set in the value stored in the LO16
956 reloc, then we do not have to do anything:
958 movhi hi( fred + 0x10ffff), r0, r1
959 movea lo( fred + 0x10ffff), r1, r1
961 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
962 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
967 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
969 Overflow can also occur if the computation carries into the 16th bit
970 and it also results in the 15th bit having the same value as the 15th
971 bit of the original value. What happens is that the HI16S reloc
972 will have already examined the 15th bit of the original value and
973 added 1 to the high part if the bit is set. This compensates for the
974 sign extension of 15th bit of the result of the computation. But now
975 there is a carry into the 16th bit, and this has not been allowed for.
977 So, for example if fred is at address 0xf000:
979 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
980 movea lo( fred + 0xffff), r1, r1
982 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
983 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
988 0x0000efff but 'fred + 0xffff' = 0x0001efff
990 Similarly, if the 15th bit remains clear, but overflow occurs into
991 the 16th bit then (assuming the address of fred is 0xf000):
993 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
994 movea lo( fred + 0x7000), r1, r1
996 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
997 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1002 0x00006fff but 'fred + 0x7000' = 0x00016fff
1004 Note - there is no need to change anything if a carry occurs, and the
1005 15th bit changes its value from being set to being clear, as the HI16S
1006 reloc will have already added in 1 to the high part for us:
1008 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
1009 movea lo( fred + 0xffff), r1, r1
1011 HI16S: 0x0001 + (0x00007000 >> 16)
1012 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
1015 + 0x00006fff (bit 15 not set, so the top half is zero)
1017 0x00016fff which is right (assuming that fred is at 0x7000)
1019 but if the 15th bit goes from being clear to being set, then we must
1020 once again handle overflow:
1022 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
1023 movea lo( fred + 0x7000), r1, r1
1025 HI16S: 0x0000 + (0x0000ffff >> 16)
1026 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
1029 + 0x00006fff (bit 15 not set, so the top half is zero)
1031 0x00006fff which is wrong (assuming that fred is at 0xffff)
1037 insn = bfd_get_16 (abfd, address);
1038 result = insn + addend;
1040 #define BIT15_SET(x) ((x) & 0x8000)
1041 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
1043 if ((BIT15_SET (result) && ! BIT15_SET (addend))
1044 || (OVERFLOWS (addend, insn)
1045 && ((! BIT15_SET (insn)) || (BIT15_SET (addend)))))
1047 boolean already_updated;
1048 bfd_byte * hi16s_address = find_remembered_hi16s_reloc
1049 (addend, & already_updated);
1051 /* Amend the matching HI16_S relocation. */
1052 if (hi16s_address != NULL)
1054 if (! already_updated)
1056 insn = bfd_get_16 (abfd, hi16s_address);
1058 bfd_put_16 (abfd, insn, hi16s_address);
1063 fprintf (stderr, _("FAILED to find previous HI16 reloc\n"));
1064 return bfd_reloc_overflow;
1068 /* Do not complain if value has top bit set, as this has been anticipated. */
1069 insn = result & 0xffff;
1074 addend += (char) bfd_get_8 (abfd, address);
1076 saddend = (bfd_signed_vma) addend;
1078 if (saddend > 0x7f || saddend < -0x80)
1079 return bfd_reloc_overflow;
1081 bfd_put_8 (abfd, addend, address);
1082 return bfd_reloc_ok;
1084 case R_V850_CALLT_16_16_OFFSET:
1085 addend += bfd_get_16 (abfd, address);
1087 saddend = (bfd_signed_vma) addend;
1089 if (saddend > 0xffff || saddend < 0)
1090 return bfd_reloc_overflow;
1098 case R_V850_SDA_16_16_OFFSET:
1099 case R_V850_ZDA_16_16_OFFSET:
1100 case R_V850_TDA_16_16_OFFSET:
1101 addend += bfd_get_16 (abfd, address);
1103 saddend = (bfd_signed_vma) addend;
1105 if (saddend > 0x7fff || saddend < -0x8000)
1106 return bfd_reloc_overflow;
1111 case R_V850_SDA_15_16_OFFSET:
1112 case R_V850_ZDA_15_16_OFFSET:
1113 insn = bfd_get_16 (abfd, address);
1114 addend += (insn & 0xfffe);
1116 saddend = (bfd_signed_vma) addend;
1118 if (saddend > 0x7ffe || saddend < -0x8000)
1119 return bfd_reloc_overflow;
1122 return bfd_reloc_dangerous;
1124 insn = (addend & ~1) | (insn & 1);
1127 case R_V850_TDA_6_8_OFFSET:
1128 insn = bfd_get_16 (abfd, address);
1129 addend += ((insn & 0x7e) << 1);
1131 saddend = (bfd_signed_vma) addend;
1133 if (saddend > 0xfc || saddend < 0)
1134 return bfd_reloc_overflow;
1137 return bfd_reloc_dangerous;
1140 insn |= (addend >> 1);
1143 case R_V850_TDA_7_8_OFFSET:
1144 insn = bfd_get_16 (abfd, address);
1145 addend += ((insn & 0x7f) << 1);
1147 saddend = (bfd_signed_vma) addend;
1149 if (saddend > 0xfe || saddend < 0)
1150 return bfd_reloc_overflow;
1153 return bfd_reloc_dangerous;
1156 insn |= (addend >> 1);
1159 case R_V850_TDA_7_7_OFFSET:
1160 insn = bfd_get_16 (abfd, address);
1161 addend += insn & 0x7f;
1163 saddend = (bfd_signed_vma) addend;
1165 if (saddend > 0x7f || saddend < 0)
1166 return bfd_reloc_overflow;
1172 case R_V850_TDA_4_5_OFFSET:
1173 insn = bfd_get_16 (abfd, address);
1174 addend += ((insn & 0xf) << 1);
1176 saddend = (bfd_signed_vma) addend;
1178 if (saddend > 0x1e || saddend < 0)
1179 return bfd_reloc_overflow;
1182 return bfd_reloc_dangerous;
1185 insn |= (addend >> 1);
1188 case R_V850_TDA_4_4_OFFSET:
1189 insn = bfd_get_16 (abfd, address);
1190 addend += insn & 0xf;
1192 saddend = (bfd_signed_vma) addend;
1194 if (saddend > 0xf || saddend < 0)
1195 return bfd_reloc_overflow;
1201 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1202 case R_V850_SDA_16_16_SPLIT_OFFSET:
1203 insn = bfd_get_32 (abfd, address);
1204 addend += ((insn & 0xfffe0000) >> 16) + ((insn & 0x20) >> 5);
1206 saddend = (bfd_signed_vma) addend;
1208 if (saddend > 0x7fff || saddend < -0x8000)
1209 return bfd_reloc_overflow;
1212 insn |= (addend & 1) << 5;
1213 insn |= (addend & ~1) << 16;
1215 bfd_put_32 (abfd, insn, address);
1216 return bfd_reloc_ok;
1218 case R_V850_CALLT_6_7_OFFSET:
1219 insn = bfd_get_16 (abfd, address);
1220 addend += ((insn & 0x3f) << 1);
1222 saddend = (bfd_signed_vma) addend;
1224 if (saddend > 0x7e || saddend < 0)
1225 return bfd_reloc_overflow;
1228 return bfd_reloc_dangerous;
1231 insn |= (addend >> 1);
1234 case R_V850_GNU_VTINHERIT:
1235 case R_V850_GNU_VTENTRY:
1236 return bfd_reloc_ok;
1240 bfd_put_16 (abfd, insn, address);
1241 return bfd_reloc_ok;
1244 /* Insert the addend into the instruction. */
1245 static bfd_reloc_status_type
1246 v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
1247 bfd * abfd ATTRIBUTE_UNUSED;
1250 PTR data ATTRIBUTE_UNUSED;
1251 asection * isection;
1253 char ** err ATTRIBUTE_UNUSED;
1257 /* If there is an output BFD,
1258 and the symbol is not a section name (which is only defined at final link time),
1259 and either we are not putting the addend into the instruction
1260 or the addend is zero, so there is nothing to add into the instruction
1261 then just fixup the address and return. */
1262 if (obfd != (bfd *) NULL
1263 && (symbol->flags & BSF_SECTION_SYM) == 0
1264 && (! reloc->howto->partial_inplace
1265 || reloc->addend == 0))
1267 reloc->address += isection->output_offset;
1268 return bfd_reloc_ok;
1271 else if (obfd != NULL)
1273 return bfd_reloc_continue;
1277 /* Catch relocs involving undefined symbols. */
1278 if (bfd_is_und_section (symbol->section)
1279 && (symbol->flags & BSF_WEAK) == 0
1281 return bfd_reloc_undefined;
1283 /* We handle final linking of some relocs ourselves. */
1285 /* Is the address of the relocation really within the section? */
1286 if (reloc->address > isection->_cooked_size)
1287 return bfd_reloc_outofrange;
1289 /* Work out which section the relocation is targetted at and the
1290 initial relocation command value. */
1292 /* Get symbol value. (Common symbols are special.) */
1293 if (bfd_is_com_section (symbol->section))
1296 relocation = symbol->value;
1298 /* Convert input-section-relative symbol value to absolute + addend. */
1299 relocation += symbol->section->output_section->vma;
1300 relocation += symbol->section->output_offset;
1301 relocation += reloc->addend;
1303 #if 0 /* Since this reloc is going to be processed later on, we should
1304 not make it pc-relative here. To test this, try assembling and
1305 linking this program:
1313 .section ".foo","ax"
1318 if (reloc->howto->pc_relative == true)
1320 /* Here the variable relocation holds the final address of the
1321 symbol we are relocating against, plus any addend. */
1322 relocation -= isection->output_section->vma + isection->output_offset;
1324 /* Deal with pcrel_offset */
1325 relocation -= reloc->address;
1328 reloc->addend = relocation;
1329 return bfd_reloc_ok;
1333 v850_elf_is_local_label_name (abfd, name)
1334 bfd * abfd ATTRIBUTE_UNUSED;
1337 return ( (name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
1338 || (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_'));
1341 /* Perform a relocation as part of a final link. */
1342 static bfd_reloc_status_type
1343 v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1344 input_section, contents, offset, value,
1345 addend, info, sym_sec, is_local)
1346 reloc_howto_type * howto;
1348 bfd * output_bfd ATTRIBUTE_UNUSED;
1349 asection * input_section;
1350 bfd_byte * contents;
1354 struct bfd_link_info * info;
1356 int is_local ATTRIBUTE_UNUSED;
1358 unsigned long r_type = howto->type;
1359 bfd_byte * hit_data = contents + offset;
1361 /* Adjust the value according to the relocation. */
1364 case R_V850_9_PCREL:
1365 value -= (input_section->output_section->vma
1366 + input_section->output_offset);
1370 case R_V850_22_PCREL:
1371 value -= (input_section->output_section->vma
1372 + input_section->output_offset
1375 /* If the sign extension will corrupt the value then we have overflowed. */
1376 if (((value & 0xff000000) != 0x0) && ((value & 0xff000000) != 0xff000000))
1377 return bfd_reloc_overflow;
1379 value = SEXT24 (value); /* Only the bottom 24 bits of the PC are valid */
1390 case R_V850_ZDA_15_16_OFFSET:
1391 case R_V850_ZDA_16_16_OFFSET:
1392 case R_V850_ZDA_16_16_SPLIT_OFFSET:
1393 if (sym_sec == NULL)
1394 return bfd_reloc_undefined;
1396 value -= sym_sec->output_section->vma;
1399 case R_V850_SDA_15_16_OFFSET:
1400 case R_V850_SDA_16_16_OFFSET:
1401 case R_V850_SDA_16_16_SPLIT_OFFSET:
1404 struct bfd_link_hash_entry * h;
1406 if (sym_sec == NULL)
1407 return bfd_reloc_undefined;
1409 /* Get the value of __gp. */
1410 h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
1411 if (h == (struct bfd_link_hash_entry *) NULL
1412 || h->type != bfd_link_hash_defined)
1413 return bfd_reloc_other;
1415 gp = (h->u.def.value
1416 + h->u.def.section->output_section->vma
1417 + h->u.def.section->output_offset);
1419 value -= sym_sec->output_section->vma;
1420 value -= (gp - sym_sec->output_section->vma);
1424 case R_V850_TDA_4_4_OFFSET:
1425 case R_V850_TDA_4_5_OFFSET:
1426 case R_V850_TDA_16_16_OFFSET:
1427 case R_V850_TDA_7_7_OFFSET:
1428 case R_V850_TDA_7_8_OFFSET:
1429 case R_V850_TDA_6_8_OFFSET:
1432 struct bfd_link_hash_entry * h;
1434 /* Get the value of __ep. */
1435 h = bfd_link_hash_lookup (info->hash, "__ep", false, false, true);
1436 if (h == (struct bfd_link_hash_entry *) NULL
1437 || h->type != bfd_link_hash_defined)
1438 return bfd_reloc_continue; /* Actually this indicates that __ep could not be found. */
1440 ep = (h->u.def.value
1441 + h->u.def.section->output_section->vma
1442 + h->u.def.section->output_offset);
1448 case R_V850_CALLT_6_7_OFFSET:
1451 struct bfd_link_hash_entry * h;
1453 /* Get the value of __ctbp. */
1454 h = bfd_link_hash_lookup (info->hash, "__ctbp", false, false, true);
1455 if (h == (struct bfd_link_hash_entry *) NULL
1456 || h->type != bfd_link_hash_defined)
1457 return (bfd_reloc_dangerous + 1); /* Actually this indicates that __ctbp could not be found. */
1459 ctbp = (h->u.def.value
1460 + h->u.def.section->output_section->vma
1461 + h->u.def.section->output_offset);
1466 case R_V850_CALLT_16_16_OFFSET:
1469 struct bfd_link_hash_entry * h;
1471 if (sym_sec == NULL)
1472 return bfd_reloc_undefined;
1474 /* Get the value of __ctbp. */
1475 h = bfd_link_hash_lookup (info->hash, "__ctbp", false, false, true);
1476 if (h == (struct bfd_link_hash_entry *) NULL
1477 || h->type != bfd_link_hash_defined)
1478 return (bfd_reloc_dangerous + 1);
1480 ctbp = (h->u.def.value
1481 + h->u.def.section->output_section->vma
1482 + h->u.def.section->output_offset);
1484 value -= sym_sec->output_section->vma;
1485 value -= (ctbp - sym_sec->output_section->vma);
1490 case R_V850_GNU_VTINHERIT:
1491 case R_V850_GNU_VTENTRY:
1492 return bfd_reloc_ok;
1495 return bfd_reloc_notsupported;
1498 /* Perform the relocation. */
1499 return v850_elf_perform_relocation (input_bfd, r_type, value + addend, hit_data);
1502 /* Relocate an V850 ELF section. */
1504 v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1505 contents, relocs, local_syms, local_sections)
1507 struct bfd_link_info * info;
1509 asection * input_section;
1510 bfd_byte * contents;
1511 Elf_Internal_Rela * relocs;
1512 Elf_Internal_Sym * local_syms;
1513 asection ** local_sections;
1515 Elf_Internal_Shdr * symtab_hdr;
1516 struct elf_link_hash_entry ** sym_hashes;
1517 Elf_Internal_Rela * rel;
1518 Elf_Internal_Rela * relend;
1520 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
1521 sym_hashes = elf_sym_hashes (input_bfd);
1523 if (sym_hashes == NULL)
1525 info->callbacks->warning
1526 (info, "no hash table available", NULL, input_bfd, input_section, 0);
1531 /* Reset the list of remembered HI16S relocs to empty. */
1532 free_hi16s = previous_hi16s;
1533 previous_hi16s = NULL;
1537 relend = relocs + input_section->reloc_count;
1538 for (; rel < relend; rel++)
1541 reloc_howto_type * howto;
1542 unsigned long r_symndx;
1543 Elf_Internal_Sym * sym;
1545 struct elf_link_hash_entry * h;
1547 bfd_reloc_status_type r;
1549 r_symndx = ELF32_R_SYM (rel->r_info);
1550 r_type = ELF32_R_TYPE (rel->r_info);
1552 if (r_type == R_V850_GNU_VTENTRY
1553 || r_type == R_V850_GNU_VTINHERIT)
1556 howto = v850_elf_howto_table + r_type;
1558 if (info->relocateable)
1560 /* This is a relocateable link. We don't have to change
1561 anything, unless the reloc is against a section symbol,
1562 in which case we have to adjust according to where the
1563 section symbol winds up in the output section. */
1564 if (r_symndx < symtab_hdr->sh_info)
1566 sym = local_syms + r_symndx;
1567 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1569 sec = local_sections[r_symndx];
1570 rel->r_addend += sec->output_offset + sym->st_value;
1577 /* This is a final link. */
1581 if (r_symndx < symtab_hdr->sh_info)
1583 sym = local_syms + r_symndx;
1584 sec = local_sections[r_symndx];
1585 relocation = (sec->output_section->vma
1586 + sec->output_offset
1591 name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name);
1592 name = (name == NULL) ? "<none>" : name;
1593 fprintf (stderr, "local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
1594 sec->name, name, sym->st_name,
1595 sec->output_section->vma, sec->output_offset, sym->st_value, rel->r_addend);
1601 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1603 while (h->root.type == bfd_link_hash_indirect
1604 || h->root.type == bfd_link_hash_warning)
1605 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1607 if (h->root.type == bfd_link_hash_defined
1608 || h->root.type == bfd_link_hash_defweak)
1610 sec = h->root.u.def.section;
1611 relocation = (h->root.u.def.value
1612 + sec->output_section->vma
1613 + sec->output_offset);
1615 fprintf (stderr, "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
1616 sec->name, h->root.root.string, h->root.u.def.value, sec->output_section->vma, sec->output_offset, relocation);
1619 else if (h->root.type == bfd_link_hash_undefweak)
1622 fprintf (stderr, "undefined: sec: %s, name: %s\n",
1623 sec->name, h->root.root.string);
1629 if (! ((*info->callbacks->undefined_symbol)
1630 (info, h->root.root.string, input_bfd,
1631 input_section, rel->r_offset, true)))
1634 fprintf (stderr, "unknown: name: %s\n", h->root.root.string);
1640 /* FIXME: We should use the addend, but the COFF relocations
1642 r = v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
1644 contents, rel->r_offset,
1645 relocation, rel->r_addend,
1646 info, sec, h == NULL);
1648 if (r != bfd_reloc_ok)
1651 const char * msg = (const char *)0;
1654 name = h->root.root.string;
1657 name = (bfd_elf_string_from_elf_section
1658 (input_bfd, symtab_hdr->sh_link, sym->st_name));
1659 if (name == NULL || *name == '\0')
1660 name = bfd_section_name (input_bfd, sec);
1665 case bfd_reloc_overflow:
1666 if (! ((*info->callbacks->reloc_overflow)
1667 (info, name, howto->name, (bfd_vma) 0,
1668 input_bfd, input_section, rel->r_offset)))
1672 case bfd_reloc_undefined:
1673 if (! ((*info->callbacks->undefined_symbol)
1674 (info, name, input_bfd, input_section,
1675 rel->r_offset, true)))
1679 case bfd_reloc_outofrange:
1680 msg = _("internal error: out of range error");
1683 case bfd_reloc_notsupported:
1684 msg = _("internal error: unsupported relocation error");
1687 case bfd_reloc_dangerous:
1688 msg = _("internal error: dangerous relocation");
1691 case bfd_reloc_other:
1692 msg = _("could not locate special linker symbol __gp");
1695 case bfd_reloc_continue:
1696 msg = _("could not locate special linker symbol __ep");
1699 case (bfd_reloc_dangerous + 1):
1700 msg = _("could not locate special linker symbol __ctbp");
1704 msg = _("internal error: unknown error");
1708 if (!((*info->callbacks->warning)
1709 (info, msg, name, input_bfd, input_section,
1721 v850_elf_gc_sweep_hook (abfd, info, sec, relocs)
1722 bfd *abfd ATTRIBUTE_UNUSED;
1723 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1724 asection *sec ATTRIBUTE_UNUSED;
1725 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
1727 /* No got and plt entries for v850-elf */
1732 v850_elf_gc_mark_hook (abfd, info, rel, h, sym)
1734 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1735 Elf_Internal_Rela *rel;
1736 struct elf_link_hash_entry *h;
1737 Elf_Internal_Sym *sym;
1741 switch (ELF32_R_TYPE (rel->r_info))
1743 case R_V850_GNU_VTINHERIT:
1744 case R_V850_GNU_VTENTRY:
1748 switch (h->root.type)
1750 case bfd_link_hash_defined:
1751 case bfd_link_hash_defweak:
1752 return h->root.u.def.section;
1754 case bfd_link_hash_common:
1755 return h->root.u.c.p->section;
1764 if (!(elf_bad_symtab (abfd)
1765 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
1766 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
1767 && sym->st_shndx != SHN_COMMON))
1769 return bfd_section_from_elf_index (abfd, sym->st_shndx);
1774 /* Set the right machine number. */
1776 v850_elf_object_p (abfd)
1779 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1782 case E_V850_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, 0); break;
1783 case E_V850E_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e); break;
1784 case E_V850EA_ARCH: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850ea); break;
1789 /* Store the machine number in the flags field. */
1791 v850_elf_final_write_processing (abfd, linker)
1793 boolean linker ATTRIBUTE_UNUSED;
1797 switch (bfd_get_mach (abfd))
1800 case 0: val = E_V850_ARCH; break;
1801 case bfd_mach_v850e: val = E_V850E_ARCH; break;
1802 case bfd_mach_v850ea: val = E_V850EA_ARCH; break;
1805 elf_elfheader (abfd)->e_flags &=~ EF_V850_ARCH;
1806 elf_elfheader (abfd)->e_flags |= val;
1809 /* Function to keep V850 specific file flags. */
1811 v850_elf_set_private_flags (abfd, flags)
1815 BFD_ASSERT (!elf_flags_init (abfd)
1816 || elf_elfheader (abfd)->e_flags == flags);
1818 elf_elfheader (abfd)->e_flags = flags;
1819 elf_flags_init (abfd) = true;
1823 /* Copy backend specific data from one object module to another */
1825 v850_elf_copy_private_bfd_data (ibfd, obfd)
1829 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1830 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1833 BFD_ASSERT (!elf_flags_init (obfd)
1834 || (elf_elfheader (obfd)->e_flags
1835 == elf_elfheader (ibfd)->e_flags));
1837 elf_gp (obfd) = elf_gp (ibfd);
1838 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1839 elf_flags_init (obfd) = true;
1843 /* Merge backend specific data from an object file to the output
1844 object file when linking. */
1846 v850_elf_merge_private_bfd_data (ibfd, obfd)
1853 if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1854 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1857 in_flags = elf_elfheader (ibfd)->e_flags;
1858 out_flags = elf_elfheader (obfd)->e_flags;
1860 if (! elf_flags_init (obfd))
1862 /* If the input is the default architecture then do not
1863 bother setting the flags for the output architecture,
1864 instead allow future merges to do this. If no future
1865 merges ever set these flags then they will retain their
1866 unitialised values, which surprise surprise, correspond
1867 to the default values. */
1868 if (bfd_get_arch_info (ibfd)->the_default)
1871 elf_flags_init (obfd) = true;
1872 elf_elfheader (obfd)->e_flags = in_flags;
1874 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
1875 && bfd_get_arch_info (obfd)->the_default)
1877 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
1883 /* Check flag compatibility. */
1884 if (in_flags == out_flags)
1887 if ((in_flags & EF_V850_ARCH) != (out_flags & EF_V850_ARCH)
1888 && (in_flags & EF_V850_ARCH) != E_V850_ARCH)
1889 _bfd_error_handler (_("%s: Architecture mismatch with previous modules"),
1890 bfd_get_filename (ibfd));
1894 /* Display the flags field */
1897 v850_elf_print_private_bfd_data (abfd, ptr)
1901 FILE * file = (FILE *) ptr;
1903 BFD_ASSERT (abfd != NULL && ptr != NULL);
1905 _bfd_elf_print_private_bfd_data (abfd, ptr);
1907 /* xgettext:c-format */
1908 fprintf (file, _("private flags = %lx: "), elf_elfheader (abfd)->e_flags);
1910 switch (elf_elfheader (abfd)->e_flags & EF_V850_ARCH)
1913 case E_V850_ARCH: fprintf (file, _("v850 architecture")); break;
1914 case E_V850E_ARCH: fprintf (file, _("v850e architecture")); break;
1915 case E_V850EA_ARCH: fprintf (file, _("v850ea architecture")); break;
1923 /* V850 ELF uses four common sections. One is the usual one, and the
1924 others are for (small) objects in one of the special data areas:
1925 small, tiny and zero. All the objects are kept together, and then
1926 referenced via the gp register, the ep register or the r0 register
1927 respectively, which yields smaller, faster assembler code. This
1928 approach is copied from elf32-mips.c. */
1930 static asection v850_elf_scom_section;
1931 static asymbol v850_elf_scom_symbol;
1932 static asymbol * v850_elf_scom_symbol_ptr;
1933 static asection v850_elf_tcom_section;
1934 static asymbol v850_elf_tcom_symbol;
1935 static asymbol * v850_elf_tcom_symbol_ptr;
1936 static asection v850_elf_zcom_section;
1937 static asymbol v850_elf_zcom_symbol;
1938 static asymbol * v850_elf_zcom_symbol_ptr;
1940 /* Given a BFD section, try to locate the corresponding ELF section
1944 v850_elf_section_from_bfd_section (abfd, hdr, sec, retval)
1945 bfd * abfd ATTRIBUTE_UNUSED;
1946 Elf32_Internal_Shdr * hdr ATTRIBUTE_UNUSED;
1950 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1951 *retval = SHN_V850_SCOMMON;
1952 else if (strcmp (bfd_get_section_name (abfd, sec), ".tcommon") == 0)
1953 *retval = SHN_V850_TCOMMON;
1954 else if (strcmp (bfd_get_section_name (abfd, sec), ".zcommon") == 0)
1955 *retval = SHN_V850_ZCOMMON;
1962 /* Handle the special V850 section numbers that a symbol may use. */
1965 v850_elf_symbol_processing (abfd, asym)
1969 elf_symbol_type * elfsym = (elf_symbol_type *) asym;
1970 unsigned short index;
1972 index = elfsym->internal_elf_sym.st_shndx;
1974 /* If the section index is an "ordinary" index, then it may
1975 refer to a v850 specific section created by the assembler.
1976 Check the section's type and change the index it matches.
1978 FIXME: Should we alter the st_shndx field as well ? */
1980 if (index < elf_elfheader(abfd)[0].e_shnum)
1981 switch (elf_elfsections(abfd)[index]->sh_type)
1983 case SHT_V850_SCOMMON:
1984 index = SHN_V850_SCOMMON;
1987 case SHT_V850_TCOMMON:
1988 index = SHN_V850_TCOMMON;
1991 case SHT_V850_ZCOMMON:
1992 index = SHN_V850_ZCOMMON;
2001 case SHN_V850_SCOMMON:
2002 if (v850_elf_scom_section.name == NULL)
2004 /* Initialize the small common section. */
2005 v850_elf_scom_section.name = ".scommon";
2006 v850_elf_scom_section.flags = SEC_IS_COMMON | SEC_ALLOC | SEC_DATA;
2007 v850_elf_scom_section.output_section = & v850_elf_scom_section;
2008 v850_elf_scom_section.symbol = & v850_elf_scom_symbol;
2009 v850_elf_scom_section.symbol_ptr_ptr = & v850_elf_scom_symbol_ptr;
2010 v850_elf_scom_symbol.name = ".scommon";
2011 v850_elf_scom_symbol.flags = BSF_SECTION_SYM;
2012 v850_elf_scom_symbol.section = & v850_elf_scom_section;
2013 v850_elf_scom_symbol_ptr = & v850_elf_scom_symbol;
2015 asym->section = & v850_elf_scom_section;
2016 asym->value = elfsym->internal_elf_sym.st_size;
2019 case SHN_V850_TCOMMON:
2020 if (v850_elf_tcom_section.name == NULL)
2022 /* Initialize the tcommon section. */
2023 v850_elf_tcom_section.name = ".tcommon";
2024 v850_elf_tcom_section.flags = SEC_IS_COMMON;
2025 v850_elf_tcom_section.output_section = & v850_elf_tcom_section;
2026 v850_elf_tcom_section.symbol = & v850_elf_tcom_symbol;
2027 v850_elf_tcom_section.symbol_ptr_ptr = & v850_elf_tcom_symbol_ptr;
2028 v850_elf_tcom_symbol.name = ".tcommon";
2029 v850_elf_tcom_symbol.flags = BSF_SECTION_SYM;
2030 v850_elf_tcom_symbol.section = & v850_elf_tcom_section;
2031 v850_elf_tcom_symbol_ptr = & v850_elf_tcom_symbol;
2033 asym->section = & v850_elf_tcom_section;
2034 asym->value = elfsym->internal_elf_sym.st_size;
2037 case SHN_V850_ZCOMMON:
2038 if (v850_elf_zcom_section.name == NULL)
2040 /* Initialize the zcommon section. */
2041 v850_elf_zcom_section.name = ".zcommon";
2042 v850_elf_zcom_section.flags = SEC_IS_COMMON;
2043 v850_elf_zcom_section.output_section = & v850_elf_zcom_section;
2044 v850_elf_zcom_section.symbol = & v850_elf_zcom_symbol;
2045 v850_elf_zcom_section.symbol_ptr_ptr = & v850_elf_zcom_symbol_ptr;
2046 v850_elf_zcom_symbol.name = ".zcommon";
2047 v850_elf_zcom_symbol.flags = BSF_SECTION_SYM;
2048 v850_elf_zcom_symbol.section = & v850_elf_zcom_section;
2049 v850_elf_zcom_symbol_ptr = & v850_elf_zcom_symbol;
2051 asym->section = & v850_elf_zcom_section;
2052 asym->value = elfsym->internal_elf_sym.st_size;
2057 /* Hook called by the linker routine which adds symbols from an object
2058 file. We must handle the special v850 section numbers here. */
2061 v850_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2063 struct bfd_link_info * info ATTRIBUTE_UNUSED;
2064 const Elf_Internal_Sym * sym;
2065 const char ** namep ATTRIBUTE_UNUSED;
2066 flagword * flagsp ATTRIBUTE_UNUSED;
2070 int index = sym->st_shndx;
2072 /* If the section index is an "ordinary" index, then it may
2073 refer to a v850 specific section created by the assembler.
2074 Check the section's type and change the index it matches.
2076 FIXME: Should we alter the st_shndx field as well ? */
2078 if (index < elf_elfheader(abfd)[0].e_shnum)
2079 switch (elf_elfsections(abfd)[index]->sh_type)
2081 case SHT_V850_SCOMMON:
2082 index = SHN_V850_SCOMMON;
2085 case SHT_V850_TCOMMON:
2086 index = SHN_V850_TCOMMON;
2089 case SHT_V850_ZCOMMON:
2090 index = SHN_V850_ZCOMMON;
2099 case SHN_V850_SCOMMON:
2100 *secp = bfd_make_section_old_way (abfd, ".scommon");
2101 (*secp)->flags |= SEC_IS_COMMON;
2102 *valp = sym->st_size;
2105 case SHN_V850_TCOMMON:
2106 *secp = bfd_make_section_old_way (abfd, ".tcommon");
2107 (*secp)->flags |= SEC_IS_COMMON;
2108 *valp = sym->st_size;
2111 case SHN_V850_ZCOMMON:
2112 *secp = bfd_make_section_old_way (abfd, ".zcommon");
2113 (*secp)->flags |= SEC_IS_COMMON;
2114 *valp = sym->st_size;
2123 v850_elf_link_output_symbol_hook (abfd, info, name, sym, input_sec)
2124 bfd * abfd ATTRIBUTE_UNUSED;
2125 struct bfd_link_info * info ATTRIBUTE_UNUSED;
2126 const char * name ATTRIBUTE_UNUSED;
2127 Elf_Internal_Sym * sym;
2128 asection * input_sec;
2130 /* If we see a common symbol, which implies a relocatable link, then
2131 if a symbol was in a special common section in an input file, mark
2132 it as a special common in the output file. */
2134 if (sym->st_shndx == SHN_COMMON)
2136 if (strcmp (input_sec->name, ".scommon") == 0)
2137 sym->st_shndx = SHN_V850_SCOMMON;
2138 else if (strcmp (input_sec->name, ".tcommon") == 0)
2139 sym->st_shndx = SHN_V850_TCOMMON;
2140 else if (strcmp (input_sec->name, ".zcommon") == 0)
2141 sym->st_shndx = SHN_V850_ZCOMMON;
2148 v850_elf_section_from_shdr (abfd, hdr, name)
2150 Elf_Internal_Shdr * hdr;
2153 /* There ought to be a place to keep ELF backend specific flags, but
2154 at the moment there isn't one. We just keep track of the
2155 sections by their name, instead. */
2157 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2160 switch (hdr->sh_type)
2162 case SHT_V850_SCOMMON:
2163 case SHT_V850_TCOMMON:
2164 case SHT_V850_ZCOMMON:
2165 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2166 (bfd_get_section_flags (abfd,
2175 /* Set the correct type for a V850 ELF section. We do this by the
2176 section name, which is a hack, but ought to work. */
2178 v850_elf_fake_sections (abfd, hdr, sec)
2179 bfd * abfd ATTRIBUTE_UNUSED;
2180 Elf32_Internal_Shdr * hdr;
2183 register const char * name;
2185 name = bfd_get_section_name (abfd, sec);
2187 if (strcmp (name, ".scommon") == 0)
2189 hdr->sh_type = SHT_V850_SCOMMON;
2191 else if (strcmp (name, ".tcommon") == 0)
2193 hdr->sh_type = SHT_V850_TCOMMON;
2195 else if (strcmp (name, ".zcommon") == 0)
2196 hdr->sh_type = SHT_V850_ZCOMMON;
2201 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
2202 #define TARGET_LITTLE_NAME "elf32-v850"
2203 #define ELF_ARCH bfd_arch_v850
2204 #define ELF_MACHINE_CODE EM_CYGNUS_V850
2205 #define ELF_MAXPAGESIZE 0x1000
2207 #define elf_info_to_howto v850_elf_info_to_howto_rela
2208 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
2210 #define elf_backend_check_relocs v850_elf_check_relocs
2211 #define elf_backend_relocate_section v850_elf_relocate_section
2212 #define elf_backend_object_p v850_elf_object_p
2213 #define elf_backend_final_write_processing v850_elf_final_write_processing
2214 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
2215 #define elf_backend_symbol_processing v850_elf_symbol_processing
2216 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
2217 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
2218 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
2219 #define elf_backend_fake_sections v850_elf_fake_sections
2220 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
2221 #define elf_backend_gc_sweep_hook v850_elf_gc_sweep_hook
2223 #define elf_backend_can_gc_sections 1
2225 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
2226 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
2227 #define bfd_elf32_bfd_copy_private_bfd_data v850_elf_copy_private_bfd_data
2228 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
2229 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
2230 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
2232 #define elf_symbol_leading_char '_'
2234 #include "elf32-target.h"