1 /* Renesas RX specific support for 32-bit ELF.
2 Copyright (C) 2008-2024 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
26 #include "libiberty.h"
29 #define RX_OPCODE_BIG_ENDIAN 0
31 /* This is a meta-target that's used only with objcopy, to avoid the
32 endian-swap we would otherwise get. We check for this in
34 const bfd_target rx_elf32_be_ns_vec
;
35 const bfd_target rx_elf32_be_vec
;
38 char * rx_get_reloc (long);
39 void rx_dump_symtab (bfd
*, void *, void *);
42 #define RXREL(n,sz,bit,shift,complain,pcrel) \
43 HOWTO (R_RX_##n, shift, sz, bit, pcrel, 0, complain_overflow_ ## complain, \
44 bfd_elf_generic_reloc, "R_RX_" #n, false, 0, ~0, false)
46 /* Note that the relocations around 0x7f are internal to this file;
47 feel free to move them as needed to avoid conflicts with published
48 relocation numbers. */
50 static reloc_howto_type rx_elf_howto_table
[] =
52 RXREL (NONE
, 0, 0, 0, dont
, false),
53 RXREL (DIR32
, 4, 32, 0, signed, false),
54 RXREL (DIR24S
, 4, 24, 0, signed, false),
55 RXREL (DIR16
, 2, 16, 0, dont
, false),
56 RXREL (DIR16U
, 2, 16, 0, unsigned, false),
57 RXREL (DIR16S
, 2, 16, 0, signed, false),
58 RXREL (DIR8
, 1, 8, 0, dont
, false),
59 RXREL (DIR8U
, 1, 8, 0, unsigned, false),
60 RXREL (DIR8S
, 1, 8, 0, signed, false),
61 RXREL (DIR24S_PCREL
, 4, 24, 0, signed, true),
62 RXREL (DIR16S_PCREL
, 2, 16, 0, signed, true),
63 RXREL (DIR8S_PCREL
, 1, 8, 0, signed, true),
64 RXREL (DIR16UL
, 2, 16, 2, unsigned, false),
65 RXREL (DIR16UW
, 2, 16, 1, unsigned, false),
66 RXREL (DIR8UL
, 1, 8, 2, unsigned, false),
67 RXREL (DIR8UW
, 1, 8, 1, unsigned, false),
68 RXREL (DIR32_REV
, 2, 16, 0, dont
, false),
69 RXREL (DIR16_REV
, 2, 16, 0, dont
, false),
70 RXREL (DIR3U_PCREL
, 1, 3, 0, dont
, true),
86 RXREL (RH_3_PCREL
, 1, 3, 0, signed, true),
87 RXREL (RH_16_OP
, 2, 16, 0, signed, false),
88 RXREL (RH_24_OP
, 4, 24, 0, signed, false),
89 RXREL (RH_32_OP
, 4, 32, 0, signed, false),
90 RXREL (RH_24_UNS
, 4, 24, 0, unsigned, false),
91 RXREL (RH_8_NEG
, 1, 8, 0, signed, false),
92 RXREL (RH_16_NEG
, 2, 16, 0, signed, false),
93 RXREL (RH_24_NEG
, 4, 24, 0, signed, false),
94 RXREL (RH_32_NEG
, 4, 32, 0, signed, false),
95 RXREL (RH_DIFF
, 4, 32, 0, signed, false),
96 RXREL (RH_GPRELB
, 2, 16, 0, unsigned, false),
97 RXREL (RH_GPRELW
, 2, 16, 0, unsigned, false),
98 RXREL (RH_GPRELL
, 2, 16, 0, unsigned, false),
99 RXREL (RH_RELAX
, 0, 0, 0, dont
, false),
121 RXREL (ABS32
, 4, 32, 0, dont
, false),
122 RXREL (ABS24S
, 4, 24, 0, signed, false),
123 RXREL (ABS16
, 2, 16, 0, dont
, false),
124 RXREL (ABS16U
, 2, 16, 0, unsigned, false),
125 RXREL (ABS16S
, 2, 16, 0, signed, false),
126 RXREL (ABS8
, 1, 8, 0, dont
, false),
127 RXREL (ABS8U
, 1, 8, 0, unsigned, false),
128 RXREL (ABS8S
, 1, 8, 0, signed, false),
129 RXREL (ABS24S_PCREL
, 4, 24, 0, signed, true),
130 RXREL (ABS16S_PCREL
, 2, 16, 0, signed, true),
131 RXREL (ABS8S_PCREL
, 1, 8, 0, signed, true),
132 RXREL (ABS16UL
, 2, 16, 0, unsigned, false),
133 RXREL (ABS16UW
, 2, 16, 0, unsigned, false),
134 RXREL (ABS8UL
, 1, 8, 0, unsigned, false),
135 RXREL (ABS8UW
, 1, 8, 0, unsigned, false),
136 RXREL (ABS32_REV
, 4, 32, 0, dont
, false),
137 RXREL (ABS16_REV
, 2, 16, 0, dont
, false),
139 #define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
180 /* These are internal. */
181 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 8/12. */
182 /* ---- ---- 4--- 3210. */
183 #define R_RX_RH_ABS5p8B 0x78
184 RXREL (RH_ABS5p8B
, 0, 0, 0, dont
, false),
185 #define R_RX_RH_ABS5p8W 0x79
186 RXREL (RH_ABS5p8W
, 0, 0, 0, dont
, false),
187 #define R_RX_RH_ABS5p8L 0x7a
188 RXREL (RH_ABS5p8L
, 0, 0, 0, dont
, false),
189 /* A 5-bit unsigned displacement to a B/W/L address, at bit position 5/12. */
190 /* ---- -432 1--- 0---. */
191 #define R_RX_RH_ABS5p5B 0x7b
192 RXREL (RH_ABS5p5B
, 0, 0, 0, dont
, false),
193 #define R_RX_RH_ABS5p5W 0x7c
194 RXREL (RH_ABS5p5W
, 0, 0, 0, dont
, false),
195 #define R_RX_RH_ABS5p5L 0x7d
196 RXREL (RH_ABS5p5L
, 0, 0, 0, dont
, false),
197 /* A 4-bit unsigned immediate at bit position 8. */
198 #define R_RX_RH_UIMM4p8 0x7e
199 RXREL (RH_UIMM4p8
, 0, 0, 0, dont
, false),
200 /* A 4-bit negative unsigned immediate at bit position 8. */
201 #define R_RX_RH_UNEG4p8 0x7f
202 RXREL (RH_UNEG4p8
, 0, 0, 0, dont
, false),
203 /* End of internal relocs. */
205 RXREL (SYM
, 4, 32, 0, dont
, false),
206 RXREL (OPneg
, 4, 32, 0, dont
, false),
207 RXREL (OPadd
, 4, 32, 0, dont
, false),
208 RXREL (OPsub
, 4, 32, 0, dont
, false),
209 RXREL (OPmul
, 4, 32, 0, dont
, false),
210 RXREL (OPdiv
, 4, 32, 0, dont
, false),
211 RXREL (OPshla
, 4, 32, 0, dont
, false),
212 RXREL (OPshra
, 4, 32, 0, dont
, false),
213 RXREL (OPsctsize
, 4, 32, 0, dont
, false),
220 RXREL (OPscttop
, 4, 32, 0, dont
, false),
225 RXREL (OPand
, 4, 32, 0, dont
, false),
226 RXREL (OPor
, 4, 32, 0, dont
, false),
227 RXREL (OPxor
, 4, 32, 0, dont
, false),
228 RXREL (OPnot
, 4, 32, 0, dont
, false),
229 RXREL (OPmod
, 4, 32, 0, dont
, false),
230 RXREL (OPromtop
, 4, 32, 0, dont
, false),
231 RXREL (OPramtop
, 4, 32, 0, dont
, false)
234 /* Map BFD reloc types to RX ELF reloc types. */
238 bfd_reloc_code_real_type bfd_reloc_val
;
239 unsigned int rx_reloc_val
;
242 static const struct rx_reloc_map rx_reloc_map
[] =
244 { BFD_RELOC_NONE
, R_RX_NONE
},
245 { BFD_RELOC_8
, R_RX_DIR8S
},
246 { BFD_RELOC_16
, R_RX_DIR16S
},
247 { BFD_RELOC_24
, R_RX_DIR24S
},
248 { BFD_RELOC_32
, R_RX_DIR32
},
249 { BFD_RELOC_RX_16_OP
, R_RX_DIR16
},
250 { BFD_RELOC_RX_DIR3U_PCREL
, R_RX_DIR3U_PCREL
},
251 { BFD_RELOC_8_PCREL
, R_RX_DIR8S_PCREL
},
252 { BFD_RELOC_16_PCREL
, R_RX_DIR16S_PCREL
},
253 { BFD_RELOC_24_PCREL
, R_RX_DIR24S_PCREL
},
254 { BFD_RELOC_RX_8U
, R_RX_DIR8U
},
255 { BFD_RELOC_RX_16U
, R_RX_DIR16U
},
256 { BFD_RELOC_RX_24U
, R_RX_RH_24_UNS
},
257 { BFD_RELOC_RX_NEG8
, R_RX_RH_8_NEG
},
258 { BFD_RELOC_RX_NEG16
, R_RX_RH_16_NEG
},
259 { BFD_RELOC_RX_NEG24
, R_RX_RH_24_NEG
},
260 { BFD_RELOC_RX_NEG32
, R_RX_RH_32_NEG
},
261 { BFD_RELOC_RX_DIFF
, R_RX_RH_DIFF
},
262 { BFD_RELOC_RX_GPRELB
, R_RX_RH_GPRELB
},
263 { BFD_RELOC_RX_GPRELW
, R_RX_RH_GPRELW
},
264 { BFD_RELOC_RX_GPRELL
, R_RX_RH_GPRELL
},
265 { BFD_RELOC_RX_RELAX
, R_RX_RH_RELAX
},
266 { BFD_RELOC_RX_SYM
, R_RX_SYM
},
267 { BFD_RELOC_RX_OP_SUBTRACT
, R_RX_OPsub
},
268 { BFD_RELOC_RX_OP_NEG
, R_RX_OPneg
},
269 { BFD_RELOC_RX_ABS8
, R_RX_ABS8
},
270 { BFD_RELOC_RX_ABS16
, R_RX_ABS16
},
271 { BFD_RELOC_RX_ABS16_REV
, R_RX_ABS16_REV
},
272 { BFD_RELOC_RX_ABS32
, R_RX_ABS32
},
273 { BFD_RELOC_RX_ABS32_REV
, R_RX_ABS32_REV
},
274 { BFD_RELOC_RX_ABS16UL
, R_RX_ABS16UL
},
275 { BFD_RELOC_RX_ABS16UW
, R_RX_ABS16UW
},
276 { BFD_RELOC_RX_ABS16U
, R_RX_ABS16U
}
279 #define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
281 static reloc_howto_type
*
282 rx_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
283 bfd_reloc_code_real_type code
)
287 if (code
== BFD_RELOC_RX_32_OP
)
288 return rx_elf_howto_table
+ R_RX_DIR32
;
290 for (i
= ARRAY_SIZE (rx_reloc_map
); i
--;)
291 if (rx_reloc_map
[i
].bfd_reloc_val
== code
)
292 return rx_elf_howto_table
+ rx_reloc_map
[i
].rx_reloc_val
;
297 static reloc_howto_type
*
298 rx_reloc_name_lookup (bfd
* abfd ATTRIBUTE_UNUSED
, const char * r_name
)
302 for (i
= 0; i
< ARRAY_SIZE (rx_elf_howto_table
); i
++)
303 if (rx_elf_howto_table
[i
].name
!= NULL
304 && strcasecmp (rx_elf_howto_table
[i
].name
, r_name
) == 0)
305 return rx_elf_howto_table
+ i
;
310 /* Set the howto pointer for an RX ELF reloc. */
313 rx_info_to_howto_rela (bfd
* abfd
,
315 Elf_Internal_Rela
* dst
)
319 r_type
= ELF32_R_TYPE (dst
->r_info
);
320 BFD_ASSERT (R_RX_max
== ARRAY_SIZE (rx_elf_howto_table
));
321 if (r_type
>= ARRAY_SIZE (rx_elf_howto_table
))
323 /* xgettext:c-format */
324 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
326 bfd_set_error (bfd_error_bad_value
);
329 cache_ptr
->howto
= rx_elf_howto_table
+ r_type
;
330 if (cache_ptr
->howto
->name
== NULL
)
332 /* xgettext:c-format */
333 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
335 bfd_set_error (bfd_error_bad_value
);
342 get_symbol_value (const char * name
,
343 struct bfd_link_info
* info
,
345 asection
* input_section
,
349 struct bfd_link_hash_entry
* h
;
351 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
354 || (h
->type
!= bfd_link_hash_defined
355 && h
->type
!= bfd_link_hash_defweak
))
356 (*info
->callbacks
->undefined_symbol
)
357 (info
, name
, input_bfd
, input_section
, offset
, true);
359 value
= (h
->u
.def
.value
360 + h
->u
.def
.section
->output_section
->vma
361 + h
->u
.def
.section
->output_offset
);
367 get_symbol_value_maybe (const char * name
,
368 struct bfd_link_info
* info
)
371 struct bfd_link_hash_entry
* h
;
373 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
376 || (h
->type
!= bfd_link_hash_defined
377 && h
->type
!= bfd_link_hash_defweak
))
380 value
= (h
->u
.def
.value
381 + h
->u
.def
.section
->output_section
->vma
382 + h
->u
.def
.section
->output_offset
);
388 get_gp (struct bfd_link_info
* info
,
393 static bool cached
= false;
394 static bfd_vma cached_value
= 0;
398 cached_value
= get_symbol_value ("__gp", info
, abfd
, sec
, offset
);
405 get_romstart (struct bfd_link_info
* info
,
410 static bool cached
= false;
411 static bfd_vma cached_value
= 0;
415 cached_value
= get_symbol_value ("_start", info
, abfd
, sec
, offset
);
422 get_ramstart (struct bfd_link_info
* info
,
427 static bool cached
= false;
428 static bfd_vma cached_value
= 0;
432 cached_value
= get_symbol_value ("__datastart", info
, abfd
, sec
, offset
);
438 #define NUM_STACK_ENTRIES 16
439 static int32_t rx_stack
[ NUM_STACK_ENTRIES
];
440 static unsigned int rx_stack_top
;
442 #define RX_STACK_PUSH(val) \
445 if (rx_stack_top < NUM_STACK_ENTRIES) \
446 rx_stack [rx_stack_top ++] = (val); \
448 r = bfd_reloc_dangerous; \
452 #define RX_STACK_POP(dest) \
455 if (rx_stack_top > 0) \
456 (dest) = rx_stack [-- rx_stack_top]; \
458 (dest) = 0, r = bfd_reloc_dangerous; \
462 /* Relocate an RX ELF section.
463 There is some attempt to make this function usable for many architectures,
464 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
465 if only to serve as a learning tool.
467 The RELOCATE_SECTION function is called by the new ELF backend linker
468 to handle the relocations for a section.
470 The relocs are always passed as Rela structures; if the section
471 actually uses Rel structures, the r_addend field will always be
474 This function is responsible for adjusting the section contents as
475 necessary, and (if using Rela relocs and generating a relocatable
476 output file) adjusting the reloc addend as necessary.
478 This function does not have to worry about setting the reloc
479 address or the reloc symbol index.
481 LOCAL_SYMS is a pointer to the swapped in local symbols.
483 LOCAL_SECTIONS is an array giving the section in the input file
484 corresponding to the st_shndx field of each local symbol.
486 The global hash table entry for the global symbols can be found
487 via elf_sym_hashes (input_bfd).
489 When generating relocatable output, this function must handle
490 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
491 going to be the section symbol corresponding to the output
492 section, which means that the addend must be adjusted
496 rx_elf_relocate_section
498 struct bfd_link_info
* info
,
500 asection
* input_section
,
502 Elf_Internal_Rela
* relocs
,
503 Elf_Internal_Sym
* local_syms
,
504 asection
** local_sections
)
506 Elf_Internal_Shdr
*symtab_hdr
;
507 struct elf_link_hash_entry
**sym_hashes
;
508 Elf_Internal_Rela
*rel
;
509 Elf_Internal_Rela
*relend
;
511 bool saw_subtract
= false;
512 const char *table_default_cache
= NULL
;
513 bfd_vma table_start_cache
= 0;
514 bfd_vma table_end_cache
= 0;
516 if (elf_elfheader (output_bfd
)->e_flags
& E_FLAG_RX_PID
)
521 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
522 sym_hashes
= elf_sym_hashes (input_bfd
);
523 relend
= relocs
+ input_section
->reloc_count
;
524 for (rel
= relocs
; rel
< relend
; rel
++)
526 reloc_howto_type
*howto
;
527 unsigned long r_symndx
;
528 Elf_Internal_Sym
*sym
;
530 struct elf_link_hash_entry
*h
;
532 bfd_reloc_status_type r
;
533 const char * name
= NULL
;
534 bool unresolved_reloc
= true;
537 r_type
= ELF32_R_TYPE (rel
->r_info
);
538 r_symndx
= ELF32_R_SYM (rel
->r_info
);
540 howto
= rx_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
546 if (rx_stack_top
== 0)
547 saw_subtract
= false;
549 if (r_symndx
< symtab_hdr
->sh_info
)
551 sym
= local_syms
+ r_symndx
;
552 sec
= local_sections
[r_symndx
];
553 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, & sec
, rel
);
555 name
= bfd_elf_string_from_elf_section
556 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
557 name
= sym
->st_name
== 0 ? bfd_section_name (sec
) : name
;
561 bool warned
, ignored
;
563 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
564 r_symndx
, symtab_hdr
, sym_hashes
, h
,
565 sec
, relocation
, unresolved_reloc
,
568 name
= h
->root
.root
.string
;
571 if (startswith (name
, "$tableentry$default$"))
577 if (table_default_cache
!= name
)
580 /* All relocs for a given table should be to the same
581 (weak) default symbol) so we can use it to detect a
582 cache miss. We use the offset into the table to find
583 the "real" symbol. Calculate and store the table's
586 table_default_cache
= name
;
588 /* We have already done error checking in rx_table_find(). */
590 buf
= (char *) bfd_malloc (13 + strlen (name
+ 20));
594 sprintf (buf
, "$tablestart$%s", name
+ 20);
595 table_start_cache
= get_symbol_value (buf
,
601 sprintf (buf
, "$tableend$%s", name
+ 20);
602 table_end_cache
= get_symbol_value (buf
,
611 entry_vma
= (input_section
->output_section
->vma
612 + input_section
->output_offset
615 if (table_end_cache
<= entry_vma
|| entry_vma
< table_start_cache
)
617 /* xgettext:c-format */
618 _bfd_error_handler (_("%pB:%pA: table entry %s outside table"),
619 input_bfd
, input_section
,
622 else if ((int) (entry_vma
- table_start_cache
) % 4)
624 /* xgettext:c-format */
625 _bfd_error_handler (_("%pB:%pA: table entry %s not word-aligned within table"),
626 input_bfd
, input_section
,
631 idx
= (int) (entry_vma
- table_start_cache
) / 4;
633 /* This will look like $tableentry$<N>$<name> */
634 buf
= (char *) bfd_malloc (12 + 20 + strlen (name
+ 20));
638 sprintf (buf
, "$tableentry$%d$%s", idx
, name
+ 20);
640 h
= (struct elf_link_hash_entry
*) bfd_link_hash_lookup (info
->hash
, buf
, false, false, true);
644 relocation
= (h
->root
.u
.def
.value
645 + h
->root
.u
.def
.section
->output_section
->vma
646 + h
->root
.u
.def
.section
->output_offset
);;
653 if (sec
!= NULL
&& discarded_section (sec
))
654 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
655 rel
, 1, relend
, howto
, 0, contents
);
657 if (bfd_link_relocatable (info
))
659 /* This is a relocatable link. We don't have to change
660 anything, unless the reloc is against a section symbol,
661 in which case we have to adjust according to where the
662 section symbol winds up in the output section. */
663 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
664 rel
->r_addend
+= sec
->output_offset
;
668 if (h
!= NULL
&& h
->root
.type
== bfd_link_hash_undefweak
)
669 /* If the symbol is undefined and weak
670 then the relocation resolves to zero. */
674 if (howto
->pc_relative
)
676 relocation
-= (input_section
->output_section
->vma
677 + input_section
->output_offset
679 if (r_type
!= R_RX_RH_3_PCREL
680 && r_type
!= R_RX_DIR3U_PCREL
)
684 relocation
+= rel
->r_addend
;
690 if (a > (long) relocation || (long) relocation > b) \
691 r = bfd_reloc_overflow
693 if (relocation & m) \
696 (contents[rel->r_offset + (i)])
697 #define WARN_REDHAT(type) \
698 /* xgettext:c-format */ \
700 (_("%pB:%pA: warning: deprecated Red Hat reloc " \
701 "%s detected against: %s"), \
702 input_bfd, input_section, #type, name)
704 /* Check for unsafe relocs in PID mode. These are any relocs where
705 an absolute address is being computed. There are special cases
706 for relocs against symbols that are known to be referenced in
707 crt0.o before the PID base address register has been initialised. */
708 #define UNSAFE_FOR_PID \
713 && sec->flags & SEC_READONLY \
714 && !(input_section->flags & SEC_DEBUGGING) \
715 && strcmp (name, "__pid_base") != 0 \
716 && strcmp (name, "__gp") != 0 \
717 && strcmp (name, "__romdatastart") != 0 \
719 /* xgettext:c-format */ \
720 _bfd_error_handler (_("%pB(%pA): unsafe PID relocation %s " \
721 "at %#" PRIx64 " (against %s in %s)"), \
722 input_bfd, input_section, howto->name, \
723 (uint64_t) (input_section->output_section->vma \
724 + input_section->output_offset \
730 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
739 case R_RX_RH_3_PCREL
:
740 WARN_REDHAT ("RX_RH_3_PCREL");
743 OP (0) |= relocation
& 0x07;
747 WARN_REDHAT ("RX_RH_8_NEG");
748 relocation
= - relocation
;
750 case R_RX_DIR8S_PCREL
:
769 WARN_REDHAT ("RX_RH_16_NEG");
770 relocation
= - relocation
;
772 case R_RX_DIR16S_PCREL
:
774 RANGE (-32768, 32767);
775 #if RX_OPCODE_BIG_ENDIAN
778 OP (1) = relocation
>> 8;
783 WARN_REDHAT ("RX_RH_16_OP");
785 RANGE (-32768, 32767);
786 #if RX_OPCODE_BIG_ENDIAN
788 OP (0) = relocation
>> 8;
791 OP (1) = relocation
>> 8;
797 RANGE (-32768, 65535);
798 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
801 OP (0) = relocation
>> 8;
806 OP (1) = relocation
>> 8;
813 #if RX_OPCODE_BIG_ENDIAN
815 OP (0) = relocation
>> 8;
818 OP (1) = relocation
>> 8;
824 RANGE (-32768, 65536);
825 #if RX_OPCODE_BIG_ENDIAN
827 OP (0) = relocation
>> 8;
830 OP (1) = relocation
>> 8;
836 RANGE (-32768, 65536);
837 #if RX_OPCODE_BIG_ENDIAN
839 OP (1) = relocation
>> 8;
842 OP (0) = relocation
>> 8;
846 case R_RX_DIR3U_PCREL
:
849 OP (0) |= relocation
& 0x07;
854 WARN_REDHAT ("RX_RH_24_NEG");
855 relocation
= - relocation
;
857 case R_RX_DIR24S_PCREL
:
858 RANGE (-0x800000, 0x7fffff);
859 #if RX_OPCODE_BIG_ENDIAN
861 OP (1) = relocation
>> 8;
862 OP (0) = relocation
>> 16;
865 OP (1) = relocation
>> 8;
866 OP (2) = relocation
>> 16;
872 WARN_REDHAT ("RX_RH_24_OP");
873 RANGE (-0x800000, 0x7fffff);
874 #if RX_OPCODE_BIG_ENDIAN
876 OP (1) = relocation
>> 8;
877 OP (0) = relocation
>> 16;
880 OP (1) = relocation
>> 8;
881 OP (2) = relocation
>> 16;
887 RANGE (-0x800000, 0x7fffff);
888 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
891 OP (1) = relocation
>> 8;
892 OP (0) = relocation
>> 16;
897 OP (1) = relocation
>> 8;
898 OP (2) = relocation
>> 16;
904 WARN_REDHAT ("RX_RH_24_UNS");
906 #if RX_OPCODE_BIG_ENDIAN
908 OP (1) = relocation
>> 8;
909 OP (0) = relocation
>> 16;
912 OP (1) = relocation
>> 8;
913 OP (2) = relocation
>> 16;
919 WARN_REDHAT ("RX_RH_32_NEG");
920 relocation
= - relocation
;
921 #if RX_OPCODE_BIG_ENDIAN
923 OP (2) = relocation
>> 8;
924 OP (1) = relocation
>> 16;
925 OP (0) = relocation
>> 24;
928 OP (1) = relocation
>> 8;
929 OP (2) = relocation
>> 16;
930 OP (3) = relocation
>> 24;
936 WARN_REDHAT ("RX_RH_32_OP");
937 #if RX_OPCODE_BIG_ENDIAN
939 OP (2) = relocation
>> 8;
940 OP (1) = relocation
>> 16;
941 OP (0) = relocation
>> 24;
944 OP (1) = relocation
>> 8;
945 OP (2) = relocation
>> 16;
946 OP (3) = relocation
>> 24;
951 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
954 OP (2) = relocation
>> 8;
955 OP (1) = relocation
>> 16;
956 OP (0) = relocation
>> 24;
961 OP (1) = relocation
>> 8;
962 OP (2) = relocation
>> 16;
963 OP (3) = relocation
>> 24;
968 if (BIGE (output_bfd
))
971 OP (1) = relocation
>> 8;
972 OP (2) = relocation
>> 16;
973 OP (3) = relocation
>> 24;
978 OP (2) = relocation
>> 8;
979 OP (1) = relocation
>> 16;
980 OP (0) = relocation
>> 24;
987 WARN_REDHAT ("RX_RH_DIFF");
988 val
= bfd_get_32 (output_bfd
, & OP (0));
990 bfd_put_32 (output_bfd
, val
, & OP (0));
995 WARN_REDHAT ("RX_RH_GPRELB");
996 relocation
-= get_gp (info
, input_bfd
, input_section
, rel
->r_offset
);
998 #if RX_OPCODE_BIG_ENDIAN
1000 OP (0) = relocation
>> 8;
1002 OP (0) = relocation
;
1003 OP (1) = relocation
>> 8;
1007 case R_RX_RH_GPRELW
:
1008 WARN_REDHAT ("RX_RH_GPRELW");
1009 relocation
-= get_gp (info
, input_bfd
, input_section
, rel
->r_offset
);
1013 #if RX_OPCODE_BIG_ENDIAN
1014 OP (1) = relocation
;
1015 OP (0) = relocation
>> 8;
1017 OP (0) = relocation
;
1018 OP (1) = relocation
>> 8;
1022 case R_RX_RH_GPRELL
:
1023 WARN_REDHAT ("RX_RH_GPRELL");
1024 relocation
-= get_gp (info
, input_bfd
, input_section
, rel
->r_offset
);
1028 #if RX_OPCODE_BIG_ENDIAN
1029 OP (1) = relocation
;
1030 OP (0) = relocation
>> 8;
1032 OP (0) = relocation
;
1033 OP (1) = relocation
>> 8;
1037 /* Internal relocations just for relaxation: */
1038 case R_RX_RH_ABS5p5B
:
1039 RX_STACK_POP (relocation
);
1042 OP (0) |= relocation
>> 2;
1044 OP (1) |= (relocation
<< 6) & 0x80;
1045 OP (1) |= (relocation
<< 3) & 0x08;
1048 case R_RX_RH_ABS5p5W
:
1049 RX_STACK_POP (relocation
);
1054 OP (0) |= relocation
>> 2;
1056 OP (1) |= (relocation
<< 6) & 0x80;
1057 OP (1) |= (relocation
<< 3) & 0x08;
1060 case R_RX_RH_ABS5p5L
:
1061 RX_STACK_POP (relocation
);
1066 OP (0) |= relocation
>> 2;
1068 OP (1) |= (relocation
<< 6) & 0x80;
1069 OP (1) |= (relocation
<< 3) & 0x08;
1072 case R_RX_RH_ABS5p8B
:
1073 RX_STACK_POP (relocation
);
1076 OP (0) |= (relocation
<< 3) & 0x80;
1077 OP (0) |= relocation
& 0x0f;
1080 case R_RX_RH_ABS5p8W
:
1081 RX_STACK_POP (relocation
);
1086 OP (0) |= (relocation
<< 3) & 0x80;
1087 OP (0) |= relocation
& 0x0f;
1090 case R_RX_RH_ABS5p8L
:
1091 RX_STACK_POP (relocation
);
1096 OP (0) |= (relocation
<< 3) & 0x80;
1097 OP (0) |= relocation
& 0x0f;
1100 case R_RX_RH_UIMM4p8
:
1103 OP (0) |= relocation
<< 4;
1106 case R_RX_RH_UNEG4p8
:
1109 OP (0) |= (-relocation
) << 4;
1112 /* Complex reloc handling: */
1116 RX_STACK_POP (relocation
);
1117 #if RX_OPCODE_BIG_ENDIAN
1118 OP (3) = relocation
;
1119 OP (2) = relocation
>> 8;
1120 OP (1) = relocation
>> 16;
1121 OP (0) = relocation
>> 24;
1123 OP (0) = relocation
;
1124 OP (1) = relocation
>> 8;
1125 OP (2) = relocation
>> 16;
1126 OP (3) = relocation
>> 24;
1130 case R_RX_ABS32_REV
:
1132 RX_STACK_POP (relocation
);
1133 #if RX_OPCODE_BIG_ENDIAN
1134 OP (0) = relocation
;
1135 OP (1) = relocation
>> 8;
1136 OP (2) = relocation
>> 16;
1137 OP (3) = relocation
>> 24;
1139 OP (3) = relocation
;
1140 OP (2) = relocation
>> 8;
1141 OP (1) = relocation
>> 16;
1142 OP (0) = relocation
>> 24;
1146 case R_RX_ABS24S_PCREL
:
1149 RX_STACK_POP (relocation
);
1150 RANGE (-0x800000, 0x7fffff);
1151 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
1153 OP (2) = relocation
;
1154 OP (1) = relocation
>> 8;
1155 OP (0) = relocation
>> 16;
1159 OP (0) = relocation
;
1160 OP (1) = relocation
>> 8;
1161 OP (2) = relocation
>> 16;
1167 RX_STACK_POP (relocation
);
1168 RANGE (-32768, 65535);
1169 #if RX_OPCODE_BIG_ENDIAN
1170 OP (1) = relocation
;
1171 OP (0) = relocation
>> 8;
1173 OP (0) = relocation
;
1174 OP (1) = relocation
>> 8;
1178 case R_RX_ABS16_REV
:
1180 RX_STACK_POP (relocation
);
1181 RANGE (-32768, 65535);
1182 #if RX_OPCODE_BIG_ENDIAN
1183 OP (0) = relocation
;
1184 OP (1) = relocation
>> 8;
1186 OP (1) = relocation
;
1187 OP (0) = relocation
>> 8;
1191 case R_RX_ABS16S_PCREL
:
1193 RX_STACK_POP (relocation
);
1194 RANGE (-32768, 32767);
1195 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
1197 OP (1) = relocation
;
1198 OP (0) = relocation
>> 8;
1202 OP (0) = relocation
;
1203 OP (1) = relocation
>> 8;
1209 RX_STACK_POP (relocation
);
1211 #if RX_OPCODE_BIG_ENDIAN
1212 OP (1) = relocation
;
1213 OP (0) = relocation
>> 8;
1215 OP (0) = relocation
;
1216 OP (1) = relocation
>> 8;
1222 RX_STACK_POP (relocation
);
1225 #if RX_OPCODE_BIG_ENDIAN
1226 OP (1) = relocation
;
1227 OP (0) = relocation
>> 8;
1229 OP (0) = relocation
;
1230 OP (1) = relocation
>> 8;
1236 RX_STACK_POP (relocation
);
1239 #if RX_OPCODE_BIG_ENDIAN
1240 OP (1) = relocation
;
1241 OP (0) = relocation
>> 8;
1243 OP (0) = relocation
;
1244 OP (1) = relocation
>> 8;
1250 RX_STACK_POP (relocation
);
1252 OP (0) = relocation
;
1257 RX_STACK_POP (relocation
);
1259 OP (0) = relocation
;
1264 RX_STACK_POP (relocation
);
1267 OP (0) = relocation
;
1272 RX_STACK_POP (relocation
);
1275 OP (0) = relocation
;
1281 case R_RX_ABS8S_PCREL
:
1282 RX_STACK_POP (relocation
);
1284 OP (0) = relocation
;
1288 if (r_symndx
< symtab_hdr
->sh_info
)
1289 RX_STACK_PUSH (sec
->output_section
->vma
1290 + sec
->output_offset
1296 && (h
->root
.type
== bfd_link_hash_defined
1297 || h
->root
.type
== bfd_link_hash_defweak
))
1298 RX_STACK_PUSH (h
->root
.u
.def
.value
1299 + sec
->output_section
->vma
1300 + sec
->output_offset
1304 (_("warning: RX_SYM reloc with an unknown symbol"));
1312 saw_subtract
= true;
1315 RX_STACK_PUSH (tmp
);
1323 RX_STACK_POP (tmp1
);
1324 RX_STACK_POP (tmp2
);
1326 RX_STACK_PUSH (tmp1
);
1334 saw_subtract
= true;
1335 RX_STACK_POP (tmp1
);
1336 RX_STACK_POP (tmp2
);
1338 RX_STACK_PUSH (tmp2
);
1346 RX_STACK_POP (tmp1
);
1347 RX_STACK_POP (tmp2
);
1349 RX_STACK_PUSH (tmp1
);
1357 RX_STACK_POP (tmp1
);
1358 RX_STACK_POP (tmp2
);
1360 RX_STACK_PUSH (tmp1
);
1368 RX_STACK_POP (tmp1
);
1369 RX_STACK_POP (tmp2
);
1371 RX_STACK_PUSH (tmp1
);
1379 RX_STACK_POP (tmp1
);
1380 RX_STACK_POP (tmp2
);
1382 RX_STACK_PUSH (tmp1
);
1386 case R_RX_OPsctsize
:
1387 RX_STACK_PUSH (input_section
->size
);
1391 RX_STACK_PUSH (input_section
->output_section
->vma
);
1398 RX_STACK_POP (tmp1
);
1399 RX_STACK_POP (tmp2
);
1401 RX_STACK_PUSH (tmp1
);
1409 RX_STACK_POP (tmp1
);
1410 RX_STACK_POP (tmp2
);
1412 RX_STACK_PUSH (tmp1
);
1420 RX_STACK_POP (tmp1
);
1421 RX_STACK_POP (tmp2
);
1423 RX_STACK_PUSH (tmp1
);
1433 RX_STACK_PUSH (tmp
);
1441 RX_STACK_POP (tmp1
);
1442 RX_STACK_POP (tmp2
);
1444 RX_STACK_PUSH (tmp1
);
1449 RX_STACK_PUSH (get_romstart (info
, input_bfd
, input_section
, rel
->r_offset
));
1453 RX_STACK_PUSH (get_ramstart (info
, input_bfd
, input_section
, rel
->r_offset
));
1457 r
= bfd_reloc_notsupported
;
1461 if (r
!= bfd_reloc_ok
)
1463 const char * msg
= NULL
;
1467 case bfd_reloc_overflow
:
1468 /* Catch the case of a missing function declaration
1469 and emit a more helpful error message. */
1470 if (r_type
== R_RX_DIR24S_PCREL
)
1471 /* xgettext:c-format */
1472 msg
= _("%pB(%pA): error: call to undefined function '%s'");
1474 (*info
->callbacks
->reloc_overflow
)
1475 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
1476 input_bfd
, input_section
, rel
->r_offset
);
1479 case bfd_reloc_undefined
:
1480 (*info
->callbacks
->undefined_symbol
)
1481 (info
, name
, input_bfd
, input_section
, rel
->r_offset
, true);
1484 case bfd_reloc_other
:
1485 /* xgettext:c-format */
1486 msg
= _("%pB(%pA): warning: unaligned access to symbol '%s' in the small data area");
1489 case bfd_reloc_outofrange
:
1490 /* xgettext:c-format */
1491 msg
= _("%pB(%pA): internal error: out of range error");
1494 case bfd_reloc_notsupported
:
1495 /* xgettext:c-format */
1496 msg
= _("%pB(%pA): internal error: unsupported relocation error");
1499 case bfd_reloc_dangerous
:
1500 /* xgettext:c-format */
1501 msg
= _("%pB(%pA): internal error: dangerous relocation");
1505 /* xgettext:c-format */
1506 msg
= _("%pB(%pA): internal error: unknown error");
1511 _bfd_error_handler (msg
, input_bfd
, input_section
, name
);
1518 /* Relaxation Support. */
1520 /* Progression of relocations from largest operand size to smallest
1524 next_smaller_reloc (int r
)
1528 case R_RX_DIR32
: return R_RX_DIR24S
;
1529 case R_RX_DIR24S
: return R_RX_DIR16S
;
1530 case R_RX_DIR16S
: return R_RX_DIR8S
;
1531 case R_RX_DIR8S
: return R_RX_NONE
;
1533 case R_RX_DIR16
: return R_RX_DIR8
;
1534 case R_RX_DIR8
: return R_RX_NONE
;
1536 case R_RX_DIR16U
: return R_RX_DIR8U
;
1537 case R_RX_DIR8U
: return R_RX_NONE
;
1539 case R_RX_DIR24S_PCREL
: return R_RX_DIR16S_PCREL
;
1540 case R_RX_DIR16S_PCREL
: return R_RX_DIR8S_PCREL
;
1541 case R_RX_DIR8S_PCREL
: return R_RX_DIR3U_PCREL
;
1543 case R_RX_DIR16UL
: return R_RX_DIR8UL
;
1544 case R_RX_DIR8UL
: return R_RX_NONE
;
1545 case R_RX_DIR16UW
: return R_RX_DIR8UW
;
1546 case R_RX_DIR8UW
: return R_RX_NONE
;
1548 case R_RX_RH_32_OP
: return R_RX_RH_24_OP
;
1549 case R_RX_RH_24_OP
: return R_RX_RH_16_OP
;
1550 case R_RX_RH_16_OP
: return R_RX_DIR8
;
1552 case R_RX_ABS32
: return R_RX_ABS24S
;
1553 case R_RX_ABS24S
: return R_RX_ABS16S
;
1554 case R_RX_ABS16
: return R_RX_ABS8
;
1555 case R_RX_ABS16U
: return R_RX_ABS8U
;
1556 case R_RX_ABS16S
: return R_RX_ABS8S
;
1557 case R_RX_ABS8
: return R_RX_NONE
;
1558 case R_RX_ABS8U
: return R_RX_NONE
;
1559 case R_RX_ABS8S
: return R_RX_NONE
;
1560 case R_RX_ABS24S_PCREL
: return R_RX_ABS16S_PCREL
;
1561 case R_RX_ABS16S_PCREL
: return R_RX_ABS8S_PCREL
;
1562 case R_RX_ABS8S_PCREL
: return R_RX_NONE
;
1563 case R_RX_ABS16UL
: return R_RX_ABS8UL
;
1564 case R_RX_ABS16UW
: return R_RX_ABS8UW
;
1565 case R_RX_ABS8UL
: return R_RX_NONE
;
1566 case R_RX_ABS8UW
: return R_RX_NONE
;
1571 /* Delete some bytes from a section while relaxing. */
1574 elf32_rx_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, int count
,
1575 Elf_Internal_Rela
*alignment_rel
, int force_snip
,
1576 Elf_Internal_Rela
*irelstart
)
1578 Elf_Internal_Shdr
* symtab_hdr
;
1579 unsigned int sec_shndx
;
1580 bfd_byte
* contents
;
1581 Elf_Internal_Rela
* irel
;
1582 Elf_Internal_Rela
* irelend
;
1583 Elf_Internal_Sym
* isym
;
1584 Elf_Internal_Sym
* isymend
;
1586 unsigned int symcount
;
1587 struct elf_link_hash_entry
** sym_hashes
;
1588 struct elf_link_hash_entry
** end_hashes
;
1593 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1595 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1597 /* The deletion must stop at the next alignment boundary, if
1598 ALIGNMENT_REL is non-NULL. */
1601 toaddr
= alignment_rel
->r_offset
;
1603 BFD_ASSERT (toaddr
> addr
);
1605 /* Actually delete the bytes. */
1606 memmove (contents
+ addr
, contents
+ addr
+ count
,
1607 (size_t) (toaddr
- addr
- count
));
1609 /* If we don't have an alignment marker to worry about, we can just
1610 shrink the section. Otherwise, we have to fill in the newly
1611 created gap with NOP insns (0x03). */
1615 memset (contents
+ toaddr
- count
, 0x03, count
);
1618 BFD_ASSERT (irel
!= NULL
|| sec
->reloc_count
== 0);
1619 irelend
= irel
+ sec
->reloc_count
;
1621 /* Adjust all the relocs. */
1622 for (; irel
< irelend
; irel
++)
1624 /* Get the new reloc address. */
1625 if (irel
->r_offset
> addr
1626 && (irel
->r_offset
< toaddr
1627 || (force_snip
&& irel
->r_offset
== toaddr
)))
1628 irel
->r_offset
-= count
;
1630 /* If we see an ALIGN marker at the end of the gap, we move it
1631 to the beginning of the gap, since marking these gaps is what
1633 if (irel
->r_offset
== toaddr
1634 && ELF32_R_TYPE (irel
->r_info
) == R_RX_RH_RELAX
1635 && irel
->r_addend
& RX_RELAXA_ALIGN
)
1636 irel
->r_offset
-= count
;
1639 /* Adjust the local symbols defined in this section. */
1640 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1641 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1642 isymend
= isym
+ symtab_hdr
->sh_info
;
1644 for (; isym
< isymend
; isym
++)
1646 /* If the symbol is in the range of memory we just moved, we
1647 have to adjust its value. */
1648 if (isym
->st_shndx
== sec_shndx
1649 && isym
->st_value
> addr
1650 && isym
->st_value
< toaddr
)
1651 isym
->st_value
-= count
;
1653 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1654 *end* is in the moved bytes but it's *start* isn't), then we
1655 must adjust its size. */
1656 if (isym
->st_shndx
== sec_shndx
1657 && isym
->st_value
< addr
1658 && isym
->st_value
+ isym
->st_size
> addr
1659 && isym
->st_value
+ isym
->st_size
< toaddr
)
1660 isym
->st_size
-= count
;
1663 /* Now adjust the global symbols defined in this section. */
1664 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1665 - symtab_hdr
->sh_info
);
1666 sym_hashes
= elf_sym_hashes (abfd
);
1667 end_hashes
= sym_hashes
+ symcount
;
1669 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1671 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1673 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1674 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1675 && sym_hash
->root
.u
.def
.section
== sec
)
1677 /* As above, adjust the value if needed. */
1678 if (sym_hash
->root
.u
.def
.value
> addr
1679 && sym_hash
->root
.u
.def
.value
< toaddr
)
1680 sym_hash
->root
.u
.def
.value
-= count
;
1682 /* As above, adjust the size if needed. */
1683 if (sym_hash
->root
.u
.def
.value
< addr
1684 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
1685 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
< toaddr
)
1686 sym_hash
->size
-= count
;
1693 /* Used to sort relocs by address. If relocs have the same address,
1694 we maintain their relative order, except that R_RX_RH_RELAX
1695 alignment relocs must be the first reloc for any given address. */
1698 reloc_bubblesort (Elf_Internal_Rela
* r
, int count
)
1704 /* This is almost a classic bubblesort. It's the slowest sort, but
1705 we're taking advantage of the fact that the relocations are
1706 mostly in order already (the assembler emits them that way) and
1707 we need relocs with the same address to remain in the same
1713 for (i
= 0; i
< count
- 1; i
++)
1715 if (r
[i
].r_offset
> r
[i
+ 1].r_offset
)
1717 else if (r
[i
].r_offset
< r
[i
+ 1].r_offset
)
1719 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RX_RH_RELAX
1720 && (r
[i
+ 1].r_addend
& RX_RELAXA_ALIGN
))
1722 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RX_RH_RELAX
1723 && (r
[i
+ 1].r_addend
& RX_RELAXA_ELIGN
)
1724 && !(ELF32_R_TYPE (r
[i
].r_info
) == R_RX_RH_RELAX
1725 && (r
[i
].r_addend
& RX_RELAXA_ALIGN
)))
1732 Elf_Internal_Rela tmp
;
1737 /* If we do move a reloc back, re-scan to see if it
1738 needs to be moved even further back. This avoids
1739 most of the O(n^2) behavior for our cases. */
1749 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1750 rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1751 lrel, abfd, sec, link_info, scale)
1754 rx_offset_for_reloc (bfd
* abfd
,
1755 Elf_Internal_Rela
* rel
,
1756 Elf_Internal_Shdr
* symtab_hdr
,
1757 bfd_byte
* shndx_buf ATTRIBUTE_UNUSED
,
1758 Elf_Internal_Sym
* intsyms
,
1759 Elf_Internal_Rela
** lrel
,
1761 asection
* input_section
,
1762 struct bfd_link_info
* info
,
1766 bfd_reloc_status_type r
;
1770 /* REL is the first of 1..N relocations. We compute the symbol
1771 value for each relocation, then combine them if needed. LREL
1772 gets a pointer to the last relocation used. */
1777 /* Get the value of the symbol referred to by the reloc. */
1778 if (ELF32_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
1780 /* A local symbol. */
1781 Elf_Internal_Sym
*isym
;
1784 isym
= intsyms
+ ELF32_R_SYM (rel
->r_info
);
1786 if (isym
->st_shndx
== SHN_UNDEF
)
1787 ssec
= bfd_und_section_ptr
;
1788 else if (isym
->st_shndx
== SHN_ABS
)
1789 ssec
= bfd_abs_section_ptr
;
1790 else if (isym
->st_shndx
== SHN_COMMON
)
1791 ssec
= bfd_com_section_ptr
;
1793 ssec
= bfd_section_from_elf_index (abfd
,
1796 /* Initial symbol value. */
1797 symval
= isym
->st_value
;
1799 /* GAS may have made this symbol relative to a section, in
1800 which case, we have to add the addend to find the
1802 if (ELF_ST_TYPE (isym
->st_info
) == STT_SECTION
)
1803 symval
+= rel
->r_addend
;
1807 if ((ssec
->flags
& SEC_MERGE
)
1808 && ssec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
1809 symval
= _bfd_merged_section_offset (abfd
, & ssec
,
1810 elf_section_data (ssec
)->sec_info
,
1814 /* Now make the offset relative to where the linker is putting it. */
1817 ssec
->output_section
->vma
+ ssec
->output_offset
;
1819 symval
+= rel
->r_addend
;
1824 struct elf_link_hash_entry
* h
;
1826 /* An external symbol. */
1827 indx
= ELF32_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
1828 h
= elf_sym_hashes (abfd
)[indx
];
1829 BFD_ASSERT (h
!= NULL
);
1831 if (h
->root
.type
!= bfd_link_hash_defined
1832 && h
->root
.type
!= bfd_link_hash_defweak
)
1834 /* This appears to be a reference to an undefined
1835 symbol. Just ignore it--it will be caught by the
1836 regular reloc processing. */
1842 symval
= (h
->root
.u
.def
.value
1843 + h
->root
.u
.def
.section
->output_section
->vma
1844 + h
->root
.u
.def
.section
->output_offset
);
1846 symval
+= rel
->r_addend
;
1849 switch (ELF32_R_TYPE (rel
->r_info
))
1852 RX_STACK_PUSH (symval
);
1856 RX_STACK_POP (tmp1
);
1858 RX_STACK_PUSH (tmp1
);
1862 RX_STACK_POP (tmp1
);
1863 RX_STACK_POP (tmp2
);
1865 RX_STACK_PUSH (tmp1
);
1869 RX_STACK_POP (tmp1
);
1870 RX_STACK_POP (tmp2
);
1872 RX_STACK_PUSH (tmp2
);
1876 RX_STACK_POP (tmp1
);
1877 RX_STACK_POP (tmp2
);
1879 RX_STACK_PUSH (tmp1
);
1883 RX_STACK_POP (tmp1
);
1884 RX_STACK_POP (tmp2
);
1886 RX_STACK_PUSH (tmp1
);
1890 RX_STACK_POP (tmp1
);
1891 RX_STACK_POP (tmp2
);
1893 RX_STACK_PUSH (tmp1
);
1897 RX_STACK_POP (tmp1
);
1898 RX_STACK_POP (tmp2
);
1900 RX_STACK_PUSH (tmp1
);
1903 case R_RX_OPsctsize
:
1904 RX_STACK_PUSH (input_section
->size
);
1908 RX_STACK_PUSH (input_section
->output_section
->vma
);
1912 RX_STACK_POP (tmp1
);
1913 RX_STACK_POP (tmp2
);
1915 RX_STACK_PUSH (tmp1
);
1919 RX_STACK_POP (tmp1
);
1920 RX_STACK_POP (tmp2
);
1922 RX_STACK_PUSH (tmp1
);
1926 RX_STACK_POP (tmp1
);
1927 RX_STACK_POP (tmp2
);
1929 RX_STACK_PUSH (tmp1
);
1933 RX_STACK_POP (tmp1
);
1935 RX_STACK_PUSH (tmp1
);
1939 RX_STACK_POP (tmp1
);
1940 RX_STACK_POP (tmp2
);
1942 RX_STACK_PUSH (tmp1
);
1946 RX_STACK_PUSH (get_romstart (info
, input_bfd
, input_section
, rel
->r_offset
));
1950 RX_STACK_PUSH (get_ramstart (info
, input_bfd
, input_section
, rel
->r_offset
));
1958 RX_STACK_POP (symval
);
1969 RX_STACK_POP (symval
);
1977 RX_STACK_POP (symval
);
1990 move_reloc (Elf_Internal_Rela
* irel
, Elf_Internal_Rela
* srel
, int delta
)
1992 bfd_vma old_offset
= srel
->r_offset
;
1995 while (irel
<= srel
)
1997 if (irel
->r_offset
== old_offset
)
1998 irel
->r_offset
+= delta
;
2003 /* Relax one section. */
2006 elf32_rx_relax_section (bfd
*abfd
,
2008 struct bfd_link_info
*link_info
,
2012 Elf_Internal_Shdr
*symtab_hdr
;
2013 Elf_Internal_Shdr
*shndx_hdr
;
2014 Elf_Internal_Rela
*internal_relocs
;
2015 Elf_Internal_Rela
*irel
;
2016 Elf_Internal_Rela
*srel
;
2017 Elf_Internal_Rela
*irelend
;
2018 Elf_Internal_Rela
*next_alignment
;
2019 Elf_Internal_Rela
*prev_alignment
;
2020 bfd_byte
*contents
= NULL
;
2021 bfd_byte
*free_contents
= NULL
;
2022 Elf_Internal_Sym
*intsyms
= NULL
;
2023 Elf_Internal_Sym
*free_intsyms
= NULL
;
2024 bfd_byte
*shndx_buf
= NULL
;
2030 int section_alignment_glue
;
2031 /* how much to scale the relocation by - 1, 2, or 4. */
2034 /* Assume nothing changes. */
2037 /* We don't have to do anything for a relocatable link, if
2038 this section does not have relocs, or if this is not a
2040 if (bfd_link_relocatable (link_info
)
2041 || sec
->reloc_count
== 0
2042 || (sec
->flags
& SEC_RELOC
) == 0
2043 || (sec
->flags
& SEC_HAS_CONTENTS
) == 0
2044 || (sec
->flags
& SEC_CODE
) == 0)
2047 symtab_hdr
= & elf_symtab_hdr (abfd
);
2048 if (elf_symtab_shndx_list (abfd
))
2049 shndx_hdr
= & elf_symtab_shndx_list (abfd
)->hdr
;
2053 sec_start
= sec
->output_section
->vma
+ sec
->output_offset
;
2055 /* Get the section contents. */
2056 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
2057 contents
= elf_section_data (sec
)->this_hdr
.contents
;
2058 /* Go get them off disk. */
2061 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
2063 elf_section_data (sec
)->this_hdr
.contents
= contents
;
2066 /* Read this BFD's symbols. */
2067 /* Get cached copy if it exists. */
2068 if (symtab_hdr
->contents
!= NULL
)
2069 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
2072 intsyms
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
, symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
2073 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
2076 if (shndx_hdr
&& shndx_hdr
->sh_size
!= 0)
2080 if (_bfd_mul_overflow (symtab_hdr
->sh_info
,
2081 sizeof (Elf_External_Sym_Shndx
), &amt
))
2083 bfd_set_error (bfd_error_file_too_big
);
2086 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0)
2088 shndx_buf
= _bfd_malloc_and_read (abfd
, amt
, amt
);
2089 if (shndx_buf
== NULL
)
2091 shndx_hdr
->contents
= shndx_buf
;
2094 /* Get a copy of the native relocations. */
2095 /* Note - we ignore the setting of link_info->keep_memory when reading
2096 in these relocs. We have to maintain a permanent copy of the relocs
2097 because we are going to walk over them multiple times, adjusting them
2098 as bytes are deleted from the section, and with this relaxation
2099 function itself being called multiple times on the same section... */
2100 internal_relocs
= _bfd_elf_link_read_relocs
2101 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
, true);
2102 if (internal_relocs
== NULL
)
2105 /* The RL_ relocs must be just before the operand relocs they go
2106 with, so we must sort them to guarantee this. We use bubblesort
2107 instead of qsort so we can guarantee that relocs with the same
2108 address remain in the same relative order. */
2109 reloc_bubblesort (internal_relocs
, sec
->reloc_count
);
2111 /* Walk through them looking for relaxing opportunities. */
2112 irelend
= internal_relocs
+ sec
->reloc_count
;
2114 /* This will either be NULL or a pointer to the next alignment
2116 next_alignment
= internal_relocs
;
2117 /* This will be the previous alignment, although at first it points
2118 to the first real relocation. */
2119 prev_alignment
= internal_relocs
;
2121 /* We calculate worst case shrinkage caused by alignment directives.
2122 No fool-proof, but better than either ignoring the problem or
2123 doing heavy duty analysis of all the alignment markers in all
2125 section_alignment_glue
= 0;
2126 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2127 if (ELF32_R_TYPE (irel
->r_info
) == R_RX_RH_RELAX
2128 && irel
->r_addend
& RX_RELAXA_ALIGN
)
2130 int this_glue
= 1 << (irel
->r_addend
& RX_RELAXA_ANUM
);
2132 if (section_alignment_glue
< this_glue
)
2133 section_alignment_glue
= this_glue
;
2135 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2137 section_alignment_glue
*= 2;
2139 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2141 unsigned char *insn
;
2144 /* The insns we care about are all marked with one of these. */
2145 if (ELF32_R_TYPE (irel
->r_info
) != R_RX_RH_RELAX
)
2148 if (irel
->r_addend
& RX_RELAXA_ALIGN
2149 || next_alignment
== internal_relocs
)
2151 /* When we delete bytes, we need to maintain all the alignments
2152 indicated. In addition, we need to be careful about relaxing
2153 jumps across alignment boundaries - these displacements
2154 *grow* when we delete bytes. For now, don't shrink
2155 displacements across an alignment boundary, just in case.
2156 Note that this only affects relocations to the same
2158 prev_alignment
= next_alignment
;
2159 next_alignment
+= 2;
2160 while (next_alignment
< irelend
2161 && (ELF32_R_TYPE (next_alignment
->r_info
) != R_RX_RH_RELAX
2162 || !(next_alignment
->r_addend
& RX_RELAXA_ELIGN
)))
2164 if (next_alignment
>= irelend
|| next_alignment
->r_offset
== 0)
2165 next_alignment
= NULL
;
2168 /* When we hit alignment markers, see if we've shrunk enough
2169 before them to reduce the gap without violating the alignment
2171 if (irel
->r_addend
& RX_RELAXA_ALIGN
)
2173 /* At this point, the next relocation *should* be the ELIGN
2175 Elf_Internal_Rela
*erel
= irel
+ 1;
2176 unsigned int alignment
, nbytes
;
2178 if (ELF32_R_TYPE (erel
->r_info
) != R_RX_RH_RELAX
)
2180 if (!(erel
->r_addend
& RX_RELAXA_ELIGN
))
2183 alignment
= 1 << (irel
->r_addend
& RX_RELAXA_ANUM
);
2185 if (erel
->r_offset
- irel
->r_offset
< alignment
)
2188 nbytes
= erel
->r_offset
- irel
->r_offset
;
2189 nbytes
/= alignment
;
2190 nbytes
*= alignment
;
2192 elf32_rx_relax_delete_bytes (abfd
, sec
, erel
->r_offset
-nbytes
, nbytes
, next_alignment
,
2193 erel
->r_offset
== sec
->size
, internal_relocs
);
2199 if (irel
->r_addend
& RX_RELAXA_ELIGN
)
2202 insn
= contents
+ irel
->r_offset
;
2204 nrelocs
= irel
->r_addend
& RX_RELAXA_RNUM
;
2206 /* At this point, we have an insn that is a candidate for linker
2207 relaxation. There are NRELOCS relocs following that may be
2208 relaxed, although each reloc may be made of more than one
2209 reloc entry (such as gp-rel symbols). */
2211 /* Get the value of the symbol referred to by the reloc. Just
2212 in case this is the last reloc in the list, use the RL's
2213 addend to choose between this reloc (no addend) or the next
2214 (yes addend, which means at least one following reloc). */
2216 /* srel points to the "current" reloction for this insn -
2217 actually the last reloc for a given operand, which is the one
2218 we need to update. We check the relaxations in the same
2219 order that the relocations happen, so we'll just push it
2223 pc
= sec
->output_section
->vma
+ sec
->output_offset
2227 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2228 pcrel = symval - pc + srel->r_addend; \
2231 #define SNIPNR(offset, nbytes) \
2232 elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2233 #define SNIP(offset, nbytes, newtype) \
2234 SNIPNR (offset, nbytes); \
2235 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2237 /* The order of these bit tests must match the order that the
2238 relocs appear in. Since we sorted those by offset, we can
2241 /* Note that the numbers in, say, DSP6 are the bit offsets of
2242 the code fields that describe the operand. Bits number 0 for
2243 the MSB of insn[0]. */
2250 if (irel
->r_addend
& RX_RELAXA_DSP6
)
2255 if (code
== 2 && symval
/scale
<= 255)
2257 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2260 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2261 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2263 SNIP (3, 1, newrel
);
2268 else if (code
== 1 && symval
== 0)
2271 SNIP (2, 1, R_RX_NONE
);
2275 /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
2276 else if (code
== 1 && symval
/scale
<= 31
2277 /* Decodable bits. */
2278 && (insn
[0] & 0xcc) == 0xcc
2280 && (insn
[0] & 0x30) != 0x30
2281 /* Register MSBs. */
2282 && (insn
[1] & 0x88) == 0x00)
2286 insn
[0] = 0x88 | (insn
[0] & 0x30);
2287 /* The register fields are in the right place already. */
2289 /* We can't relax this new opcode. */
2292 switch ((insn
[0] & 0x30) >> 4)
2295 newrel
= R_RX_RH_ABS5p5B
;
2298 newrel
= R_RX_RH_ABS5p5W
;
2301 newrel
= R_RX_RH_ABS5p5L
;
2305 move_reloc (irel
, srel
, -2);
2306 SNIP (2, 1, newrel
);
2309 /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */
2310 else if (code
== 1 && symval
/scale
<= 31
2311 /* Decodable bits. */
2312 && (insn
[0] & 0xf8) == 0x58
2313 /* Register MSBs. */
2314 && (insn
[1] & 0x88) == 0x00)
2318 insn
[0] = 0xb0 | ((insn
[0] & 0x04) << 1);
2319 /* The register fields are in the right place already. */
2321 /* We can't relax this new opcode. */
2324 switch ((insn
[0] & 0x08) >> 3)
2327 newrel
= R_RX_RH_ABS5p5B
;
2330 newrel
= R_RX_RH_ABS5p5W
;
2334 move_reloc (irel
, srel
, -2);
2335 SNIP (2, 1, newrel
);
2339 /* A DSP4 operand always follows a DSP6 operand, even if there's
2340 no relocation for it. We have to read the code out of the
2341 opcode to calculate the offset of the operand. */
2342 if (irel
->r_addend
& RX_RELAXA_DSP4
)
2344 int code6
, offset
= 0;
2348 code6
= insn
[0] & 0x03;
2351 case 0: offset
= 2; break;
2352 case 1: offset
= 3; break;
2353 case 2: offset
= 4; break;
2354 case 3: offset
= 2; break;
2357 code
= (insn
[0] & 0x0c) >> 2;
2359 if (code
== 2 && symval
/ scale
<= 255)
2361 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2365 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2366 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2368 SNIP (offset
+1, 1, newrel
);
2373 else if (code
== 1 && symval
== 0)
2376 SNIP (offset
, 1, R_RX_NONE
);
2379 /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2380 else if (code
== 1 && symval
/scale
<= 31
2381 /* Decodable bits. */
2382 && (insn
[0] & 0xc3) == 0xc3
2384 && (insn
[0] & 0x30) != 0x30
2385 /* Register MSBs. */
2386 && (insn
[1] & 0x88) == 0x00)
2390 insn
[0] = 0x80 | (insn
[0] & 0x30);
2391 /* The register fields are in the right place already. */
2393 /* We can't relax this new opcode. */
2396 switch ((insn
[0] & 0x30) >> 4)
2399 newrel
= R_RX_RH_ABS5p5B
;
2402 newrel
= R_RX_RH_ABS5p5W
;
2405 newrel
= R_RX_RH_ABS5p5L
;
2409 move_reloc (irel
, srel
, -2);
2410 SNIP (2, 1, newrel
);
2414 /* These always occur alone, but the offset depends on whether
2415 it's a MEMEX opcode (0x06) or not. */
2416 if (irel
->r_addend
& RX_RELAXA_DSP14
)
2421 if (insn
[0] == 0x06)
2428 if (code
== 2 && symval
/ scale
<= 255)
2430 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2434 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2435 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2437 SNIP (offset
, 1, newrel
);
2441 else if (code
== 1 && symval
== 0)
2444 SNIP (offset
, 1, R_RX_NONE
);
2455 /* These always occur alone. */
2456 if (irel
->r_addend
& RX_RELAXA_IMM6
)
2462 /* These relocations sign-extend, so we must do signed compares. */
2463 ssymval
= (long) symval
;
2465 code
= insn
[0] & 0x03;
2467 if (code
== 0 && ssymval
<= 8388607 && ssymval
>= -8388608)
2469 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2473 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2474 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2476 SNIP (2, 1, newrel
);
2481 else if (code
== 3 && ssymval
<= 32767 && ssymval
>= -32768)
2483 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2487 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2488 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2490 SNIP (2, 1, newrel
);
2495 /* Special case UIMM8 format: CMP #uimm8,Rdst. */
2496 else if (code
== 2 && ssymval
<= 255 && ssymval
>= 16
2497 /* Decodable bits. */
2498 && (insn
[0] & 0xfc) == 0x74
2499 /* Decodable bits. */
2500 && ((insn
[1] & 0xf0) == 0x00))
2505 insn
[1] = 0x50 | (insn
[1] & 0x0f);
2507 /* We can't relax this new opcode. */
2510 if (STACK_REL_P (ELF32_R_TYPE (srel
->r_info
)))
2511 newrel
= R_RX_ABS8U
;
2513 newrel
= R_RX_DIR8U
;
2515 SNIP (2, 1, newrel
);
2519 else if (code
== 2 && ssymval
<= 127 && ssymval
>= -128)
2521 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2525 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2526 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2528 SNIP (2, 1, newrel
);
2533 /* Special case UIMM4 format: CMP, MUL, AND, OR. */
2534 else if (code
== 1 && ssymval
<= 15 && ssymval
>= 0
2535 /* Decodable bits and immediate type. */
2537 /* Decodable bits. */
2538 && (insn
[1] & 0xc0) == 0x00)
2540 static const int newop
[4] = { 1, 3, 4, 5 };
2542 insn
[0] = 0x60 | newop
[insn
[1] >> 4];
2543 /* The register number doesn't move. */
2545 /* We can't relax this new opcode. */
2548 move_reloc (irel
, srel
, -1);
2550 SNIP (2, 1, R_RX_RH_UIMM4p8
);
2554 /* Special case UIMM4 format: ADD -> ADD/SUB. */
2555 else if (code
== 1 && ssymval
<= 15 && ssymval
>= -15
2556 /* Decodable bits and immediate type. */
2558 /* Same register for source and destination. */
2559 && ((insn
[1] >> 4) == (insn
[1] & 0x0f)))
2563 /* Note that we can't turn "add $0,Rs" into a NOP
2564 because the flags need to be set right. */
2568 insn
[0] = 0x60; /* Subtract. */
2569 newrel
= R_RX_RH_UNEG4p8
;
2573 insn
[0] = 0x62; /* Add. */
2574 newrel
= R_RX_RH_UIMM4p8
;
2577 /* The register number is in the right place. */
2579 /* We can't relax this new opcode. */
2582 move_reloc (irel
, srel
, -1);
2584 SNIP (2, 1, newrel
);
2589 /* These are either matched with a DSP6 (2-byte base) or an id24
2591 if (irel
->r_addend
& RX_RELAXA_IMM12
)
2593 int dspcode
, offset
= 0;
2598 if ((insn
[0] & 0xfc) == 0xfc)
2599 dspcode
= 1; /* Just something with one byte operand. */
2601 dspcode
= insn
[0] & 3;
2604 case 0: offset
= 2; break;
2605 case 1: offset
= 3; break;
2606 case 2: offset
= 4; break;
2607 case 3: offset
= 2; break;
2610 /* These relocations sign-extend, so we must do signed compares. */
2611 ssymval
= (long) symval
;
2613 code
= (insn
[1] >> 2) & 3;
2614 if (code
== 0 && ssymval
<= 8388607 && ssymval
>= -8388608)
2616 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2620 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2621 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2623 SNIP (offset
, 1, newrel
);
2628 else if (code
== 3 && ssymval
<= 32767 && ssymval
>= -32768)
2630 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2634 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2635 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2637 SNIP (offset
, 1, newrel
);
2642 /* Special case UIMM8 format: MOV #uimm8,Rdst. */
2643 else if (code
== 2 && ssymval
<= 255 && ssymval
>= 16
2644 /* Decodable bits. */
2646 /* Decodable bits. */
2647 && ((insn
[1] & 0x03) == 0x02))
2652 insn
[1] = 0x40 | (insn
[1] >> 4);
2654 /* We can't relax this new opcode. */
2657 if (STACK_REL_P (ELF32_R_TYPE (srel
->r_info
)))
2658 newrel
= R_RX_ABS8U
;
2660 newrel
= R_RX_DIR8U
;
2662 SNIP (2, 1, newrel
);
2666 else if (code
== 2 && ssymval
<= 127 && ssymval
>= -128)
2668 unsigned int newrel
= ELF32_R_TYPE(srel
->r_info
);
2672 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2673 if (newrel
!= ELF32_R_TYPE(srel
->r_info
))
2675 SNIP (offset
, 1, newrel
);
2680 /* Special case UIMM4 format: MOV #uimm4,Rdst. */
2681 else if (code
== 1 && ssymval
<= 15 && ssymval
>= 0
2682 /* Decodable bits. */
2684 /* Decodable bits. */
2685 && ((insn
[1] & 0x03) == 0x02))
2688 insn
[1] = insn
[1] >> 4;
2690 /* We can't relax this new opcode. */
2693 move_reloc (irel
, srel
, -1);
2695 SNIP (2, 1, R_RX_RH_UIMM4p8
);
2700 if (irel
->r_addend
& RX_RELAXA_BRA
)
2702 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2704 int alignment_glue
= 0;
2708 /* Branches over alignment chunks are problematic, as
2709 deleting bytes here makes the branch *further* away. We
2710 can be agressive with branches within this alignment
2711 block, but not branches outside it. */
2712 if ((prev_alignment
== NULL
2713 || symval
< (bfd_vma
)(sec_start
+ prev_alignment
->r_offset
))
2714 && (next_alignment
== NULL
2715 || symval
> (bfd_vma
)(sec_start
+ next_alignment
->r_offset
)))
2716 alignment_glue
= section_alignment_glue
;
2718 if (ELF32_R_TYPE(srel
[1].r_info
) == R_RX_RH_RELAX
2719 && srel
[1].r_addend
& RX_RELAXA_BRA
2720 && srel
[1].r_offset
< irel
->r_offset
+ pcrel
)
2723 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2725 /* The values we compare PCREL with are not what you'd
2726 expect; they're off by a little to compensate for (1)
2727 where the reloc is relative to the insn, and (2) how much
2728 the insn is going to change when we relax it. */
2730 /* These we have to decode. */
2733 case 0x04: /* BRA pcdsp:24 */
2734 if (-32768 + alignment_glue
<= pcrel
2735 && pcrel
<= 32765 - alignment_glue
)
2738 SNIP (3, 1, newrel
);
2743 case 0x38: /* BRA pcdsp:16 */
2744 if (-128 + alignment_glue
<= pcrel
2745 && pcrel
<= 127 - alignment_glue
)
2748 SNIP (2, 1, newrel
);
2753 case 0x2e: /* BRA pcdsp:8 */
2754 /* Note that there's a risk here of shortening things so
2755 much that we no longer fit this reloc; it *should*
2756 only happen when you branch across a branch, and that
2757 branch also devolves into BRA.S. "Real" code should
2759 if (max_pcrel3
+ alignment_glue
<= pcrel
2760 && pcrel
<= 10 - alignment_glue
2764 SNIP (1, 1, newrel
);
2765 move_reloc (irel
, srel
, -1);
2770 case 0x05: /* BSR pcdsp:24 */
2771 if (-32768 + alignment_glue
<= pcrel
2772 && pcrel
<= 32765 - alignment_glue
)
2775 SNIP (1, 1, newrel
);
2780 case 0x3a: /* BEQ.W pcdsp:16 */
2781 case 0x3b: /* BNE.W pcdsp:16 */
2782 if (-128 + alignment_glue
<= pcrel
2783 && pcrel
<= 127 - alignment_glue
)
2785 insn
[0] = 0x20 | (insn
[0] & 1);
2786 SNIP (1, 1, newrel
);
2791 case 0x20: /* BEQ.B pcdsp:8 */
2792 case 0x21: /* BNE.B pcdsp:8 */
2793 if (max_pcrel3
+ alignment_glue
<= pcrel
2794 && pcrel
- alignment_glue
<= 10
2797 insn
[0] = 0x10 | ((insn
[0] & 1) << 3);
2798 SNIP (1, 1, newrel
);
2799 move_reloc (irel
, srel
, -1);
2804 case 0x16: /* synthetic BNE dsp24 */
2805 case 0x1e: /* synthetic BEQ dsp24 */
2806 if (-32767 + alignment_glue
<= pcrel
2807 && pcrel
<= 32766 - alignment_glue
2810 if (insn
[0] == 0x16)
2814 /* We snip out the bytes at the end else the reloc
2815 will get moved too, and too much. */
2816 SNIP (3, 2, newrel
);
2817 move_reloc (irel
, srel
, -1);
2823 /* Special case - synthetic conditional branches, pcrel24.
2824 Note that EQ and NE have been handled above. */
2825 if ((insn
[0] & 0xf0) == 0x20
2828 && srel
->r_offset
!= irel
->r_offset
+ 1
2829 && -32767 + alignment_glue
<= pcrel
2830 && pcrel
<= 32766 - alignment_glue
)
2834 SNIP (5, 1, newrel
);
2838 /* Special case - synthetic conditional branches, pcrel16 */
2839 if ((insn
[0] & 0xf0) == 0x20
2842 && srel
->r_offset
!= irel
->r_offset
+ 1
2843 && -127 + alignment_glue
<= pcrel
2844 && pcrel
<= 126 - alignment_glue
)
2846 int cond
= (insn
[0] & 0x0f) ^ 0x01;
2848 insn
[0] = 0x20 | cond
;
2849 /* By moving the reloc first, we avoid having
2850 delete_bytes move it also. */
2851 move_reloc (irel
, srel
, -2);
2852 SNIP (2, 3, newrel
);
2857 BFD_ASSERT (nrelocs
== 0);
2859 /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2860 use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky
2861 because it may have one or two relocations. */
2862 if ((insn
[0] & 0xfc) == 0xf8
2863 && (insn
[1] & 0x80) == 0x00
2864 && (insn
[0] & 0x03) != 0x03)
2866 int dcode
, icode
, reg
, ioff
, dscale
, ilen
;
2867 bfd_vma disp_val
= 0;
2869 Elf_Internal_Rela
* disp_rel
= 0;
2870 Elf_Internal_Rela
* imm_rel
= 0;
2875 dcode
= insn
[0] & 0x03;
2876 icode
= (insn
[1] >> 2) & 0x03;
2877 reg
= (insn
[1] >> 4) & 0x0f;
2879 ioff
= dcode
== 1 ? 3 : dcode
== 2 ? 4 : 2;
2881 /* Figure out what the dispacement is. */
2882 if (dcode
== 1 || dcode
== 2)
2884 /* There's a displacement. See if there's a reloc for it. */
2885 if (srel
[1].r_offset
== irel
->r_offset
+ 2)
2897 #if RX_OPCODE_BIG_ENDIAN
2898 disp_val
= insn
[2] * 256 + insn
[3];
2900 disp_val
= insn
[2] + insn
[3] * 256;
2903 switch (insn
[1] & 3)
2919 /* Figure out what the immediate is. */
2920 if (srel
[1].r_offset
== irel
->r_offset
+ ioff
)
2923 imm_val
= (long) symval
;
2928 unsigned char * ip
= insn
+ ioff
;
2933 /* For byte writes, we don't sign extend. Makes the math easier later. */
2937 imm_val
= (char) ip
[0];
2940 #if RX_OPCODE_BIG_ENDIAN
2941 imm_val
= ((char) ip
[0] << 8) | ip
[1];
2943 imm_val
= ((char) ip
[1] << 8) | ip
[0];
2947 #if RX_OPCODE_BIG_ENDIAN
2948 imm_val
= ((char) ip
[0] << 16) | (ip
[1] << 8) | ip
[2];
2950 imm_val
= ((char) ip
[2] << 16) | (ip
[1] << 8) | ip
[0];
2954 #if RX_OPCODE_BIG_ENDIAN
2955 imm_val
= ((unsigned) ip
[0] << 24) | (ip
[1] << 16) | (ip
[2] << 8) | ip
[3];
2957 imm_val
= ((unsigned) ip
[3] << 24) | (ip
[2] << 16) | (ip
[1] << 8) | ip
[0];
2991 /* The shortcut happens when the immediate is 0..255,
2992 register r0 to r7, and displacement (scaled) 0..31. */
2994 if (0 <= imm_val
&& imm_val
<= 255
2995 && 0 <= reg
&& reg
<= 7
2996 && disp_val
/ dscale
<= 31)
2998 insn
[0] = 0x3c | (insn
[1] & 0x03);
2999 insn
[1] = (((disp_val
/ dscale
) << 3) & 0x80) | (reg
<< 4) | ((disp_val
/dscale
) & 0x0f);
3004 int newrel
= R_RX_NONE
;
3009 newrel
= R_RX_RH_ABS5p8B
;
3012 newrel
= R_RX_RH_ABS5p8W
;
3015 newrel
= R_RX_RH_ABS5p8L
;
3018 disp_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (disp_rel
->r_info
), newrel
);
3019 move_reloc (irel
, disp_rel
, -1);
3023 imm_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (imm_rel
->r_info
), R_RX_DIR8U
);
3024 move_reloc (disp_rel
? disp_rel
: irel
,
3026 irel
->r_offset
- imm_rel
->r_offset
+ 2);
3029 SNIPNR (3, ilen
- 3);
3032 /* We can't relax this new opcode. */
3038 /* We can't reliably relax branches to DIR3U_PCREL unless we know
3039 whatever they're branching over won't shrink any more. If we're
3040 basically done here, do one more pass just for branches - but
3041 don't request a pass after that one! */
3042 if (!*again
&& !allow_pcrel3
)
3046 elf32_rx_relax_section (abfd
, sec
, link_info
, &ignored
, true);
3052 free (free_contents
);
3054 if (shndx_buf
!= NULL
)
3056 shndx_hdr
->contents
= NULL
;
3060 free (free_intsyms
);
3066 elf32_rx_relax_section_wrapper (bfd
*abfd
,
3068 struct bfd_link_info
*link_info
,
3071 return elf32_rx_relax_section (abfd
, sec
, link_info
, again
, false);
3074 /* Function to set the ELF flag bits. */
3077 rx_elf_set_private_flags (bfd
* abfd
, flagword flags
)
3079 elf_elfheader (abfd
)->e_flags
= flags
;
3080 elf_flags_init (abfd
) = true;
3084 static bool no_warn_mismatch
= false;
3085 static bool ignore_lma
= true;
3087 void bfd_elf32_rx_set_target_flags (bool, bool);
3090 bfd_elf32_rx_set_target_flags (bool user_no_warn_mismatch
,
3091 bool user_ignore_lma
)
3093 no_warn_mismatch
= user_no_warn_mismatch
;
3094 ignore_lma
= user_ignore_lma
;
3097 /* Converts FLAGS into a descriptive string.
3098 Returns a static pointer. */
3101 describe_flags (flagword flags
, char *buf
)
3105 if (flags
& E_FLAG_RX_64BIT_DOUBLES
)
3106 strcat (buf
, "64-bit doubles");
3108 strcat (buf
, "32-bit doubles");
3110 if (flags
& E_FLAG_RX_DSP
)
3111 strcat (buf
, ", dsp");
3113 strcat (buf
, ", no dsp");
3115 if (flags
& E_FLAG_RX_PID
)
3116 strcat (buf
, ", pid");
3118 strcat (buf
, ", no pid");
3120 if (flags
& E_FLAG_RX_ABI
)
3121 strcat (buf
, ", RX ABI");
3123 strcat (buf
, ", GCC ABI");
3125 if (flags
& E_FLAG_RX_SINSNS_SET
)
3126 strcat (buf
, flags
& E_FLAG_RX_SINSNS_YES
? ", uses String instructions" : ", bans String instructions");
3131 /* Merge backend specific data from an object file to the output
3132 object file when linking. */
3135 rx_elf_merge_private_bfd_data (bfd
* ibfd
, struct bfd_link_info
*info
)
3137 bfd
*obfd
= info
->output_bfd
;
3142 new_flags
= elf_elfheader (ibfd
)->e_flags
;
3143 old_flags
= elf_elfheader (obfd
)->e_flags
;
3145 if (!elf_flags_init (obfd
))
3147 /* First call, no flags set. */
3148 elf_flags_init (obfd
) = true;
3149 elf_elfheader (obfd
)->e_flags
= new_flags
;
3151 else if (old_flags
!= new_flags
)
3153 flagword known_flags
;
3155 if (old_flags
& E_FLAG_RX_SINSNS_SET
)
3157 if ((new_flags
& E_FLAG_RX_SINSNS_SET
) == 0)
3159 new_flags
&= ~ E_FLAG_RX_SINSNS_MASK
;
3160 new_flags
|= (old_flags
& E_FLAG_RX_SINSNS_MASK
);
3163 else if (new_flags
& E_FLAG_RX_SINSNS_SET
)
3165 old_flags
&= ~ E_FLAG_RX_SINSNS_MASK
;
3166 old_flags
|= (new_flags
& E_FLAG_RX_SINSNS_MASK
);
3169 known_flags
= E_FLAG_RX_ABI
| E_FLAG_RX_64BIT_DOUBLES
3170 | E_FLAG_RX_DSP
| E_FLAG_RX_PID
| E_FLAG_RX_SINSNS_MASK
;
3172 if ((old_flags
^ new_flags
) & known_flags
)
3174 /* Only complain if flag bits we care about do not match.
3175 Other bits may be set, since older binaries did use some
3176 deprecated flags. */
3177 if (no_warn_mismatch
)
3179 elf_elfheader (obfd
)->e_flags
= (new_flags
| old_flags
) & known_flags
;
3185 _bfd_error_handler (_("there is a conflict merging the"
3186 " ELF header flags from %pB"),
3188 _bfd_error_handler (_(" the input file's flags: %s"),
3189 describe_flags (new_flags
, buf
));
3190 _bfd_error_handler (_(" the output file's flags: %s"),
3191 describe_flags (old_flags
, buf
));
3196 elf_elfheader (obfd
)->e_flags
= new_flags
& known_flags
;
3200 bfd_set_error (bfd_error_bad_value
);
3206 rx_elf_print_private_bfd_data (bfd
* abfd
, void * ptr
)
3208 FILE * file
= (FILE *) ptr
;
3212 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
3214 /* Print normal ELF private data. */
3215 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
3217 flags
= elf_elfheader (abfd
)->e_flags
;
3218 fprintf (file
, _("private flags = 0x%lx:"), (long) flags
);
3220 fprintf (file
, "%s", describe_flags (flags
, buf
));
3224 /* Return the MACH for an e_flags value. */
3227 elf32_rx_machine (bfd
* abfd ATTRIBUTE_UNUSED
)
3229 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3230 Need to sort out how these flag bits are used.
3231 For now we assume that the flags are OK. */
3232 if ((elf_elfheader (abfd
)->e_flags
& EF_RX_CPU_MASK
) == EF_RX_CPU_RX
)
3234 if ((elf_elfheader (abfd
)->e_flags
& E_FLAG_RX_V2
))
3235 return bfd_mach_rx_v2
;
3236 else if ((elf_elfheader (abfd
)->e_flags
& E_FLAG_RX_V3
))
3237 return bfd_mach_rx_v3
;
3245 rx_elf_object_p (bfd
* abfd
)
3249 Elf_Internal_Phdr
*phdr
= elf_tdata (abfd
)->phdr
;
3250 Elf_Internal_Ehdr
*ehdr
= elf_elfheader (abfd
);
3251 int nphdrs
= ehdr
->e_phnum
;
3253 static int saw_be
= false;
3254 bfd_vma end_phdroff
;
3256 /* We never want to automatically choose the non-swapping big-endian
3257 target. The user can only get that explicitly, such as with -I
3259 if (abfd
->xvec
== &rx_elf32_be_ns_vec
3260 && abfd
->target_defaulted
)
3263 /* BFD->target_defaulted is not set to TRUE when a target is chosen
3264 as a fallback, so we check for "scanning" to know when to stop
3265 using the non-swapping target. */
3266 if (abfd
->xvec
== &rx_elf32_be_ns_vec
3269 if (abfd
->xvec
== &rx_elf32_be_vec
)
3272 bfd_default_set_arch_mach (abfd
, bfd_arch_rx
,
3273 elf32_rx_machine (abfd
));
3275 /* For each PHDR in the object, we must find some section that
3276 corresponds (based on matching file offsets) and use its VMA
3277 information to reconstruct the p_vaddr field we clobbered when we
3279 /* If PT_LOAD headers include the ELF file header or program headers
3280 then the PT_LOAD header does not start with some section contents.
3281 Making adjustments based on the difference between sh_offset and
3282 p_offset is nonsense in such cases. Exclude them. Note that
3283 since standard linker scripts for RX do not use SIZEOF_HEADERS,
3284 the linker won't normally create PT_LOAD segments covering the
3285 headers so this is mainly for passing the ld testsuite.
3286 FIXME. Why are we looking at non-PT_LOAD headers here? */
3287 end_phdroff
= ehdr
->e_ehsize
;
3288 if (ehdr
->e_phoff
!= 0)
3289 end_phdroff
= ehdr
->e_phoff
+ nphdrs
* ehdr
->e_phentsize
;
3290 for (i
=0; i
<nphdrs
; i
++)
3292 for (u
=0; u
<elf_tdata(abfd
)->num_elf_sections
; u
++)
3294 Elf_Internal_Shdr
*sec
= elf_tdata(abfd
)->elf_sect_ptr
[u
];
3296 if (phdr
[i
].p_filesz
3297 && phdr
[i
].p_offset
>= end_phdroff
3298 && phdr
[i
].p_offset
<= (bfd_vma
) sec
->sh_offset
3300 && sec
->sh_type
!= SHT_NOBITS
3301 && (bfd_vma
)sec
->sh_offset
<= phdr
[i
].p_offset
+ (phdr
[i
].p_filesz
- 1))
3303 /* Found one! The difference between the two addresses,
3304 plus the difference between the two file offsets, is
3305 enough information to reconstruct the lma. */
3307 /* Example where they aren't:
3308 PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3309 SEC[6] = vma 00000050 offset 00002050 size 00000040
3311 The correct LMA for the section is fffc0140 + (2050-2010).
3314 phdr
[i
].p_vaddr
= sec
->sh_addr
+ (sec
->sh_offset
- phdr
[i
].p_offset
);
3319 /* We must update the bfd sections as well, so we don't stop
3321 bsec
= abfd
->sections
;
3324 if (phdr
[i
].p_filesz
3325 && phdr
[i
].p_vaddr
<= bsec
->vma
3326 && bsec
->vma
<= phdr
[i
].p_vaddr
+ (phdr
[i
].p_filesz
- 1))
3328 bsec
->lma
= phdr
[i
].p_paddr
+ (bsec
->vma
- phdr
[i
].p_vaddr
);
3338 rx_linux_object_p (bfd
* abfd
)
3340 bfd_default_set_arch_mach (abfd
, bfd_arch_rx
, elf32_rx_machine (abfd
));
3347 rx_dump_symtab (bfd
* abfd
, void * internal_syms
, void * external_syms
)
3350 Elf_Internal_Sym
* isymbuf
;
3351 Elf_Internal_Sym
* isymend
;
3352 Elf_Internal_Sym
* isym
;
3353 Elf_Internal_Shdr
* symtab_hdr
;
3355 char * st_info_stb_str
;
3356 char * st_other_str
;
3357 char * st_shndx_str
;
3359 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3360 locsymcount
= symtab_hdr
->sh_size
/ get_elf_backend_data (abfd
)->s
->sizeof_sym
;
3362 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
3363 symtab_hdr
->sh_info
, 0,
3364 internal_syms
, external_syms
, NULL
);
3366 isymbuf
= internal_syms
;
3367 isymend
= isymbuf
+ locsymcount
;
3369 for (isym
= isymbuf
; isym
< isymend
; isym
++)
3371 switch (ELF_ST_TYPE (isym
->st_info
))
3373 case STT_FUNC
: st_info_str
= "STT_FUNC"; break;
3374 case STT_SECTION
: st_info_str
= "STT_SECTION"; break;
3375 case STT_FILE
: st_info_str
= "STT_FILE"; break;
3376 case STT_OBJECT
: st_info_str
= "STT_OBJECT"; break;
3377 case STT_TLS
: st_info_str
= "STT_TLS"; break;
3378 default: st_info_str
= "";
3380 switch (ELF_ST_BIND (isym
->st_info
))
3382 case STB_LOCAL
: st_info_stb_str
= "STB_LOCAL"; break;
3383 case STB_GLOBAL
: st_info_stb_str
= "STB_GLOBAL"; break;
3384 default: st_info_stb_str
= "";
3386 switch (ELF_ST_VISIBILITY (isym
->st_other
))
3388 case STV_DEFAULT
: st_other_str
= "STV_DEFAULT"; break;
3389 case STV_INTERNAL
: st_other_str
= "STV_INTERNAL"; break;
3390 case STV_PROTECTED
: st_other_str
= "STV_PROTECTED"; break;
3391 default: st_other_str
= "";
3393 switch (isym
->st_shndx
)
3395 case SHN_ABS
: st_shndx_str
= "SHN_ABS"; break;
3396 case SHN_COMMON
: st_shndx_str
= "SHN_COMMON"; break;
3397 case SHN_UNDEF
: st_shndx_str
= "SHN_UNDEF"; break;
3398 default: st_shndx_str
= "";
3401 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3402 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3404 (unsigned long) isym
->st_value
,
3405 (unsigned long) isym
->st_size
,
3407 bfd_elf_string_from_elf_section (abfd
, symtab_hdr
->sh_link
,
3409 isym
->st_info
, st_info_str
, st_info_stb_str
,
3410 isym
->st_other
, st_other_str
,
3411 isym
->st_shndx
, st_shndx_str
);
3416 rx_get_reloc (long reloc
)
3418 if (0 <= reloc
&& reloc
< R_RX_max
)
3419 return rx_elf_howto_table
[reloc
].name
;
3425 /* We must take care to keep the on-disk copy of any code sections
3426 that are fully linked swapped if the target is big endian, to match
3427 the Renesas tools. */
3429 /* The rule is: big endian object that are final-link executables,
3430 have code sections stored with 32-bit words swapped relative to
3431 what you'd get by default. */
3434 rx_get_section_contents (bfd
* abfd
,
3438 bfd_size_type count
)
3440 int exec
= (abfd
->flags
& EXEC_P
) ? 1 : 0;
3441 int s_code
= (section
->flags
& SEC_CODE
) ? 1 : 0;
3445 fprintf (stderr
, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n",
3446 (long) offset
, (long) count
, section
->name
,
3447 bfd_big_endian(abfd
) ? "be" : "le",
3448 exec
, s_code
, (long unsigned) section
->filepos
,
3449 (long unsigned) offset
);
3452 if (exec
&& s_code
&& bfd_big_endian (abfd
))
3454 char * cloc
= (char *) location
;
3455 bfd_size_type cnt
, end_cnt
;
3459 /* Fetch and swap unaligned bytes at the beginning. */
3464 rv
= _bfd_generic_get_section_contents (abfd
, section
, buf
,
3469 bfd_putb32 (bfd_getl32 (buf
), buf
);
3471 cnt
= 4 - (offset
% 4);
3475 memcpy (location
, buf
+ (offset
% 4), cnt
);
3482 end_cnt
= count
% 4;
3484 /* Fetch and swap the middle bytes. */
3487 rv
= _bfd_generic_get_section_contents (abfd
, section
, cloc
, offset
,
3492 for (cnt
= count
; cnt
>= 4; cnt
-= 4, cloc
+= 4)
3493 bfd_putb32 (bfd_getl32 (cloc
), cloc
);
3496 /* Fetch and swap the end bytes. */
3501 /* Fetch the end bytes. */
3502 rv
= _bfd_generic_get_section_contents (abfd
, section
, buf
,
3503 offset
+ count
- end_cnt
, 4);
3507 bfd_putb32 (bfd_getl32 (buf
), buf
);
3508 memcpy (cloc
, buf
, end_cnt
);
3512 rv
= _bfd_generic_get_section_contents (abfd
, section
, location
, offset
, count
);
3519 rx2_set_section_contents (bfd
* abfd
,
3521 const void * location
,
3523 bfd_size_type count
)
3527 fprintf (stderr
, " set sec %s %08x loc %p offset %#x count %#x\n",
3528 section
->name
, (unsigned) section
->vma
, location
, (int) offset
, (int) count
);
3529 for (i
= 0; i
< count
; i
++)
3531 if (i
% 16 == 0 && i
> 0)
3532 fprintf (stderr
, "\n");
3534 if (i
% 16 && i
% 4 == 0)
3535 fprintf (stderr
, " ");
3538 fprintf (stderr
, " %08x:", (int) (section
->vma
+ offset
+ i
));
3540 fprintf (stderr
, " %02x", ((unsigned char *) location
)[i
]);
3542 fprintf (stderr
, "\n");
3544 return _bfd_elf_set_section_contents (abfd
, section
, location
, offset
, count
);
3546 #define _bfd_elf_set_section_contents rx2_set_section_contents
3550 rx_set_section_contents (bfd
* abfd
,
3552 const void * location
,
3554 bfd_size_type count
)
3556 bool exec
= (abfd
->flags
& EXEC_P
) != 0;
3557 bool s_code
= (section
->flags
& SEC_CODE
) != 0;
3559 char * swapped_data
= NULL
;
3561 bfd_vma caddr
= section
->vma
+ offset
;
3563 bfd_size_type scount
;
3568 fprintf (stderr
, "\ndj: set %ld %ld to %s %s e%d sc%d\n",
3569 (long) offset
, (long) count
, section
->name
,
3570 bfd_big_endian (abfd
) ? "be" : "le",
3573 for (i
= 0; i
< count
; i
++)
3575 int a
= section
->vma
+ offset
+ i
;
3577 if (a
% 16 == 0 && a
> 0)
3578 fprintf (stderr
, "\n");
3580 if (a
% 16 && a
% 4 == 0)
3581 fprintf (stderr
, " ");
3583 if (a
% 16 == 0 || i
== 0)
3584 fprintf (stderr
, " %08x:", (int) (section
->vma
+ offset
+ i
));
3586 fprintf (stderr
, " %02x", ((unsigned char *) location
)[i
]);
3589 fprintf (stderr
, "\n");
3592 if (! exec
|| ! s_code
|| ! bfd_big_endian (abfd
))
3593 return _bfd_elf_set_section_contents (abfd
, section
, location
, offset
, count
);
3595 while (count
> 0 && caddr
> 0 && caddr
% 4)
3599 case 0: faddr
= offset
+ 3; break;
3600 case 1: faddr
= offset
+ 1; break;
3601 case 2: faddr
= offset
- 1; break;
3602 case 3: faddr
= offset
- 3; break;
3605 rv
= _bfd_elf_set_section_contents (abfd
, section
, location
, faddr
, 1);
3609 location
= (bfd_byte
*) location
+ 1;
3615 scount
= (int)(count
/ 4) * 4;
3618 char * cloc
= (char *) location
;
3620 swapped_data
= (char *) bfd_alloc (abfd
, count
);
3621 if (swapped_data
== NULL
)
3624 for (i
= 0; i
< count
; i
+= 4)
3626 bfd_vma v
= bfd_getl32 (cloc
+ i
);
3627 bfd_putb32 (v
, swapped_data
+ i
);
3630 rv
= _bfd_elf_set_section_contents (abfd
, section
, swapped_data
, offset
, scount
);
3637 location
= (bfd_byte
*) location
+ scount
;
3642 caddr
= section
->vma
+ offset
;
3647 case 0: faddr
= offset
+ 3; break;
3648 case 1: faddr
= offset
+ 1; break;
3649 case 2: faddr
= offset
- 1; break;
3650 case 3: faddr
= offset
- 3; break;
3652 rv
= _bfd_elf_set_section_contents (abfd
, section
, location
, faddr
, 1);
3656 location
= (bfd_byte
*) location
+ 1;
3667 rx_final_link (bfd
* abfd
, struct bfd_link_info
* info
)
3671 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
3674 fprintf (stderr
, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3675 o
->name
, o
->flags
, o
->vma
, o
->lma
, o
->size
, o
->rawsize
);
3677 if (o
->flags
& SEC_CODE
3678 && bfd_big_endian (abfd
)
3682 fprintf (stderr
, "adjusting...\n");
3684 o
->size
+= 4 - (o
->size
% 4);
3688 return bfd_elf_final_link (abfd
, info
);
3692 elf32_rx_modify_headers (bfd
*abfd
, struct bfd_link_info
*info
)
3694 const struct elf_backend_data
* bed
;
3695 struct elf_obj_tdata
* tdata
;
3696 Elf_Internal_Phdr
* phdr
;
3700 bed
= get_elf_backend_data (abfd
);
3701 tdata
= elf_tdata (abfd
);
3703 count
= elf_program_header_size (abfd
) / bed
->s
->sizeof_phdr
;
3706 for (i
= count
; i
-- != 0;)
3707 if (phdr
[i
].p_type
== PT_LOAD
)
3709 /* The Renesas tools expect p_paddr to be zero. However,
3710 there is no other way to store the writable data in ROM for
3711 startup initialization. So, we let the linker *think*
3712 we're using paddr and vaddr the "usual" way, but at the
3713 last minute we move the paddr into the vaddr (which is what
3714 the simulator uses) and zero out paddr. Note that this
3715 does not affect the section headers, just the program
3716 headers. We hope. */
3717 phdr
[i
].p_vaddr
= phdr
[i
].p_paddr
;
3718 #if 0 /* If we zero out p_paddr, then the LMA in the section table
3720 phdr
[i
].p_paddr
= 0;
3724 return _bfd_elf_modify_headers (abfd
, info
);
3727 /* The default literal sections should always be marked as "code" (i.e.,
3728 SHF_EXECINSTR). This is particularly important for big-endian mode
3729 when we do not want their contents byte reversed. */
3730 static const struct bfd_elf_special_section elf32_rx_special_sections
[] =
3732 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3733 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3734 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3735 { NULL
, 0, 0, 0, 0 }
3740 struct bfd_link_info
*info
;
3741 bfd_vma table_start
;
3743 bfd_vma
*table_handlers
;
3744 bfd_vma table_default_handler
;
3745 struct bfd_link_hash_entry
**table_entries
;
3746 struct bfd_link_hash_entry
*table_default_entry
;
3751 rx_table_find (struct bfd_hash_entry
*vent
, void *vinfo
)
3753 RX_Table_Info
*info
= (RX_Table_Info
*)vinfo
;
3754 struct bfd_link_hash_entry
*ent
= (struct bfd_link_hash_entry
*)vent
;
3755 const char *name
; /* of the symbol we've found */
3759 const char *tname
; /* name of the table */
3760 bfd_vma start_addr
, end_addr
;
3762 struct bfd_link_hash_entry
* h
;
3764 /* We're looking for globally defined symbols of the form
3765 $tablestart$<NAME>. */
3766 if (ent
->type
!= bfd_link_hash_defined
3767 && ent
->type
!= bfd_link_hash_defweak
)
3770 name
= ent
->root
.string
;
3771 sec
= ent
->u
.def
.section
;
3774 if (!startswith (name
, "$tablestart$"))
3777 sec
->flags
|= SEC_KEEP
;
3781 start_addr
= ent
->u
.def
.value
;
3783 /* At this point, we can't build the table but we can (and must)
3784 find all the related symbols and mark their sections as SEC_KEEP
3785 so we don't garbage collect them. */
3787 buf
= (char *) bfd_malloc (12 + 10 + strlen (tname
));
3791 sprintf (buf
, "$tableend$%s", tname
);
3792 h
= bfd_link_hash_lookup (info
->info
->hash
, buf
, false, false, true);
3793 if (!h
|| (h
->type
!= bfd_link_hash_defined
3794 && h
->type
!= bfd_link_hash_defweak
))
3796 /* xgettext:c-format */
3797 _bfd_error_handler (_("%pB:%pA: table %s missing corresponding %s"),
3798 abfd
, sec
, name
, buf
);
3802 if (h
->u
.def
.section
!= ent
->u
.def
.section
)
3804 /* xgettext:c-format */
3805 _bfd_error_handler (_("%pB:%pA: %s and %s must be in the same input section"),
3806 h
->u
.def
.section
->owner
, h
->u
.def
.section
,
3811 end_addr
= h
->u
.def
.value
;
3813 sprintf (buf
, "$tableentry$default$%s", tname
);
3814 h
= bfd_link_hash_lookup (info
->info
->hash
, buf
, false, false, true);
3815 if (h
&& (h
->type
== bfd_link_hash_defined
3816 || h
->type
== bfd_link_hash_defweak
))
3818 h
->u
.def
.section
->flags
|= SEC_KEEP
;
3821 for (idx
= 0; idx
< (int) (end_addr
- start_addr
) / 4; idx
++)
3823 sprintf (buf
, "$tableentry$%d$%s", idx
, tname
);
3824 h
= bfd_link_hash_lookup (info
->info
->hash
, buf
, false, false, true);
3825 if (h
&& (h
->type
== bfd_link_hash_defined
3826 || h
->type
== bfd_link_hash_defweak
))
3828 h
->u
.def
.section
->flags
|= SEC_KEEP
;
3832 /* Return TRUE to keep scanning, FALSE to end the traversal. */
3836 /* We need to check for table entry symbols and build the tables, and
3837 we need to do it before the linker does garbage collection. This function is
3838 called once per input object file. */
3841 (bfd
* abfd ATTRIBUTE_UNUSED
,
3842 struct bfd_link_info
* info ATTRIBUTE_UNUSED
)
3844 RX_Table_Info stuff
;
3848 bfd_hash_traverse (&(info
->hash
->table
), rx_table_find
, &stuff
);
3855 rx_table_map_2 (struct bfd_hash_entry
*vent
, void *vinfo
)
3857 RX_Table_Info
*info
= (RX_Table_Info
*)vinfo
;
3858 struct bfd_link_hash_entry
*ent
= (struct bfd_link_hash_entry
*)vent
;
3863 /* See if the symbol ENT has an address listed in the table, and
3864 isn't a debug/special symbol. If so, put it in the table. */
3866 if (ent
->type
!= bfd_link_hash_defined
3867 && ent
->type
!= bfd_link_hash_defweak
)
3870 name
= ent
->root
.string
;
3872 if (name
[0] == '$' || name
[0] == '.' || name
[0] < ' ')
3875 addr
= (ent
->u
.def
.value
3876 + ent
->u
.def
.section
->output_section
->vma
3877 + ent
->u
.def
.section
->output_offset
);
3879 for (idx
= 0; idx
< info
->table_size
; idx
++)
3880 if (addr
== info
->table_handlers
[idx
])
3881 info
->table_entries
[idx
] = ent
;
3883 if (addr
== info
->table_default_handler
)
3884 info
->table_default_entry
= ent
;
3890 rx_table_map (struct bfd_hash_entry
*vent
, void *vinfo
)
3892 RX_Table_Info
*info
= (RX_Table_Info
*)vinfo
;
3893 struct bfd_link_hash_entry
*ent
= (struct bfd_link_hash_entry
*)vent
;
3894 const char *name
; /* of the symbol we've found */
3896 const char *tname
; /* name of the table */
3897 bfd_vma start_addr
, end_addr
;
3899 struct bfd_link_hash_entry
* h
;
3902 /* We're looking for globally defined symbols of the form
3903 $tablestart$<NAME>. */
3904 if (ent
->type
!= bfd_link_hash_defined
3905 && ent
->type
!= bfd_link_hash_defweak
)
3908 name
= ent
->root
.string
;
3910 if (!startswith (name
, "$tablestart$"))
3914 start_addr
= (ent
->u
.def
.value
3915 + ent
->u
.def
.section
->output_section
->vma
3916 + ent
->u
.def
.section
->output_offset
);
3918 buf
= (char *) bfd_malloc (12 + 10 + strlen (tname
));
3922 sprintf (buf
, "$tableend$%s", tname
);
3923 end_addr
= get_symbol_value_maybe (buf
, info
->info
);
3925 sprintf (buf
, "$tableentry$default$%s", tname
);
3926 h
= bfd_link_hash_lookup (info
->info
->hash
, buf
, false, false, true);
3929 info
->table_default_handler
= (h
->u
.def
.value
3930 + h
->u
.def
.section
->output_section
->vma
3931 + h
->u
.def
.section
->output_offset
);
3934 /* Zero is a valid handler address! */
3935 info
->table_default_handler
= (bfd_vma
) (-1);
3936 info
->table_default_entry
= NULL
;
3938 info
->table_start
= start_addr
;
3939 info
->table_size
= (int) (end_addr
- start_addr
) / 4;
3940 info
->table_handlers
= (bfd_vma
*)
3941 bfd_malloc (info
->table_size
* sizeof (bfd_vma
));
3942 if (info
->table_handlers
== NULL
)
3947 info
->table_entries
= (struct bfd_link_hash_entry
**)
3948 bfd_malloc (info
->table_size
* sizeof (struct bfd_link_hash_entry
));
3949 if (info
->table_entries
== NULL
)
3951 free (info
->table_handlers
);
3956 for (idx
= 0; idx
< (int) (end_addr
- start_addr
) / 4; idx
++)
3958 sprintf (buf
, "$tableentry$%d$%s", idx
, tname
);
3959 h
= bfd_link_hash_lookup (info
->info
->hash
, buf
, false, false, true);
3960 if (h
&& (h
->type
== bfd_link_hash_defined
3961 || h
->type
== bfd_link_hash_defweak
))
3963 info
->table_handlers
[idx
] = (h
->u
.def
.value
3964 + h
->u
.def
.section
->output_section
->vma
3965 + h
->u
.def
.section
->output_offset
);
3968 info
->table_handlers
[idx
] = info
->table_default_handler
;
3969 info
->table_entries
[idx
] = NULL
;
3974 bfd_hash_traverse (&(info
->info
->hash
->table
), rx_table_map_2
, info
);
3976 fprintf (info
->mapfile
,
3977 "\nRX Vector Table: %s has %d entries at 0x%08" PRIx64
"\n\n",
3978 tname
, info
->table_size
, (uint64_t) start_addr
);
3980 if (info
->table_default_entry
)
3981 fprintf (info
->mapfile
, " default handler is: %s at 0x%08" PRIx64
"\n",
3982 info
->table_default_entry
->root
.string
,
3983 (uint64_t) info
->table_default_handler
);
3984 else if (info
->table_default_handler
!= (bfd_vma
)(-1))
3985 fprintf (info
->mapfile
, " default handler is at 0x%08" PRIx64
"\n",
3986 (uint64_t) info
->table_default_handler
);
3988 fprintf (info
->mapfile
, " no default handler\n");
3991 for (idx
= 0; idx
< info
->table_size
; idx
++)
3993 if (info
->table_handlers
[idx
] == info
->table_default_handler
)
3996 fprintf (info
->mapfile
, " . . .\n");
4002 fprintf (info
->mapfile
,
4003 " 0x%08" PRIx64
" [%3d] ", (uint64_t) start_addr
+ 4 * idx
, idx
);
4005 if (info
->table_handlers
[idx
] == (bfd_vma
) (-1))
4006 fprintf (info
->mapfile
, "(no handler found)\n");
4008 else if (info
->table_handlers
[idx
] == info
->table_default_handler
)
4010 if (info
->table_default_entry
)
4011 fprintf (info
->mapfile
, "(default)\n");
4013 fprintf (info
->mapfile
, "(default)\n");
4016 else if (info
->table_entries
[idx
])
4018 fprintf (info
->mapfile
, "0x%08" PRIx64
" %s\n",
4019 (uint64_t) info
->table_handlers
[idx
],
4020 info
->table_entries
[idx
]->root
.string
);
4025 fprintf (info
->mapfile
, "0x%08" PRIx64
" ???\n",
4026 (uint64_t) info
->table_handlers
[idx
]);
4030 fprintf (info
->mapfile
, " . . .\n");
4036 rx_additional_link_map_text (bfd
*obfd
, struct bfd_link_info
*info
, FILE *mapfile
)
4038 /* We scan the symbol table looking for $tableentry$'s, and for
4039 each, try to deduce which handlers go with which entries. */
4041 RX_Table_Info stuff
;
4045 stuff
.mapfile
= mapfile
;
4046 bfd_hash_traverse (&(info
->hash
->table
), rx_table_map
, &stuff
);
4050 #define ELF_ARCH bfd_arch_rx
4051 #define ELF_MACHINE_CODE EM_RX
4052 #define ELF_MAXPAGESIZE 0x1000
4054 #define TARGET_BIG_SYM rx_elf32_be_vec
4055 #define TARGET_BIG_NAME "elf32-rx-be"
4057 #define TARGET_LITTLE_SYM rx_elf32_le_vec
4058 #define TARGET_LITTLE_NAME "elf32-rx-le"
4060 #define elf_info_to_howto_rel NULL
4061 #define elf_info_to_howto rx_info_to_howto_rela
4062 #define elf_backend_object_p rx_elf_object_p
4063 #define elf_backend_relocate_section rx_elf_relocate_section
4064 #define elf_symbol_leading_char ('_')
4065 #define elf_backend_can_gc_sections 1
4066 #define elf_backend_modify_headers elf32_rx_modify_headers
4068 #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup
4069 #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup
4070 #define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags
4071 #define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data
4072 #define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data
4073 #define bfd_elf32_get_section_contents rx_get_section_contents
4074 #define bfd_elf32_set_section_contents rx_set_section_contents
4075 #define bfd_elf32_bfd_final_link rx_final_link
4076 #define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper
4077 #define elf_backend_special_sections elf32_rx_special_sections
4078 #define elf_backend_check_directives rx_check_directives
4080 #include "elf32-target.h"
4082 /* We define a second big-endian target that doesn't have the custom
4083 section get/set hooks, for times when we want to preserve the
4084 pre-swapped .text sections (like objcopy). */
4086 #undef TARGET_BIG_SYM
4087 #define TARGET_BIG_SYM rx_elf32_be_ns_vec
4088 #undef TARGET_BIG_NAME
4089 #define TARGET_BIG_NAME "elf32-rx-be-ns"
4090 #undef TARGET_LITTLE_SYM
4092 #undef bfd_elf32_get_section_contents
4093 #undef bfd_elf32_set_section_contents
4096 #define elf32_bed elf32_rx_be_ns_bed
4098 #include "elf32-target.h"
4100 #undef TARGET_LITTLE_SYM
4101 #define TARGET_LITTLE_SYM rx_elf32_linux_le_vec
4102 #undef TARGET_LITTLE_NAME
4103 #define TARGET_LITTLE_NAME "elf32-rx-linux"
4104 #undef TARGET_BIG_SYM
4105 #undef TARGET_BIG_NAME
4107 #undef elf_backend_object_p
4108 #define elf_backend_object_p rx_linux_object_p
4109 #undef elf_symbol_leading_char
4111 #define elf32_bed elf32_rx_le_linux_bed
4113 #include "elf32-target.h"