]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf32-rx.c
-Wimplicit-fallthrough warning fixes
[thirdparty/binutils-gdb.git] / bfd / elf32-rx.c
1 /* Renesas RX specific support for 32-bit ELF.
2 Copyright (C) 2008-2016 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
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.
10
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.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "sysdep.h"
21 #include "bfd.h"
22 #include "bfd_stdint.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/rx.h"
26 #include "libiberty.h"
27 #include "elf32-rx.h"
28
29 #define RX_OPCODE_BIG_ENDIAN 0
30
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
33 rx_elf_object_p(). */
34 const bfd_target rx_elf32_be_ns_vec;
35 const bfd_target rx_elf32_be_vec;
36
37 #ifdef DEBUG
38 char * rx_get_reloc (long);
39 void rx_dump_symtab (bfd *, void *, void *);
40 #endif
41
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)
45
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. */
49
50 static reloc_howto_type rx_elf_howto_table [] =
51 {
52 RXREL (NONE, 3, 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),
71
72 EMPTY_HOWTO (0x13),
73 EMPTY_HOWTO (0x14),
74 EMPTY_HOWTO (0x15),
75 EMPTY_HOWTO (0x16),
76 EMPTY_HOWTO (0x17),
77 EMPTY_HOWTO (0x18),
78 EMPTY_HOWTO (0x19),
79 EMPTY_HOWTO (0x1a),
80 EMPTY_HOWTO (0x1b),
81 EMPTY_HOWTO (0x1c),
82 EMPTY_HOWTO (0x1d),
83 EMPTY_HOWTO (0x1e),
84 EMPTY_HOWTO (0x1f),
85
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),
100
101 EMPTY_HOWTO (0x2e),
102 EMPTY_HOWTO (0x2f),
103 EMPTY_HOWTO (0x30),
104 EMPTY_HOWTO (0x31),
105 EMPTY_HOWTO (0x32),
106 EMPTY_HOWTO (0x33),
107 EMPTY_HOWTO (0x34),
108 EMPTY_HOWTO (0x35),
109 EMPTY_HOWTO (0x36),
110 EMPTY_HOWTO (0x37),
111 EMPTY_HOWTO (0x38),
112 EMPTY_HOWTO (0x39),
113 EMPTY_HOWTO (0x3a),
114 EMPTY_HOWTO (0x3b),
115 EMPTY_HOWTO (0x3c),
116 EMPTY_HOWTO (0x3d),
117 EMPTY_HOWTO (0x3e),
118 EMPTY_HOWTO (0x3f),
119 EMPTY_HOWTO (0x40),
120
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),
138
139 #define STACK_REL_P(x) ((x) <= R_RX_ABS16_REV && (x) >= R_RX_ABS32)
140
141 EMPTY_HOWTO (0x52),
142 EMPTY_HOWTO (0x53),
143 EMPTY_HOWTO (0x54),
144 EMPTY_HOWTO (0x55),
145 EMPTY_HOWTO (0x56),
146 EMPTY_HOWTO (0x57),
147 EMPTY_HOWTO (0x58),
148 EMPTY_HOWTO (0x59),
149 EMPTY_HOWTO (0x5a),
150 EMPTY_HOWTO (0x5b),
151 EMPTY_HOWTO (0x5c),
152 EMPTY_HOWTO (0x5d),
153 EMPTY_HOWTO (0x5e),
154 EMPTY_HOWTO (0x5f),
155 EMPTY_HOWTO (0x60),
156 EMPTY_HOWTO (0x61),
157 EMPTY_HOWTO (0x62),
158 EMPTY_HOWTO (0x63),
159 EMPTY_HOWTO (0x64),
160 EMPTY_HOWTO (0x65),
161 EMPTY_HOWTO (0x66),
162 EMPTY_HOWTO (0x67),
163 EMPTY_HOWTO (0x68),
164 EMPTY_HOWTO (0x69),
165 EMPTY_HOWTO (0x6a),
166 EMPTY_HOWTO (0x6b),
167 EMPTY_HOWTO (0x6c),
168 EMPTY_HOWTO (0x6d),
169 EMPTY_HOWTO (0x6e),
170 EMPTY_HOWTO (0x6f),
171 EMPTY_HOWTO (0x70),
172 EMPTY_HOWTO (0x71),
173 EMPTY_HOWTO (0x72),
174 EMPTY_HOWTO (0x73),
175 EMPTY_HOWTO (0x74),
176 EMPTY_HOWTO (0x75),
177 EMPTY_HOWTO (0x76),
178 EMPTY_HOWTO (0x77),
179
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. */
204
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)
222 };
223 \f
224 /* Map BFD reloc types to RX ELF reloc types. */
225
226 struct rx_reloc_map
227 {
228 bfd_reloc_code_real_type bfd_reloc_val;
229 unsigned int rx_reloc_val;
230 };
231
232 static const struct rx_reloc_map rx_reloc_map [] =
233 {
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 }
267 };
268
269 #define BIGE(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG)
270
271 static reloc_howto_type *
272 rx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
273 bfd_reloc_code_real_type code)
274 {
275 unsigned int i;
276
277 if (code == BFD_RELOC_RX_32_OP)
278 return rx_elf_howto_table + R_RX_DIR32;
279
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;
283
284 return NULL;
285 }
286
287 static reloc_howto_type *
288 rx_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED, const char * r_name)
289 {
290 unsigned int i;
291
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;
296
297 return NULL;
298 }
299
300 /* Set the howto pointer for an RX ELF reloc. */
301
302 static void
303 rx_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
304 arelent * cache_ptr,
305 Elf_Internal_Rela * dst)
306 {
307 unsigned int r_type;
308
309 r_type = ELF32_R_TYPE (dst->r_info);
310 if (r_type >= (unsigned int) R_RX_max)
311 {
312 _bfd_error_handler (_("%B: invalid RX reloc number: %d"), abfd, r_type);
313 r_type = 0;
314 }
315 cache_ptr->howto = rx_elf_howto_table + r_type;
316 }
317 \f
318 static bfd_vma
319 get_symbol_value (const char * name,
320 struct bfd_link_info * info,
321 bfd * input_bfd,
322 asection * input_section,
323 int offset)
324 {
325 bfd_vma value = 0;
326 struct bfd_link_hash_entry * h;
327
328 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
329
330 if (h == NULL
331 || (h->type != bfd_link_hash_defined
332 && h->type != bfd_link_hash_defweak))
333 (*info->callbacks->undefined_symbol)
334 (info, name, input_bfd, input_section, offset, TRUE);
335 else
336 value = (h->u.def.value
337 + h->u.def.section->output_section->vma
338 + h->u.def.section->output_offset);
339
340 return value;
341 }
342
343 static bfd_vma
344 get_symbol_value_maybe (const char * name,
345 struct bfd_link_info * info)
346 {
347 bfd_vma value = 0;
348 struct bfd_link_hash_entry * h;
349
350 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
351
352 if (h == NULL
353 || (h->type != bfd_link_hash_defined
354 && h->type != bfd_link_hash_defweak))
355 return 0;
356 else
357 value = (h->u.def.value
358 + h->u.def.section->output_section->vma
359 + h->u.def.section->output_offset);
360
361 return value;
362 }
363
364 static bfd_vma
365 get_gp (struct bfd_link_info * info,
366 bfd * abfd,
367 asection * sec,
368 int offset)
369 {
370 static bfd_boolean cached = FALSE;
371 static bfd_vma cached_value = 0;
372
373 if (!cached)
374 {
375 cached_value = get_symbol_value ("__gp", info, abfd, sec, offset);
376 cached = TRUE;
377 }
378 return cached_value;
379 }
380
381 static bfd_vma
382 get_romstart (struct bfd_link_info * info,
383 bfd * abfd,
384 asection * sec,
385 int offset)
386 {
387 static bfd_boolean cached = FALSE;
388 static bfd_vma cached_value = 0;
389
390 if (!cached)
391 {
392 cached_value = get_symbol_value ("_start", info, abfd, sec, offset);
393 cached = TRUE;
394 }
395 return cached_value;
396 }
397
398 static bfd_vma
399 get_ramstart (struct bfd_link_info * info,
400 bfd * abfd,
401 asection * sec,
402 int offset)
403 {
404 static bfd_boolean cached = FALSE;
405 static bfd_vma cached_value = 0;
406
407 if (!cached)
408 {
409 cached_value = get_symbol_value ("__datastart", info, abfd, sec, offset);
410 cached = TRUE;
411 }
412 return cached_value;
413 }
414
415 #define NUM_STACK_ENTRIES 16
416 static int32_t rx_stack [ NUM_STACK_ENTRIES ];
417 static unsigned int rx_stack_top;
418
419 #define RX_STACK_PUSH(val) \
420 do \
421 { \
422 if (rx_stack_top < NUM_STACK_ENTRIES) \
423 rx_stack [rx_stack_top ++] = (val); \
424 else \
425 r = bfd_reloc_dangerous; \
426 } \
427 while (0)
428
429 #define RX_STACK_POP(dest) \
430 do \
431 { \
432 if (rx_stack_top > 0) \
433 (dest) = rx_stack [-- rx_stack_top]; \
434 else \
435 (dest) = 0, r = bfd_reloc_dangerous; \
436 } \
437 while (0)
438
439 /* Relocate an RX ELF section.
440 There is some attempt to make this function usable for many architectures,
441 both USE_REL and USE_RELA ['twould be nice if such a critter existed],
442 if only to serve as a learning tool.
443
444 The RELOCATE_SECTION function is called by the new ELF backend linker
445 to handle the relocations for a section.
446
447 The relocs are always passed as Rela structures; if the section
448 actually uses Rel structures, the r_addend field will always be
449 zero.
450
451 This function is responsible for adjusting the section contents as
452 necessary, and (if using Rela relocs and generating a relocatable
453 output file) adjusting the reloc addend as necessary.
454
455 This function does not have to worry about setting the reloc
456 address or the reloc symbol index.
457
458 LOCAL_SYMS is a pointer to the swapped in local symbols.
459
460 LOCAL_SECTIONS is an array giving the section in the input file
461 corresponding to the st_shndx field of each local symbol.
462
463 The global hash table entry for the global symbols can be found
464 via elf_sym_hashes (input_bfd).
465
466 When generating relocatable output, this function must handle
467 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
468 going to be the section symbol corresponding to the output
469 section, which means that the addend must be adjusted
470 accordingly. */
471
472 static bfd_boolean
473 rx_elf_relocate_section
474 (bfd * output_bfd,
475 struct bfd_link_info * info,
476 bfd * input_bfd,
477 asection * input_section,
478 bfd_byte * contents,
479 Elf_Internal_Rela * relocs,
480 Elf_Internal_Sym * local_syms,
481 asection ** local_sections)
482 {
483 Elf_Internal_Shdr * symtab_hdr;
484 struct elf_link_hash_entry ** sym_hashes;
485 Elf_Internal_Rela * rel;
486 Elf_Internal_Rela * relend;
487 bfd_boolean pid_mode;
488 bfd_boolean saw_subtract = FALSE;
489 const char * table_default_cache = NULL;
490 bfd_vma table_start_cache = 0;
491 bfd_vma table_end_cache = 0;
492
493 if (elf_elfheader (output_bfd)->e_flags & E_FLAG_RX_PID)
494 pid_mode = TRUE;
495 else
496 pid_mode = FALSE;
497
498 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
499 sym_hashes = elf_sym_hashes (input_bfd);
500 relend = relocs + input_section->reloc_count;
501 for (rel = relocs; rel < relend; rel ++)
502 {
503 reloc_howto_type * howto;
504 unsigned long r_symndx;
505 Elf_Internal_Sym * sym;
506 asection * sec;
507 struct elf_link_hash_entry * h;
508 bfd_vma relocation;
509 bfd_reloc_status_type r;
510 const char * name = NULL;
511 bfd_boolean unresolved_reloc = TRUE;
512 int r_type;
513
514 r_type = ELF32_R_TYPE (rel->r_info);
515 r_symndx = ELF32_R_SYM (rel->r_info);
516
517 howto = rx_elf_howto_table + ELF32_R_TYPE (rel->r_info);
518 h = NULL;
519 sym = NULL;
520 sec = NULL;
521 relocation = 0;
522
523 if (rx_stack_top == 0)
524 saw_subtract = FALSE;
525
526 if (r_symndx < symtab_hdr->sh_info)
527 {
528 sym = local_syms + r_symndx;
529 sec = local_sections [r_symndx];
530 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, & sec, rel);
531
532 name = bfd_elf_string_from_elf_section
533 (input_bfd, symtab_hdr->sh_link, sym->st_name);
534 name = (sym->st_name == 0) ? bfd_section_name (input_bfd, sec) : name;
535 }
536 else
537 {
538 bfd_boolean warned, ignored;
539
540 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
541 r_symndx, symtab_hdr, sym_hashes, h,
542 sec, relocation, unresolved_reloc,
543 warned, ignored);
544
545 name = h->root.root.string;
546 }
547
548 if (strncmp (name, "$tableentry$default$", 20) == 0)
549 {
550 bfd_vma entry_vma;
551 int idx;
552 char *buf;
553
554 if (table_default_cache != name)
555 {
556
557 /* All relocs for a given table should be to the same
558 (weak) default symbol) so we can use it to detect a
559 cache miss. We use the offset into the table to find
560 the "real" symbol. Calculate and store the table's
561 offset here. */
562
563 table_default_cache = name;
564
565 /* We have already done error checking in rx_table_find(). */
566
567 buf = (char *) malloc (13 + strlen (name + 20));
568
569 sprintf (buf, "$tablestart$%s", name + 20);
570 table_start_cache = get_symbol_value (buf,
571 info,
572 input_bfd,
573 input_section,
574 rel->r_offset);
575
576 sprintf (buf, "$tableend$%s", name + 20);
577 table_end_cache = get_symbol_value (buf,
578 info,
579 input_bfd,
580 input_section,
581 rel->r_offset);
582
583 free (buf);
584 }
585
586 entry_vma = (input_section->output_section->vma
587 + input_section->output_offset
588 + rel->r_offset);
589
590 if (table_end_cache <= entry_vma || entry_vma < table_start_cache)
591 {
592 _bfd_error_handler (_("%B:%A: table entry %s outside table"),
593 input_bfd, input_section,
594 name);
595 }
596 else if ((int) (entry_vma - table_start_cache) % 4)
597 {
598 _bfd_error_handler (_("%B:%A: table entry %s not word-aligned within table"),
599 input_bfd, input_section,
600 name);
601 }
602 else
603 {
604 idx = (int) (entry_vma - table_start_cache) / 4;
605
606 /* This will look like $tableentry$<N>$<name> */
607 buf = (char *) malloc (12 + 20 + strlen (name + 20));
608 sprintf (buf, "$tableentry$%d$%s", idx, name + 20);
609
610 h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, buf, FALSE, FALSE, TRUE);
611
612 if (h)
613 {
614 relocation = (h->root.u.def.value
615 + h->root.u.def.section->output_section->vma
616 + h->root.u.def.section->output_offset);;
617 }
618
619 free (buf);
620 }
621 }
622
623 if (sec != NULL && discarded_section (sec))
624 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
625 rel, 1, relend, howto, 0, contents);
626
627 if (bfd_link_relocatable (info))
628 {
629 /* This is a relocatable link. We don't have to change
630 anything, unless the reloc is against a section symbol,
631 in which case we have to adjust according to where the
632 section symbol winds up in the output section. */
633 if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
634 rel->r_addend += sec->output_offset;
635 continue;
636 }
637
638 if (h != NULL && h->root.type == bfd_link_hash_undefweak)
639 /* If the symbol is undefined and weak
640 then the relocation resolves to zero. */
641 relocation = 0;
642 else
643 {
644 if (howto->pc_relative)
645 {
646 relocation -= (input_section->output_section->vma
647 + input_section->output_offset
648 + rel->r_offset);
649 if (r_type != R_RX_RH_3_PCREL
650 && r_type != R_RX_DIR3U_PCREL)
651 relocation ++;
652 }
653
654 relocation += rel->r_addend;
655 }
656
657 r = bfd_reloc_ok;
658
659 #define RANGE(a,b) if (a > (long) relocation || (long) relocation > b) r = bfd_reloc_overflow
660 #define ALIGN(m) if (relocation & m) r = bfd_reloc_other;
661 #define OP(i) (contents[rel->r_offset + (i)])
662 #define WARN_REDHAT(type) \
663 _bfd_error_handler (_("%B:%A: Warning: deprecated Red Hat reloc " type " detected against: %s."), \
664 input_bfd, input_section, name)
665
666 /* Check for unsafe relocs in PID mode. These are any relocs where
667 an absolute address is being computed. There are special cases
668 for relocs against symbols that are known to be referenced in
669 crt0.o before the PID base address register has been initialised. */
670 #define UNSAFE_FOR_PID \
671 do \
672 { \
673 if (pid_mode \
674 && sec != NULL \
675 && sec->flags & SEC_READONLY \
676 && !(input_section->flags & SEC_DEBUGGING) \
677 && strcmp (name, "__pid_base") != 0 \
678 && strcmp (name, "__gp") != 0 \
679 && strcmp (name, "__romdatastart") != 0 \
680 && !saw_subtract) \
681 _bfd_error_handler (_("%B(%A): unsafe PID relocation %s at 0x%08lx (against %s in %s)"), \
682 input_bfd, input_section, howto->name, \
683 input_section->output_section->vma + input_section->output_offset + rel->r_offset, \
684 name, sec->name); \
685 } \
686 while (0)
687
688 /* Opcode relocs are always big endian. Data relocs are bi-endian. */
689 switch (r_type)
690 {
691 case R_RX_NONE:
692 break;
693
694 case R_RX_RH_RELAX:
695 break;
696
697 case R_RX_RH_3_PCREL:
698 WARN_REDHAT ("RX_RH_3_PCREL");
699 RANGE (3, 10);
700 OP (0) &= 0xf8;
701 OP (0) |= relocation & 0x07;
702 break;
703
704 case R_RX_RH_8_NEG:
705 WARN_REDHAT ("RX_RH_8_NEG");
706 relocation = - relocation;
707 /* Fall through. */
708 case R_RX_DIR8S_PCREL:
709 UNSAFE_FOR_PID;
710 RANGE (-128, 127);
711 OP (0) = relocation;
712 break;
713
714 case R_RX_DIR8S:
715 UNSAFE_FOR_PID;
716 RANGE (-128, 255);
717 OP (0) = relocation;
718 break;
719
720 case R_RX_DIR8U:
721 UNSAFE_FOR_PID;
722 RANGE (0, 255);
723 OP (0) = relocation;
724 break;
725
726 case R_RX_RH_16_NEG:
727 WARN_REDHAT ("RX_RH_16_NEG");
728 relocation = - relocation;
729 /* Fall through. */
730 case R_RX_DIR16S_PCREL:
731 UNSAFE_FOR_PID;
732 RANGE (-32768, 32767);
733 #if RX_OPCODE_BIG_ENDIAN
734 #else
735 OP (0) = relocation;
736 OP (1) = relocation >> 8;
737 #endif
738 break;
739
740 case R_RX_RH_16_OP:
741 WARN_REDHAT ("RX_RH_16_OP");
742 UNSAFE_FOR_PID;
743 RANGE (-32768, 32767);
744 #if RX_OPCODE_BIG_ENDIAN
745 OP (1) = relocation;
746 OP (0) = relocation >> 8;
747 #else
748 OP (0) = relocation;
749 OP (1) = relocation >> 8;
750 #endif
751 break;
752
753 case R_RX_DIR16S:
754 UNSAFE_FOR_PID;
755 RANGE (-32768, 65535);
756 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
757 {
758 OP (1) = relocation;
759 OP (0) = relocation >> 8;
760 }
761 else
762 {
763 OP (0) = relocation;
764 OP (1) = relocation >> 8;
765 }
766 break;
767
768 case R_RX_DIR16U:
769 UNSAFE_FOR_PID;
770 RANGE (0, 65536);
771 #if RX_OPCODE_BIG_ENDIAN
772 OP (1) = relocation;
773 OP (0) = relocation >> 8;
774 #else
775 OP (0) = relocation;
776 OP (1) = relocation >> 8;
777 #endif
778 break;
779
780 case R_RX_DIR16:
781 UNSAFE_FOR_PID;
782 RANGE (-32768, 65536);
783 #if RX_OPCODE_BIG_ENDIAN
784 OP (1) = relocation;
785 OP (0) = relocation >> 8;
786 #else
787 OP (0) = relocation;
788 OP (1) = relocation >> 8;
789 #endif
790 break;
791
792 case R_RX_DIR16_REV:
793 UNSAFE_FOR_PID;
794 RANGE (-32768, 65536);
795 #if RX_OPCODE_BIG_ENDIAN
796 OP (0) = relocation;
797 OP (1) = relocation >> 8;
798 #else
799 OP (1) = relocation;
800 OP (0) = relocation >> 8;
801 #endif
802 break;
803
804 case R_RX_DIR3U_PCREL:
805 RANGE (3, 10);
806 OP (0) &= 0xf8;
807 OP (0) |= relocation & 0x07;
808 break;
809
810 case R_RX_RH_24_NEG:
811 UNSAFE_FOR_PID;
812 WARN_REDHAT ("RX_RH_24_NEG");
813 relocation = - relocation;
814 /* Fall through. */
815 case R_RX_DIR24S_PCREL:
816 RANGE (-0x800000, 0x7fffff);
817 #if RX_OPCODE_BIG_ENDIAN
818 OP (2) = relocation;
819 OP (1) = relocation >> 8;
820 OP (0) = relocation >> 16;
821 #else
822 OP (0) = relocation;
823 OP (1) = relocation >> 8;
824 OP (2) = relocation >> 16;
825 #endif
826 break;
827
828 case R_RX_RH_24_OP:
829 UNSAFE_FOR_PID;
830 WARN_REDHAT ("RX_RH_24_OP");
831 RANGE (-0x800000, 0x7fffff);
832 #if RX_OPCODE_BIG_ENDIAN
833 OP (2) = relocation;
834 OP (1) = relocation >> 8;
835 OP (0) = relocation >> 16;
836 #else
837 OP (0) = relocation;
838 OP (1) = relocation >> 8;
839 OP (2) = relocation >> 16;
840 #endif
841 break;
842
843 case R_RX_DIR24S:
844 UNSAFE_FOR_PID;
845 RANGE (-0x800000, 0x7fffff);
846 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
847 {
848 OP (2) = relocation;
849 OP (1) = relocation >> 8;
850 OP (0) = relocation >> 16;
851 }
852 else
853 {
854 OP (0) = relocation;
855 OP (1) = relocation >> 8;
856 OP (2) = relocation >> 16;
857 }
858 break;
859
860 case R_RX_RH_24_UNS:
861 UNSAFE_FOR_PID;
862 WARN_REDHAT ("RX_RH_24_UNS");
863 RANGE (0, 0xffffff);
864 #if RX_OPCODE_BIG_ENDIAN
865 OP (2) = relocation;
866 OP (1) = relocation >> 8;
867 OP (0) = relocation >> 16;
868 #else
869 OP (0) = relocation;
870 OP (1) = relocation >> 8;
871 OP (2) = relocation >> 16;
872 #endif
873 break;
874
875 case R_RX_RH_32_NEG:
876 UNSAFE_FOR_PID;
877 WARN_REDHAT ("RX_RH_32_NEG");
878 relocation = - relocation;
879 #if RX_OPCODE_BIG_ENDIAN
880 OP (3) = relocation;
881 OP (2) = relocation >> 8;
882 OP (1) = relocation >> 16;
883 OP (0) = relocation >> 24;
884 #else
885 OP (0) = relocation;
886 OP (1) = relocation >> 8;
887 OP (2) = relocation >> 16;
888 OP (3) = relocation >> 24;
889 #endif
890 break;
891
892 case R_RX_RH_32_OP:
893 UNSAFE_FOR_PID;
894 WARN_REDHAT ("RX_RH_32_OP");
895 #if RX_OPCODE_BIG_ENDIAN
896 OP (3) = relocation;
897 OP (2) = relocation >> 8;
898 OP (1) = relocation >> 16;
899 OP (0) = relocation >> 24;
900 #else
901 OP (0) = relocation;
902 OP (1) = relocation >> 8;
903 OP (2) = relocation >> 16;
904 OP (3) = relocation >> 24;
905 #endif
906 break;
907
908 case R_RX_DIR32:
909 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
910 {
911 OP (3) = relocation;
912 OP (2) = relocation >> 8;
913 OP (1) = relocation >> 16;
914 OP (0) = relocation >> 24;
915 }
916 else
917 {
918 OP (0) = relocation;
919 OP (1) = relocation >> 8;
920 OP (2) = relocation >> 16;
921 OP (3) = relocation >> 24;
922 }
923 break;
924
925 case R_RX_DIR32_REV:
926 if (BIGE (output_bfd))
927 {
928 OP (0) = relocation;
929 OP (1) = relocation >> 8;
930 OP (2) = relocation >> 16;
931 OP (3) = relocation >> 24;
932 }
933 else
934 {
935 OP (3) = relocation;
936 OP (2) = relocation >> 8;
937 OP (1) = relocation >> 16;
938 OP (0) = relocation >> 24;
939 }
940 break;
941
942 case R_RX_RH_DIFF:
943 {
944 bfd_vma val;
945 WARN_REDHAT ("RX_RH_DIFF");
946 val = bfd_get_32 (output_bfd, & OP (0));
947 val -= relocation;
948 bfd_put_32 (output_bfd, val, & OP (0));
949 }
950 break;
951
952 case R_RX_RH_GPRELB:
953 WARN_REDHAT ("RX_RH_GPRELB");
954 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
955 RANGE (0, 65535);
956 #if RX_OPCODE_BIG_ENDIAN
957 OP (1) = relocation;
958 OP (0) = relocation >> 8;
959 #else
960 OP (0) = relocation;
961 OP (1) = relocation >> 8;
962 #endif
963 break;
964
965 case R_RX_RH_GPRELW:
966 WARN_REDHAT ("RX_RH_GPRELW");
967 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
968 ALIGN (1);
969 relocation >>= 1;
970 RANGE (0, 65535);
971 #if RX_OPCODE_BIG_ENDIAN
972 OP (1) = relocation;
973 OP (0) = relocation >> 8;
974 #else
975 OP (0) = relocation;
976 OP (1) = relocation >> 8;
977 #endif
978 break;
979
980 case R_RX_RH_GPRELL:
981 WARN_REDHAT ("RX_RH_GPRELL");
982 relocation -= get_gp (info, input_bfd, input_section, rel->r_offset);
983 ALIGN (3);
984 relocation >>= 2;
985 RANGE (0, 65535);
986 #if RX_OPCODE_BIG_ENDIAN
987 OP (1) = relocation;
988 OP (0) = relocation >> 8;
989 #else
990 OP (0) = relocation;
991 OP (1) = relocation >> 8;
992 #endif
993 break;
994
995 /* Internal relocations just for relaxation: */
996 case R_RX_RH_ABS5p5B:
997 RX_STACK_POP (relocation);
998 RANGE (0, 31);
999 OP (0) &= 0xf8;
1000 OP (0) |= relocation >> 2;
1001 OP (1) &= 0x77;
1002 OP (1) |= (relocation << 6) & 0x80;
1003 OP (1) |= (relocation << 3) & 0x08;
1004 break;
1005
1006 case R_RX_RH_ABS5p5W:
1007 RX_STACK_POP (relocation);
1008 RANGE (0, 62);
1009 ALIGN (1);
1010 relocation >>= 1;
1011 OP (0) &= 0xf8;
1012 OP (0) |= relocation >> 2;
1013 OP (1) &= 0x77;
1014 OP (1) |= (relocation << 6) & 0x80;
1015 OP (1) |= (relocation << 3) & 0x08;
1016 break;
1017
1018 case R_RX_RH_ABS5p5L:
1019 RX_STACK_POP (relocation);
1020 RANGE (0, 124);
1021 ALIGN (3);
1022 relocation >>= 2;
1023 OP (0) &= 0xf8;
1024 OP (0) |= relocation >> 2;
1025 OP (1) &= 0x77;
1026 OP (1) |= (relocation << 6) & 0x80;
1027 OP (1) |= (relocation << 3) & 0x08;
1028 break;
1029
1030 case R_RX_RH_ABS5p8B:
1031 RX_STACK_POP (relocation);
1032 RANGE (0, 31);
1033 OP (0) &= 0x70;
1034 OP (0) |= (relocation << 3) & 0x80;
1035 OP (0) |= relocation & 0x0f;
1036 break;
1037
1038 case R_RX_RH_ABS5p8W:
1039 RX_STACK_POP (relocation);
1040 RANGE (0, 62);
1041 ALIGN (1);
1042 relocation >>= 1;
1043 OP (0) &= 0x70;
1044 OP (0) |= (relocation << 3) & 0x80;
1045 OP (0) |= relocation & 0x0f;
1046 break;
1047
1048 case R_RX_RH_ABS5p8L:
1049 RX_STACK_POP (relocation);
1050 RANGE (0, 124);
1051 ALIGN (3);
1052 relocation >>= 2;
1053 OP (0) &= 0x70;
1054 OP (0) |= (relocation << 3) & 0x80;
1055 OP (0) |= relocation & 0x0f;
1056 break;
1057
1058 case R_RX_RH_UIMM4p8:
1059 RANGE (0, 15);
1060 OP (0) &= 0x0f;
1061 OP (0) |= relocation << 4;
1062 break;
1063
1064 case R_RX_RH_UNEG4p8:
1065 RANGE (-15, 0);
1066 OP (0) &= 0x0f;
1067 OP (0) |= (-relocation) << 4;
1068 break;
1069
1070 /* Complex reloc handling: */
1071
1072 case R_RX_ABS32:
1073 UNSAFE_FOR_PID;
1074 RX_STACK_POP (relocation);
1075 #if RX_OPCODE_BIG_ENDIAN
1076 OP (3) = relocation;
1077 OP (2) = relocation >> 8;
1078 OP (1) = relocation >> 16;
1079 OP (0) = relocation >> 24;
1080 #else
1081 OP (0) = relocation;
1082 OP (1) = relocation >> 8;
1083 OP (2) = relocation >> 16;
1084 OP (3) = relocation >> 24;
1085 #endif
1086 break;
1087
1088 case R_RX_ABS32_REV:
1089 UNSAFE_FOR_PID;
1090 RX_STACK_POP (relocation);
1091 #if RX_OPCODE_BIG_ENDIAN
1092 OP (0) = relocation;
1093 OP (1) = relocation >> 8;
1094 OP (2) = relocation >> 16;
1095 OP (3) = relocation >> 24;
1096 #else
1097 OP (3) = relocation;
1098 OP (2) = relocation >> 8;
1099 OP (1) = relocation >> 16;
1100 OP (0) = relocation >> 24;
1101 #endif
1102 break;
1103
1104 case R_RX_ABS24S_PCREL:
1105 case R_RX_ABS24S:
1106 UNSAFE_FOR_PID;
1107 RX_STACK_POP (relocation);
1108 RANGE (-0x800000, 0x7fffff);
1109 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1110 {
1111 OP (2) = relocation;
1112 OP (1) = relocation >> 8;
1113 OP (0) = relocation >> 16;
1114 }
1115 else
1116 {
1117 OP (0) = relocation;
1118 OP (1) = relocation >> 8;
1119 OP (2) = relocation >> 16;
1120 }
1121 break;
1122
1123 case R_RX_ABS16:
1124 UNSAFE_FOR_PID;
1125 RX_STACK_POP (relocation);
1126 RANGE (-32768, 65535);
1127 #if RX_OPCODE_BIG_ENDIAN
1128 OP (1) = relocation;
1129 OP (0) = relocation >> 8;
1130 #else
1131 OP (0) = relocation;
1132 OP (1) = relocation >> 8;
1133 #endif
1134 break;
1135
1136 case R_RX_ABS16_REV:
1137 UNSAFE_FOR_PID;
1138 RX_STACK_POP (relocation);
1139 RANGE (-32768, 65535);
1140 #if RX_OPCODE_BIG_ENDIAN
1141 OP (0) = relocation;
1142 OP (1) = relocation >> 8;
1143 #else
1144 OP (1) = relocation;
1145 OP (0) = relocation >> 8;
1146 #endif
1147 break;
1148
1149 case R_RX_ABS16S_PCREL:
1150 case R_RX_ABS16S:
1151 RX_STACK_POP (relocation);
1152 RANGE (-32768, 32767);
1153 if (BIGE (output_bfd) && !(input_section->flags & SEC_CODE))
1154 {
1155 OP (1) = relocation;
1156 OP (0) = relocation >> 8;
1157 }
1158 else
1159 {
1160 OP (0) = relocation;
1161 OP (1) = relocation >> 8;
1162 }
1163 break;
1164
1165 case R_RX_ABS16U:
1166 UNSAFE_FOR_PID;
1167 RX_STACK_POP (relocation);
1168 RANGE (0, 65536);
1169 #if RX_OPCODE_BIG_ENDIAN
1170 OP (1) = relocation;
1171 OP (0) = relocation >> 8;
1172 #else
1173 OP (0) = relocation;
1174 OP (1) = relocation >> 8;
1175 #endif
1176 break;
1177
1178 case R_RX_ABS16UL:
1179 UNSAFE_FOR_PID;
1180 RX_STACK_POP (relocation);
1181 relocation >>= 2;
1182 RANGE (0, 65536);
1183 #if RX_OPCODE_BIG_ENDIAN
1184 OP (1) = relocation;
1185 OP (0) = relocation >> 8;
1186 #else
1187 OP (0) = relocation;
1188 OP (1) = relocation >> 8;
1189 #endif
1190 break;
1191
1192 case R_RX_ABS16UW:
1193 UNSAFE_FOR_PID;
1194 RX_STACK_POP (relocation);
1195 relocation >>= 1;
1196 RANGE (0, 65536);
1197 #if RX_OPCODE_BIG_ENDIAN
1198 OP (1) = relocation;
1199 OP (0) = relocation >> 8;
1200 #else
1201 OP (0) = relocation;
1202 OP (1) = relocation >> 8;
1203 #endif
1204 break;
1205
1206 case R_RX_ABS8:
1207 UNSAFE_FOR_PID;
1208 RX_STACK_POP (relocation);
1209 RANGE (-128, 255);
1210 OP (0) = relocation;
1211 break;
1212
1213 case R_RX_ABS8U:
1214 UNSAFE_FOR_PID;
1215 RX_STACK_POP (relocation);
1216 RANGE (0, 255);
1217 OP (0) = relocation;
1218 break;
1219
1220 case R_RX_ABS8UL:
1221 UNSAFE_FOR_PID;
1222 RX_STACK_POP (relocation);
1223 relocation >>= 2;
1224 RANGE (0, 255);
1225 OP (0) = relocation;
1226 break;
1227
1228 case R_RX_ABS8UW:
1229 UNSAFE_FOR_PID;
1230 RX_STACK_POP (relocation);
1231 relocation >>= 1;
1232 RANGE (0, 255);
1233 OP (0) = relocation;
1234 break;
1235
1236 case R_RX_ABS8S:
1237 UNSAFE_FOR_PID;
1238 /* Fall through. */
1239 case R_RX_ABS8S_PCREL:
1240 RX_STACK_POP (relocation);
1241 RANGE (-128, 127);
1242 OP (0) = relocation;
1243 break;
1244
1245 case R_RX_SYM:
1246 if (r_symndx < symtab_hdr->sh_info)
1247 RX_STACK_PUSH (sec->output_section->vma
1248 + sec->output_offset
1249 + sym->st_value
1250 + rel->r_addend);
1251 else
1252 {
1253 if (h != NULL
1254 && (h->root.type == bfd_link_hash_defined
1255 || h->root.type == bfd_link_hash_defweak))
1256 RX_STACK_PUSH (h->root.u.def.value
1257 + sec->output_section->vma
1258 + sec->output_offset
1259 + rel->r_addend);
1260 else
1261 _bfd_error_handler (_("Warning: RX_SYM reloc with an unknown symbol"));
1262 }
1263 break;
1264
1265 case R_RX_OPneg:
1266 {
1267 int32_t tmp;
1268
1269 saw_subtract = TRUE;
1270 RX_STACK_POP (tmp);
1271 tmp = - tmp;
1272 RX_STACK_PUSH (tmp);
1273 }
1274 break;
1275
1276 case R_RX_OPadd:
1277 {
1278 int32_t tmp1, tmp2;
1279
1280 RX_STACK_POP (tmp1);
1281 RX_STACK_POP (tmp2);
1282 tmp1 += tmp2;
1283 RX_STACK_PUSH (tmp1);
1284 }
1285 break;
1286
1287 case R_RX_OPsub:
1288 {
1289 int32_t tmp1, tmp2;
1290
1291 saw_subtract = TRUE;
1292 RX_STACK_POP (tmp1);
1293 RX_STACK_POP (tmp2);
1294 tmp2 -= tmp1;
1295 RX_STACK_PUSH (tmp2);
1296 }
1297 break;
1298
1299 case R_RX_OPmul:
1300 {
1301 int32_t tmp1, tmp2;
1302
1303 RX_STACK_POP (tmp1);
1304 RX_STACK_POP (tmp2);
1305 tmp1 *= tmp2;
1306 RX_STACK_PUSH (tmp1);
1307 }
1308 break;
1309
1310 case R_RX_OPdiv:
1311 {
1312 int32_t tmp1, tmp2;
1313
1314 RX_STACK_POP (tmp1);
1315 RX_STACK_POP (tmp2);
1316 tmp1 /= tmp2;
1317 RX_STACK_PUSH (tmp1);
1318 }
1319 break;
1320
1321 case R_RX_OPshla:
1322 {
1323 int32_t tmp1, tmp2;
1324
1325 RX_STACK_POP (tmp1);
1326 RX_STACK_POP (tmp2);
1327 tmp1 <<= tmp2;
1328 RX_STACK_PUSH (tmp1);
1329 }
1330 break;
1331
1332 case R_RX_OPshra:
1333 {
1334 int32_t tmp1, tmp2;
1335
1336 RX_STACK_POP (tmp1);
1337 RX_STACK_POP (tmp2);
1338 tmp1 >>= tmp2;
1339 RX_STACK_PUSH (tmp1);
1340 }
1341 break;
1342
1343 case R_RX_OPsctsize:
1344 RX_STACK_PUSH (input_section->size);
1345 break;
1346
1347 case R_RX_OPscttop:
1348 RX_STACK_PUSH (input_section->output_section->vma);
1349 break;
1350
1351 case R_RX_OPand:
1352 {
1353 int32_t tmp1, tmp2;
1354
1355 RX_STACK_POP (tmp1);
1356 RX_STACK_POP (tmp2);
1357 tmp1 &= tmp2;
1358 RX_STACK_PUSH (tmp1);
1359 }
1360 break;
1361
1362 case R_RX_OPor:
1363 {
1364 int32_t tmp1, tmp2;
1365
1366 RX_STACK_POP (tmp1);
1367 RX_STACK_POP (tmp2);
1368 tmp1 |= tmp2;
1369 RX_STACK_PUSH (tmp1);
1370 }
1371 break;
1372
1373 case R_RX_OPxor:
1374 {
1375 int32_t tmp1, tmp2;
1376
1377 RX_STACK_POP (tmp1);
1378 RX_STACK_POP (tmp2);
1379 tmp1 ^= tmp2;
1380 RX_STACK_PUSH (tmp1);
1381 }
1382 break;
1383
1384 case R_RX_OPnot:
1385 {
1386 int32_t tmp;
1387
1388 RX_STACK_POP (tmp);
1389 tmp = ~ tmp;
1390 RX_STACK_PUSH (tmp);
1391 }
1392 break;
1393
1394 case R_RX_OPmod:
1395 {
1396 int32_t tmp1, tmp2;
1397
1398 RX_STACK_POP (tmp1);
1399 RX_STACK_POP (tmp2);
1400 tmp1 %= tmp2;
1401 RX_STACK_PUSH (tmp1);
1402 }
1403 break;
1404
1405 case R_RX_OPromtop:
1406 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1407 break;
1408
1409 case R_RX_OPramtop:
1410 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1411 break;
1412
1413 default:
1414 r = bfd_reloc_notsupported;
1415 break;
1416 }
1417
1418 if (r != bfd_reloc_ok)
1419 {
1420 const char * msg = NULL;
1421
1422 switch (r)
1423 {
1424 case bfd_reloc_overflow:
1425 /* Catch the case of a missing function declaration
1426 and emit a more helpful error message. */
1427 if (r_type == R_RX_DIR24S_PCREL)
1428 msg = _("%B(%A): error: call to undefined function '%s'");
1429 else
1430 (*info->callbacks->reloc_overflow)
1431 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
1432 input_bfd, input_section, rel->r_offset);
1433 break;
1434
1435 case bfd_reloc_undefined:
1436 (*info->callbacks->undefined_symbol)
1437 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
1438 break;
1439
1440 case bfd_reloc_other:
1441 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1442 break;
1443
1444 case bfd_reloc_outofrange:
1445 msg = _("%B(%A): internal error: out of range error");
1446 break;
1447
1448 case bfd_reloc_notsupported:
1449 msg = _("%B(%A): internal error: unsupported relocation error");
1450 break;
1451
1452 case bfd_reloc_dangerous:
1453 msg = _("%B(%A): internal error: dangerous relocation");
1454 break;
1455
1456 default:
1457 msg = _("%B(%A): internal error: unknown error");
1458 break;
1459 }
1460
1461 if (msg)
1462 _bfd_error_handler (msg, input_bfd, input_section, name);
1463 }
1464 }
1465
1466 return TRUE;
1467 }
1468 \f
1469 /* Relaxation Support. */
1470
1471 /* Progression of relocations from largest operand size to smallest
1472 operand size. */
1473
1474 static int
1475 next_smaller_reloc (int r)
1476 {
1477 switch (r)
1478 {
1479 case R_RX_DIR32: return R_RX_DIR24S;
1480 case R_RX_DIR24S: return R_RX_DIR16S;
1481 case R_RX_DIR16S: return R_RX_DIR8S;
1482 case R_RX_DIR8S: return R_RX_NONE;
1483
1484 case R_RX_DIR16: return R_RX_DIR8;
1485 case R_RX_DIR8: return R_RX_NONE;
1486
1487 case R_RX_DIR16U: return R_RX_DIR8U;
1488 case R_RX_DIR8U: return R_RX_NONE;
1489
1490 case R_RX_DIR24S_PCREL: return R_RX_DIR16S_PCREL;
1491 case R_RX_DIR16S_PCREL: return R_RX_DIR8S_PCREL;
1492 case R_RX_DIR8S_PCREL: return R_RX_DIR3U_PCREL;
1493
1494 case R_RX_DIR16UL: return R_RX_DIR8UL;
1495 case R_RX_DIR8UL: return R_RX_NONE;
1496 case R_RX_DIR16UW: return R_RX_DIR8UW;
1497 case R_RX_DIR8UW: return R_RX_NONE;
1498
1499 case R_RX_RH_32_OP: return R_RX_RH_24_OP;
1500 case R_RX_RH_24_OP: return R_RX_RH_16_OP;
1501 case R_RX_RH_16_OP: return R_RX_DIR8;
1502
1503 case R_RX_ABS32: return R_RX_ABS24S;
1504 case R_RX_ABS24S: return R_RX_ABS16S;
1505 case R_RX_ABS16: return R_RX_ABS8;
1506 case R_RX_ABS16U: return R_RX_ABS8U;
1507 case R_RX_ABS16S: return R_RX_ABS8S;
1508 case R_RX_ABS8: return R_RX_NONE;
1509 case R_RX_ABS8U: return R_RX_NONE;
1510 case R_RX_ABS8S: return R_RX_NONE;
1511 case R_RX_ABS24S_PCREL: return R_RX_ABS16S_PCREL;
1512 case R_RX_ABS16S_PCREL: return R_RX_ABS8S_PCREL;
1513 case R_RX_ABS8S_PCREL: return R_RX_NONE;
1514 case R_RX_ABS16UL: return R_RX_ABS8UL;
1515 case R_RX_ABS16UW: return R_RX_ABS8UW;
1516 case R_RX_ABS8UL: return R_RX_NONE;
1517 case R_RX_ABS8UW: return R_RX_NONE;
1518 }
1519 return r;
1520 };
1521
1522 /* Delete some bytes from a section while relaxing. */
1523
1524 static bfd_boolean
1525 elf32_rx_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, int count,
1526 Elf_Internal_Rela *alignment_rel, int force_snip,
1527 Elf_Internal_Rela *irelstart)
1528 {
1529 Elf_Internal_Shdr * symtab_hdr;
1530 unsigned int sec_shndx;
1531 bfd_byte * contents;
1532 Elf_Internal_Rela * irel;
1533 Elf_Internal_Rela * irelend;
1534 Elf_Internal_Sym * isym;
1535 Elf_Internal_Sym * isymend;
1536 bfd_vma toaddr;
1537 unsigned int symcount;
1538 struct elf_link_hash_entry ** sym_hashes;
1539 struct elf_link_hash_entry ** end_hashes;
1540
1541 if (!alignment_rel)
1542 force_snip = 1;
1543
1544 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1545
1546 contents = elf_section_data (sec)->this_hdr.contents;
1547
1548 /* The deletion must stop at the next alignment boundary, if
1549 ALIGNMENT_REL is non-NULL. */
1550 toaddr = sec->size;
1551 if (alignment_rel)
1552 toaddr = alignment_rel->r_offset;
1553
1554 BFD_ASSERT (toaddr > addr);
1555
1556 /* Actually delete the bytes. */
1557 memmove (contents + addr, contents + addr + count,
1558 (size_t) (toaddr - addr - count));
1559
1560 /* If we don't have an alignment marker to worry about, we can just
1561 shrink the section. Otherwise, we have to fill in the newly
1562 created gap with NOP insns (0x03). */
1563 if (force_snip)
1564 sec->size -= count;
1565 else
1566 memset (contents + toaddr - count, 0x03, count);
1567
1568 irel = irelstart;
1569 BFD_ASSERT (irel != NULL || sec->reloc_count == 0);
1570 irelend = irel + sec->reloc_count;
1571
1572 /* Adjust all the relocs. */
1573 for (; irel < irelend; irel++)
1574 {
1575 /* Get the new reloc address. */
1576 if (irel->r_offset > addr
1577 && (irel->r_offset < toaddr
1578 || (force_snip && irel->r_offset == toaddr)))
1579 irel->r_offset -= count;
1580
1581 /* If we see an ALIGN marker at the end of the gap, we move it
1582 to the beginning of the gap, since marking these gaps is what
1583 they're for. */
1584 if (irel->r_offset == toaddr
1585 && ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
1586 && irel->r_addend & RX_RELAXA_ALIGN)
1587 irel->r_offset -= count;
1588 }
1589
1590 /* Adjust the local symbols defined in this section. */
1591 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1592 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
1593 isymend = isym + symtab_hdr->sh_info;
1594
1595 for (; isym < isymend; isym++)
1596 {
1597 /* If the symbol is in the range of memory we just moved, we
1598 have to adjust its value. */
1599 if (isym->st_shndx == sec_shndx
1600 && isym->st_value > addr
1601 && isym->st_value < toaddr)
1602 isym->st_value -= count;
1603
1604 /* If the symbol *spans* the bytes we just deleted (i.e. it's
1605 *end* is in the moved bytes but it's *start* isn't), then we
1606 must adjust its size. */
1607 if (isym->st_shndx == sec_shndx
1608 && isym->st_value < addr
1609 && isym->st_value + isym->st_size > addr
1610 && isym->st_value + isym->st_size < toaddr)
1611 isym->st_size -= count;
1612 }
1613
1614 /* Now adjust the global symbols defined in this section. */
1615 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
1616 - symtab_hdr->sh_info);
1617 sym_hashes = elf_sym_hashes (abfd);
1618 end_hashes = sym_hashes + symcount;
1619
1620 for (; sym_hashes < end_hashes; sym_hashes++)
1621 {
1622 struct elf_link_hash_entry *sym_hash = *sym_hashes;
1623
1624 if ((sym_hash->root.type == bfd_link_hash_defined
1625 || sym_hash->root.type == bfd_link_hash_defweak)
1626 && sym_hash->root.u.def.section == sec)
1627 {
1628 /* As above, adjust the value if needed. */
1629 if (sym_hash->root.u.def.value > addr
1630 && sym_hash->root.u.def.value < toaddr)
1631 sym_hash->root.u.def.value -= count;
1632
1633 /* As above, adjust the size if needed. */
1634 if (sym_hash->root.u.def.value < addr
1635 && sym_hash->root.u.def.value + sym_hash->size > addr
1636 && sym_hash->root.u.def.value + sym_hash->size < toaddr)
1637 sym_hash->size -= count;
1638 }
1639 }
1640
1641 return TRUE;
1642 }
1643
1644 /* Used to sort relocs by address. If relocs have the same address,
1645 we maintain their relative order, except that R_RX_RH_RELAX
1646 alignment relocs must be the first reloc for any given address. */
1647
1648 static void
1649 reloc_bubblesort (Elf_Internal_Rela * r, int count)
1650 {
1651 int i;
1652 bfd_boolean again;
1653 bfd_boolean swappit;
1654
1655 /* This is almost a classic bubblesort. It's the slowest sort, but
1656 we're taking advantage of the fact that the relocations are
1657 mostly in order already (the assembler emits them that way) and
1658 we need relocs with the same address to remain in the same
1659 relative order. */
1660 again = TRUE;
1661 while (again)
1662 {
1663 again = FALSE;
1664 for (i = 0; i < count - 1; i ++)
1665 {
1666 if (r[i].r_offset > r[i + 1].r_offset)
1667 swappit = TRUE;
1668 else if (r[i].r_offset < r[i + 1].r_offset)
1669 swappit = FALSE;
1670 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1671 && (r[i + 1].r_addend & RX_RELAXA_ALIGN))
1672 swappit = TRUE;
1673 else if (ELF32_R_TYPE (r[i + 1].r_info) == R_RX_RH_RELAX
1674 && (r[i + 1].r_addend & RX_RELAXA_ELIGN)
1675 && !(ELF32_R_TYPE (r[i].r_info) == R_RX_RH_RELAX
1676 && (r[i].r_addend & RX_RELAXA_ALIGN)))
1677 swappit = TRUE;
1678 else
1679 swappit = FALSE;
1680
1681 if (swappit)
1682 {
1683 Elf_Internal_Rela tmp;
1684
1685 tmp = r[i];
1686 r[i] = r[i + 1];
1687 r[i + 1] = tmp;
1688 /* If we do move a reloc back, re-scan to see if it
1689 needs to be moved even further back. This avoids
1690 most of the O(n^2) behavior for our cases. */
1691 if (i > 0)
1692 i -= 2;
1693 again = TRUE;
1694 }
1695 }
1696 }
1697 }
1698
1699
1700 #define OFFSET_FOR_RELOC(rel, lrel, scale) \
1701 rx_offset_for_reloc (abfd, rel + 1, symtab_hdr, shndx_buf, intsyms, \
1702 lrel, abfd, sec, link_info, scale)
1703
1704 static bfd_vma
1705 rx_offset_for_reloc (bfd * abfd,
1706 Elf_Internal_Rela * rel,
1707 Elf_Internal_Shdr * symtab_hdr,
1708 Elf_External_Sym_Shndx * shndx_buf ATTRIBUTE_UNUSED,
1709 Elf_Internal_Sym * intsyms,
1710 Elf_Internal_Rela ** lrel,
1711 bfd * input_bfd,
1712 asection * input_section,
1713 struct bfd_link_info * info,
1714 int * scale)
1715 {
1716 bfd_vma symval;
1717 bfd_reloc_status_type r;
1718
1719 *scale = 1;
1720
1721 /* REL is the first of 1..N relocations. We compute the symbol
1722 value for each relocation, then combine them if needed. LREL
1723 gets a pointer to the last relocation used. */
1724 while (1)
1725 {
1726 int32_t tmp1, tmp2;
1727
1728 /* Get the value of the symbol referred to by the reloc. */
1729 if (ELF32_R_SYM (rel->r_info) < symtab_hdr->sh_info)
1730 {
1731 /* A local symbol. */
1732 Elf_Internal_Sym *isym;
1733 asection *ssec;
1734
1735 isym = intsyms + ELF32_R_SYM (rel->r_info);
1736
1737 if (isym->st_shndx == SHN_UNDEF)
1738 ssec = bfd_und_section_ptr;
1739 else if (isym->st_shndx == SHN_ABS)
1740 ssec = bfd_abs_section_ptr;
1741 else if (isym->st_shndx == SHN_COMMON)
1742 ssec = bfd_com_section_ptr;
1743 else
1744 ssec = bfd_section_from_elf_index (abfd,
1745 isym->st_shndx);
1746
1747 /* Initial symbol value. */
1748 symval = isym->st_value;
1749
1750 /* GAS may have made this symbol relative to a section, in
1751 which case, we have to add the addend to find the
1752 symbol. */
1753 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
1754 symval += rel->r_addend;
1755
1756 if (ssec)
1757 {
1758 if ((ssec->flags & SEC_MERGE)
1759 && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
1760 symval = _bfd_merged_section_offset (abfd, & ssec,
1761 elf_section_data (ssec)->sec_info,
1762 symval);
1763 }
1764
1765 /* Now make the offset relative to where the linker is putting it. */
1766 if (ssec)
1767 symval +=
1768 ssec->output_section->vma + ssec->output_offset;
1769
1770 symval += rel->r_addend;
1771 }
1772 else
1773 {
1774 unsigned long indx;
1775 struct elf_link_hash_entry * h;
1776
1777 /* An external symbol. */
1778 indx = ELF32_R_SYM (rel->r_info) - symtab_hdr->sh_info;
1779 h = elf_sym_hashes (abfd)[indx];
1780 BFD_ASSERT (h != NULL);
1781
1782 if (h->root.type != bfd_link_hash_defined
1783 && h->root.type != bfd_link_hash_defweak)
1784 {
1785 /* This appears to be a reference to an undefined
1786 symbol. Just ignore it--it will be caught by the
1787 regular reloc processing. */
1788 if (lrel)
1789 *lrel = rel;
1790 return 0;
1791 }
1792
1793 symval = (h->root.u.def.value
1794 + h->root.u.def.section->output_section->vma
1795 + h->root.u.def.section->output_offset);
1796
1797 symval += rel->r_addend;
1798 }
1799
1800 switch (ELF32_R_TYPE (rel->r_info))
1801 {
1802 case R_RX_SYM:
1803 RX_STACK_PUSH (symval);
1804 break;
1805
1806 case R_RX_OPneg:
1807 RX_STACK_POP (tmp1);
1808 tmp1 = - tmp1;
1809 RX_STACK_PUSH (tmp1);
1810 break;
1811
1812 case R_RX_OPadd:
1813 RX_STACK_POP (tmp1);
1814 RX_STACK_POP (tmp2);
1815 tmp1 += tmp2;
1816 RX_STACK_PUSH (tmp1);
1817 break;
1818
1819 case R_RX_OPsub:
1820 RX_STACK_POP (tmp1);
1821 RX_STACK_POP (tmp2);
1822 tmp2 -= tmp1;
1823 RX_STACK_PUSH (tmp2);
1824 break;
1825
1826 case R_RX_OPmul:
1827 RX_STACK_POP (tmp1);
1828 RX_STACK_POP (tmp2);
1829 tmp1 *= tmp2;
1830 RX_STACK_PUSH (tmp1);
1831 break;
1832
1833 case R_RX_OPdiv:
1834 RX_STACK_POP (tmp1);
1835 RX_STACK_POP (tmp2);
1836 tmp1 /= tmp2;
1837 RX_STACK_PUSH (tmp1);
1838 break;
1839
1840 case R_RX_OPshla:
1841 RX_STACK_POP (tmp1);
1842 RX_STACK_POP (tmp2);
1843 tmp1 <<= tmp2;
1844 RX_STACK_PUSH (tmp1);
1845 break;
1846
1847 case R_RX_OPshra:
1848 RX_STACK_POP (tmp1);
1849 RX_STACK_POP (tmp2);
1850 tmp1 >>= tmp2;
1851 RX_STACK_PUSH (tmp1);
1852 break;
1853
1854 case R_RX_OPsctsize:
1855 RX_STACK_PUSH (input_section->size);
1856 break;
1857
1858 case R_RX_OPscttop:
1859 RX_STACK_PUSH (input_section->output_section->vma);
1860 break;
1861
1862 case R_RX_OPand:
1863 RX_STACK_POP (tmp1);
1864 RX_STACK_POP (tmp2);
1865 tmp1 &= tmp2;
1866 RX_STACK_PUSH (tmp1);
1867 break;
1868
1869 case R_RX_OPor:
1870 RX_STACK_POP (tmp1);
1871 RX_STACK_POP (tmp2);
1872 tmp1 |= tmp2;
1873 RX_STACK_PUSH (tmp1);
1874 break;
1875
1876 case R_RX_OPxor:
1877 RX_STACK_POP (tmp1);
1878 RX_STACK_POP (tmp2);
1879 tmp1 ^= tmp2;
1880 RX_STACK_PUSH (tmp1);
1881 break;
1882
1883 case R_RX_OPnot:
1884 RX_STACK_POP (tmp1);
1885 tmp1 = ~ tmp1;
1886 RX_STACK_PUSH (tmp1);
1887 break;
1888
1889 case R_RX_OPmod:
1890 RX_STACK_POP (tmp1);
1891 RX_STACK_POP (tmp2);
1892 tmp1 %= tmp2;
1893 RX_STACK_PUSH (tmp1);
1894 break;
1895
1896 case R_RX_OPromtop:
1897 RX_STACK_PUSH (get_romstart (info, input_bfd, input_section, rel->r_offset));
1898 break;
1899
1900 case R_RX_OPramtop:
1901 RX_STACK_PUSH (get_ramstart (info, input_bfd, input_section, rel->r_offset));
1902 break;
1903
1904 case R_RX_DIR16UL:
1905 case R_RX_DIR8UL:
1906 case R_RX_ABS16UL:
1907 case R_RX_ABS8UL:
1908 if (rx_stack_top)
1909 RX_STACK_POP (symval);
1910 if (lrel)
1911 *lrel = rel;
1912 *scale = 4;
1913 return symval;
1914
1915 case R_RX_DIR16UW:
1916 case R_RX_DIR8UW:
1917 case R_RX_ABS16UW:
1918 case R_RX_ABS8UW:
1919 if (rx_stack_top)
1920 RX_STACK_POP (symval);
1921 if (lrel)
1922 *lrel = rel;
1923 *scale = 2;
1924 return symval;
1925
1926 default:
1927 if (rx_stack_top)
1928 RX_STACK_POP (symval);
1929 if (lrel)
1930 *lrel = rel;
1931 return symval;
1932 }
1933
1934 rel ++;
1935 }
1936 /* FIXME. */
1937 (void) r;
1938 }
1939
1940 static void
1941 move_reloc (Elf_Internal_Rela * irel, Elf_Internal_Rela * srel, int delta)
1942 {
1943 bfd_vma old_offset = srel->r_offset;
1944
1945 irel ++;
1946 while (irel <= srel)
1947 {
1948 if (irel->r_offset == old_offset)
1949 irel->r_offset += delta;
1950 irel ++;
1951 }
1952 }
1953
1954 /* Relax one section. */
1955
1956 static bfd_boolean
1957 elf32_rx_relax_section (bfd * abfd,
1958 asection * sec,
1959 struct bfd_link_info * link_info,
1960 bfd_boolean * again,
1961 bfd_boolean allow_pcrel3)
1962 {
1963 Elf_Internal_Shdr * symtab_hdr;
1964 Elf_Internal_Shdr * shndx_hdr;
1965 Elf_Internal_Rela * internal_relocs;
1966 Elf_Internal_Rela * irel;
1967 Elf_Internal_Rela * srel;
1968 Elf_Internal_Rela * irelend;
1969 Elf_Internal_Rela * next_alignment;
1970 Elf_Internal_Rela * prev_alignment;
1971 bfd_byte * contents = NULL;
1972 bfd_byte * free_contents = NULL;
1973 Elf_Internal_Sym * intsyms = NULL;
1974 Elf_Internal_Sym * free_intsyms = NULL;
1975 Elf_External_Sym_Shndx * shndx_buf = NULL;
1976 bfd_vma pc;
1977 bfd_vma sec_start;
1978 bfd_vma symval = 0;
1979 int pcrel = 0;
1980 int code = 0;
1981 int section_alignment_glue;
1982 /* how much to scale the relocation by - 1, 2, or 4. */
1983 int scale;
1984
1985 /* Assume nothing changes. */
1986 *again = FALSE;
1987
1988 /* We don't have to do anything for a relocatable link, if
1989 this section does not have relocs, or if this is not a
1990 code section. */
1991 if (bfd_link_relocatable (link_info)
1992 || (sec->flags & SEC_RELOC) == 0
1993 || sec->reloc_count == 0
1994 || (sec->flags & SEC_CODE) == 0)
1995 return TRUE;
1996
1997 symtab_hdr = & elf_symtab_hdr (abfd);
1998 if (elf_symtab_shndx_list (abfd))
1999 shndx_hdr = & elf_symtab_shndx_list (abfd)->hdr;
2000 else
2001 shndx_hdr = NULL;
2002
2003 sec_start = sec->output_section->vma + sec->output_offset;
2004
2005 /* Get the section contents. */
2006 if (elf_section_data (sec)->this_hdr.contents != NULL)
2007 contents = elf_section_data (sec)->this_hdr.contents;
2008 /* Go get them off disk. */
2009 else
2010 {
2011 if (! bfd_malloc_and_get_section (abfd, sec, &contents))
2012 goto error_return;
2013 elf_section_data (sec)->this_hdr.contents = contents;
2014 }
2015
2016 /* Read this BFD's symbols. */
2017 /* Get cached copy if it exists. */
2018 if (symtab_hdr->contents != NULL)
2019 intsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
2020 else
2021 {
2022 intsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr, symtab_hdr->sh_info, 0, NULL, NULL, NULL);
2023 symtab_hdr->contents = (bfd_byte *) intsyms;
2024 }
2025
2026 if (shndx_hdr && shndx_hdr->sh_size != 0)
2027 {
2028 bfd_size_type amt;
2029
2030 amt = symtab_hdr->sh_info;
2031 amt *= sizeof (Elf_External_Sym_Shndx);
2032 shndx_buf = (Elf_External_Sym_Shndx *) bfd_malloc (amt);
2033 if (shndx_buf == NULL)
2034 goto error_return;
2035 if (bfd_seek (abfd, shndx_hdr->sh_offset, SEEK_SET) != 0
2036 || bfd_bread (shndx_buf, amt, abfd) != amt)
2037 goto error_return;
2038 shndx_hdr->contents = (bfd_byte *) shndx_buf;
2039 }
2040
2041 /* Get a copy of the native relocations. */
2042 /* Note - we ignore the setting of link_info->keep_memory when reading
2043 in these relocs. We have to maintain a permanent copy of the relocs
2044 because we are going to walk over them multiple times, adjusting them
2045 as bytes are deleted from the section, and with this relaxation
2046 function itself being called multiple times on the same section... */
2047 internal_relocs = _bfd_elf_link_read_relocs
2048 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, TRUE);
2049 if (internal_relocs == NULL)
2050 goto error_return;
2051
2052 /* The RL_ relocs must be just before the operand relocs they go
2053 with, so we must sort them to guarantee this. We use bubblesort
2054 instead of qsort so we can guarantee that relocs with the same
2055 address remain in the same relative order. */
2056 reloc_bubblesort (internal_relocs, sec->reloc_count);
2057
2058 /* Walk through them looking for relaxing opportunities. */
2059 irelend = internal_relocs + sec->reloc_count;
2060
2061 /* This will either be NULL or a pointer to the next alignment
2062 relocation. */
2063 next_alignment = internal_relocs;
2064 /* This will be the previous alignment, although at first it points
2065 to the first real relocation. */
2066 prev_alignment = internal_relocs;
2067
2068 /* We calculate worst case shrinkage caused by alignment directives.
2069 No fool-proof, but better than either ignoring the problem or
2070 doing heavy duty analysis of all the alignment markers in all
2071 input sections. */
2072 section_alignment_glue = 0;
2073 for (irel = internal_relocs; irel < irelend; irel++)
2074 if (ELF32_R_TYPE (irel->r_info) == R_RX_RH_RELAX
2075 && irel->r_addend & RX_RELAXA_ALIGN)
2076 {
2077 int this_glue = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2078
2079 if (section_alignment_glue < this_glue)
2080 section_alignment_glue = this_glue;
2081 }
2082 /* Worst case is all 0..N alignments, in order, causing 2*N-1 byte
2083 shrinkage. */
2084 section_alignment_glue *= 2;
2085
2086 for (irel = internal_relocs; irel < irelend; irel++)
2087 {
2088 unsigned char *insn;
2089 int nrelocs;
2090
2091 /* The insns we care about are all marked with one of these. */
2092 if (ELF32_R_TYPE (irel->r_info) != R_RX_RH_RELAX)
2093 continue;
2094
2095 if (irel->r_addend & RX_RELAXA_ALIGN
2096 || next_alignment == internal_relocs)
2097 {
2098 /* When we delete bytes, we need to maintain all the alignments
2099 indicated. In addition, we need to be careful about relaxing
2100 jumps across alignment boundaries - these displacements
2101 *grow* when we delete bytes. For now, don't shrink
2102 displacements across an alignment boundary, just in case.
2103 Note that this only affects relocations to the same
2104 section. */
2105 prev_alignment = next_alignment;
2106 next_alignment += 2;
2107 while (next_alignment < irelend
2108 && (ELF32_R_TYPE (next_alignment->r_info) != R_RX_RH_RELAX
2109 || !(next_alignment->r_addend & RX_RELAXA_ELIGN)))
2110 next_alignment ++;
2111 if (next_alignment >= irelend || next_alignment->r_offset == 0)
2112 next_alignment = NULL;
2113 }
2114
2115 /* When we hit alignment markers, see if we've shrunk enough
2116 before them to reduce the gap without violating the alignment
2117 requirements. */
2118 if (irel->r_addend & RX_RELAXA_ALIGN)
2119 {
2120 /* At this point, the next relocation *should* be the ELIGN
2121 end marker. */
2122 Elf_Internal_Rela *erel = irel + 1;
2123 unsigned int alignment, nbytes;
2124
2125 if (ELF32_R_TYPE (erel->r_info) != R_RX_RH_RELAX)
2126 continue;
2127 if (!(erel->r_addend & RX_RELAXA_ELIGN))
2128 continue;
2129
2130 alignment = 1 << (irel->r_addend & RX_RELAXA_ANUM);
2131
2132 if (erel->r_offset - irel->r_offset < alignment)
2133 continue;
2134
2135 nbytes = erel->r_offset - irel->r_offset;
2136 nbytes /= alignment;
2137 nbytes *= alignment;
2138
2139 elf32_rx_relax_delete_bytes (abfd, sec, erel->r_offset-nbytes, nbytes, next_alignment,
2140 erel->r_offset == sec->size, internal_relocs);
2141 *again = TRUE;
2142
2143 continue;
2144 }
2145
2146 if (irel->r_addend & RX_RELAXA_ELIGN)
2147 continue;
2148
2149 insn = contents + irel->r_offset;
2150
2151 nrelocs = irel->r_addend & RX_RELAXA_RNUM;
2152
2153 /* At this point, we have an insn that is a candidate for linker
2154 relaxation. There are NRELOCS relocs following that may be
2155 relaxed, although each reloc may be made of more than one
2156 reloc entry (such as gp-rel symbols). */
2157
2158 /* Get the value of the symbol referred to by the reloc. Just
2159 in case this is the last reloc in the list, use the RL's
2160 addend to choose between this reloc (no addend) or the next
2161 (yes addend, which means at least one following reloc). */
2162
2163 /* srel points to the "current" reloction for this insn -
2164 actually the last reloc for a given operand, which is the one
2165 we need to update. We check the relaxations in the same
2166 order that the relocations happen, so we'll just push it
2167 along as we go. */
2168 srel = irel;
2169
2170 pc = sec->output_section->vma + sec->output_offset
2171 + srel->r_offset;
2172
2173 #define GET_RELOC \
2174 symval = OFFSET_FOR_RELOC (srel, &srel, &scale); \
2175 pcrel = symval - pc + srel->r_addend; \
2176 nrelocs --;
2177
2178 #define SNIPNR(offset, nbytes) \
2179 elf32_rx_relax_delete_bytes (abfd, sec, (insn - contents) + offset, nbytes, next_alignment, 0, internal_relocs);
2180 #define SNIP(offset, nbytes, newtype) \
2181 SNIPNR (offset, nbytes); \
2182 srel->r_info = ELF32_R_INFO (ELF32_R_SYM (srel->r_info), newtype)
2183
2184 /* The order of these bit tests must match the order that the
2185 relocs appear in. Since we sorted those by offset, we can
2186 predict them. */
2187
2188 /* Note that the numbers in, say, DSP6 are the bit offsets of
2189 the code fields that describe the operand. Bits number 0 for
2190 the MSB of insn[0]. */
2191
2192 /* DSP* codes:
2193 0 00 [reg]
2194 1 01 dsp:8[reg]
2195 2 10 dsp:16[reg]
2196 3 11 reg */
2197 if (irel->r_addend & RX_RELAXA_DSP6)
2198 {
2199 GET_RELOC;
2200
2201 code = insn[0] & 3;
2202 if (code == 2 && symval/scale <= 255)
2203 {
2204 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2205 insn[0] &= 0xfc;
2206 insn[0] |= 0x01;
2207 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2208 if (newrel != ELF32_R_TYPE (srel->r_info))
2209 {
2210 SNIP (3, 1, newrel);
2211 *again = TRUE;
2212 }
2213 }
2214
2215 else if (code == 1 && symval == 0)
2216 {
2217 insn[0] &= 0xfc;
2218 SNIP (2, 1, R_RX_NONE);
2219 *again = TRUE;
2220 }
2221
2222 /* Special case DSP:5 format: MOV.bwl dsp:5[Rsrc],Rdst. */
2223 else if (code == 1 && symval/scale <= 31
2224 /* Decodable bits. */
2225 && (insn[0] & 0xcc) == 0xcc
2226 /* Width. */
2227 && (insn[0] & 0x30) != 0x30
2228 /* Register MSBs. */
2229 && (insn[1] & 0x88) == 0x00)
2230 {
2231 int newrel = 0;
2232
2233 insn[0] = 0x88 | (insn[0] & 0x30);
2234 /* The register fields are in the right place already. */
2235
2236 /* We can't relax this new opcode. */
2237 irel->r_addend = 0;
2238
2239 switch ((insn[0] & 0x30) >> 4)
2240 {
2241 case 0:
2242 newrel = R_RX_RH_ABS5p5B;
2243 break;
2244 case 1:
2245 newrel = R_RX_RH_ABS5p5W;
2246 break;
2247 case 2:
2248 newrel = R_RX_RH_ABS5p5L;
2249 break;
2250 }
2251
2252 move_reloc (irel, srel, -2);
2253 SNIP (2, 1, newrel);
2254 }
2255
2256 /* Special case DSP:5 format: MOVU.bw dsp:5[Rsrc],Rdst. */
2257 else if (code == 1 && symval/scale <= 31
2258 /* Decodable bits. */
2259 && (insn[0] & 0xf8) == 0x58
2260 /* Register MSBs. */
2261 && (insn[1] & 0x88) == 0x00)
2262 {
2263 int newrel = 0;
2264
2265 insn[0] = 0xb0 | ((insn[0] & 0x04) << 1);
2266 /* The register fields are in the right place already. */
2267
2268 /* We can't relax this new opcode. */
2269 irel->r_addend = 0;
2270
2271 switch ((insn[0] & 0x08) >> 3)
2272 {
2273 case 0:
2274 newrel = R_RX_RH_ABS5p5B;
2275 break;
2276 case 1:
2277 newrel = R_RX_RH_ABS5p5W;
2278 break;
2279 }
2280
2281 move_reloc (irel, srel, -2);
2282 SNIP (2, 1, newrel);
2283 }
2284 }
2285
2286 /* A DSP4 operand always follows a DSP6 operand, even if there's
2287 no relocation for it. We have to read the code out of the
2288 opcode to calculate the offset of the operand. */
2289 if (irel->r_addend & RX_RELAXA_DSP4)
2290 {
2291 int code6, offset = 0;
2292
2293 GET_RELOC;
2294
2295 code6 = insn[0] & 0x03;
2296 switch (code6)
2297 {
2298 case 0: offset = 2; break;
2299 case 1: offset = 3; break;
2300 case 2: offset = 4; break;
2301 case 3: offset = 2; break;
2302 }
2303
2304 code = (insn[0] & 0x0c) >> 2;
2305
2306 if (code == 2 && symval / scale <= 255)
2307 {
2308 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2309
2310 insn[0] &= 0xf3;
2311 insn[0] |= 0x04;
2312 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2313 if (newrel != ELF32_R_TYPE (srel->r_info))
2314 {
2315 SNIP (offset+1, 1, newrel);
2316 *again = TRUE;
2317 }
2318 }
2319
2320 else if (code == 1 && symval == 0)
2321 {
2322 insn[0] &= 0xf3;
2323 SNIP (offset, 1, R_RX_NONE);
2324 *again = TRUE;
2325 }
2326 /* Special case DSP:5 format: MOV.bwl Rsrc,dsp:5[Rdst] */
2327 else if (code == 1 && symval/scale <= 31
2328 /* Decodable bits. */
2329 && (insn[0] & 0xc3) == 0xc3
2330 /* Width. */
2331 && (insn[0] & 0x30) != 0x30
2332 /* Register MSBs. */
2333 && (insn[1] & 0x88) == 0x00)
2334 {
2335 int newrel = 0;
2336
2337 insn[0] = 0x80 | (insn[0] & 0x30);
2338 /* The register fields are in the right place already. */
2339
2340 /* We can't relax this new opcode. */
2341 irel->r_addend = 0;
2342
2343 switch ((insn[0] & 0x30) >> 4)
2344 {
2345 case 0:
2346 newrel = R_RX_RH_ABS5p5B;
2347 break;
2348 case 1:
2349 newrel = R_RX_RH_ABS5p5W;
2350 break;
2351 case 2:
2352 newrel = R_RX_RH_ABS5p5L;
2353 break;
2354 }
2355
2356 move_reloc (irel, srel, -2);
2357 SNIP (2, 1, newrel);
2358 }
2359 }
2360
2361 /* These always occur alone, but the offset depends on whether
2362 it's a MEMEX opcode (0x06) or not. */
2363 if (irel->r_addend & RX_RELAXA_DSP14)
2364 {
2365 int offset;
2366 GET_RELOC;
2367
2368 if (insn[0] == 0x06)
2369 offset = 3;
2370 else
2371 offset = 4;
2372
2373 code = insn[1] & 3;
2374
2375 if (code == 2 && symval / scale <= 255)
2376 {
2377 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2378
2379 insn[1] &= 0xfc;
2380 insn[1] |= 0x01;
2381 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2382 if (newrel != ELF32_R_TYPE (srel->r_info))
2383 {
2384 SNIP (offset, 1, newrel);
2385 *again = TRUE;
2386 }
2387 }
2388 else if (code == 1 && symval == 0)
2389 {
2390 insn[1] &= 0xfc;
2391 SNIP (offset, 1, R_RX_NONE);
2392 *again = TRUE;
2393 }
2394 }
2395
2396 /* IMM* codes:
2397 0 00 imm:32
2398 1 01 simm:8
2399 2 10 simm:16
2400 3 11 simm:24. */
2401
2402 /* These always occur alone. */
2403 if (irel->r_addend & RX_RELAXA_IMM6)
2404 {
2405 long ssymval;
2406
2407 GET_RELOC;
2408
2409 /* These relocations sign-extend, so we must do signed compares. */
2410 ssymval = (long) symval;
2411
2412 code = insn[0] & 0x03;
2413
2414 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2415 {
2416 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2417
2418 insn[0] &= 0xfc;
2419 insn[0] |= 0x03;
2420 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2421 if (newrel != ELF32_R_TYPE (srel->r_info))
2422 {
2423 SNIP (2, 1, newrel);
2424 *again = TRUE;
2425 }
2426 }
2427
2428 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2429 {
2430 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2431
2432 insn[0] &= 0xfc;
2433 insn[0] |= 0x02;
2434 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2435 if (newrel != ELF32_R_TYPE (srel->r_info))
2436 {
2437 SNIP (2, 1, newrel);
2438 *again = TRUE;
2439 }
2440 }
2441
2442 /* Special case UIMM8 format: CMP #uimm8,Rdst. */
2443 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2444 /* Decodable bits. */
2445 && (insn[0] & 0xfc) == 0x74
2446 /* Decodable bits. */
2447 && ((insn[1] & 0xf0) == 0x00))
2448 {
2449 int newrel;
2450
2451 insn[0] = 0x75;
2452 insn[1] = 0x50 | (insn[1] & 0x0f);
2453
2454 /* We can't relax this new opcode. */
2455 irel->r_addend = 0;
2456
2457 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2458 newrel = R_RX_ABS8U;
2459 else
2460 newrel = R_RX_DIR8U;
2461
2462 SNIP (2, 1, newrel);
2463 *again = TRUE;
2464 }
2465
2466 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2467 {
2468 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2469
2470 insn[0] &= 0xfc;
2471 insn[0] |= 0x01;
2472 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2473 if (newrel != ELF32_R_TYPE (srel->r_info))
2474 {
2475 SNIP (2, 1, newrel);
2476 *again = TRUE;
2477 }
2478 }
2479
2480 /* Special case UIMM4 format: CMP, MUL, AND, OR. */
2481 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2482 /* Decodable bits and immediate type. */
2483 && insn[0] == 0x75
2484 /* Decodable bits. */
2485 && (insn[1] & 0xc0) == 0x00)
2486 {
2487 static const int newop[4] = { 1, 3, 4, 5 };
2488
2489 insn[0] = 0x60 | newop[insn[1] >> 4];
2490 /* The register number doesn't move. */
2491
2492 /* We can't relax this new opcode. */
2493 irel->r_addend = 0;
2494
2495 move_reloc (irel, srel, -1);
2496
2497 SNIP (2, 1, R_RX_RH_UIMM4p8);
2498 *again = TRUE;
2499 }
2500
2501 /* Special case UIMM4 format: ADD -> ADD/SUB. */
2502 else if (code == 1 && ssymval <= 15 && ssymval >= -15
2503 /* Decodable bits and immediate type. */
2504 && insn[0] == 0x71
2505 /* Same register for source and destination. */
2506 && ((insn[1] >> 4) == (insn[1] & 0x0f)))
2507 {
2508 int newrel;
2509
2510 /* Note that we can't turn "add $0,Rs" into a NOP
2511 because the flags need to be set right. */
2512
2513 if (ssymval < 0)
2514 {
2515 insn[0] = 0x60; /* Subtract. */
2516 newrel = R_RX_RH_UNEG4p8;
2517 }
2518 else
2519 {
2520 insn[0] = 0x62; /* Add. */
2521 newrel = R_RX_RH_UIMM4p8;
2522 }
2523
2524 /* The register number is in the right place. */
2525
2526 /* We can't relax this new opcode. */
2527 irel->r_addend = 0;
2528
2529 move_reloc (irel, srel, -1);
2530
2531 SNIP (2, 1, newrel);
2532 *again = TRUE;
2533 }
2534 }
2535
2536 /* These are either matched with a DSP6 (2-byte base) or an id24
2537 (3-byte base). */
2538 if (irel->r_addend & RX_RELAXA_IMM12)
2539 {
2540 int dspcode, offset = 0;
2541 long ssymval;
2542
2543 GET_RELOC;
2544
2545 if ((insn[0] & 0xfc) == 0xfc)
2546 dspcode = 1; /* Just something with one byte operand. */
2547 else
2548 dspcode = insn[0] & 3;
2549 switch (dspcode)
2550 {
2551 case 0: offset = 2; break;
2552 case 1: offset = 3; break;
2553 case 2: offset = 4; break;
2554 case 3: offset = 2; break;
2555 }
2556
2557 /* These relocations sign-extend, so we must do signed compares. */
2558 ssymval = (long) symval;
2559
2560 code = (insn[1] >> 2) & 3;
2561 if (code == 0 && ssymval <= 8388607 && ssymval >= -8388608)
2562 {
2563 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2564
2565 insn[1] &= 0xf3;
2566 insn[1] |= 0x0c;
2567 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2568 if (newrel != ELF32_R_TYPE (srel->r_info))
2569 {
2570 SNIP (offset, 1, newrel);
2571 *again = TRUE;
2572 }
2573 }
2574
2575 else if (code == 3 && ssymval <= 32767 && ssymval >= -32768)
2576 {
2577 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2578
2579 insn[1] &= 0xf3;
2580 insn[1] |= 0x08;
2581 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2582 if (newrel != ELF32_R_TYPE (srel->r_info))
2583 {
2584 SNIP (offset, 1, newrel);
2585 *again = TRUE;
2586 }
2587 }
2588
2589 /* Special case UIMM8 format: MOV #uimm8,Rdst. */
2590 else if (code == 2 && ssymval <= 255 && ssymval >= 16
2591 /* Decodable bits. */
2592 && insn[0] == 0xfb
2593 /* Decodable bits. */
2594 && ((insn[1] & 0x03) == 0x02))
2595 {
2596 int newrel;
2597
2598 insn[0] = 0x75;
2599 insn[1] = 0x40 | (insn[1] >> 4);
2600
2601 /* We can't relax this new opcode. */
2602 irel->r_addend = 0;
2603
2604 if (STACK_REL_P (ELF32_R_TYPE (srel->r_info)))
2605 newrel = R_RX_ABS8U;
2606 else
2607 newrel = R_RX_DIR8U;
2608
2609 SNIP (2, 1, newrel);
2610 *again = TRUE;
2611 }
2612
2613 else if (code == 2 && ssymval <= 127 && ssymval >= -128)
2614 {
2615 unsigned int newrel = ELF32_R_TYPE(srel->r_info);
2616
2617 insn[1] &= 0xf3;
2618 insn[1] |= 0x04;
2619 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2620 if (newrel != ELF32_R_TYPE(srel->r_info))
2621 {
2622 SNIP (offset, 1, newrel);
2623 *again = TRUE;
2624 }
2625 }
2626
2627 /* Special case UIMM4 format: MOV #uimm4,Rdst. */
2628 else if (code == 1 && ssymval <= 15 && ssymval >= 0
2629 /* Decodable bits. */
2630 && insn[0] == 0xfb
2631 /* Decodable bits. */
2632 && ((insn[1] & 0x03) == 0x02))
2633 {
2634 insn[0] = 0x66;
2635 insn[1] = insn[1] >> 4;
2636
2637 /* We can't relax this new opcode. */
2638 irel->r_addend = 0;
2639
2640 move_reloc (irel, srel, -1);
2641
2642 SNIP (2, 1, R_RX_RH_UIMM4p8);
2643 *again = TRUE;
2644 }
2645 }
2646
2647 if (irel->r_addend & RX_RELAXA_BRA)
2648 {
2649 unsigned int newrel = ELF32_R_TYPE (srel->r_info);
2650 int max_pcrel3 = 4;
2651 int alignment_glue = 0;
2652
2653 GET_RELOC;
2654
2655 /* Branches over alignment chunks are problematic, as
2656 deleting bytes here makes the branch *further* away. We
2657 can be agressive with branches within this alignment
2658 block, but not branches outside it. */
2659 if ((prev_alignment == NULL
2660 || symval < (bfd_vma)(sec_start + prev_alignment->r_offset))
2661 && (next_alignment == NULL
2662 || symval > (bfd_vma)(sec_start + next_alignment->r_offset)))
2663 alignment_glue = section_alignment_glue;
2664
2665 if (ELF32_R_TYPE(srel[1].r_info) == R_RX_RH_RELAX
2666 && srel[1].r_addend & RX_RELAXA_BRA
2667 && srel[1].r_offset < irel->r_offset + pcrel)
2668 max_pcrel3 ++;
2669
2670 newrel = next_smaller_reloc (ELF32_R_TYPE (srel->r_info));
2671
2672 /* The values we compare PCREL with are not what you'd
2673 expect; they're off by a little to compensate for (1)
2674 where the reloc is relative to the insn, and (2) how much
2675 the insn is going to change when we relax it. */
2676
2677 /* These we have to decode. */
2678 switch (insn[0])
2679 {
2680 case 0x04: /* BRA pcdsp:24 */
2681 if (-32768 + alignment_glue <= pcrel
2682 && pcrel <= 32765 - alignment_glue)
2683 {
2684 insn[0] = 0x38;
2685 SNIP (3, 1, newrel);
2686 *again = TRUE;
2687 }
2688 break;
2689
2690 case 0x38: /* BRA pcdsp:16 */
2691 if (-128 + alignment_glue <= pcrel
2692 && pcrel <= 127 - alignment_glue)
2693 {
2694 insn[0] = 0x2e;
2695 SNIP (2, 1, newrel);
2696 *again = TRUE;
2697 }
2698 break;
2699
2700 case 0x2e: /* BRA pcdsp:8 */
2701 /* Note that there's a risk here of shortening things so
2702 much that we no longer fit this reloc; it *should*
2703 only happen when you branch across a branch, and that
2704 branch also devolves into BRA.S. "Real" code should
2705 be OK. */
2706 if (max_pcrel3 + alignment_glue <= pcrel
2707 && pcrel <= 10 - alignment_glue
2708 && allow_pcrel3)
2709 {
2710 insn[0] = 0x08;
2711 SNIP (1, 1, newrel);
2712 move_reloc (irel, srel, -1);
2713 *again = TRUE;
2714 }
2715 break;
2716
2717 case 0x05: /* BSR pcdsp:24 */
2718 if (-32768 + alignment_glue <= pcrel
2719 && pcrel <= 32765 - alignment_glue)
2720 {
2721 insn[0] = 0x39;
2722 SNIP (1, 1, newrel);
2723 *again = TRUE;
2724 }
2725 break;
2726
2727 case 0x3a: /* BEQ.W pcdsp:16 */
2728 case 0x3b: /* BNE.W pcdsp:16 */
2729 if (-128 + alignment_glue <= pcrel
2730 && pcrel <= 127 - alignment_glue)
2731 {
2732 insn[0] = 0x20 | (insn[0] & 1);
2733 SNIP (1, 1, newrel);
2734 *again = TRUE;
2735 }
2736 break;
2737
2738 case 0x20: /* BEQ.B pcdsp:8 */
2739 case 0x21: /* BNE.B pcdsp:8 */
2740 if (max_pcrel3 + alignment_glue <= pcrel
2741 && pcrel - alignment_glue <= 10
2742 && allow_pcrel3)
2743 {
2744 insn[0] = 0x10 | ((insn[0] & 1) << 3);
2745 SNIP (1, 1, newrel);
2746 move_reloc (irel, srel, -1);
2747 *again = TRUE;
2748 }
2749 break;
2750
2751 case 0x16: /* synthetic BNE dsp24 */
2752 case 0x1e: /* synthetic BEQ dsp24 */
2753 if (-32767 + alignment_glue <= pcrel
2754 && pcrel <= 32766 - alignment_glue
2755 && insn[1] == 0x04)
2756 {
2757 if (insn[0] == 0x16)
2758 insn[0] = 0x3b;
2759 else
2760 insn[0] = 0x3a;
2761 /* We snip out the bytes at the end else the reloc
2762 will get moved too, and too much. */
2763 SNIP (3, 2, newrel);
2764 move_reloc (irel, srel, -1);
2765 *again = TRUE;
2766 }
2767 break;
2768 }
2769
2770 /* Special case - synthetic conditional branches, pcrel24.
2771 Note that EQ and NE have been handled above. */
2772 if ((insn[0] & 0xf0) == 0x20
2773 && insn[1] == 0x06
2774 && insn[2] == 0x04
2775 && srel->r_offset != irel->r_offset + 1
2776 && -32767 + alignment_glue <= pcrel
2777 && pcrel <= 32766 - alignment_glue)
2778 {
2779 insn[1] = 0x05;
2780 insn[2] = 0x38;
2781 SNIP (5, 1, newrel);
2782 *again = TRUE;
2783 }
2784
2785 /* Special case - synthetic conditional branches, pcrel16 */
2786 if ((insn[0] & 0xf0) == 0x20
2787 && insn[1] == 0x05
2788 && insn[2] == 0x38
2789 && srel->r_offset != irel->r_offset + 1
2790 && -127 + alignment_glue <= pcrel
2791 && pcrel <= 126 - alignment_glue)
2792 {
2793 int cond = (insn[0] & 0x0f) ^ 0x01;
2794
2795 insn[0] = 0x20 | cond;
2796 /* By moving the reloc first, we avoid having
2797 delete_bytes move it also. */
2798 move_reloc (irel, srel, -2);
2799 SNIP (2, 3, newrel);
2800 *again = TRUE;
2801 }
2802 }
2803
2804 BFD_ASSERT (nrelocs == 0);
2805
2806 /* Special case - check MOV.bwl #IMM, dsp[reg] and see if we can
2807 use MOV.bwl #uimm:8, dsp:5[r7] format. This is tricky
2808 because it may have one or two relocations. */
2809 if ((insn[0] & 0xfc) == 0xf8
2810 && (insn[1] & 0x80) == 0x00
2811 && (insn[0] & 0x03) != 0x03)
2812 {
2813 int dcode, icode, reg, ioff, dscale, ilen;
2814 bfd_vma disp_val = 0;
2815 long imm_val = 0;
2816 Elf_Internal_Rela * disp_rel = 0;
2817 Elf_Internal_Rela * imm_rel = 0;
2818
2819 /* Reset this. */
2820 srel = irel;
2821
2822 dcode = insn[0] & 0x03;
2823 icode = (insn[1] >> 2) & 0x03;
2824 reg = (insn[1] >> 4) & 0x0f;
2825
2826 ioff = dcode == 1 ? 3 : dcode == 2 ? 4 : 2;
2827
2828 /* Figure out what the dispacement is. */
2829 if (dcode == 1 || dcode == 2)
2830 {
2831 /* There's a displacement. See if there's a reloc for it. */
2832 if (srel[1].r_offset == irel->r_offset + 2)
2833 {
2834 GET_RELOC;
2835 disp_val = symval;
2836 disp_rel = srel;
2837 }
2838 else
2839 {
2840 if (dcode == 1)
2841 disp_val = insn[2];
2842 else
2843 {
2844 #if RX_OPCODE_BIG_ENDIAN
2845 disp_val = insn[2] * 256 + insn[3];
2846 #else
2847 disp_val = insn[2] + insn[3] * 256;
2848 #endif
2849 }
2850 switch (insn[1] & 3)
2851 {
2852 case 1:
2853 disp_val *= 2;
2854 scale = 2;
2855 break;
2856 case 2:
2857 disp_val *= 4;
2858 scale = 4;
2859 break;
2860 }
2861 }
2862 }
2863
2864 dscale = scale;
2865
2866 /* Figure out what the immediate is. */
2867 if (srel[1].r_offset == irel->r_offset + ioff)
2868 {
2869 GET_RELOC;
2870 imm_val = (long) symval;
2871 imm_rel = srel;
2872 }
2873 else
2874 {
2875 unsigned char * ip = insn + ioff;
2876
2877 switch (icode)
2878 {
2879 case 1:
2880 /* For byte writes, we don't sign extend. Makes the math easier later. */
2881 if (scale == 1)
2882 imm_val = ip[0];
2883 else
2884 imm_val = (char) ip[0];
2885 break;
2886 case 2:
2887 #if RX_OPCODE_BIG_ENDIAN
2888 imm_val = ((char) ip[0] << 8) | ip[1];
2889 #else
2890 imm_val = ((char) ip[1] << 8) | ip[0];
2891 #endif
2892 break;
2893 case 3:
2894 #if RX_OPCODE_BIG_ENDIAN
2895 imm_val = ((char) ip[0] << 16) | (ip[1] << 8) | ip[2];
2896 #else
2897 imm_val = ((char) ip[2] << 16) | (ip[1] << 8) | ip[0];
2898 #endif
2899 break;
2900 case 0:
2901 #if RX_OPCODE_BIG_ENDIAN
2902 imm_val = (ip[0] << 24) | (ip[1] << 16) | (ip[2] << 8) | ip[3];
2903 #else
2904 imm_val = (ip[3] << 24) | (ip[2] << 16) | (ip[1] << 8) | ip[0];
2905 #endif
2906 break;
2907 }
2908 }
2909
2910 ilen = 2;
2911
2912 switch (dcode)
2913 {
2914 case 1:
2915 ilen += 1;
2916 break;
2917 case 2:
2918 ilen += 2;
2919 break;
2920 }
2921
2922 switch (icode)
2923 {
2924 case 1:
2925 ilen += 1;
2926 break;
2927 case 2:
2928 ilen += 2;
2929 break;
2930 case 3:
2931 ilen += 3;
2932 break;
2933 case 4:
2934 ilen += 4;
2935 break;
2936 }
2937
2938 /* The shortcut happens when the immediate is 0..255,
2939 register r0 to r7, and displacement (scaled) 0..31. */
2940
2941 if (0 <= imm_val && imm_val <= 255
2942 && 0 <= reg && reg <= 7
2943 && disp_val / dscale <= 31)
2944 {
2945 insn[0] = 0x3c | (insn[1] & 0x03);
2946 insn[1] = (((disp_val / dscale) << 3) & 0x80) | (reg << 4) | ((disp_val/dscale) & 0x0f);
2947 insn[2] = imm_val;
2948
2949 if (disp_rel)
2950 {
2951 int newrel = R_RX_NONE;
2952
2953 switch (dscale)
2954 {
2955 case 1:
2956 newrel = R_RX_RH_ABS5p8B;
2957 break;
2958 case 2:
2959 newrel = R_RX_RH_ABS5p8W;
2960 break;
2961 case 4:
2962 newrel = R_RX_RH_ABS5p8L;
2963 break;
2964 }
2965 disp_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (disp_rel->r_info), newrel);
2966 move_reloc (irel, disp_rel, -1);
2967 }
2968 if (imm_rel)
2969 {
2970 imm_rel->r_info = ELF32_R_INFO (ELF32_R_SYM (imm_rel->r_info), R_RX_DIR8U);
2971 move_reloc (disp_rel ? disp_rel : irel,
2972 imm_rel,
2973 irel->r_offset - imm_rel->r_offset + 2);
2974 }
2975
2976 SNIPNR (3, ilen - 3);
2977 *again = TRUE;
2978
2979 /* We can't relax this new opcode. */
2980 irel->r_addend = 0;
2981 }
2982 }
2983 }
2984
2985 /* We can't reliably relax branches to DIR3U_PCREL unless we know
2986 whatever they're branching over won't shrink any more. If we're
2987 basically done here, do one more pass just for branches - but
2988 don't request a pass after that one! */
2989 if (!*again && !allow_pcrel3)
2990 {
2991 bfd_boolean ignored;
2992
2993 elf32_rx_relax_section (abfd, sec, link_info, &ignored, TRUE);
2994 }
2995
2996 return TRUE;
2997
2998 error_return:
2999 if (free_contents != NULL)
3000 free (free_contents);
3001
3002 if (shndx_buf != NULL)
3003 {
3004 shndx_hdr->contents = NULL;
3005 free (shndx_buf);
3006 }
3007
3008 if (free_intsyms != NULL)
3009 free (free_intsyms);
3010
3011 return FALSE;
3012 }
3013
3014 static bfd_boolean
3015 elf32_rx_relax_section_wrapper (bfd * abfd,
3016 asection * sec,
3017 struct bfd_link_info * link_info,
3018 bfd_boolean * again)
3019 {
3020 return elf32_rx_relax_section (abfd, sec, link_info, again, FALSE);
3021 }
3022 \f
3023 /* Function to set the ELF flag bits. */
3024
3025 static bfd_boolean
3026 rx_elf_set_private_flags (bfd * abfd, flagword flags)
3027 {
3028 elf_elfheader (abfd)->e_flags = flags;
3029 elf_flags_init (abfd) = TRUE;
3030 return TRUE;
3031 }
3032
3033 static bfd_boolean no_warn_mismatch = FALSE;
3034 static bfd_boolean ignore_lma = TRUE;
3035
3036 void bfd_elf32_rx_set_target_flags (bfd_boolean, bfd_boolean);
3037
3038 void
3039 bfd_elf32_rx_set_target_flags (bfd_boolean user_no_warn_mismatch,
3040 bfd_boolean user_ignore_lma)
3041 {
3042 no_warn_mismatch = user_no_warn_mismatch;
3043 ignore_lma = user_ignore_lma;
3044 }
3045
3046 /* Converts FLAGS into a descriptive string.
3047 Returns a static pointer. */
3048
3049 static const char *
3050 describe_flags (flagword flags)
3051 {
3052 static char buf [128];
3053
3054 buf[0] = 0;
3055
3056 if (flags & E_FLAG_RX_64BIT_DOUBLES)
3057 strcat (buf, "64-bit doubles");
3058 else
3059 strcat (buf, "32-bit doubles");
3060
3061 if (flags & E_FLAG_RX_DSP)
3062 strcat (buf, ", dsp");
3063 else
3064 strcat (buf, ", no dsp");
3065
3066 if (flags & E_FLAG_RX_PID)
3067 strcat (buf, ", pid");
3068 else
3069 strcat (buf, ", no pid");
3070
3071 if (flags & E_FLAG_RX_ABI)
3072 strcat (buf, ", RX ABI");
3073 else
3074 strcat (buf, ", GCC ABI");
3075
3076 if (flags & E_FLAG_RX_SINSNS_SET)
3077 strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
3078
3079 return buf;
3080 }
3081
3082 /* Merge backend specific data from an object file to the output
3083 object file when linking. */
3084
3085 static bfd_boolean
3086 rx_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
3087 {
3088 flagword old_flags;
3089 flagword new_flags;
3090 bfd_boolean error = FALSE;
3091
3092 new_flags = elf_elfheader (ibfd)->e_flags;
3093 old_flags = elf_elfheader (obfd)->e_flags;
3094
3095 if (!elf_flags_init (obfd))
3096 {
3097 /* First call, no flags set. */
3098 elf_flags_init (obfd) = TRUE;
3099 elf_elfheader (obfd)->e_flags = new_flags;
3100 }
3101 else if (old_flags != new_flags)
3102 {
3103 flagword known_flags;
3104
3105 if (old_flags & E_FLAG_RX_SINSNS_SET)
3106 {
3107 if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
3108 {
3109 new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3110 new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
3111 }
3112 }
3113 else if (new_flags & E_FLAG_RX_SINSNS_SET)
3114 {
3115 old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
3116 old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
3117 }
3118
3119 known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
3120 | E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
3121
3122 if ((old_flags ^ new_flags) & known_flags)
3123 {
3124 /* Only complain if flag bits we care about do not match.
3125 Other bits may be set, since older binaries did use some
3126 deprecated flags. */
3127 if (no_warn_mismatch)
3128 {
3129 elf_elfheader (obfd)->e_flags = (new_flags | old_flags) & known_flags;
3130 }
3131 else
3132 {
3133 _bfd_error_handler ("There is a conflict merging the ELF header flags from %s",
3134 bfd_get_filename (ibfd));
3135 _bfd_error_handler (" the input file's flags: %s",
3136 describe_flags (new_flags));
3137 _bfd_error_handler (" the output file's flags: %s",
3138 describe_flags (old_flags));
3139 error = TRUE;
3140 }
3141 }
3142 else
3143 elf_elfheader (obfd)->e_flags = new_flags & known_flags;
3144 }
3145
3146 if (error)
3147 bfd_set_error (bfd_error_bad_value);
3148
3149 return !error;
3150 }
3151 \f
3152 static bfd_boolean
3153 rx_elf_print_private_bfd_data (bfd * abfd, void * ptr)
3154 {
3155 FILE * file = (FILE *) ptr;
3156 flagword flags;
3157
3158 BFD_ASSERT (abfd != NULL && ptr != NULL);
3159
3160 /* Print normal ELF private data. */
3161 _bfd_elf_print_private_bfd_data (abfd, ptr);
3162
3163 flags = elf_elfheader (abfd)->e_flags;
3164 fprintf (file, _("private flags = 0x%lx:"), (long) flags);
3165
3166 fprintf (file, "%s", describe_flags (flags));
3167 return TRUE;
3168 }
3169
3170 /* Return the MACH for an e_flags value. */
3171
3172 static int
3173 elf32_rx_machine (bfd * abfd ATTRIBUTE_UNUSED)
3174 {
3175 #if 0 /* FIXME: EF_RX_CPU_MASK collides with E_FLAG_RX_...
3176 Need to sort out how these flag bits are used.
3177 For now we assume that the flags are OK. */
3178 if ((elf_elfheader (abfd)->e_flags & EF_RX_CPU_MASK) == EF_RX_CPU_RX)
3179 #endif
3180 return bfd_mach_rx;
3181
3182 return 0;
3183 }
3184
3185 static bfd_boolean
3186 rx_elf_object_p (bfd * abfd)
3187 {
3188 int i;
3189 unsigned int u;
3190 Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
3191 int nphdrs = elf_elfheader (abfd)->e_phnum;
3192 sec_ptr bsec;
3193 static int saw_be = FALSE;
3194
3195 /* We never want to automatically choose the non-swapping big-endian
3196 target. The user can only get that explicitly, such as with -I
3197 and objcopy. */
3198 if (abfd->xvec == &rx_elf32_be_ns_vec
3199 && abfd->target_defaulted)
3200 return FALSE;
3201
3202 /* BFD->target_defaulted is not set to TRUE when a target is chosen
3203 as a fallback, so we check for "scanning" to know when to stop
3204 using the non-swapping target. */
3205 if (abfd->xvec == &rx_elf32_be_ns_vec
3206 && saw_be)
3207 return FALSE;
3208 if (abfd->xvec == &rx_elf32_be_vec)
3209 saw_be = TRUE;
3210
3211 bfd_default_set_arch_mach (abfd, bfd_arch_rx,
3212 elf32_rx_machine (abfd));
3213
3214 /* For each PHDR in the object, we must find some section that
3215 corresponds (based on matching file offsets) and use its VMA
3216 information to reconstruct the p_vaddr field we clobbered when we
3217 wrote it out. */
3218 for (i=0; i<nphdrs; i++)
3219 {
3220 for (u=0; u<elf_tdata(abfd)->num_elf_sections; u++)
3221 {
3222 Elf_Internal_Shdr *sec = elf_tdata(abfd)->elf_sect_ptr[u];
3223
3224 if (phdr[i].p_filesz
3225 && phdr[i].p_offset <= (bfd_vma) sec->sh_offset
3226 && sec->sh_size > 0
3227 && sec->sh_type != SHT_NOBITS
3228 && (bfd_vma)sec->sh_offset <= phdr[i].p_offset + (phdr[i].p_filesz - 1))
3229 {
3230 /* Found one! The difference between the two addresses,
3231 plus the difference between the two file offsets, is
3232 enough information to reconstruct the lma. */
3233
3234 /* Example where they aren't:
3235 PHDR[1] = lma fffc0100 offset 00002010 size 00000100
3236 SEC[6] = vma 00000050 offset 00002050 size 00000040
3237
3238 The correct LMA for the section is fffc0140 + (2050-2010).
3239 */
3240
3241 phdr[i].p_vaddr = sec->sh_addr + (sec->sh_offset - phdr[i].p_offset);
3242 break;
3243 }
3244 }
3245
3246 /* We must update the bfd sections as well, so we don't stop
3247 with one match. */
3248 bsec = abfd->sections;
3249 while (bsec)
3250 {
3251 if (phdr[i].p_filesz
3252 && phdr[i].p_vaddr <= bsec->vma
3253 && bsec->vma <= phdr[i].p_vaddr + (phdr[i].p_filesz - 1))
3254 {
3255 bsec->lma = phdr[i].p_paddr + (bsec->vma - phdr[i].p_vaddr);
3256 }
3257 bsec = bsec->next;
3258 }
3259 }
3260
3261 return TRUE;
3262 }
3263 \f
3264
3265 #ifdef DEBUG
3266 void
3267 rx_dump_symtab (bfd * abfd, void * internal_syms, void * external_syms)
3268 {
3269 size_t locsymcount;
3270 Elf_Internal_Sym * isymbuf;
3271 Elf_Internal_Sym * isymend;
3272 Elf_Internal_Sym * isym;
3273 Elf_Internal_Shdr * symtab_hdr;
3274 bfd_boolean free_internal = FALSE, free_external = FALSE;
3275 char * st_info_str;
3276 char * st_info_stb_str;
3277 char * st_other_str;
3278 char * st_shndx_str;
3279
3280 if (! internal_syms)
3281 {
3282 internal_syms = bfd_malloc (1000);
3283 free_internal = 1;
3284 }
3285 if (! external_syms)
3286 {
3287 external_syms = bfd_malloc (1000);
3288 free_external = 1;
3289 }
3290
3291 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3292 locsymcount = symtab_hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
3293 if (free_internal)
3294 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3295 symtab_hdr->sh_info, 0,
3296 internal_syms, external_syms, NULL);
3297 else
3298 isymbuf = internal_syms;
3299 isymend = isymbuf + locsymcount;
3300
3301 for (isym = isymbuf ; isym < isymend ; isym++)
3302 {
3303 switch (ELF_ST_TYPE (isym->st_info))
3304 {
3305 case STT_FUNC: st_info_str = "STT_FUNC"; break;
3306 case STT_SECTION: st_info_str = "STT_SECTION"; break;
3307 case STT_FILE: st_info_str = "STT_FILE"; break;
3308 case STT_OBJECT: st_info_str = "STT_OBJECT"; break;
3309 case STT_TLS: st_info_str = "STT_TLS"; break;
3310 default: st_info_str = "";
3311 }
3312 switch (ELF_ST_BIND (isym->st_info))
3313 {
3314 case STB_LOCAL: st_info_stb_str = "STB_LOCAL"; break;
3315 case STB_GLOBAL: st_info_stb_str = "STB_GLOBAL"; break;
3316 default: st_info_stb_str = "";
3317 }
3318 switch (ELF_ST_VISIBILITY (isym->st_other))
3319 {
3320 case STV_DEFAULT: st_other_str = "STV_DEFAULT"; break;
3321 case STV_INTERNAL: st_other_str = "STV_INTERNAL"; break;
3322 case STV_PROTECTED: st_other_str = "STV_PROTECTED"; break;
3323 default: st_other_str = "";
3324 }
3325 switch (isym->st_shndx)
3326 {
3327 case SHN_ABS: st_shndx_str = "SHN_ABS"; break;
3328 case SHN_COMMON: st_shndx_str = "SHN_COMMON"; break;
3329 case SHN_UNDEF: st_shndx_str = "SHN_UNDEF"; break;
3330 default: st_shndx_str = "";
3331 }
3332
3333 printf ("isym = %p st_value = %lx st_size = %lx st_name = (%lu) %s "
3334 "st_info = (%d) %s %s st_other = (%d) %s st_shndx = (%d) %s\n",
3335 isym,
3336 (unsigned long) isym->st_value,
3337 (unsigned long) isym->st_size,
3338 isym->st_name,
3339 bfd_elf_string_from_elf_section (abfd, symtab_hdr->sh_link,
3340 isym->st_name),
3341 isym->st_info, st_info_str, st_info_stb_str,
3342 isym->st_other, st_other_str,
3343 isym->st_shndx, st_shndx_str);
3344 }
3345 if (free_internal)
3346 free (internal_syms);
3347 if (free_external)
3348 free (external_syms);
3349 }
3350
3351 char *
3352 rx_get_reloc (long reloc)
3353 {
3354 if (0 <= reloc && reloc < R_RX_max)
3355 return rx_elf_howto_table[reloc].name;
3356 return "";
3357 }
3358 #endif /* DEBUG */
3359
3360 \f
3361 /* We must take care to keep the on-disk copy of any code sections
3362 that are fully linked swapped if the target is big endian, to match
3363 the Renesas tools. */
3364
3365 /* The rule is: big endian object that are final-link executables,
3366 have code sections stored with 32-bit words swapped relative to
3367 what you'd get by default. */
3368
3369 static bfd_boolean
3370 rx_get_section_contents (bfd * abfd,
3371 sec_ptr section,
3372 void * location,
3373 file_ptr offset,
3374 bfd_size_type count)
3375 {
3376 int exec = (abfd->flags & EXEC_P) ? 1 : 0;
3377 int s_code = (section->flags & SEC_CODE) ? 1 : 0;
3378 bfd_boolean rv;
3379
3380 #ifdef DJDEBUG
3381 fprintf (stderr, "dj: get %ld %ld from %s %s e%d sc%d %08lx:%08lx\n",
3382 (long) offset, (long) count, section->name,
3383 bfd_big_endian(abfd) ? "be" : "le",
3384 exec, s_code, (long unsigned) section->filepos,
3385 (long unsigned) offset);
3386 #endif
3387
3388 if (exec && s_code && bfd_big_endian (abfd))
3389 {
3390 char * cloc = (char *) location;
3391 bfd_size_type cnt, end_cnt;
3392
3393 rv = TRUE;
3394
3395 /* Fetch and swap unaligned bytes at the beginning. */
3396 if (offset % 4)
3397 {
3398 char buf[4];
3399
3400 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3401 (offset & -4), 4);
3402 if (!rv)
3403 return FALSE;
3404
3405 bfd_putb32 (bfd_getl32 (buf), buf);
3406
3407 cnt = 4 - (offset % 4);
3408 if (cnt > count)
3409 cnt = count;
3410
3411 memcpy (location, buf + (offset % 4), cnt);
3412
3413 count -= cnt;
3414 offset += cnt;
3415 cloc += count;
3416 }
3417
3418 end_cnt = count % 4;
3419
3420 /* Fetch and swap the middle bytes. */
3421 if (count >= 4)
3422 {
3423 rv = _bfd_generic_get_section_contents (abfd, section, cloc, offset,
3424 count - end_cnt);
3425 if (!rv)
3426 return FALSE;
3427
3428 for (cnt = count; cnt >= 4; cnt -= 4, cloc += 4)
3429 bfd_putb32 (bfd_getl32 (cloc), cloc);
3430 }
3431
3432 /* Fetch and swap the end bytes. */
3433 if (end_cnt > 0)
3434 {
3435 char buf[4];
3436
3437 /* Fetch the end bytes. */
3438 rv = _bfd_generic_get_section_contents (abfd, section, buf,
3439 offset + count - end_cnt, 4);
3440 if (!rv)
3441 return FALSE;
3442
3443 bfd_putb32 (bfd_getl32 (buf), buf);
3444 memcpy (cloc, buf, end_cnt);
3445 }
3446 }
3447 else
3448 rv = _bfd_generic_get_section_contents (abfd, section, location, offset, count);
3449
3450 return rv;
3451 }
3452
3453 #ifdef DJDEBUG
3454 static bfd_boolean
3455 rx2_set_section_contents (bfd * abfd,
3456 sec_ptr section,
3457 const void * location,
3458 file_ptr offset,
3459 bfd_size_type count)
3460 {
3461 bfd_size_type i;
3462
3463 fprintf (stderr, " set sec %s %08x loc %p offset %#x count %#x\n",
3464 section->name, (unsigned) section->vma, location, (int) offset, (int) count);
3465 for (i = 0; i < count; i++)
3466 {
3467 if (i % 16 == 0 && i > 0)
3468 fprintf (stderr, "\n");
3469
3470 if (i % 16 && i % 4 == 0)
3471 fprintf (stderr, " ");
3472
3473 if (i % 16 == 0)
3474 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3475
3476 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3477 }
3478 fprintf (stderr, "\n");
3479
3480 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3481 }
3482 #define _bfd_elf_set_section_contents rx2_set_section_contents
3483 #endif
3484
3485 static bfd_boolean
3486 rx_set_section_contents (bfd * abfd,
3487 sec_ptr section,
3488 const void * location,
3489 file_ptr offset,
3490 bfd_size_type count)
3491 {
3492 bfd_boolean exec = (abfd->flags & EXEC_P) ? TRUE : FALSE;
3493 bfd_boolean s_code = (section->flags & SEC_CODE) ? TRUE : FALSE;
3494 bfd_boolean rv;
3495 char * swapped_data = NULL;
3496 bfd_size_type i;
3497 bfd_vma caddr = section->vma + offset;
3498 file_ptr faddr = 0;
3499 bfd_size_type scount;
3500
3501 #ifdef DJDEBUG
3502 bfd_size_type i;
3503
3504 fprintf (stderr, "\ndj: set %ld %ld to %s %s e%d sc%d\n",
3505 (long) offset, (long) count, section->name,
3506 bfd_big_endian (abfd) ? "be" : "le",
3507 exec, s_code);
3508
3509 for (i = 0; i < count; i++)
3510 {
3511 int a = section->vma + offset + i;
3512
3513 if (a % 16 == 0 && a > 0)
3514 fprintf (stderr, "\n");
3515
3516 if (a % 16 && a % 4 == 0)
3517 fprintf (stderr, " ");
3518
3519 if (a % 16 == 0 || i == 0)
3520 fprintf (stderr, " %08x:", (int) (section->vma + offset + i));
3521
3522 fprintf (stderr, " %02x", ((unsigned char *) location)[i]);
3523 }
3524
3525 fprintf (stderr, "\n");
3526 #endif
3527
3528 if (! exec || ! s_code || ! bfd_big_endian (abfd))
3529 return _bfd_elf_set_section_contents (abfd, section, location, offset, count);
3530
3531 while (count > 0 && caddr > 0 && caddr % 4)
3532 {
3533 switch (caddr % 4)
3534 {
3535 case 0: faddr = offset + 3; break;
3536 case 1: faddr = offset + 1; break;
3537 case 2: faddr = offset - 1; break;
3538 case 3: faddr = offset - 3; break;
3539 }
3540
3541 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3542 if (! rv)
3543 return rv;
3544
3545 location = (bfd_byte *) location + 1;
3546 offset ++;
3547 count --;
3548 caddr ++;
3549 }
3550
3551 scount = (int)(count / 4) * 4;
3552 if (scount > 0)
3553 {
3554 char * cloc = (char *) location;
3555
3556 swapped_data = (char *) bfd_alloc (abfd, count);
3557
3558 for (i = 0; i < count; i += 4)
3559 {
3560 bfd_vma v = bfd_getl32 (cloc + i);
3561 bfd_putb32 (v, swapped_data + i);
3562 }
3563
3564 rv = _bfd_elf_set_section_contents (abfd, section, swapped_data, offset, scount);
3565
3566 if (!rv)
3567 return rv;
3568 }
3569
3570 count -= scount;
3571 location = (bfd_byte *) location + scount;
3572 offset += scount;
3573
3574 if (count > 0)
3575 {
3576 caddr = section->vma + offset;
3577 while (count > 0)
3578 {
3579 switch (caddr % 4)
3580 {
3581 case 0: faddr = offset + 3; break;
3582 case 1: faddr = offset + 1; break;
3583 case 2: faddr = offset - 1; break;
3584 case 3: faddr = offset - 3; break;
3585 }
3586 rv = _bfd_elf_set_section_contents (abfd, section, location, faddr, 1);
3587 if (! rv)
3588 return rv;
3589
3590 location = (bfd_byte *) location + 1;
3591 offset ++;
3592 count --;
3593 caddr ++;
3594 }
3595 }
3596
3597 return TRUE;
3598 }
3599
3600 static bfd_boolean
3601 rx_final_link (bfd * abfd, struct bfd_link_info * info)
3602 {
3603 asection * o;
3604
3605 for (o = abfd->sections; o != NULL; o = o->next)
3606 {
3607 #ifdef DJDEBUG
3608 fprintf (stderr, "sec %s fl %x vma %lx lma %lx size %lx raw %lx\n",
3609 o->name, o->flags, o->vma, o->lma, o->size, o->rawsize);
3610 #endif
3611 if (o->flags & SEC_CODE
3612 && bfd_big_endian (abfd)
3613 && o->size % 4)
3614 {
3615 #ifdef DJDEBUG
3616 fprintf (stderr, "adjusting...\n");
3617 #endif
3618 o->size += 4 - (o->size % 4);
3619 }
3620 }
3621
3622 return bfd_elf_final_link (abfd, info);
3623 }
3624
3625 static bfd_boolean
3626 elf32_rx_modify_program_headers (bfd * abfd ATTRIBUTE_UNUSED,
3627 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3628 {
3629 const struct elf_backend_data * bed;
3630 struct elf_obj_tdata * tdata;
3631 Elf_Internal_Phdr * phdr;
3632 unsigned int count;
3633 unsigned int i;
3634
3635 bed = get_elf_backend_data (abfd);
3636 tdata = elf_tdata (abfd);
3637 phdr = tdata->phdr;
3638 count = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
3639
3640 if (ignore_lma)
3641 for (i = count; i-- != 0;)
3642 if (phdr[i].p_type == PT_LOAD)
3643 {
3644 /* The Renesas tools expect p_paddr to be zero. However,
3645 there is no other way to store the writable data in ROM for
3646 startup initialization. So, we let the linker *think*
3647 we're using paddr and vaddr the "usual" way, but at the
3648 last minute we move the paddr into the vaddr (which is what
3649 the simulator uses) and zero out paddr. Note that this
3650 does not affect the section headers, just the program
3651 headers. We hope. */
3652 phdr[i].p_vaddr = phdr[i].p_paddr;
3653 #if 0 /* If we zero out p_paddr, then the LMA in the section table
3654 becomes wrong. */
3655 phdr[i].p_paddr = 0;
3656 #endif
3657 }
3658
3659 return TRUE;
3660 }
3661
3662 /* The default literal sections should always be marked as "code" (i.e.,
3663 SHF_EXECINSTR). This is particularly important for big-endian mode
3664 when we do not want their contents byte reversed. */
3665 static const struct bfd_elf_special_section elf32_rx_special_sections[] =
3666 {
3667 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3668 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3669 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_EXECINSTR },
3670 { NULL, 0, 0, 0, 0 }
3671 };
3672 \f
3673 typedef struct {
3674 bfd *abfd;
3675 struct bfd_link_info *info;
3676 bfd_vma table_start;
3677 int table_size;
3678 bfd_vma *table_handlers;
3679 bfd_vma table_default_handler;
3680 struct bfd_link_hash_entry **table_entries;
3681 struct bfd_link_hash_entry *table_default_entry;
3682 FILE *mapfile;
3683 } RX_Table_Info;
3684
3685 static bfd_boolean
3686 rx_table_find (struct bfd_hash_entry *vent, void *vinfo)
3687 {
3688 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3689 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3690 const char *name; /* of the symbol we've found */
3691 asection *sec;
3692 struct bfd *abfd;
3693 int idx;
3694 const char *tname; /* name of the table */
3695 bfd_vma start_addr, end_addr;
3696 char *buf;
3697 struct bfd_link_hash_entry * h;
3698
3699 /* We're looking for globally defined symbols of the form
3700 $tablestart$<NAME>. */
3701 if (ent->type != bfd_link_hash_defined
3702 && ent->type != bfd_link_hash_defweak)
3703 return TRUE;
3704
3705 name = ent->root.string;
3706 sec = ent->u.def.section;
3707 abfd = sec->owner;
3708
3709 if (strncmp (name, "$tablestart$", 12))
3710 return TRUE;
3711
3712 sec->flags |= SEC_KEEP;
3713
3714 tname = name + 12;
3715
3716 start_addr = ent->u.def.value;
3717
3718 /* At this point, we can't build the table but we can (and must)
3719 find all the related symbols and mark their sections as SEC_KEEP
3720 so we don't garbage collect them. */
3721
3722 buf = (char *) malloc (12 + 10 + strlen (tname));
3723
3724 sprintf (buf, "$tableend$%s", tname);
3725 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3726 if (!h || (h->type != bfd_link_hash_defined
3727 && h->type != bfd_link_hash_defweak))
3728 {
3729 _bfd_error_handler (_("%B:%A: table %s missing corresponding %s"),
3730 abfd, sec, name, buf);
3731 return TRUE;
3732 }
3733
3734 if (h->u.def.section != ent->u.def.section)
3735 {
3736 _bfd_error_handler (_("%B:%A: %s and %s must be in the same input section"),
3737 h->u.def.section->owner, h->u.def.section,
3738 name, buf);
3739 return TRUE;
3740 }
3741
3742 end_addr = h->u.def.value;
3743
3744 sprintf (buf, "$tableentry$default$%s", tname);
3745 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3746 if (h && (h->type == bfd_link_hash_defined
3747 || h->type == bfd_link_hash_defweak))
3748 {
3749 h->u.def.section->flags |= SEC_KEEP;
3750 }
3751
3752 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3753 {
3754 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3755 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3756 if (h && (h->type == bfd_link_hash_defined
3757 || h->type == bfd_link_hash_defweak))
3758 {
3759 h->u.def.section->flags |= SEC_KEEP;
3760 }
3761 }
3762
3763 /* Return TRUE to keep scanning, FALSE to end the traversal. */
3764 return TRUE;
3765 }
3766
3767 /* We need to check for table entry symbols and build the tables, and
3768 we need to do it before the linker does garbage collection. This function is
3769 called once per input object file. */
3770 static bfd_boolean
3771 rx_check_directives
3772 (bfd * abfd ATTRIBUTE_UNUSED,
3773 struct bfd_link_info * info ATTRIBUTE_UNUSED)
3774 {
3775 RX_Table_Info stuff;
3776
3777 stuff.abfd = abfd;
3778 stuff.info = info;
3779 bfd_hash_traverse (&(info->hash->table), rx_table_find, &stuff);
3780
3781 return TRUE;
3782 }
3783
3784 \f
3785 static bfd_boolean
3786 rx_table_map_2 (struct bfd_hash_entry *vent, void *vinfo)
3787 {
3788 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3789 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3790 int idx;
3791 const char *name;
3792 bfd_vma addr;
3793
3794 /* See if the symbol ENT has an address listed in the table, and
3795 isn't a debug/special symbol. If so, put it in the table. */
3796
3797 if (ent->type != bfd_link_hash_defined
3798 && ent->type != bfd_link_hash_defweak)
3799 return TRUE;
3800
3801 name = ent->root.string;
3802
3803 if (name[0] == '$' || name[0] == '.' || name[0] < ' ')
3804 return TRUE;
3805
3806 addr = (ent->u.def.value
3807 + ent->u.def.section->output_section->vma
3808 + ent->u.def.section->output_offset);
3809
3810 for (idx = 0; idx < info->table_size; idx ++)
3811 if (addr == info->table_handlers[idx])
3812 info->table_entries[idx] = ent;
3813
3814 if (addr == info->table_default_handler)
3815 info->table_default_entry = ent;
3816
3817 return TRUE;
3818 }
3819
3820 static bfd_boolean
3821 rx_table_map (struct bfd_hash_entry *vent, void *vinfo)
3822 {
3823 RX_Table_Info *info = (RX_Table_Info *)vinfo;
3824 struct bfd_link_hash_entry *ent = (struct bfd_link_hash_entry *)vent;
3825 const char *name; /* of the symbol we've found */
3826 int idx;
3827 const char *tname; /* name of the table */
3828 bfd_vma start_addr, end_addr;
3829 char *buf;
3830 struct bfd_link_hash_entry * h;
3831 int need_elipses;
3832
3833 /* We're looking for globally defined symbols of the form
3834 $tablestart$<NAME>. */
3835 if (ent->type != bfd_link_hash_defined
3836 && ent->type != bfd_link_hash_defweak)
3837 return TRUE;
3838
3839 name = ent->root.string;
3840
3841 if (strncmp (name, "$tablestart$", 12))
3842 return TRUE;
3843
3844 tname = name + 12;
3845 start_addr = (ent->u.def.value
3846 + ent->u.def.section->output_section->vma
3847 + ent->u.def.section->output_offset);
3848
3849 buf = (char *) malloc (12 + 10 + strlen (tname));
3850
3851 sprintf (buf, "$tableend$%s", tname);
3852 end_addr = get_symbol_value_maybe (buf, info->info);
3853
3854 sprintf (buf, "$tableentry$default$%s", tname);
3855 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3856 if (h)
3857 {
3858 info->table_default_handler = (h->u.def.value
3859 + h->u.def.section->output_section->vma
3860 + h->u.def.section->output_offset);
3861 }
3862 else
3863 /* Zero is a valid handler address! */
3864 info->table_default_handler = (bfd_vma) (-1);
3865 info->table_default_entry = NULL;
3866
3867 info->table_start = start_addr;
3868 info->table_size = (int) (end_addr - start_addr) / 4;
3869 info->table_handlers = (bfd_vma *) malloc (info->table_size * sizeof (bfd_vma));
3870 info->table_entries = (struct bfd_link_hash_entry **) malloc (info->table_size * sizeof (struct bfd_link_hash_entry));
3871
3872 for (idx = 0; idx < (int) (end_addr - start_addr) / 4; idx ++)
3873 {
3874 sprintf (buf, "$tableentry$%d$%s", idx, tname);
3875 h = bfd_link_hash_lookup (info->info->hash, buf, FALSE, FALSE, TRUE);
3876 if (h && (h->type == bfd_link_hash_defined
3877 || h->type == bfd_link_hash_defweak))
3878 {
3879 info->table_handlers[idx] = (h->u.def.value
3880 + h->u.def.section->output_section->vma
3881 + h->u.def.section->output_offset);
3882 }
3883 else
3884 info->table_handlers[idx] = info->table_default_handler;
3885 info->table_entries[idx] = NULL;
3886 }
3887
3888 free (buf);
3889
3890 bfd_hash_traverse (&(info->info->hash->table), rx_table_map_2, info);
3891
3892 fprintf (info->mapfile, "\nRX Vector Table: %s has %d entries at 0x%08" BFD_VMA_FMT "x\n\n",
3893 tname, info->table_size, start_addr);
3894
3895 if (info->table_default_entry)
3896 fprintf (info->mapfile, " default handler is: %s at 0x%08" BFD_VMA_FMT "x\n",
3897 info->table_default_entry->root.string,
3898 info->table_default_handler);
3899 else if (info->table_default_handler != (bfd_vma)(-1))
3900 fprintf (info->mapfile, " default handler is at 0x%08" BFD_VMA_FMT "x\n",
3901 info->table_default_handler);
3902 else
3903 fprintf (info->mapfile, " no default handler\n");
3904
3905 need_elipses = 1;
3906 for (idx = 0; idx < info->table_size; idx ++)
3907 {
3908 if (info->table_handlers[idx] == info->table_default_handler)
3909 {
3910 if (need_elipses)
3911 fprintf (info->mapfile, " . . .\n");
3912 need_elipses = 0;
3913 continue;
3914 }
3915 need_elipses = 1;
3916
3917 fprintf (info->mapfile, " 0x%08" BFD_VMA_FMT "x [%3d] ", start_addr + 4 * idx, idx);
3918
3919 if (info->table_handlers[idx] == (bfd_vma) (-1))
3920 fprintf (info->mapfile, "(no handler found)\n");
3921
3922 else if (info->table_handlers[idx] == info->table_default_handler)
3923 {
3924 if (info->table_default_entry)
3925 fprintf (info->mapfile, "(default)\n");
3926 else
3927 fprintf (info->mapfile, "(default)\n");
3928 }
3929
3930 else if (info->table_entries[idx])
3931 {
3932 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x %s\n", info->table_handlers[idx], info->table_entries[idx]->root.string);
3933 }
3934
3935 else
3936 {
3937 fprintf (info->mapfile, "0x%08" BFD_VMA_FMT "x ???\n", info->table_handlers[idx]);
3938 }
3939 }
3940 if (need_elipses)
3941 fprintf (info->mapfile, " . . .\n");
3942
3943 return TRUE;
3944 }
3945
3946 void
3947 rx_additional_link_map_text (bfd *obfd, struct bfd_link_info *info, FILE *mapfile)
3948 {
3949 /* We scan the symbol table looking for $tableentry$'s, and for
3950 each, try to deduce which handlers go with which entries. */
3951
3952 RX_Table_Info stuff;
3953
3954 stuff.abfd = obfd;
3955 stuff.info = info;
3956 stuff.mapfile = mapfile;
3957 bfd_hash_traverse (&(info->hash->table), rx_table_map, &stuff);
3958 }
3959
3960 \f
3961 #define ELF_ARCH bfd_arch_rx
3962 #define ELF_MACHINE_CODE EM_RX
3963 #define ELF_MAXPAGESIZE 0x1000
3964
3965 #define TARGET_BIG_SYM rx_elf32_be_vec
3966 #define TARGET_BIG_NAME "elf32-rx-be"
3967
3968 #define TARGET_LITTLE_SYM rx_elf32_le_vec
3969 #define TARGET_LITTLE_NAME "elf32-rx-le"
3970
3971 #define elf_info_to_howto_rel NULL
3972 #define elf_info_to_howto rx_info_to_howto_rela
3973 #define elf_backend_object_p rx_elf_object_p
3974 #define elf_backend_relocate_section rx_elf_relocate_section
3975 #define elf_symbol_leading_char ('_')
3976 #define elf_backend_can_gc_sections 1
3977 #define elf_backend_modify_program_headers elf32_rx_modify_program_headers
3978
3979 #define bfd_elf32_bfd_reloc_type_lookup rx_reloc_type_lookup
3980 #define bfd_elf32_bfd_reloc_name_lookup rx_reloc_name_lookup
3981 #define bfd_elf32_bfd_set_private_flags rx_elf_set_private_flags
3982 #define bfd_elf32_bfd_merge_private_bfd_data rx_elf_merge_private_bfd_data
3983 #define bfd_elf32_bfd_print_private_bfd_data rx_elf_print_private_bfd_data
3984 #define bfd_elf32_get_section_contents rx_get_section_contents
3985 #define bfd_elf32_set_section_contents rx_set_section_contents
3986 #define bfd_elf32_bfd_final_link rx_final_link
3987 #define bfd_elf32_bfd_relax_section elf32_rx_relax_section_wrapper
3988 #define elf_backend_special_sections elf32_rx_special_sections
3989 #define elf_backend_check_directives rx_check_directives
3990
3991 #include "elf32-target.h"
3992
3993 /* We define a second big-endian target that doesn't have the custom
3994 section get/set hooks, for times when we want to preserve the
3995 pre-swapped .text sections (like objcopy). */
3996
3997 #undef TARGET_BIG_SYM
3998 #define TARGET_BIG_SYM rx_elf32_be_ns_vec
3999 #undef TARGET_BIG_NAME
4000 #define TARGET_BIG_NAME "elf32-rx-be-ns"
4001 #undef TARGET_LITTLE_SYM
4002
4003 #undef bfd_elf32_get_section_contents
4004 #undef bfd_elf32_set_section_contents
4005
4006 #undef elf32_bed
4007 #define elf32_bed elf32_rx_be_ns_bed
4008
4009 #include "elf32-target.h"