1 /* Renesas RX specific support for 32-bit ELF.
2 Copyright (C) 2008, 2009, 2010, 2011, 2012
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include "bfd_stdint.h"
27 #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 bfd_elf32_rx_be_ns_vec
;
35 const bfd_target bfd_elf32_rx_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
, 2, 32, 0, signed, FALSE
),
54 RXREL (DIR24S
, 2, 24, 0, signed, FALSE
),
55 RXREL (DIR16
, 1, 16, 0, dont
, FALSE
),
56 RXREL (DIR16U
, 1, 16, 0, unsigned, FALSE
),
57 RXREL (DIR16S
, 1, 16, 0, signed, FALSE
),
58 RXREL (DIR8
, 0, 8, 0, dont
, FALSE
),
59 RXREL (DIR8U
, 0, 8, 0, unsigned, FALSE
),
60 RXREL (DIR8S
, 0, 8, 0, signed, FALSE
),
61 RXREL (DIR24S_PCREL
, 2, 24, 0, signed, TRUE
),
62 RXREL (DIR16S_PCREL
, 1, 16, 0, signed, TRUE
),
63 RXREL (DIR8S_PCREL
, 0, 8, 0, signed, TRUE
),
64 RXREL (DIR16UL
, 1, 16, 2, unsigned, FALSE
),
65 RXREL (DIR16UW
, 1, 16, 1, unsigned, FALSE
),
66 RXREL (DIR8UL
, 0, 8, 2, unsigned, FALSE
),
67 RXREL (DIR8UW
, 0, 8, 1, unsigned, FALSE
),
68 RXREL (DIR32_REV
, 1, 16, 0, dont
, FALSE
),
69 RXREL (DIR16_REV
, 1, 16, 0, dont
, FALSE
),
70 RXREL (DIR3U_PCREL
, 0, 3, 0, dont
, TRUE
),
86 RXREL (RH_3_PCREL
, 0, 3, 0, signed, TRUE
),
87 RXREL (RH_16_OP
, 1, 16, 0, signed, FALSE
),
88 RXREL (RH_24_OP
, 2, 24, 0, signed, FALSE
),
89 RXREL (RH_32_OP
, 2, 32, 0, signed, FALSE
),
90 RXREL (RH_24_UNS
, 2, 24, 0, unsigned, FALSE
),
91 RXREL (RH_8_NEG
, 0, 8, 0, signed, FALSE
),
92 RXREL (RH_16_NEG
, 1, 16, 0, signed, FALSE
),
93 RXREL (RH_24_NEG
, 2, 24, 0, signed, FALSE
),
94 RXREL (RH_32_NEG
, 2, 32, 0, signed, FALSE
),
95 RXREL (RH_DIFF
, 2, 32, 0, signed, FALSE
),
96 RXREL (RH_GPRELB
, 1, 16, 0, unsigned, FALSE
),
97 RXREL (RH_GPRELW
, 1, 16, 0, unsigned, FALSE
),
98 RXREL (RH_GPRELL
, 1, 16, 0, unsigned, FALSE
),
99 RXREL (RH_RELAX
, 0, 0, 0, dont
, FALSE
),
121 RXREL (ABS32
, 2, 32, 0, dont
, FALSE
),
122 RXREL (ABS24S
, 2, 24, 0, signed, FALSE
),
123 RXREL (ABS16
, 1, 16, 0, dont
, FALSE
),
124 RXREL (ABS16U
, 1, 16, 0, unsigned, FALSE
),
125 RXREL (ABS16S
, 1, 16, 0, signed, FALSE
),
126 RXREL (ABS8
, 0, 8, 0, dont
, FALSE
),
127 RXREL (ABS8U
, 0, 8, 0, unsigned, FALSE
),
128 RXREL (ABS8S
, 0, 8, 0, signed, FALSE
),
129 RXREL (ABS24S_PCREL
, 2, 24, 0, signed, TRUE
),
130 RXREL (ABS16S_PCREL
, 1, 16, 0, signed, TRUE
),
131 RXREL (ABS8S_PCREL
, 0, 8, 0, signed, TRUE
),
132 RXREL (ABS16UL
, 1, 16, 0, unsigned, FALSE
),
133 RXREL (ABS16UW
, 1, 16, 0, unsigned, FALSE
),
134 RXREL (ABS8UL
, 0, 8, 0, unsigned, FALSE
),
135 RXREL (ABS8UW
, 0, 8, 0, unsigned, FALSE
),
136 RXREL (ABS32_REV
, 2, 32, 0, dont
, FALSE
),
137 RXREL (ABS16_REV
, 1, 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
, 2, 32, 0, dont
, FALSE
),
206 RXREL (OPneg
, 2, 32, 0, dont
, FALSE
),
207 RXREL (OPadd
, 2, 32, 0, dont
, FALSE
),
208 RXREL (OPsub
, 2, 32, 0, dont
, FALSE
),
209 RXREL (OPmul
, 2, 32, 0, dont
, FALSE
),
210 RXREL (OPdiv
, 2, 32, 0, dont
, FALSE
),
211 RXREL (OPshla
, 2, 32, 0, dont
, FALSE
),
212 RXREL (OPshra
, 2, 32, 0, dont
, FALSE
),
213 RXREL (OPsctsize
, 2, 32, 0, dont
, FALSE
),
214 RXREL (OPscttop
, 2, 32, 0, dont
, FALSE
),
215 RXREL (OPand
, 2, 32, 0, dont
, FALSE
),
216 RXREL (OPor
, 2, 32, 0, dont
, FALSE
),
217 RXREL (OPxor
, 2, 32, 0, dont
, FALSE
),
218 RXREL (OPnot
, 2, 32, 0, dont
, FALSE
),
219 RXREL (OPmod
, 2, 32, 0, dont
, FALSE
),
220 RXREL (OPromtop
, 2, 32, 0, dont
, FALSE
),
221 RXREL (OPramtop
, 2, 32, 0, dont
, FALSE
)
224 /* Map BFD reloc types to RX ELF reloc types. */
228 bfd_reloc_code_real_type bfd_reloc_val
;
229 unsigned int rx_reloc_val
;
232 static const struct rx_reloc_map rx_reloc_map
[] =
234 { BFD_RELOC_NONE
, R_RX_NONE
},
235 { BFD_RELOC_8
, R_RX_DIR8S
},
236 { BFD_RELOC_16
, R_RX_DIR16S
},
237 { BFD_RELOC_24
, R_RX_DIR24S
},
238 { BFD_RELOC_32
, R_RX_DIR32
},
239 { BFD_RELOC_RX_16_OP
, R_RX_DIR16
},
240 { BFD_RELOC_RX_DIR3U_PCREL
, R_RX_DIR3U_PCREL
},
241 { BFD_RELOC_8_PCREL
, R_RX_DIR8S_PCREL
},
242 { BFD_RELOC_16_PCREL
, R_RX_DIR16S_PCREL
},
243 { BFD_RELOC_24_PCREL
, R_RX_DIR24S_PCREL
},
244 { BFD_RELOC_RX_8U
, R_RX_DIR8U
},
245 { BFD_RELOC_RX_16U
, R_RX_DIR16U
},
246 { BFD_RELOC_RX_24U
, R_RX_RH_24_UNS
},
247 { BFD_RELOC_RX_NEG8
, R_RX_RH_8_NEG
},
248 { BFD_RELOC_RX_NEG16
, R_RX_RH_16_NEG
},
249 { BFD_RELOC_RX_NEG24
, R_RX_RH_24_NEG
},
250 { BFD_RELOC_RX_NEG32
, R_RX_RH_32_NEG
},
251 { BFD_RELOC_RX_DIFF
, R_RX_RH_DIFF
},
252 { BFD_RELOC_RX_GPRELB
, R_RX_RH_GPRELB
},
253 { BFD_RELOC_RX_GPRELW
, R_RX_RH_GPRELW
},
254 { BFD_RELOC_RX_GPRELL
, R_RX_RH_GPRELL
},
255 { BFD_RELOC_RX_RELAX
, R_RX_RH_RELAX
},
256 { BFD_RELOC_RX_SYM
, R_RX_SYM
},
257 { BFD_RELOC_RX_OP_SUBTRACT
, R_RX_OPsub
},
258 { BFD_RELOC_RX_OP_NEG
, R_RX_OPneg
},
259 { BFD_RELOC_RX_ABS8
, R_RX_ABS8
},
260 { BFD_RELOC_RX_ABS16
, R_RX_ABS16
},
261 { BFD_RELOC_RX_ABS16_REV
, R_RX_ABS16_REV
},
262 { BFD_RELOC_RX_ABS32
, R_RX_ABS32
},
263 { BFD_RELOC_RX_ABS32_REV
, R_RX_ABS32_REV
},
264 { BFD_RELOC_RX_ABS16UL
, R_RX_ABS16UL
},
265 { BFD_RELOC_RX_ABS16UW
, R_RX_ABS16UW
},
266 { BFD_RELOC_RX_ABS16U
, R_RX_ABS16U
}
269 #define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
271 static reloc_howto_type
*
272 rx_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
273 bfd_reloc_code_real_type code
)
277 if (code
== BFD_RELOC_RX_32_OP
)
278 return rx_elf_howto_table
+ R_RX_DIR32
;
280 for (i
= ARRAY_SIZE (rx_reloc_map
); --i
;)
281 if (rx_reloc_map
[i
].bfd_reloc_val
== code
)
282 return rx_elf_howto_table
+ rx_reloc_map
[i
].rx_reloc_val
;
287 static reloc_howto_type
*
288 rx_reloc_name_lookup (bfd
* abfd ATTRIBUTE_UNUSED
, const char * r_name
)
292 for (i
= 0; i
< ARRAY_SIZE (rx_elf_howto_table
); i
++)
293 if (rx_elf_howto_table
[i
].name
!= NULL
294 && strcasecmp (rx_elf_howto_table
[i
].name
, r_name
) == 0)
295 return rx_elf_howto_table
+ i
;
300 /* Set the howto pointer for an RX ELF reloc. */
303 rx_info_to_howto_rela (bfd
* abfd ATTRIBUTE_UNUSED
,
305 Elf_Internal_Rela
* dst
)
309 r_type
= ELF32_R_TYPE (dst
->r_info
);
310 BFD_ASSERT (r_type
< (unsigned int) R_RX_max
);
311 cache_ptr
->howto
= rx_elf_howto_table
+ r_type
;
315 get_symbol_value (const char * name
,
316 bfd_reloc_status_type
* status
,
317 struct bfd_link_info
* info
,
319 asection
* input_section
,
323 struct bfd_link_hash_entry
* h
;
325 h
= bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
328 || (h
->type
!= bfd_link_hash_defined
329 && h
->type
!= bfd_link_hash_defweak
))
330 * status
= info
->callbacks
->undefined_symbol
331 (info
, name
, input_bfd
, input_section
, offset
, TRUE
);
333 value
= (h
->u
.def
.value
334 + h
->u
.def
.section
->output_section
->vma
335 + h
->u
.def
.section
->output_offset
);
341 get_gp (bfd_reloc_status_type
* status
,
342 struct bfd_link_info
* info
,
347 static bfd_boolean cached
= FALSE
;
348 static bfd_vma cached_value
= 0;
352 cached_value
= get_symbol_value ("__gp", status
, info
, abfd
, sec
, offset
);
359 get_romstart (bfd_reloc_status_type
* status
,
360 struct bfd_link_info
* info
,
365 static bfd_boolean cached
= FALSE
;
366 static bfd_vma cached_value
= 0;
370 cached_value
= get_symbol_value ("_start", status
, info
, abfd
, sec
, offset
);
377 get_ramstart (bfd_reloc_status_type
* status
,
378 struct bfd_link_info
* info
,
383 static bfd_boolean cached
= FALSE
;
384 static bfd_vma cached_value
= 0;
388 cached_value
= get_symbol_value ("__datastart", status
, info
, abfd
, sec
, offset
);
394 #define NUM_STACK_ENTRIES 16
395 static int32_t rx_stack
[ NUM_STACK_ENTRIES
];
396 static unsigned int rx_stack_top
;
398 #define RX_STACK_PUSH(val) \
401 if (rx_stack_top < NUM_STACK_ENTRIES) \
402 rx_stack [rx_stack_top ++] = (val); \
404 r = bfd_reloc_dangerous; \
408 #define RX_STACK_POP(dest) \
411 if (rx_stack_top > 0) \
412 (dest) = rx_stack [-- rx_stack_top]; \
414 (dest) = 0, r = bfd_reloc_dangerous; \
418 /* Relocate an RX ELF section.
419 There is some attempt to make this function usable for many architectures,
420 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
421 if only to serve as a learning tool.
423 The RELOCATE_SECTION function is called by the new ELF backend linker
424 to handle the relocations for a section.
426 The relocs are always passed as Rela structures; if the section
427 actually uses Rel structures, the r_addend field will always be
430 This function is responsible for adjusting the section contents as
431 necessary, and (if using Rela relocs and generating a relocatable
432 output file) adjusting the reloc addend as necessary.
434 This function does not have to worry about setting the reloc
435 address or the reloc symbol index.
437 LOCAL_SYMS is a pointer to the swapped in local symbols.
439 LOCAL_SECTIONS is an array giving the section in the input file
440 corresponding to the st_shndx field of each local symbol.
442 The global hash table entry for the global symbols can be found
443 via elf_sym_hashes (input_bfd).
445 When generating relocatable output, this function must handle
446 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
447 going to be the section symbol corresponding to the output
448 section, which means that the addend must be adjusted
452 rx_elf_relocate_section
454 struct bfd_link_info
* info
,
456 asection
* input_section
,
458 Elf_Internal_Rela
* relocs
,
459 Elf_Internal_Sym
* local_syms
,
460 asection
** local_sections
)
462 Elf_Internal_Shdr
* symtab_hdr
;
463 struct elf_link_hash_entry
** sym_hashes
;
464 Elf_Internal_Rela
* rel
;
465 Elf_Internal_Rela
* relend
;
466 bfd_boolean pid_mode
;
467 bfd_boolean saw_subtract
= FALSE
;
469 if (elf_elfheader (output_bfd
)->e_flags
& E_FLAG_RX_PID
)
474 symtab_hdr
= & elf_tdata (input_bfd
)->symtab_hdr
;
475 sym_hashes
= elf_sym_hashes (input_bfd
);
476 relend
= relocs
+ input_section
->reloc_count
;
477 for (rel
= relocs
; rel
< relend
; rel
++)
479 reloc_howto_type
* howto
;
480 unsigned long r_symndx
;
481 Elf_Internal_Sym
* sym
;
483 struct elf_link_hash_entry
* h
;
485 bfd_reloc_status_type r
;
486 const char * name
= NULL
;
487 bfd_boolean unresolved_reloc
= TRUE
;
490 r_type
= ELF32_R_TYPE (rel
->r_info
);
491 r_symndx
= ELF32_R_SYM (rel
->r_info
);
493 howto
= rx_elf_howto_table
+ ELF32_R_TYPE (rel
->r_info
);
499 if (rx_stack_top
== 0)
500 saw_subtract
= FALSE
;
502 if (r_symndx
< symtab_hdr
->sh_info
)
504 sym
= local_syms
+ r_symndx
;
505 sec
= local_sections
[r_symndx
];
506 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, & sec
, rel
);
508 name
= bfd_elf_string_from_elf_section
509 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
);
510 name
= (sym
->st_name
== 0) ? bfd_section_name (input_bfd
, sec
) : name
;
516 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
517 r_symndx
, symtab_hdr
, sym_hashes
, h
,
518 sec
, relocation
, unresolved_reloc
,
521 name
= h
->root
.root
.string
;
524 if (sec
!= NULL
&& discarded_section (sec
))
525 RELOC_AGAINST_DISCARDED_SECTION (info
, input_bfd
, input_section
,
526 rel
, 1, relend
, howto
, 0, contents
);
528 if (info
->relocatable
)
530 /* This is a relocatable link. We don't have to change
531 anything, unless the reloc is against a section symbol,
532 in which case we have to adjust according to where the
533 section symbol winds up in the output section. */
534 if (sym
!= NULL
&& ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
535 rel
->r_addend
+= sec
->output_offset
;
539 if (h
!= NULL
&& h
->root
.type
== bfd_link_hash_undefweak
)
540 /* If the symbol is undefined and weak
541 then the relocation resolves to zero. */
545 if (howto
->pc_relative
)
547 relocation
-= (input_section
->output_section
->vma
548 + input_section
->output_offset
550 if (r_type
!= R_RX_RH_3_PCREL
551 && r_type
!= R_RX_DIR3U_PCREL
)
555 relocation
+= rel
->r_addend
;
560 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
561 #define ALIGN(m) if (relocation & m) r = bfd_reloc_other;
562 #define OP(i) (contents[rel->r_offset + (i)])
563 #define WARN_REDHAT(type) \
564 _bfd_error_handler (_("%B:%A: Warning: deprecated Red Hat reloc " type " detected against: %s."), \
565 input_bfd, input_section, name)
567 /* Check for unsafe relocs in PID mode. These are any relocs where
568 an absolute address is being computed. There are special cases
569 for relocs against symbols that are known to be referenced in
570 crt0.o before the PID base address register has been initialised. */
571 #define UNSAFE_FOR_PID \
576 && sec->flags & SEC_READONLY \
577 && !(input_section->flags & SEC_DEBUGGING) \
578 && strcmp (name, "__pid_base") != 0 \
579 && strcmp (name, "__gp") != 0 \
580 && strcmp (name, "__romdatastart") != 0 \
582 _bfd_error_handler (_("%B(%A): unsafe PID relocation %s at 0x%08lx (against %s in %s)"), \
583 input_bfd, input_section, howto->name, \
584 input_section->output_section->vma + input_section->output_offset + rel->r_offset, \
589 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
598 case R_RX_RH_3_PCREL
:
599 WARN_REDHAT ("RX_RH_3_PCREL");
602 OP (0) |= relocation
& 0x07;
606 WARN_REDHAT ("RX_RH_8_NEG");
607 relocation
= - relocation
;
608 case R_RX_DIR8S_PCREL
:
627 WARN_REDHAT ("RX_RH_16_NEG");
628 relocation
= - relocation
;
629 case R_RX_DIR16S_PCREL
:
631 RANGE (-32768, 32767);
632 #if RX_OPCODE_BIG_ENDIAN
635 OP (1) = relocation
>> 8;
640 WARN_REDHAT ("RX_RH_16_OP");
642 RANGE (-32768, 32767);
643 #if RX_OPCODE_BIG_ENDIAN
645 OP (0) = relocation
>> 8;
648 OP (1) = relocation
>> 8;
654 RANGE (-32768, 65535);
655 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
658 OP (0) = relocation
>> 8;
663 OP (1) = relocation
>> 8;
670 #if RX_OPCODE_BIG_ENDIAN
672 OP (0) = relocation
>> 8;
675 OP (1) = relocation
>> 8;
681 RANGE (-32768, 65536);
682 #if RX_OPCODE_BIG_ENDIAN
684 OP (0) = relocation
>> 8;
687 OP (1) = relocation
>> 8;
693 RANGE (-32768, 65536);
694 #if RX_OPCODE_BIG_ENDIAN
696 OP (1) = relocation
>> 8;
699 OP (0) = relocation
>> 8;
703 case R_RX_DIR3U_PCREL
:
706 OP (0) |= relocation
& 0x07;
711 WARN_REDHAT ("RX_RH_24_NEG");
712 relocation
= - relocation
;
713 case R_RX_DIR24S_PCREL
:
714 RANGE (-0x800000, 0x7fffff);
715 #if RX_OPCODE_BIG_ENDIAN
717 OP (1) = relocation
>> 8;
718 OP (0) = relocation
>> 16;
721 OP (1) = relocation
>> 8;
722 OP (2) = relocation
>> 16;
728 WARN_REDHAT ("RX_RH_24_OP");
729 RANGE (-0x800000, 0x7fffff);
730 #if RX_OPCODE_BIG_ENDIAN
732 OP (1) = relocation
>> 8;
733 OP (0) = relocation
>> 16;
736 OP (1) = relocation
>> 8;
737 OP (2) = relocation
>> 16;
743 RANGE (-0x800000, 0x7fffff);
744 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
747 OP (1) = relocation
>> 8;
748 OP (0) = relocation
>> 16;
753 OP (1) = relocation
>> 8;
754 OP (2) = relocation
>> 16;
760 WARN_REDHAT ("RX_RH_24_UNS");
762 #if RX_OPCODE_BIG_ENDIAN
764 OP (1) = relocation
>> 8;
765 OP (0) = relocation
>> 16;
768 OP (1) = relocation
>> 8;
769 OP (2) = relocation
>> 16;
775 WARN_REDHAT ("RX_RH_32_NEG");
776 relocation
= - relocation
;
777 #if RX_OPCODE_BIG_ENDIAN
779 OP (2) = relocation
>> 8;
780 OP (1) = relocation
>> 16;
781 OP (0) = relocation
>> 24;
784 OP (1) = relocation
>> 8;
785 OP (2) = relocation
>> 16;
786 OP (3) = relocation
>> 24;
792 WARN_REDHAT ("RX_RH_32_OP");
793 #if RX_OPCODE_BIG_ENDIAN
795 OP (2) = relocation
>> 8;
796 OP (1) = relocation
>> 16;
797 OP (0) = relocation
>> 24;
800 OP (1) = relocation
>> 8;
801 OP (2) = relocation
>> 16;
802 OP (3) = relocation
>> 24;
807 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
810 OP (2) = relocation
>> 8;
811 OP (1) = relocation
>> 16;
812 OP (0) = relocation
>> 24;
817 OP (1) = relocation
>> 8;
818 OP (2) = relocation
>> 16;
819 OP (3) = relocation
>> 24;
824 if (BIGE (output_bfd
))
827 OP (1) = relocation
>> 8;
828 OP (2) = relocation
>> 16;
829 OP (3) = relocation
>> 24;
834 OP (2) = relocation
>> 8;
835 OP (1) = relocation
>> 16;
836 OP (0) = relocation
>> 24;
843 WARN_REDHAT ("RX_RH_DIFF");
844 val
= bfd_get_32 (output_bfd
, & OP (0));
846 bfd_put_32 (output_bfd
, val
, & OP (0));
851 WARN_REDHAT ("RX_RH_GPRELB");
852 relocation
-= get_gp (&r
, info
, input_bfd
, input_section
, rel
->r_offset
);
854 #if RX_OPCODE_BIG_ENDIAN
856 OP (0) = relocation
>> 8;
859 OP (1) = relocation
>> 8;
864 WARN_REDHAT ("RX_RH_GPRELW");
865 relocation
-= get_gp (&r
, info
, input_bfd
, input_section
, rel
->r_offset
);
869 #if RX_OPCODE_BIG_ENDIAN
871 OP (0) = relocation
>> 8;
874 OP (1) = relocation
>> 8;
879 WARN_REDHAT ("RX_RH_GPRELL");
880 relocation
-= get_gp (&r
, info
, input_bfd
, input_section
, rel
->r_offset
);
884 #if RX_OPCODE_BIG_ENDIAN
886 OP (0) = relocation
>> 8;
889 OP (1) = relocation
>> 8;
893 /* Internal relocations just for relaxation: */
894 case R_RX_RH_ABS5p5B
:
895 RX_STACK_POP (relocation
);
898 OP (0) |= relocation
>> 2;
900 OP (1) |= (relocation
<< 6) & 0x80;
901 OP (1) |= (relocation
<< 3) & 0x08;
904 case R_RX_RH_ABS5p5W
:
905 RX_STACK_POP (relocation
);
910 OP (0) |= relocation
>> 2;
912 OP (1) |= (relocation
<< 6) & 0x80;
913 OP (1) |= (relocation
<< 3) & 0x08;
916 case R_RX_RH_ABS5p5L
:
917 RX_STACK_POP (relocation
);
922 OP (0) |= relocation
>> 2;
924 OP (1) |= (relocation
<< 6) & 0x80;
925 OP (1) |= (relocation
<< 3) & 0x08;
928 case R_RX_RH_ABS5p8B
:
929 RX_STACK_POP (relocation
);
932 OP (0) |= (relocation
<< 3) & 0x80;
933 OP (0) |= relocation
& 0x0f;
936 case R_RX_RH_ABS5p8W
:
937 RX_STACK_POP (relocation
);
942 OP (0) |= (relocation
<< 3) & 0x80;
943 OP (0) |= relocation
& 0x0f;
946 case R_RX_RH_ABS5p8L
:
947 RX_STACK_POP (relocation
);
952 OP (0) |= (relocation
<< 3) & 0x80;
953 OP (0) |= relocation
& 0x0f;
956 case R_RX_RH_UIMM4p8
:
959 OP (0) |= relocation
<< 4;
962 case R_RX_RH_UNEG4p8
:
965 OP (0) |= (-relocation
) << 4;
968 /* Complex reloc handling: */
972 RX_STACK_POP (relocation
);
973 #if RX_OPCODE_BIG_ENDIAN
975 OP (2) = relocation
>> 8;
976 OP (1) = relocation
>> 16;
977 OP (0) = relocation
>> 24;
980 OP (1) = relocation
>> 8;
981 OP (2) = relocation
>> 16;
982 OP (3) = relocation
>> 24;
988 RX_STACK_POP (relocation
);
989 #if RX_OPCODE_BIG_ENDIAN
991 OP (1) = relocation
>> 8;
992 OP (2) = relocation
>> 16;
993 OP (3) = relocation
>> 24;
996 OP (2) = relocation
>> 8;
997 OP (1) = relocation
>> 16;
998 OP (0) = relocation
>> 24;
1002 case R_RX_ABS24S_PCREL
:
1005 RX_STACK_POP (relocation
);
1006 RANGE (-0x800000, 0x7fffff);
1007 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
1009 OP (2) = relocation
;
1010 OP (1) = relocation
>> 8;
1011 OP (0) = relocation
>> 16;
1015 OP (0) = relocation
;
1016 OP (1) = relocation
>> 8;
1017 OP (2) = relocation
>> 16;
1023 RX_STACK_POP (relocation
);
1024 RANGE (-32768, 65535);
1025 #if RX_OPCODE_BIG_ENDIAN
1026 OP (1) = relocation
;
1027 OP (0) = relocation
>> 8;
1029 OP (0) = relocation
;
1030 OP (1) = relocation
>> 8;
1034 case R_RX_ABS16_REV
:
1036 RX_STACK_POP (relocation
);
1037 RANGE (-32768, 65535);
1038 #if RX_OPCODE_BIG_ENDIAN
1039 OP (0) = relocation
;
1040 OP (1) = relocation
>> 8;
1042 OP (1) = relocation
;
1043 OP (0) = relocation
>> 8;
1047 case R_RX_ABS16S_PCREL
:
1049 RX_STACK_POP (relocation
);
1050 RANGE (-32768, 32767);
1051 if (BIGE (output_bfd
) && !(input_section
->flags
& SEC_CODE
))
1053 OP (1) = relocation
;
1054 OP (0) = relocation
>> 8;
1058 OP (0) = relocation
;
1059 OP (1) = relocation
>> 8;
1065 RX_STACK_POP (relocation
);
1067 #if RX_OPCODE_BIG_ENDIAN
1068 OP (1) = relocation
;
1069 OP (0) = relocation
>> 8;
1071 OP (0) = relocation
;
1072 OP (1) = relocation
>> 8;
1078 RX_STACK_POP (relocation
);
1081 #if RX_OPCODE_BIG_ENDIAN
1082 OP (1) = relocation
;
1083 OP (0) = relocation
>> 8;
1085 OP (0) = relocation
;
1086 OP (1) = relocation
>> 8;
1092 RX_STACK_POP (relocation
);
1095 #if RX_OPCODE_BIG_ENDIAN
1096 OP (1) = relocation
;
1097 OP (0) = relocation
>> 8;
1099 OP (0) = relocation
;
1100 OP (1) = relocation
>> 8;
1106 RX_STACK_POP (relocation
);
1108 OP (0) = relocation
;
1113 RX_STACK_POP (relocation
);
1115 OP (0) = relocation
;
1120 RX_STACK_POP (relocation
);
1123 OP (0) = relocation
;
1128 RX_STACK_POP (relocation
);
1131 OP (0) = relocation
;
1136 case R_RX_ABS8S_PCREL
:
1137 RX_STACK_POP (relocation
);
1139 OP (0) = relocation
;
1143 if (r_symndx
< symtab_hdr
->sh_info
)
1144 RX_STACK_PUSH (sec
->output_section
->vma
1145 + sec
->output_offset
1151 && (h
->root
.type
== bfd_link_hash_defined
1152 || h
->root
.type
== bfd_link_hash_defweak
))
1153 RX_STACK_PUSH (h
->root
.u
.def
.value
1154 + sec
->output_section
->vma
1155 + sec
->output_offset
1158 _bfd_error_handler (_("Warning: RX_SYM reloc with an unknown symbol"));
1168 RX_STACK_PUSH (tmp
);
1176 RX_STACK_POP (tmp1
);
1177 RX_STACK_POP (tmp2
);
1179 RX_STACK_PUSH (tmp1
);
1187 saw_subtract
= TRUE
;
1188 RX_STACK_POP (tmp1
);
1189 RX_STACK_POP (tmp2
);
1191 RX_STACK_PUSH (tmp2
);
1199 RX_STACK_POP (tmp1
);
1200 RX_STACK_POP (tmp2
);
1202 RX_STACK_PUSH (tmp1
);
1210 saw_subtract
= TRUE
;
1211 RX_STACK_POP (tmp1
);
1212 RX_STACK_POP (tmp2
);
1214 RX_STACK_PUSH (tmp1
);
1222 RX_STACK_POP (tmp1
);
1223 RX_STACK_POP (tmp2
);
1225 RX_STACK_PUSH (tmp1
);
1233 RX_STACK_POP (tmp1
);
1234 RX_STACK_POP (tmp2
);
1236 RX_STACK_PUSH (tmp1
);
1240 case R_RX_OPsctsize
:
1241 RX_STACK_PUSH (input_section
->size
);
1245 RX_STACK_PUSH (input_section
->output_section
->vma
);
1252 RX_STACK_POP (tmp1
);
1253 RX_STACK_POP (tmp2
);
1255 RX_STACK_PUSH (tmp1
);
1263 RX_STACK_POP (tmp1
);
1264 RX_STACK_POP (tmp2
);
1266 RX_STACK_PUSH (tmp1
);
1274 RX_STACK_POP (tmp1
);
1275 RX_STACK_POP (tmp2
);
1277 RX_STACK_PUSH (tmp1
);
1287 RX_STACK_PUSH (tmp
);
1295 RX_STACK_POP (tmp1
);
1296 RX_STACK_POP (tmp2
);
1298 RX_STACK_PUSH (tmp1
);
1303 RX_STACK_PUSH (get_romstart (&r
, info
, input_bfd
, input_section
, rel
->r_offset
));
1307 RX_STACK_PUSH (get_ramstart (&r
, info
, input_bfd
, input_section
, rel
->r_offset
));
1311 r
= bfd_reloc_notsupported
;
1315 if (r
!= bfd_reloc_ok
)
1317 const char * msg
= NULL
;
1321 case bfd_reloc_overflow
:
1322 /* Catch the case of a missing function declaration
1323 and emit a more helpful error message. */
1324 if (r_type
== R_RX_DIR24S_PCREL
)
1325 msg
= _("%B(%A): error: call to undefined function '%s'");
1327 r
= info
->callbacks
->reloc_overflow
1328 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
, (bfd_vma
) 0,
1329 input_bfd
, input_section
, rel
->r_offset
);
1332 case bfd_reloc_undefined
:
1333 r
= info
->callbacks
->undefined_symbol
1334 (info
, name
, input_bfd
, input_section
, rel
->r_offset
,
1338 case bfd_reloc_other
:
1339 msg
= _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1342 case bfd_reloc_outofrange
:
1343 msg
= _("%B(%A): internal error: out of range error");
1346 case bfd_reloc_notsupported
:
1347 msg
= _("%B(%A): internal error: unsupported relocation error");
1350 case bfd_reloc_dangerous
:
1351 msg
= _("%B(%A): internal error: dangerous relocation");
1355 msg
= _("%B(%A): internal error: unknown error");
1360 _bfd_error_handler (msg
, input_bfd
, input_section
, name
);
1370 /* Relaxation Support. */
1372 /* Progression of relocations from largest operand size to smallest
1376 next_smaller_reloc (int r
)
1380 case R_RX_DIR32
: return R_RX_DIR24S
;
1381 case R_RX_DIR24S
: return R_RX_DIR16S
;
1382 case R_RX_DIR16S
: return R_RX_DIR8S
;
1383 case R_RX_DIR8S
: return R_RX_NONE
;
1385 case R_RX_DIR16
: return R_RX_DIR8
;
1386 case R_RX_DIR8
: return R_RX_NONE
;
1388 case R_RX_DIR16U
: return R_RX_DIR8U
;
1389 case R_RX_DIR8U
: return R_RX_NONE
;
1391 case R_RX_DIR24S_PCREL
: return R_RX_DIR16S_PCREL
;
1392 case R_RX_DIR16S_PCREL
: return R_RX_DIR8S_PCREL
;
1393 case R_RX_DIR8S_PCREL
: return R_RX_DIR3U_PCREL
;
1395 case R_RX_DIR16UL
: return R_RX_DIR8UL
;
1396 case R_RX_DIR8UL
: return R_RX_NONE
;
1397 case R_RX_DIR16UW
: return R_RX_DIR8UW
;
1398 case R_RX_DIR8UW
: return R_RX_NONE
;
1400 case R_RX_RH_32_OP
: return R_RX_RH_24_OP
;
1401 case R_RX_RH_24_OP
: return R_RX_RH_16_OP
;
1402 case R_RX_RH_16_OP
: return R_RX_DIR8
;
1404 case R_RX_ABS32
: return R_RX_ABS24S
;
1405 case R_RX_ABS24S
: return R_RX_ABS16S
;
1406 case R_RX_ABS16
: return R_RX_ABS8
;
1407 case R_RX_ABS16U
: return R_RX_ABS8U
;
1408 case R_RX_ABS16S
: return R_RX_ABS8S
;
1409 case R_RX_ABS8
: return R_RX_NONE
;
1410 case R_RX_ABS8U
: return R_RX_NONE
;
1411 case R_RX_ABS8S
: return R_RX_NONE
;
1412 case R_RX_ABS24S_PCREL
: return R_RX_ABS16S_PCREL
;
1413 case R_RX_ABS16S_PCREL
: return R_RX_ABS8S_PCREL
;
1414 case R_RX_ABS8S_PCREL
: return R_RX_NONE
;
1415 case R_RX_ABS16UL
: return R_RX_ABS8UL
;
1416 case R_RX_ABS16UW
: return R_RX_ABS8UW
;
1417 case R_RX_ABS8UL
: return R_RX_NONE
;
1418 case R_RX_ABS8UW
: return R_RX_NONE
;
1423 /* Delete some bytes from a section while relaxing. */
1426 elf32_rx_relax_delete_bytes (bfd
*abfd
, asection
*sec
, bfd_vma addr
, int count
,
1427 Elf_Internal_Rela
*alignment_rel
, int force_snip
)
1429 Elf_Internal_Shdr
* symtab_hdr
;
1430 unsigned int sec_shndx
;
1431 bfd_byte
* contents
;
1432 Elf_Internal_Rela
* irel
;
1433 Elf_Internal_Rela
* irelend
;
1434 Elf_Internal_Sym
* isym
;
1435 Elf_Internal_Sym
* isymend
;
1437 unsigned int symcount
;
1438 struct elf_link_hash_entry
** sym_hashes
;
1439 struct elf_link_hash_entry
** end_hashes
;
1444 sec_shndx
= _bfd_elf_section_from_bfd_section (abfd
, sec
);
1446 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1448 /* The deletion must stop at the next alignment boundary, if
1449 ALIGNMENT_REL is non-NULL. */
1452 toaddr
= alignment_rel
->r_offset
;
1454 irel
= elf_section_data (sec
)->relocs
;
1455 irelend
= irel
+ sec
->reloc_count
;
1457 /* Actually delete the bytes. */
1458 memmove (contents
+ addr
, contents
+ addr
+ count
,
1459 (size_t) (toaddr
- addr
- count
));
1461 /* If we don't have an alignment marker to worry about, we can just
1462 shrink the section. Otherwise, we have to fill in the newly
1463 created gap with NOP insns (0x03). */
1467 memset (contents
+ toaddr
- count
, 0x03, count
);
1469 /* Adjust all the relocs. */
1470 for (irel
= elf_section_data (sec
)->relocs
; irel
< irelend
; irel
++)
1472 /* Get the new reloc address. */
1473 if (irel
->r_offset
> addr
1474 && (irel
->r_offset
< toaddr
1475 || (force_snip
&& irel
->r_offset
== toaddr
)))
1476 irel
->r_offset
-= count
;
1478 /* If we see an ALIGN marker at the end of the gap, we move it
1479 to the beginning of the gap, since marking these gaps is what
1481 if (irel
->r_offset
== toaddr
1482 && ELF32_R_TYPE (irel
->r_info
) == R_RX_RH_RELAX
1483 && irel
->r_addend
& RX_RELAXA_ALIGN
)
1484 irel
->r_offset
-= count
;
1487 /* Adjust the local symbols defined in this section. */
1488 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1489 isym
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1490 isymend
= isym
+ symtab_hdr
->sh_info
;
1492 for (; isym
< isymend
; isym
++)
1494 /* If the symbol is in the range of memory we just moved, we
1495 have to adjust its value. */
1496 if (isym
->st_shndx
== sec_shndx
1497 && isym
->st_value
> addr
1498 && isym
->st_value
< toaddr
)
1499 isym
->st_value
-= count
;
1501 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1502 *end* is in the moved bytes but it's *start* isn't), then we
1503 must adjust its size. */
1504 if (isym
->st_shndx
== sec_shndx
1505 && isym
->st_value
< addr
1506 && isym
->st_value
+ isym
->st_size
> addr
1507 && isym
->st_value
+ isym
->st_size
< toaddr
)
1508 isym
->st_size
-= count
;
1511 /* Now adjust the global symbols defined in this section. */
1512 symcount
= (symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
)
1513 - symtab_hdr
->sh_info
);
1514 sym_hashes
= elf_sym_hashes (abfd
);
1515 end_hashes
= sym_hashes
+ symcount
;
1517 for (; sym_hashes
< end_hashes
; sym_hashes
++)
1519 struct elf_link_hash_entry
*sym_hash
= *sym_hashes
;
1521 if ((sym_hash
->root
.type
== bfd_link_hash_defined
1522 || sym_hash
->root
.type
== bfd_link_hash_defweak
)
1523 && sym_hash
->root
.u
.def
.section
== sec
)
1525 /* As above, adjust the value if needed. */
1526 if (sym_hash
->root
.u
.def
.value
> addr
1527 && sym_hash
->root
.u
.def
.value
< toaddr
)
1528 sym_hash
->root
.u
.def
.value
-= count
;
1530 /* As above, adjust the size if needed. */
1531 if (sym_hash
->root
.u
.def
.value
< addr
1532 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
> addr
1533 && sym_hash
->root
.u
.def
.value
+ sym_hash
->size
< toaddr
)
1534 sym_hash
->size
-= count
;
1541 /* Used to sort relocs by address. If relocs have the same address,
1542 we maintain their relative order, except that R_RX_RH_RELAX
1543 alignment relocs must be the first reloc for any given address. */
1546 reloc_bubblesort (Elf_Internal_Rela
* r
, int count
)
1550 bfd_boolean swappit
;
1552 /* This is almost a classic bubblesort. It's the slowest sort, but
1553 we're taking advantage of the fact that the relocations are
1554 mostly in order already (the assembler emits them that way) and
1555 we need relocs with the same address to remain in the same
1561 for (i
= 0; i
< count
- 1; i
++)
1563 if (r
[i
].r_offset
> r
[i
+ 1].r_offset
)
1565 else if (r
[i
].r_offset
< r
[i
+ 1].r_offset
)
1567 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RX_RH_RELAX
1568 && (r
[i
+ 1].r_addend
& RX_RELAXA_ALIGN
))
1570 else if (ELF32_R_TYPE (r
[i
+ 1].r_info
) == R_RX_RH_RELAX
1571 && (r
[i
+ 1].r_addend
& RX_RELAXA_ELIGN
)
1572 && !(ELF32_R_TYPE (r
[i
].r_info
) == R_RX_RH_RELAX
1573 && (r
[i
].r_addend
& RX_RELAXA_ALIGN
)))
1580 Elf_Internal_Rela tmp
;
1585 /* If we do move a reloc back, re-scan to see if it
1586 needs to be moved even further back. This avoids
1587 most of the O(n^2) behavior for our cases. */
1597 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1598 rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1599 lrel, abfd, sec, link_info, scale)
1602 rx_offset_for_reloc (bfd
* abfd
,
1603 Elf_Internal_Rela
* rel
,
1604 Elf_Internal_Shdr
* symtab_hdr
,
1605 Elf_External_Sym_Shndx
* shndx_buf ATTRIBUTE_UNUSED
,
1606 Elf_Internal_Sym
* intsyms
,
1607 Elf_Internal_Rela
** lrel
,
1609 asection
* input_section
,
1610 struct bfd_link_info
* info
,
1614 bfd_reloc_status_type r
;
1618 /* REL is the first of 1..N relocations. We compute the symbol
1619 value for each relocation, then combine them if needed. LREL
1620 gets a pointer to the last relocation used. */
1625 /* Get the value of the symbol referred to by the reloc. */
1626 if (ELF32_R_SYM (rel
->r_info
) < symtab_hdr
->sh_info
)
1628 /* A local symbol. */
1629 Elf_Internal_Sym
*isym
;
1632 isym
= intsyms
+ ELF32_R_SYM (rel
->r_info
);
1634 if (isym
->st_shndx
== SHN_UNDEF
)
1635 ssec
= bfd_und_section_ptr
;
1636 else if (isym
->st_shndx
== SHN_ABS
)
1637 ssec
= bfd_abs_section_ptr
;
1638 else if (isym
->st_shndx
== SHN_COMMON
)
1639 ssec
= bfd_com_section_ptr
;
1641 ssec
= bfd_section_from_elf_index (abfd
,
1644 /* Initial symbol value. */
1645 symval
= isym
->st_value
;
1647 /* GAS may have made this symbol relative to a section, in
1648 which case, we have to add the addend to find the
1650 if (ELF_ST_TYPE (isym
->st_info
) == STT_SECTION
)
1651 symval
+= rel
->r_addend
;
1655 if ((ssec
->flags
& SEC_MERGE
)
1656 && ssec
->sec_info_type
== SEC_INFO_TYPE_MERGE
)
1657 symval
= _bfd_merged_section_offset (abfd
, & ssec
,
1658 elf_section_data (ssec
)->sec_info
,
1662 /* Now make the offset relative to where the linker is putting it. */
1665 ssec
->output_section
->vma
+ ssec
->output_offset
;
1667 symval
+= rel
->r_addend
;
1672 struct elf_link_hash_entry
* h
;
1674 /* An external symbol. */
1675 indx
= ELF32_R_SYM (rel
->r_info
) - symtab_hdr
->sh_info
;
1676 h
= elf_sym_hashes (abfd
)[indx
];
1677 BFD_ASSERT (h
!= NULL
);
1679 if (h
->root
.type
!= bfd_link_hash_defined
1680 && h
->root
.type
!= bfd_link_hash_defweak
)
1682 /* This appears to be a reference to an undefined
1683 symbol. Just ignore it--it will be caught by the
1684 regular reloc processing. */
1690 symval
= (h
->root
.u
.def
.value
1691 + h
->root
.u
.def
.section
->output_section
->vma
1692 + h
->root
.u
.def
.section
->output_offset
);
1694 symval
+= rel
->r_addend
;
1697 switch (ELF32_R_TYPE (rel
->r_info
))
1700 RX_STACK_PUSH (symval
);
1704 RX_STACK_POP (tmp1
);
1706 RX_STACK_PUSH (tmp1
);
1710 RX_STACK_POP (tmp1
);
1711 RX_STACK_POP (tmp2
);
1713 RX_STACK_PUSH (tmp1
);
1717 RX_STACK_POP (tmp1
);
1718 RX_STACK_POP (tmp2
);
1720 RX_STACK_PUSH (tmp2
);
1724 RX_STACK_POP (tmp1
);
1725 RX_STACK_POP (tmp2
);
1727 RX_STACK_PUSH (tmp1
);
1731 RX_STACK_POP (tmp1
);
1732 RX_STACK_POP (tmp2
);
1734 RX_STACK_PUSH (tmp1
);
1738 RX_STACK_POP (tmp1
);
1739 RX_STACK_POP (tmp2
);
1741 RX_STACK_PUSH (tmp1
);
1745 RX_STACK_POP (tmp1
);
1746 RX_STACK_POP (tmp2
);
1748 RX_STACK_PUSH (tmp1
);
1751 case R_RX_OPsctsize
:
1752 RX_STACK_PUSH (input_section
->size
);
1756 RX_STACK_PUSH (input_section
->output_section
->vma
);
1760 RX_STACK_POP (tmp1
);
1761 RX_STACK_POP (tmp2
);
1763 RX_STACK_PUSH (tmp1
);
1767 RX_STACK_POP (tmp1
);
1768 RX_STACK_POP (tmp2
);
1770 RX_STACK_PUSH (tmp1
);
1774 RX_STACK_POP (tmp1
);
1775 RX_STACK_POP (tmp2
);
1777 RX_STACK_PUSH (tmp1
);
1781 RX_STACK_POP (tmp1
);
1783 RX_STACK_PUSH (tmp1
);
1787 RX_STACK_POP (tmp1
);
1788 RX_STACK_POP (tmp2
);
1790 RX_STACK_PUSH (tmp1
);
1794 RX_STACK_PUSH (get_romstart (&r
, info
, input_bfd
, input_section
, rel
->r_offset
));
1798 RX_STACK_PUSH (get_ramstart (&r
, info
, input_bfd
, input_section
, rel
->r_offset
));
1806 RX_STACK_POP (symval
);
1817 RX_STACK_POP (symval
);
1825 RX_STACK_POP (symval
);
1836 move_reloc (Elf_Internal_Rela
* irel
, Elf_Internal_Rela
* srel
, int delta
)
1838 bfd_vma old_offset
= srel
->r_offset
;
1841 while (irel
<= srel
)
1843 if (irel
->r_offset
== old_offset
)
1844 irel
->r_offset
+= delta
;
1849 /* Relax one section. */
1852 elf32_rx_relax_section (bfd
* abfd
,
1854 struct bfd_link_info
* link_info
,
1855 bfd_boolean
* again
,
1856 bfd_boolean allow_pcrel3
)
1858 Elf_Internal_Shdr
* symtab_hdr
;
1859 Elf_Internal_Shdr
* shndx_hdr
;
1860 Elf_Internal_Rela
* internal_relocs
;
1861 Elf_Internal_Rela
* free_relocs
= NULL
;
1862 Elf_Internal_Rela
* irel
;
1863 Elf_Internal_Rela
* srel
;
1864 Elf_Internal_Rela
* irelend
;
1865 Elf_Internal_Rela
* next_alignment
;
1866 Elf_Internal_Rela
* prev_alignment
;
1867 bfd_byte
* contents
= NULL
;
1868 bfd_byte
* free_contents
= NULL
;
1869 Elf_Internal_Sym
* intsyms
= NULL
;
1870 Elf_Internal_Sym
* free_intsyms
= NULL
;
1871 Elf_External_Sym_Shndx
* shndx_buf
= NULL
;
1877 int section_alignment_glue
;
1878 /* how much to scale the relocation by - 1, 2, or 4. */
1881 /* Assume nothing changes. */
1884 /* We don't have to do anything for a relocatable link, if
1885 this section does not have relocs, or if this is not a
1887 if (link_info
->relocatable
1888 || (sec
->flags
& SEC_RELOC
) == 0
1889 || sec
->reloc_count
== 0
1890 || (sec
->flags
& SEC_CODE
) == 0)
1893 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1894 shndx_hdr
= &elf_tdata (abfd
)->symtab_shndx_hdr
;
1896 sec_start
= sec
->output_section
->vma
+ sec
->output_offset
;
1898 /* Get the section contents. */
1899 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
1900 contents
= elf_section_data (sec
)->this_hdr
.contents
;
1901 /* Go get them off disk. */
1904 if (! bfd_malloc_and_get_section (abfd
, sec
, &contents
))
1906 elf_section_data (sec
)->this_hdr
.contents
= contents
;
1909 /* Read this BFD's symbols. */
1910 /* Get cached copy if it exists. */
1911 if (symtab_hdr
->contents
!= NULL
)
1912 intsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
1915 intsyms
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
, symtab_hdr
->sh_info
, 0, NULL
, NULL
, NULL
);
1916 symtab_hdr
->contents
= (bfd_byte
*) intsyms
;
1919 if (shndx_hdr
->sh_size
!= 0)
1923 amt
= symtab_hdr
->sh_info
;
1924 amt
*= sizeof (Elf_External_Sym_Shndx
);
1925 shndx_buf
= (Elf_External_Sym_Shndx
*) bfd_malloc (amt
);
1926 if (shndx_buf
== NULL
)
1928 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0
1929 || bfd_bread (shndx_buf
, amt
, abfd
) != amt
)
1931 shndx_hdr
->contents
= (bfd_byte
*) shndx_buf
;
1934 /* Get a copy of the native relocations. */
1935 internal_relocs
= (_bfd_elf_link_read_relocs
1936 (abfd
, sec
, NULL
, (Elf_Internal_Rela
*) NULL
,
1937 link_info
->keep_memory
));
1938 if (internal_relocs
== NULL
)
1940 if (! link_info
->keep_memory
)
1941 free_relocs
= internal_relocs
;
1943 /* The RL_ relocs must be just before the operand relocs they go
1944 with, so we must sort them to guarantee this. We use bubblesort
1945 instead of qsort so we can guarantee that relocs with the same
1946 address remain in the same relative order. */
1947 reloc_bubblesort (internal_relocs
, sec
->reloc_count
);
1949 /* Walk through them looking for relaxing opportunities. */
1950 irelend
= internal_relocs
+ sec
->reloc_count
;
1952 /* This will either be NULL or a pointer to the next alignment
1954 next_alignment
= internal_relocs
;
1955 /* This will be the previous alignment, although at first it points
1956 to the first real relocation. */
1957 prev_alignment
= internal_relocs
;
1959 /* We calculate worst case shrinkage caused by alignment directives.
1960 No fool-proof, but better than either ignoring the problem or
1961 doing heavy duty analysis of all the alignment markers in all
1963 section_alignment_glue
= 0;
1964 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1965 if (ELF32_R_TYPE (irel
->r_info
) == R_RX_RH_RELAX
1966 && irel
->r_addend
& RX_RELAXA_ALIGN
)
1968 int this_glue
= 1 << (irel
->r_addend
& RX_RELAXA_ANUM
);
1970 if (section_alignment_glue
< this_glue
)
1971 section_alignment_glue
= this_glue
;
1973 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
1975 section_alignment_glue
*= 2;
1977 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
1979 unsigned char *insn
;
1982 /* The insns we care about are all marked with one of these. */
1983 if (ELF32_R_TYPE (irel
->r_info
) != R_RX_RH_RELAX
)
1986 if (irel
->r_addend
& RX_RELAXA_ALIGN
1987 || next_alignment
== internal_relocs
)
1989 /* When we delete bytes, we need to maintain all the alignments
1990 indicated. In addition, we need to be careful about relaxing
1991 jumps across alignment boundaries - these displacements
1992 *grow* when we delete bytes. For now, don't shrink
1993 displacements across an alignment boundary, just in case.
1994 Note that this only affects relocations to the same
1996 prev_alignment
= next_alignment
;
1997 next_alignment
+= 2;
1998 while (next_alignment
< irelend
1999 && (ELF32_R_TYPE (next_alignment
->r_info
) != R_RX_RH_RELAX
2000 || !(next_alignment
->r_addend
& RX_RELAXA_ELIGN
)))
2002 if (next_alignment
>= irelend
|| next_alignment
->r_offset
== 0)
2003 next_alignment
= NULL
;
2006 /* When we hit alignment markers, see if we've shrunk enough
2007 before them to reduce the gap without violating the alignment
2009 if (irel
->r_addend
& RX_RELAXA_ALIGN
)
2011 /* At this point, the next relocation *should* be the ELIGN
2013 Elf_Internal_Rela
*erel
= irel
+ 1;
2014 unsigned int alignment
, nbytes
;
2016 if (ELF32_R_TYPE (erel
->r_info
) != R_RX_RH_RELAX
)
2018 if (!(erel
->r_addend
& RX_RELAXA_ELIGN
))
2021 alignment
= 1 << (irel
->r_addend
& RX_RELAXA_ANUM
);
2023 if (erel
->r_offset
- irel
->r_offset
< alignment
)
2026 nbytes
= erel
->r_offset
- irel
->r_offset
;
2027 nbytes
/= alignment
;
2028 nbytes
*= alignment
;
2030 elf32_rx_relax_delete_bytes (abfd
, sec
, erel
->r_offset
-nbytes
, nbytes
, next_alignment
,
2031 erel
->r_offset
== sec
->size
);
2037 if (irel
->r_addend
& RX_RELAXA_ELIGN
)
2040 insn
= contents
+ irel
->r_offset
;
2042 nrelocs
= irel
->r_addend
& RX_RELAXA_RNUM
;
2044 /* At this point, we have an insn that is a candidate for linker
2045 relaxation. There are NRELOCS relocs following that may be
2046 relaxed, although each reloc may be made of more than one
2047 reloc entry (such as gp-rel symbols). */
2049 /* Get the value of the symbol referred to by the reloc. Just
2050 in case this is the last reloc in the list, use the RL's
2051 addend to choose between this reloc (no addend) or the next
2052 (yes addend, which means at least one following reloc). */
2054 /* srel points to the "current" reloction for this insn -
2055 actually the last reloc for a given operand, which is the one
2056 we need to update. We check the relaxations in the same
2057 order that the relocations happen, so we'll just push it
2061 pc
= sec
->output_section
->vma
+ sec
->output_offset
2065 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2066 pcrel = symval - pc + srel->r_addend; \
2069 #define SNIPNR(offset, nbytes) \
2070 elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0);
2071 #define SNIP(offset, nbytes, newtype) \
2072 SNIPNR (offset, nbytes); \
2073 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2075 /* The order of these bit tests must match the order that the
2076 relocs appear in. Since we sorted those by offset, we can
2079 /* Note that the numbers in, say, DSP6 are the bit offsets of
2080 the code fields that describe the operand. Bits number 0 for
2081 the MSB of insn[0]. */
2088 if (irel
->r_addend
& RX_RELAXA_DSP6
)
2093 if (code
== 2 && symval
/scale
<= 255)
2095 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2098 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2099 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2101 SNIP (3, 1, newrel
);
2106 else if (code
== 1 && symval
== 0)
2109 SNIP (2, 1, R_RX_NONE
);
2113 /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
2114 else if (code
== 1 && symval
/scale
<= 31
2115 /* Decodable bits. */
2116 && (insn
[0] & 0xcc) == 0xcc
2118 && (insn
[0] & 0x30) != 0x30
2119 /* Register MSBs. */
2120 && (insn
[1] & 0x88) == 0x00)
2124 insn
[0] = 0x88 | (insn
[0] & 0x30);
2125 /* The register fields are in the right place already. */
2127 /* We can't relax this new opcode. */
2130 switch ((insn
[0] & 0x30) >> 4)
2133 newrel
= R_RX_RH_ABS5p5B
;
2136 newrel
= R_RX_RH_ABS5p5W
;
2139 newrel
= R_RX_RH_ABS5p5L
;
2143 move_reloc (irel
, srel
, -2);
2144 SNIP (2, 1, newrel
);
2147 /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */
2148 else if (code
== 1 && symval
/scale
<= 31
2149 /* Decodable bits. */
2150 && (insn
[0] & 0xf8) == 0x58
2151 /* Register MSBs. */
2152 && (insn
[1] & 0x88) == 0x00)
2156 insn
[0] = 0xb0 | ((insn
[0] & 0x04) << 1);
2157 /* The register fields are in the right place already. */
2159 /* We can't relax this new opcode. */
2162 switch ((insn
[0] & 0x08) >> 3)
2165 newrel
= R_RX_RH_ABS5p5B
;
2168 newrel
= R_RX_RH_ABS5p5W
;
2172 move_reloc (irel
, srel
, -2);
2173 SNIP (2, 1, newrel
);
2177 /* A DSP4 operand always follows a DSP6 operand, even if there's
2178 no relocation for it. We have to read the code out of the
2179 opcode to calculate the offset of the operand. */
2180 if (irel
->r_addend
& RX_RELAXA_DSP4
)
2182 int code6
, offset
= 0;
2186 code6
= insn
[0] & 0x03;
2189 case 0: offset
= 2; break;
2190 case 1: offset
= 3; break;
2191 case 2: offset
= 4; break;
2192 case 3: offset
= 2; break;
2195 code
= (insn
[0] & 0x0c) >> 2;
2197 if (code
== 2 && symval
/ scale
<= 255)
2199 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2203 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2204 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2206 SNIP (offset
+1, 1, newrel
);
2211 else if (code
== 1 && symval
== 0)
2214 SNIP (offset
, 1, R_RX_NONE
);
2217 /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2218 else if (code
== 1 && symval
/scale
<= 31
2219 /* Decodable bits. */
2220 && (insn
[0] & 0xc3) == 0xc3
2222 && (insn
[0] & 0x30) != 0x30
2223 /* Register MSBs. */
2224 && (insn
[1] & 0x88) == 0x00)
2228 insn
[0] = 0x80 | (insn
[0] & 0x30);
2229 /* The register fields are in the right place already. */
2231 /* We can't relax this new opcode. */
2234 switch ((insn
[0] & 0x30) >> 4)
2237 newrel
= R_RX_RH_ABS5p5B
;
2240 newrel
= R_RX_RH_ABS5p5W
;
2243 newrel
= R_RX_RH_ABS5p5L
;
2247 move_reloc (irel
, srel
, -2);
2248 SNIP (2, 1, newrel
);
2252 /* These always occur alone, but the offset depends on whether
2253 it's a MEMEX opcode (0x06) or not. */
2254 if (irel
->r_addend
& RX_RELAXA_DSP14
)
2259 if (insn
[0] == 0x06)
2266 if (code
== 2 && symval
/ scale
<= 255)
2268 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2272 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2273 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2275 SNIP (offset
, 1, newrel
);
2279 else if (code
== 1 && symval
== 0)
2282 SNIP (offset
, 1, R_RX_NONE
);
2293 /* These always occur alone. */
2294 if (irel
->r_addend
& RX_RELAXA_IMM6
)
2300 /* These relocations sign-extend, so we must do signed compares. */
2301 ssymval
= (long) symval
;
2303 code
= insn
[0] & 0x03;
2305 if (code
== 0 && ssymval
<= 8388607 && ssymval
>= -8388608)
2307 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2311 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2312 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2314 SNIP (2, 1, newrel
);
2319 else if (code
== 3 && ssymval
<= 32767 && ssymval
>= -32768)
2321 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2325 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2326 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2328 SNIP (2, 1, newrel
);
2333 /* Special case UIMM8 format: CMP #uimm8,Rdst. */
2334 else if (code
== 2 && ssymval
<= 255 && ssymval
>= 16
2335 /* Decodable bits. */
2336 && (insn
[0] & 0xfc) == 0x74
2337 /* Decodable bits. */
2338 && ((insn
[1] & 0xf0) == 0x00))
2343 insn
[1] = 0x50 | (insn
[1] & 0x0f);
2345 /* We can't relax this new opcode. */
2348 if (STACK_REL_P (ELF32_R_TYPE (srel
->r_info
)))
2349 newrel
= R_RX_ABS8U
;
2351 newrel
= R_RX_DIR8U
;
2353 SNIP (2, 1, newrel
);
2357 else if (code
== 2 && ssymval
<= 127 && ssymval
>= -128)
2359 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2363 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2364 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2366 SNIP (2, 1, newrel
);
2371 /* Special case UIMM4 format: CMP, MUL, AND, OR. */
2372 else if (code
== 1 && ssymval
<= 15 && ssymval
>= 0
2373 /* Decodable bits and immediate type. */
2375 /* Decodable bits. */
2376 && (insn
[1] & 0xc0) == 0x00)
2378 static const int newop
[4] = { 1, 3, 4, 5 };
2380 insn
[0] = 0x60 | newop
[insn
[1] >> 4];
2381 /* The register number doesn't move. */
2383 /* We can't relax this new opcode. */
2386 move_reloc (irel
, srel
, -1);
2388 SNIP (2, 1, R_RX_RH_UIMM4p8
);
2392 /* Special case UIMM4 format: ADD -> ADD/SUB. */
2393 else if (code
== 1 && ssymval
<= 15 && ssymval
>= -15
2394 /* Decodable bits and immediate type. */
2396 /* Same register for source and destination. */
2397 && ((insn
[1] >> 4) == (insn
[1] & 0x0f)))
2401 /* Note that we can't turn "add $0,Rs" into a NOP
2402 because the flags need to be set right. */
2406 insn
[0] = 0x60; /* Subtract. */
2407 newrel
= R_RX_RH_UNEG4p8
;
2411 insn
[0] = 0x62; /* Add. */
2412 newrel
= R_RX_RH_UIMM4p8
;
2415 /* The register number is in the right place. */
2417 /* We can't relax this new opcode. */
2420 move_reloc (irel
, srel
, -1);
2422 SNIP (2, 1, newrel
);
2427 /* These are either matched with a DSP6 (2-byte base) or an id24
2429 if (irel
->r_addend
& RX_RELAXA_IMM12
)
2431 int dspcode
, offset
= 0;
2436 if ((insn
[0] & 0xfc) == 0xfc)
2437 dspcode
= 1; /* Just something with one byte operand. */
2439 dspcode
= insn
[0] & 3;
2442 case 0: offset
= 2; break;
2443 case 1: offset
= 3; break;
2444 case 2: offset
= 4; break;
2445 case 3: offset
= 2; break;
2448 /* These relocations sign-extend, so we must do signed compares. */
2449 ssymval
= (long) symval
;
2451 code
= (insn
[1] >> 2) & 3;
2452 if (code
== 0 && ssymval
<= 8388607 && ssymval
>= -8388608)
2454 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2458 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2459 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2461 SNIP (offset
, 1, newrel
);
2466 else if (code
== 3 && ssymval
<= 32767 && ssymval
>= -32768)
2468 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2472 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2473 if (newrel
!= ELF32_R_TYPE (srel
->r_info
))
2475 SNIP (offset
, 1, newrel
);
2480 /* Special case UIMM8 format: MOV #uimm8,Rdst. */
2481 else if (code
== 2 && ssymval
<= 255 && ssymval
>= 16
2482 /* Decodable bits. */
2484 /* Decodable bits. */
2485 && ((insn
[1] & 0x03) == 0x02))
2490 insn
[1] = 0x40 | (insn
[1] >> 4);
2492 /* We can't relax this new opcode. */
2495 if (STACK_REL_P (ELF32_R_TYPE (srel
->r_info
)))
2496 newrel
= R_RX_ABS8U
;
2498 newrel
= R_RX_DIR8U
;
2500 SNIP (2, 1, newrel
);
2504 else if (code
== 2 && ssymval
<= 127 && ssymval
>= -128)
2506 unsigned int newrel
= ELF32_R_TYPE(srel
->r_info
);
2510 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2511 if (newrel
!= ELF32_R_TYPE(srel
->r_info
))
2513 SNIP (offset
, 1, newrel
);
2518 /* Special case UIMM4 format: MOV #uimm4,Rdst. */
2519 else if (code
== 1 && ssymval
<= 15 && ssymval
>= 0
2520 /* Decodable bits. */
2522 /* Decodable bits. */
2523 && ((insn
[1] & 0x03) == 0x02))
2526 insn
[1] = insn
[1] >> 4;
2528 /* We can't relax this new opcode. */
2531 move_reloc (irel
, srel
, -1);
2533 SNIP (2, 1, R_RX_RH_UIMM4p8
);
2538 if (irel
->r_addend
& RX_RELAXA_BRA
)
2540 unsigned int newrel
= ELF32_R_TYPE (srel
->r_info
);
2542 int alignment_glue
= 0;
2546 /* Branches over alignment chunks are problematic, as
2547 deleting bytes here makes the branch *further* away. We
2548 can be agressive with branches within this alignment
2549 block, but not branches outside it. */
2550 if ((prev_alignment
== NULL
2551 || symval
< (bfd_vma
)(sec_start
+ prev_alignment
->r_offset
))
2552 && (next_alignment
== NULL
2553 || symval
> (bfd_vma
)(sec_start
+ next_alignment
->r_offset
)))
2554 alignment_glue
= section_alignment_glue
;
2556 if (ELF32_R_TYPE(srel
[1].r_info
) == R_RX_RH_RELAX
2557 && srel
[1].r_addend
& RX_RELAXA_BRA
2558 && srel
[1].r_offset
< irel
->r_offset
+ pcrel
)
2561 newrel
= next_smaller_reloc (ELF32_R_TYPE (srel
->r_info
));
2563 /* The values we compare PCREL with are not what you'd
2564 expect; they're off by a little to compensate for (1)
2565 where the reloc is relative to the insn, and (2) how much
2566 the insn is going to change when we relax it. */
2568 /* These we have to decode. */
2571 case 0x04: /* BRA pcdsp:24 */
2572 if (-32768 + alignment_glue
<= pcrel
2573 && pcrel
<= 32765 - alignment_glue
)
2576 SNIP (3, 1, newrel
);
2581 case 0x38: /* BRA pcdsp:16 */
2582 if (-128 + alignment_glue
<= pcrel
2583 && pcrel
<= 127 - alignment_glue
)
2586 SNIP (2, 1, newrel
);
2591 case 0x2e: /* BRA pcdsp:8 */
2592 /* Note that there's a risk here of shortening things so
2593 much that we no longer fit this reloc; it *should*
2594 only happen when you branch across a branch, and that
2595 branch also devolves into BRA.S. "Real" code should
2597 if (max_pcrel3
+ alignment_glue
<= pcrel
2598 && pcrel
<= 10 - alignment_glue
2602 SNIP (1, 1, newrel
);
2603 move_reloc (irel
, srel
, -1);
2608 case 0x05: /* BSR pcdsp:24 */
2609 if (-32768 + alignment_glue
<= pcrel
2610 && pcrel
<= 32765 - alignment_glue
)
2613 SNIP (1, 1, newrel
);
2618 case 0x3a: /* BEQ.W pcdsp:16 */
2619 case 0x3b: /* BNE.W pcdsp:16 */
2620 if (-128 + alignment_glue
<= pcrel
2621 && pcrel
<= 127 - alignment_glue
)
2623 insn
[0] = 0x20 | (insn
[0] & 1);
2624 SNIP (1, 1, newrel
);
2629 case 0x20: /* BEQ.B pcdsp:8 */
2630 case 0x21: /* BNE.B pcdsp:8 */
2631 if (max_pcrel3
+ alignment_glue
<= pcrel
2632 && pcrel
- alignment_glue
<= 10
2635 insn
[0] = 0x10 | ((insn
[0] & 1) << 3);
2636 SNIP (1, 1, newrel
);
2637 move_reloc (irel
, srel
, -1);
2642 case 0x16: /* synthetic BNE dsp24 */
2643 case 0x1e: /* synthetic BEQ dsp24 */
2644 if (-32767 + alignment_glue
<= pcrel
2645 && pcrel
<= 32766 - alignment_glue
2648 if (insn
[0] == 0x16)
2652 /* We snip out the bytes at the end else the reloc
2653 will get moved too, and too much. */
2654 SNIP (3, 2, newrel
);
2655 move_reloc (irel
, srel
, -1);
2661 /* Special case - synthetic conditional branches, pcrel24.
2662 Note that EQ and NE have been handled above. */
2663 if ((insn
[0] & 0xf0) == 0x20
2666 && srel
->r_offset
!= irel
->r_offset
+ 1
2667 && -32767 + alignment_glue
<= pcrel
2668 && pcrel
<= 32766 - alignment_glue
)
2672 SNIP (5, 1, newrel
);
2676 /* Special case - synthetic conditional branches, pcrel16 */
2677 if ((insn
[0] & 0xf0) == 0x20
2680 && srel
->r_offset
!= irel
->r_offset
+ 1
2681 && -127 + alignment_glue
<= pcrel
2682 && pcrel
<= 126 - alignment_glue
)
2684 int cond
= (insn
[0] & 0x0f) ^ 0x01;
2686 insn
[0] = 0x20 | cond
;
2687 /* By moving the reloc first, we avoid having
2688 delete_bytes move it also. */
2689 move_reloc (irel
, srel
, -2);
2690 SNIP (2, 3, newrel
);
2695 BFD_ASSERT (nrelocs
== 0);
2697 /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2698 use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky
2699 because it may have one or two relocations. */
2700 if ((insn
[0] & 0xfc) == 0xf8
2701 && (insn
[1] & 0x80) == 0x00
2702 && (insn
[0] & 0x03) != 0x03)
2704 int dcode
, icode
, reg
, ioff
, dscale
, ilen
;
2705 bfd_vma disp_val
= 0;
2707 Elf_Internal_Rela
* disp_rel
= 0;
2708 Elf_Internal_Rela
* imm_rel
= 0;
2713 dcode
= insn
[0] & 0x03;
2714 icode
= (insn
[1] >> 2) & 0x03;
2715 reg
= (insn
[1] >> 4) & 0x0f;
2717 ioff
= dcode
== 1 ? 3 : dcode
== 2 ? 4 : 2;
2719 /* Figure out what the dispacement is. */
2720 if (dcode
== 1 || dcode
== 2)
2722 /* There's a displacement. See if there's a reloc for it. */
2723 if (srel
[1].r_offset
== irel
->r_offset
+ 2)
2735 #if RX_OPCODE_BIG_ENDIAN
2736 disp_val
= insn
[2] * 256 + insn
[3];
2738 disp_val
= insn
[2] + insn
[3] * 256;
2741 switch (insn
[1] & 3)
2757 /* Figure out what the immediate is. */
2758 if (srel
[1].r_offset
== irel
->r_offset
+ ioff
)
2761 imm_val
= (long) symval
;
2766 unsigned char * ip
= insn
+ ioff
;
2771 /* For byte writes, we don't sign extend. Makes the math easier later. */
2775 imm_val
= (char) ip
[0];
2778 #if RX_OPCODE_BIG_ENDIAN
2779 imm_val
= ((char) ip
[0] << 8) | ip
[1];
2781 imm_val
= ((char) ip
[1] << 8) | ip
[0];
2785 #if RX_OPCODE_BIG_ENDIAN
2786 imm_val
= ((char) ip
[0] << 16) | (ip
[1] << 8) | ip
[2];
2788 imm_val
= ((char) ip
[2] << 16) | (ip
[1] << 8) | ip
[0];
2792 #if RX_OPCODE_BIG_ENDIAN
2793 imm_val
= (ip
[0] << 24) | (ip
[1] << 16) | (ip
[2] << 8) | ip
[3];
2795 imm_val
= (ip
[3] << 24) | (ip
[2] << 16) | (ip
[1] << 8) | ip
[0];
2829 /* The shortcut happens when the immediate is 0..255,
2830 register r0 to r7, and displacement (scaled) 0..31. */
2832 if (0 <= imm_val
&& imm_val
<= 255
2833 && 0 <= reg
&& reg
<= 7
2834 && disp_val
/ dscale
<= 31)
2836 insn
[0] = 0x3c | (insn
[1] & 0x03);
2837 insn
[1] = (((disp_val
/ dscale
) << 3) & 0x80) | (reg
<< 4) | ((disp_val
/dscale
) & 0x0f);
2842 int newrel
= R_RX_NONE
;
2847 newrel
= R_RX_RH_ABS5p8B
;
2850 newrel
= R_RX_RH_ABS5p8W
;
2853 newrel
= R_RX_RH_ABS5p8L
;
2856 disp_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (disp_rel
->r_info
), newrel
);
2857 move_reloc (irel
, disp_rel
, -1);
2861 imm_rel
->r_info
= ELF32_R_INFO (ELF32_R_SYM (imm_rel
->r_info
), R_RX_DIR8U
);
2862 move_reloc (disp_rel
? disp_rel
: irel
,
2864 irel
->r_offset
- imm_rel
->r_offset
+ 2);
2867 SNIPNR (3, ilen
- 3);
2870 /* We can't relax this new opcode. */
2876 /* We can't reliably relax branches to DIR3U_PCREL unless we know
2877 whatever they're branching over won't shrink any more. If we're
2878 basically done here, do one more pass just for branches - but
2879 don't request a pass after that one! */
2880 if (!*again
&& !allow_pcrel3
)
2882 bfd_boolean ignored
;
2884 elf32_rx_relax_section (abfd
, sec
, link_info
, &ignored
, TRUE
);
2890 if (free_relocs
!= NULL
)
2893 if (free_contents
!= NULL
)
2894 free (free_contents
);
2896 if (shndx_buf
!= NULL
)
2898 shndx_hdr
->contents
= NULL
;
2902 if (free_intsyms
!= NULL
)
2903 free (free_intsyms
);
2909 elf32_rx_relax_section_wrapper (bfd
* abfd
,
2911 struct bfd_link_info
* link_info
,
2912 bfd_boolean
* again
)
2914 return elf32_rx_relax_section (abfd
, sec
, link_info
, again
, FALSE
);
2917 /* Function to set the ELF flag bits. */
2920 rx_elf_set_private_flags (bfd
* abfd
, flagword flags
)
2922 elf_elfheader (abfd
)->e_flags
= flags
;
2923 elf_flags_init (abfd
) = TRUE
;
2927 static bfd_boolean no_warn_mismatch
= FALSE
;
2928 static bfd_boolean ignore_lma
= TRUE
;
2930 void bfd_elf32_rx_set_target_flags (bfd_boolean
, bfd_boolean
);
2933 bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch
,
2934 bfd_boolean user_ignore_lma
)
2936 no_warn_mismatch
= user_no_warn_mismatch
;
2937 ignore_lma
= user_ignore_lma
;
2940 /* Converts FLAGS into a descriptive string.
2941 Returns a static pointer. */
2944 describe_flags (flagword flags
)
2946 static char buf
[128];
2950 if (flags
& E_FLAG_RX_64BIT_DOUBLES
)
2951 strcat (buf
, "64-bit doubles");
2953 strcat (buf
, "32-bit doubles");
2955 if (flags
& E_FLAG_RX_DSP
)
2956 strcat (buf
, ", dsp");
2958 strcat (buf
, ", no dsp");
2960 if (flags
& E_FLAG_RX_PID
)
2961 strcat (buf
, ", pid");
2963 strcat (buf
, ", no pid");
2965 if (flags
& E_FLAG_RX_ABI
)
2966 strcat (buf
, ", RX ABI");
2968 strcat (buf
, ", GCC ABI");
2973 /* Merge backend specific data from an object file to the output
2974 object file when linking. */
2977 rx_elf_merge_private_bfd_data (bfd
* ibfd
, bfd
* obfd
)
2981 bfd_boolean error
= FALSE
;
2983 new_flags
= elf_elfheader (ibfd
)->e_flags
;
2984 old_flags
= elf_elfheader (obfd
)->e_flags
;
2986 if (!elf_flags_init (obfd
))
2988 /* First call, no flags set. */
2989 elf_flags_init (obfd
) = TRUE
;
2990 elf_elfheader (obfd
)->e_flags
= new_flags
;
2992 else if (old_flags
!= new_flags
)
2994 flagword known_flags
;
2996 known_flags
= E_FLAG_RX_ABI
| E_FLAG_RX_64BIT_DOUBLES
2997 | E_FLAG_RX_DSP
| E_FLAG_RX_PID
;
2999 if ((old_flags
^ new_flags
) & known_flags
)
3001 /* Only complain if flag bits we care about do not match.
3002 Other bits may be set, since older binaries did use some
3003 deprecated flags. */
3004 if (no_warn_mismatch
)
3006 elf_elfheader (obfd
)->e_flags
= (new_flags
| old_flags
) & known_flags
;
3010 _bfd_error_handler ("There is a conflict merging the ELF header flags from %s",
3011 bfd_get_filename (ibfd
));
3012 _bfd_error_handler (" the input file's flags: %s",
3013 describe_flags (new_flags
));
3014 _bfd_error_handler (" the output file's flags: %s",
3015 describe_flags (old_flags
));
3020 elf_elfheader (obfd
)->e_flags
= new_flags
& known_flags
;
3024 bfd_set_error (bfd_error_bad_value
);
3030 rx_elf_print_private_bfd_data (bfd
* abfd
, void * ptr
)
3032 FILE * file
= (FILE *) ptr
;
3035 BFD_ASSERT (abfd
!= NULL
&& ptr
!= NULL
);
3037 /* Print normal ELF private data. */
3038 _bfd_elf_print_private_bfd_data (abfd
, ptr
);
3040 flags
= elf_elfheader (abfd
)->e_flags
;
3041 fprintf (file
, _("private flags = 0x%lx:"), (long) flags
);
3043 fprintf (file
, "%s", describe_flags (flags
));
3047 /* Return the MACH for an e_flags value. */
3050 elf32_rx_machine (bfd
* abfd ATTRIBUTE_UNUSED
)
3052 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3053 Need to sort out how these flag bits are used.
3054 For now we assume that the flags are OK. */
3055 if ((elf_elfheader (abfd
)->e_flags
& EF_RX_CPU_MASK
) == EF_RX_CPU_RX
)
3063 rx_elf_object_p (bfd
* abfd
)
3067 Elf_Internal_Phdr
*phdr
= elf_tdata (abfd
)->phdr
;
3068 int nphdrs
= elf_elfheader (abfd
)->e_phnum
;
3070 static int saw_be
= FALSE
;
3072 /* We never want to automatically choose the non-swapping big-endian
3073 target. The user can only get that explicitly, such as with -I
3075 if (abfd
->xvec
== &bfd_elf32_rx_be_ns_vec
3076 && abfd
->target_defaulted
)
3079 /* BFD->target_defaulted is not set to TRUE when a target is chosen
3080 as a fallback, so we check for "scanning" to know when to stop
3081 using the non-swapping target. */
3082 if (abfd
->xvec
== &bfd_elf32_rx_be_ns_vec
3085 if (abfd
->xvec
== &bfd_elf32_rx_be_vec
)
3088 bfd_default_set_arch_mach (abfd
, bfd_arch_rx
,
3089 elf32_rx_machine (abfd
));
3091 /* For each PHDR in the object, we must find some section that
3092 corresponds (based on matching file offsets) and use its VMA
3093 information to reconstruct the p_vaddr field we clobbered when we
3095 for (i
=0; i
<nphdrs
; i
++)
3097 for (u
=0; u
<elf_tdata(abfd
)->num_elf_sections
; u
++)
3099 Elf_Internal_Shdr
*sec
= elf_tdata(abfd
)->elf_sect_ptr
[u
];
3101 if (phdr
[i
].p_filesz
3102 && phdr
[i
].p_offset
<= (bfd_vma
) sec
->sh_offset
3103 && (bfd_vma
)sec
->sh_offset
<= phdr
[i
].p_offset
+ (phdr
[i
].p_filesz
- 1))
3105 /* Found one! The difference between the two addresses,
3106 plus the difference between the two file offsets, is
3107 enough information to reconstruct the lma. */
3109 /* Example where they aren't:
3110 PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3111 SEC[6] = vma 00000050 offset 00002050 size 00000040
3113 The correct LMA for the section is fffc0140 + (2050-2010).
3116 phdr
[i
].p_vaddr
= sec
->sh_addr
+ (sec
->sh_offset
- phdr
[i
].p_offset
);
3121 /* We must update the bfd sections as well, so we don't stop
3123 bsec
= abfd
->sections
;
3126 if (phdr
[i
].p_filesz
3127 && phdr
[i
].p_vaddr
<= bsec
->vma
3128 && bsec
->vma
<= phdr
[i
].p_vaddr
+ (phdr
[i
].p_filesz
- 1))
3130 bsec
->lma
= phdr
[i
].p_paddr
+ (bsec
->vma
- phdr
[i
].p_vaddr
);
3142 rx_dump_symtab (bfd
* abfd
, void * internal_syms
, void * external_syms
)
3145 Elf_Internal_Sym
* isymbuf
;
3146 Elf_Internal_Sym
* isymend
;
3147 Elf_Internal_Sym
* isym
;
3148 Elf_Internal_Shdr
* symtab_hdr
;
3149 bfd_boolean free_internal
= FALSE
, free_external
= FALSE
;
3151 char * st_info_stb_str
;
3152 char * st_other_str
;
3153 char * st_shndx_str
;
3155 if (! internal_syms
)
3157 internal_syms
= bfd_malloc (1000);
3160 if (! external_syms
)
3162 external_syms
= bfd_malloc (1000);
3166 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3167 locsymcount
= symtab_hdr
->sh_size
/ get_elf_backend_data (abfd
)->s
->sizeof_sym
;
3169 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
3170 symtab_hdr
->sh_info
, 0,
3171 internal_syms
, external_syms
, NULL
);
3173 isymbuf
= internal_syms
;
3174 isymend
= isymbuf
+ locsymcount
;
3176 for (isym
= isymbuf
; isym
< isymend
; isym
++)
3178 switch (ELF_ST_TYPE (isym
->st_info
))
3180 case STT_FUNC
: st_info_str
= "STT_FUNC";
3181 case STT_SECTION
: st_info_str
= "STT_SECTION";
3182 case STT_FILE
: st_info_str
= "STT_FILE";
3183 case STT_OBJECT
: st_info_str
= "STT_OBJECT";
3184 case STT_TLS
: st_info_str
= "STT_TLS";
3185 default: st_info_str
= "";
3187 switch (ELF_ST_BIND (isym
->st_info
))
3189 case STB_LOCAL
: st_info_stb_str
= "STB_LOCAL";
3190 case STB_GLOBAL
: st_info_stb_str
= "STB_GLOBAL";
3191 default: st_info_stb_str
= "";
3193 switch (ELF_ST_VISIBILITY (isym
->st_other
))
3195 case STV_DEFAULT
: st_other_str
= "STV_DEFAULT";
3196 case STV_INTERNAL
: st_other_str
= "STV_INTERNAL";
3197 case STV_PROTECTED
: st_other_str
= "STV_PROTECTED";
3198 default: st_other_str
= "";
3200 switch (isym
->st_shndx
)
3202 case SHN_ABS
: st_shndx_str
= "SHN_ABS";
3203 case SHN_COMMON
: st_shndx_str
= "SHN_COMMON";
3204 case SHN_UNDEF
: st_shndx_str
= "SHN_UNDEF";
3205 default: st_shndx_str
= "";
3208 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3209 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3211 (unsigned long) isym
->st_value
,
3212 (unsigned long) isym
->st_size
,
3214 bfd_elf_string_from_elf_section (abfd
, symtab_hdr
->sh_link
,
3216 isym
->st_info
, st_info_str
, st_info_stb_str
,
3217 isym
->st_other
, st_other_str
,
3218 isym
->st_shndx
, st_shndx_str
);
3221 free (internal_syms
);
3223 free (external_syms
);
3227 rx_get_reloc (long reloc
)
3229 if (0 <= reloc
&& reloc
< R_RX_max
)
3230 return rx_elf_howto_table
[reloc
].name
;
3236 /* We must take care to keep the on-disk copy of any code sections
3237 that are fully linked swapped if the target is big endian, to match
3238 the Renesas tools. */
3240 /* The rule is: big endian object that are final-link executables,
3241 have code sections stored with 32-bit words swapped relative to
3242 what you'd get by default. */
3245 rx_get_section_contents (bfd
* abfd
,
3249 bfd_size_type count
)
3251 int exec
= (abfd
->flags
& EXEC_P
) ? 1 : 0;
3252 int s_code
= (section
->flags
& SEC_CODE
) ? 1 : 0;
3256 fprintf (stderr
, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n",
3257 (long) offset
, (long) count
, section
->name
,
3258 bfd_big_endian(abfd
) ? "be" : "le",
3259 exec
, s_code
, (long unsigned) section
->filepos
,
3260 (long unsigned) offset
);
3263 if (exec
&& s_code
&& bfd_big_endian (abfd
))
3265 char * cloc
= (char *) location
;
3266 bfd_size_type cnt
, end_cnt
;
3270 /* Fetch and swap unaligned bytes at the beginning. */
3275 rv
= _bfd_generic_get_section_contents (abfd
, section
, buf
,
3280 bfd_putb32 (bfd_getl32 (buf
), buf
);
3282 cnt
= 4 - (offset
% 4);
3286 memcpy (location
, buf
+ (offset
% 4), cnt
);
3293 end_cnt
= count
% 4;
3295 /* Fetch and swap the middle bytes. */
3298 rv
= _bfd_generic_get_section_contents (abfd
, section
, cloc
, offset
,
3303 for (cnt
= count
; cnt
>= 4; cnt
-= 4, cloc
+= 4)
3304 bfd_putb32 (bfd_getl32 (cloc
), cloc
);
3307 /* Fetch and swap the end bytes. */
3312 /* Fetch the end bytes. */
3313 rv
= _bfd_generic_get_section_contents (abfd
, section
, buf
,
3314 offset
+ count
- end_cnt
, 4);
3318 bfd_putb32 (bfd_getl32 (buf
), buf
);
3319 memcpy (cloc
, buf
, end_cnt
);
3323 rv
= _bfd_generic_get_section_contents (abfd
, section
, location
, offset
, count
);
3330 rx2_set_section_contents (bfd
* abfd
,
3332 const void * location
,
3334 bfd_size_type count
)
3338 fprintf (stderr
, " set sec %s %08x loc %p offset %#x count %#x\n",
3339 section
->name
, (unsigned) section
->vma
, location
, (int) offset
, (int) count
);
3340 for (i
= 0; i
< count
; i
++)
3342 if (i
% 16 == 0 && i
> 0)
3343 fprintf (stderr
, "\n");
3345 if (i
% 16 && i
% 4 == 0)
3346 fprintf (stderr
, " ");
3349 fprintf (stderr
, " %08x:", (int) (section
->vma
+ offset
+ i
));
3351 fprintf (stderr
, " %02x", ((unsigned char *) location
)[i
]);
3353 fprintf (stderr
, "\n");
3355 return _bfd_elf_set_section_contents (abfd
, section
, location
, offset
, count
);
3357 #define _bfd_elf_set_section_contents rx2_set_section_contents
3361 rx_set_section_contents (bfd
* abfd
,
3363 const void * location
,
3365 bfd_size_type count
)
3367 bfd_boolean exec
= (abfd
->flags
& EXEC_P
) ? TRUE
: FALSE
;
3368 bfd_boolean s_code
= (section
->flags
& SEC_CODE
) ? TRUE
: FALSE
;
3370 char * swapped_data
= NULL
;
3372 bfd_vma caddr
= section
->vma
+ offset
;
3374 bfd_size_type scount
;
3379 fprintf (stderr
, "\ndj: set %ld %ld to %s %s e%d sc%d\n",
3380 (long) offset
, (long) count
, section
->name
,
3381 bfd_big_endian (abfd
) ? "be" : "le",
3384 for (i
= 0; i
< count
; i
++)
3386 int a
= section
->vma
+ offset
+ i
;
3388 if (a
% 16 == 0 && a
> 0)
3389 fprintf (stderr
, "\n");
3391 if (a
% 16 && a
% 4 == 0)
3392 fprintf (stderr
, " ");
3394 if (a
% 16 == 0 || i
== 0)
3395 fprintf (stderr
, " %08x:", (int) (section
->vma
+ offset
+ i
));
3397 fprintf (stderr
, " %02x", ((unsigned char *) location
)[i
]);
3400 fprintf (stderr
, "\n");
3403 if (! exec
|| ! s_code
|| ! bfd_big_endian (abfd
))
3404 return _bfd_elf_set_section_contents (abfd
, section
, location
, offset
, count
);
3406 while (count
> 0 && caddr
> 0 && caddr
% 4)
3410 case 0: faddr
= offset
+ 3; break;
3411 case 1: faddr
= offset
+ 1; break;
3412 case 2: faddr
= offset
- 1; break;
3413 case 3: faddr
= offset
- 3; break;
3416 rv
= _bfd_elf_set_section_contents (abfd
, section
, location
, faddr
, 1);
3426 scount
= (int)(count
/ 4) * 4;
3429 char * cloc
= (char *) location
;
3431 swapped_data
= (char *) bfd_alloc (abfd
, count
);
3433 for (i
= 0; i
< count
; i
+= 4)
3435 bfd_vma v
= bfd_getl32 (cloc
+ i
);
3436 bfd_putb32 (v
, swapped_data
+ i
);
3439 rv
= _bfd_elf_set_section_contents (abfd
, section
, swapped_data
, offset
, scount
);
3451 caddr
= section
->vma
+ offset
;
3456 case 0: faddr
= offset
+ 3; break;
3457 case 1: faddr
= offset
+ 1; break;
3458 case 2: faddr
= offset
- 1; break;
3459 case 3: faddr
= offset
- 3; break;
3461 rv
= _bfd_elf_set_section_contents (abfd
, section
, location
, faddr
, 1);
3476 rx_final_link (bfd
* abfd
, struct bfd_link_info
* info
)
3480 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
3483 fprintf (stderr
, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3484 o
->name
, o
->flags
, o
->vma
, o
->lma
, o
->size
, o
->rawsize
);
3486 if (o
->flags
& SEC_CODE
3487 && bfd_big_endian (abfd
)
3491 fprintf (stderr
, "adjusting...\n");
3493 o
->size
+= 4 - (o
->size
% 4);
3497 return bfd_elf_final_link (abfd
, info
);
3501 elf32_rx_modify_program_headers (bfd
* abfd ATTRIBUTE_UNUSED
,
3502 struct bfd_link_info
* info ATTRIBUTE_UNUSED
)
3504 const struct elf_backend_data
* bed
;
3505 struct elf_obj_tdata
* tdata
;
3506 Elf_Internal_Phdr
* phdr
;
3510 bed
= get_elf_backend_data (abfd
);
3511 tdata
= elf_tdata (abfd
);
3513 count
= elf_program_header_size (abfd
) / bed
->s
->sizeof_phdr
;
3516 for (i
= count
; i
-- != 0;)
3517 if (phdr
[i
].p_type
== PT_LOAD
)
3519 /* The Renesas tools expect p_paddr to be zero. However,
3520 there is no other way to store the writable data in ROM for
3521 startup initialization. So, we let the linker *think*
3522 we're using paddr and vaddr the "usual" way, but at the
3523 last minute we move the paddr into the vaddr (which is what
3524 the simulator uses) and zero out paddr. Note that this
3525 does not affect the section headers, just the program
3526 headers. We hope. */
3527 phdr
[i
].p_vaddr
= phdr
[i
].p_paddr
;
3528 #if 0 /* If we zero out p_paddr, then the LMA in the section table
3530 phdr
[i
].p_paddr
= 0;
3537 /* The default literal sections should always be marked as "code" (i.e.,
3538 SHF_EXECINSTR). This is particularly important for big-endian mode
3539 when we do not want their contents byte reversed. */
3540 static const struct bfd_elf_special_section elf32_rx_special_sections
[] =
3542 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3543 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3544 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY
, SHF_ALLOC
+ SHF_EXECINSTR
},
3545 { NULL
, 0, 0, 0, 0 }
3548 #define ELF_ARCH bfd_arch_rx
3549 #define ELF_MACHINE_CODE EM_RX
3550 #define ELF_MAXPAGESIZE 0x1000
3552 #define TARGET_BIG_SYM bfd_elf32_rx_be_vec
3553 #define TARGET_BIG_NAME "elf32-rx-be"
3555 #define TARGET_LITTLE_SYM bfd_elf32_rx_le_vec
3556 #define TARGET_LITTLE_NAME "elf32-rx-le"
3558 #define elf_info_to_howto_rel NULL
3559 #define elf_info_to_howto rx_info_to_howto_rela
3560 #define elf_backend_object_p rx_elf_object_p
3561 #define elf_backend_relocate_section rx_elf_relocate_section
3562 #define elf_symbol_leading_char ('_')
3563 #define elf_backend_can_gc_sections 1
3564 #define elf_backend_modify_program_headers elf32_rx_modify_program_headers
3566 #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup
3567 #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup
3568 #define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags
3569 #define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data
3570 #define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data
3571 #define bfd_elf32_get_section_contents rx_get_section_contents
3572 #define bfd_elf32_set_section_contents rx_set_section_contents
3573 #define bfd_elf32_bfd_final_link rx_final_link
3574 #define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper
3575 #define elf_backend_special_sections elf32_rx_special_sections
3577 #include "elf32-target.h"
3579 /* We define a second big-endian target that doesn't have the custom
3580 section get/set hooks, for times when we want to preserve the
3581 pre-swapped .text sections (like objcopy). */
3583 #undef TARGET_BIG_SYM
3584 #define TARGET_BIG_SYM bfd_elf32_rx_be_ns_vec
3585 #undef TARGET_BIG_NAME
3586 #define TARGET_BIG_NAME "elf32-rx-be-ns"
3587 #undef TARGET_LITTLE_SYM
3589 #undef bfd_elf32_get_section_contents
3590 #undef bfd_elf32_set_section_contents
3593 #define elf32_bed elf32_rx_be_ns_bed
3595 #include "elf32-target.h"