OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-rx.c] - Blame information for rev 139

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.