1 /* V850-specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
23 /* XXX FIXME: This code is littered with 32bit int, 16bit short, 8bit char
24 dependencies. As is the gas & simulator code for the v850. */
32 #include "libiberty.h"
34 /* Sign-extend a 24-bit number. */
35 #define SEXT24(x) ((((x) & 0xffffff) ^ 0x800000) - 0x800000)
37 static reloc_howto_type v850_elf_howto_table
[];
39 /* Look through the relocs for a section during the first phase, and
40 allocate space in the global offset table or procedure linkage
44 v850_elf_check_relocs (bfd
*abfd
,
45 struct bfd_link_info
*info
,
47 const Elf_Internal_Rela
*relocs
)
49 bfd_boolean ret
= TRUE
;
51 Elf_Internal_Shdr
*symtab_hdr
;
52 struct elf_link_hash_entry
**sym_hashes
;
53 const Elf_Internal_Rela
*rel
;
54 const Elf_Internal_Rela
*rel_end
;
56 enum v850_reloc_type r_type
;
58 const char *common
= NULL
;
60 if (info
->relocatable
)
64 _bfd_error_handler ("v850_elf_check_relocs called for section %A in %B",
68 dynobj
= elf_hash_table (info
)->dynobj
;
69 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
70 sym_hashes
= elf_sym_hashes (abfd
);
73 rel_end
= relocs
+ sec
->reloc_count
;
74 for (rel
= relocs
; rel
< rel_end
; rel
++)
76 unsigned long r_symndx
;
77 struct elf_link_hash_entry
*h
;
79 r_symndx
= ELF32_R_SYM (rel
->r_info
);
80 if (r_symndx
< symtab_hdr
->sh_info
)
84 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
85 while (h
->root
.type
== bfd_link_hash_indirect
86 || h
->root
.type
== bfd_link_hash_warning
)
87 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
90 r_type
= (enum v850_reloc_type
) ELF32_R_TYPE (rel
->r_info
);
100 case R_V850_LO16_SPLIT_OFFSET
:
105 case R_V850_CALLT_6_7_OFFSET
:
106 case R_V850_CALLT_16_16_OFFSET
:
109 /* This relocation describes the C++ object vtable hierarchy.
110 Reconstruct it for later use during GC. */
111 case R_V850_GNU_VTINHERIT
:
112 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
116 /* This relocation describes which C++ vtable entries
117 are actually used. Record for later use during GC. */
118 case R_V850_GNU_VTENTRY
:
119 BFD_ASSERT (h
!= NULL
);
121 && !bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
125 case R_V850_SDA_16_16_SPLIT_OFFSET
:
126 case R_V850_SDA_16_16_OFFSET
:
127 case R_V850_SDA_15_16_OFFSET
:
128 other
= V850_OTHER_SDA
;
130 goto small_data_common
;
132 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
133 case R_V850_ZDA_16_16_OFFSET
:
134 case R_V850_ZDA_15_16_OFFSET
:
135 other
= V850_OTHER_ZDA
;
137 goto small_data_common
;
139 case R_V850_TDA_4_5_OFFSET
:
140 case R_V850_TDA_4_4_OFFSET
:
141 case R_V850_TDA_6_8_OFFSET
:
142 case R_V850_TDA_7_8_OFFSET
:
143 case R_V850_TDA_7_7_OFFSET
:
144 case R_V850_TDA_16_16_OFFSET
:
145 other
= V850_OTHER_TDA
;
149 #define V850_OTHER_MASK (V850_OTHER_TDA | V850_OTHER_SDA | V850_OTHER_ZDA)
154 /* Flag which type of relocation was used. */
156 if ((h
->other
& V850_OTHER_MASK
) != (other
& V850_OTHER_MASK
)
157 && (h
->other
& V850_OTHER_ERROR
) == 0)
160 static char buff
[200]; /* XXX */
162 switch (h
->other
& V850_OTHER_MASK
)
165 msg
= _("Variable `%s' cannot occupy in multiple small data regions");
167 case V850_OTHER_SDA
| V850_OTHER_ZDA
| V850_OTHER_TDA
:
168 msg
= _("Variable `%s' can only be in one of the small, zero, and tiny data regions");
170 case V850_OTHER_SDA
| V850_OTHER_ZDA
:
171 msg
= _("Variable `%s' cannot be in both small and zero data regions simultaneously");
173 case V850_OTHER_SDA
| V850_OTHER_TDA
:
174 msg
= _("Variable `%s' cannot be in both small and tiny data regions simultaneously");
176 case V850_OTHER_ZDA
| V850_OTHER_TDA
:
177 msg
= _("Variable `%s' cannot be in both zero and tiny data regions simultaneously");
181 sprintf (buff
, msg
, h
->root
.root
.string
);
182 info
->callbacks
->warning (info
, buff
, h
->root
.root
.string
,
183 abfd
, h
->root
.u
.def
.section
,
186 bfd_set_error (bfd_error_bad_value
);
187 h
->other
|= V850_OTHER_ERROR
;
192 if (h
&& h
->root
.type
== bfd_link_hash_common
194 && !strcmp (bfd_get_section_name (abfd
, h
->root
.u
.c
.p
->section
), "COMMON"))
198 section
= h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
, common
);
199 section
->flags
|= SEC_IS_COMMON
;
203 fprintf (stderr
, "v850_elf_check_relocs, found %s relocation for %s%s\n",
204 v850_elf_howto_table
[ (int)r_type
].name
,
205 (h
&& h
->root
.root
.string
) ? h
->root
.root
.string
: "<unknown>",
206 (h
->root
.type
== bfd_link_hash_common
) ? ", symbol is common" : "");
215 /* In the old version, when an entry was checked out from the table,
216 it was deleted. This produced an error if the entry was needed
217 more than once, as the second attempted retry failed.
219 In the current version, the entry is not deleted, instead we set
220 the field 'found' to TRUE. If a second lookup matches the same
221 entry, then we know that the hi16s reloc has already been updated
222 and does not need to be updated a second time.
224 TODO - TOFIX: If it is possible that we need to restore 2 different
225 addresses from the same table entry, where the first generates an
226 overflow, whilst the second do not, then this code will fail. */
228 typedef struct hi16s_location
232 unsigned long counter
;
234 struct hi16s_location
* next
;
238 static hi16s_location
* previous_hi16s
;
239 static hi16s_location
* free_hi16s
;
240 static unsigned long hi16s_counter
;
243 remember_hi16s_reloc (bfd
*abfd
, bfd_vma addend
, bfd_byte
*address
)
245 hi16s_location
* entry
= NULL
;
246 bfd_size_type amt
= sizeof (* free_hi16s
);
248 /* Find a free structure. */
249 if (free_hi16s
== NULL
)
250 free_hi16s
= bfd_zalloc (abfd
, amt
);
253 free_hi16s
= free_hi16s
->next
;
255 entry
->addend
= addend
;
256 entry
->address
= address
;
257 entry
->counter
= hi16s_counter
++;
258 entry
->found
= FALSE
;
259 entry
->next
= previous_hi16s
;
260 previous_hi16s
= entry
;
262 /* Cope with wrap around of our counter. */
263 if (hi16s_counter
== 0)
265 /* XXX: Assume that all counter entries differ only in their low 16 bits. */
266 for (entry
= previous_hi16s
; entry
!= NULL
; entry
= entry
->next
)
267 entry
->counter
&= 0xffff;
269 hi16s_counter
= 0x10000;
274 find_remembered_hi16s_reloc (bfd_vma addend
, bfd_boolean
*already_found
)
276 hi16s_location
*match
= NULL
;
277 hi16s_location
*entry
;
278 hi16s_location
*previous
= NULL
;
279 hi16s_location
*prev
;
282 /* Search the table. Record the most recent entry that matches. */
283 for (entry
= previous_hi16s
; entry
; entry
= entry
->next
)
285 if (entry
->addend
== addend
286 && (match
== NULL
|| match
->counter
< entry
->counter
))
298 /* Extract the address. */
299 addr
= match
->address
;
301 /* Remember if this entry has already been used before. */
303 * already_found
= match
->found
;
305 /* Note that this entry has now been used. */
311 /* Calculate the final operand value for a R_V850_LO16 or
312 R_V850_LO16_SPLIT_OFFSET. *INSN is the current operand value and
313 ADDEND is the sum of the relocation symbol and offset. Store the
314 operand value in *INSN and return true on success.
316 The assembler has already done some of this: If the value stored in
317 the instruction has its 15th bit set, (counting from zero) then the
318 assembler will have added 1 to the value stored in the associated
319 HI16S reloc. So for example, these relocations:
321 movhi hi( fred ), r0, r1
322 movea lo( fred ), r1, r1
324 will store 0 in the value fields for the MOVHI and MOVEA instructions
325 and addend will be the address of fred, but for these instructions:
327 movhi hi( fred + 0x123456), r0, r1
328 movea lo( fred + 0x123456), r1, r1
330 the value stored in the MOVHI instruction will be 0x12 and the value
331 stored in the MOVEA instruction will be 0x3456. If however the
334 movhi hi( fred + 0x10ffff), r0, r1
335 movea lo( fred + 0x10ffff), r1, r1
337 then the value stored in the MOVHI instruction would be 0x11 (not
338 0x10) and the value stored in the MOVEA instruction would be 0xffff.
339 Thus (assuming for the moment that the addend is 0), at run time the
340 MOVHI instruction loads 0x110000 into r1, then the MOVEA instruction
341 adds 0xffffffff (sign extension!) producing 0x10ffff. Similarly if
342 the instructions were:
344 movhi hi( fred - 1), r0, r1
345 movea lo( fred - 1), r1, r1
347 then 0 is stored in the MOVHI instruction and -1 is stored in the
350 Overflow can occur if the addition of the value stored in the
351 instruction plus the addend sets the 15th bit when before it was clear.
352 This is because the 15th bit will be sign extended into the high part,
353 thus reducing its value by one, but since the 15th bit was originally
354 clear, the assembler will not have added 1 to the previous HI16S reloc
355 to compensate for this effect. For example:
357 movhi hi( fred + 0x123456), r0, r1
358 movea lo( fred + 0x123456), r1, r1
360 The value stored in HI16S reloc is 0x12, the value stored in the LO16
361 reloc is 0x3456. If we assume that the address of fred is 0x00007000
362 then the relocations become:
364 HI16S: 0x0012 + (0x00007000 >> 16) = 0x12
365 LO16: 0x3456 + (0x00007000 & 0xffff) = 0xa456
367 but when the instructions are executed, the MOVEA instruction's value
368 is signed extended, so the sum becomes:
373 0x0011a456 but 'fred + 0x123456' = 0x0012a456
375 Note that if the 15th bit was set in the value stored in the LO16
376 reloc, then we do not have to do anything:
378 movhi hi( fred + 0x10ffff), r0, r1
379 movea lo( fred + 0x10ffff), r1, r1
381 HI16S: 0x0011 + (0x00007000 >> 16) = 0x11
382 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff
387 0x00116fff = fred + 0x10ffff = 0x7000 + 0x10ffff
389 Overflow can also occur if the computation carries into the 16th bit
390 and it also results in the 15th bit having the same value as the 15th
391 bit of the original value. What happens is that the HI16S reloc
392 will have already examined the 15th bit of the original value and
393 added 1 to the high part if the bit is set. This compensates for the
394 sign extension of 15th bit of the result of the computation. But now
395 there is a carry into the 16th bit, and this has not been allowed for.
397 So, for example if fred is at address 0xf000:
399 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
400 movea lo( fred + 0xffff), r1, r1
402 HI16S: 0x0001 + (0x0000f000 >> 16) = 0x0001
403 LO16: 0xffff + (0x0000f000 & 0xffff) = 0xefff (carry into bit 16 is lost)
408 0x0000efff but 'fred + 0xffff' = 0x0001efff
410 Similarly, if the 15th bit remains clear, but overflow occurs into
411 the 16th bit then (assuming the address of fred is 0xf000):
413 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
414 movea lo( fred + 0x7000), r1, r1
416 HI16S: 0x0000 + (0x0000f000 >> 16) = 0x0000
417 LO16: 0x7000 + (0x0000f000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
422 0x00006fff but 'fred + 0x7000' = 0x00016fff
424 Note - there is no need to change anything if a carry occurs, and the
425 15th bit changes its value from being set to being clear, as the HI16S
426 reloc will have already added in 1 to the high part for us:
428 movhi hi( fred + 0xffff), r0, r1 [bit 15 of the offset is set]
429 movea lo( fred + 0xffff), r1, r1
431 HI16S: 0x0001 + (0x00007000 >> 16)
432 LO16: 0xffff + (0x00007000 & 0xffff) = 0x6fff (carry into bit 16 is lost)
435 + 0x00006fff (bit 15 not set, so the top half is zero)
437 0x00016fff which is right (assuming that fred is at 0x7000)
439 but if the 15th bit goes from being clear to being set, then we must
440 once again handle overflow:
442 movhi hi( fred + 0x7000), r0, r1 [bit 15 of the offset is clear]
443 movea lo( fred + 0x7000), r1, r1
445 HI16S: 0x0000 + (0x0000ffff >> 16)
446 LO16: 0x7000 + (0x0000ffff & 0xffff) = 0x6fff (carry into bit 16)
449 + 0x00006fff (bit 15 not set, so the top half is zero)
451 0x00006fff which is wrong (assuming that fred is at 0xffff). */
454 v850_elf_perform_lo16_relocation (bfd
*abfd
, unsigned long *insn
,
455 unsigned long addend
)
457 #define BIT15_SET(x) ((x) & 0x8000)
458 #define OVERFLOWS(a,i) ((((a) & 0xffff) + (i)) > 0xffff)
460 if ((BIT15_SET (*insn
+ addend
) && ! BIT15_SET (addend
))
461 || (OVERFLOWS (addend
, *insn
)
462 && ((! BIT15_SET (*insn
)) || (BIT15_SET (addend
)))))
464 bfd_boolean already_updated
;
465 bfd_byte
*hi16s_address
= find_remembered_hi16s_reloc
466 (addend
, & already_updated
);
468 /* Amend the matching HI16_S relocation. */
469 if (hi16s_address
!= NULL
)
471 if (! already_updated
)
473 unsigned long hi_insn
= bfd_get_16 (abfd
, hi16s_address
);
475 bfd_put_16 (abfd
, hi_insn
, hi16s_address
);
480 fprintf (stderr
, _("FAILED to find previous HI16 reloc\n"));
487 /* Do not complain if value has top bit set, as this has been
489 *insn
= (*insn
+ addend
) & 0xffff;
493 /* FIXME: The code here probably ought to be removed and the code in reloc.c
494 allowed to do its stuff instead. At least for most of the relocs, anyway. */
496 static bfd_reloc_status_type
497 v850_elf_perform_relocation (bfd
*abfd
,
503 unsigned long result
;
504 bfd_signed_vma saddend
= (bfd_signed_vma
) addend
;
509 return bfd_reloc_notsupported
;
513 bfd_put_32 (abfd
, addend
, address
);
516 case R_V850_22_PCREL
:
517 if (saddend
> 0x1fffff || saddend
< -0x200000)
518 return bfd_reloc_overflow
;
520 if ((addend
% 2) != 0)
521 return bfd_reloc_dangerous
;
523 insn
= bfd_get_32 (abfd
, address
);
525 insn
|= (((addend
& 0xfffe) << 16) | ((addend
& 0x3f0000) >> 16));
526 bfd_put_32 (abfd
, (bfd_vma
) insn
, address
);
530 if (saddend
> 0xff || saddend
< -0x100)
531 return bfd_reloc_overflow
;
533 if ((addend
% 2) != 0)
534 return bfd_reloc_dangerous
;
536 insn
= bfd_get_16 (abfd
, address
);
538 insn
|= ((addend
& 0x1f0) << 7) | ((addend
& 0x0e) << 3);
542 addend
+= (bfd_get_16 (abfd
, address
) << 16);
543 addend
= (addend
>> 16);
548 /* Remember where this relocation took place. */
549 remember_hi16s_reloc (abfd
, addend
, address
);
551 addend
+= (bfd_get_16 (abfd
, address
) << 16);
552 addend
= (addend
>> 16) + ((addend
& 0x8000) != 0);
554 /* This relocation cannot overflow. */
562 insn
= bfd_get_16 (abfd
, address
);
563 if (! v850_elf_perform_lo16_relocation (abfd
, &insn
, addend
))
564 return bfd_reloc_overflow
;
568 addend
+= (char) bfd_get_8 (abfd
, address
);
570 saddend
= (bfd_signed_vma
) addend
;
572 if (saddend
> 0x7f || saddend
< -0x80)
573 return bfd_reloc_overflow
;
575 bfd_put_8 (abfd
, addend
, address
);
578 case R_V850_CALLT_16_16_OFFSET
:
579 addend
+= bfd_get_16 (abfd
, address
);
581 saddend
= (bfd_signed_vma
) addend
;
583 if (saddend
> 0xffff || saddend
< 0)
584 return bfd_reloc_overflow
;
590 case R_V850_SDA_16_16_OFFSET
:
591 case R_V850_ZDA_16_16_OFFSET
:
592 case R_V850_TDA_16_16_OFFSET
:
593 addend
+= bfd_get_16 (abfd
, address
);
595 saddend
= (bfd_signed_vma
) addend
;
597 if (saddend
> 0x7fff || saddend
< -0x8000)
598 return bfd_reloc_overflow
;
603 case R_V850_SDA_15_16_OFFSET
:
604 case R_V850_ZDA_15_16_OFFSET
:
605 insn
= bfd_get_16 (abfd
, address
);
606 addend
+= (insn
& 0xfffe);
608 saddend
= (bfd_signed_vma
) addend
;
610 if (saddend
> 0x7ffe || saddend
< -0x8000)
611 return bfd_reloc_overflow
;
614 return bfd_reloc_dangerous
;
616 insn
= (addend
&~ (bfd_vma
) 1) | (insn
& 1);
619 case R_V850_TDA_6_8_OFFSET
:
620 insn
= bfd_get_16 (abfd
, address
);
621 addend
+= ((insn
& 0x7e) << 1);
623 saddend
= (bfd_signed_vma
) addend
;
625 if (saddend
> 0xfc || saddend
< 0)
626 return bfd_reloc_overflow
;
629 return bfd_reloc_dangerous
;
632 insn
|= (addend
>> 1);
635 case R_V850_TDA_7_8_OFFSET
:
636 insn
= bfd_get_16 (abfd
, address
);
637 addend
+= ((insn
& 0x7f) << 1);
639 saddend
= (bfd_signed_vma
) addend
;
641 if (saddend
> 0xfe || saddend
< 0)
642 return bfd_reloc_overflow
;
645 return bfd_reloc_dangerous
;
648 insn
|= (addend
>> 1);
651 case R_V850_TDA_7_7_OFFSET
:
652 insn
= bfd_get_16 (abfd
, address
);
653 addend
+= insn
& 0x7f;
655 saddend
= (bfd_signed_vma
) addend
;
657 if (saddend
> 0x7f || saddend
< 0)
658 return bfd_reloc_overflow
;
664 case R_V850_TDA_4_5_OFFSET
:
665 insn
= bfd_get_16 (abfd
, address
);
666 addend
+= ((insn
& 0xf) << 1);
668 saddend
= (bfd_signed_vma
) addend
;
670 if (saddend
> 0x1e || saddend
< 0)
671 return bfd_reloc_overflow
;
674 return bfd_reloc_dangerous
;
677 insn
|= (addend
>> 1);
680 case R_V850_TDA_4_4_OFFSET
:
681 insn
= bfd_get_16 (abfd
, address
);
682 addend
+= insn
& 0xf;
684 saddend
= (bfd_signed_vma
) addend
;
686 if (saddend
> 0xf || saddend
< 0)
687 return bfd_reloc_overflow
;
693 case R_V850_LO16_SPLIT_OFFSET
:
694 insn
= bfd_get_32 (abfd
, address
);
695 result
= ((insn
& 0xfffe0000) >> 16) | ((insn
& 0x20) >> 5);
696 if (! v850_elf_perform_lo16_relocation (abfd
, &result
, addend
))
697 return bfd_reloc_overflow
;
698 insn
= (((result
<< 16) & 0xfffe0000)
699 | ((result
<< 5) & 0x20)
700 | (insn
& ~0xfffe0020));
701 bfd_put_32 (abfd
, insn
, address
);
704 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
705 case R_V850_SDA_16_16_SPLIT_OFFSET
:
706 insn
= bfd_get_32 (abfd
, address
);
707 addend
+= ((insn
& 0xfffe0000) >> 16) + ((insn
& 0x20) >> 5);
709 saddend
= (bfd_signed_vma
) addend
;
711 if (saddend
> 0x7fff || saddend
< -0x8000)
712 return bfd_reloc_overflow
;
715 insn
|= (addend
& 1) << 5;
716 insn
|= (addend
&~ (bfd_vma
) 1) << 16;
718 bfd_put_32 (abfd
, (bfd_vma
) insn
, address
);
721 case R_V850_CALLT_6_7_OFFSET
:
722 insn
= bfd_get_16 (abfd
, address
);
723 addend
+= ((insn
& 0x3f) << 1);
725 saddend
= (bfd_signed_vma
) addend
;
727 if (saddend
> 0x7e || saddend
< 0)
728 return bfd_reloc_overflow
;
731 return bfd_reloc_dangerous
;
734 insn
|= (addend
>> 1);
737 case R_V850_GNU_VTINHERIT
:
738 case R_V850_GNU_VTENTRY
:
743 bfd_put_16 (abfd
, (bfd_vma
) insn
, address
);
747 /* Insert the addend into the instruction. */
749 static bfd_reloc_status_type
750 v850_elf_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
753 void * data ATTRIBUTE_UNUSED
,
756 char **err ATTRIBUTE_UNUSED
)
760 /* If there is an output BFD,
761 and the symbol is not a section name (which is only defined at final link time),
762 and either we are not putting the addend into the instruction
763 or the addend is zero, so there is nothing to add into the instruction
764 then just fixup the address and return. */
766 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
767 && (! reloc
->howto
->partial_inplace
768 || reloc
->addend
== 0))
770 reloc
->address
+= isection
->output_offset
;
774 /* Catch relocs involving undefined symbols. */
775 if (bfd_is_und_section (symbol
->section
)
776 && (symbol
->flags
& BSF_WEAK
) == 0
778 return bfd_reloc_undefined
;
780 /* We handle final linking of some relocs ourselves. */
782 /* Is the address of the relocation really within the section? */
783 if (reloc
->address
> bfd_get_section_limit (abfd
, isection
))
784 return bfd_reloc_outofrange
;
786 /* Work out which section the relocation is targeted at and the
787 initial relocation command value. */
789 if (reloc
->howto
->pc_relative
)
792 /* Get symbol value. (Common symbols are special.) */
793 if (bfd_is_com_section (symbol
->section
))
796 relocation
= symbol
->value
;
798 /* Convert input-section-relative symbol value to absolute + addend. */
799 relocation
+= symbol
->section
->output_section
->vma
;
800 relocation
+= symbol
->section
->output_offset
;
801 relocation
+= reloc
->addend
;
803 reloc
->addend
= relocation
;
807 /* This function is used for relocs which are only used
808 for relaxing, which the linker should otherwise ignore. */
810 static bfd_reloc_status_type
811 v850_elf_ignore_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
812 arelent
*reloc_entry
,
813 asymbol
*symbol ATTRIBUTE_UNUSED
,
814 void * data ATTRIBUTE_UNUSED
,
815 asection
*input_section
,
817 char **error_message ATTRIBUTE_UNUSED
)
819 if (output_bfd
!= NULL
)
820 reloc_entry
->address
+= input_section
->output_offset
;
824 /* Note: It is REQUIRED that the 'type' value of each entry
825 in this array match the index of the entry in the array. */
826 static reloc_howto_type v850_elf_howto_table
[] =
828 /* This reloc does nothing. */
829 HOWTO (R_V850_NONE
, /* Type. */
831 2, /* Size (0 = byte, 1 = short, 2 = long). */
833 FALSE
, /* PC_relative. */
835 complain_overflow_bitfield
, /* Complain_on_overflow. */
836 bfd_elf_generic_reloc
, /* Special_function. */
837 "R_V850_NONE", /* Name. */
838 FALSE
, /* Partial_inplace. */
841 FALSE
), /* PCrel_offset. */
843 /* A PC relative 9 bit branch. */
844 HOWTO (R_V850_9_PCREL
, /* Type. */
846 2, /* Size (0 = byte, 1 = short, 2 = long). */
848 TRUE
, /* PC_relative. */
850 complain_overflow_bitfield
, /* Complain_on_overflow. */
851 v850_elf_reloc
, /* Special_function. */
852 "R_V850_9_PCREL", /* Name. */
853 FALSE
, /* Partial_inplace. */
854 0x00ffffff, /* Src_mask. */
855 0x00ffffff, /* Dst_mask. */
856 TRUE
), /* PCrel_offset. */
858 /* A PC relative 22 bit branch. */
859 HOWTO (R_V850_22_PCREL
, /* Type. */
861 2, /* Size (0 = byte, 1 = short, 2 = long). */
863 TRUE
, /* PC_relative. */
865 complain_overflow_signed
, /* Complain_on_overflow. */
866 v850_elf_reloc
, /* Special_function. */
867 "R_V850_22_PCREL", /* Name. */
868 FALSE
, /* Partial_inplace. */
869 0x07ffff80, /* Src_mask. */
870 0x07ffff80, /* Dst_mask. */
871 TRUE
), /* PCrel_offset. */
873 /* High 16 bits of symbol value. */
874 HOWTO (R_V850_HI16_S
, /* Type. */
876 1, /* Size (0 = byte, 1 = short, 2 = long). */
878 FALSE
, /* PC_relative. */
880 complain_overflow_dont
, /* Complain_on_overflow. */
881 v850_elf_reloc
, /* Special_function. */
882 "R_V850_HI16_S", /* Name. */
883 FALSE
, /* Partial_inplace. */
884 0xffff, /* Src_mask. */
885 0xffff, /* Dst_mask. */
886 FALSE
), /* PCrel_offset. */
888 /* High 16 bits of symbol value. */
889 HOWTO (R_V850_HI16
, /* Type. */
891 1, /* Size (0 = byte, 1 = short, 2 = long). */
893 FALSE
, /* PC_relative. */
895 complain_overflow_dont
, /* Complain_on_overflow. */
896 v850_elf_reloc
, /* Special_function. */
897 "R_V850_HI16", /* Name. */
898 FALSE
, /* Partial_inplace. */
899 0xffff, /* Src_mask. */
900 0xffff, /* Dst_mask. */
901 FALSE
), /* PCrel_offset. */
903 /* Low 16 bits of symbol value. */
904 HOWTO (R_V850_LO16
, /* Type. */
906 1, /* Size (0 = byte, 1 = short, 2 = long). */
908 FALSE
, /* PC_relative. */
910 complain_overflow_dont
, /* Complain_on_overflow. */
911 v850_elf_reloc
, /* Special_function. */
912 "R_V850_LO16", /* Name. */
913 FALSE
, /* Partial_inplace. */
914 0xffff, /* Src_mask. */
915 0xffff, /* Dst_mask. */
916 FALSE
), /* PCrel_offset. */
918 /* Simple 32bit reloc. */
919 HOWTO (R_V850_ABS32
, /* Type. */
921 2, /* Size (0 = byte, 1 = short, 2 = long). */
923 FALSE
, /* PC_relative. */
925 complain_overflow_dont
, /* Complain_on_overflow. */
926 v850_elf_reloc
, /* Special_function. */
927 "R_V850_ABS32", /* Name. */
928 FALSE
, /* Partial_inplace. */
929 0xffffffff, /* Src_mask. */
930 0xffffffff, /* Dst_mask. */
931 FALSE
), /* PCrel_offset. */
933 /* Simple 16bit reloc. */
934 HOWTO (R_V850_16
, /* Type. */
936 1, /* Size (0 = byte, 1 = short, 2 = long). */
938 FALSE
, /* PC_relative. */
940 complain_overflow_dont
, /* Complain_on_overflow. */
941 bfd_elf_generic_reloc
, /* Special_function. */
942 "R_V850_16", /* Name. */
943 FALSE
, /* Partial_inplace. */
944 0xffff, /* Src_mask. */
945 0xffff, /* Dst_mask. */
946 FALSE
), /* PCrel_offset. */
948 /* Simple 8bit reloc. */
949 HOWTO (R_V850_8
, /* Type. */
951 0, /* Size (0 = byte, 1 = short, 2 = long). */
953 FALSE
, /* PC_relative. */
955 complain_overflow_dont
, /* Complain_on_overflow. */
956 bfd_elf_generic_reloc
, /* Special_function. */
957 "R_V850_8", /* Name. */
958 FALSE
, /* Partial_inplace. */
959 0xff, /* Src_mask. */
960 0xff, /* Dst_mask. */
961 FALSE
), /* PCrel_offset. */
963 /* 16 bit offset from the short data area pointer. */
964 HOWTO (R_V850_SDA_16_16_OFFSET
, /* Type. */
966 1, /* Size (0 = byte, 1 = short, 2 = long). */
968 FALSE
, /* PC_relative. */
970 complain_overflow_dont
, /* Complain_on_overflow. */
971 v850_elf_reloc
, /* Special_function. */
972 "R_V850_SDA_16_16_OFFSET", /* Name. */
973 FALSE
, /* Partial_inplace. */
974 0xffff, /* Src_mask. */
975 0xffff, /* Dst_mask. */
976 FALSE
), /* PCrel_offset. */
978 /* 15 bit offset from the short data area pointer. */
979 HOWTO (R_V850_SDA_15_16_OFFSET
, /* Type. */
981 1, /* Size (0 = byte, 1 = short, 2 = long). */
983 FALSE
, /* PC_relative. */
985 complain_overflow_dont
, /* Complain_on_overflow. */
986 v850_elf_reloc
, /* Special_function. */
987 "R_V850_SDA_15_16_OFFSET", /* Name. */
988 FALSE
, /* Partial_inplace. */
989 0xfffe, /* Src_mask. */
990 0xfffe, /* Dst_mask. */
991 FALSE
), /* PCrel_offset. */
993 /* 16 bit offset from the zero data area pointer. */
994 HOWTO (R_V850_ZDA_16_16_OFFSET
, /* Type. */
996 1, /* Size (0 = byte, 1 = short, 2 = long). */
998 FALSE
, /* PC_relative. */
1000 complain_overflow_dont
, /* Complain_on_overflow. */
1001 v850_elf_reloc
, /* Special_function. */
1002 "R_V850_ZDA_16_16_OFFSET", /* Name. */
1003 FALSE
, /* Partial_inplace. */
1004 0xffff, /* Src_mask. */
1005 0xffff, /* Dst_mask. */
1006 FALSE
), /* PCrel_offset. */
1008 /* 15 bit offset from the zero data area pointer. */
1009 HOWTO (R_V850_ZDA_15_16_OFFSET
, /* Type. */
1010 1, /* Rightshift. */
1011 1, /* Size (0 = byte, 1 = short, 2 = long). */
1013 FALSE
, /* PC_relative. */
1015 complain_overflow_dont
, /* Complain_on_overflow. */
1016 v850_elf_reloc
, /* Special_function. */
1017 "R_V850_ZDA_15_16_OFFSET", /* Name. */
1018 FALSE
, /* Partial_inplace. */
1019 0xfffe, /* Src_mask. */
1020 0xfffe, /* Dst_mask. */
1021 FALSE
), /* PCrel_offset. */
1023 /* 6 bit offset from the tiny data area pointer. */
1024 HOWTO (R_V850_TDA_6_8_OFFSET
, /* Type. */
1025 2, /* Rightshift. */
1026 1, /* Size (0 = byte, 1 = short, 2 = long). */
1028 FALSE
, /* PC_relative. */
1030 complain_overflow_dont
, /* Complain_on_overflow. */
1031 v850_elf_reloc
, /* Special_function. */
1032 "R_V850_TDA_6_8_OFFSET", /* Name. */
1033 FALSE
, /* Partial_inplace. */
1034 0x7e, /* Src_mask. */
1035 0x7e, /* Dst_mask. */
1036 FALSE
), /* PCrel_offset. */
1038 /* 8 bit offset from the tiny data area pointer. */
1039 HOWTO (R_V850_TDA_7_8_OFFSET
, /* Type. */
1040 1, /* Rightshift. */
1041 1, /* Size (0 = byte, 1 = short, 2 = long). */
1043 FALSE
, /* PC_relative. */
1045 complain_overflow_dont
, /* Complain_on_overflow. */
1046 v850_elf_reloc
, /* Special_function. */
1047 "R_V850_TDA_7_8_OFFSET", /* Name. */
1048 FALSE
, /* Partial_inplace. */
1049 0x7f, /* Src_mask. */
1050 0x7f, /* Dst_mask. */
1051 FALSE
), /* PCrel_offset. */
1053 /* 7 bit offset from the tiny data area pointer. */
1054 HOWTO (R_V850_TDA_7_7_OFFSET
, /* Type. */
1055 0, /* Rightshift. */
1056 1, /* Size (0 = byte, 1 = short, 2 = long). */
1058 FALSE
, /* PC_relative. */
1060 complain_overflow_dont
, /* Complain_on_overflow. */
1061 v850_elf_reloc
, /* Special_function. */
1062 "R_V850_TDA_7_7_OFFSET", /* Name. */
1063 FALSE
, /* Partial_inplace. */
1064 0x7f, /* Src_mask. */
1065 0x7f, /* Dst_mask. */
1066 FALSE
), /* PCrel_offset. */
1068 /* 16 bit offset from the tiny data area pointer! */
1069 HOWTO (R_V850_TDA_16_16_OFFSET
, /* Type. */
1070 0, /* Rightshift. */
1071 1, /* Size (0 = byte, 1 = short, 2 = long). */
1073 FALSE
, /* PC_relative. */
1075 complain_overflow_dont
, /* Complain_on_overflow. */
1076 v850_elf_reloc
, /* Special_function. */
1077 "R_V850_TDA_16_16_OFFSET", /* Name. */
1078 FALSE
, /* Partial_inplace. */
1079 0xffff, /* Src_mask. */
1080 0xfff, /* Dst_mask. */
1081 FALSE
), /* PCrel_offset. */
1083 /* 5 bit offset from the tiny data area pointer. */
1084 HOWTO (R_V850_TDA_4_5_OFFSET
, /* Type. */
1085 1, /* Rightshift. */
1086 1, /* Size (0 = byte, 1 = short, 2 = long). */
1088 FALSE
, /* PC_relative. */
1090 complain_overflow_dont
, /* Complain_on_overflow. */
1091 v850_elf_reloc
, /* Special_function. */
1092 "R_V850_TDA_4_5_OFFSET", /* Name. */
1093 FALSE
, /* Partial_inplace. */
1094 0x0f, /* Src_mask. */
1095 0x0f, /* Dst_mask. */
1096 FALSE
), /* PCrel_offset. */
1098 /* 4 bit offset from the tiny data area pointer. */
1099 HOWTO (R_V850_TDA_4_4_OFFSET
, /* Type. */
1100 0, /* Rightshift. */
1101 1, /* Size (0 = byte, 1 = short, 2 = long). */
1103 FALSE
, /* PC_relative. */
1105 complain_overflow_dont
, /* Complain_on_overflow. */
1106 v850_elf_reloc
, /* Special_function. */
1107 "R_V850_TDA_4_4_OFFSET", /* Name. */
1108 FALSE
, /* Partial_inplace. */
1109 0x0f, /* Src_mask. */
1110 0x0f, /* Dst_mask. */
1111 FALSE
), /* PCrel_offset. */
1113 /* 16 bit offset from the short data area pointer. */
1114 HOWTO (R_V850_SDA_16_16_SPLIT_OFFSET
, /* Type. */
1115 0, /* Rightshift. */
1116 2, /* Size (0 = byte, 1 = short, 2 = long). */
1118 FALSE
, /* PC_relative. */
1120 complain_overflow_dont
, /* Complain_on_overflow. */
1121 v850_elf_reloc
, /* Special_function. */
1122 "R_V850_SDA_16_16_SPLIT_OFFSET",/* Name. */
1123 FALSE
, /* Partial_inplace. */
1124 0xfffe0020, /* Src_mask. */
1125 0xfffe0020, /* Dst_mask. */
1126 FALSE
), /* PCrel_offset. */
1128 /* 16 bit offset from the zero data area pointer. */
1129 HOWTO (R_V850_ZDA_16_16_SPLIT_OFFSET
, /* Type. */
1130 0, /* Rightshift. */
1131 2, /* Size (0 = byte, 1 = short, 2 = long). */
1133 FALSE
, /* PC_relative. */
1135 complain_overflow_dont
, /* Complain_on_overflow. */
1136 v850_elf_reloc
, /* Special_function. */
1137 "R_V850_ZDA_16_16_SPLIT_OFFSET",/* Name. */
1138 FALSE
, /* Partial_inplace. */
1139 0xfffe0020, /* Src_mask. */
1140 0xfffe0020, /* Dst_mask. */
1141 FALSE
), /* PCrel_offset. */
1143 /* 6 bit offset from the call table base pointer. */
1144 HOWTO (R_V850_CALLT_6_7_OFFSET
, /* Type. */
1145 0, /* Rightshift. */
1146 1, /* Size (0 = byte, 1 = short, 2 = long). */
1148 FALSE
, /* PC_relative. */
1150 complain_overflow_dont
, /* Complain_on_overflow. */
1151 v850_elf_reloc
, /* Special_function. */
1152 "R_V850_CALLT_6_7_OFFSET", /* Name. */
1153 FALSE
, /* Partial_inplace. */
1154 0x3f, /* Src_mask. */
1155 0x3f, /* Dst_mask. */
1156 FALSE
), /* PCrel_offset. */
1158 /* 16 bit offset from the call table base pointer. */
1159 HOWTO (R_V850_CALLT_16_16_OFFSET
, /* Type. */
1160 0, /* Rightshift. */
1161 1, /* Size (0 = byte, 1 = short, 2 = long). */
1163 FALSE
, /* PC_relative. */
1165 complain_overflow_dont
, /* Complain_on_overflow. */
1166 v850_elf_reloc
, /* Special_function. */
1167 "R_V850_CALLT_16_16_OFFSET", /* Name. */
1168 FALSE
, /* Partial_inplace. */
1169 0xffff, /* Src_mask. */
1170 0xffff, /* Dst_mask. */
1171 FALSE
), /* PCrel_offset. */
1173 /* GNU extension to record C++ vtable hierarchy */
1174 HOWTO (R_V850_GNU_VTINHERIT
, /* Type. */
1175 0, /* Rightshift. */
1176 2, /* Size (0 = byte, 1 = short, 2 = long). */
1178 FALSE
, /* PC_relative. */
1180 complain_overflow_dont
, /* Complain_on_overflow. */
1181 NULL
, /* Special_function. */
1182 "R_V850_GNU_VTINHERIT", /* Name. */
1183 FALSE
, /* Partial_inplace. */
1186 FALSE
), /* PCrel_offset. */
1188 /* GNU extension to record C++ vtable member usage */
1189 HOWTO (R_V850_GNU_VTENTRY
, /* Type. */
1190 0, /* Rightshift. */
1191 2, /* Size (0 = byte, 1 = short, 2 = long). */
1193 FALSE
, /* PC_relative. */
1195 complain_overflow_dont
, /* Complain_on_overflow. */
1196 _bfd_elf_rel_vtable_reloc_fn
, /* Special_function. */
1197 "R_V850_GNU_VTENTRY", /* Name. */
1198 FALSE
, /* Partial_inplace. */
1201 FALSE
), /* PCrel_offset. */
1203 /* Indicates a .longcall pseudo-op. The compiler will generate a .longcall
1204 pseudo-op when it finds a function call which can be relaxed. */
1205 HOWTO (R_V850_LONGCALL
, /* Type. */
1206 0, /* Rightshift. */
1207 2, /* Size (0 = byte, 1 = short, 2 = long). */
1209 TRUE
, /* PC_relative. */
1211 complain_overflow_signed
, /* Complain_on_overflow. */
1212 v850_elf_ignore_reloc
, /* Special_function. */
1213 "R_V850_LONGCALL", /* Name. */
1214 FALSE
, /* Partial_inplace. */
1217 TRUE
), /* PCrel_offset. */
1219 /* Indicates a .longjump pseudo-op. The compiler will generate a
1220 .longjump pseudo-op when it finds a branch which can be relaxed. */
1221 HOWTO (R_V850_LONGJUMP
, /* Type. */
1222 0, /* Rightshift. */
1223 2, /* Size (0 = byte, 1 = short, 2 = long). */
1225 TRUE
, /* PC_relative. */
1227 complain_overflow_signed
, /* Complain_on_overflow. */
1228 v850_elf_ignore_reloc
, /* Special_function. */
1229 "R_V850_LONGJUMP", /* Name. */
1230 FALSE
, /* Partial_inplace. */
1233 TRUE
), /* PCrel_offset. */
1235 HOWTO (R_V850_ALIGN
, /* Type. */
1236 0, /* Rightshift. */
1237 1, /* Size (0 = byte, 1 = short, 2 = long). */
1239 FALSE
, /* PC_relative. */
1241 complain_overflow_unsigned
, /* Complain_on_overflow. */
1242 v850_elf_ignore_reloc
, /* Special_function. */
1243 "R_V850_ALIGN", /* Name. */
1244 FALSE
, /* Partial_inplace. */
1247 TRUE
), /* PCrel_offset. */
1249 /* Simple pc-relative 32bit reloc. */
1250 HOWTO (R_V850_REL32
, /* Type. */
1251 0, /* Rightshift. */
1252 2, /* Size (0 = byte, 1 = short, 2 = long). */
1254 TRUE
, /* PC_relative. */
1256 complain_overflow_dont
, /* Complain_on_overflow. */
1257 v850_elf_reloc
, /* Special_function. */
1258 "R_V850_REL32", /* Name. */
1259 FALSE
, /* Partial_inplace. */
1260 0xffffffff, /* Src_mask. */
1261 0xffffffff, /* Dst_mask. */
1262 FALSE
), /* PCrel_offset. */
1264 /* An ld.bu version of R_V850_LO16. */
1265 HOWTO (R_V850_LO16_SPLIT_OFFSET
, /* Type. */
1266 0, /* Rightshift. */
1267 2, /* Size (0 = byte, 1 = short, 2 = long). */
1269 FALSE
, /* PC_relative. */
1271 complain_overflow_dont
, /* Complain_on_overflow. */
1272 v850_elf_reloc
, /* Special_function. */
1273 "R_V850_LO16_SPLIT_OFFSET", /* Name. */
1274 FALSE
, /* Partial_inplace. */
1275 0xfffe0020, /* Src_mask. */
1276 0xfffe0020, /* Dst_mask. */
1277 FALSE
), /* PCrel_offset. */
1280 /* Map BFD reloc types to V850 ELF reloc types. */
1282 struct v850_elf_reloc_map
1284 /* BFD_RELOC_V850_CALLT_16_16_OFFSET is 258, which will not fix in an
1286 bfd_reloc_code_real_type bfd_reloc_val
;
1287 unsigned int elf_reloc_val
;
1290 static const struct v850_elf_reloc_map v850_elf_reloc_map
[] =
1292 { BFD_RELOC_NONE
, R_V850_NONE
},
1293 { BFD_RELOC_V850_9_PCREL
, R_V850_9_PCREL
},
1294 { BFD_RELOC_V850_22_PCREL
, R_V850_22_PCREL
},
1295 { BFD_RELOC_HI16_S
, R_V850_HI16_S
},
1296 { BFD_RELOC_HI16
, R_V850_HI16
},
1297 { BFD_RELOC_LO16
, R_V850_LO16
},
1298 { BFD_RELOC_32
, R_V850_ABS32
},
1299 { BFD_RELOC_32_PCREL
, R_V850_REL32
},
1300 { BFD_RELOC_16
, R_V850_16
},
1301 { BFD_RELOC_8
, R_V850_8
},
1302 { BFD_RELOC_V850_SDA_16_16_OFFSET
, R_V850_SDA_16_16_OFFSET
},
1303 { BFD_RELOC_V850_SDA_15_16_OFFSET
, R_V850_SDA_15_16_OFFSET
},
1304 { BFD_RELOC_V850_ZDA_16_16_OFFSET
, R_V850_ZDA_16_16_OFFSET
},
1305 { BFD_RELOC_V850_ZDA_15_16_OFFSET
, R_V850_ZDA_15_16_OFFSET
},
1306 { BFD_RELOC_V850_TDA_6_8_OFFSET
, R_V850_TDA_6_8_OFFSET
},
1307 { BFD_RELOC_V850_TDA_7_8_OFFSET
, R_V850_TDA_7_8_OFFSET
},
1308 { BFD_RELOC_V850_TDA_7_7_OFFSET
, R_V850_TDA_7_7_OFFSET
},
1309 { BFD_RELOC_V850_TDA_16_16_OFFSET
, R_V850_TDA_16_16_OFFSET
},
1310 { BFD_RELOC_V850_TDA_4_5_OFFSET
, R_V850_TDA_4_5_OFFSET
},
1311 { BFD_RELOC_V850_TDA_4_4_OFFSET
, R_V850_TDA_4_4_OFFSET
},
1312 { BFD_RELOC_V850_LO16_SPLIT_OFFSET
, R_V850_LO16_SPLIT_OFFSET
},
1313 { BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET
, R_V850_SDA_16_16_SPLIT_OFFSET
},
1314 { BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET
, R_V850_ZDA_16_16_SPLIT_OFFSET
},
1315 { BFD_RELOC_V850_CALLT_6_7_OFFSET
, R_V850_CALLT_6_7_OFFSET
},
1316 { BFD_RELOC_V850_CALLT_16_16_OFFSET
, R_V850_CALLT_16_16_OFFSET
},
1317 { BFD_RELOC_VTABLE_INHERIT
, R_V850_GNU_VTINHERIT
},
1318 { BFD_RELOC_VTABLE_ENTRY
, R_V850_GNU_VTENTRY
},
1319 { BFD_RELOC_V850_LONGCALL
, R_V850_LONGCALL
},
1320 { BFD_RELOC_V850_LONGJUMP
, R_V850_LONGJUMP
},
1321 { BFD_RELOC_V850_ALIGN
, R_V850_ALIGN
},
1325 /* Map a bfd relocation into the appropriate howto structure. */
1327 static reloc_howto_type
*
1328 v850_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1329 bfd_reloc_code_real_type code
)
1333 for (i
= ARRAY_SIZE (v850_elf_reloc_map
); i
--;)
1334 if (v850_elf_reloc_map
[i
].bfd_reloc_val
== code
)
1336 unsigned int elf_reloc_val
= v850_elf_reloc_map
[i
].elf_reloc_val
;
1338 BFD_ASSERT (v850_elf_howto_table
[elf_reloc_val
].type
== elf_reloc_val
);
1340 return v850_elf_howto_table
+ elf_reloc_val
;
1346 static reloc_howto_type
*
1347 v850_elf_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1353 i
< sizeof (v850_elf_howto_table
) / sizeof (v850_elf_howto_table
[0]);
1355 if (v850_elf_howto_table
[i
].name
!= NULL
1356 && strcasecmp (v850_elf_howto_table
[i
].name
, r_name
) == 0)
1357 return &v850_elf_howto_table
[i
];
1362 /* Set the howto pointer for an V850 ELF reloc. */
1365 v850_elf_info_to_howto_rel (bfd
*abfd ATTRIBUTE_UNUSED
,
1367 Elf_Internal_Rela
*dst
)
1369 unsigned int r_type
;
1371 r_type
= ELF32_R_TYPE (dst
->r_info
);
1372 BFD_ASSERT (r_type
< (unsigned int) R_V850_max
);
1373 cache_ptr
->howto
= &v850_elf_howto_table
[r_type
];
1376 /* Set the howto pointer for a V850 ELF reloc (type RELA). */
1379 v850_elf_info_to_howto_rela (bfd
*abfd ATTRIBUTE_UNUSED
,
1380 arelent
* cache_ptr
,
1381 Elf_Internal_Rela
*dst
)
1383 unsigned int r_type
;
1385 r_type
= ELF32_R_TYPE (dst
->r_info
);
1386 BFD_ASSERT (r_type
< (unsigned int) R_V850_max
);
1387 cache_ptr
->howto
= &v850_elf_howto_table
[r_type
];
1391 v850_elf_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
, const char *name
)
1393 return ( (name
[0] == '.' && (name
[1] == 'L' || name
[1] == '.'))
1394 || (name
[0] == '_' && name
[1] == '.' && name
[2] == 'L' && name
[3] == '_'));
1397 /* We overload some of the bfd_reloc error codes for own purposes. */
1398 #define bfd_reloc_gp_not_found bfd_reloc_other
1399 #define bfd_reloc_ep_not_found bfd_reloc_continue
1400 #define bfd_reloc_ctbp_not_found (bfd_reloc_dangerous + 1)
1402 /* Perform a relocation as part of a final link. */
1404 static bfd_reloc_status_type
1405 v850_elf_final_link_relocate (reloc_howto_type
*howto
,
1407 bfd
*output_bfd ATTRIBUTE_UNUSED
,
1408 asection
*input_section
,
1413 struct bfd_link_info
*info
,
1415 int is_local ATTRIBUTE_UNUSED
)
1417 unsigned int r_type
= howto
->type
;
1418 bfd_byte
*hit_data
= contents
+ offset
;
1420 /* Adjust the value according to the relocation. */
1423 case R_V850_9_PCREL
:
1424 value
-= (input_section
->output_section
->vma
1425 + input_section
->output_offset
);
1429 case R_V850_22_PCREL
:
1430 value
-= (input_section
->output_section
->vma
1431 + input_section
->output_offset
1434 /* If the sign extension will corrupt the value then we have overflowed. */
1435 if (((value
& 0xff000000) != 0x0) && ((value
& 0xff000000) != 0xff000000))
1436 return bfd_reloc_overflow
;
1438 /* Only the bottom 24 bits of the PC are valid. */
1439 value
= SEXT24 (value
);
1443 value
-= (input_section
->output_section
->vma
1444 + input_section
->output_offset
1451 case R_V850_LO16_SPLIT_OFFSET
:
1457 case R_V850_ZDA_15_16_OFFSET
:
1458 case R_V850_ZDA_16_16_OFFSET
:
1459 case R_V850_ZDA_16_16_SPLIT_OFFSET
:
1460 if (sym_sec
== NULL
)
1461 return bfd_reloc_undefined
;
1463 value
-= sym_sec
->output_section
->vma
;
1466 case R_V850_SDA_15_16_OFFSET
:
1467 case R_V850_SDA_16_16_OFFSET
:
1468 case R_V850_SDA_16_16_SPLIT_OFFSET
:
1471 struct bfd_link_hash_entry
* h
;
1473 if (sym_sec
== NULL
)
1474 return bfd_reloc_undefined
;
1476 /* Get the value of __gp. */
1477 h
= bfd_link_hash_lookup (info
->hash
, "__gp", FALSE
, FALSE
, TRUE
);
1479 || h
->type
!= bfd_link_hash_defined
)
1480 return bfd_reloc_gp_not_found
;
1482 gp
= (h
->u
.def
.value
1483 + h
->u
.def
.section
->output_section
->vma
1484 + h
->u
.def
.section
->output_offset
);
1486 value
-= sym_sec
->output_section
->vma
;
1487 value
-= (gp
- sym_sec
->output_section
->vma
);
1491 case R_V850_TDA_4_4_OFFSET
:
1492 case R_V850_TDA_4_5_OFFSET
:
1493 case R_V850_TDA_16_16_OFFSET
:
1494 case R_V850_TDA_7_7_OFFSET
:
1495 case R_V850_TDA_7_8_OFFSET
:
1496 case R_V850_TDA_6_8_OFFSET
:
1499 struct bfd_link_hash_entry
* h
;
1501 /* Get the value of __ep. */
1502 h
= bfd_link_hash_lookup (info
->hash
, "__ep", FALSE
, FALSE
, TRUE
);
1504 || h
->type
!= bfd_link_hash_defined
)
1505 return bfd_reloc_ep_not_found
;
1507 ep
= (h
->u
.def
.value
1508 + h
->u
.def
.section
->output_section
->vma
1509 + h
->u
.def
.section
->output_offset
);
1515 case R_V850_CALLT_6_7_OFFSET
:
1518 struct bfd_link_hash_entry
* h
;
1520 /* Get the value of __ctbp. */
1521 h
= bfd_link_hash_lookup (info
->hash
, "__ctbp", FALSE
, FALSE
, TRUE
);
1523 || h
->type
!= bfd_link_hash_defined
)
1524 return bfd_reloc_ctbp_not_found
;
1526 ctbp
= (h
->u
.def
.value
1527 + h
->u
.def
.section
->output_section
->vma
1528 + h
->u
.def
.section
->output_offset
);
1533 case R_V850_CALLT_16_16_OFFSET
:
1536 struct bfd_link_hash_entry
* h
;
1538 if (sym_sec
== NULL
)
1539 return bfd_reloc_undefined
;
1541 /* Get the value of __ctbp. */
1542 h
= bfd_link_hash_lookup (info
->hash
, "__ctbp", FALSE
, FALSE
, TRUE
);
1544 || h
->type
!= bfd_link_hash_defined
)
1545 return bfd_reloc_ctbp_not_found
;
1547 ctbp
= (h
->u
.def
.value
1548 + h
->u
.def
.section
->output_section
->vma
1549 + h
->u
.def
.section
->output_offset
);
1551 value
-= sym_sec
->output_section
->vma
;
1552 value
-= (ctbp
- sym_sec
->output_section
->vma
);
1557 case R_V850_GNU_VTINHERIT
:
1558 case R_V850_GNU_VTENTRY
:
1559 case R_V850_LONGCALL
:
1560 case R_V850_LONGJUMP
:
1562 return bfd_reloc_ok
;
1565 return bfd_reloc_notsupported
;
1568 /* Perform the relocation. */
1569 return v850_elf_perform_relocation (input_bfd
, r_type
, value
+ addend
, hit_data
);
1572 /* Relocate an V850 ELF section. */
1575 v850_elf_relocate_section (bfd
*output_bfd
,
1576 struct bfd_link_info
*info
,
1578 asection
*input_section
,
1580 Elf_Internal_Rela
*relocs
,
1581 Elf_Internal_Sym
*local_syms
,
1582 asection
**local_sections
)
1584 Elf_Internal_Shdr
*symtab_hdr
;
1585 struct elf_link_hash_entry
**sym_hashes
;
1586 Elf_Internal_Rela
*rel
;
1587 Elf_Internal_Rela
*relend
;
1589 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
1590 sym_hashes
= elf_sym_hashes (input_bfd
);
1592 /* Reset the list of remembered HI16S relocs to empty. */
1593 free_hi16s
= previous_hi16s
;
1594 previous_hi16s
= NULL
;
1598 relend
= relocs
+ input_section
->reloc_count
;
1599 for (; rel
< relend
; rel
++)
1602 reloc_howto_type
*howto
;
1603 unsigned long r_symndx
;
1604 Elf_Internal_Sym
*sym
;
1606 struct elf_link_hash_entry
*h
;
1608 bfd_reloc_status_type r
;
1610 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1611 r_type
= ELF32_R_TYPE (rel
->r_info
);
1613 if (r_type
== R_V850_GNU_VTENTRY
1614 || r_type
== R_V850_GNU_VTINHERIT
)
1617 howto
= v850_elf_howto_table
+ r_type
;
1621 if (r_symndx
< symtab_hdr
->sh_info
)
1623 sym
= local_syms
+ r_symndx
;
1624 sec
= local_sections
[r_symndx
];
1625 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
1629 bfd_boolean unresolved_reloc
, warned
;
1631 /* Note - this check is delayed until now as it is possible and
1632 valid to have a file without any symbols but with relocs that
1633 can be processed. */
1634 if (sym_hashes
== NULL
)
1636 info
->callbacks
->warning
1637 (info
, "no hash table available",
1638 NULL
, input_bfd
, input_section
, (bfd_vma
) 0);
1643 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
1644 r_symndx
, symtab_hdr
, sym_hashes
,
1646 unresolved_reloc
, warned
);
1649 if (sec
!= NULL
&& elf_discarded_section (sec
))
1651 /* For relocs against symbols from removed linkonce sections,
1652 or sections discarded by a linker script, we just want the
1653 section contents zeroed. Avoid any special processing. */
1654 _bfd_clear_contents (howto
, input_bfd
, contents
+ rel
->r_offset
);
1660 if (info
->relocatable
)
1663 /* FIXME: We should use the addend, but the COFF relocations don't. */
1664 r
= v850_elf_final_link_relocate (howto
, input_bfd
, output_bfd
,
1666 contents
, rel
->r_offset
,
1667 relocation
, rel
->r_addend
,
1668 info
, sec
, h
== NULL
);
1670 if (r
!= bfd_reloc_ok
)
1673 const char * msg
= NULL
;
1676 name
= h
->root
.root
.string
;
1679 name
= (bfd_elf_string_from_elf_section
1680 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
1681 if (name
== NULL
|| *name
== '\0')
1682 name
= bfd_section_name (input_bfd
, sec
);
1687 case bfd_reloc_overflow
:
1688 if (! ((*info
->callbacks
->reloc_overflow
)
1689 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
1690 (bfd_vma
) 0, input_bfd
, input_section
,
1695 case bfd_reloc_undefined
:
1696 if (! ((*info
->callbacks
->undefined_symbol
)
1697 (info
, name
, input_bfd
, input_section
,
1698 rel
->r_offset
, TRUE
)))
1702 case bfd_reloc_outofrange
:
1703 msg
= _("internal error: out of range error");
1706 case bfd_reloc_notsupported
:
1707 msg
= _("internal error: unsupported relocation error");
1710 case bfd_reloc_dangerous
:
1711 msg
= _("internal error: dangerous relocation");
1714 case bfd_reloc_gp_not_found
:
1715 msg
= _("could not locate special linker symbol __gp");
1718 case bfd_reloc_ep_not_found
:
1719 msg
= _("could not locate special linker symbol __ep");
1722 case bfd_reloc_ctbp_not_found
:
1723 msg
= _("could not locate special linker symbol __ctbp");
1727 msg
= _("internal error: unknown error");
1731 if (!((*info
->callbacks
->warning
)
1732 (info
, msg
, name
, input_bfd
, input_section
,
1744 v850_elf_gc_mark_hook (asection
*sec
,
1745 struct bfd_link_info
*info
,
1746 Elf_Internal_Rela
*rel
,
1747 struct elf_link_hash_entry
*h
,
1748 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 return _bfd_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
);
1761 /* Set the right machine number. */
1764 v850_elf_object_p (bfd
*abfd
)
1766 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1770 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850
);
1773 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e
);
1776 bfd_default_set_arch_mach (abfd
, bfd_arch_v850
, bfd_mach_v850e1
);
1782 /* Store the machine number in the flags field. */
1785 v850_elf_final_write_processing (bfd
*abfd
,
1786 bfd_boolean linker ATTRIBUTE_UNUSED
)
1790 switch (bfd_get_mach (abfd
))
1793 case bfd_mach_v850
: val
= E_V850_ARCH
; break;
1794 case bfd_mach_v850e
: val
= E_V850E_ARCH
; break;
1795 case bfd_mach_v850e1
: val
= E_V850E1_ARCH
; break;
1798 elf_elfheader (abfd
)->e_flags
&=~ EF_V850_ARCH
;
1799 elf_elfheader (abfd
)->e_flags
|= val
;
1802 /* Function to keep V850 specific file flags. */
1805 v850_elf_set_private_flags (bfd
*abfd
, flagword flags
)
1807 BFD_ASSERT (!elf_flags_init (abfd
)
1808 || elf_elfheader (abfd
)->e_flags
== flags
);
1810 elf_elfheader (abfd
)->e_flags
= flags
;
1811 elf_flags_init (abfd
) = TRUE
;
1815 /* Merge backend specific data from an object file
1816 to the output object file when linking. */
1819 v850_elf_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1824 if ( bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1825 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1828 in_flags
= elf_elfheader (ibfd
)->e_flags
;
1829 out_flags
= elf_elfheader (obfd
)->e_flags
;
1831 if (! elf_flags_init (obfd
))
1833 /* If the input is the default architecture then do not
1834 bother setting the flags for the output architecture,
1835 instead allow future merges to do this. If no future
1836 merges ever set these flags then they will retain their
1837 unitialised values, which surprise surprise, correspond
1838 to the default values. */
1839 if (bfd_get_arch_info (ibfd
)->the_default
)
1842 elf_flags_init (obfd
) = TRUE
;
1843 elf_elfheader (obfd
)->e_flags
= in_flags
;
1845 if (bfd_get_arch (obfd
) == bfd_get_arch (ibfd
)
1846 && bfd_get_arch_info (obfd
)->the_default
)
1847 return bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
), bfd_get_mach (ibfd
));
1852 /* Check flag compatibility. */
1853 if (in_flags
== out_flags
)
1856 if ((in_flags
& EF_V850_ARCH
) != (out_flags
& EF_V850_ARCH
)
1857 && (in_flags
& EF_V850_ARCH
) != E_V850_ARCH
)
1859 /* Allow v850e1 binaries to be linked with v850e binaries.
1860 Set the output binary to v850e. */
1861 if ((in_flags
& EF_V850_ARCH
) == E_V850E1_ARCH
1862 && (out_flags
& EF_V850_ARCH
) == E_V850E_ARCH
)
1865 if ((in_flags
& EF_V850_ARCH
) == E_V850E_ARCH
1866 && (out_flags
& EF_V850_ARCH
) == E_V850E1_ARCH
)
1868 elf_elfheader (obfd
)->e_flags
=
1869 ((out_flags
& ~ EF_V850_ARCH
) | E_V850E_ARCH
);
1873 _bfd_error_handler (_("%B: Architecture mismatch with previous modules"),
1880 /* Display the flags field. */
1883 v850_elf_print_private_bfd_data (bfd
*abfd
, void * ptr
)
1885 FILE * file
= (FILE *) ptr
;
1887 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
1889 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
1891 /* xgettext:c-format */
1892 fprintf (file
, _("private flags = %lx: "), elf_elfheader (abfd
)->e_flags
);
1894 switch (elf_elfheader (abfd
)->e_flags
& EF_V850_ARCH
)
1897 case E_V850_ARCH
: fprintf (file
, _("v850 architecture")); break;
1898 case E_V850E_ARCH
: fprintf (file
, _("v850e architecture")); break;
1899 case E_V850E1_ARCH
: fprintf (file
, _("v850e1 architecture")); break;
1907 /* V850 ELF uses four common sections. One is the usual one, and the
1908 others are for (small) objects in one of the special data areas:
1909 small, tiny and zero. All the objects are kept together, and then
1910 referenced via the gp register, the ep register or the r0 register
1911 respectively, which yields smaller, faster assembler code. This
1912 approach is copied from elf32-mips.c. */
1914 static asection v850_elf_scom_section
;
1915 static asymbol v850_elf_scom_symbol
;
1916 static asymbol
* v850_elf_scom_symbol_ptr
;
1917 static asection v850_elf_tcom_section
;
1918 static asymbol v850_elf_tcom_symbol
;
1919 static asymbol
* v850_elf_tcom_symbol_ptr
;
1920 static asection v850_elf_zcom_section
;
1921 static asymbol v850_elf_zcom_symbol
;
1922 static asymbol
* v850_elf_zcom_symbol_ptr
;
1924 /* Given a BFD section, try to locate the
1925 corresponding ELF section index. */
1928 v850_elf_section_from_bfd_section (bfd
*abfd ATTRIBUTE_UNUSED
,
1932 if (strcmp (bfd_get_section_name (abfd
, sec
), ".scommon") == 0)
1933 *retval
= SHN_V850_SCOMMON
;
1934 else if (strcmp (bfd_get_section_name (abfd
, sec
), ".tcommon") == 0)
1935 *retval
= SHN_V850_TCOMMON
;
1936 else if (strcmp (bfd_get_section_name (abfd
, sec
), ".zcommon") == 0)
1937 *retval
= SHN_V850_ZCOMMON
;
1944 /* Handle the special V850 section numbers that a symbol may use. */
1947 v850_elf_symbol_processing (bfd
*abfd
, asymbol
*asym
)
1949 elf_symbol_type
* elfsym
= (elf_symbol_type
*) asym
;
1952 indx
= elfsym
->internal_elf_sym
.st_shndx
;
1954 /* If the section index is an "ordinary" index, then it may
1955 refer to a v850 specific section created by the assembler.
1956 Check the section's type and change the index it matches.
1958 FIXME: Should we alter the st_shndx field as well ? */
1960 if (indx
< elf_numsections (abfd
))
1961 switch (elf_elfsections(abfd
)[indx
]->sh_type
)
1963 case SHT_V850_SCOMMON
:
1964 indx
= SHN_V850_SCOMMON
;
1967 case SHT_V850_TCOMMON
:
1968 indx
= SHN_V850_TCOMMON
;
1971 case SHT_V850_ZCOMMON
:
1972 indx
= SHN_V850_ZCOMMON
;
1981 case SHN_V850_SCOMMON
:
1982 if (v850_elf_scom_section
.name
== NULL
)
1984 /* Initialize the small common section. */
1985 v850_elf_scom_section
.name
= ".scommon";
1986 v850_elf_scom_section
.flags
= SEC_IS_COMMON
| SEC_ALLOC
| SEC_DATA
;
1987 v850_elf_scom_section
.output_section
= & v850_elf_scom_section
;
1988 v850_elf_scom_section
.symbol
= & v850_elf_scom_symbol
;
1989 v850_elf_scom_section
.symbol_ptr_ptr
= & v850_elf_scom_symbol_ptr
;
1990 v850_elf_scom_symbol
.name
= ".scommon";
1991 v850_elf_scom_symbol
.flags
= BSF_SECTION_SYM
;
1992 v850_elf_scom_symbol
.section
= & v850_elf_scom_section
;
1993 v850_elf_scom_symbol_ptr
= & v850_elf_scom_symbol
;
1995 asym
->section
= & v850_elf_scom_section
;
1996 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
1999 case SHN_V850_TCOMMON
:
2000 if (v850_elf_tcom_section
.name
== NULL
)
2002 /* Initialize the tcommon section. */
2003 v850_elf_tcom_section
.name
= ".tcommon";
2004 v850_elf_tcom_section
.flags
= SEC_IS_COMMON
;
2005 v850_elf_tcom_section
.output_section
= & v850_elf_tcom_section
;
2006 v850_elf_tcom_section
.symbol
= & v850_elf_tcom_symbol
;
2007 v850_elf_tcom_section
.symbol_ptr_ptr
= & v850_elf_tcom_symbol_ptr
;
2008 v850_elf_tcom_symbol
.name
= ".tcommon";
2009 v850_elf_tcom_symbol
.flags
= BSF_SECTION_SYM
;
2010 v850_elf_tcom_symbol
.section
= & v850_elf_tcom_section
;
2011 v850_elf_tcom_symbol_ptr
= & v850_elf_tcom_symbol
;
2013 asym
->section
= & v850_elf_tcom_section
;
2014 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
2017 case SHN_V850_ZCOMMON
:
2018 if (v850_elf_zcom_section
.name
== NULL
)
2020 /* Initialize the zcommon section. */
2021 v850_elf_zcom_section
.name
= ".zcommon";
2022 v850_elf_zcom_section
.flags
= SEC_IS_COMMON
;
2023 v850_elf_zcom_section
.output_section
= & v850_elf_zcom_section
;
2024 v850_elf_zcom_section
.symbol
= & v850_elf_zcom_symbol
;
2025 v850_elf_zcom_section
.symbol_ptr_ptr
= & v850_elf_zcom_symbol_ptr
;
2026 v850_elf_zcom_symbol
.name
= ".zcommon";
2027 v850_elf_zcom_symbol
.flags
= BSF_SECTION_SYM
;
2028 v850_elf_zcom_symbol
.section
= & v850_elf_zcom_section
;
2029 v850_elf_zcom_symbol_ptr
= & v850_elf_zcom_symbol
;
2031 asym
->section
= & v850_elf_zcom_section
;
2032 asym
->value
= elfsym
->internal_elf_sym
.st_size
;
2037 /* Hook called by the linker routine which adds symbols from an object
2038 file. We must handle the special v850 section numbers here. */
2041 v850_elf_add_symbol_hook (bfd
*abfd
,
2042 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
2043 Elf_Internal_Sym
*sym
,
2044 const char **namep ATTRIBUTE_UNUSED
,
2045 flagword
*flagsp ATTRIBUTE_UNUSED
,
2049 unsigned int indx
= sym
->st_shndx
;
2051 /* If the section index is an "ordinary" index, then it may
2052 refer to a v850 specific section created by the assembler.
2053 Check the section's type and change the index it matches.
2055 FIXME: Should we alter the st_shndx field as well ? */
2057 if (indx
< elf_numsections (abfd
))
2058 switch (elf_elfsections(abfd
)[indx
]->sh_type
)
2060 case SHT_V850_SCOMMON
:
2061 indx
= SHN_V850_SCOMMON
;
2064 case SHT_V850_TCOMMON
:
2065 indx
= SHN_V850_TCOMMON
;
2068 case SHT_V850_ZCOMMON
:
2069 indx
= SHN_V850_ZCOMMON
;
2078 case SHN_V850_SCOMMON
:
2079 *secp
= bfd_make_section_old_way (abfd
, ".scommon");
2080 (*secp
)->flags
|= SEC_IS_COMMON
;
2081 *valp
= sym
->st_size
;
2084 case SHN_V850_TCOMMON
:
2085 *secp
= bfd_make_section_old_way (abfd
, ".tcommon");
2086 (*secp
)->flags
|= SEC_IS_COMMON
;
2087 *valp
= sym
->st_size
;
2090 case SHN_V850_ZCOMMON
:
2091 *secp
= bfd_make_section_old_way (abfd
, ".zcommon");
2092 (*secp
)->flags
|= SEC_IS_COMMON
;
2093 *valp
= sym
->st_size
;
2101 v850_elf_link_output_symbol_hook (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
2102 const char *name ATTRIBUTE_UNUSED
,
2103 Elf_Internal_Sym
*sym
,
2104 asection
*input_sec
,
2105 struct elf_link_hash_entry
*h ATTRIBUTE_UNUSED
)
2107 /* If we see a common symbol, which implies a relocatable link, then
2108 if a symbol was in a special common section in an input file, mark
2109 it as a special common in the output file. */
2111 if (sym
->st_shndx
== SHN_COMMON
)
2113 if (strcmp (input_sec
->name
, ".scommon") == 0)
2114 sym
->st_shndx
= SHN_V850_SCOMMON
;
2115 else if (strcmp (input_sec
->name
, ".tcommon") == 0)
2116 sym
->st_shndx
= SHN_V850_TCOMMON
;
2117 else if (strcmp (input_sec
->name
, ".zcommon") == 0)
2118 sym
->st_shndx
= SHN_V850_ZCOMMON
;
2121 /* The price we pay for using h->other unused bits as flags in the
2122 linker is cleaning up after ourselves. */
2124 sym
->st_other
&= ~(V850_OTHER_SDA
| V850_OTHER_ZDA
| V850_OTHER_TDA
2125 | V850_OTHER_ERROR
);
2131 v850_elf_section_from_shdr (bfd
*abfd
,
2132 Elf_Internal_Shdr
*hdr
,
2136 /* There ought to be a place to keep ELF backend specific flags, but
2137 at the moment there isn't one. We just keep track of the
2138 sections by their name, instead. */
2140 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
2143 switch (hdr
->sh_type
)
2145 case SHT_V850_SCOMMON
:
2146 case SHT_V850_TCOMMON
:
2147 case SHT_V850_ZCOMMON
:
2148 if (! bfd_set_section_flags (abfd
, hdr
->bfd_section
,
2149 (bfd_get_section_flags (abfd
,
2158 /* Set the correct type for a V850 ELF section. We do this
2159 by the section name, which is a hack, but ought to work. */
2162 v850_elf_fake_sections (bfd
*abfd ATTRIBUTE_UNUSED
,
2163 Elf_Internal_Shdr
*hdr
,
2168 name
= bfd_get_section_name (abfd
, sec
);
2170 if (strcmp (name
, ".scommon") == 0)
2171 hdr
->sh_type
= SHT_V850_SCOMMON
;
2172 else if (strcmp (name
, ".tcommon") == 0)
2173 hdr
->sh_type
= SHT_V850_TCOMMON
;
2174 else if (strcmp (name
, ".zcommon") == 0)
2175 hdr
->sh_type
= SHT_V850_ZCOMMON
;
2180 /* Delete some bytes from a section while relaxing. */
2183 v850_elf_relax_delete_bytes (bfd
*abfd
,
2189 Elf_Internal_Shdr
*symtab_hdr
;
2190 Elf32_External_Sym
*extsyms
;
2191 Elf32_External_Sym
*esym
;
2192 Elf32_External_Sym
*esymend
;
2194 unsigned int sec_shndx
;
2196 Elf_Internal_Rela
*irel
;
2197 Elf_Internal_Rela
*irelend
;
2198 struct elf_link_hash_entry
*sym_hash
;
2199 Elf_Internal_Shdr
*shndx_hdr
;
2200 Elf_External_Sym_Shndx
*shndx
;
2202 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2203 extsyms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
2205 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
2207 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2209 /* The deletion must stop at the next ALIGN reloc for an alignment
2210 power larger than the number of bytes we are deleting. */
2212 /* Actually delete the bytes. */
2213 #if (DEBUG_RELAX & 2)
2214 fprintf (stderr
, "relax_delete: contents: sec: %s %p .. %p %x\n",
2215 sec
->name
, addr
, toaddr
, count
);
2217 memmove (contents
+ addr
, contents
+ addr
+ count
,
2218 toaddr
- addr
- count
);
2219 memset (contents
+ toaddr
-count
, 0, count
);
2221 /* Adjust all the relocs. */
2222 irel
= elf_section_data (sec
)->relocs
;
2223 irelend
= irel
+ sec
->reloc_count
;
2224 shndx_hdr
= &elf_tdata (abfd
)->symtab_shndx_hdr
;
2225 shndx
= (Elf_External_Sym_Shndx
*) shndx_hdr
->contents
;
2227 for (; irel
< irelend
; irel
++)
2229 bfd_vma raddr
, paddr
, symval
;
2230 Elf_Internal_Sym isym
;
2232 /* Get the new reloc address. */
2233 raddr
= irel
->r_offset
;
2234 if ((raddr
>= (addr
+ count
) && raddr
< toaddr
))
2235 irel
->r_offset
-= count
;
2237 if (raddr
>= addr
&& raddr
< addr
+ count
)
2239 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
),
2244 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_ALIGN
)
2247 bfd_elf32_swap_symbol_in (abfd
,
2248 extsyms
+ ELF32_R_SYM (irel
->r_info
),
2249 shndx
? shndx
+ ELF32_R_SYM (irel
->r_info
) : NULL
,
2252 if (isym
.st_shndx
!= sec_shndx
)
2255 /* Get the value of the symbol referred to by the reloc. */
2256 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2258 symval
= isym
.st_value
;
2259 #if (DEBUG_RELAX & 2)
2261 char * name
= bfd_elf_string_from_elf_section
2262 (abfd
, symtab_hdr
->sh_link
, isym
.st_name
);
2264 "relax_delete: local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2265 sec
->name
, name
, isym
.st_name
,
2266 sec
->output_section
->vma
, sec
->output_offset
,
2267 isym
.st_value
, irel
->r_addend
);
2274 struct elf_link_hash_entry
* h
;
2276 /* An external symbol. */
2277 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
2279 h
= elf_sym_hashes (abfd
) [indx
];
2280 BFD_ASSERT (h
!= NULL
);
2282 symval
= h
->root
.u
.def
.value
;
2283 #if (DEBUG_RELAX & 2)
2285 "relax_delete: defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2286 sec
->name
, h
->root
.root
.string
, h
->root
.u
.def
.value
,
2287 sec
->output_section
->vma
, sec
->output_offset
, irel
->r_addend
);
2291 paddr
= symval
+ irel
->r_addend
;
2293 if ( (symval
>= addr
+ count
&& symval
< toaddr
)
2294 && (paddr
< addr
+ count
|| paddr
>= toaddr
))
2295 irel
->r_addend
+= count
;
2296 else if ( (symval
< addr
+ count
|| symval
>= toaddr
)
2297 && (paddr
>= addr
+ count
&& paddr
< toaddr
))
2298 irel
->r_addend
-= count
;
2301 /* Adjust the local symbols defined in this section. */
2303 esymend
= esym
+ symtab_hdr
->sh_info
;
2305 for (; esym
< esymend
; esym
++, shndx
= (shndx
? shndx
+ 1 : NULL
))
2307 Elf_Internal_Sym isym
;
2309 bfd_elf32_swap_symbol_in (abfd
, esym
, shndx
, & isym
);
2311 if (isym
.st_shndx
== sec_shndx
2312 && isym
.st_value
>= addr
+ count
2313 && isym
.st_value
< toaddr
)
2315 isym
.st_value
-= count
;
2317 if (isym
.st_value
+ isym
.st_size
>= toaddr
)
2318 isym
.st_size
+= count
;
2320 bfd_elf32_swap_symbol_out (abfd
, & isym
, esym
, shndx
);
2322 else if (isym
.st_shndx
== sec_shndx
2323 && isym
.st_value
< addr
+ count
)
2325 if (isym
.st_value
+isym
.st_size
>= addr
+ count
2326 && isym
.st_value
+isym
.st_size
< toaddr
)
2327 isym
.st_size
-= count
;
2329 if (isym
.st_value
>= addr
2330 && isym
.st_value
< addr
+ count
)
2331 isym
.st_value
= addr
;
2333 bfd_elf32_swap_symbol_out (abfd
, & isym
, esym
, shndx
);
2337 /* Now adjust the global symbols defined in this section. */
2338 esym
= extsyms
+ symtab_hdr
->sh_info
;
2339 esymend
= extsyms
+ (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
));
2341 for (index
= 0; esym
< esymend
; esym
++, index
++)
2343 Elf_Internal_Sym isym
;
2345 bfd_elf32_swap_symbol_in (abfd
, esym
, shndx
, & isym
);
2346 sym_hash
= elf_sym_hashes (abfd
) [index
];
2348 if (isym
.st_shndx
== sec_shndx
2349 && ((sym_hash
)->root
.type
== bfd_link_hash_defined
2350 || (sym_hash
)->root
.type
== bfd_link_hash_defweak
)
2351 && (sym_hash
)->root
.u
.def
.section
== sec
2352 && (sym_hash
)->root
.u
.def
.value
>= addr
+ count
2353 && (sym_hash
)->root
.u
.def
.value
< toaddr
)
2355 if ((sym_hash
)->root
.u
.def
.value
+ isym
.st_size
>= toaddr
)
2357 isym
.st_size
+= count
;
2358 bfd_elf32_swap_symbol_out (abfd
, & isym
, esym
, shndx
);
2361 (sym_hash
)->root
.u
.def
.value
-= count
;
2363 else if (isym
.st_shndx
== sec_shndx
2364 && ((sym_hash
)->root
.type
== bfd_link_hash_defined
2365 || (sym_hash
)->root
.type
== bfd_link_hash_defweak
)
2366 && (sym_hash
)->root
.u
.def
.section
== sec
2367 && (sym_hash
)->root
.u
.def
.value
< addr
+ count
)
2369 if ((sym_hash
)->root
.u
.def
.value
+isym
.st_size
>= addr
+ count
2370 && (sym_hash
)->root
.u
.def
.value
+isym
.st_size
< toaddr
)
2371 isym
.st_size
-= count
;
2373 if ((sym_hash
)->root
.u
.def
.value
>= addr
2374 && (sym_hash
)->root
.u
.def
.value
< addr
+ count
)
2375 (sym_hash
)->root
.u
.def
.value
= addr
;
2377 bfd_elf32_swap_symbol_out (abfd
, & isym
, esym
, shndx
);
2387 #define NOP_OPCODE (0x0000)
2388 #define MOVHI 0x0640 /* 4byte */
2389 #define MOVHI_MASK 0x07e0
2390 #define MOVHI_R1(insn) ((insn) & 0x1f) /* 4byte */
2391 #define MOVHI_R2(insn) ((insn) >> 11)
2392 #define MOVEA 0x0620 /* 2byte */
2393 #define MOVEA_MASK 0x07e0
2394 #define MOVEA_R1(insn) ((insn) & 0x1f)
2395 #define MOVEA_R2(insn) ((insn) >> 11)
2396 #define JARL_4 0x00040780 /* 4byte */
2397 #define JARL_4_MASK 0xFFFF07FF
2398 #define JARL_R2(insn) (int)(((insn) & (~JARL_4_MASK)) >> 11)
2399 #define ADD_I 0x0240 /* 2byte */
2400 #define ADD_I_MASK 0x07e0
2401 #define ADD_I5(insn) ((((insn) & 0x001f) << 11) >> 11) /* 2byte */
2402 #define ADD_R2(insn) ((insn) >> 11)
2403 #define JMP_R 0x0060 /* 2byte */
2404 #define JMP_R_MASK 0xFFE0
2405 #define JMP_R1(insn) ((insn) & 0x1f)
2408 v850_elf_relax_section (bfd
*abfd
,
2410 struct bfd_link_info
*link_info
,
2413 Elf_Internal_Shdr
*symtab_hdr
;
2414 Elf_Internal_Rela
*internal_relocs
;
2415 Elf_Internal_Rela
*irel
;
2416 Elf_Internal_Rela
*irelend
;
2417 Elf_Internal_Rela
*irelalign
= NULL
;
2418 Elf_Internal_Sym
*isymbuf
= NULL
;
2419 bfd_byte
*contents
= NULL
;
2422 int align_pad_size
= 0;
2423 bfd_boolean result
= TRUE
;
2427 if (link_info
->relocatable
2428 || (sec
->flags
& SEC_RELOC
) == 0
2429 || sec
->reloc_count
== 0)
2432 symtab_hdr
= & elf_tdata (abfd
)->symtab_hdr
;
2434 internal_relocs
= (_bfd_elf_link_read_relocs
2435 (abfd
, sec
, NULL
, NULL
, link_info
->keep_memory
));
2436 if (internal_relocs
== NULL
)
2439 irelend
= internal_relocs
+ sec
->reloc_count
;
2441 while (addr
< sec
->size
)
2445 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2446 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_ALIGN
2447 && irel
->r_offset
> addr
2448 && irel
->r_offset
< toaddr
)
2449 toaddr
= irel
->r_offset
;
2452 fprintf (stderr
, "relax region 0x%x to 0x%x align pad %d\n",
2453 addr
, toaddr
, align_pad_size
);
2458 bfd_vma alignmoveto
;
2460 alignmoveto
= BFD_ALIGN (addr
- align_pad_size
, 1 << irelalign
->r_addend
);
2461 alignto
= BFD_ALIGN (addr
, 1 << irelalign
->r_addend
);
2463 if (alignmoveto
< alignto
)
2467 align_pad_size
= alignto
- alignmoveto
;
2469 fprintf (stderr
, "relax move region 0x%x to 0x%x delete size 0x%x\n",
2470 alignmoveto
, toaddr
, align_pad_size
);
2472 if (!v850_elf_relax_delete_bytes (abfd
, sec
, alignmoveto
,
2473 toaddr
, align_pad_size
))
2476 for (i
= BFD_ALIGN (toaddr
- align_pad_size
, 1);
2477 (i
+ 1) < toaddr
; i
+= 2)
2478 bfd_put_16 (abfd
, NOP_OPCODE
, contents
+ i
);
2486 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2493 Elf_Internal_Rela
*hi_irelfn
;
2494 Elf_Internal_Rela
*lo_irelfn
;
2495 Elf_Internal_Rela
*irelcall
;
2496 bfd_signed_vma foff
;
2498 if (! (irel
->r_offset
>= addr
&& irel
->r_offset
< toaddr
2499 && (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_LONGCALL
2500 || ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_LONGJUMP
)))
2504 fprintf (stderr
, "relax check r_info 0x%x r_offset 0x%x r_addend 0x%x\n",
2510 /* Get the section contents. */
2511 if (contents
== NULL
)
2513 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2514 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2517 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2522 /* Read this BFD's local symbols if we haven't done so already. */
2523 if (isymbuf
== NULL
&& symtab_hdr
->sh_info
!= 0)
2525 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2526 if (isymbuf
== NULL
)
2527 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
2528 symtab_hdr
->sh_info
, 0,
2530 if (isymbuf
== NULL
)
2534 laddr
= irel
->r_offset
;
2536 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_LONGCALL
)
2538 /* Check code for -mlong-calls output. */
2539 if (laddr
+ 16 <= (bfd_vma
) sec
->size
)
2541 insn
[0] = bfd_get_16 (abfd
, contents
+ laddr
);
2542 insn
[1] = bfd_get_16 (abfd
, contents
+ laddr
+ 4);
2543 insn
[2] = bfd_get_32 (abfd
, contents
+ laddr
+ 8);
2544 insn
[3] = bfd_get_16 (abfd
, contents
+ laddr
+ 12);
2545 insn
[4] = bfd_get_16 (abfd
, contents
+ laddr
+ 14);
2547 if ((insn
[0] & MOVHI_MASK
) != MOVHI
2548 || MOVHI_R1 (insn
[0]) != 0)
2552 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2553 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2557 && (insn
[2] & JARL_4_MASK
) != JARL_4
)
2561 && ((insn
[3] & ADD_I_MASK
) != ADD_I
2562 || ADD_I5 (insn
[3]) != 4
2563 || JARL_R2 (insn
[2]) != ADD_R2 (insn
[3])))
2567 && ((insn
[4] & JMP_R_MASK
) != JMP_R
2568 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[4])))
2573 ((*_bfd_error_handler
)
2574 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insns",
2575 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
));
2582 ((*_bfd_error_handler
)
2583 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized insn 0x%x",
2584 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
+no_match
, insn
[no_match
]));
2589 /* Get the reloc for the address from which the register is
2590 being loaded. This reloc will tell us which function is
2591 actually being called. */
2592 for (hi_irelfn
= internal_relocs
; hi_irelfn
< irelend
; hi_irelfn
++)
2593 if (hi_irelfn
->r_offset
== laddr
+ 2
2594 && ELF32_R_TYPE (hi_irelfn
->r_info
)
2595 == (int) R_V850_HI16_S
)
2598 for (lo_irelfn
= internal_relocs
; lo_irelfn
< irelend
; lo_irelfn
++)
2599 if (lo_irelfn
->r_offset
== laddr
+ 6
2600 && ELF32_R_TYPE (lo_irelfn
->r_info
)
2601 == (int) R_V850_LO16
)
2604 for (irelcall
= internal_relocs
; irelcall
< irelend
; irelcall
++)
2605 if (irelcall
->r_offset
== laddr
+ 8
2606 && ELF32_R_TYPE (irelcall
->r_info
)
2607 == (int) R_V850_22_PCREL
)
2610 if ( hi_irelfn
== irelend
2611 || lo_irelfn
== irelend
2612 || irelcall
== irelend
)
2614 ((*_bfd_error_handler
)
2615 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc",
2616 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
));
2621 if (ELF32_R_SYM (irelcall
->r_info
) < symtab_hdr
->sh_info
)
2623 Elf_Internal_Sym
* isym
;
2625 /* A local symbol. */
2626 isym
= isymbuf
+ ELF32_R_SYM (irelcall
->r_info
);
2628 symval
= isym
->st_value
;
2633 struct elf_link_hash_entry
* h
;
2635 /* An external symbol. */
2636 indx
= ELF32_R_SYM (irelcall
->r_info
) - symtab_hdr
->sh_info
;
2637 h
= elf_sym_hashes (abfd
)[indx
];
2638 BFD_ASSERT (h
!= NULL
);
2640 if ( h
->root
.type
!= bfd_link_hash_defined
2641 && h
->root
.type
!= bfd_link_hash_defweak
)
2642 /* This appears to be a reference to an undefined
2643 symbol. Just ignore it--it will be caught by the
2644 regular reloc processing. */
2647 symval
= h
->root
.u
.def
.value
;
2650 if (symval
+ irelcall
->r_addend
!= irelcall
->r_offset
+ 4)
2652 ((*_bfd_error_handler
)
2653 ("%s: 0x%lx: warning: R_V850_LONGCALL points to unrecognized reloc 0x%lx",
2654 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
, irelcall
->r_offset
));
2659 /* Get the value of the symbol referred to by the reloc. */
2660 if (ELF32_R_SYM (hi_irelfn
->r_info
) < symtab_hdr
->sh_info
)
2662 Elf_Internal_Sym
*isym
;
2665 /* A local symbol. */
2666 isym
= isymbuf
+ ELF32_R_SYM (hi_irelfn
->r_info
);
2668 if (isym
->st_shndx
== SHN_UNDEF
)
2669 sym_sec
= bfd_und_section_ptr
;
2670 else if (isym
->st_shndx
== SHN_ABS
)
2671 sym_sec
= bfd_abs_section_ptr
;
2672 else if (isym
->st_shndx
== SHN_COMMON
)
2673 sym_sec
= bfd_com_section_ptr
;
2675 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
2676 symval
= (isym
->st_value
2677 + sym_sec
->output_section
->vma
2678 + sym_sec
->output_offset
);
2683 struct elf_link_hash_entry
*h
;
2685 /* An external symbol. */
2686 indx
= ELF32_R_SYM (hi_irelfn
->r_info
) - symtab_hdr
->sh_info
;
2687 h
= elf_sym_hashes (abfd
)[indx
];
2688 BFD_ASSERT (h
!= NULL
);
2690 if ( h
->root
.type
!= bfd_link_hash_defined
2691 && h
->root
.type
!= bfd_link_hash_defweak
)
2692 /* This appears to be a reference to an undefined
2693 symbol. Just ignore it--it will be caught by the
2694 regular reloc processing. */
2697 symval
= (h
->root
.u
.def
.value
2698 + h
->root
.u
.def
.section
->output_section
->vma
2699 + h
->root
.u
.def
.section
->output_offset
);
2702 addend
= irel
->r_addend
;
2704 foff
= (symval
+ addend
2706 + sec
->output_section
->vma
2707 + sec
->output_offset
2710 fprintf (stderr
, "relax longcall r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2713 + sec
->output_section
->vma
2714 + sec
->output_offset
),
2715 symval
, addend
, foff
);
2718 if (foff
< -0x100000 || foff
>= 0x100000)
2719 /* After all that work, we can't shorten this function call. */
2722 /* For simplicity of coding, we are going to modify the section
2723 contents, the section relocs, and the BFD symbol table. We
2724 must tell the rest of the code not to free up this
2725 information. It would be possible to instead create a table
2726 of changes which have to be made, as is done in coff-mips.c;
2727 that would be more work, but would require less memory when
2728 the linker is run. */
2729 elf_section_data (sec
)->relocs
= internal_relocs
;
2730 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2731 symtab_hdr
->contents
= (bfd_byte
*) isymbuf
;
2733 /* Replace the long call with a jarl. */
2734 irel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_22_PCREL
);
2738 if (ELF32_R_SYM (hi_irelfn
->r_info
) < symtab_hdr
->sh_info
)
2739 /* If this needs to be changed because of future relaxing,
2740 it will be handled here like other internal IND12W
2743 0x00000780 | (JARL_R2 (insn
[2])<<11) | ((addend
<< 16) & 0xffff) | ((addend
>> 16) & 0xf),
2744 contents
+ irel
->r_offset
);
2746 /* We can't fully resolve this yet, because the external
2747 symbol value may be changed by future relaxing.
2748 We let the final link phase handle it. */
2749 bfd_put_32 (abfd
, 0x00000780 | (JARL_R2 (insn
[2])<<11),
2750 contents
+ irel
->r_offset
);
2753 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
2755 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_V850_NONE
);
2757 ELF32_R_INFO (ELF32_R_SYM (irelcall
->r_info
), R_V850_NONE
);
2759 if (! v850_elf_relax_delete_bytes (abfd
, sec
,
2760 irel
->r_offset
+ 4, toaddr
, 12))
2763 align_pad_size
+= 12;
2765 else if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_LONGJUMP
)
2767 /* Check code for -mlong-jumps output. */
2768 if (laddr
+ 10 <= (bfd_vma
) sec
->size
)
2770 insn
[0] = bfd_get_16 (abfd
, contents
+ laddr
);
2771 insn
[1] = bfd_get_16 (abfd
, contents
+ laddr
+ 4);
2772 insn
[2] = bfd_get_16 (abfd
, contents
+ laddr
+ 8);
2774 if ((insn
[0] & MOVHI_MASK
) != MOVHI
2775 || MOVHI_R1 (insn
[0]) != 0)
2779 && ((insn
[1] & MOVEA_MASK
) != MOVEA
2780 || MOVHI_R2 (insn
[0]) != MOVEA_R1 (insn
[1])))
2784 && ((insn
[2] & JMP_R_MASK
) != JMP_R
2785 || MOVEA_R2 (insn
[1]) != JMP_R1 (insn
[2])))
2790 ((*_bfd_error_handler
)
2791 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insns",
2792 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
));
2799 ((*_bfd_error_handler
)
2800 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized insn 0x%x",
2801 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
+no_match
, insn
[no_match
]));
2806 /* Get the reloc for the address from which the register is
2807 being loaded. This reloc will tell us which function is
2808 actually being called. */
2809 for (hi_irelfn
= internal_relocs
; hi_irelfn
< irelend
; hi_irelfn
++)
2810 if (hi_irelfn
->r_offset
== laddr
+ 2
2811 && ELF32_R_TYPE (hi_irelfn
->r_info
) == (int) R_V850_HI16_S
)
2814 for (lo_irelfn
= internal_relocs
; lo_irelfn
< irelend
; lo_irelfn
++)
2815 if (lo_irelfn
->r_offset
== laddr
+ 6
2816 && ELF32_R_TYPE (lo_irelfn
->r_info
) == (int) R_V850_LO16
)
2819 if ( hi_irelfn
== irelend
2820 || lo_irelfn
== irelend
)
2822 ((*_bfd_error_handler
)
2823 ("%s: 0x%lx: warning: R_V850_LONGJUMP points to unrecognized reloc",
2824 bfd_get_filename (abfd
), (unsigned long) irel
->r_offset
));
2829 /* Get the value of the symbol referred to by the reloc. */
2830 if (ELF32_R_SYM (hi_irelfn
->r_info
) < symtab_hdr
->sh_info
)
2832 Elf_Internal_Sym
* isym
;
2835 /* A local symbol. */
2836 isym
= isymbuf
+ ELF32_R_SYM (hi_irelfn
->r_info
);
2838 if (isym
->st_shndx
== SHN_UNDEF
)
2839 sym_sec
= bfd_und_section_ptr
;
2840 else if (isym
->st_shndx
== SHN_ABS
)
2841 sym_sec
= bfd_abs_section_ptr
;
2842 else if (isym
->st_shndx
== SHN_COMMON
)
2843 sym_sec
= bfd_com_section_ptr
;
2845 sym_sec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
2846 symval
= (isym
->st_value
2847 + sym_sec
->output_section
->vma
2848 + sym_sec
->output_offset
);
2851 char * name
= bfd_elf_string_from_elf_section
2852 (abfd
, symtab_hdr
->sh_link
, isym
->st_name
);
2854 fprintf (stderr
, "relax long jump local: sec: %s, sym: %s (%d), value: %x + %x + %x addend %x\n",
2855 sym_sec
->name
, name
, isym
->st_name
,
2856 sym_sec
->output_section
->vma
,
2857 sym_sec
->output_offset
,
2858 isym
->st_value
, irel
->r_addend
);
2865 struct elf_link_hash_entry
* h
;
2867 /* An external symbol. */
2868 indx
= ELF32_R_SYM (irel
->r_info
) - symtab_hdr
->sh_info
;
2869 h
= elf_sym_hashes (abfd
)[indx
];
2870 BFD_ASSERT (h
!= NULL
);
2872 if ( h
->root
.type
!= bfd_link_hash_defined
2873 && h
->root
.type
!= bfd_link_hash_defweak
)
2874 /* This appears to be a reference to an undefined
2875 symbol. Just ignore it--it will be caught by the
2876 regular reloc processing. */
2879 symval
= (h
->root
.u
.def
.value
2880 + h
->root
.u
.def
.section
->output_section
->vma
2881 + h
->root
.u
.def
.section
->output_offset
);
2884 "relax longjump defined: sec: %s, name: %s, value: %x + %x + %x addend %x\n",
2885 sec
->name
, h
->root
.root
.string
, h
->root
.u
.def
.value
,
2886 sec
->output_section
->vma
, sec
->output_offset
, irel
->r_addend
);
2890 addend
= irel
->r_addend
;
2892 foff
= (symval
+ addend
2894 + sec
->output_section
->vma
2895 + sec
->output_offset
2898 fprintf (stderr
, "relax longjump r_offset 0x%x ptr 0x%x symbol 0x%x addend 0x%x distance 0x%x\n",
2901 + sec
->output_section
->vma
2902 + sec
->output_offset
),
2903 symval
, addend
, foff
);
2905 if (foff
< -0x100000 || foff
>= 0x100000)
2906 /* After all that work, we can't shorten this function call. */
2909 /* For simplicity of coding, we are going to modify the section
2910 contents, the section relocs, and the BFD symbol table. We
2911 must tell the rest of the code not to free up this
2912 information. It would be possible to instead create a table
2913 of changes which have to be made, as is done in coff-mips.c;
2914 that would be more work, but would require less memory when
2915 the linker is run. */
2916 elf_section_data (sec
)->relocs
= internal_relocs
;
2917 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2918 symtab_hdr
->contents
= (bfd_byte
*) isymbuf
;
2920 if (foff
< -0x100 || foff
>= 0x100)
2922 /* Replace the long jump with a jr. */
2925 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_22_PCREL
);
2927 irel
->r_addend
= addend
;
2930 if (ELF32_R_SYM (hi_irelfn
->r_info
) < symtab_hdr
->sh_info
)
2931 /* If this needs to be changed because of future relaxing,
2932 it will be handled here like other internal IND12W
2935 0x00000780 | ((addend
<< 15) & 0xffff0000) | ((addend
>> 17) & 0xf),
2936 contents
+ irel
->r_offset
);
2938 /* We can't fully resolve this yet, because the external
2939 symbol value may be changed by future relaxing.
2940 We let the final link phase handle it. */
2941 bfd_put_32 (abfd
, 0x00000780, contents
+ irel
->r_offset
);
2944 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
2946 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_V850_NONE
);
2947 if (!v850_elf_relax_delete_bytes (abfd
, sec
,
2948 irel
->r_offset
+ 4, toaddr
, 6))
2951 align_pad_size
+= 6;
2955 /* Replace the long jump with a br. */
2958 ELF32_R_INFO (ELF32_R_SYM (irel
->r_info
), R_V850_9_PCREL
);
2960 irel
->r_addend
= addend
;
2963 if (ELF32_R_SYM (hi_irelfn
->r_info
) < symtab_hdr
->sh_info
)
2964 /* If this needs to be changed because of future relaxing,
2965 it will be handled here like other internal IND12W
2968 0x0585 | ((addend
<< 10) & 0xf800) | ((addend
<< 3) & 0x0070),
2969 contents
+ irel
->r_offset
);
2971 /* We can't fully resolve this yet, because the external
2972 symbol value may be changed by future relaxing.
2973 We let the final link phase handle it. */
2974 bfd_put_16 (abfd
, 0x0585, contents
+ irel
->r_offset
);
2977 ELF32_R_INFO (ELF32_R_SYM (hi_irelfn
->r_info
), R_V850_NONE
);
2979 ELF32_R_INFO (ELF32_R_SYM (lo_irelfn
->r_info
), R_V850_NONE
);
2980 if (!v850_elf_relax_delete_bytes (abfd
, sec
,
2981 irel
->r_offset
+ 2, toaddr
, 8))
2984 align_pad_size
+= 8;
2990 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2992 if (ELF32_R_TYPE (irel
->r_info
) == (int) R_V850_ALIGN
2993 && irel
->r_offset
== toaddr
)
2995 irel
->r_offset
-= align_pad_size
;
2997 if (irelalign
== NULL
|| irelalign
->r_addend
> irel
->r_addend
)
3008 fprintf (stderr
, "relax pad %d shorten %d -> %d\n",
3011 sec
->size
- align_pad_size
);
3013 sec
->size
-= align_pad_size
;
3017 if (internal_relocs
!= NULL
3018 && elf_section_data (sec
)->relocs
!= internal_relocs
)
3019 free (internal_relocs
);
3021 if (contents
!= NULL
3022 && elf_section_data (sec
)->this_hdr
.contents
!= (unsigned char *) contents
)
3026 && symtab_hdr
->contents
!= (bfd_byte
*) isymbuf
)
3036 static const struct bfd_elf_special_section v850_elf_special_sections
[] =
3038 { STRING_COMMA_LEN (".call_table_data"), 0, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
) },
3039 { STRING_COMMA_LEN (".call_table_text"), 0, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
3041 { STRING_COMMA_LEN (".rosdata"), -2, SHT_PROGBITS
, (SHF_ALLOC
3042 + SHF_V850_GPREL
) },
3043 { STRING_COMMA_LEN (".rozdata"), -2, SHT_PROGBITS
, (SHF_ALLOC
3044 + SHF_V850_R0REL
) },
3045 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS
, (SHF_ALLOC
+ SHF_WRITE
3046 + SHF_V850_GPREL
) },
3047 { STRING_COMMA_LEN (".scommon"), -2, SHT_V850_SCOMMON
, (SHF_ALLOC
+ SHF_WRITE
3048 + SHF_V850_GPREL
) },
3049 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
3050 + SHF_V850_GPREL
) },
3051 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS
, (SHF_ALLOC
+ SHF_WRITE
3052 + SHF_V850_EPREL
) },
3053 { STRING_COMMA_LEN (".tcommon"), -2, SHT_V850_TCOMMON
, (SHF_ALLOC
+ SHF_WRITE
3054 + SHF_V850_R0REL
) },
3055 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
3056 + SHF_V850_EPREL
) },
3057 { STRING_COMMA_LEN (".zbss"), -2, SHT_NOBITS
, (SHF_ALLOC
+ SHF_WRITE
3058 + SHF_V850_R0REL
) },
3059 { STRING_COMMA_LEN (".zcommon"), -2, SHT_V850_ZCOMMON
, (SHF_ALLOC
+ SHF_WRITE
3060 + SHF_V850_R0REL
) },
3061 { STRING_COMMA_LEN (".zdata"), -2, SHT_PROGBITS
, (SHF_ALLOC
+ SHF_WRITE
3062 + SHF_V850_R0REL
) },
3063 { NULL
, 0, 0, 0, 0 }
3066 #define TARGET_LITTLE_SYM bfd_elf32_v850_vec
3067 #define TARGET_LITTLE_NAME "elf32-v850"
3068 #define ELF_ARCH bfd_arch_v850
3069 #define ELF_MACHINE_CODE EM_V850
3070 #define ELF_MACHINE_ALT1 EM_CYGNUS_V850
3071 #define ELF_MACHINE_ALT2 EM_V800 /* This is the value used by the GreenHills toolchain. */
3072 #define ELF_MAXPAGESIZE 0x1000
3074 #define elf_info_to_howto v850_elf_info_to_howto_rela
3075 #define elf_info_to_howto_rel v850_elf_info_to_howto_rel
3077 #define elf_backend_check_relocs v850_elf_check_relocs
3078 #define elf_backend_relocate_section v850_elf_relocate_section
3079 #define elf_backend_object_p v850_elf_object_p
3080 #define elf_backend_final_write_processing v850_elf_final_write_processing
3081 #define elf_backend_section_from_bfd_section v850_elf_section_from_bfd_section
3082 #define elf_backend_symbol_processing v850_elf_symbol_processing
3083 #define elf_backend_add_symbol_hook v850_elf_add_symbol_hook
3084 #define elf_backend_link_output_symbol_hook v850_elf_link_output_symbol_hook
3085 #define elf_backend_section_from_shdr v850_elf_section_from_shdr
3086 #define elf_backend_fake_sections v850_elf_fake_sections
3087 #define elf_backend_gc_mark_hook v850_elf_gc_mark_hook
3088 #define elf_backend_special_sections v850_elf_special_sections
3090 #define elf_backend_can_gc_sections 1
3091 #define elf_backend_rela_normal 1
3093 #define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
3094 #define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
3095 #define bfd_elf32_bfd_reloc_name_lookup v850_elf_reloc_name_lookup
3096 #define bfd_elf32_bfd_merge_private_bfd_data v850_elf_merge_private_bfd_data
3097 #define bfd_elf32_bfd_set_private_flags v850_elf_set_private_flags
3098 #define bfd_elf32_bfd_print_private_bfd_data v850_elf_print_private_bfd_data
3099 #define bfd_elf32_bfd_relax_section v850_elf_relax_section
3101 #define elf_symbol_leading_char '_'
3103 #include "elf32-target.h"