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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [elf32-sh.c] - Blame information for rev 1772

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

Line No. Rev Author Line
1 104 markom
/* Hitachi SH specific support for 32-bit ELF
2
   Copyright 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
3
   Contributed by Ian Lance Taylor, Cygnus Support.
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 2 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 "bfd.h"
22
#include "sysdep.h"
23
#include "bfdlink.h"
24
#include "libbfd.h"
25
#include "elf-bfd.h"
26
#include "elf/sh.h"
27
 
28
static bfd_reloc_status_type sh_elf_reloc
29
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
30
static bfd_reloc_status_type sh_elf_ignore_reloc
31
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
32
static reloc_howto_type *sh_elf_reloc_type_lookup
33
  PARAMS ((bfd *, bfd_reloc_code_real_type));
34
static void sh_elf_info_to_howto
35
  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
36
static boolean sh_elf_set_private_flags
37
  PARAMS ((bfd *, flagword));
38
static boolean sh_elf_copy_private_data
39
  PARAMS ((bfd *, bfd *));
40
static boolean sh_elf_merge_private_data
41
  PARAMS ((bfd *, bfd *));
42
boolean sh_elf_set_mach_from_flags
43
  PARAMS ((bfd *));
44
static boolean sh_elf_relax_section
45
  PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
46
static boolean sh_elf_relax_delete_bytes
47
  PARAMS ((bfd *, asection *, bfd_vma, int));
48
static boolean sh_elf_align_loads
49
  PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, boolean *));
50
static boolean sh_elf_swap_insns
51
  PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
52
static boolean sh_elf_relocate_section
53
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
54
           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
55
static bfd_byte *sh_elf_get_relocated_section_contents
56
  PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
57
           bfd_byte *, boolean, asymbol **));
58
 
59
static reloc_howto_type sh_elf_howto_table[] =
60
{
61
  /* No relocation.  */
62
  HOWTO (R_SH_NONE,             /* type */
63
         0,                      /* rightshift */
64
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
65
         0,                      /* bitsize */
66
         false,                 /* pc_relative */
67
         0,                      /* bitpos */
68
         complain_overflow_dont, /* complain_on_overflow */
69
         sh_elf_ignore_reloc,   /* special_function */
70
         "R_SH_NONE",           /* name */
71
         false,                 /* partial_inplace */
72
         0,                      /* src_mask */
73
         0,                      /* dst_mask */
74
         false),                /* pcrel_offset */
75
 
76
  /* 32 bit absolute relocation.  Setting partial_inplace to true and
77
     src_mask to a non-zero value is similar to the COFF toolchain.  */
78
  HOWTO (R_SH_DIR32,            /* type */
79
         0,                      /* rightshift */
80
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
81
         32,                    /* bitsize */
82
         false,                 /* pc_relative */
83
         0,                      /* bitpos */
84
         complain_overflow_bitfield, /* complain_on_overflow */
85
         sh_elf_reloc,          /* special_function */
86
         "R_SH_DIR32",          /* name */
87
         true,                  /* partial_inplace */
88
         0xffffffff,            /* src_mask */
89
         0xffffffff,            /* dst_mask */
90
         false),                /* pcrel_offset */
91
 
92
  /* 32 bit PC relative relocation.  */
93
  HOWTO (R_SH_REL32,            /* type */
94
         0,                      /* rightshift */
95
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
96
         32,                    /* bitsize */
97
         true,                  /* pc_relative */
98
         0,                      /* bitpos */
99
         complain_overflow_signed, /* complain_on_overflow */
100
         sh_elf_ignore_reloc,   /* special_function */
101
         "R_SH_REL32",          /* name */
102
         false,                 /* partial_inplace */
103
         0,                      /* src_mask */
104
         0xffffffff,            /* dst_mask */
105
         true),                 /* pcrel_offset */
106
 
107
  /* 8 bit PC relative branch divided by 2.  */
108
  HOWTO (R_SH_DIR8WPN,          /* type */
109
         1,                     /* rightshift */
110
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
111
         8,                     /* bitsize */
112
         true,                  /* pc_relative */
113
         0,                      /* bitpos */
114
         complain_overflow_signed, /* complain_on_overflow */
115
         sh_elf_ignore_reloc,   /* special_function */
116
         "R_SH_DIR8WPN",        /* name */
117
         true,                  /* partial_inplace */
118
         0xff,                  /* src_mask */
119
         0xff,                  /* dst_mask */
120
         true),                 /* pcrel_offset */
121
 
122
  /* 12 bit PC relative branch divided by 2.  */
123
  HOWTO (R_SH_IND12W,           /* type */
124
         1,                     /* rightshift */
125
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
126
         12,                    /* bitsize */
127
         true,                  /* pc_relative */
128
         0,                      /* bitpos */
129
         complain_overflow_signed, /* complain_on_overflow */
130
         sh_elf_reloc,          /* special_function */
131
         "R_SH_IND12W",         /* name */
132
         true,                  /* partial_inplace */
133
         0xfff,                 /* src_mask */
134
         0xfff,                 /* dst_mask */
135
         true),                 /* pcrel_offset */
136
 
137
  /* 8 bit unsigned PC relative divided by 4.  */
138
  HOWTO (R_SH_DIR8WPL,          /* type */
139
         2,                     /* rightshift */
140
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
141
         8,                     /* bitsize */
142
         true,                  /* pc_relative */
143
         0,                      /* bitpos */
144
         complain_overflow_unsigned, /* complain_on_overflow */
145
         sh_elf_ignore_reloc,   /* special_function */
146
         "R_SH_DIR8WPL",        /* name */
147
         true,                  /* partial_inplace */
148
         0xff,                  /* src_mask */
149
         0xff,                  /* dst_mask */
150
         true),                 /* pcrel_offset */
151
 
152
  /* 8 bit unsigned PC relative divided by 2.  */
153
  HOWTO (R_SH_DIR8WPZ,          /* type */
154
         1,                     /* rightshift */
155
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
156
         8,                     /* bitsize */
157
         true,                  /* pc_relative */
158
         0,                      /* bitpos */
159
         complain_overflow_unsigned, /* complain_on_overflow */
160
         sh_elf_ignore_reloc,   /* special_function */
161
         "R_SH_DIR8WPZ",        /* name */
162
         true,                  /* partial_inplace */
163
         0xff,                  /* src_mask */
164
         0xff,                  /* dst_mask */
165
         true),                 /* pcrel_offset */
166
 
167
  /* 8 bit GBR relative.  FIXME: This only makes sense if we have some
168
     special symbol for the GBR relative area, and that is not
169
     implemented.  */
170
  HOWTO (R_SH_DIR8BP,           /* type */
171
         0,                      /* rightshift */
172
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
173
         8,                     /* bitsize */
174
         false,                 /* pc_relative */
175
         0,                      /* bitpos */
176
         complain_overflow_unsigned, /* complain_on_overflow */
177
         sh_elf_ignore_reloc,   /* special_function */
178
         "R_SH_DIR8BP",         /* name */
179
         false,                 /* partial_inplace */
180
         0,                      /* src_mask */
181
         0xff,                  /* dst_mask */
182
         true),                 /* pcrel_offset */
183
 
184
  /* 8 bit GBR relative divided by 2.  FIXME: This only makes sense if
185
     we have some special symbol for the GBR relative area, and that
186
     is not implemented.  */
187
  HOWTO (R_SH_DIR8W,            /* type */
188
         1,                     /* rightshift */
189
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
190
         8,                     /* bitsize */
191
         false,                 /* pc_relative */
192
         0,                      /* bitpos */
193
         complain_overflow_unsigned, /* complain_on_overflow */
194
         sh_elf_ignore_reloc,   /* special_function */
195
         "R_SH_DIR8W",          /* name */
196
         false,                 /* partial_inplace */
197
         0,                      /* src_mask */
198
         0xff,                  /* dst_mask */
199
         true),                 /* pcrel_offset */
200
 
201
  /* 8 bit GBR relative divided by 4.  FIXME: This only makes sense if
202
     we have some special symbol for the GBR relative area, and that
203
     is not implemented.  */
204
  HOWTO (R_SH_DIR8L,            /* type */
205
         2,                     /* rightshift */
206
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
207
         8,                     /* bitsize */
208
         false,                 /* pc_relative */
209
         0,                      /* bitpos */
210
         complain_overflow_unsigned, /* complain_on_overflow */
211
         sh_elf_ignore_reloc,   /* special_function */
212
         "R_SH_DIR8L",          /* name */
213
         false,                 /* partial_inplace */
214
         0,                      /* src_mask */
215
         0xff,                  /* dst_mask */
216
         true),                 /* pcrel_offset */
217
 
218
  EMPTY_HOWTO (10),
219
  EMPTY_HOWTO (11),
220
  EMPTY_HOWTO (12),
221
  EMPTY_HOWTO (13),
222
  EMPTY_HOWTO (14),
223
  EMPTY_HOWTO (15),
224
  EMPTY_HOWTO (16),
225
  EMPTY_HOWTO (17),
226
  EMPTY_HOWTO (18),
227
  EMPTY_HOWTO (19),
228
  EMPTY_HOWTO (20),
229
  EMPTY_HOWTO (21),
230
  EMPTY_HOWTO (22),
231
  EMPTY_HOWTO (23),
232
  EMPTY_HOWTO (24),
233
 
234
  /* The remaining relocs are a GNU extension used for relaxing.  The
235
     final pass of the linker never needs to do anything with any of
236
     these relocs.  Any required operations are handled by the
237
     relaxation code.  */
238
 
239
  /* A 16 bit switch table entry.  This is generated for an expression
240
     such as ``.word L1 - L2''.  The offset holds the difference
241
     between the reloc address and L2.  */
242
  HOWTO (R_SH_SWITCH16,         /* type */
243
         0,                      /* rightshift */
244
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
245
         16,                    /* bitsize */
246
         false,                 /* pc_relative */
247
         0,                      /* bitpos */
248
         complain_overflow_unsigned, /* complain_on_overflow */
249
         sh_elf_ignore_reloc,   /* special_function */
250
         "R_SH_SWITCH16",       /* name */
251
         false,                 /* partial_inplace */
252
         0,                      /* src_mask */
253
         0,                      /* dst_mask */
254
         true),                 /* pcrel_offset */
255
 
256
  /* A 32 bit switch table entry.  This is generated for an expression
257
     such as ``.long L1 - L2''.  The offset holds the difference
258
     between the reloc address and L2.  */
259
  HOWTO (R_SH_SWITCH32,         /* type */
260
         0,                      /* rightshift */
261
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
262
         32,                    /* bitsize */
263
         false,                 /* pc_relative */
264
         0,                      /* bitpos */
265
         complain_overflow_unsigned, /* complain_on_overflow */
266
         sh_elf_ignore_reloc,   /* special_function */
267
         "R_SH_SWITCH32",       /* name */
268
         false,                 /* partial_inplace */
269
         0,                      /* src_mask */
270
         0,                      /* dst_mask */
271
         true),                 /* pcrel_offset */
272
 
273
  /* Indicates a .uses pseudo-op.  The compiler will generate .uses
274
     pseudo-ops when it finds a function call which can be relaxed.
275
     The offset field holds the PC relative offset to the instruction
276
     which loads the register used in the function call.  */
277
  HOWTO (R_SH_USES,             /* type */
278
         0,                      /* rightshift */
279
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
280
         0,                      /* bitsize */
281
         false,                 /* pc_relative */
282
         0,                      /* bitpos */
283
         complain_overflow_unsigned, /* complain_on_overflow */
284
         sh_elf_ignore_reloc,   /* special_function */
285
         "R_SH_USES",           /* name */
286
         false,                 /* partial_inplace */
287
         0,                      /* src_mask */
288
         0,                      /* dst_mask */
289
         true),                 /* pcrel_offset */
290
 
291
  /* The assembler will generate this reloc for addresses referred to
292
     by the register loads associated with USES relocs.  The offset
293
     field holds the number of times the address is referenced in the
294
     object file.  */
295
  HOWTO (R_SH_COUNT,            /* type */
296
         0,                      /* rightshift */
297
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
298
         0,                      /* bitsize */
299
         false,                 /* pc_relative */
300
         0,                      /* bitpos */
301
         complain_overflow_unsigned, /* complain_on_overflow */
302
         sh_elf_ignore_reloc,   /* special_function */
303
         "R_SH_COUNT",          /* name */
304
         false,                 /* partial_inplace */
305
         0,                      /* src_mask */
306
         0,                      /* dst_mask */
307
         true),                 /* pcrel_offset */
308
 
309
  /* Indicates an alignment statement.  The offset field is the power
310
     of 2 to which subsequent portions of the object file must be
311
     aligned.  */
312
  HOWTO (R_SH_ALIGN,            /* type */
313
         0,                      /* rightshift */
314
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
315
         0,                      /* bitsize */
316
         false,                 /* pc_relative */
317
         0,                      /* bitpos */
318
         complain_overflow_unsigned, /* complain_on_overflow */
319
         sh_elf_ignore_reloc,   /* special_function */
320
         "R_SH_ALIGN",  /* name */
321
         false,                 /* partial_inplace */
322
         0,                      /* src_mask */
323
         0,                      /* dst_mask */
324
         true),                 /* pcrel_offset */
325
 
326
  /* The assembler will generate this reloc before a block of
327
     instructions.  A section should be processed as assumining it
328
     contains data, unless this reloc is seen.  */
329
  HOWTO (R_SH_CODE,             /* type */
330
         0,                      /* rightshift */
331
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
332
         0,                      /* bitsize */
333
         false,                 /* pc_relative */
334
         0,                      /* bitpos */
335
         complain_overflow_unsigned, /* complain_on_overflow */
336
         sh_elf_ignore_reloc,   /* special_function */
337
         "R_SH_CODE",           /* name */
338
         false,                 /* partial_inplace */
339
         0,                      /* src_mask */
340
         0,                      /* dst_mask */
341
         true),                 /* pcrel_offset */
342
 
343
  /* The assembler will generate this reloc after a block of
344
     instructions when it sees data that is not instructions.  */
345
  HOWTO (R_SH_DATA,             /* type */
346
         0,                      /* rightshift */
347
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
348
         0,                      /* bitsize */
349
         false,                 /* pc_relative */
350
         0,                      /* bitpos */
351
         complain_overflow_unsigned, /* complain_on_overflow */
352
         sh_elf_ignore_reloc,   /* special_function */
353
         "R_SH_DATA",           /* name */
354
         false,                 /* partial_inplace */
355
         0,                      /* src_mask */
356
         0,                      /* dst_mask */
357
         true),                 /* pcrel_offset */
358
 
359
  /* The assembler generates this reloc for each label within a block
360
     of instructions.  This permits the linker to avoid swapping
361
     instructions which are the targets of branches.  */
362
  HOWTO (R_SH_LABEL,            /* type */
363
         0,                      /* rightshift */
364
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
365
         0,                      /* bitsize */
366
         false,                 /* pc_relative */
367
         0,                      /* bitpos */
368
         complain_overflow_unsigned, /* complain_on_overflow */
369
         sh_elf_ignore_reloc,   /* special_function */
370
         "R_SH_LABEL",          /* name */
371
         false,                 /* partial_inplace */
372
         0,                      /* src_mask */
373
         0,                      /* dst_mask */
374
         true),                 /* pcrel_offset */
375
 
376
  /* An 8 bit switch table entry.  This is generated for an expression
377
     such as ``.word L1 - L2''.  The offset holds the difference
378
     between the reloc address and L2.  */
379
  HOWTO (R_SH_SWITCH8,          /* type */
380
         0,                      /* rightshift */
381
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
382
         8,                     /* bitsize */
383
         false,                 /* pc_relative */
384
         0,                      /* bitpos */
385
         complain_overflow_unsigned, /* complain_on_overflow */
386
         sh_elf_ignore_reloc,   /* special_function */
387
         "R_SH_SWITCH8",        /* name */
388
         false,                 /* partial_inplace */
389
         0,                      /* src_mask */
390
         0,                      /* dst_mask */
391
         true),                 /* pcrel_offset */
392
 
393
  /* GNU extension to record C++ vtable hierarchy */
394
  HOWTO (R_SH_GNU_VTINHERIT, /* type */
395
         0,                     /* rightshift */
396
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
397
         0,                     /* bitsize */
398
         false,                 /* pc_relative */
399
         0,                     /* bitpos */
400
         complain_overflow_dont, /* complain_on_overflow */
401
         NULL,                  /* special_function */
402
         "R_SH_GNU_VTINHERIT", /* name */
403
         false,                 /* partial_inplace */
404
         0,                     /* src_mask */
405
         0,                     /* dst_mask */
406
         false),                /* pcrel_offset */
407
 
408
  /* GNU extension to record C++ vtable member usage */
409
  HOWTO (R_SH_GNU_VTENTRY,     /* type */
410
         0,                     /* rightshift */
411
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
412
         0,                     /* bitsize */
413
         false,                 /* pc_relative */
414
         0,                     /* bitpos */
415
         complain_overflow_dont, /* complain_on_overflow */
416
         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
417
         "R_SH_GNU_VTENTRY",   /* name */
418
         false,                 /* partial_inplace */
419
         0,                     /* src_mask */
420
         0,                     /* dst_mask */
421
         false),                /* pcrel_offset */
422
 
423
  /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
424
  HOWTO (R_SH_LOOP_START,       /* type */
425
         1,                     /* rightshift */
426
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
427
         8,                     /* bitsize */
428
         false,                 /* pc_relative */
429
         0,                      /* bitpos */
430
         complain_overflow_signed, /* complain_on_overflow */
431
         sh_elf_ignore_reloc,   /* special_function */
432
         "R_SH_LOOP_START",     /* name */
433
         true,                  /* partial_inplace */
434
         0xff,                  /* src_mask */
435
         0xff,                  /* dst_mask */
436
         true),                 /* pcrel_offset */
437
 
438
  /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
439
  HOWTO (R_SH_LOOP_END,         /* type */
440
         1,                     /* rightshift */
441
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
442
         8,                     /* bitsize */
443
         false,                 /* pc_relative */
444
         0,                      /* bitpos */
445
         complain_overflow_signed, /* complain_on_overflow */
446
         sh_elf_ignore_reloc,   /* special_function */
447
         "R_SH_LOOP_END",       /* name */
448
         true,                  /* partial_inplace */
449
         0xff,                  /* src_mask */
450
         0xff,                  /* dst_mask */
451
         true),                 /* pcrel_offset */
452
 
453
};
454
 
455
static bfd_reloc_status_type
456
sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, addr,
457
                   symbol_section, start, end)
458
     int r_type;
459
     bfd *input_bfd;
460
     asection *input_section;
461
     bfd_byte *contents;
462
     bfd_vma addr;
463
     asection *symbol_section;
464
     bfd_vma start, end;
465
{
466
  static bfd_vma last_addr;
467
  asection *last_symbol_section;
468
  bfd_byte *free_contents = NULL;
469
  bfd_byte *start_ptr, *ptr, *last_ptr;
470
  int diff, cum_diff;
471
  bfd_signed_vma x;
472
  int insn;
473
 
474
  /* Sanity check the address.  */
475
  if (addr > input_section->_raw_size)
476
    return bfd_reloc_outofrange;
477
 
478
  /* We require the start and end relocations to be processed consecutively -
479
     although we allow then to be processed forwards or backwards.  */
480
  if (! last_addr)
481
    {
482
      last_addr = addr;
483
      last_symbol_section = symbol_section;
484
      return bfd_reloc_ok;
485
    }
486
  if (last_addr != addr)
487
    abort ();
488
  last_addr = 0;
489
 
490
  if (! symbol_section || last_symbol_section != symbol_section || end < start)
491
    return bfd_reloc_outofrange;
492
 
493
  /* Get the symbol_section contents.  */
494
  if (symbol_section != input_section)
495
    {
496
      if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
497
        contents = elf_section_data (symbol_section)->this_hdr.contents;
498
      else
499
        {
500
          free_contents = contents
501
            = (bfd_byte *) bfd_malloc (symbol_section->_raw_size);
502
          if (contents == NULL)
503
            return bfd_reloc_outofrange;
504
          if (! bfd_get_section_contents (input_bfd, symbol_section, contents,
505
                                          (file_ptr) 0,
506
                                          symbol_section->_raw_size))
507
            {
508
              free (contents);
509
              return bfd_reloc_outofrange;
510
            }
511
        }
512
    }
513
#define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
514
  start_ptr = contents + start;
515
  for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
516
    {
517
      for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
518
        ptr -= 2;
519
      ptr += 2;
520
      diff = last_ptr - ptr >> 1;
521
      cum_diff += diff & 1;
522
      cum_diff += diff;
523
    }
524
  /* Calculate the start / end values to load into rs / re minus four -
525
     so that will cancel out the four we would otherwise have to add to
526
     addr to get the value to subtract in order to get relative addressing.  */
527
  if (cum_diff >= 0)
528
    {
529
      start -= 4;
530
      end = (ptr + cum_diff * 2) - contents;
531
    }
532
  else
533
    {
534
      bfd_vma start0 = start - 4;
535
 
536
      while (start0 >= 0 && IS_PPI (contents + start0))
537
        start0 -= 2;
538
      start0 = start - 2 - ((start - start0) & 2);
539
      start = start0 - cum_diff - 2;
540
      end = start0;
541
    }
542
 
543
  if (free_contents)
544
    free (free_contents);
545
 
546
  insn = bfd_get_16 (input_bfd, contents + addr);
547
 
548
  x = (insn & 0x200 ? end : start) - addr;
549
  if (input_section != symbol_section)
550
    x += ((symbol_section->output_section->vma + symbol_section->output_offset)
551
          - (input_section->output_section->vma
552
             + input_section->output_offset));
553
  x >>= 1;
554
  if (x < -128 || x > 127)
555
    return bfd_reloc_overflow;
556
 
557
  x = insn & ~0xff | x & 0xff;
558
  bfd_put_16 (input_bfd, x, contents + addr);
559
 
560
  return bfd_reloc_ok;
561
}
562
 
563
/* This function is used for normal relocs.  This used to be like the COFF
564
   function, and is almost certainly incorrect for other ELF targets.  */
565
 
566
static bfd_reloc_status_type
567
sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
568
          error_message)
569
     bfd *abfd;
570
     arelent *reloc_entry;
571
     asymbol *symbol_in;
572
     PTR data;
573
     asection *input_section;
574
     bfd *output_bfd;
575
     char **error_message ATTRIBUTE_UNUSED;
576
{
577
  unsigned long insn;
578
  bfd_vma sym_value;
579
  enum elf_sh_reloc_type r_type;
580
  bfd_vma addr = reloc_entry->address;
581
  bfd_byte *hit_data = addr + (bfd_byte *) data;
582
 
583
  r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
584
 
585
  if (output_bfd != NULL)
586
    {
587
      /* Partial linking--do nothing.  */
588
      reloc_entry->address += input_section->output_offset;
589
      return bfd_reloc_ok;
590
    }
591
 
592
  /* Almost all relocs have to do with relaxing.  If any work must be
593
     done for them, it has been done in sh_relax_section.  */
594
  if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
595
    return bfd_reloc_ok;
596
 
597
  if (symbol_in != NULL
598
      && bfd_is_und_section (symbol_in->section))
599
    return bfd_reloc_undefined;
600
 
601
  if (bfd_is_com_section (symbol_in->section))
602
    sym_value = 0;
603
  else
604
    sym_value = (symbol_in->value +
605
                 symbol_in->section->output_section->vma +
606
                 symbol_in->section->output_offset);
607
 
608
  switch (r_type)
609
    {
610
    case R_SH_DIR32:
611
      insn = bfd_get_32 (abfd, hit_data);
612
      insn += sym_value + reloc_entry->addend;
613
      bfd_put_32 (abfd, insn, hit_data);
614
      break;
615
    case R_SH_IND12W:
616
      insn = bfd_get_16 (abfd, hit_data);
617
      sym_value += reloc_entry->addend;
618
      sym_value -= (input_section->output_section->vma
619
                    + input_section->output_offset
620
                    + addr
621
                    + 4);
622
      sym_value += (insn & 0xfff) << 1;
623
      if (insn & 0x800)
624
        sym_value -= 0x1000;
625
      insn = (insn & 0xf000) | (sym_value & 0xfff);
626
      bfd_put_16 (abfd, insn, hit_data);
627
      if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
628
        return bfd_reloc_overflow;
629
      break;
630
    default:
631
      abort ();
632
      break;
633
    }
634
 
635
  return bfd_reloc_ok;
636
}
637
 
638
/* This function is used for relocs which are only used for relaxing,
639
   which the linker should otherwise ignore.  */
640
 
641
static bfd_reloc_status_type
642
sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
643
                     output_bfd, error_message)
644
     bfd *abfd ATTRIBUTE_UNUSED;
645
     arelent *reloc_entry;
646
     asymbol *symbol ATTRIBUTE_UNUSED;
647
     PTR data ATTRIBUTE_UNUSED;
648
     asection *input_section;
649
     bfd *output_bfd;
650
     char **error_message ATTRIBUTE_UNUSED;
651
{
652
  if (output_bfd != NULL)
653
    reloc_entry->address += input_section->output_offset;
654
  return bfd_reloc_ok;
655
}
656
 
657
/* This structure is used to map BFD reloc codes to SH ELF relocs.  */
658
 
659
struct elf_reloc_map
660
{
661
  bfd_reloc_code_real_type bfd_reloc_val;
662
  unsigned char elf_reloc_val;
663
};
664
 
665
/* An array mapping BFD reloc codes to SH ELF relocs.  */
666
 
667
static const struct elf_reloc_map sh_reloc_map[] =
668
{
669
  { BFD_RELOC_NONE, R_SH_NONE },
670
  { BFD_RELOC_32, R_SH_DIR32 },
671
  { BFD_RELOC_CTOR, R_SH_DIR32 },
672
  { BFD_RELOC_32_PCREL, R_SH_REL32 },
673
  { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
674
  { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
675
  { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
676
  { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
677
  { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
678
  { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
679
  { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
680
  { BFD_RELOC_SH_USES, R_SH_USES },
681
  { BFD_RELOC_SH_COUNT, R_SH_COUNT },
682
  { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
683
  { BFD_RELOC_SH_CODE, R_SH_CODE },
684
  { BFD_RELOC_SH_DATA, R_SH_DATA },
685
  { BFD_RELOC_SH_LABEL, R_SH_LABEL },
686
  { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
687
  { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
688
  { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
689
  { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
690
};
691
 
692
/* Given a BFD reloc code, return the howto structure for the
693
   corresponding SH ELf reloc.  */
694
 
695
static reloc_howto_type *
696
sh_elf_reloc_type_lookup (abfd, code)
697
     bfd *abfd ATTRIBUTE_UNUSED;
698
     bfd_reloc_code_real_type code;
699
{
700
  unsigned int i;
701
 
702
  for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
703
    {
704
      if (sh_reloc_map[i].bfd_reloc_val == code)
705
        return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
706
    }
707
 
708
  return NULL;
709
}
710
 
711
/* Given an ELF reloc, fill in the howto field of a relent.  */
712
 
713
static void
714
sh_elf_info_to_howto (abfd, cache_ptr, dst)
715
     bfd *abfd ATTRIBUTE_UNUSED;
716
     arelent *cache_ptr;
717
     Elf_Internal_Rela *dst;
718
{
719
  unsigned int r;
720
 
721
  r = ELF32_R_TYPE (dst->r_info);
722
 
723
  BFD_ASSERT (r < (unsigned int) R_SH_max);
724
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
725
 
726
  cache_ptr->howto = &sh_elf_howto_table[r];
727
}
728
 
729
/* This function handles relaxing for SH ELF.  See the corresponding
730
   function in coff-sh.c for a description of what this does.  FIXME:
731
   There is a lot of duplication here between this code and the COFF
732
   specific code.  The format of relocs and symbols is wound deeply
733
   into this code, but it would still be better if the duplication
734
   could be eliminated somehow.  Note in particular that although both
735
   functions use symbols like R_SH_CODE, those symbols have different
736
   values; in coff-sh.c they come from include/coff/sh.h, whereas here
737
   they come from enum elf_sh_reloc_type in include/elf/sh.h.  */
738
 
739
static boolean
740
sh_elf_relax_section (abfd, sec, link_info, again)
741
     bfd *abfd;
742
     asection *sec;
743
     struct bfd_link_info *link_info;
744
     boolean *again;
745
{
746
  Elf_Internal_Shdr *symtab_hdr;
747
  Elf_Internal_Rela *internal_relocs;
748
  Elf_Internal_Rela *free_relocs = NULL;
749
  boolean have_code;
750
  Elf_Internal_Rela *irel, *irelend;
751
  bfd_byte *contents = NULL;
752
  bfd_byte *free_contents = NULL;
753
  Elf32_External_Sym *extsyms = NULL;
754
  Elf32_External_Sym *free_extsyms = NULL;
755
 
756
  *again = false;
757
 
758
  if (link_info->relocateable
759
      || (sec->flags & SEC_RELOC) == 0
760
      || sec->reloc_count == 0)
761
    return true;
762
 
763
  /* If this is the first time we have been called for this section,
764
     initialize the cooked size.  */
765
  if (sec->_cooked_size == 0)
766
    sec->_cooked_size = sec->_raw_size;
767
 
768
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
769
 
770
  internal_relocs = (_bfd_elf32_link_read_relocs
771
                     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
772
                      link_info->keep_memory));
773
  if (internal_relocs == NULL)
774
    goto error_return;
775
  if (! link_info->keep_memory)
776
    free_relocs = internal_relocs;
777
 
778
  have_code = false;
779
 
780
  irelend = internal_relocs + sec->reloc_count;
781
  for (irel = internal_relocs; irel < irelend; irel++)
782
    {
783
      bfd_vma laddr, paddr, symval;
784
      unsigned short insn;
785
      Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
786
      bfd_signed_vma foff;
787
 
788
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
789
        have_code = true;
790
 
791
      if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
792
        continue;
793
 
794
      /* Get the section contents.  */
795
      if (contents == NULL)
796
        {
797
          if (elf_section_data (sec)->this_hdr.contents != NULL)
798
            contents = elf_section_data (sec)->this_hdr.contents;
799
          else
800
            {
801
              contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
802
              if (contents == NULL)
803
                goto error_return;
804
              free_contents = contents;
805
 
806
              if (! bfd_get_section_contents (abfd, sec, contents,
807
                                              (file_ptr) 0, sec->_raw_size))
808
                goto error_return;
809
            }
810
        }
811
 
812
      /* The r_addend field of the R_SH_USES reloc will point us to
813
         the register load.  The 4 is because the r_addend field is
814
         computed as though it were a jump offset, which are based
815
         from 4 bytes after the jump instruction.  */
816
      laddr = irel->r_offset + 4 + irel->r_addend;
817
      if (laddr >= sec->_raw_size)
818
        {
819
          (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
820
                                 bfd_get_filename (abfd),
821
                                 (unsigned long) irel->r_offset);
822
          continue;
823
        }
824
      insn = bfd_get_16 (abfd, contents + laddr);
825
 
826
      /* If the instruction is not mov.l NN,rN, we don't know what to
827
         do.  */
828
      if ((insn & 0xf000) != 0xd000)
829
        {
830
          ((*_bfd_error_handler)
831
           (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
832
            bfd_get_filename (abfd), (unsigned long) irel->r_offset, insn));
833
          continue;
834
        }
835
 
836
      /* Get the address from which the register is being loaded.  The
837
         displacement in the mov.l instruction is quadrupled.  It is a
838
         displacement from four bytes after the movl instruction, but,
839
         before adding in the PC address, two least significant bits
840
         of the PC are cleared.  We assume that the section is aligned
841
         on a four byte boundary.  */
842
      paddr = insn & 0xff;
843
      paddr *= 4;
844
      paddr += (laddr + 4) &~ 3;
845
      if (paddr >= sec->_raw_size)
846
        {
847
          ((*_bfd_error_handler)
848
           (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
849
            bfd_get_filename (abfd), (unsigned long) irel->r_offset));
850
          continue;
851
        }
852
 
853
      /* Get the reloc for the address from which the register is
854
         being loaded.  This reloc will tell us which function is
855
         actually being called.  */
856
      for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
857
        if (irelfn->r_offset == paddr
858
            && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
859
          break;
860
      if (irelfn >= irelend)
861
        {
862
          ((*_bfd_error_handler)
863
           (_("%s: 0x%lx: warning: could not find expected reloc"),
864
            bfd_get_filename (abfd), (unsigned long) paddr));
865
          continue;
866
        }
867
 
868
      /* Read this BFD's symbols if we haven't done so already.  */
869
      if (extsyms == NULL)
870
        {
871
          if (symtab_hdr->contents != NULL)
872
            extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
873
          else
874
            {
875
              extsyms = ((Elf32_External_Sym *)
876
                         bfd_malloc (symtab_hdr->sh_size));
877
              if (extsyms == NULL)
878
                goto error_return;
879
              free_extsyms = extsyms;
880
              if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
881
                  || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
882
                      != symtab_hdr->sh_size))
883
                goto error_return;
884
            }
885
        }
886
 
887
      /* Get the value of the symbol referred to by the reloc.  */
888
      if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
889
        {
890
          Elf_Internal_Sym isym;
891
 
892
          /* A local symbol.  */
893
          bfd_elf32_swap_symbol_in (abfd,
894
                                    extsyms + ELF32_R_SYM (irelfn->r_info),
895
                                    &isym);
896
 
897
          if (isym.st_shndx != _bfd_elf_section_from_bfd_section (abfd, sec))
898
            {
899
              ((*_bfd_error_handler)
900
               (_("%s: 0x%lx: warning: symbol in unexpected section"),
901
                bfd_get_filename (abfd), (unsigned long) paddr));
902
              continue;
903
            }
904
 
905
          symval = (isym.st_value
906
                    + sec->output_section->vma
907
                    + sec->output_offset);
908
        }
909
      else
910
        {
911
          unsigned long indx;
912
          struct elf_link_hash_entry *h;
913
 
914
          indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
915
          h = elf_sym_hashes (abfd)[indx];
916
          BFD_ASSERT (h != NULL);
917
          if (h->root.type != bfd_link_hash_defined
918
              && h->root.type != bfd_link_hash_defweak)
919
            {
920
              /* This appears to be a reference to an undefined
921
                 symbol.  Just ignore it--it will be caught by the
922
                 regular reloc processing.  */
923
              continue;
924
            }
925
 
926
          symval = (h->root.u.def.value
927
                    + h->root.u.def.section->output_section->vma
928
                    + h->root.u.def.section->output_offset);
929
        }
930
 
931
      symval += bfd_get_32 (abfd, contents + paddr);
932
 
933
      /* See if this function call can be shortened.  */
934
      foff = (symval
935
              - (irel->r_offset
936
                 + sec->output_section->vma
937
                 + sec->output_offset
938
                 + 4));
939
      if (foff < -0x1000 || foff >= 0x1000)
940
        {
941
          /* After all that work, we can't shorten this function call.  */
942
          continue;
943
        }
944
 
945
      /* Shorten the function call.  */
946
 
947
      /* For simplicity of coding, we are going to modify the section
948
         contents, the section relocs, and the BFD symbol table.  We
949
         must tell the rest of the code not to free up this
950
         information.  It would be possible to instead create a table
951
         of changes which have to be made, as is done in coff-mips.c;
952
         that would be more work, but would require less memory when
953
         the linker is run.  */
954
 
955
      elf_section_data (sec)->relocs = internal_relocs;
956
      free_relocs = NULL;
957
 
958
      elf_section_data (sec)->this_hdr.contents = contents;
959
      free_contents = NULL;
960
 
961
      symtab_hdr->contents = (bfd_byte *) extsyms;
962
      free_extsyms = NULL;
963
 
964
      /* Replace the jsr with a bsr.  */
965
 
966
      /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
967
         replace the jsr with a bsr.  */
968
      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
969
      if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
970
        {
971
          /* If this needs to be changed because of future relaxing,
972
             it will be handled here like other internal IND12W
973
             relocs.  */
974
          bfd_put_16 (abfd,
975
                      0xb000 | ((foff >> 1) & 0xfff),
976
                      contents + irel->r_offset);
977
        }
978
      else
979
        {
980
          /* We can't fully resolve this yet, because the external
981
             symbol value may be changed by future relaxing.  We let
982
             the final link phase handle it.  */
983
          bfd_put_16 (abfd, 0xb000, contents + irel->r_offset);
984
        }
985
 
986
      /* See if there is another R_SH_USES reloc referring to the same
987
         register load.  */
988
      for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
989
        if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
990
            && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
991
          break;
992
      if (irelscan < irelend)
993
        {
994
          /* Some other function call depends upon this register load,
995
             and we have not yet converted that function call.
996
             Indeed, we may never be able to convert it.  There is
997
             nothing else we can do at this point.  */
998
          continue;
999
        }
1000
 
1001
      /* Look for a R_SH_COUNT reloc on the location where the
1002
         function address is stored.  Do this before deleting any
1003
         bytes, to avoid confusion about the address.  */
1004
      for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
1005
        if (irelcount->r_offset == paddr
1006
            && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
1007
          break;
1008
 
1009
      /* Delete the register load.  */
1010
      if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
1011
        goto error_return;
1012
 
1013
      /* That will change things, so, just in case it permits some
1014
         other function call to come within range, we should relax
1015
         again.  Note that this is not required, and it may be slow.  */
1016
      *again = true;
1017
 
1018
      /* Now check whether we got a COUNT reloc.  */
1019
      if (irelcount >= irelend)
1020
        {
1021
          ((*_bfd_error_handler)
1022
           (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
1023
            bfd_get_filename (abfd), (unsigned long) paddr));
1024
          continue;
1025
        }
1026
 
1027
      /* The number of uses is stored in the r_addend field.  We've
1028
         just deleted one.  */
1029
      if (irelcount->r_addend == 0)
1030
        {
1031
          ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
1032
                                  bfd_get_filename (abfd),
1033
                                  (unsigned long) paddr));
1034
          continue;
1035
        }
1036
 
1037
      --irelcount->r_addend;
1038
 
1039
      /* If there are no more uses, we can delete the address.  Reload
1040
         the address from irelfn, in case it was changed by the
1041
         previous call to sh_elf_relax_delete_bytes.  */
1042
      if (irelcount->r_addend == 0)
1043
        {
1044
          if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
1045
            goto error_return;
1046
        }
1047
 
1048
      /* We've done all we can with that function call.  */
1049
    }
1050
 
1051
  /* Look for load and store instructions that we can align on four
1052
     byte boundaries.  */
1053
  if (have_code)
1054
    {
1055
      boolean swapped;
1056
 
1057
      /* Get the section contents.  */
1058
      if (contents == NULL)
1059
        {
1060
          if (elf_section_data (sec)->this_hdr.contents != NULL)
1061
            contents = elf_section_data (sec)->this_hdr.contents;
1062
          else
1063
            {
1064
              contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1065
              if (contents == NULL)
1066
                goto error_return;
1067
              free_contents = contents;
1068
 
1069
              if (! bfd_get_section_contents (abfd, sec, contents,
1070
                                              (file_ptr) 0, sec->_raw_size))
1071
                goto error_return;
1072
            }
1073
        }
1074
 
1075
      if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
1076
                                &swapped))
1077
        goto error_return;
1078
 
1079
      if (swapped)
1080
        {
1081
          elf_section_data (sec)->relocs = internal_relocs;
1082
          free_relocs = NULL;
1083
 
1084
          elf_section_data (sec)->this_hdr.contents = contents;
1085
          free_contents = NULL;
1086
 
1087
          symtab_hdr->contents = (bfd_byte *) extsyms;
1088
          free_extsyms = NULL;
1089
        }
1090
    }
1091
 
1092
  if (free_relocs != NULL)
1093
    {
1094
      free (free_relocs);
1095
      free_relocs = NULL;
1096
    }
1097
 
1098
  if (free_contents != NULL)
1099
    {
1100
      if (! link_info->keep_memory)
1101
        free (free_contents);
1102
      else
1103
        {
1104
          /* Cache the section contents for elf_link_input_bfd.  */
1105
          elf_section_data (sec)->this_hdr.contents = contents;
1106
        }
1107
      free_contents = NULL;
1108
    }
1109
 
1110
  if (free_extsyms != NULL)
1111
    {
1112
      if (! link_info->keep_memory)
1113
        free (free_extsyms);
1114
      else
1115
        {
1116
          /* Cache the symbols for elf_link_input_bfd.  */
1117
          symtab_hdr->contents = extsyms;
1118
        }
1119
      free_extsyms = NULL;
1120
    }
1121
 
1122
  return true;
1123
 
1124
 error_return:
1125
  if (free_relocs != NULL)
1126
    free (free_relocs);
1127
  if (free_contents != NULL)
1128
    free (free_contents);
1129
  if (free_extsyms != NULL)
1130
    free (free_extsyms);
1131
  return false;
1132
}
1133
 
1134
/* Delete some bytes from a section while relaxing.  FIXME: There is a
1135
   lot of duplication between this function and sh_relax_delete_bytes
1136
   in coff-sh.c.  */
1137
 
1138
static boolean
1139
sh_elf_relax_delete_bytes (abfd, sec, addr, count)
1140
     bfd *abfd;
1141
     asection *sec;
1142
     bfd_vma addr;
1143
     int count;
1144
{
1145
  Elf_Internal_Shdr *symtab_hdr;
1146
  Elf32_External_Sym *extsyms;
1147
  int shndx, index;
1148
  bfd_byte *contents;
1149
  Elf_Internal_Rela *irel, *irelend;
1150
  Elf_Internal_Rela *irelalign;
1151
  bfd_vma toaddr;
1152
  Elf32_External_Sym *esym, *esymend;
1153
  struct elf_link_hash_entry *sym_hash;
1154
  asection *o;
1155
 
1156
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1157
  extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1158
 
1159
  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1160
 
1161
  contents = elf_section_data (sec)->this_hdr.contents;
1162
 
1163
  /* The deletion must stop at the next ALIGN reloc for an aligment
1164
     power larger than the number of bytes we are deleting.  */
1165
 
1166
  irelalign = NULL;
1167
  toaddr = sec->_cooked_size;
1168
 
1169
  irel = elf_section_data (sec)->relocs;
1170
  irelend = irel + sec->reloc_count;
1171
  for (; irel < irelend; irel++)
1172
    {
1173
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1174
          && irel->r_offset > addr
1175
          && count < (1 << irel->r_addend))
1176
        {
1177
          irelalign = irel;
1178
          toaddr = irel->r_offset;
1179
          break;
1180
        }
1181
    }
1182
 
1183
  /* Actually delete the bytes.  */
1184
  memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1185
  if (irelalign == NULL)
1186
    sec->_cooked_size -= count;
1187
  else
1188
    {
1189
      int i;
1190
 
1191
#define NOP_OPCODE (0x0009)
1192
 
1193
      BFD_ASSERT ((count & 1) == 0);
1194
      for (i = 0; i < count; i += 2)
1195
        bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
1196
    }
1197
 
1198
  /* Adjust all the relocs.  */
1199
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1200
    {
1201
      bfd_vma nraddr, stop;
1202
      bfd_vma start = 0;
1203
      int insn = 0;
1204
      Elf_Internal_Sym sym;
1205
      int off, adjust, oinsn;
1206
      bfd_signed_vma voff = 0;
1207
      boolean overflow;
1208
 
1209
      /* Get the new reloc address.  */
1210
      nraddr = irel->r_offset;
1211
      if ((irel->r_offset > addr
1212
           && irel->r_offset < toaddr)
1213
          || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1214
              && irel->r_offset == toaddr))
1215
        nraddr -= count;
1216
 
1217
      /* See if this reloc was for the bytes we have deleted, in which
1218
         case we no longer care about it.  Don't delete relocs which
1219
         represent addresses, though.  */
1220
      if (irel->r_offset >= addr
1221
          && irel->r_offset < addr + count
1222
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
1223
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
1224
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
1225
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
1226
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1227
                                     (int) R_SH_NONE);
1228
 
1229
      /* If this is a PC relative reloc, see if the range it covers
1230
         includes the bytes we have deleted.  */
1231
      switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1232
        {
1233
        default:
1234
          break;
1235
 
1236
        case R_SH_DIR8WPN:
1237
        case R_SH_IND12W:
1238
        case R_SH_DIR8WPZ:
1239
        case R_SH_DIR8WPL:
1240
          start = irel->r_offset;
1241
          insn = bfd_get_16 (abfd, contents + nraddr);
1242
          break;
1243
        }
1244
 
1245
      switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1246
        {
1247
        default:
1248
          start = stop = addr;
1249
          break;
1250
 
1251
        case R_SH_DIR32:
1252
          /* If this reloc is against a symbol defined in this
1253
             section, and the symbol will not be adjusted below, we
1254
             must check the addend to see it will put the value in
1255
             range to be adjusted, and hence must be changed.  */
1256
          if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1257
            {
1258
              bfd_elf32_swap_symbol_in (abfd,
1259
                                        extsyms + ELF32_R_SYM (irel->r_info),
1260
                                        &sym);
1261
              if (sym.st_shndx == shndx
1262
                  && (sym.st_value <= addr
1263
                      || sym.st_value >= toaddr))
1264
                {
1265
                  bfd_vma val;
1266
 
1267
                  val = bfd_get_32 (abfd, contents + nraddr);
1268
                  val += sym.st_value;
1269
                  if (val > addr && val < toaddr)
1270
                    bfd_put_32 (abfd, val - count, contents + nraddr);
1271
                }
1272
            }
1273
          start = stop = addr;
1274
          break;
1275
 
1276
        case R_SH_DIR8WPN:
1277
          off = insn & 0xff;
1278
          if (off & 0x80)
1279
            off -= 0x100;
1280
          stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1281
          break;
1282
 
1283
        case R_SH_IND12W:
1284
          if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
1285
            start = stop = addr;
1286
          else
1287
            {
1288
              off = insn & 0xfff;
1289
              if (off & 0x800)
1290
                off -= 0x1000;
1291
              stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1292
            }
1293
          break;
1294
 
1295
        case R_SH_DIR8WPZ:
1296
          off = insn & 0xff;
1297
          stop = start + 4 + off * 2;
1298
          break;
1299
 
1300
        case R_SH_DIR8WPL:
1301
          off = insn & 0xff;
1302
          stop = (start &~ (bfd_vma) 3) + 4 + off * 4;
1303
          break;
1304
 
1305
        case R_SH_SWITCH8:
1306
        case R_SH_SWITCH16:
1307
        case R_SH_SWITCH32:
1308
          /* These relocs types represent
1309
               .word L2-L1
1310
             The r_addend field holds the difference between the reloc
1311
             address and L1.  That is the start of the reloc, and
1312
             adding in the contents gives us the top.  We must adjust
1313
             both the r_offset field and the section contents.
1314
             N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
1315
             and the elf bfd r_offset is called r_vaddr.  */
1316
 
1317
          stop = irel->r_offset;
1318
          start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
1319
 
1320
          if (start > addr
1321
              && start < toaddr
1322
              && (stop <= addr || stop >= toaddr))
1323
            irel->r_addend += count;
1324
          else if (stop > addr
1325
                   && stop < toaddr
1326
                   && (start <= addr || start >= toaddr))
1327
            irel->r_addend -= count;
1328
 
1329
          if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1330
            voff = bfd_get_signed_16 (abfd, contents + nraddr);
1331
          else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1332
            voff = bfd_get_8 (abfd, contents + nraddr);
1333
          else
1334
            voff = bfd_get_signed_32 (abfd, contents + nraddr);
1335
          stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1336
 
1337
          break;
1338
 
1339
        case R_SH_USES:
1340
          start = irel->r_offset;
1341
          stop = (bfd_vma) ((bfd_signed_vma) start
1342
                            + (long) irel->r_addend
1343
                            + 4);
1344
          break;
1345
        }
1346
 
1347
      if (start > addr
1348
          && start < toaddr
1349
          && (stop <= addr || stop >= toaddr))
1350
        adjust = count;
1351
      else if (stop > addr
1352
               && stop < toaddr
1353
               && (start <= addr || start >= toaddr))
1354
        adjust = - count;
1355
      else
1356
        adjust = 0;
1357
 
1358
      if (adjust != 0)
1359
        {
1360
          oinsn = insn;
1361
          overflow = false;
1362
          switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1363
            {
1364
            default:
1365
              abort ();
1366
              break;
1367
 
1368
            case R_SH_DIR8WPN:
1369
            case R_SH_DIR8WPZ:
1370
              insn += adjust / 2;
1371
              if ((oinsn & 0xff00) != (insn & 0xff00))
1372
                overflow = true;
1373
              bfd_put_16 (abfd, insn, contents + nraddr);
1374
              break;
1375
 
1376
            case R_SH_IND12W:
1377
              insn += adjust / 2;
1378
              if ((oinsn & 0xf000) != (insn & 0xf000))
1379
                overflow = true;
1380
              bfd_put_16 (abfd, insn, contents + nraddr);
1381
              break;
1382
 
1383
            case R_SH_DIR8WPL:
1384
              BFD_ASSERT (adjust == count || count >= 4);
1385
              if (count >= 4)
1386
                insn += adjust / 4;
1387
              else
1388
                {
1389
                  if ((irel->r_offset & 3) == 0)
1390
                    ++insn;
1391
                }
1392
              if ((oinsn & 0xff00) != (insn & 0xff00))
1393
                overflow = true;
1394
              bfd_put_16 (abfd, insn, contents + nraddr);
1395
              break;
1396
 
1397
            case R_SH_SWITCH16:
1398
              voff += adjust;
1399
              if (voff < - 0x8000 || voff >= 0x8000)
1400
                overflow = true;
1401
              bfd_put_signed_16 (abfd, voff, contents + nraddr);
1402
              break;
1403
 
1404
            case R_SH_SWITCH32:
1405
              voff += adjust;
1406
              bfd_put_signed_32 (abfd, voff, contents + nraddr);
1407
              break;
1408
 
1409
            case R_SH_USES:
1410
              irel->r_addend += adjust;
1411
              break;
1412
            }
1413
 
1414
          if (overflow)
1415
            {
1416
              ((*_bfd_error_handler)
1417
               (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1418
                bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1419
              bfd_set_error (bfd_error_bad_value);
1420
              return false;
1421
            }
1422
        }
1423
 
1424
      irel->r_offset = nraddr;
1425
    }
1426
 
1427
  /* Look through all the other sections.  If there contain any IMM32
1428
     relocs against internal symbols which we are not going to adjust
1429
     below, we may need to adjust the addends.  */
1430
  for (o = abfd->sections; o != NULL; o = o->next)
1431
    {
1432
      Elf_Internal_Rela *internal_relocs;
1433
      Elf_Internal_Rela *irelscan, *irelscanend;
1434
      bfd_byte *ocontents;
1435
 
1436
      if (o == sec
1437
          || (o->flags & SEC_RELOC) == 0
1438
          || o->reloc_count == 0)
1439
        continue;
1440
 
1441
      /* We always cache the relocs.  Perhaps, if info->keep_memory is
1442
         false, we should free them, if we are permitted to, when we
1443
         leave sh_coff_relax_section.  */
1444
      internal_relocs = (_bfd_elf32_link_read_relocs
1445
                         (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1446
                          true));
1447
      if (internal_relocs == NULL)
1448
        return false;
1449
 
1450
      ocontents = NULL;
1451
      irelscanend = internal_relocs + o->reloc_count;
1452
      for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1453
        {
1454
          Elf_Internal_Sym sym;
1455
 
1456
          /* Dwarf line numbers use R_SH_SWITCH32 relocs.  */
1457
          if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
1458
            {
1459
              bfd_vma start, stop;
1460
              bfd_signed_vma voff;
1461
 
1462
              if (ocontents == NULL)
1463
                {
1464
                  if (elf_section_data (o)->this_hdr.contents != NULL)
1465
                    ocontents = elf_section_data (o)->this_hdr.contents;
1466
                  else
1467
                    {
1468
                      /* We always cache the section contents.
1469
                         Perhaps, if info->keep_memory is false, we
1470
                         should free them, if we are permitted to,
1471
                         when we leave sh_coff_relax_section.  */
1472
                      ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1473
                      if (ocontents == NULL)
1474
                        return false;
1475
                      if (! bfd_get_section_contents (abfd, o, ocontents,
1476
                                                      (file_ptr) 0,
1477
                                                      o->_raw_size))
1478
                        return false;
1479
                      elf_section_data (o)->this_hdr.contents = ocontents;
1480
                    }
1481
                }
1482
 
1483
              stop = irelscan->r_offset;
1484
              start
1485
                = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
1486
 
1487
              /* STOP is in a different section, so it won't change.  */
1488
              if (start > addr && start < toaddr)
1489
                irelscan->r_addend += count;
1490
 
1491
              voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
1492
              stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1493
 
1494
              if (start > addr
1495
                  && start < toaddr
1496
                  && (stop <= addr || stop >= toaddr))
1497
                bfd_put_signed_32 (abfd, voff + count,
1498
                                   ocontents + irelscan->r_offset);
1499
              else if (stop > addr
1500
                       && stop < toaddr
1501
                       && (start <= addr || start >= toaddr))
1502
                bfd_put_signed_32 (abfd, voff - count,
1503
                                   ocontents + irelscan->r_offset);
1504
            }
1505
 
1506
          if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1507
            continue;
1508
 
1509
          if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1510
            continue;
1511
 
1512
          bfd_elf32_swap_symbol_in (abfd,
1513
                                    extsyms + ELF32_R_SYM (irelscan->r_info),
1514
                                    &sym);
1515
 
1516
          if (sym.st_shndx == shndx
1517
              && (sym.st_value <= addr
1518
                  || sym.st_value >= toaddr))
1519
            {
1520
              bfd_vma val;
1521
 
1522
              if (ocontents == NULL)
1523
                {
1524
                  if (elf_section_data (o)->this_hdr.contents != NULL)
1525
                    ocontents = elf_section_data (o)->this_hdr.contents;
1526
                  else
1527
                    {
1528
                      /* We always cache the section contents.
1529
                         Perhaps, if info->keep_memory is false, we
1530
                         should free them, if we are permitted to,
1531
                         when we leave sh_coff_relax_section.  */
1532
                      ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1533
                      if (ocontents == NULL)
1534
                        return false;
1535
                      if (! bfd_get_section_contents (abfd, o, ocontents,
1536
                                                      (file_ptr) 0,
1537
                                                      o->_raw_size))
1538
                        return false;
1539
                      elf_section_data (o)->this_hdr.contents = ocontents;
1540
                    }
1541
                }
1542
 
1543
              val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1544
              val += sym.st_value;
1545
              if (val > addr && val < toaddr)
1546
                bfd_put_32 (abfd, val - count,
1547
                            ocontents + irelscan->r_offset);
1548
            }
1549
        }
1550
    }
1551
 
1552
  /* Adjust the local symbols defined in this section.  */
1553
  esym = extsyms;
1554
  esymend = esym + symtab_hdr->sh_info;
1555
  for (; esym < esymend; esym++)
1556
    {
1557
      Elf_Internal_Sym isym;
1558
 
1559
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1560
 
1561
      if (isym.st_shndx == shndx
1562
          && isym.st_value > addr
1563
          && isym.st_value < toaddr)
1564
        {
1565
          isym.st_value -= count;
1566
          bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1567
        }
1568
    }
1569
 
1570
  /* Now adjust the global symbols defined in this section.  */
1571
  esym = extsyms + symtab_hdr->sh_info;
1572
  esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1573
  for (index = 0; esym < esymend; esym++, index++)
1574
    {
1575
      Elf_Internal_Sym isym;
1576
 
1577
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1578
      sym_hash = elf_sym_hashes (abfd)[index];
1579
      if (isym.st_shndx == shndx
1580
          && ((sym_hash)->root.type == bfd_link_hash_defined
1581
              || (sym_hash)->root.type == bfd_link_hash_defweak)
1582
          && (sym_hash)->root.u.def.section == sec
1583
          && (sym_hash)->root.u.def.value > addr
1584
          && (sym_hash)->root.u.def.value < toaddr)
1585
        {
1586
          (sym_hash)->root.u.def.value -= count;
1587
        }
1588
    }
1589
 
1590
  /* See if we can move the ALIGN reloc forward.  We have adjusted
1591
     r_offset for it already.  */
1592
  if (irelalign != NULL)
1593
    {
1594
      bfd_vma alignto, alignaddr;
1595
 
1596
      alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1597
      alignaddr = BFD_ALIGN (irelalign->r_offset,
1598
                             1 << irelalign->r_addend);
1599
      if (alignto != alignaddr)
1600
        {
1601
          /* Tail recursion.  */
1602
          return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1603
                                            alignto - alignaddr);
1604
        }
1605
    }
1606
 
1607
  return true;
1608
}
1609
 
1610
/* Look for loads and stores which we can align to four byte
1611
   boundaries.  This is like sh_align_loads in coff-sh.c.  */
1612
 
1613
static boolean
1614
sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped)
1615
     bfd *abfd;
1616
     asection *sec;
1617
     Elf_Internal_Rela *internal_relocs;
1618
     bfd_byte *contents;
1619
     boolean *pswapped;
1620
{
1621
  Elf_Internal_Rela *irel, *irelend;
1622
  bfd_vma *labels = NULL;
1623
  bfd_vma *label, *label_end;
1624
 
1625
  *pswapped = false;
1626
 
1627
  irelend = internal_relocs + sec->reloc_count;
1628
 
1629
  /* Get all the addresses with labels on them.  */
1630
  labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
1631
  if (labels == NULL)
1632
    goto error_return;
1633
  label_end = labels;
1634
  for (irel = internal_relocs; irel < irelend; irel++)
1635
    {
1636
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1637
        {
1638
          *label_end = irel->r_offset;
1639
          ++label_end;
1640
        }
1641
    }
1642
 
1643
  /* Note that the assembler currently always outputs relocs in
1644
     address order.  If that ever changes, this code will need to sort
1645
     the label values and the relocs.  */
1646
 
1647
  label = labels;
1648
 
1649
  for (irel = internal_relocs; irel < irelend; irel++)
1650
    {
1651
      bfd_vma start, stop;
1652
 
1653
      if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1654
        continue;
1655
 
1656
      start = irel->r_offset;
1657
 
1658
      for (irel++; irel < irelend; irel++)
1659
        if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1660
          break;
1661
      if (irel < irelend)
1662
        stop = irel->r_offset;
1663
      else
1664
        stop = sec->_cooked_size;
1665
 
1666
      if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1667
                                     (PTR) internal_relocs, &label,
1668
                                     label_end, start, stop, pswapped))
1669
        goto error_return;
1670
    }
1671
 
1672
  free (labels);
1673
 
1674
  return true;
1675
 
1676
 error_return:
1677
  if (labels != NULL)
1678
    free (labels);
1679
  return false;
1680
}
1681
 
1682
/* Swap two SH instructions.  This is like sh_swap_insns in coff-sh.c.  */
1683
 
1684
static boolean
1685
sh_elf_swap_insns (abfd, sec, relocs, contents, addr)
1686
     bfd *abfd;
1687
     asection *sec;
1688
     PTR relocs;
1689
     bfd_byte *contents;
1690
     bfd_vma addr;
1691
{
1692
  Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1693
  unsigned short i1, i2;
1694
  Elf_Internal_Rela *irel, *irelend;
1695
 
1696
  /* Swap the instructions themselves.  */
1697
  i1 = bfd_get_16 (abfd, contents + addr);
1698
  i2 = bfd_get_16 (abfd, contents + addr + 2);
1699
  bfd_put_16 (abfd, i2, contents + addr);
1700
  bfd_put_16 (abfd, i1, contents + addr + 2);
1701
 
1702
  /* Adjust all reloc addresses.  */
1703
  irelend = internal_relocs + sec->reloc_count;
1704
  for (irel = internal_relocs; irel < irelend; irel++)
1705
    {
1706
      enum elf_sh_reloc_type type;
1707
      int add;
1708
 
1709
      /* There are a few special types of relocs that we don't want to
1710
         adjust.  These relocs do not apply to the instruction itself,
1711
         but are only associated with the address.  */
1712
      type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1713
      if (type == R_SH_ALIGN
1714
          || type == R_SH_CODE
1715
          || type == R_SH_DATA
1716
          || type == R_SH_LABEL)
1717
        continue;
1718
 
1719
      /* If an R_SH_USES reloc points to one of the addresses being
1720
         swapped, we must adjust it.  It would be incorrect to do this
1721
         for a jump, though, since we want to execute both
1722
         instructions after the jump.  (We have avoided swapping
1723
         around a label, so the jump will not wind up executing an
1724
         instruction it shouldn't).  */
1725
      if (type == R_SH_USES)
1726
        {
1727
          bfd_vma off;
1728
 
1729
          off = irel->r_offset + 4 + irel->r_addend;
1730
          if (off == addr)
1731
            irel->r_offset += 2;
1732
          else if (off == addr + 2)
1733
            irel->r_offset -= 2;
1734
        }
1735
 
1736
      if (irel->r_offset == addr)
1737
        {
1738
          irel->r_offset += 2;
1739
          add = -2;
1740
        }
1741
      else if (irel->r_offset == addr + 2)
1742
        {
1743
          irel->r_offset -= 2;
1744
          add = 2;
1745
        }
1746
      else
1747
        add = 0;
1748
 
1749
      if (add != 0)
1750
        {
1751
          bfd_byte *loc;
1752
          unsigned short insn, oinsn;
1753
          boolean overflow;
1754
 
1755
          loc = contents + irel->r_offset;
1756
          overflow = false;
1757
          switch (type)
1758
            {
1759
            default:
1760
              break;
1761
 
1762
            case R_SH_DIR8WPN:
1763
            case R_SH_DIR8WPZ:
1764
              insn = bfd_get_16 (abfd, loc);
1765
              oinsn = insn;
1766
              insn += add / 2;
1767
              if ((oinsn & 0xff00) != (insn & 0xff00))
1768
                overflow = true;
1769
              bfd_put_16 (abfd, insn, loc);
1770
              break;
1771
 
1772
            case R_SH_IND12W:
1773
              insn = bfd_get_16 (abfd, loc);
1774
              oinsn = insn;
1775
              insn += add / 2;
1776
              if ((oinsn & 0xf000) != (insn & 0xf000))
1777
                overflow = true;
1778
              bfd_put_16 (abfd, insn, loc);
1779
              break;
1780
 
1781
            case R_SH_DIR8WPL:
1782
              /* This reloc ignores the least significant 3 bits of
1783
                 the program counter before adding in the offset.
1784
                 This means that if ADDR is at an even address, the
1785
                 swap will not affect the offset.  If ADDR is an at an
1786
                 odd address, then the instruction will be crossing a
1787
                 four byte boundary, and must be adjusted.  */
1788
              if ((addr & 3) != 0)
1789
                {
1790
                  insn = bfd_get_16 (abfd, loc);
1791
                  oinsn = insn;
1792
                  insn += add / 2;
1793
                  if ((oinsn & 0xff00) != (insn & 0xff00))
1794
                    overflow = true;
1795
                  bfd_put_16 (abfd, insn, loc);
1796
                }
1797
 
1798
              break;
1799
            }
1800
 
1801
          if (overflow)
1802
            {
1803
              ((*_bfd_error_handler)
1804
               (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1805
                bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1806
              bfd_set_error (bfd_error_bad_value);
1807
              return false;
1808
            }
1809
        }
1810
    }
1811
 
1812
  return true;
1813
}
1814
 
1815
/* Relocate an SH ELF section.  */
1816
 
1817
static boolean
1818
sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1819
                         contents, relocs, local_syms, local_sections)
1820
     bfd *output_bfd ATTRIBUTE_UNUSED;
1821
     struct bfd_link_info *info;
1822
     bfd *input_bfd;
1823
     asection *input_section;
1824
     bfd_byte *contents;
1825
     Elf_Internal_Rela *relocs;
1826
     Elf_Internal_Sym *local_syms;
1827
     asection **local_sections;
1828
{
1829
  Elf_Internal_Shdr *symtab_hdr;
1830
  struct elf_link_hash_entry **sym_hashes;
1831
  Elf_Internal_Rela *rel, *relend;
1832
 
1833
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1834
  sym_hashes = elf_sym_hashes (input_bfd);
1835
 
1836
  rel = relocs;
1837
  relend = relocs + input_section->reloc_count;
1838
  for (; rel < relend; rel++)
1839
    {
1840
      int r_type;
1841
      reloc_howto_type *howto;
1842
      unsigned long r_symndx;
1843
      Elf_Internal_Sym *sym;
1844
      asection *sec;
1845
      struct elf_link_hash_entry *h;
1846
      bfd_vma relocation;
1847
      bfd_vma addend = (bfd_vma)0;
1848
      bfd_reloc_status_type r;
1849
 
1850
      r_symndx = ELF32_R_SYM (rel->r_info);
1851
 
1852
      if (info->relocateable)
1853
        {
1854
          /* This is a relocateable link.  We don't have to change
1855
             anything, unless the reloc is against a section symbol,
1856
             in which case we have to adjust according to where the
1857
             section symbol winds up in the output section.  */
1858
          if (r_symndx < symtab_hdr->sh_info)
1859
            {
1860
              sym = local_syms + r_symndx;
1861
              if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1862
                {
1863
                  sec = local_sections[r_symndx];
1864
                  rel->r_addend += sec->output_offset + sym->st_value;
1865
                }
1866
            }
1867
 
1868
          continue;
1869
        }
1870
 
1871
      r_type = ELF32_R_TYPE (rel->r_info);
1872
 
1873
      /* Many of the relocs are only used for relaxing, and are
1874
         handled entirely by the relaxation code.  */
1875
      if (r_type > (int) R_SH_LAST_INVALID_RELOC
1876
          && r_type < (int) R_SH_LOOP_START)
1877
        continue;
1878
 
1879
      if (r_type < 0
1880
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
1881
              && r_type <= (int) R_SH_LAST_INVALID_RELOC))
1882
        {
1883
          bfd_set_error (bfd_error_bad_value);
1884
          return false;
1885
        }
1886
 
1887
      /* FIXME: This is certainly incorrect.  However, it is how the
1888
         COFF linker works.  */
1889
      if (r_type != (int) R_SH_DIR32
1890
          && r_type != (int) R_SH_IND12W
1891
          && r_type != (int) R_SH_LOOP_START
1892
          && r_type != (int) R_SH_LOOP_END)
1893
        continue;
1894
 
1895
      howto = sh_elf_howto_table + r_type;
1896
 
1897
      /* This is a final link.  */
1898
      h = NULL;
1899
      sym = NULL;
1900
      sec = NULL;
1901
      if (r_symndx < symtab_hdr->sh_info)
1902
        {
1903
          /* There is nothing to be done for an internal IND12W
1904
             relocation.  FIXME: This is probably wrong, but it's how
1905
             the COFF relocations work.  */
1906
          if (r_type == (int) R_SH_IND12W)
1907
            continue;
1908
          sym = local_syms + r_symndx;
1909
          sec = local_sections[r_symndx];
1910
          relocation = (sec->output_section->vma
1911
                        + sec->output_offset
1912
                        + sym->st_value);
1913
        }
1914
      else
1915
        {
1916
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1917
          while (h->root.type == bfd_link_hash_indirect
1918
                 || h->root.type == bfd_link_hash_warning)
1919
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
1920
          if (h->root.type == bfd_link_hash_defined
1921
              || h->root.type == bfd_link_hash_defweak)
1922
            {
1923
              sec = h->root.u.def.section;
1924
              relocation = (h->root.u.def.value
1925
                            + sec->output_section->vma
1926
                            + sec->output_offset);
1927
            }
1928
          else if (h->root.type == bfd_link_hash_undefweak)
1929
            relocation = 0;
1930
          else
1931
            {
1932
              if (! ((*info->callbacks->undefined_symbol)
1933
                     (info, h->root.root.string, input_bfd,
1934
                      input_section, rel->r_offset, true)))
1935
                return false;
1936
              relocation = 0;
1937
            }
1938
        }
1939
 
1940
      /* FIXME: This is how the COFF relocations work.  */
1941
      if (r_type == (int) R_SH_IND12W)
1942
        relocation -= 4;
1943
 
1944
      switch ((int)r_type)
1945
        {
1946
        case (int)R_SH_DIR32:
1947
          addend = rel->r_addend;
1948
          /* Fall through.  */
1949
        default:
1950
          /* COFF relocs don't use the addend. The addend is used for
1951
             R_SH_DIR32 to be compatible with other compilers. */
1952
          r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1953
                                        contents, rel->r_offset,
1954
                                        relocation, addend);
1955
          break;
1956
        case R_SH_LOOP_START:
1957
          {
1958
            static bfd_vma start, end;
1959
 
1960
            start = (relocation + rel->r_addend
1961
                     - (sec->output_section->vma + sec->output_offset));
1962
            r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
1963
                                   rel->r_offset, sec, start, end);
1964
            break;
1965
        case R_SH_LOOP_END:
1966
            end = (relocation + rel->r_addend
1967
                   - (sec->output_section->vma + sec->output_offset));
1968
            r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
1969
                                   rel->r_offset, sec, start, end);
1970
            break;
1971
          }
1972
        }
1973
 
1974
      if (r != bfd_reloc_ok)
1975
        {
1976
          switch (r)
1977
            {
1978
            default:
1979
            case bfd_reloc_outofrange:
1980
              abort ();
1981
            case bfd_reloc_overflow:
1982
              {
1983
                const char *name;
1984
 
1985
                if (h != NULL)
1986
                  name = h->root.root.string;
1987
                else
1988
                  {
1989
                    name = (bfd_elf_string_from_elf_section
1990
                            (input_bfd, symtab_hdr->sh_link, sym->st_name));
1991
                    if (name == NULL)
1992
                      return false;
1993
                    if (*name == '\0')
1994
                      name = bfd_section_name (input_bfd, sec);
1995
                  }
1996
                if (! ((*info->callbacks->reloc_overflow)
1997
                       (info, name, howto->name, (bfd_vma) 0,
1998
                        input_bfd, input_section, rel->r_offset)))
1999
                  return false;
2000
              }
2001
              break;
2002
            }
2003
        }
2004
    }
2005
 
2006
  return true;
2007
}
2008
 
2009
/* This is a version of bfd_generic_get_relocated_section_contents
2010
   which uses sh_elf_relocate_section.  */
2011
 
2012
static bfd_byte *
2013
sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
2014
                                        data, relocateable, symbols)
2015
     bfd *output_bfd;
2016
     struct bfd_link_info *link_info;
2017
     struct bfd_link_order *link_order;
2018
     bfd_byte *data;
2019
     boolean relocateable;
2020
     asymbol **symbols;
2021
{
2022
  Elf_Internal_Shdr *symtab_hdr;
2023
  asection *input_section = link_order->u.indirect.section;
2024
  bfd *input_bfd = input_section->owner;
2025
  asection **sections = NULL;
2026
  Elf_Internal_Rela *internal_relocs = NULL;
2027
  Elf32_External_Sym *external_syms = NULL;
2028
  Elf_Internal_Sym *internal_syms = NULL;
2029
 
2030
  /* We only need to handle the case of relaxing, or of having a
2031
     particular set of section contents, specially.  */
2032
  if (relocateable
2033
      || elf_section_data (input_section)->this_hdr.contents == NULL)
2034
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2035
                                                       link_order, data,
2036
                                                       relocateable,
2037
                                                       symbols);
2038
 
2039
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2040
 
2041
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2042
          input_section->_raw_size);
2043
 
2044
  if ((input_section->flags & SEC_RELOC) != 0
2045
      && input_section->reloc_count > 0)
2046
    {
2047
      Elf_Internal_Sym *isymp;
2048
      asection **secpp;
2049
      Elf32_External_Sym *esym, *esymend;
2050
 
2051
      if (symtab_hdr->contents != NULL)
2052
        external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
2053
      else
2054
        {
2055
          external_syms = ((Elf32_External_Sym *)
2056
                           bfd_malloc (symtab_hdr->sh_info
2057
                                       * sizeof (Elf32_External_Sym)));
2058
          if (external_syms == NULL && symtab_hdr->sh_info > 0)
2059
            goto error_return;
2060
          if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2061
              || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
2062
                            symtab_hdr->sh_info, input_bfd)
2063
                  != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
2064
            goto error_return;
2065
        }
2066
 
2067
      internal_relocs = (_bfd_elf32_link_read_relocs
2068
                         (input_bfd, input_section, (PTR) NULL,
2069
                          (Elf_Internal_Rela *) NULL, false));
2070
      if (internal_relocs == NULL)
2071
        goto error_return;
2072
 
2073
      internal_syms = ((Elf_Internal_Sym *)
2074
                       bfd_malloc (symtab_hdr->sh_info
2075
                                   * sizeof (Elf_Internal_Sym)));
2076
      if (internal_syms == NULL && symtab_hdr->sh_info > 0)
2077
        goto error_return;
2078
 
2079
      sections = (asection **) bfd_malloc (symtab_hdr->sh_info
2080
                                           * sizeof (asection *));
2081
      if (sections == NULL && symtab_hdr->sh_info > 0)
2082
        goto error_return;
2083
 
2084
      isymp = internal_syms;
2085
      secpp = sections;
2086
      esym = external_syms;
2087
      esymend = esym + symtab_hdr->sh_info;
2088
      for (; esym < esymend; ++esym, ++isymp, ++secpp)
2089
        {
2090
          asection *isec;
2091
 
2092
          bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
2093
 
2094
          if (isymp->st_shndx == SHN_UNDEF)
2095
            isec = bfd_und_section_ptr;
2096
          else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
2097
            isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
2098
          else if (isymp->st_shndx == SHN_ABS)
2099
            isec = bfd_abs_section_ptr;
2100
          else if (isymp->st_shndx == SHN_COMMON)
2101
            isec = bfd_com_section_ptr;
2102
          else
2103
            {
2104
              /* Who knows?  */
2105
              isec = NULL;
2106
            }
2107
 
2108
          *secpp = isec;
2109
        }
2110
 
2111
      if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
2112
                                     input_section, data, internal_relocs,
2113
                                     internal_syms, sections))
2114
        goto error_return;
2115
 
2116
      if (sections != NULL)
2117
        free (sections);
2118
      sections = NULL;
2119
      if (internal_syms != NULL)
2120
        free (internal_syms);
2121
      internal_syms = NULL;
2122
      if (external_syms != NULL && symtab_hdr->contents == NULL)
2123
        free (external_syms);
2124
      external_syms = NULL;
2125
      if (internal_relocs != elf_section_data (input_section)->relocs)
2126
        free (internal_relocs);
2127
      internal_relocs = NULL;
2128
    }
2129
 
2130
  return data;
2131
 
2132
 error_return:
2133
  if (internal_relocs != NULL
2134
      && internal_relocs != elf_section_data (input_section)->relocs)
2135
    free (internal_relocs);
2136
  if (external_syms != NULL && symtab_hdr->contents == NULL)
2137
    free (external_syms);
2138
  if (internal_syms != NULL)
2139
    free (internal_syms);
2140
  if (sections != NULL)
2141
    free (sections);
2142
  return NULL;
2143
}
2144
static asection *
2145
sh_elf_gc_mark_hook (abfd, info, rel, h, sym)
2146
       bfd *abfd;
2147
       struct bfd_link_info *info ATTRIBUTE_UNUSED;
2148
       Elf_Internal_Rela *rel;
2149
       struct elf_link_hash_entry *h;
2150
       Elf_Internal_Sym *sym;
2151
{
2152
  if (h != NULL)
2153
    {
2154
      switch (ELF32_R_TYPE (rel->r_info))
2155
      {
2156
      case R_SH_GNU_VTINHERIT:
2157
      case R_SH_GNU_VTENTRY:
2158
        break;
2159
 
2160
      default:
2161
        switch (h->root.type)
2162
          {
2163
          case bfd_link_hash_defined:
2164
          case bfd_link_hash_defweak:
2165
            return h->root.u.def.section;
2166
 
2167
          case bfd_link_hash_common:
2168
            return h->root.u.c.p->section;
2169
 
2170
          default:
2171
            break;
2172
          }
2173
       }
2174
     }
2175
   else
2176
     {
2177
       if (!(elf_bad_symtab (abfd)
2178
           && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
2179
         && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
2180
                && sym->st_shndx != SHN_COMMON))
2181
          {
2182
            return bfd_section_from_elf_index (abfd, sym->st_shndx);
2183
          }
2184
      }
2185
  return NULL;
2186
}
2187
 
2188
static boolean
2189
sh_elf_gc_sweep_hook (abfd, info, sec, relocs)
2190
     bfd *abfd ATTRIBUTE_UNUSED;
2191
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2192
     asection *sec ATTRIBUTE_UNUSED;
2193
     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
2194
{
2195
  /* we don't use got and plt entries for sh. */
2196
  return true;
2197
}
2198
 
2199
/* Look through the relocs for a section during the first phase.
2200
   Since we don't do .gots or .plts, we just need to consider the
2201
   virtual table relocs for gc.  */
2202
 
2203
static boolean
2204
sh_elf_check_relocs (abfd, info, sec, relocs)
2205
     bfd *abfd;
2206
     struct bfd_link_info *info;
2207
     asection *sec;
2208
     const Elf_Internal_Rela *relocs;
2209
{
2210
  Elf_Internal_Shdr *symtab_hdr;
2211
  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2212
  const Elf_Internal_Rela *rel;
2213
  const Elf_Internal_Rela *rel_end;
2214
 
2215
  if (info->relocateable)
2216
    return true;
2217
 
2218
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2219
  sym_hashes = elf_sym_hashes (abfd);
2220
  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
2221
  if (!elf_bad_symtab (abfd))
2222
    sym_hashes_end -= symtab_hdr->sh_info;
2223
 
2224
  rel_end = relocs + sec->reloc_count;
2225
  for (rel = relocs; rel < rel_end; rel++)
2226
    {
2227
      struct elf_link_hash_entry *h;
2228
      unsigned long r_symndx;
2229
 
2230
      r_symndx = ELF32_R_SYM (rel->r_info);
2231
      if (r_symndx < symtab_hdr->sh_info)
2232
        h = NULL;
2233
      else
2234
        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2235
 
2236
      switch (ELF32_R_TYPE (rel->r_info))
2237
        {
2238
        /* This relocation describes the C++ object vtable hierarchy.
2239
           Reconstruct it for later use during GC.  */
2240
        case R_SH_GNU_VTINHERIT:
2241
          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2242
            return false;
2243
          break;
2244
 
2245
        /* This relocation describes which C++ vtable entries are actually
2246
           used.  Record for later use during GC.  */
2247
        case R_SH_GNU_VTENTRY:
2248
          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2249
            return false;
2250
          break;
2251
        }
2252
    }
2253
 
2254
  return true;
2255
}
2256
 
2257
boolean
2258
sh_elf_set_mach_from_flags (abfd)
2259
     bfd *    abfd;
2260
{
2261
  flagword flags = elf_elfheader (abfd)->e_flags;
2262
 
2263
  switch (flags & EF_SH_MACH_MASK)
2264
    {
2265
    case EF_SH1:
2266
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh);
2267
      break;
2268
    case EF_SH2:
2269
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh2);
2270
      break;
2271
    case EF_SH_DSP:
2272
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh_dsp);
2273
      break;
2274
    case EF_SH3:
2275
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3);
2276
      break;
2277
    case EF_SH3_DSP:
2278
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3_dsp);
2279
      break;
2280
    case EF_SH3E:
2281
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3e);
2282
      break;
2283
    case EF_SH_UNKNOWN:
2284
    case EF_SH4:
2285
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh4);
2286
      break;
2287
    default:
2288
      return false;
2289
    }
2290
  return true;
2291
}
2292
 
2293
/* Function to keep SH specific file flags. */
2294
static boolean
2295
sh_elf_set_private_flags (abfd, flags)
2296
     bfd *    abfd;
2297
     flagword flags;
2298
{
2299
  BFD_ASSERT (! elf_flags_init (abfd)
2300
              || elf_elfheader (abfd)->e_flags == flags);
2301
 
2302
  elf_elfheader (abfd)->e_flags = flags;
2303
  elf_flags_init (abfd) = true;
2304
  return sh_elf_set_mach_from_flags (abfd);
2305
}
2306
 
2307
/* Copy backend specific data from one object module to another */
2308
static boolean
2309
sh_elf_copy_private_data (ibfd, obfd)
2310
     bfd * ibfd;
2311
     bfd * obfd;
2312
{
2313
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2314
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2315
    return true;
2316
 
2317
  return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
2318
}
2319
 
2320
/* This routine checks for linking big and little endian objects
2321
   together, and for linking sh-dsp with sh3e / sh4 objects.  */
2322
 
2323
static boolean
2324
sh_elf_merge_private_data (ibfd, obfd)
2325
     bfd *ibfd;
2326
     bfd *obfd;
2327
{
2328
  flagword old_flags, new_flags;
2329
 
2330
  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
2331
    return false;
2332
 
2333
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2334
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2335
    return true;
2336
 
2337
  if (! elf_flags_init (obfd))
2338
    {
2339
      elf_flags_init (obfd) = true;
2340
      elf_elfheader (obfd)->e_flags = 0;
2341
    }
2342
  old_flags = elf_elfheader (obfd)->e_flags;
2343
  new_flags = elf_elfheader (ibfd)->e_flags;
2344
  if ((EF_SH_HAS_DSP (old_flags) && EF_SH_HAS_FP (new_flags))
2345
      || (EF_SH_HAS_DSP (new_flags) && EF_SH_HAS_FP (old_flags)))
2346
    {
2347
      (*_bfd_error_handler)
2348
        ("%s: uses %s instructions while previous modules use %s instructions",
2349
         bfd_get_filename (ibfd),
2350
         EF_SH_HAS_DSP (new_flags) ? "dsp" : "floating point",
2351
         EF_SH_HAS_DSP (new_flags) ? "floating point" : "dsp");
2352
      bfd_set_error (bfd_error_bad_value);
2353
      return false;
2354
    }
2355
  elf_elfheader (obfd)->e_flags = EF_SH_MERGE_MACH (old_flags, new_flags);
2356
 
2357
  return sh_elf_set_mach_from_flags (obfd);
2358
}
2359
 
2360
#define TARGET_BIG_SYM          bfd_elf32_sh_vec
2361
#define TARGET_BIG_NAME         "elf32-sh"
2362
#define TARGET_LITTLE_SYM       bfd_elf32_shl_vec
2363
#define TARGET_LITTLE_NAME      "elf32-shl"
2364
#define ELF_ARCH                bfd_arch_sh
2365
#define ELF_MACHINE_CODE        EM_SH
2366
#define ELF_MAXPAGESIZE         0x1
2367
 
2368
#define elf_symbol_leading_char '_'
2369
 
2370
#define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
2371
#define elf_info_to_howto               sh_elf_info_to_howto
2372
#define bfd_elf32_bfd_relax_section     sh_elf_relax_section
2373
#define elf_backend_relocate_section    sh_elf_relocate_section
2374
#define bfd_elf32_bfd_get_relocated_section_contents \
2375
                                        sh_elf_get_relocated_section_contents
2376
#define elf_backend_object_p            sh_elf_set_mach_from_flags
2377
#define bfd_elf32_bfd_set_private_bfd_flags \
2378
                                        sh_elf_set_private_flags
2379
#define bfd_elf32_bfd_copy_private_bfd_data \
2380
                                        sh_elf_copy_private_data
2381
#define bfd_elf32_bfd_merge_private_bfd_data \
2382
                                        sh_elf_merge_private_data
2383
 
2384
#define elf_backend_gc_mark_hook        sh_elf_gc_mark_hook
2385
#define elf_backend_gc_sweep_hook       sh_elf_gc_sweep_hook
2386
#define elf_backend_check_relocs        sh_elf_check_relocs
2387
 
2388
#define elf_backend_can_gc_sections 1
2389
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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