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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [elf32-sh.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Hitachi SH specific support for 32-bit ELF
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001
3
   Free Software Foundation, Inc.
4
   Contributed by Ian Lance Taylor, Cygnus Support.
5
 
6
This file is part of BFD, the Binary File Descriptor library.
7
 
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
 
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software
20
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
#include "bfd.h"
23
#include "sysdep.h"
24
#include "bfdlink.h"
25
#include "libbfd.h"
26
#include "elf-bfd.h"
27
#include "elf/sh.h"
28
 
29
static bfd_reloc_status_type sh_elf_reloc
30
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
31
static bfd_reloc_status_type sh_elf_ignore_reloc
32
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
33
static reloc_howto_type *sh_elf_reloc_type_lookup
34
  PARAMS ((bfd *, bfd_reloc_code_real_type));
35
static void sh_elf_info_to_howto
36
  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
37
static boolean sh_elf_set_private_flags
38
  PARAMS ((bfd *, flagword));
39
static boolean sh_elf_copy_private_data
40
  PARAMS ((bfd *, bfd *));
41
static boolean sh_elf_merge_private_data
42
  PARAMS ((bfd *, bfd *));
43
static boolean sh_elf_set_mach_from_flags
44
  PARAMS ((bfd *));
45
static boolean sh_elf_relax_section
46
  PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
47
static boolean sh_elf_relax_delete_bytes
48
  PARAMS ((bfd *, asection *, bfd_vma, int));
49
static boolean sh_elf_align_loads
50
  PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, boolean *));
51
static boolean sh_elf_swap_insns
52
  PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
53
static boolean sh_elf_relocate_section
54
  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
55
           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
56
static bfd_byte *sh_elf_get_relocated_section_contents
57
  PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
58
           bfd_byte *, boolean, asymbol **));
59
static boolean sh_elf_check_relocs
60
  PARAMS ((bfd *, struct bfd_link_info *, asection *,
61
           const Elf_Internal_Rela *));
62
static struct bfd_hash_entry *sh_elf_link_hash_newfunc
63
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
64
static struct bfd_link_hash_table *sh_elf_link_hash_table_create
65
  PARAMS ((bfd *));
66
static boolean sh_elf_adjust_dynamic_symbol
67
  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
68
static boolean sh_elf_size_dynamic_sections
69
  PARAMS ((bfd *, struct bfd_link_info *));
70
static boolean sh_elf_finish_dynamic_symbol
71
  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
72
           Elf_Internal_Sym *));
73
static boolean sh_elf_finish_dynamic_sections
74
  PARAMS ((bfd *, struct bfd_link_info *));
75
 
76
/* The name of the dynamic interpreter.  This is put in the .interp
77
   section.  */
78
 
79
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
80
 
81
static reloc_howto_type sh_elf_howto_table[] =
82
{
83
  /* No relocation.  */
84
  HOWTO (R_SH_NONE,             /* type */
85
         0,                      /* rightshift */
86
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
87
         0,                      /* bitsize */
88
         false,                 /* pc_relative */
89
         0,                      /* bitpos */
90
         complain_overflow_dont, /* complain_on_overflow */
91
         sh_elf_ignore_reloc,   /* special_function */
92
         "R_SH_NONE",           /* name */
93
         false,                 /* partial_inplace */
94
         0,                      /* src_mask */
95
         0,                      /* dst_mask */
96
         false),                /* pcrel_offset */
97
 
98
  /* 32 bit absolute relocation.  Setting partial_inplace to true and
99
     src_mask to a non-zero value is similar to the COFF toolchain.  */
100
  HOWTO (R_SH_DIR32,            /* type */
101
         0,                      /* rightshift */
102
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
103
         32,                    /* bitsize */
104
         false,                 /* pc_relative */
105
         0,                      /* bitpos */
106
         complain_overflow_bitfield, /* complain_on_overflow */
107
         sh_elf_reloc,          /* special_function */
108
         "R_SH_DIR32",          /* name */
109
         true,                  /* partial_inplace */
110
         0xffffffff,            /* src_mask */
111
         0xffffffff,            /* dst_mask */
112
         false),                /* pcrel_offset */
113
 
114
  /* 32 bit PC relative relocation.  */
115
  HOWTO (R_SH_REL32,            /* type */
116
         0,                      /* rightshift */
117
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
118
         32,                    /* bitsize */
119
         true,                  /* pc_relative */
120
         0,                      /* bitpos */
121
         complain_overflow_signed, /* complain_on_overflow */
122
         sh_elf_ignore_reloc,   /* special_function */
123
         "R_SH_REL32",          /* name */
124
         false,                 /* partial_inplace */
125
         0,                      /* src_mask */
126
         0xffffffff,            /* dst_mask */
127
         true),                 /* pcrel_offset */
128
 
129
  /* 8 bit PC relative branch divided by 2.  */
130
  HOWTO (R_SH_DIR8WPN,          /* type */
131
         1,                     /* rightshift */
132
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
133
         8,                     /* bitsize */
134
         true,                  /* pc_relative */
135
         0,                      /* bitpos */
136
         complain_overflow_signed, /* complain_on_overflow */
137
         sh_elf_ignore_reloc,   /* special_function */
138
         "R_SH_DIR8WPN",        /* name */
139
         true,                  /* partial_inplace */
140
         0xff,                  /* src_mask */
141
         0xff,                  /* dst_mask */
142
         true),                 /* pcrel_offset */
143
 
144
  /* 12 bit PC relative branch divided by 2.  */
145
  HOWTO (R_SH_IND12W,           /* type */
146
         1,                     /* rightshift */
147
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
148
         12,                    /* bitsize */
149
         true,                  /* pc_relative */
150
         0,                      /* bitpos */
151
         complain_overflow_signed, /* complain_on_overflow */
152
         sh_elf_reloc,          /* special_function */
153
         "R_SH_IND12W",         /* name */
154
         true,                  /* partial_inplace */
155
         0xfff,                 /* src_mask */
156
         0xfff,                 /* dst_mask */
157
         true),                 /* pcrel_offset */
158
 
159
  /* 8 bit unsigned PC relative divided by 4.  */
160
  HOWTO (R_SH_DIR8WPL,          /* type */
161
         2,                     /* rightshift */
162
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
163
         8,                     /* bitsize */
164
         true,                  /* pc_relative */
165
         0,                      /* bitpos */
166
         complain_overflow_unsigned, /* complain_on_overflow */
167
         sh_elf_ignore_reloc,   /* special_function */
168
         "R_SH_DIR8WPL",        /* name */
169
         true,                  /* partial_inplace */
170
         0xff,                  /* src_mask */
171
         0xff,                  /* dst_mask */
172
         true),                 /* pcrel_offset */
173
 
174
  /* 8 bit unsigned PC relative divided by 2.  */
175
  HOWTO (R_SH_DIR8WPZ,          /* type */
176
         1,                     /* rightshift */
177
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
178
         8,                     /* bitsize */
179
         true,                  /* pc_relative */
180
         0,                      /* bitpos */
181
         complain_overflow_unsigned, /* complain_on_overflow */
182
         sh_elf_ignore_reloc,   /* special_function */
183
         "R_SH_DIR8WPZ",        /* name */
184
         true,                  /* partial_inplace */
185
         0xff,                  /* src_mask */
186
         0xff,                  /* dst_mask */
187
         true),                 /* pcrel_offset */
188
 
189
  /* 8 bit GBR relative.  FIXME: This only makes sense if we have some
190
     special symbol for the GBR relative area, and that is not
191
     implemented.  */
192
  HOWTO (R_SH_DIR8BP,           /* type */
193
         0,                      /* rightshift */
194
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
195
         8,                     /* bitsize */
196
         false,                 /* pc_relative */
197
         0,                      /* bitpos */
198
         complain_overflow_unsigned, /* complain_on_overflow */
199
         sh_elf_ignore_reloc,   /* special_function */
200
         "R_SH_DIR8BP",         /* name */
201
         false,                 /* partial_inplace */
202
         0,                      /* src_mask */
203
         0xff,                  /* dst_mask */
204
         true),                 /* pcrel_offset */
205
 
206
  /* 8 bit GBR relative divided by 2.  FIXME: This only makes sense if
207
     we have some special symbol for the GBR relative area, and that
208
     is not implemented.  */
209
  HOWTO (R_SH_DIR8W,            /* type */
210
         1,                     /* rightshift */
211
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
212
         8,                     /* bitsize */
213
         false,                 /* pc_relative */
214
         0,                      /* bitpos */
215
         complain_overflow_unsigned, /* complain_on_overflow */
216
         sh_elf_ignore_reloc,   /* special_function */
217
         "R_SH_DIR8W",          /* name */
218
         false,                 /* partial_inplace */
219
         0,                      /* src_mask */
220
         0xff,                  /* dst_mask */
221
         true),                 /* pcrel_offset */
222
 
223
  /* 8 bit GBR relative divided by 4.  FIXME: This only makes sense if
224
     we have some special symbol for the GBR relative area, and that
225
     is not implemented.  */
226
  HOWTO (R_SH_DIR8L,            /* type */
227
         2,                     /* rightshift */
228
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
229
         8,                     /* bitsize */
230
         false,                 /* pc_relative */
231
         0,                      /* bitpos */
232
         complain_overflow_unsigned, /* complain_on_overflow */
233
         sh_elf_ignore_reloc,   /* special_function */
234
         "R_SH_DIR8L",          /* name */
235
         false,                 /* partial_inplace */
236
         0,                      /* src_mask */
237
         0xff,                  /* dst_mask */
238
         true),                 /* pcrel_offset */
239
 
240
  EMPTY_HOWTO (10),
241
  EMPTY_HOWTO (11),
242
  EMPTY_HOWTO (12),
243
  EMPTY_HOWTO (13),
244
  EMPTY_HOWTO (14),
245
  EMPTY_HOWTO (15),
246
  EMPTY_HOWTO (16),
247
  EMPTY_HOWTO (17),
248
  EMPTY_HOWTO (18),
249
  EMPTY_HOWTO (19),
250
  EMPTY_HOWTO (20),
251
  EMPTY_HOWTO (21),
252
  EMPTY_HOWTO (22),
253
  EMPTY_HOWTO (23),
254
  EMPTY_HOWTO (24),
255
 
256
  /* The remaining relocs are a GNU extension used for relaxing.  The
257
     final pass of the linker never needs to do anything with any of
258
     these relocs.  Any required operations are handled by the
259
     relaxation code.  */
260
 
261
  /* A 16 bit switch table entry.  This is generated for an expression
262
     such as ``.word L1 - L2''.  The offset holds the difference
263
     between the reloc address and L2.  */
264
  HOWTO (R_SH_SWITCH16,         /* type */
265
         0,                      /* rightshift */
266
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
267
         16,                    /* bitsize */
268
         false,                 /* pc_relative */
269
         0,                      /* bitpos */
270
         complain_overflow_unsigned, /* complain_on_overflow */
271
         sh_elf_ignore_reloc,   /* special_function */
272
         "R_SH_SWITCH16",       /* name */
273
         false,                 /* partial_inplace */
274
         0,                      /* src_mask */
275
         0,                      /* dst_mask */
276
         true),                 /* pcrel_offset */
277
 
278
  /* A 32 bit switch table entry.  This is generated for an expression
279
     such as ``.long L1 - L2''.  The offset holds the difference
280
     between the reloc address and L2.  */
281
  HOWTO (R_SH_SWITCH32,         /* type */
282
         0,                      /* rightshift */
283
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
284
         32,                    /* bitsize */
285
         false,                 /* pc_relative */
286
         0,                      /* bitpos */
287
         complain_overflow_unsigned, /* complain_on_overflow */
288
         sh_elf_ignore_reloc,   /* special_function */
289
         "R_SH_SWITCH32",       /* name */
290
         false,                 /* partial_inplace */
291
         0,                      /* src_mask */
292
         0,                      /* dst_mask */
293
         true),                 /* pcrel_offset */
294
 
295
  /* Indicates a .uses pseudo-op.  The compiler will generate .uses
296
     pseudo-ops when it finds a function call which can be relaxed.
297
     The offset field holds the PC relative offset to the instruction
298
     which loads the register used in the function call.  */
299
  HOWTO (R_SH_USES,             /* type */
300
         0,                      /* rightshift */
301
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
302
         0,                      /* bitsize */
303
         false,                 /* pc_relative */
304
         0,                      /* bitpos */
305
         complain_overflow_unsigned, /* complain_on_overflow */
306
         sh_elf_ignore_reloc,   /* special_function */
307
         "R_SH_USES",           /* name */
308
         false,                 /* partial_inplace */
309
         0,                      /* src_mask */
310
         0,                      /* dst_mask */
311
         true),                 /* pcrel_offset */
312
 
313
  /* The assembler will generate this reloc for addresses referred to
314
     by the register loads associated with USES relocs.  The offset
315
     field holds the number of times the address is referenced in the
316
     object file.  */
317
  HOWTO (R_SH_COUNT,            /* type */
318
         0,                      /* rightshift */
319
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
320
         0,                      /* bitsize */
321
         false,                 /* pc_relative */
322
         0,                      /* bitpos */
323
         complain_overflow_unsigned, /* complain_on_overflow */
324
         sh_elf_ignore_reloc,   /* special_function */
325
         "R_SH_COUNT",          /* name */
326
         false,                 /* partial_inplace */
327
         0,                      /* src_mask */
328
         0,                      /* dst_mask */
329
         true),                 /* pcrel_offset */
330
 
331
  /* Indicates an alignment statement.  The offset field is the power
332
     of 2 to which subsequent portions of the object file must be
333
     aligned.  */
334
  HOWTO (R_SH_ALIGN,            /* type */
335
         0,                      /* rightshift */
336
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
337
         0,                      /* bitsize */
338
         false,                 /* pc_relative */
339
         0,                      /* bitpos */
340
         complain_overflow_unsigned, /* complain_on_overflow */
341
         sh_elf_ignore_reloc,   /* special_function */
342
         "R_SH_ALIGN",  /* name */
343
         false,                 /* partial_inplace */
344
         0,                      /* src_mask */
345
         0,                      /* dst_mask */
346
         true),                 /* pcrel_offset */
347
 
348
  /* The assembler will generate this reloc before a block of
349
     instructions.  A section should be processed as assumining it
350
     contains data, unless this reloc is seen.  */
351
  HOWTO (R_SH_CODE,             /* type */
352
         0,                      /* rightshift */
353
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
354
         0,                      /* bitsize */
355
         false,                 /* pc_relative */
356
         0,                      /* bitpos */
357
         complain_overflow_unsigned, /* complain_on_overflow */
358
         sh_elf_ignore_reloc,   /* special_function */
359
         "R_SH_CODE",           /* name */
360
         false,                 /* partial_inplace */
361
         0,                      /* src_mask */
362
         0,                      /* dst_mask */
363
         true),                 /* pcrel_offset */
364
 
365
  /* The assembler will generate this reloc after a block of
366
     instructions when it sees data that is not instructions.  */
367
  HOWTO (R_SH_DATA,             /* type */
368
         0,                      /* rightshift */
369
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
370
         0,                      /* bitsize */
371
         false,                 /* pc_relative */
372
         0,                      /* bitpos */
373
         complain_overflow_unsigned, /* complain_on_overflow */
374
         sh_elf_ignore_reloc,   /* special_function */
375
         "R_SH_DATA",           /* name */
376
         false,                 /* partial_inplace */
377
         0,                      /* src_mask */
378
         0,                      /* dst_mask */
379
         true),                 /* pcrel_offset */
380
 
381
  /* The assembler generates this reloc for each label within a block
382
     of instructions.  This permits the linker to avoid swapping
383
     instructions which are the targets of branches.  */
384
  HOWTO (R_SH_LABEL,            /* type */
385
         0,                      /* rightshift */
386
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
387
         0,                      /* bitsize */
388
         false,                 /* pc_relative */
389
         0,                      /* bitpos */
390
         complain_overflow_unsigned, /* complain_on_overflow */
391
         sh_elf_ignore_reloc,   /* special_function */
392
         "R_SH_LABEL",          /* name */
393
         false,                 /* partial_inplace */
394
         0,                      /* src_mask */
395
         0,                      /* dst_mask */
396
         true),                 /* pcrel_offset */
397
 
398
  /* An 8 bit switch table entry.  This is generated for an expression
399
     such as ``.word L1 - L2''.  The offset holds the difference
400
     between the reloc address and L2.  */
401
  HOWTO (R_SH_SWITCH8,          /* type */
402
         0,                      /* rightshift */
403
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
404
         8,                     /* bitsize */
405
         false,                 /* pc_relative */
406
         0,                      /* bitpos */
407
         complain_overflow_unsigned, /* complain_on_overflow */
408
         sh_elf_ignore_reloc,   /* special_function */
409
         "R_SH_SWITCH8",        /* name */
410
         false,                 /* partial_inplace */
411
         0,                      /* src_mask */
412
         0,                      /* dst_mask */
413
         true),                 /* pcrel_offset */
414
 
415
  /* GNU extension to record C++ vtable hierarchy */
416
  HOWTO (R_SH_GNU_VTINHERIT, /* type */
417
         0,                     /* rightshift */
418
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
419
         0,                     /* bitsize */
420
         false,                 /* pc_relative */
421
         0,                     /* bitpos */
422
         complain_overflow_dont, /* complain_on_overflow */
423
         NULL,                  /* special_function */
424
         "R_SH_GNU_VTINHERIT", /* name */
425
         false,                 /* partial_inplace */
426
         0,                     /* src_mask */
427
         0,                     /* dst_mask */
428
         false),                /* pcrel_offset */
429
 
430
  /* GNU extension to record C++ vtable member usage */
431
  HOWTO (R_SH_GNU_VTENTRY,     /* type */
432
         0,                     /* rightshift */
433
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
434
         0,                     /* bitsize */
435
         false,                 /* pc_relative */
436
         0,                     /* bitpos */
437
         complain_overflow_dont, /* complain_on_overflow */
438
         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
439
         "R_SH_GNU_VTENTRY",   /* name */
440
         false,                 /* partial_inplace */
441
         0,                     /* src_mask */
442
         0,                     /* dst_mask */
443
         false),                /* pcrel_offset */
444
 
445
  /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
446
  HOWTO (R_SH_LOOP_START,       /* type */
447
         1,                     /* rightshift */
448
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
449
         8,                     /* bitsize */
450
         false,                 /* pc_relative */
451
         0,                      /* bitpos */
452
         complain_overflow_signed, /* complain_on_overflow */
453
         sh_elf_ignore_reloc,   /* special_function */
454
         "R_SH_LOOP_START",     /* name */
455
         true,                  /* partial_inplace */
456
         0xff,                  /* src_mask */
457
         0xff,                  /* dst_mask */
458
         true),                 /* pcrel_offset */
459
 
460
  /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
461
  HOWTO (R_SH_LOOP_END,         /* type */
462
         1,                     /* rightshift */
463
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
464
         8,                     /* bitsize */
465
         false,                 /* pc_relative */
466
         0,                      /* bitpos */
467
         complain_overflow_signed, /* complain_on_overflow */
468
         sh_elf_ignore_reloc,   /* special_function */
469
         "R_SH_LOOP_END",       /* name */
470
         true,                  /* partial_inplace */
471
         0xff,                  /* src_mask */
472
         0xff,                  /* dst_mask */
473
         true),                 /* pcrel_offset */
474
 
475
  EMPTY_HOWTO (38),
476
  EMPTY_HOWTO (39),
477
  EMPTY_HOWTO (40),
478
  EMPTY_HOWTO (41),
479
  EMPTY_HOWTO (42),
480
  EMPTY_HOWTO (43),
481
  EMPTY_HOWTO (44),
482
  EMPTY_HOWTO (45),
483
  EMPTY_HOWTO (46),
484
  EMPTY_HOWTO (47),
485
  EMPTY_HOWTO (48),
486
  EMPTY_HOWTO (49),
487
  EMPTY_HOWTO (50),
488
  EMPTY_HOWTO (51),
489
  EMPTY_HOWTO (52),
490
  EMPTY_HOWTO (53),
491
  EMPTY_HOWTO (54),
492
  EMPTY_HOWTO (55),
493
  EMPTY_HOWTO (56),
494
  EMPTY_HOWTO (57),
495
  EMPTY_HOWTO (58),
496
  EMPTY_HOWTO (59),
497
  EMPTY_HOWTO (60),
498
  EMPTY_HOWTO (61),
499
  EMPTY_HOWTO (62),
500
  EMPTY_HOWTO (63),
501
  EMPTY_HOWTO (64),
502
  EMPTY_HOWTO (65),
503
  EMPTY_HOWTO (66),
504
  EMPTY_HOWTO (67),
505
  EMPTY_HOWTO (68),
506
  EMPTY_HOWTO (69),
507
  EMPTY_HOWTO (70),
508
  EMPTY_HOWTO (71),
509
  EMPTY_HOWTO (72),
510
  EMPTY_HOWTO (73),
511
  EMPTY_HOWTO (74),
512
  EMPTY_HOWTO (75),
513
  EMPTY_HOWTO (76),
514
  EMPTY_HOWTO (77),
515
  EMPTY_HOWTO (78),
516
  EMPTY_HOWTO (79),
517
  EMPTY_HOWTO (80),
518
  EMPTY_HOWTO (81),
519
  EMPTY_HOWTO (82),
520
  EMPTY_HOWTO (83),
521
  EMPTY_HOWTO (84),
522
  EMPTY_HOWTO (85),
523
  EMPTY_HOWTO (86),
524
  EMPTY_HOWTO (87),
525
  EMPTY_HOWTO (88),
526
  EMPTY_HOWTO (89),
527
  EMPTY_HOWTO (90),
528
  EMPTY_HOWTO (91),
529
  EMPTY_HOWTO (92),
530
  EMPTY_HOWTO (93),
531
  EMPTY_HOWTO (94),
532
  EMPTY_HOWTO (95),
533
  EMPTY_HOWTO (96),
534
  EMPTY_HOWTO (97),
535
  EMPTY_HOWTO (98),
536
  EMPTY_HOWTO (99),
537
  EMPTY_HOWTO (100),
538
  EMPTY_HOWTO (101),
539
  EMPTY_HOWTO (102),
540
  EMPTY_HOWTO (103),
541
  EMPTY_HOWTO (104),
542
  EMPTY_HOWTO (105),
543
  EMPTY_HOWTO (106),
544
  EMPTY_HOWTO (107),
545
  EMPTY_HOWTO (108),
546
  EMPTY_HOWTO (109),
547
  EMPTY_HOWTO (110),
548
  EMPTY_HOWTO (111),
549
  EMPTY_HOWTO (112),
550
  EMPTY_HOWTO (113),
551
  EMPTY_HOWTO (114),
552
  EMPTY_HOWTO (115),
553
  EMPTY_HOWTO (116),
554
  EMPTY_HOWTO (117),
555
  EMPTY_HOWTO (118),
556
  EMPTY_HOWTO (119),
557
  EMPTY_HOWTO (120),
558
  EMPTY_HOWTO (121),
559
  EMPTY_HOWTO (122),
560
  EMPTY_HOWTO (123),
561
  EMPTY_HOWTO (124),
562
  EMPTY_HOWTO (125),
563
  EMPTY_HOWTO (126),
564
  EMPTY_HOWTO (127),
565
  EMPTY_HOWTO (128),
566
  EMPTY_HOWTO (129),
567
  EMPTY_HOWTO (130),
568
  EMPTY_HOWTO (131),
569
  EMPTY_HOWTO (132),
570
  EMPTY_HOWTO (133),
571
  EMPTY_HOWTO (134),
572
  EMPTY_HOWTO (135),
573
  EMPTY_HOWTO (136),
574
  EMPTY_HOWTO (137),
575
  EMPTY_HOWTO (138),
576
  EMPTY_HOWTO (139),
577
  EMPTY_HOWTO (140),
578
  EMPTY_HOWTO (141),
579
  EMPTY_HOWTO (142),
580
  EMPTY_HOWTO (143),
581
  EMPTY_HOWTO (144),
582
  EMPTY_HOWTO (145),
583
  EMPTY_HOWTO (146),
584
  EMPTY_HOWTO (147),
585
  EMPTY_HOWTO (148),
586
  EMPTY_HOWTO (149),
587
  EMPTY_HOWTO (150),
588
  EMPTY_HOWTO (151),
589
  EMPTY_HOWTO (152),
590
  EMPTY_HOWTO (153),
591
  EMPTY_HOWTO (154),
592
  EMPTY_HOWTO (155),
593
  EMPTY_HOWTO (156),
594
  EMPTY_HOWTO (157),
595
  EMPTY_HOWTO (158),
596
  EMPTY_HOWTO (159),
597
 
598
  HOWTO (R_SH_GOT32,            /* type */
599
         0,                      /* rightshift */
600
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
601
         32,                    /* bitsize */
602
         false,                 /* pc_relative */
603
         0,                      /* bitpos */
604
         complain_overflow_bitfield, /* complain_on_overflow */
605
         bfd_elf_generic_reloc, /* */
606
         "R_SH_GOT32",          /* name */
607
         true,                  /* partial_inplace */
608
         0xffffffff,            /* src_mask */
609
         0xffffffff,            /* dst_mask */
610
         false),                /* pcrel_offset */
611
 
612
  HOWTO (R_SH_PLT32,            /* type */
613
         0,                      /* rightshift */
614
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
615
         32,                    /* bitsize */
616
         true,                  /* pc_relative */
617
         0,                      /* bitpos */
618
         complain_overflow_bitfield, /* complain_on_overflow */
619
         bfd_elf_generic_reloc, /* */
620
         "R_SH_PLT32",          /* name */
621
         true,                  /* partial_inplace */
622
         0xffffffff,            /* src_mask */
623
         0xffffffff,            /* dst_mask */
624
         true),                 /* pcrel_offset */
625
 
626
  HOWTO (R_SH_COPY,             /* type */
627
         0,                      /* rightshift */
628
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
629
         32,                    /* bitsize */
630
         false,                 /* pc_relative */
631
         0,                      /* bitpos */
632
         complain_overflow_bitfield, /* complain_on_overflow */
633
         bfd_elf_generic_reloc, /* */
634
         "R_SH_COPY",           /* name */
635
         true,                  /* partial_inplace */
636
         0xffffffff,            /* src_mask */
637
         0xffffffff,            /* dst_mask */
638
         false),                /* pcrel_offset */
639
 
640
  HOWTO (R_SH_GLOB_DAT,         /* type */
641
         0,                      /* rightshift */
642
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
643
         32,                    /* bitsize */
644
         false,                 /* pc_relative */
645
         0,                      /* bitpos */
646
         complain_overflow_bitfield, /* complain_on_overflow */
647
         bfd_elf_generic_reloc, /* */
648
         "R_SH_GLOB_DAT",       /* name */
649
         true,                  /* partial_inplace */
650
         0xffffffff,            /* src_mask */
651
         0xffffffff,            /* dst_mask */
652
         false),                /* pcrel_offset */
653
 
654
  HOWTO (R_SH_JMP_SLOT,         /* type */
655
         0,                      /* rightshift */
656
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
657
         32,                    /* bitsize */
658
         false,                 /* pc_relative */
659
         0,                      /* bitpos */
660
         complain_overflow_bitfield, /* complain_on_overflow */
661
         bfd_elf_generic_reloc, /* */
662
         "R_SH_JMP_SLOT",       /* name */
663
         true,                  /* partial_inplace */
664
         0xffffffff,            /* src_mask */
665
         0xffffffff,            /* dst_mask */
666
         false),                /* pcrel_offset */
667
 
668
  HOWTO (R_SH_RELATIVE,         /* type */
669
         0,                      /* rightshift */
670
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
671
         32,                    /* bitsize */
672
         false,                 /* pc_relative */
673
         0,                      /* bitpos */
674
         complain_overflow_bitfield, /* complain_on_overflow */
675
         bfd_elf_generic_reloc, /* */
676
         "R_SH_RELATIVE",       /* name */
677
         true,                  /* partial_inplace */
678
         0xffffffff,            /* src_mask */
679
         0xffffffff,            /* dst_mask */
680
         false),                /* pcrel_offset */
681
 
682
  HOWTO (R_SH_GOTOFF,           /* type */
683
         0,                      /* rightshift */
684
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
685
         32,                    /* bitsize */
686
         false,                 /* pc_relative */
687
         0,                      /* bitpos */
688
         complain_overflow_bitfield, /* complain_on_overflow */
689
         bfd_elf_generic_reloc, /* */
690
         "R_SH_GOTOFF",         /* name */
691
         true,                  /* partial_inplace */
692
         0xffffffff,            /* src_mask */
693
         0xffffffff,            /* dst_mask */
694
         false),                /* pcrel_offset */
695
 
696
  HOWTO (R_SH_GOTPC,            /* type */
697
         0,                      /* rightshift */
698
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
699
         32,                    /* bitsize */
700
         true,                  /* pc_relative */
701
         0,                      /* bitpos */
702
         complain_overflow_bitfield, /* complain_on_overflow */
703
         bfd_elf_generic_reloc, /* */
704
         "R_SH_GOTPC",          /* name */
705
         true,                  /* partial_inplace */
706
         0xffffffff,            /* src_mask */
707
         0xffffffff,            /* dst_mask */
708
         true),                 /* pcrel_offset */
709
 
710
};
711
 
712
static bfd_reloc_status_type
713
sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, addr,
714
                   symbol_section, start, end)
715
     int r_type ATTRIBUTE_UNUSED;
716
     bfd *input_bfd;
717
     asection *input_section;
718
     bfd_byte *contents;
719
     bfd_vma addr;
720
     asection *symbol_section;
721
     bfd_vma start, end;
722
{
723
  static bfd_vma last_addr;
724
  static asection *last_symbol_section;
725
  bfd_byte *free_contents = NULL;
726
  bfd_byte *start_ptr, *ptr, *last_ptr;
727
  int diff, cum_diff;
728
  bfd_signed_vma x;
729
  int insn;
730
 
731
  /* Sanity check the address.  */
732
  if (addr > input_section->_raw_size)
733
    return bfd_reloc_outofrange;
734
 
735
  /* We require the start and end relocations to be processed consecutively -
736
     although we allow then to be processed forwards or backwards.  */
737
  if (! last_addr)
738
    {
739
      last_addr = addr;
740
      last_symbol_section = symbol_section;
741
      return bfd_reloc_ok;
742
    }
743
  if (last_addr != addr)
744
    abort ();
745
  last_addr = 0;
746
 
747
  if (! symbol_section || last_symbol_section != symbol_section || end < start)
748
    return bfd_reloc_outofrange;
749
 
750
  /* Get the symbol_section contents.  */
751
  if (symbol_section != input_section)
752
    {
753
      if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
754
        contents = elf_section_data (symbol_section)->this_hdr.contents;
755
      else
756
        {
757
          free_contents = contents
758
            = (bfd_byte *) bfd_malloc (symbol_section->_raw_size);
759
          if (contents == NULL)
760
            return bfd_reloc_outofrange;
761
          if (! bfd_get_section_contents (input_bfd, symbol_section, contents,
762
                                          (file_ptr) 0,
763
                                          symbol_section->_raw_size))
764
            {
765
              free (contents);
766
              return bfd_reloc_outofrange;
767
            }
768
        }
769
    }
770
#define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
771
  start_ptr = contents + start;
772
  for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
773
    {
774
      for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
775
        ptr -= 2;
776
      ptr += 2;
777
      diff = (last_ptr - ptr) >> 1;
778
      cum_diff += diff & 1;
779
      cum_diff += diff;
780
    }
781
  /* Calculate the start / end values to load into rs / re minus four -
782
     so that will cancel out the four we would otherwise have to add to
783
     addr to get the value to subtract in order to get relative addressing.  */
784
  if (cum_diff >= 0)
785
    {
786
      start -= 4;
787
      end = (ptr + cum_diff * 2) - contents;
788
    }
789
  else
790
    {
791
      bfd_vma start0 = start - 4;
792
 
793
      while (start0 && IS_PPI (contents + start0))
794
        start0 -= 2;
795
      start0 = start - 2 - ((start - start0) & 2);
796
      start = start0 - cum_diff - 2;
797
      end = start0;
798
    }
799
 
800
  if (free_contents)
801
    free (free_contents);
802
 
803
  insn = bfd_get_16 (input_bfd, contents + addr);
804
 
805
  x = (insn & 0x200 ? end : start) - addr;
806
  if (input_section != symbol_section)
807
    x += ((symbol_section->output_section->vma + symbol_section->output_offset)
808
          - (input_section->output_section->vma
809
             + input_section->output_offset));
810
  x >>= 1;
811
  if (x < -128 || x > 127)
812
    return bfd_reloc_overflow;
813
 
814
  x = (insn & ~0xff) | (x & 0xff);
815
  bfd_put_16 (input_bfd, x, contents + addr);
816
 
817
  return bfd_reloc_ok;
818
}
819
 
820
/* This function is used for normal relocs.  This used to be like the COFF
821
   function, and is almost certainly incorrect for other ELF targets.  */
822
 
823
static bfd_reloc_status_type
824
sh_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
825
              error_message)
826
     bfd *abfd;
827
     arelent *reloc_entry;
828
     asymbol *symbol_in;
829
     PTR data;
830
     asection *input_section;
831
     bfd *output_bfd;
832
     char **error_message ATTRIBUTE_UNUSED;
833
{
834
  unsigned long insn;
835
  bfd_vma sym_value;
836
  enum elf_sh_reloc_type r_type;
837
  bfd_vma addr = reloc_entry->address;
838
  bfd_byte *hit_data = addr + (bfd_byte *) data;
839
 
840
  r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
841
 
842
  if (output_bfd != NULL)
843
    {
844
      /* Partial linking--do nothing.  */
845
      reloc_entry->address += input_section->output_offset;
846
      return bfd_reloc_ok;
847
    }
848
 
849
  /* Almost all relocs have to do with relaxing.  If any work must be
850
     done for them, it has been done in sh_relax_section.  */
851
  if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
852
    return bfd_reloc_ok;
853
 
854
  if (symbol_in != NULL
855
      && bfd_is_und_section (symbol_in->section))
856
    return bfd_reloc_undefined;
857
 
858
  if (bfd_is_com_section (symbol_in->section))
859
    sym_value = 0;
860
  else
861
    sym_value = (symbol_in->value +
862
                 symbol_in->section->output_section->vma +
863
                 symbol_in->section->output_offset);
864
 
865
  switch (r_type)
866
    {
867
    case R_SH_DIR32:
868
      insn = bfd_get_32 (abfd, hit_data);
869
      insn += sym_value + reloc_entry->addend;
870
      bfd_put_32 (abfd, insn, hit_data);
871
      break;
872
    case R_SH_IND12W:
873
      insn = bfd_get_16 (abfd, hit_data);
874
      sym_value += reloc_entry->addend;
875
      sym_value -= (input_section->output_section->vma
876
                    + input_section->output_offset
877
                    + addr
878
                    + 4);
879
      sym_value += (insn & 0xfff) << 1;
880
      if (insn & 0x800)
881
        sym_value -= 0x1000;
882
      insn = (insn & 0xf000) | (sym_value & 0xfff);
883
      bfd_put_16 (abfd, insn, hit_data);
884
      if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
885
        return bfd_reloc_overflow;
886
      break;
887
    default:
888
      abort ();
889
      break;
890
    }
891
 
892
  return bfd_reloc_ok;
893
}
894
 
895
/* This function is used for relocs which are only used for relaxing,
896
   which the linker should otherwise ignore.  */
897
 
898
static bfd_reloc_status_type
899
sh_elf_ignore_reloc (abfd, reloc_entry, symbol, data, input_section,
900
                     output_bfd, error_message)
901
     bfd *abfd ATTRIBUTE_UNUSED;
902
     arelent *reloc_entry;
903
     asymbol *symbol ATTRIBUTE_UNUSED;
904
     PTR data ATTRIBUTE_UNUSED;
905
     asection *input_section;
906
     bfd *output_bfd;
907
     char **error_message ATTRIBUTE_UNUSED;
908
{
909
  if (output_bfd != NULL)
910
    reloc_entry->address += input_section->output_offset;
911
  return bfd_reloc_ok;
912
}
913
 
914
/* This structure is used to map BFD reloc codes to SH ELF relocs.  */
915
 
916
struct elf_reloc_map
917
{
918
  bfd_reloc_code_real_type bfd_reloc_val;
919
  unsigned char elf_reloc_val;
920
};
921
 
922
/* An array mapping BFD reloc codes to SH ELF relocs.  */
923
 
924
static const struct elf_reloc_map sh_reloc_map[] =
925
{
926
  { BFD_RELOC_NONE, R_SH_NONE },
927
  { BFD_RELOC_32, R_SH_DIR32 },
928
  { BFD_RELOC_CTOR, R_SH_DIR32 },
929
  { BFD_RELOC_32_PCREL, R_SH_REL32 },
930
  { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
931
  { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
932
  { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
933
  { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
934
  { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
935
  { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
936
  { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
937
  { BFD_RELOC_SH_USES, R_SH_USES },
938
  { BFD_RELOC_SH_COUNT, R_SH_COUNT },
939
  { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
940
  { BFD_RELOC_SH_CODE, R_SH_CODE },
941
  { BFD_RELOC_SH_DATA, R_SH_DATA },
942
  { BFD_RELOC_SH_LABEL, R_SH_LABEL },
943
  { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
944
  { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
945
  { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
946
  { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
947
  { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 },
948
  { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 },
949
  { BFD_RELOC_SH_COPY, R_SH_COPY },
950
  { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT },
951
  { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT },
952
  { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE },
953
  { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF },
954
  { BFD_RELOC_SH_GOTPC, R_SH_GOTPC },
955
};
956
 
957
/* Given a BFD reloc code, return the howto structure for the
958
   corresponding SH ELf reloc.  */
959
 
960
static reloc_howto_type *
961
sh_elf_reloc_type_lookup (abfd, code)
962
     bfd *abfd ATTRIBUTE_UNUSED;
963
     bfd_reloc_code_real_type code;
964
{
965
  unsigned int i;
966
 
967
  for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
968
    {
969
      if (sh_reloc_map[i].bfd_reloc_val == code)
970
        return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
971
    }
972
 
973
  return NULL;
974
}
975
 
976
/* Given an ELF reloc, fill in the howto field of a relent.  */
977
 
978
static void
979
sh_elf_info_to_howto (abfd, cache_ptr, dst)
980
     bfd *abfd ATTRIBUTE_UNUSED;
981
     arelent *cache_ptr;
982
     Elf_Internal_Rela *dst;
983
{
984
  unsigned int r;
985
 
986
  r = ELF32_R_TYPE (dst->r_info);
987
 
988
  BFD_ASSERT (r < (unsigned int) R_SH_max);
989
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
990
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
991
 
992
  cache_ptr->howto = &sh_elf_howto_table[r];
993
}
994
 
995
/* This function handles relaxing for SH ELF.  See the corresponding
996
   function in coff-sh.c for a description of what this does.  FIXME:
997
   There is a lot of duplication here between this code and the COFF
998
   specific code.  The format of relocs and symbols is wound deeply
999
   into this code, but it would still be better if the duplication
1000
   could be eliminated somehow.  Note in particular that although both
1001
   functions use symbols like R_SH_CODE, those symbols have different
1002
   values; in coff-sh.c they come from include/coff/sh.h, whereas here
1003
   they come from enum elf_sh_reloc_type in include/elf/sh.h.  */
1004
 
1005
static boolean
1006
sh_elf_relax_section (abfd, sec, link_info, again)
1007
     bfd *abfd;
1008
     asection *sec;
1009
     struct bfd_link_info *link_info;
1010
     boolean *again;
1011
{
1012
  Elf_Internal_Shdr *symtab_hdr;
1013
  Elf_Internal_Rela *internal_relocs;
1014
  Elf_Internal_Rela *free_relocs = NULL;
1015
  boolean have_code;
1016
  Elf_Internal_Rela *irel, *irelend;
1017
  bfd_byte *contents = NULL;
1018
  bfd_byte *free_contents = NULL;
1019
  Elf32_External_Sym *extsyms = NULL;
1020
  Elf32_External_Sym *free_extsyms = NULL;
1021
 
1022
  *again = false;
1023
 
1024
  if (link_info->relocateable
1025
      || (sec->flags & SEC_RELOC) == 0
1026
      || sec->reloc_count == 0)
1027
    return true;
1028
 
1029
  /* If this is the first time we have been called for this section,
1030
     initialize the cooked size.  */
1031
  if (sec->_cooked_size == 0)
1032
    sec->_cooked_size = sec->_raw_size;
1033
 
1034
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1035
 
1036
  internal_relocs = (_bfd_elf32_link_read_relocs
1037
                     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1038
                      link_info->keep_memory));
1039
  if (internal_relocs == NULL)
1040
    goto error_return;
1041
  if (! link_info->keep_memory)
1042
    free_relocs = internal_relocs;
1043
 
1044
  have_code = false;
1045
 
1046
  irelend = internal_relocs + sec->reloc_count;
1047
  for (irel = internal_relocs; irel < irelend; irel++)
1048
    {
1049
      bfd_vma laddr, paddr, symval;
1050
      unsigned short insn;
1051
      Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
1052
      bfd_signed_vma foff;
1053
 
1054
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
1055
        have_code = true;
1056
 
1057
      if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
1058
        continue;
1059
 
1060
      /* Get the section contents.  */
1061
      if (contents == NULL)
1062
        {
1063
          if (elf_section_data (sec)->this_hdr.contents != NULL)
1064
            contents = elf_section_data (sec)->this_hdr.contents;
1065
          else
1066
            {
1067
              contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1068
              if (contents == NULL)
1069
                goto error_return;
1070
              free_contents = contents;
1071
 
1072
              if (! bfd_get_section_contents (abfd, sec, contents,
1073
                                              (file_ptr) 0, sec->_raw_size))
1074
                goto error_return;
1075
            }
1076
        }
1077
 
1078
      /* The r_addend field of the R_SH_USES reloc will point us to
1079
         the register load.  The 4 is because the r_addend field is
1080
         computed as though it were a jump offset, which are based
1081
         from 4 bytes after the jump instruction.  */
1082
      laddr = irel->r_offset + 4 + irel->r_addend;
1083
      if (laddr >= sec->_raw_size)
1084
        {
1085
          (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
1086
                                 bfd_get_filename (abfd),
1087
                                 (unsigned long) irel->r_offset);
1088
          continue;
1089
        }
1090
      insn = bfd_get_16 (abfd, contents + laddr);
1091
 
1092
      /* If the instruction is not mov.l NN,rN, we don't know what to
1093
         do.  */
1094
      if ((insn & 0xf000) != 0xd000)
1095
        {
1096
          ((*_bfd_error_handler)
1097
           (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
1098
            bfd_get_filename (abfd), (unsigned long) irel->r_offset, insn));
1099
          continue;
1100
        }
1101
 
1102
      /* Get the address from which the register is being loaded.  The
1103
         displacement in the mov.l instruction is quadrupled.  It is a
1104
         displacement from four bytes after the movl instruction, but,
1105
         before adding in the PC address, two least significant bits
1106
         of the PC are cleared.  We assume that the section is aligned
1107
         on a four byte boundary.  */
1108
      paddr = insn & 0xff;
1109
      paddr *= 4;
1110
      paddr += (laddr + 4) & ~3;
1111
      if (paddr >= sec->_raw_size)
1112
        {
1113
          ((*_bfd_error_handler)
1114
           (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
1115
            bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1116
          continue;
1117
        }
1118
 
1119
      /* Get the reloc for the address from which the register is
1120
         being loaded.  This reloc will tell us which function is
1121
         actually being called.  */
1122
      for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
1123
        if (irelfn->r_offset == paddr
1124
            && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
1125
          break;
1126
      if (irelfn >= irelend)
1127
        {
1128
          ((*_bfd_error_handler)
1129
           (_("%s: 0x%lx: warning: could not find expected reloc"),
1130
            bfd_get_filename (abfd), (unsigned long) paddr));
1131
          continue;
1132
        }
1133
 
1134
      /* Read this BFD's symbols if we haven't done so already.  */
1135
      if (extsyms == NULL)
1136
        {
1137
          if (symtab_hdr->contents != NULL)
1138
            extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1139
          else
1140
            {
1141
              extsyms = ((Elf32_External_Sym *)
1142
                         bfd_malloc (symtab_hdr->sh_size));
1143
              if (extsyms == NULL)
1144
                goto error_return;
1145
              free_extsyms = extsyms;
1146
              if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1147
                  || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1148
                      != symtab_hdr->sh_size))
1149
                goto error_return;
1150
            }
1151
        }
1152
 
1153
      /* Get the value of the symbol referred to by the reloc.  */
1154
      if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
1155
        {
1156
          Elf_Internal_Sym isym;
1157
 
1158
          /* A local symbol.  */
1159
          bfd_elf32_swap_symbol_in (abfd,
1160
                                    extsyms + ELF32_R_SYM (irelfn->r_info),
1161
                                    &isym);
1162
 
1163
          if (isym.st_shndx != _bfd_elf_section_from_bfd_section (abfd, sec))
1164
            {
1165
              ((*_bfd_error_handler)
1166
               (_("%s: 0x%lx: warning: symbol in unexpected section"),
1167
                bfd_get_filename (abfd), (unsigned long) paddr));
1168
              continue;
1169
            }
1170
 
1171
          symval = (isym.st_value
1172
                    + sec->output_section->vma
1173
                    + sec->output_offset);
1174
        }
1175
      else
1176
        {
1177
          unsigned long indx;
1178
          struct elf_link_hash_entry *h;
1179
 
1180
          indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
1181
          h = elf_sym_hashes (abfd)[indx];
1182
          BFD_ASSERT (h != NULL);
1183
          if (h->root.type != bfd_link_hash_defined
1184
              && h->root.type != bfd_link_hash_defweak)
1185
            {
1186
              /* This appears to be a reference to an undefined
1187
                 symbol.  Just ignore it--it will be caught by the
1188
                 regular reloc processing.  */
1189
              continue;
1190
            }
1191
 
1192
          symval = (h->root.u.def.value
1193
                    + h->root.u.def.section->output_section->vma
1194
                    + h->root.u.def.section->output_offset);
1195
        }
1196
 
1197
      symval += bfd_get_32 (abfd, contents + paddr);
1198
 
1199
      /* See if this function call can be shortened.  */
1200
      foff = (symval
1201
              - (irel->r_offset
1202
                 + sec->output_section->vma
1203
                 + sec->output_offset
1204
                 + 4));
1205
      if (foff < -0x1000 || foff >= 0x1000)
1206
        {
1207
          /* After all that work, we can't shorten this function call.  */
1208
          continue;
1209
        }
1210
 
1211
      /* Shorten the function call.  */
1212
 
1213
      /* For simplicity of coding, we are going to modify the section
1214
         contents, the section relocs, and the BFD symbol table.  We
1215
         must tell the rest of the code not to free up this
1216
         information.  It would be possible to instead create a table
1217
         of changes which have to be made, as is done in coff-mips.c;
1218
         that would be more work, but would require less memory when
1219
         the linker is run.  */
1220
 
1221
      elf_section_data (sec)->relocs = internal_relocs;
1222
      free_relocs = NULL;
1223
 
1224
      elf_section_data (sec)->this_hdr.contents = contents;
1225
      free_contents = NULL;
1226
 
1227
      symtab_hdr->contents = (bfd_byte *) extsyms;
1228
      free_extsyms = NULL;
1229
 
1230
      /* Replace the jsr with a bsr.  */
1231
 
1232
      /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
1233
         replace the jsr with a bsr.  */
1234
      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
1235
      if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
1236
        {
1237
          /* If this needs to be changed because of future relaxing,
1238
             it will be handled here like other internal IND12W
1239
             relocs.  */
1240
          bfd_put_16 (abfd,
1241
                      0xb000 | ((foff >> 1) & 0xfff),
1242
                      contents + irel->r_offset);
1243
        }
1244
      else
1245
        {
1246
          /* We can't fully resolve this yet, because the external
1247
             symbol value may be changed by future relaxing.  We let
1248
             the final link phase handle it.  */
1249
          bfd_put_16 (abfd, 0xb000, contents + irel->r_offset);
1250
        }
1251
 
1252
      /* See if there is another R_SH_USES reloc referring to the same
1253
         register load.  */
1254
      for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
1255
        if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
1256
            && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
1257
          break;
1258
      if (irelscan < irelend)
1259
        {
1260
          /* Some other function call depends upon this register load,
1261
             and we have not yet converted that function call.
1262
             Indeed, we may never be able to convert it.  There is
1263
             nothing else we can do at this point.  */
1264
          continue;
1265
        }
1266
 
1267
      /* Look for a R_SH_COUNT reloc on the location where the
1268
         function address is stored.  Do this before deleting any
1269
         bytes, to avoid confusion about the address.  */
1270
      for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
1271
        if (irelcount->r_offset == paddr
1272
            && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
1273
          break;
1274
 
1275
      /* Delete the register load.  */
1276
      if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
1277
        goto error_return;
1278
 
1279
      /* That will change things, so, just in case it permits some
1280
         other function call to come within range, we should relax
1281
         again.  Note that this is not required, and it may be slow.  */
1282
      *again = true;
1283
 
1284
      /* Now check whether we got a COUNT reloc.  */
1285
      if (irelcount >= irelend)
1286
        {
1287
          ((*_bfd_error_handler)
1288
           (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
1289
            bfd_get_filename (abfd), (unsigned long) paddr));
1290
          continue;
1291
        }
1292
 
1293
      /* The number of uses is stored in the r_addend field.  We've
1294
         just deleted one.  */
1295
      if (irelcount->r_addend == 0)
1296
        {
1297
          ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
1298
                                  bfd_get_filename (abfd),
1299
                                  (unsigned long) paddr));
1300
          continue;
1301
        }
1302
 
1303
      --irelcount->r_addend;
1304
 
1305
      /* If there are no more uses, we can delete the address.  Reload
1306
         the address from irelfn, in case it was changed by the
1307
         previous call to sh_elf_relax_delete_bytes.  */
1308
      if (irelcount->r_addend == 0)
1309
        {
1310
          if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
1311
            goto error_return;
1312
        }
1313
 
1314
      /* We've done all we can with that function call.  */
1315
    }
1316
 
1317
  /* Look for load and store instructions that we can align on four
1318
     byte boundaries.  */
1319
  if (have_code)
1320
    {
1321
      boolean swapped;
1322
 
1323
      /* Get the section contents.  */
1324
      if (contents == NULL)
1325
        {
1326
          if (elf_section_data (sec)->this_hdr.contents != NULL)
1327
            contents = elf_section_data (sec)->this_hdr.contents;
1328
          else
1329
            {
1330
              contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1331
              if (contents == NULL)
1332
                goto error_return;
1333
              free_contents = contents;
1334
 
1335
              if (! bfd_get_section_contents (abfd, sec, contents,
1336
                                              (file_ptr) 0, sec->_raw_size))
1337
                goto error_return;
1338
            }
1339
        }
1340
 
1341
      if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
1342
                                &swapped))
1343
        goto error_return;
1344
 
1345
      if (swapped)
1346
        {
1347
          elf_section_data (sec)->relocs = internal_relocs;
1348
          free_relocs = NULL;
1349
 
1350
          elf_section_data (sec)->this_hdr.contents = contents;
1351
          free_contents = NULL;
1352
 
1353
          symtab_hdr->contents = (bfd_byte *) extsyms;
1354
          free_extsyms = NULL;
1355
        }
1356
    }
1357
 
1358
  if (free_relocs != NULL)
1359
    {
1360
      free (free_relocs);
1361
      free_relocs = NULL;
1362
    }
1363
 
1364
  if (free_contents != NULL)
1365
    {
1366
      if (! link_info->keep_memory)
1367
        free (free_contents);
1368
      else
1369
        {
1370
          /* Cache the section contents for elf_link_input_bfd.  */
1371
          elf_section_data (sec)->this_hdr.contents = contents;
1372
        }
1373
      free_contents = NULL;
1374
    }
1375
 
1376
  if (free_extsyms != NULL)
1377
    {
1378
      if (! link_info->keep_memory)
1379
        free (free_extsyms);
1380
      else
1381
        {
1382
          /* Cache the symbols for elf_link_input_bfd.  */
1383
          symtab_hdr->contents = extsyms;
1384
        }
1385
      free_extsyms = NULL;
1386
    }
1387
 
1388
  return true;
1389
 
1390
 error_return:
1391
  if (free_relocs != NULL)
1392
    free (free_relocs);
1393
  if (free_contents != NULL)
1394
    free (free_contents);
1395
  if (free_extsyms != NULL)
1396
    free (free_extsyms);
1397
  return false;
1398
}
1399
 
1400
/* Delete some bytes from a section while relaxing.  FIXME: There is a
1401
   lot of duplication between this function and sh_relax_delete_bytes
1402
   in coff-sh.c.  */
1403
 
1404
static boolean
1405
sh_elf_relax_delete_bytes (abfd, sec, addr, count)
1406
     bfd *abfd;
1407
     asection *sec;
1408
     bfd_vma addr;
1409
     int count;
1410
{
1411
  Elf_Internal_Shdr *symtab_hdr;
1412
  Elf32_External_Sym *extsyms;
1413
  int shndx, index;
1414
  bfd_byte *contents;
1415
  Elf_Internal_Rela *irel, *irelend;
1416
  Elf_Internal_Rela *irelalign;
1417
  bfd_vma toaddr;
1418
  Elf32_External_Sym *esym, *esymend;
1419
  struct elf_link_hash_entry *sym_hash;
1420
  asection *o;
1421
 
1422
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1423
  extsyms = (Elf32_External_Sym *) symtab_hdr->contents;
1424
 
1425
  shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
1426
 
1427
  contents = elf_section_data (sec)->this_hdr.contents;
1428
 
1429
  /* The deletion must stop at the next ALIGN reloc for an aligment
1430
     power larger than the number of bytes we are deleting.  */
1431
 
1432
  irelalign = NULL;
1433
  toaddr = sec->_cooked_size;
1434
 
1435
  irel = elf_section_data (sec)->relocs;
1436
  irelend = irel + sec->reloc_count;
1437
  for (; irel < irelend; irel++)
1438
    {
1439
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1440
          && irel->r_offset > addr
1441
          && count < (1 << irel->r_addend))
1442
        {
1443
          irelalign = irel;
1444
          toaddr = irel->r_offset;
1445
          break;
1446
        }
1447
    }
1448
 
1449
  /* Actually delete the bytes.  */
1450
  memmove (contents + addr, contents + addr + count, toaddr - addr - count);
1451
  if (irelalign == NULL)
1452
    sec->_cooked_size -= count;
1453
  else
1454
    {
1455
      int i;
1456
 
1457
#define NOP_OPCODE (0x0009)
1458
 
1459
      BFD_ASSERT ((count & 1) == 0);
1460
      for (i = 0; i < count; i += 2)
1461
        bfd_put_16 (abfd, NOP_OPCODE, contents + toaddr - count + i);
1462
    }
1463
 
1464
  /* Adjust all the relocs.  */
1465
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
1466
    {
1467
      bfd_vma nraddr, stop;
1468
      bfd_vma start = 0;
1469
      int insn = 0;
1470
      Elf_Internal_Sym sym;
1471
      int off, adjust, oinsn;
1472
      bfd_signed_vma voff = 0;
1473
      boolean overflow;
1474
 
1475
      /* Get the new reloc address.  */
1476
      nraddr = irel->r_offset;
1477
      if ((irel->r_offset > addr
1478
           && irel->r_offset < toaddr)
1479
          || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
1480
              && irel->r_offset == toaddr))
1481
        nraddr -= count;
1482
 
1483
      /* See if this reloc was for the bytes we have deleted, in which
1484
         case we no longer care about it.  Don't delete relocs which
1485
         represent addresses, though.  */
1486
      if (irel->r_offset >= addr
1487
          && irel->r_offset < addr + count
1488
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
1489
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
1490
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
1491
          && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
1492
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1493
                                     (int) R_SH_NONE);
1494
 
1495
      /* If this is a PC relative reloc, see if the range it covers
1496
         includes the bytes we have deleted.  */
1497
      switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1498
        {
1499
        default:
1500
          break;
1501
 
1502
        case R_SH_DIR8WPN:
1503
        case R_SH_IND12W:
1504
        case R_SH_DIR8WPZ:
1505
        case R_SH_DIR8WPL:
1506
          start = irel->r_offset;
1507
          insn = bfd_get_16 (abfd, contents + nraddr);
1508
          break;
1509
        }
1510
 
1511
      switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1512
        {
1513
        default:
1514
          start = stop = addr;
1515
          break;
1516
 
1517
        case R_SH_DIR32:
1518
          /* If this reloc is against a symbol defined in this
1519
             section, and the symbol will not be adjusted below, we
1520
             must check the addend to see it will put the value in
1521
             range to be adjusted, and hence must be changed.  */
1522
          if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1523
            {
1524
              bfd_elf32_swap_symbol_in (abfd,
1525
                                        extsyms + ELF32_R_SYM (irel->r_info),
1526
                                        &sym);
1527
              if (sym.st_shndx == shndx
1528
                  && (sym.st_value <= addr
1529
                      || sym.st_value >= toaddr))
1530
                {
1531
                  bfd_vma val;
1532
 
1533
                  val = bfd_get_32 (abfd, contents + nraddr);
1534
                  val += sym.st_value;
1535
                  if (val > addr && val < toaddr)
1536
                    bfd_put_32 (abfd, val - count, contents + nraddr);
1537
                }
1538
            }
1539
          start = stop = addr;
1540
          break;
1541
 
1542
        case R_SH_DIR8WPN:
1543
          off = insn & 0xff;
1544
          if (off & 0x80)
1545
            off -= 0x100;
1546
          stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1547
          break;
1548
 
1549
        case R_SH_IND12W:
1550
          if (ELF32_R_SYM (irel->r_info) >= symtab_hdr->sh_info)
1551
            start = stop = addr;
1552
          else
1553
            {
1554
              off = insn & 0xfff;
1555
              if (off & 0x800)
1556
                off -= 0x1000;
1557
              stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
1558
            }
1559
          break;
1560
 
1561
        case R_SH_DIR8WPZ:
1562
          off = insn & 0xff;
1563
          stop = start + 4 + off * 2;
1564
          break;
1565
 
1566
        case R_SH_DIR8WPL:
1567
          off = insn & 0xff;
1568
          stop = (start & ~(bfd_vma) 3) + 4 + off * 4;
1569
          break;
1570
 
1571
        case R_SH_SWITCH8:
1572
        case R_SH_SWITCH16:
1573
        case R_SH_SWITCH32:
1574
          /* These relocs types represent
1575
               .word L2-L1
1576
             The r_addend field holds the difference between the reloc
1577
             address and L1.  That is the start of the reloc, and
1578
             adding in the contents gives us the top.  We must adjust
1579
             both the r_offset field and the section contents.
1580
             N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
1581
             and the elf bfd r_offset is called r_vaddr.  */
1582
 
1583
          stop = irel->r_offset;
1584
          start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
1585
 
1586
          if (start > addr
1587
              && start < toaddr
1588
              && (stop <= addr || stop >= toaddr))
1589
            irel->r_addend += count;
1590
          else if (stop > addr
1591
                   && stop < toaddr
1592
                   && (start <= addr || start >= toaddr))
1593
            irel->r_addend -= count;
1594
 
1595
          if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
1596
            voff = bfd_get_signed_16 (abfd, contents + nraddr);
1597
          else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
1598
            voff = bfd_get_8 (abfd, contents + nraddr);
1599
          else
1600
            voff = bfd_get_signed_32 (abfd, contents + nraddr);
1601
          stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1602
 
1603
          break;
1604
 
1605
        case R_SH_USES:
1606
          start = irel->r_offset;
1607
          stop = (bfd_vma) ((bfd_signed_vma) start
1608
                            + (long) irel->r_addend
1609
                            + 4);
1610
          break;
1611
        }
1612
 
1613
      if (start > addr
1614
          && start < toaddr
1615
          && (stop <= addr || stop >= toaddr))
1616
        adjust = count;
1617
      else if (stop > addr
1618
               && stop < toaddr
1619
               && (start <= addr || start >= toaddr))
1620
        adjust = - count;
1621
      else
1622
        adjust = 0;
1623
 
1624
      if (adjust != 0)
1625
        {
1626
          oinsn = insn;
1627
          overflow = false;
1628
          switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
1629
            {
1630
            default:
1631
              abort ();
1632
              break;
1633
 
1634
            case R_SH_DIR8WPN:
1635
            case R_SH_DIR8WPZ:
1636
              insn += adjust / 2;
1637
              if ((oinsn & 0xff00) != (insn & 0xff00))
1638
                overflow = true;
1639
              bfd_put_16 (abfd, insn, contents + nraddr);
1640
              break;
1641
 
1642
            case R_SH_IND12W:
1643
              insn += adjust / 2;
1644
              if ((oinsn & 0xf000) != (insn & 0xf000))
1645
                overflow = true;
1646
              bfd_put_16 (abfd, insn, contents + nraddr);
1647
              break;
1648
 
1649
            case R_SH_DIR8WPL:
1650
              BFD_ASSERT (adjust == count || count >= 4);
1651
              if (count >= 4)
1652
                insn += adjust / 4;
1653
              else
1654
                {
1655
                  if ((irel->r_offset & 3) == 0)
1656
                    ++insn;
1657
                }
1658
              if ((oinsn & 0xff00) != (insn & 0xff00))
1659
                overflow = true;
1660
              bfd_put_16 (abfd, insn, contents + nraddr);
1661
              break;
1662
 
1663
            case R_SH_SWITCH8:
1664
              voff += adjust;
1665
              if (voff < 0 || voff >= 0xff)
1666
                overflow = true;
1667
              bfd_put_8 (abfd, voff, contents + nraddr);
1668
              break;
1669
 
1670
            case R_SH_SWITCH16:
1671
              voff += adjust;
1672
              if (voff < - 0x8000 || voff >= 0x8000)
1673
                overflow = true;
1674
              bfd_put_signed_16 (abfd, voff, contents + nraddr);
1675
              break;
1676
 
1677
            case R_SH_SWITCH32:
1678
              voff += adjust;
1679
              bfd_put_signed_32 (abfd, voff, contents + nraddr);
1680
              break;
1681
 
1682
            case R_SH_USES:
1683
              irel->r_addend += adjust;
1684
              break;
1685
            }
1686
 
1687
          if (overflow)
1688
            {
1689
              ((*_bfd_error_handler)
1690
               (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
1691
                bfd_get_filename (abfd), (unsigned long) irel->r_offset));
1692
              bfd_set_error (bfd_error_bad_value);
1693
              return false;
1694
            }
1695
        }
1696
 
1697
      irel->r_offset = nraddr;
1698
    }
1699
 
1700
  /* Look through all the other sections.  If there contain any IMM32
1701
     relocs against internal symbols which we are not going to adjust
1702
     below, we may need to adjust the addends.  */
1703
  for (o = abfd->sections; o != NULL; o = o->next)
1704
    {
1705
      Elf_Internal_Rela *internal_relocs;
1706
      Elf_Internal_Rela *irelscan, *irelscanend;
1707
      bfd_byte *ocontents;
1708
 
1709
      if (o == sec
1710
          || (o->flags & SEC_RELOC) == 0
1711
          || o->reloc_count == 0)
1712
        continue;
1713
 
1714
      /* We always cache the relocs.  Perhaps, if info->keep_memory is
1715
         false, we should free them, if we are permitted to, when we
1716
         leave sh_coff_relax_section.  */
1717
      internal_relocs = (_bfd_elf32_link_read_relocs
1718
                         (abfd, o, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1719
                          true));
1720
      if (internal_relocs == NULL)
1721
        return false;
1722
 
1723
      ocontents = NULL;
1724
      irelscanend = internal_relocs + o->reloc_count;
1725
      for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
1726
        {
1727
          Elf_Internal_Sym sym;
1728
 
1729
          /* Dwarf line numbers use R_SH_SWITCH32 relocs.  */
1730
          if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
1731
            {
1732
              bfd_vma start, stop;
1733
              bfd_signed_vma voff;
1734
 
1735
              if (ocontents == NULL)
1736
                {
1737
                  if (elf_section_data (o)->this_hdr.contents != NULL)
1738
                    ocontents = elf_section_data (o)->this_hdr.contents;
1739
                  else
1740
                    {
1741
                      /* We always cache the section contents.
1742
                         Perhaps, if info->keep_memory is false, we
1743
                         should free them, if we are permitted to,
1744
                         when we leave sh_coff_relax_section.  */
1745
                      ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1746
                      if (ocontents == NULL)
1747
                        return false;
1748
                      if (! bfd_get_section_contents (abfd, o, ocontents,
1749
                                                      (file_ptr) 0,
1750
                                                      o->_raw_size))
1751
                        return false;
1752
                      elf_section_data (o)->this_hdr.contents = ocontents;
1753
                    }
1754
                }
1755
 
1756
              stop = irelscan->r_offset;
1757
              start
1758
                = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
1759
 
1760
              /* STOP is in a different section, so it won't change.  */
1761
              if (start > addr && start < toaddr)
1762
                irelscan->r_addend += count;
1763
 
1764
              voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
1765
              stop = (bfd_vma) ((bfd_signed_vma) start + voff);
1766
 
1767
              if (start > addr
1768
                  && start < toaddr
1769
                  && (stop <= addr || stop >= toaddr))
1770
                bfd_put_signed_32 (abfd, voff + count,
1771
                                   ocontents + irelscan->r_offset);
1772
              else if (stop > addr
1773
                       && stop < toaddr
1774
                       && (start <= addr || start >= toaddr))
1775
                bfd_put_signed_32 (abfd, voff - count,
1776
                                   ocontents + irelscan->r_offset);
1777
            }
1778
 
1779
          if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
1780
            continue;
1781
 
1782
          if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
1783
            continue;
1784
 
1785
          bfd_elf32_swap_symbol_in (abfd,
1786
                                    extsyms + ELF32_R_SYM (irelscan->r_info),
1787
                                    &sym);
1788
 
1789
          if (sym.st_shndx == shndx
1790
              && (sym.st_value <= addr
1791
                  || sym.st_value >= toaddr))
1792
            {
1793
              bfd_vma val;
1794
 
1795
              if (ocontents == NULL)
1796
                {
1797
                  if (elf_section_data (o)->this_hdr.contents != NULL)
1798
                    ocontents = elf_section_data (o)->this_hdr.contents;
1799
                  else
1800
                    {
1801
                      /* We always cache the section contents.
1802
                         Perhaps, if info->keep_memory is false, we
1803
                         should free them, if we are permitted to,
1804
                         when we leave sh_coff_relax_section.  */
1805
                      ocontents = (bfd_byte *) bfd_malloc (o->_raw_size);
1806
                      if (ocontents == NULL)
1807
                        return false;
1808
                      if (! bfd_get_section_contents (abfd, o, ocontents,
1809
                                                      (file_ptr) 0,
1810
                                                      o->_raw_size))
1811
                        return false;
1812
                      elf_section_data (o)->this_hdr.contents = ocontents;
1813
                    }
1814
                }
1815
 
1816
              val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
1817
              val += sym.st_value;
1818
              if (val > addr && val < toaddr)
1819
                bfd_put_32 (abfd, val - count,
1820
                            ocontents + irelscan->r_offset);
1821
            }
1822
        }
1823
    }
1824
 
1825
  /* Adjust the local symbols defined in this section.  */
1826
  esym = extsyms;
1827
  esymend = esym + symtab_hdr->sh_info;
1828
  for (; esym < esymend; esym++)
1829
    {
1830
      Elf_Internal_Sym isym;
1831
 
1832
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1833
 
1834
      if (isym.st_shndx == shndx
1835
          && isym.st_value > addr
1836
          && isym.st_value < toaddr)
1837
        {
1838
          isym.st_value -= count;
1839
          bfd_elf32_swap_symbol_out (abfd, &isym, esym);
1840
        }
1841
    }
1842
 
1843
  /* Now adjust the global symbols defined in this section.  */
1844
  esym = extsyms + symtab_hdr->sh_info;
1845
  esymend = extsyms + (symtab_hdr->sh_size / sizeof (Elf32_External_Sym));
1846
  for (index = 0; esym < esymend; esym++, index++)
1847
    {
1848
      Elf_Internal_Sym isym;
1849
 
1850
      bfd_elf32_swap_symbol_in (abfd, esym, &isym);
1851
      sym_hash = elf_sym_hashes (abfd)[index];
1852
      if (isym.st_shndx == shndx
1853
          && ((sym_hash)->root.type == bfd_link_hash_defined
1854
              || (sym_hash)->root.type == bfd_link_hash_defweak)
1855
          && (sym_hash)->root.u.def.section == sec
1856
          && (sym_hash)->root.u.def.value > addr
1857
          && (sym_hash)->root.u.def.value < toaddr)
1858
        {
1859
          (sym_hash)->root.u.def.value -= count;
1860
        }
1861
    }
1862
 
1863
  /* See if we can move the ALIGN reloc forward.  We have adjusted
1864
     r_offset for it already.  */
1865
  if (irelalign != NULL)
1866
    {
1867
      bfd_vma alignto, alignaddr;
1868
 
1869
      alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
1870
      alignaddr = BFD_ALIGN (irelalign->r_offset,
1871
                             1 << irelalign->r_addend);
1872
      if (alignto != alignaddr)
1873
        {
1874
          /* Tail recursion.  */
1875
          return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
1876
                                            alignto - alignaddr);
1877
        }
1878
    }
1879
 
1880
  return true;
1881
}
1882
 
1883
/* Look for loads and stores which we can align to four byte
1884
   boundaries.  This is like sh_align_loads in coff-sh.c.  */
1885
 
1886
static boolean
1887
sh_elf_align_loads (abfd, sec, internal_relocs, contents, pswapped)
1888
     bfd *abfd;
1889
     asection *sec;
1890
     Elf_Internal_Rela *internal_relocs;
1891
     bfd_byte *contents;
1892
     boolean *pswapped;
1893
{
1894
  Elf_Internal_Rela *irel, *irelend;
1895
  bfd_vma *labels = NULL;
1896
  bfd_vma *label, *label_end;
1897
 
1898
  *pswapped = false;
1899
 
1900
  irelend = internal_relocs + sec->reloc_count;
1901
 
1902
  /* Get all the addresses with labels on them.  */
1903
  labels = (bfd_vma *) bfd_malloc (sec->reloc_count * sizeof (bfd_vma));
1904
  if (labels == NULL)
1905
    goto error_return;
1906
  label_end = labels;
1907
  for (irel = internal_relocs; irel < irelend; irel++)
1908
    {
1909
      if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
1910
        {
1911
          *label_end = irel->r_offset;
1912
          ++label_end;
1913
        }
1914
    }
1915
 
1916
  /* Note that the assembler currently always outputs relocs in
1917
     address order.  If that ever changes, this code will need to sort
1918
     the label values and the relocs.  */
1919
 
1920
  label = labels;
1921
 
1922
  for (irel = internal_relocs; irel < irelend; irel++)
1923
    {
1924
      bfd_vma start, stop;
1925
 
1926
      if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
1927
        continue;
1928
 
1929
      start = irel->r_offset;
1930
 
1931
      for (irel++; irel < irelend; irel++)
1932
        if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
1933
          break;
1934
      if (irel < irelend)
1935
        stop = irel->r_offset;
1936
      else
1937
        stop = sec->_cooked_size;
1938
 
1939
      if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
1940
                                     (PTR) internal_relocs, &label,
1941
                                     label_end, start, stop, pswapped))
1942
        goto error_return;
1943
    }
1944
 
1945
  free (labels);
1946
 
1947
  return true;
1948
 
1949
 error_return:
1950
  if (labels != NULL)
1951
    free (labels);
1952
  return false;
1953
}
1954
 
1955
/* Swap two SH instructions.  This is like sh_swap_insns in coff-sh.c.  */
1956
 
1957
static boolean
1958
sh_elf_swap_insns (abfd, sec, relocs, contents, addr)
1959
     bfd *abfd;
1960
     asection *sec;
1961
     PTR relocs;
1962
     bfd_byte *contents;
1963
     bfd_vma addr;
1964
{
1965
  Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
1966
  unsigned short i1, i2;
1967
  Elf_Internal_Rela *irel, *irelend;
1968
 
1969
  /* Swap the instructions themselves.  */
1970
  i1 = bfd_get_16 (abfd, contents + addr);
1971
  i2 = bfd_get_16 (abfd, contents + addr + 2);
1972
  bfd_put_16 (abfd, i2, contents + addr);
1973
  bfd_put_16 (abfd, i1, contents + addr + 2);
1974
 
1975
  /* Adjust all reloc addresses.  */
1976
  irelend = internal_relocs + sec->reloc_count;
1977
  for (irel = internal_relocs; irel < irelend; irel++)
1978
    {
1979
      enum elf_sh_reloc_type type;
1980
      int add;
1981
 
1982
      /* There are a few special types of relocs that we don't want to
1983
         adjust.  These relocs do not apply to the instruction itself,
1984
         but are only associated with the address.  */
1985
      type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
1986
      if (type == R_SH_ALIGN
1987
          || type == R_SH_CODE
1988
          || type == R_SH_DATA
1989
          || type == R_SH_LABEL)
1990
        continue;
1991
 
1992
      /* If an R_SH_USES reloc points to one of the addresses being
1993
         swapped, we must adjust it.  It would be incorrect to do this
1994
         for a jump, though, since we want to execute both
1995
         instructions after the jump.  (We have avoided swapping
1996
         around a label, so the jump will not wind up executing an
1997
         instruction it shouldn't).  */
1998
      if (type == R_SH_USES)
1999
        {
2000
          bfd_vma off;
2001
 
2002
          off = irel->r_offset + 4 + irel->r_addend;
2003
          if (off == addr)
2004
            irel->r_offset += 2;
2005
          else if (off == addr + 2)
2006
            irel->r_offset -= 2;
2007
        }
2008
 
2009
      if (irel->r_offset == addr)
2010
        {
2011
          irel->r_offset += 2;
2012
          add = -2;
2013
        }
2014
      else if (irel->r_offset == addr + 2)
2015
        {
2016
          irel->r_offset -= 2;
2017
          add = 2;
2018
        }
2019
      else
2020
        add = 0;
2021
 
2022
      if (add != 0)
2023
        {
2024
          bfd_byte *loc;
2025
          unsigned short insn, oinsn;
2026
          boolean overflow;
2027
 
2028
          loc = contents + irel->r_offset;
2029
          overflow = false;
2030
          switch (type)
2031
            {
2032
            default:
2033
              break;
2034
 
2035
            case R_SH_DIR8WPN:
2036
            case R_SH_DIR8WPZ:
2037
              insn = bfd_get_16 (abfd, loc);
2038
              oinsn = insn;
2039
              insn += add / 2;
2040
              if ((oinsn & 0xff00) != (insn & 0xff00))
2041
                overflow = true;
2042
              bfd_put_16 (abfd, insn, loc);
2043
              break;
2044
 
2045
            case R_SH_IND12W:
2046
              insn = bfd_get_16 (abfd, loc);
2047
              oinsn = insn;
2048
              insn += add / 2;
2049
              if ((oinsn & 0xf000) != (insn & 0xf000))
2050
                overflow = true;
2051
              bfd_put_16 (abfd, insn, loc);
2052
              break;
2053
 
2054
            case R_SH_DIR8WPL:
2055
              /* This reloc ignores the least significant 3 bits of
2056
                 the program counter before adding in the offset.
2057
                 This means that if ADDR is at an even address, the
2058
                 swap will not affect the offset.  If ADDR is an at an
2059
                 odd address, then the instruction will be crossing a
2060
                 four byte boundary, and must be adjusted.  */
2061
              if ((addr & 3) != 0)
2062
                {
2063
                  insn = bfd_get_16 (abfd, loc);
2064
                  oinsn = insn;
2065
                  insn += add / 2;
2066
                  if ((oinsn & 0xff00) != (insn & 0xff00))
2067
                    overflow = true;
2068
                  bfd_put_16 (abfd, insn, loc);
2069
                }
2070
 
2071
              break;
2072
            }
2073
 
2074
          if (overflow)
2075
            {
2076
              ((*_bfd_error_handler)
2077
               (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
2078
                bfd_get_filename (abfd), (unsigned long) irel->r_offset));
2079
              bfd_set_error (bfd_error_bad_value);
2080
              return false;
2081
            }
2082
        }
2083
    }
2084
 
2085
  return true;
2086
}
2087
 
2088
/* The size in bytes of an entry in the procedure linkage table.  */
2089
 
2090
#define PLT_ENTRY_SIZE 28
2091
 
2092
/* First entry in an absolute procedure linkage table look like this.  */
2093
 
2094
#if 1
2095
/* Note - this code has been "optimised" not to use r2.  r2 is used by
2096
   GCC to return the address of large strutcures, so it should not be
2097
   corrupted here.  This does mean however, that this PLT does not conform
2098
   to the SH PIC ABI.  That spec says that r0 contains the type of the PLT
2099
   and r2 contains the GOT id.  This version stores the GOT id in r0 and
2100
   ignores the type.  Loaders can easily detect this difference however,
2101
   since the type will always be 0 or 8, and the GOT ids will always be
2102
   greater than or equal to 12.  */
2103
static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
2104
{
2105
  0xd0, 0x05,   /* mov.l 2f,r0 */
2106
  0x60, 0x02,   /* mov.l @r0,r0 */
2107
  0x2f, 0x06,   /* mov.l r0,@-r15 */
2108
  0xd0, 0x03,   /* mov.l 1f,r0 */
2109
  0x60, 0x02,   /* mov.l @r0,r0 */
2110
  0x40, 0x2b,   /* jmp @r0 */
2111
  0x60, 0xf6,   /*  mov.l @r15+,r0 */
2112
  0x00, 0x09,   /* nop */
2113
  0x00, 0x09,   /* nop */
2114
  0x00, 0x09,   /* nop */
2115
  0, 0, 0, 0,       /* 1: replaced with address of .got.plt + 8.  */
2116
  0, 0, 0, 0,       /* 2: replaced with address of .got.plt + 4.  */
2117
};
2118
 
2119
static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
2120
{
2121
  0x05, 0xd0,   /* mov.l 2f,r0 */
2122
  0x02, 0x60,   /* mov.l @r0,r0 */
2123
  0x06, 0x2f,   /* mov.l r0,@-r15 */
2124
  0x03, 0xd0,   /* mov.l 1f,r0 */
2125
  0x02, 0x60,   /* mov.l @r0,r0 */
2126
  0x2b, 0x40,   /* jmp @r0 */
2127
  0xf6, 0x60,   /*  mov.l @r15+,r0 */
2128
  0x09, 0x00,   /* nop */
2129
  0x09, 0x00,   /* nop */
2130
  0x09, 0x00,   /* nop */
2131
  0, 0, 0, 0,       /* 1: replaced with address of .got.plt + 8.  */
2132
  0, 0, 0, 0,       /* 2: replaced with address of .got.plt + 4.  */
2133
};
2134
 
2135
/* Sebsequent entries in an absolute procedure linkage table look like
2136
   this.  */
2137
 
2138
static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
2139
{
2140
  0xd0, 0x04,   /* mov.l 1f,r0 */
2141
  0x60, 0x02,   /* mov.l @r0,r0 */
2142
  0xd1, 0x02,   /* mov.l 0f,r1 */
2143
  0x40, 0x2b,   /* jmp @r0 */
2144
  0x60, 0x13,   /*  mov r1,r0 */
2145
  0xd1, 0x03,   /* mov.l 2f,r1 */
2146
  0x40, 0x2b,   /* jmp @r0 */
2147
  0x00, 0x09,   /* nop */
2148
  0, 0, 0, 0,       /* 0: replaced with address of .PLT0.  */
2149
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2150
  0, 0, 0, 0,       /* 2: replaced with offset into relocation table.  */
2151
};
2152
 
2153
static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
2154
{
2155
  0x04, 0xd0,   /* mov.l 1f,r0 */
2156
  0x02, 0x60,   /* mov.l @r0,r0 */
2157
  0x02, 0xd1,   /* mov.l 0f,r1 */
2158
  0x2b, 0x40,   /* jmp @r0 */
2159
  0x13, 0x60,   /*  mov r1,r0 */
2160
  0x03, 0xd1,   /* mov.l 2f,r1 */
2161
  0x2b, 0x40,   /* jmp @r0 */
2162
  0x09, 0x00,   /*  nop */
2163
  0, 0, 0, 0,       /* 0: replaced with address of .PLT0.  */
2164
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2165
  0, 0, 0, 0,       /* 2: replaced with offset into relocation table.  */
2166
};
2167
 
2168
/* Entries in a PIC procedure linkage table look like this.  */
2169
 
2170
static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
2171
{
2172
  0xd0, 0x04,   /* mov.l 1f,r0 */
2173
  0x00, 0xce,   /* mov.l @(r0,r12),r0 */
2174
  0x40, 0x2b,   /* jmp @r0 */
2175
  0x00, 0x09,   /*  nop */
2176
  0x50, 0xc2,   /* mov.l @(8,r12),r0 */
2177
  0xd1, 0x03,   /* mov.l 2f,r1 */
2178
  0x40, 0x2b,   /* jmp @r0 */
2179
  0x50, 0xc1,   /*  mov.l @(4,r12),r0 */
2180
  0x00, 0x09,   /* nop */
2181
  0x00, 0x09,   /* nop */
2182
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2183
  0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
2184
};
2185
 
2186
static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
2187
{
2188
  0x04, 0xd0,   /* mov.l 1f,r0 */
2189
  0xce, 0x00,   /* mov.l @(r0,r12),r0 */
2190
  0x2b, 0x40,   /* jmp @r0 */
2191
  0x09, 0x00,   /*  nop */
2192
  0xc2, 0x50,   /* mov.l @(8,r12),r0 */
2193
  0x03, 0xd1,   /* mov.l 2f,r1 */
2194
  0x2b, 0x40,   /* jmp @r0 */
2195
  0xc1, 0x50,   /*  mov.l @(4,r12),r0 */
2196
  0x09, 0x00,   /*  nop */
2197
  0x09, 0x00,   /* nop */
2198
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2199
  0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
2200
};
2201
 
2202
#else /* These are the old style PLT entries.  */
2203
static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
2204
{
2205
  0xd0, 0x04,   /* mov.l 1f,r0 */
2206
  0xd2, 0x05,   /* mov.l 2f,r2 */
2207
  0x60, 0x02,   /* mov.l @r0,r0 */
2208
  0x62, 0x22,   /* mov.l @r2,r2 */
2209
  0x40, 0x2b,   /* jmp @r0 */
2210
  0xe0, 0x00,   /*  mov #0,r0 */
2211
  0x00, 0x09,   /* nop */
2212
  0x00, 0x09,   /* nop */
2213
  0x00, 0x09,   /* nop */
2214
  0x00, 0x09,   /* nop */
2215
  0, 0, 0, 0,       /* 1: replaced with address of .got.plt + 8.  */
2216
  0, 0, 0, 0,       /* 2: replaced with address of .got.plt + 4.  */
2217
};
2218
 
2219
static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
2220
{
2221
  0x04, 0xd0,   /* mov.l 1f,r0 */
2222
  0x05, 0xd2,   /* mov.l 2f,r2 */
2223
  0x02, 0x60,   /* mov.l @r0,r0 */
2224
  0x22, 0x62,   /* mov.l @r2,r2 */
2225
  0x2b, 0x40,   /* jmp @r0 */
2226
  0x00, 0xe0,   /*  mov #0,r0 */
2227
  0x09, 0x00,   /* nop */
2228
  0x09, 0x00,   /* nop */
2229
  0x09, 0x00,   /* nop */
2230
  0x09, 0x00,   /* nop */
2231
  0, 0, 0, 0,       /* 1: replaced with address of .got.plt + 8.  */
2232
  0, 0, 0, 0,       /* 2: replaced with address of .got.plt + 4.  */
2233
};
2234
 
2235
/* Sebsequent entries in an absolute procedure linkage table look like
2236
   this.  */
2237
 
2238
static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
2239
{
2240
  0xd0, 0x04,   /* mov.l 1f,r0 */
2241
  0x60, 0x02,   /* mov.l @r0,r0 */
2242
  0xd2, 0x02,   /* mov.l 0f,r2 */
2243
  0x40, 0x2b,   /* jmp @r0 */
2244
  0x60, 0x23,   /*  mov r2,r0 */
2245
  0xd1, 0x03,   /* mov.l 2f,r1 */
2246
  0x40, 0x2b,   /* jmp @r0 */
2247
  0x00, 0x09,   /* nop */
2248
  0, 0, 0, 0,       /* 0: replaced with address of .PLT0.  */
2249
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2250
  0, 0, 0, 0,       /* 2: replaced with offset into relocation table.  */
2251
};
2252
 
2253
static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
2254
{
2255
  0x04, 0xd0,   /* mov.l 1f,r0 */
2256
  0x02, 0x60,   /* mov.l @r0,r0 */
2257
  0x02, 0xd2,   /* mov.l 0f,r2 */
2258
  0x2b, 0x40,   /* jmp @r0 */
2259
  0x23, 0x60,   /*  mov r2,r0 */
2260
  0x03, 0xd1,   /* mov.l 2f,r1 */
2261
  0x2b, 0x40,   /* jmp @r0 */
2262
  0x09, 0x00,   /*  nop */
2263
  0, 0, 0, 0,       /* 0: replaced with address of .PLT.  */
2264
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2265
  0, 0, 0, 0,       /* 2: replaced with offset into relocation table.  */
2266
};
2267
 
2268
/* Entries in a PIC procedure linkage table look like this.  */
2269
 
2270
static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
2271
{
2272
  0xd0, 0x04,   /* mov.l 1f,r0 */
2273
  0x00, 0xce,   /* mov.l @(r0,r12),r0 */
2274
  0x40, 0x2b,   /* jmp @r0 */
2275
  0x00, 0x09,   /*  nop */
2276
  0x50, 0xc2,   /* 0: mov.l @(8,r12),r0 */
2277
  0x52, 0xc1,   /* 1: mov.l @(4,r12),r2 */
2278
  0xd1, 0x02,   /* mov.l 2f,r1 */
2279
  0x40, 0x2b,   /* jmp @r0 */
2280
  0xe0, 0x00,   /*  mov #0,r0 ! shows the type of PLT.  */
2281
  0x00, 0x09,   /* nop */
2282
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2283
  0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
2284
};
2285
 
2286
static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
2287
{
2288
  0x04, 0xd0,   /* mov.l 1f,r0 */
2289
  0xce, 0x00,   /* mov.l @(r0,r12),r0 */
2290
  0x2b, 0x40,   /* jmp @r0 */
2291
  0x09, 0x00,   /*  nop */
2292
  0xc2, 0x50,   /* 0: mov.l @(8,r12),r0 */
2293
  0xc1, 0x52,   /* 1: mov.l @(4,r12),r2 */
2294
  0x02, 0xd1,   /* mov.l 2f,r1 */
2295
  0x2b, 0x40,   /* jmp @r0 */
2296
  0x00, 0xe0,   /*  mov #0,r0 ! shows the type of PLT.  */
2297
  0x09, 0x00,   /* nop */
2298
  0, 0, 0, 0,       /* 1: replaced with address of this symbol in .got.  */
2299
  0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
2300
};
2301
#endif /* old style PLT entries.  */
2302
 
2303
static const bfd_byte *elf_sh_plt0_entry;
2304
static const bfd_byte *elf_sh_plt_entry;
2305
static const bfd_byte *elf_sh_pic_plt_entry;
2306
 
2307
/* Return size of a PLT entry.  */
2308
#define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
2309
 
2310
/* Return offset of the PLT0 address in an absolute PLT entry.  */
2311
#define elf_sh_plt_plt0_offset(info) 16
2312
 
2313
/* Return offset of the linker in PLT0 entry.  */
2314
#define elf_sh_plt0_linker_offset(info) 20
2315
 
2316
/* Return offset of the GOT id in PLT0 entry.  */
2317
#define elf_sh_plt0_gotid_offset(info) 24
2318
 
2319
/* Return offset of the tempoline in PLT entry */
2320
#define elf_sh_plt_temp_offset(info) 8
2321
 
2322
/* Return offset of the symbol in PLT entry.  */
2323
#define elf_sh_plt_symbol_offset(info) 20
2324
 
2325
/* Return offset of the relocation in PLT entry.  */
2326
#define elf_sh_plt_reloc_offset(info) 24
2327
 
2328
/* The sh linker needs to keep track of the number of relocs that it
2329
   decides to copy in check_relocs for each symbol.  This is so that
2330
   it can discard PC relative relocs if it doesn't need them when
2331
   linking with -Bsymbolic.  We store the information in a field
2332
   extending the regular ELF linker hash table.  */
2333
 
2334
/* This structure keeps track of the number of PC relative relocs we
2335
   have copied for a given symbol.  */
2336
 
2337
struct elf_sh_pcrel_relocs_copied
2338
{
2339
  /* Next section.  */
2340
  struct elf_sh_pcrel_relocs_copied *next;
2341
  /* A section in dynobj.  */
2342
  asection *section;
2343
  /* Number of relocs copied in this section.  */
2344
  bfd_size_type count;
2345
};
2346
 
2347
/* sh ELF linker hash entry.  */
2348
 
2349
struct elf_sh_link_hash_entry
2350
{
2351
  struct elf_link_hash_entry root;
2352
 
2353
  /* Number of PC relative relocs copied for this symbol.  */
2354
  struct elf_sh_pcrel_relocs_copied *pcrel_relocs_copied;
2355
};
2356
 
2357
/* sh ELF linker hash table.  */
2358
 
2359
struct elf_sh_link_hash_table
2360
{
2361
  struct elf_link_hash_table root;
2362
};
2363
 
2364
/* Declare this now that the above structures are defined.  */
2365
 
2366
static boolean sh_elf_discard_copies
2367
  PARAMS ((struct elf_sh_link_hash_entry *, PTR));
2368
 
2369
/* Traverse an sh ELF linker hash table.  */
2370
 
2371
#define sh_elf_link_hash_traverse(table, func, info)                    \
2372
  (elf_link_hash_traverse                                               \
2373
   (&(table)->root,                                                     \
2374
    (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
2375
    (info)))
2376
 
2377
/* Get the sh ELF linker hash table from a link_info structure.  */
2378
 
2379
#define sh_elf_hash_table(p) \
2380
  ((struct elf_sh_link_hash_table *) ((p)->hash))
2381
 
2382
/* Create an entry in an sh ELF linker hash table.  */
2383
 
2384
static struct bfd_hash_entry *
2385
sh_elf_link_hash_newfunc (entry, table, string)
2386
     struct bfd_hash_entry *entry;
2387
     struct bfd_hash_table *table;
2388
     const char *string;
2389
{
2390
  struct elf_sh_link_hash_entry *ret =
2391
    (struct elf_sh_link_hash_entry *) entry;
2392
 
2393
  /* Allocate the structure if it has not already been allocated by a
2394
     subclass.  */
2395
  if (ret == (struct elf_sh_link_hash_entry *) NULL)
2396
    ret = ((struct elf_sh_link_hash_entry *)
2397
           bfd_hash_allocate (table,
2398
                              sizeof (struct elf_sh_link_hash_entry)));
2399
  if (ret == (struct elf_sh_link_hash_entry *) NULL)
2400
    return (struct bfd_hash_entry *) ret;
2401
 
2402
  /* Call the allocation method of the superclass.  */
2403
  ret = ((struct elf_sh_link_hash_entry *)
2404
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2405
                                     table, string));
2406
  if (ret != (struct elf_sh_link_hash_entry *) NULL)
2407
    {
2408
      ret->pcrel_relocs_copied = NULL;
2409
    }
2410
 
2411
  return (struct bfd_hash_entry *) ret;
2412
}
2413
 
2414
/* Create an sh ELF linker hash table.  */
2415
 
2416
static struct bfd_link_hash_table *
2417
sh_elf_link_hash_table_create (abfd)
2418
     bfd *abfd;
2419
{
2420
  struct elf_sh_link_hash_table *ret;
2421
 
2422
  ret = ((struct elf_sh_link_hash_table *)
2423
         bfd_alloc (abfd, sizeof (struct elf_sh_link_hash_table)));
2424
  if (ret == (struct elf_sh_link_hash_table *) NULL)
2425
    return NULL;
2426
 
2427
  if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2428
                                       sh_elf_link_hash_newfunc))
2429
    {
2430
      bfd_release (abfd, ret);
2431
      return NULL;
2432
    }
2433
 
2434
  return &ret->root.root;
2435
}
2436
 
2437
/* Create dynamic sections when linking against a dynamic object.  */
2438
 
2439
static boolean
2440
sh_elf_create_dynamic_sections (abfd, info)
2441
     bfd *abfd;
2442
     struct bfd_link_info *info;
2443
{
2444
  flagword flags, pltflags;
2445
  register asection *s;
2446
  struct elf_backend_data *bed = get_elf_backend_data (abfd);
2447
  int ptralign = 0;
2448
 
2449
  switch (bed->s->arch_size)
2450
    {
2451
    case 32:
2452
      ptralign = 2;
2453
      break;
2454
 
2455
    case 64:
2456
      ptralign = 3;
2457
      break;
2458
 
2459
    default:
2460
      bfd_set_error (bfd_error_bad_value);
2461
      return false;
2462
    }
2463
 
2464
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2465
     .rel[a].bss sections.  */
2466
 
2467
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2468
           | SEC_LINKER_CREATED);
2469
 
2470
  pltflags = flags;
2471
  pltflags |= SEC_CODE;
2472
  if (bed->plt_not_loaded)
2473
    pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
2474
  if (bed->plt_readonly)
2475
    pltflags |= SEC_READONLY;
2476
 
2477
  s = bfd_make_section (abfd, ".plt");
2478
  if (s == NULL
2479
      || ! bfd_set_section_flags (abfd, s, pltflags)
2480
      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2481
    return false;
2482
 
2483
  if (bed->want_plt_sym)
2484
    {
2485
      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2486
         .plt section.  */
2487
      struct elf_link_hash_entry *h = NULL;
2488
      if (! (_bfd_generic_link_add_one_symbol
2489
             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
2490
              (bfd_vma) 0, (const char *) NULL, false,
2491
              get_elf_backend_data (abfd)->collect,
2492
              (struct bfd_link_hash_entry **) &h)))
2493
        return false;
2494
      h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2495
      h->type = STT_OBJECT;
2496
 
2497
      if (info->shared
2498
          && ! _bfd_elf_link_record_dynamic_symbol (info, h))
2499
        return false;
2500
    }
2501
 
2502
  s = bfd_make_section (abfd,
2503
                        bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
2504
  if (s == NULL
2505
      || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2506
      || ! bfd_set_section_alignment (abfd, s, ptralign))
2507
    return false;
2508
 
2509
  if (! _bfd_elf_create_got_section (abfd, info))
2510
    return false;
2511
 
2512
  {
2513
    const char *secname;
2514
    char *relname;
2515
    flagword secflags;
2516
    asection *sec;
2517
 
2518
    for (sec = abfd->sections; sec; sec = sec->next)
2519
      {
2520
        secflags = bfd_get_section_flags (abfd, sec);
2521
        if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
2522
            || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
2523
          continue;
2524
        secname = bfd_get_section_name (abfd, sec);
2525
        relname = (char *) bfd_malloc (strlen (secname) + 6);
2526
        strcpy (relname, ".rela");
2527
        strcat (relname, secname);
2528
        s = bfd_make_section (abfd, relname);
2529
        if (s == NULL
2530
            || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2531
            || ! bfd_set_section_alignment (abfd, s, ptralign))
2532
          return false;
2533
      }
2534
  }
2535
 
2536
  if (bed->want_dynbss)
2537
    {
2538
      /* The .dynbss section is a place to put symbols which are defined
2539
         by dynamic objects, are referenced by regular objects, and are
2540
         not functions.  We must allocate space for them in the process
2541
         image and use a R_*_COPY reloc to tell the dynamic linker to
2542
         initialize them at run time.  The linker script puts the .dynbss
2543
         section into the .bss section of the final image.  */
2544
      s = bfd_make_section (abfd, ".dynbss");
2545
      if (s == NULL
2546
          || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
2547
        return false;
2548
 
2549
      /* The .rel[a].bss section holds copy relocs.  This section is not
2550
         normally needed.  We need to create it here, though, so that the
2551
         linker will map it to an output section.  We can't just create it
2552
         only if we need it, because we will not know whether we need it
2553
         until we have seen all the input files, and the first time the
2554
         main linker code calls BFD after examining all the input files
2555
         (size_dynamic_sections) the input sections have already been
2556
         mapped to the output sections.  If the section turns out not to
2557
         be needed, we can discard it later.  We will never need this
2558
         section when generating a shared object, since they do not use
2559
         copy relocs.  */
2560
      if (! info->shared)
2561
        {
2562
          s = bfd_make_section (abfd,
2563
                                (bed->default_use_rela_p
2564
                                 ? ".rela.bss" : ".rel.bss"));
2565
          if (s == NULL
2566
              || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2567
              || ! bfd_set_section_alignment (abfd, s, ptralign))
2568
            return false;
2569
        }
2570
    }
2571
 
2572
  return true;
2573
}
2574
 
2575
/* Adjust a symbol defined by a dynamic object and referenced by a
2576
   regular object.  The current definition is in some section of the
2577
   dynamic object, but we're not including those sections.  We have to
2578
   change the definition to something the rest of the link can
2579
   understand.  */
2580
 
2581
static boolean
2582
sh_elf_adjust_dynamic_symbol (info, h)
2583
     struct bfd_link_info *info;
2584
     struct elf_link_hash_entry *h;
2585
{
2586
  bfd *dynobj;
2587
  asection *s;
2588
  unsigned int power_of_two;
2589
 
2590
  dynobj = elf_hash_table (info)->dynobj;
2591
 
2592
  /* Make sure we know what is going on here.  */
2593
  BFD_ASSERT (dynobj != NULL
2594
              && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
2595
                  || h->weakdef != NULL
2596
                  || ((h->elf_link_hash_flags
2597
                       & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2598
                      && (h->elf_link_hash_flags
2599
                          & ELF_LINK_HASH_REF_REGULAR) != 0
2600
                      && (h->elf_link_hash_flags
2601
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)));
2602
 
2603
  /* If this is a function, put it in the procedure linkage table.  We
2604
     will fill in the contents of the procedure linkage table later,
2605
     when we know the address of the .got section.  */
2606
  if (h->type == STT_FUNC
2607
      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2608
    {
2609
      if (! info->shared
2610
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2611
          && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
2612
        {
2613
          /* This case can occur if we saw a PLT reloc in an input
2614
             file, but the symbol was never referred to by a dynamic
2615
             object.  In such a case, we don't actually need to build
2616
             a procedure linkage table, and we can just do a REL32
2617
             reloc instead.  */
2618
          BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
2619
          return true;
2620
        }
2621
 
2622
      /* Make sure this symbol is output as a dynamic symbol.  */
2623
      if (h->dynindx == -1)
2624
        {
2625
          if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2626
            return false;
2627
        }
2628
 
2629
      s = bfd_get_section_by_name (dynobj, ".plt");
2630
      BFD_ASSERT (s != NULL);
2631
 
2632
      /* If this is the first .plt entry, make room for the special
2633
         first entry.  */
2634
      if (s->_raw_size == 0)
2635
        s->_raw_size += PLT_ENTRY_SIZE;
2636
 
2637
      /* If this symbol is not defined in a regular file, and we are
2638
         not generating a shared library, then set the symbol to this
2639
         location in the .plt.  This is required to make function
2640
         pointers compare as equal between the normal executable and
2641
         the shared library.  */
2642
      if (! info->shared
2643
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2644
        {
2645
          h->root.u.def.section = s;
2646
          h->root.u.def.value = s->_raw_size;
2647
        }
2648
 
2649
      h->plt.offset = s->_raw_size;
2650
 
2651
      /* Make room for this entry.  */
2652
      s->_raw_size += elf_sh_sizeof_plt (info);
2653
 
2654
      /* We also need to make an entry in the .got.plt section, which
2655
         will be placed in the .got section by the linker script.  */
2656
 
2657
      s = bfd_get_section_by_name (dynobj, ".got.plt");
2658
      BFD_ASSERT (s != NULL);
2659
      s->_raw_size += 4;
2660
 
2661
      /* We also need to make an entry in the .rela.plt section.  */
2662
 
2663
      s = bfd_get_section_by_name (dynobj, ".rela.plt");
2664
      BFD_ASSERT (s != NULL);
2665
      s->_raw_size += sizeof (Elf32_External_Rela);
2666
 
2667
      return true;
2668
    }
2669
 
2670
  /* If this is a weak symbol, and there is a real definition, the
2671
     processor independent code will have arranged for us to see the
2672
     real definition first, and we can just use the same value.  */
2673
  if (h->weakdef != NULL)
2674
    {
2675
      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2676
                  || h->weakdef->root.type == bfd_link_hash_defweak);
2677
      h->root.u.def.section = h->weakdef->root.u.def.section;
2678
      h->root.u.def.value = h->weakdef->root.u.def.value;
2679
      return true;
2680
    }
2681
 
2682
  /* This is a reference to a symbol defined by a dynamic object which
2683
     is not a function.  */
2684
 
2685
  /* If we are creating a shared library, we must presume that the
2686
     only references to the symbol are via the global offset table.
2687
     For such cases we need not do anything here; the relocations will
2688
     be handled correctly by relocate_section.  */
2689
  if (info->shared)
2690
    return true;
2691
 
2692
  /* If there are no references to this symbol that do not use the
2693
     GOT, we don't need to generate a copy reloc.  */
2694
  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2695
    return true;
2696
 
2697
  /* We must allocate the symbol in our .dynbss section, which will
2698
     become part of the .bss section of the executable.  There will be
2699
     an entry for this symbol in the .dynsym section.  The dynamic
2700
     object will contain position independent code, so all references
2701
     from the dynamic object to this symbol will go through the global
2702
     offset table.  The dynamic linker will use the .dynsym entry to
2703
     determine the address it must put in the global offset table, so
2704
     both the dynamic object and the regular object will refer to the
2705
     same memory location for the variable.  */
2706
 
2707
  s = bfd_get_section_by_name (dynobj, ".dynbss");
2708
  BFD_ASSERT (s != NULL);
2709
 
2710
  /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
2711
     copy the initial value out of the dynamic object and into the
2712
     runtime process image.  We need to remember the offset into the
2713
     .rela.bss section we are going to use.  */
2714
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2715
    {
2716
      asection *srel;
2717
 
2718
      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
2719
      BFD_ASSERT (srel != NULL);
2720
      srel->_raw_size += sizeof (Elf32_External_Rela);
2721
      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2722
    }
2723
 
2724
  /* We need to figure out the alignment required for this symbol.  I
2725
     have no idea how ELF linkers handle this.  */
2726
  power_of_two = bfd_log2 (h->size);
2727
  if (power_of_two > 3)
2728
    power_of_two = 3;
2729
 
2730
  /* Apply the required alignment.  */
2731
  s->_raw_size = BFD_ALIGN (s->_raw_size,
2732
                            (bfd_size_type) (1 << power_of_two));
2733
  if (power_of_two > bfd_get_section_alignment (dynobj, s))
2734
    {
2735
      if (! bfd_set_section_alignment (dynobj, s, power_of_two))
2736
        return false;
2737
    }
2738
 
2739
  /* Define the symbol as being at this point in the section.  */
2740
  h->root.u.def.section = s;
2741
  h->root.u.def.value = s->_raw_size;
2742
 
2743
  /* Increment the section size to make room for the symbol.  */
2744
  s->_raw_size += h->size;
2745
 
2746
  return true;
2747
}
2748
 
2749
/* Set the sizes of the dynamic sections.  */
2750
 
2751
static boolean
2752
sh_elf_size_dynamic_sections (output_bfd, info)
2753
     bfd *output_bfd;
2754
     struct bfd_link_info *info;
2755
{
2756
  bfd *dynobj;
2757
  asection *s;
2758
  boolean plt;
2759
  boolean relocs;
2760
  boolean reltext;
2761
 
2762
  dynobj = elf_hash_table (info)->dynobj;
2763
  BFD_ASSERT (dynobj != NULL);
2764
 
2765
  if (elf_hash_table (info)->dynamic_sections_created)
2766
    {
2767
      /* Set the contents of the .interp section to the interpreter.  */
2768
      if (! info->shared)
2769
        {
2770
          s = bfd_get_section_by_name (dynobj, ".interp");
2771
          BFD_ASSERT (s != NULL);
2772
          s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
2773
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2774
        }
2775
    }
2776
  else
2777
    {
2778
      /* We may have created entries in the .rela.got section.
2779
         However, if we are not creating the dynamic sections, we will
2780
         not actually use these entries.  Reset the size of .rela.got,
2781
         which will cause it to get stripped from the output file
2782
         below.  */
2783
      s = bfd_get_section_by_name (dynobj, ".rela.got");
2784
      if (s != NULL)
2785
        s->_raw_size = 0;
2786
    }
2787
 
2788
  /* If this is a -Bsymbolic shared link, then we need to discard all
2789
     PC relative relocs against symbols defined in a regular object.
2790
     We allocated space for them in the check_relocs routine, but we
2791
     will not fill them in in the relocate_section routine.  */
2792
  if (info->shared && info->symbolic)
2793
    sh_elf_link_hash_traverse (sh_elf_hash_table (info),
2794
                                 sh_elf_discard_copies,
2795
                                 (PTR) NULL);
2796
 
2797
  /* The check_relocs and adjust_dynamic_symbol entry points have
2798
     determined the sizes of the various dynamic sections.  Allocate
2799
     memory for them.  */
2800
  plt = false;
2801
  relocs = false;
2802
  reltext = false;
2803
  for (s = dynobj->sections; s != NULL; s = s->next)
2804
    {
2805
      const char *name;
2806
      boolean strip;
2807
 
2808
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2809
        continue;
2810
 
2811
      /* It's OK to base decisions on the section name, because none
2812
         of the dynobj section names depend upon the input files.  */
2813
      name = bfd_get_section_name (dynobj, s);
2814
 
2815
      strip = false;
2816
 
2817
      if (strcmp (name, ".plt") == 0)
2818
        {
2819
          if (s->_raw_size == 0)
2820
            {
2821
              /* Strip this section if we don't need it; see the
2822
                 comment below.  */
2823
              strip = true;
2824
            }
2825
          else
2826
            {
2827
              /* Remember whether there is a PLT.  */
2828
              plt = true;
2829
            }
2830
        }
2831
      else if (strncmp (name, ".rela", 5) == 0)
2832
        {
2833
          if (s->_raw_size == 0)
2834
            {
2835
              /* If we don't need this section, strip it from the
2836
                 output file.  This is mostly to handle .rela.bss and
2837
                 .rela.plt.  We must create both sections in
2838
                 create_dynamic_sections, because they must be created
2839
                 before the linker maps input sections to output
2840
                 sections.  The linker does that before
2841
                 adjust_dynamic_symbol is called, and it is that
2842
                 function which decides whether anything needs to go
2843
                 into these sections.  */
2844
              strip = true;
2845
            }
2846
          else
2847
            {
2848
              asection *target;
2849
 
2850
              /* Remember whether there are any reloc sections other
2851
                 than .rela.plt.  */
2852
              if (strcmp (name, ".rela.plt") != 0)
2853
                {
2854
                  const char *outname;
2855
 
2856
                  relocs = true;
2857
 
2858
                  /* If this relocation section applies to a read only
2859
                     section, then we probably need a DT_TEXTREL
2860
                     entry.  The entries in the .rela.plt section
2861
                     really apply to the .got section, which we
2862
                     created ourselves and so know is not readonly.  */
2863
                  outname = bfd_get_section_name (output_bfd,
2864
                                                  s->output_section);
2865
                  target = bfd_get_section_by_name (output_bfd, outname + 5);
2866
                  if (target != NULL
2867
                      && (target->flags & SEC_READONLY) != 0
2868
                      && (target->flags & SEC_ALLOC) != 0)
2869
                    reltext = true;
2870
                }
2871
 
2872
              /* We use the reloc_count field as a counter if we need
2873
                 to copy relocs into the output file.  */
2874
              s->reloc_count = 0;
2875
            }
2876
        }
2877
      else if (strncmp (name, ".got", 4) != 0)
2878
        {
2879
          /* It's not one of our sections, so don't allocate space.  */
2880
          continue;
2881
        }
2882
 
2883
      if (strip)
2884
        {
2885
          _bfd_strip_section_from_output (info, s);
2886
          continue;
2887
        }
2888
 
2889
      /* Allocate memory for the section contents.  */
2890
      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
2891
      if (s->contents == NULL && s->_raw_size != 0)
2892
        return false;
2893
    }
2894
 
2895
  if (elf_hash_table (info)->dynamic_sections_created)
2896
    {
2897
      /* Add some entries to the .dynamic section.  We fill in the
2898
         values later, in sh_elf_finish_dynamic_sections, but we
2899
         must add the entries now so that we get the correct size for
2900
         the .dynamic section.  The DT_DEBUG entry is filled in by the
2901
         dynamic linker and used by the debugger.  */
2902
      if (! info->shared)
2903
        {
2904
          if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
2905
            return false;
2906
        }
2907
 
2908
      if (plt)
2909
        {
2910
          if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
2911
              || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
2912
              || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
2913
              || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
2914
            return false;
2915
        }
2916
 
2917
      if (relocs)
2918
        {
2919
          if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
2920
              || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
2921
              || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
2922
                                                sizeof (Elf32_External_Rela)))
2923
            return false;
2924
        }
2925
 
2926
      if (reltext)
2927
        {
2928
          if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
2929
            return false;
2930
        }
2931
    }
2932
 
2933
  return true;
2934
}
2935
 
2936
/* This function is called via sh_elf_link_hash_traverse if we are
2937
   creating a shared object with -Bsymbolic.  It discards the space
2938
   allocated to copy PC relative relocs against symbols which are
2939
   defined in regular objects.  We allocated space for them in the
2940
   check_relocs routine, but we won't fill them in in the
2941
   relocate_section routine.  */
2942
 
2943
static boolean
2944
sh_elf_discard_copies (h, ignore)
2945
     struct elf_sh_link_hash_entry *h;
2946
     PTR ignore ATTRIBUTE_UNUSED;
2947
{
2948
  struct elf_sh_pcrel_relocs_copied *s;
2949
 
2950
  /* We only discard relocs for symbols defined in a regular object.  */
2951
  if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2952
    return true;
2953
 
2954
  for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
2955
    s->section->_raw_size -= s->count * sizeof (Elf32_External_Rela);
2956
 
2957
  return true;
2958
}
2959
 
2960
/* Relocate an SH ELF section.  */
2961
 
2962
static boolean
2963
sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
2964
                         contents, relocs, local_syms, local_sections)
2965
     bfd *output_bfd ATTRIBUTE_UNUSED;
2966
     struct bfd_link_info *info;
2967
     bfd *input_bfd;
2968
     asection *input_section;
2969
     bfd_byte *contents;
2970
     Elf_Internal_Rela *relocs;
2971
     Elf_Internal_Sym *local_syms;
2972
     asection **local_sections;
2973
{
2974
  Elf_Internal_Shdr *symtab_hdr;
2975
  struct elf_link_hash_entry **sym_hashes;
2976
  Elf_Internal_Rela *rel, *relend;
2977
  bfd *dynobj;
2978
  bfd_vma *local_got_offsets;
2979
  asection *sgot;
2980
  asection *splt;
2981
  asection *sreloc;
2982
 
2983
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2984
  sym_hashes = elf_sym_hashes (input_bfd);
2985
  dynobj = elf_hash_table (info)->dynobj;
2986
  local_got_offsets = elf_local_got_offsets (input_bfd);
2987
 
2988
  sgot = NULL;
2989
  splt = NULL;
2990
  sreloc = NULL;
2991
 
2992
  rel = relocs;
2993
  relend = relocs + input_section->reloc_count;
2994
  for (; rel < relend; rel++)
2995
    {
2996
      int r_type;
2997
      reloc_howto_type *howto;
2998
      unsigned long r_symndx;
2999
      Elf_Internal_Sym *sym;
3000
      asection *sec;
3001
      struct elf_link_hash_entry *h;
3002
      bfd_vma relocation;
3003
      bfd_vma addend = (bfd_vma) 0;
3004
      bfd_reloc_status_type r;
3005
 
3006
      r_symndx = ELF32_R_SYM (rel->r_info);
3007
 
3008
      r_type = ELF32_R_TYPE (rel->r_info);
3009
 
3010
      /* Many of the relocs are only used for relaxing, and are
3011
         handled entirely by the relaxation code.  */
3012
      if (r_type > (int) R_SH_LAST_INVALID_RELOC
3013
          && r_type < (int) R_SH_LOOP_START)
3014
        continue;
3015
      if (r_type == (int) R_SH_NONE)
3016
        continue;
3017
 
3018
      if (r_type < 0
3019
          || r_type >= R_SH_max
3020
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
3021
              && r_type <= (int) R_SH_LAST_INVALID_RELOC)
3022
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
3023
              && r_type <= (int) R_SH_LAST_INVALID_RELOC_2))
3024
        {
3025
          bfd_set_error (bfd_error_bad_value);
3026
          return false;
3027
        }
3028
 
3029
      howto = sh_elf_howto_table + r_type;
3030
 
3031
      /* This is a final link.  */
3032
      h = NULL;
3033
      sym = NULL;
3034
      sec = NULL;
3035
      if (r_symndx < symtab_hdr->sh_info)
3036
        {
3037
          sym = local_syms + r_symndx;
3038
          sec = local_sections[r_symndx];
3039
          relocation = (sec->output_section->vma
3040
                        + sec->output_offset
3041
                        + sym->st_value);
3042
 
3043
          if (info->relocateable)
3044
            {
3045
              /* This is a relocateable link.  We don't have to change
3046
                 anything, unless the reloc is against a section symbol,
3047
                 in which case we have to adjust according to where the
3048
                 section symbol winds up in the output section.  */
3049
              sym = local_syms + r_symndx;
3050
              if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3051
                goto final_link_relocate;
3052
 
3053
              continue;
3054
            }
3055
        }
3056
      else
3057
        {
3058
          /* Section symbol are never (?) placed in the hash table, so
3059
             we can just ignore hash relocations when creating a
3060
             relocateable object file.  */
3061
          if (info->relocateable)
3062
            continue;
3063
 
3064
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3065
          while (h->root.type == bfd_link_hash_indirect
3066
                 || h->root.type == bfd_link_hash_warning)
3067
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
3068
          if (h->root.type == bfd_link_hash_defined
3069
              || h->root.type == bfd_link_hash_defweak)
3070
            {
3071
              sec = h->root.u.def.section;
3072
              /* In these cases, we don't need the relocation value.
3073
                 We check specially because in some obscure cases
3074
                 sec->output_section will be NULL.  */
3075
              if (r_type == R_SH_GOTPC
3076
                  || (r_type == R_SH_PLT32
3077
                      && h->plt.offset != (bfd_vma) -1)
3078
                  || (r_type == R_SH_GOT32
3079
                      && elf_hash_table (info)->dynamic_sections_created
3080
                      && (! info->shared
3081
                          || (! info->symbolic && h->dynindx != -1)
3082
                          || (h->elf_link_hash_flags
3083
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))
3084
                  /* The cases above are those in which relocation is
3085
                     overwritten in the switch block below.  The cases
3086
                     below are those in which we must defer relocation
3087
                     to run-time, because we can't resolve absolute
3088
                     addresses when creating a shared library.  */
3089
                  || (info->shared
3090
                      && ((! info->symbolic && h->dynindx != -1)
3091
                          || (h->elf_link_hash_flags
3092
                              & ELF_LINK_HASH_DEF_REGULAR) == 0)
3093
                      && ((r_type == R_SH_DIR32
3094
                           && !(ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3095
                                || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN))
3096
                          || r_type == R_SH_REL32)
3097
                      && ((input_section->flags & SEC_ALLOC) != 0
3098
                          /* DWARF will emit R_SH_DIR32 relocations in its
3099
                             sections against symbols defined externally
3100
                             in shared libraries.  We can't do anything
3101
                             with them here.  */
3102
                          || (input_section->flags & SEC_DEBUGGING) != 0)))
3103
                relocation = 0;
3104
              else if (sec->output_section == NULL)
3105
                {
3106
                  (*_bfd_error_handler)
3107
                    (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
3108
                     bfd_get_filename (input_bfd), h->root.root.string,
3109
                     bfd_get_section_name (input_bfd, input_section));
3110
                  relocation = 0;
3111
                }
3112
              else
3113
                relocation = (h->root.u.def.value
3114
                              + sec->output_section->vma
3115
                              + sec->output_offset);
3116
            }
3117
          else if (h->root.type == bfd_link_hash_undefweak)
3118
            relocation = 0;
3119
          else if (info->shared && !info->symbolic && !info->no_undefined)
3120
            relocation = 0;
3121
          else
3122
            {
3123
              if (! ((*info->callbacks->undefined_symbol)
3124
                     (info, h->root.root.string, input_bfd,
3125
                      input_section, rel->r_offset, true)))
3126
                return false;
3127
              relocation = 0;
3128
            }
3129
        }
3130
 
3131
      switch ((int) r_type)
3132
        {
3133
        final_link_relocate:
3134
          /* COFF relocs don't use the addend. The addend is used for
3135
             R_SH_DIR32 to be compatible with other compilers.  */
3136
          r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3137
                                        contents, rel->r_offset,
3138
                                        relocation, addend);
3139
          break;
3140
 
3141
        case R_SH_IND12W:
3142
          relocation -= 4;
3143
          goto final_link_relocate;
3144
 
3145
        case R_SH_DIR8WPN:
3146
        case R_SH_DIR8WPZ:
3147
        case R_SH_DIR8WPL:
3148
          /* If the reloc is against the start of this section, then
3149
             the assembler has already taken care of it and the reloc
3150
             is here only to assist in relaxing.  If the reloc is not
3151
             against the start of this section, then it's against an
3152
             external symbol and we must deal with it ourselves.  */
3153
          if (input_section->output_section->vma + input_section->output_offset
3154
              != relocation)
3155
            {
3156
              int disp = (relocation
3157
                          - input_section->output_section->vma
3158
                          - input_section->output_offset
3159
                          - rel->r_offset);
3160
              int mask = 0;
3161
              switch (r_type)
3162
                {
3163
                case R_SH_DIR8WPN:
3164
                case R_SH_DIR8WPZ: mask = 1; break;
3165
                case R_SH_DIR8WPL: mask = 3; break;
3166
                default: mask = 0; break;
3167
                }
3168
              if (disp & mask)
3169
                {
3170
                  ((*_bfd_error_handler)
3171
                   (_("%s: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
3172
                    bfd_get_filename (input_section->owner),
3173
                    (unsigned long) rel->r_offset));
3174
                  bfd_set_error (bfd_error_bad_value);
3175
                  return false;
3176
                }
3177
              relocation -= 4;
3178
              goto final_link_relocate;
3179
            }
3180
          r = bfd_reloc_ok;
3181
          break;
3182
 
3183
        default:
3184
          bfd_set_error (bfd_error_bad_value);
3185
          return false;
3186
 
3187
        case R_SH_DIR32:
3188
        case R_SH_REL32:
3189
          if (info->shared
3190
              && (input_section->flags & SEC_ALLOC) != 0
3191
              && (r_type != R_SH_REL32
3192
                  || (h != NULL
3193
                      && h->dynindx != -1
3194
                      && (! info->symbolic
3195
                          || (h->elf_link_hash_flags
3196
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3197
            {
3198
              Elf_Internal_Rela outrel;
3199
              boolean skip, relocate;
3200
 
3201
              /* When generating a shared object, these relocations
3202
                 are copied into the output file to be resolved at run
3203
                 time.  */
3204
 
3205
              if (sreloc == NULL)
3206
                {
3207
                  const char *name;
3208
 
3209
                  name = (bfd_elf_string_from_elf_section
3210
                          (input_bfd,
3211
                           elf_elfheader (input_bfd)->e_shstrndx,
3212
                           elf_section_data (input_section)->rel_hdr.sh_name));
3213
                  if (name == NULL)
3214
                    return false;
3215
 
3216
                  BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3217
                              && strcmp (bfd_get_section_name (input_bfd,
3218
                                                               input_section),
3219
                                         name + 5) == 0);
3220
 
3221
                  sreloc = bfd_get_section_by_name (dynobj, name);
3222
                  BFD_ASSERT (sreloc != NULL);
3223
                }
3224
 
3225
              skip = false;
3226
 
3227
              if (elf_section_data (input_section)->stab_info == NULL)
3228
                outrel.r_offset = rel->r_offset;
3229
              else
3230
                {
3231
                  bfd_vma off;
3232
 
3233
                  off = (_bfd_stab_section_offset
3234
                         (output_bfd, &elf_hash_table (info)->stab_info,
3235
                          input_section,
3236
                          &elf_section_data (input_section)->stab_info,
3237
                          rel->r_offset));
3238
                  if (off == (bfd_vma) -1)
3239
                    skip = true;
3240
                  outrel.r_offset = off;
3241
                }
3242
 
3243
              outrel.r_offset += (input_section->output_section->vma
3244
                                  + input_section->output_offset);
3245
 
3246
              if (skip)
3247
                {
3248
                  memset (&outrel, 0, sizeof outrel);
3249
                  relocate = false;
3250
                }
3251
              else if (r_type == R_SH_REL32)
3252
                {
3253
                  BFD_ASSERT (h != NULL && h->dynindx != -1);
3254
                  relocate = false;
3255
                  outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
3256
                  outrel.r_addend = rel->r_addend;
3257
                }
3258
              else
3259
                {
3260
                  /* h->dynindx may be -1 if this symbol was marked to
3261
                     become local.  */
3262
                  if (h == NULL
3263
                      || ((info->symbolic || h->dynindx == -1)
3264
                          && (h->elf_link_hash_flags
3265
                              & ELF_LINK_HASH_DEF_REGULAR) != 0))
3266
                    {
3267
                      relocate = true;
3268
                      outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3269
                      outrel.r_addend = relocation + rel->r_addend;
3270
                    }
3271
                  else
3272
                    {
3273
                      BFD_ASSERT (h->dynindx != -1);
3274
                      relocate = false;
3275
                      outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
3276
                      outrel.r_addend = relocation + rel->r_addend;
3277
                    }
3278
                }
3279
 
3280
              bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3281
                                         (((Elf32_External_Rela *)
3282
                                           sreloc->contents)
3283
                                          + sreloc->reloc_count));
3284
              ++sreloc->reloc_count;
3285
 
3286
              /* If this reloc is against an external symbol, we do
3287
                 not want to fiddle with the addend.  Otherwise, we
3288
                 need to include the symbol value so that it becomes
3289
                 an addend for the dynamic reloc.  */
3290
              if (! relocate)
3291
                continue;
3292
            }
3293
          else if (r_type == R_SH_DIR32)
3294
            addend = rel->r_addend;
3295
          goto final_link_relocate;
3296
 
3297
        case R_SH_GOT32:
3298
          /* Relocation is to the entry for this symbol in the global
3299
             offset table.  */
3300
          if (sgot == NULL)
3301
            {
3302
              sgot = bfd_get_section_by_name (dynobj, ".got");
3303
              BFD_ASSERT (sgot != NULL);
3304
            }
3305
 
3306
          if (h != NULL)
3307
            {
3308
              bfd_vma off;
3309
 
3310
              off = h->got.offset;
3311
              BFD_ASSERT (off != (bfd_vma) -1);
3312
 
3313
              if (! elf_hash_table (info)->dynamic_sections_created
3314
                  || (info->shared
3315
                      && (info->symbolic || h->dynindx == -1
3316
                          || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3317
                          || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3318
                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
3319
                {
3320
                  /* This is actually a static link, or it is a
3321
                     -Bsymbolic link and the symbol is defined
3322
                     locally, or the symbol was forced to be local
3323
                     because of a version file.  We must initialize
3324
                     this entry in the global offset table.  Since the
3325
                     offset must always be a multiple of 4, we use the
3326
                     least significant bit to record whether we have
3327
                     initialized it already.
3328
 
3329
                     When doing a dynamic link, we create a .rela.got
3330
                     relocation entry to initialize the value.  This
3331
                     is done in the finish_dynamic_symbol routine.  */
3332
                  if ((off & 1) != 0)
3333
                    off &= ~1;
3334
                  else
3335
                    {
3336
                      bfd_put_32 (output_bfd, relocation,
3337
                                  sgot->contents + off);
3338
                      h->got.offset |= 1;
3339
                    }
3340
                }
3341
 
3342
              relocation = sgot->output_offset + off;
3343
            }
3344
          else
3345
            {
3346
              bfd_vma off;
3347
 
3348
              BFD_ASSERT (local_got_offsets != NULL
3349
                          && local_got_offsets[r_symndx] != (bfd_vma) -1);
3350
 
3351
              off = local_got_offsets[r_symndx];
3352
 
3353
              /* The offset must always be a multiple of 4.  We use
3354
                 the least significant bit to record whether we have
3355
                 already generated the necessary reloc.  */
3356
              if ((off & 1) != 0)
3357
                off &= ~1;
3358
              else
3359
                {
3360
                  bfd_put_32 (output_bfd, relocation, sgot->contents + off);
3361
 
3362
                  if (info->shared)
3363
                    {
3364
                      asection *srelgot;
3365
                      Elf_Internal_Rela outrel;
3366
 
3367
                      srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3368
                      BFD_ASSERT (srelgot != NULL);
3369
 
3370
                      outrel.r_offset = (sgot->output_section->vma
3371
                                         + sgot->output_offset
3372
                                         + off);
3373
                      outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3374
                      outrel.r_addend = relocation;
3375
                      bfd_elf32_swap_reloca_out (output_bfd, &outrel,
3376
                                                (((Elf32_External_Rela *)
3377
                                                  srelgot->contents)
3378
                                                 + srelgot->reloc_count));
3379
                      ++srelgot->reloc_count;
3380
                    }
3381
 
3382
                  local_got_offsets[r_symndx] |= 1;
3383
                }
3384
 
3385
              relocation = sgot->output_offset + off;
3386
            }
3387
 
3388
          goto final_link_relocate;
3389
 
3390
        case R_SH_GOTOFF:
3391
          /* Relocation is relative to the start of the global offset
3392
             table.  */
3393
 
3394
          if (sgot == NULL)
3395
            {
3396
              sgot = bfd_get_section_by_name (dynobj, ".got");
3397
              BFD_ASSERT (sgot != NULL);
3398
            }
3399
 
3400
          /* Note that sgot->output_offset is not involved in this
3401
             calculation.  We always want the start of .got.  If we
3402
             defined _GLOBAL_OFFSET_TABLE in a different way, as is
3403
             permitted by the ABI, we might have to change this
3404
             calculation.  */
3405
          relocation -= sgot->output_section->vma;
3406
 
3407
          goto final_link_relocate;
3408
 
3409
        case R_SH_GOTPC:
3410
          /* Use global offset table as symbol value.  */
3411
 
3412
          if (sgot == NULL)
3413
            {
3414
              sgot = bfd_get_section_by_name (dynobj, ".got");
3415
              BFD_ASSERT (sgot != NULL);
3416
            }
3417
 
3418
          relocation = sgot->output_section->vma;
3419
 
3420
          goto final_link_relocate;
3421
 
3422
        case R_SH_PLT32:
3423
          /* Relocation is to the entry for this symbol in the
3424
             procedure linkage table.  */
3425
 
3426
          /* Resolve a PLT reloc against a local symbol directly,
3427
             without using the procedure linkage table.  */
3428
          if (h == NULL)
3429
            goto final_link_relocate;
3430
 
3431
          if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3432
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3433
            goto final_link_relocate;
3434
 
3435
          if (h->plt.offset == (bfd_vma) -1)
3436
            {
3437
              /* We didn't make a PLT entry for this symbol.  This
3438
                 happens when statically linking PIC code, or when
3439
                 using -Bsymbolic.  */
3440
              goto final_link_relocate;
3441
            }
3442
 
3443
          if (splt == NULL)
3444
            {
3445
              splt = bfd_get_section_by_name (dynobj, ".plt");
3446
              BFD_ASSERT (splt != NULL);
3447
            }
3448
 
3449
          relocation = (splt->output_section->vma
3450
                        + splt->output_offset
3451
                        + h->plt.offset);
3452
 
3453
          goto final_link_relocate;
3454
 
3455
        case R_SH_LOOP_START:
3456
          {
3457
            static bfd_vma start, end;
3458
 
3459
            start = (relocation + rel->r_addend
3460
                     - (sec->output_section->vma + sec->output_offset));
3461
            r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3462
                                   rel->r_offset, sec, start, end);
3463
            break;
3464
 
3465
        case R_SH_LOOP_END:
3466
            end = (relocation + rel->r_addend
3467
                   - (sec->output_section->vma + sec->output_offset));
3468
            r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3469
                                   rel->r_offset, sec, start, end);
3470
            break;
3471
          }
3472
        }
3473
 
3474
      if (r != bfd_reloc_ok)
3475
        {
3476
          switch (r)
3477
            {
3478
            default:
3479
            case bfd_reloc_outofrange:
3480
              abort ();
3481
            case bfd_reloc_overflow:
3482
              {
3483
                const char *name;
3484
 
3485
                if (h != NULL)
3486
                  name = h->root.root.string;
3487
                else
3488
                  {
3489
                    name = (bfd_elf_string_from_elf_section
3490
                            (input_bfd, symtab_hdr->sh_link, sym->st_name));
3491
                    if (name == NULL)
3492
                      return false;
3493
                    if (*name == '\0')
3494
                      name = bfd_section_name (input_bfd, sec);
3495
                  }
3496
                if (! ((*info->callbacks->reloc_overflow)
3497
                       (info, name, howto->name, (bfd_vma) 0,
3498
                        input_bfd, input_section, rel->r_offset)))
3499
                  return false;
3500
              }
3501
              break;
3502
            }
3503
        }
3504
    }
3505
 
3506
  return true;
3507
}
3508
 
3509
/* This is a version of bfd_generic_get_relocated_section_contents
3510
   which uses sh_elf_relocate_section.  */
3511
 
3512
static bfd_byte *
3513
sh_elf_get_relocated_section_contents (output_bfd, link_info, link_order,
3514
                                       data, relocateable, symbols)
3515
     bfd *output_bfd;
3516
     struct bfd_link_info *link_info;
3517
     struct bfd_link_order *link_order;
3518
     bfd_byte *data;
3519
     boolean relocateable;
3520
     asymbol **symbols;
3521
{
3522
  Elf_Internal_Shdr *symtab_hdr;
3523
  asection *input_section = link_order->u.indirect.section;
3524
  bfd *input_bfd = input_section->owner;
3525
  asection **sections = NULL;
3526
  Elf_Internal_Rela *internal_relocs = NULL;
3527
  Elf32_External_Sym *external_syms = NULL;
3528
  Elf_Internal_Sym *internal_syms = NULL;
3529
 
3530
  /* We only need to handle the case of relaxing, or of having a
3531
     particular set of section contents, specially.  */
3532
  if (relocateable
3533
      || elf_section_data (input_section)->this_hdr.contents == NULL)
3534
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
3535
                                                       link_order, data,
3536
                                                       relocateable,
3537
                                                       symbols);
3538
 
3539
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3540
 
3541
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
3542
          input_section->_raw_size);
3543
 
3544
  if ((input_section->flags & SEC_RELOC) != 0
3545
      && input_section->reloc_count > 0)
3546
    {
3547
      Elf_Internal_Sym *isymp;
3548
      asection **secpp;
3549
      Elf32_External_Sym *esym, *esymend;
3550
 
3551
      if (symtab_hdr->contents != NULL)
3552
        external_syms = (Elf32_External_Sym *) symtab_hdr->contents;
3553
      else
3554
        {
3555
          external_syms = ((Elf32_External_Sym *)
3556
                           bfd_malloc (symtab_hdr->sh_info
3557
                                       * sizeof (Elf32_External_Sym)));
3558
          if (external_syms == NULL && symtab_hdr->sh_info > 0)
3559
            goto error_return;
3560
          if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
3561
              || (bfd_read (external_syms, sizeof (Elf32_External_Sym),
3562
                            symtab_hdr->sh_info, input_bfd)
3563
                  != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))))
3564
            goto error_return;
3565
        }
3566
 
3567
      internal_relocs = (_bfd_elf32_link_read_relocs
3568
                         (input_bfd, input_section, (PTR) NULL,
3569
                          (Elf_Internal_Rela *) NULL, false));
3570
      if (internal_relocs == NULL)
3571
        goto error_return;
3572
 
3573
      internal_syms = ((Elf_Internal_Sym *)
3574
                       bfd_malloc (symtab_hdr->sh_info
3575
                                   * sizeof (Elf_Internal_Sym)));
3576
      if (internal_syms == NULL && symtab_hdr->sh_info > 0)
3577
        goto error_return;
3578
 
3579
      sections = (asection **) bfd_malloc (symtab_hdr->sh_info
3580
                                           * sizeof (asection *));
3581
      if (sections == NULL && symtab_hdr->sh_info > 0)
3582
        goto error_return;
3583
 
3584
      isymp = internal_syms;
3585
      secpp = sections;
3586
      esym = external_syms;
3587
      esymend = esym + symtab_hdr->sh_info;
3588
      for (; esym < esymend; ++esym, ++isymp, ++secpp)
3589
        {
3590
          asection *isec;
3591
 
3592
          bfd_elf32_swap_symbol_in (input_bfd, esym, isymp);
3593
 
3594
          if (isymp->st_shndx == SHN_UNDEF)
3595
            isec = bfd_und_section_ptr;
3596
          else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
3597
            isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
3598
          else if (isymp->st_shndx == SHN_ABS)
3599
            isec = bfd_abs_section_ptr;
3600
          else if (isymp->st_shndx == SHN_COMMON)
3601
            isec = bfd_com_section_ptr;
3602
          else
3603
            {
3604
              /* Who knows?  */
3605
              isec = NULL;
3606
            }
3607
 
3608
          *secpp = isec;
3609
        }
3610
 
3611
      if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
3612
                                     input_section, data, internal_relocs,
3613
                                     internal_syms, sections))
3614
        goto error_return;
3615
 
3616
      if (sections != NULL)
3617
        free (sections);
3618
      sections = NULL;
3619
      if (internal_syms != NULL)
3620
        free (internal_syms);
3621
      internal_syms = NULL;
3622
      if (external_syms != NULL && symtab_hdr->contents == NULL)
3623
        free (external_syms);
3624
      external_syms = NULL;
3625
      if (internal_relocs != elf_section_data (input_section)->relocs)
3626
        free (internal_relocs);
3627
      internal_relocs = NULL;
3628
    }
3629
 
3630
  return data;
3631
 
3632
 error_return:
3633
  if (internal_relocs != NULL
3634
      && internal_relocs != elf_section_data (input_section)->relocs)
3635
    free (internal_relocs);
3636
  if (external_syms != NULL && symtab_hdr->contents == NULL)
3637
    free (external_syms);
3638
  if (internal_syms != NULL)
3639
    free (internal_syms);
3640
  if (sections != NULL)
3641
    free (sections);
3642
  return NULL;
3643
}
3644
static asection *
3645
sh_elf_gc_mark_hook (abfd, info, rel, h, sym)
3646
     bfd *abfd;
3647
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
3648
     Elf_Internal_Rela *rel;
3649
     struct elf_link_hash_entry *h;
3650
     Elf_Internal_Sym *sym;
3651
{
3652
  if (h != NULL)
3653
    {
3654
      switch (ELF32_R_TYPE (rel->r_info))
3655
        {
3656
        case R_SH_GNU_VTINHERIT:
3657
        case R_SH_GNU_VTENTRY:
3658
          break;
3659
 
3660
        default:
3661
          switch (h->root.type)
3662
            {
3663
            case bfd_link_hash_defined:
3664
            case bfd_link_hash_defweak:
3665
              return h->root.u.def.section;
3666
 
3667
            case bfd_link_hash_common:
3668
              return h->root.u.c.p->section;
3669
 
3670
            default:
3671
              break;
3672
            }
3673
        }
3674
    }
3675
  else
3676
    {
3677
      if (!(elf_bad_symtab (abfd)
3678
            && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
3679
          && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
3680
                && sym->st_shndx != SHN_COMMON))
3681
        return bfd_section_from_elf_index (abfd, sym->st_shndx);
3682
    }
3683
  return NULL;
3684
}
3685
 
3686
/* Update the got entry reference counts for the section being removed.  */
3687
 
3688
static boolean
3689
sh_elf_gc_sweep_hook (abfd, info, sec, relocs)
3690
     bfd *abfd ATTRIBUTE_UNUSED;
3691
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
3692
     asection *sec ATTRIBUTE_UNUSED;
3693
     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
3694
{
3695
  /* We use got and plt entries for sh, but it would seem that the
3696
     existing SH code does no sort of reference counting or whatnot on
3697
     its GOT and PLT entries, so it is not possible to garbage collect
3698
     them at this time.  */
3699
  return true;
3700
}
3701
 
3702
/* Look through the relocs for a section during the first phase.
3703
   Since we don't do .gots or .plts, we just need to consider the
3704
   virtual table relocs for gc.  */
3705
 
3706
static boolean
3707
sh_elf_check_relocs (abfd, info, sec, relocs)
3708
     bfd *abfd;
3709
     struct bfd_link_info *info;
3710
     asection *sec;
3711
     const Elf_Internal_Rela *relocs;
3712
{
3713
  Elf_Internal_Shdr *symtab_hdr;
3714
  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
3715
  const Elf_Internal_Rela *rel;
3716
  const Elf_Internal_Rela *rel_end;
3717
  bfd *dynobj;
3718
  bfd_vma *local_got_offsets;
3719
  asection *sgot;
3720
  asection *srelgot;
3721
  asection *sreloc;
3722
 
3723
  sgot = NULL;
3724
  srelgot = NULL;
3725
  sreloc = NULL;
3726
 
3727
  if (info->relocateable)
3728
    return true;
3729
 
3730
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3731
  sym_hashes = elf_sym_hashes (abfd);
3732
  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
3733
  if (!elf_bad_symtab (abfd))
3734
    sym_hashes_end -= symtab_hdr->sh_info;
3735
 
3736
  dynobj = elf_hash_table (info)->dynobj;
3737
  local_got_offsets = elf_local_got_offsets (abfd);
3738
 
3739
  rel_end = relocs + sec->reloc_count;
3740
  for (rel = relocs; rel < rel_end; rel++)
3741
    {
3742
      struct elf_link_hash_entry *h;
3743
      unsigned long r_symndx;
3744
 
3745
      r_symndx = ELF32_R_SYM (rel->r_info);
3746
      if (r_symndx < symtab_hdr->sh_info)
3747
        h = NULL;
3748
      else
3749
        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3750
 
3751
      /* Some relocs require a global offset table.  */
3752
      if (dynobj == NULL)
3753
        {
3754
          switch (ELF32_R_TYPE (rel->r_info))
3755
            {
3756
            case R_SH_GOT32:
3757
            case R_SH_GOTOFF:
3758
            case R_SH_GOTPC:
3759
              elf_hash_table (info)->dynobj = dynobj = abfd;
3760
              if (! _bfd_elf_create_got_section (dynobj, info))
3761
                return false;
3762
              break;
3763
 
3764
            default:
3765
              break;
3766
            }
3767
        }
3768
 
3769
      switch (ELF32_R_TYPE (rel->r_info))
3770
        {
3771
        /* This relocation describes the C++ object vtable hierarchy.
3772
           Reconstruct it for later use during GC.  */
3773
        case R_SH_GNU_VTINHERIT:
3774
          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3775
            return false;
3776
          break;
3777
 
3778
        /* This relocation describes which C++ vtable entries are actually
3779
           used.  Record for later use during GC.  */
3780
        case R_SH_GNU_VTENTRY:
3781
          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3782
            return false;
3783
          break;
3784
 
3785
        case R_SH_GOT32:
3786
          /* This symbol requires a global offset table entry.  */
3787
 
3788
          if (sgot == NULL)
3789
            {
3790
              sgot = bfd_get_section_by_name (dynobj, ".got");
3791
              BFD_ASSERT (sgot != NULL);
3792
            }
3793
 
3794
          if (srelgot == NULL
3795
              && (h != NULL || info->shared))
3796
            {
3797
              srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3798
              if (srelgot == NULL)
3799
                {
3800
                  srelgot = bfd_make_section (dynobj, ".rela.got");
3801
                  if (srelgot == NULL
3802
                      || ! bfd_set_section_flags (dynobj, srelgot,
3803
                                                  (SEC_ALLOC
3804
                                                   | SEC_LOAD
3805
                                                   | SEC_HAS_CONTENTS
3806
                                                   | SEC_IN_MEMORY
3807
                                                   | SEC_LINKER_CREATED
3808
                                                   | SEC_READONLY))
3809
                      || ! bfd_set_section_alignment (dynobj, srelgot, 2))
3810
                    return false;
3811
                }
3812
            }
3813
 
3814
          if (h != NULL)
3815
            {
3816
              if (h->got.offset != (bfd_vma) -1)
3817
                {
3818
                  /* We have already allocated space in the .got.  */
3819
                  break;
3820
                }
3821
              h->got.offset = sgot->_raw_size;
3822
 
3823
              /* Make sure this symbol is output as a dynamic symbol.  */
3824
              if (h->dynindx == -1)
3825
                {
3826
                  if (! bfd_elf32_link_record_dynamic_symbol (info, h))
3827
                    return false;
3828
                }
3829
 
3830
              srelgot->_raw_size += sizeof (Elf32_External_Rela);
3831
            }
3832
          else
3833
            {
3834
              /* This is a global offset table entry for a local
3835
                 symbol.  */
3836
              if (local_got_offsets == NULL)
3837
                {
3838
                  size_t size;
3839
                  register unsigned int i;
3840
 
3841
                  size = symtab_hdr->sh_info * sizeof (bfd_vma);
3842
                  local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
3843
                  if (local_got_offsets == NULL)
3844
                    return false;
3845
                  elf_local_got_offsets (abfd) = local_got_offsets;
3846
                  for (i = 0; i < symtab_hdr->sh_info; i++)
3847
                    local_got_offsets[i] = (bfd_vma) -1;
3848
                }
3849
              if (local_got_offsets[r_symndx] != (bfd_vma) -1)
3850
                {
3851
                  /* We have already allocated space in the .got.  */
3852
                  break;
3853
                }
3854
              local_got_offsets[r_symndx] = sgot->_raw_size;
3855
 
3856
              if (info->shared)
3857
                {
3858
                  /* If we are generating a shared object, we need to
3859
                     output a R_SH_RELATIVE reloc so that the dynamic
3860
                     linker can adjust this GOT entry.  */
3861
                  srelgot->_raw_size += sizeof (Elf32_External_Rela);
3862
                }
3863
            }
3864
 
3865
          sgot->_raw_size += 4;
3866
 
3867
          break;
3868
 
3869
        case R_SH_PLT32:
3870
          /* This symbol requires a procedure linkage table entry.  We
3871
             actually build the entry in adjust_dynamic_symbol,
3872
             because this might be a case of linking PIC code which is
3873
             never referenced by a dynamic object, in which case we
3874
             don't need to generate a procedure linkage table entry
3875
             after all.  */
3876
 
3877
          /* If this is a local symbol, we resolve it directly without
3878
             creating a procedure linkage table entry.  */
3879
          if (h == NULL)
3880
            continue;
3881
 
3882
          if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
3883
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
3884
            break;
3885
 
3886
          h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
3887
 
3888
          break;
3889
 
3890
        case R_SH_DIR32:
3891
        case R_SH_REL32:
3892
          if (h != NULL)
3893
            h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
3894
 
3895
          /* If we are creating a shared library, and this is a reloc
3896
             against a global symbol, or a non PC relative reloc
3897
             against a local symbol, then we need to copy the reloc
3898
             into the shared library.  However, if we are linking with
3899
             -Bsymbolic, we do not need to copy a reloc against a
3900
             global symbol which is defined in an object we are
3901
             including in the link (i.e., DEF_REGULAR is set).  At
3902
             this point we have not seen all the input files, so it is
3903
             possible that DEF_REGULAR is not set now but will be set
3904
             later (it is never cleared).  We account for that
3905
             possibility below by storing information in the
3906
             pcrel_relocs_copied field of the hash table entry.  */
3907
          if (info->shared
3908
              && (sec->flags & SEC_ALLOC) != 0
3909
              && (ELF32_R_TYPE (rel->r_info) != R_SH_REL32
3910
                  || (h != NULL
3911
                      && (! info->symbolic
3912
                          || (h->elf_link_hash_flags
3913
                              & ELF_LINK_HASH_DEF_REGULAR) == 0))))
3914
            {
3915
              /* When creating a shared object, we must copy these
3916
                 reloc types into the output file.  We create a reloc
3917
                 section in dynobj and make room for this reloc.  */
3918
              if (sreloc == NULL)
3919
                {
3920
                  const char *name;
3921
 
3922
                  name = (bfd_elf_string_from_elf_section
3923
                          (abfd,
3924
                           elf_elfheader (abfd)->e_shstrndx,
3925
                           elf_section_data (sec)->rel_hdr.sh_name));
3926
                  if (name == NULL)
3927
                    return false;
3928
 
3929
                  BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3930
                              && strcmp (bfd_get_section_name (abfd, sec),
3931
                                         name + 5) == 0);
3932
 
3933
                  sreloc = bfd_get_section_by_name (dynobj, name);
3934
                  if (sreloc == NULL)
3935
                    {
3936
                      flagword flags;
3937
 
3938
                      sreloc = bfd_make_section (dynobj, name);
3939
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
3940
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3941
                      if ((sec->flags & SEC_ALLOC) != 0)
3942
                        flags |= SEC_ALLOC | SEC_LOAD;
3943
                      if (sreloc == NULL
3944
                          || ! bfd_set_section_flags (dynobj, sreloc, flags)
3945
                          || ! bfd_set_section_alignment (dynobj, sreloc, 2))
3946
                        return false;
3947
                    }
3948
                }
3949
 
3950
              sreloc->_raw_size += sizeof (Elf32_External_Rela);
3951
 
3952
              /* If we are linking with -Bsymbolic, and this is a
3953
                 global symbol, we count the number of PC relative
3954
                 relocations we have entered for this symbol, so that
3955
                 we can discard them again if the symbol is later
3956
                 defined by a regular object.  Note that this function
3957
                 is only called if we are using an elf_sh linker
3958
                 hash table, which means that h is really a pointer to
3959
                 an elf_sh_link_hash_entry.  */
3960
              if (h != NULL && info->symbolic
3961
                  && ELF32_R_TYPE (rel->r_info) == R_SH_REL32)
3962
                {
3963
                  struct elf_sh_link_hash_entry *eh;
3964
                  struct elf_sh_pcrel_relocs_copied *p;
3965
 
3966
                  eh = (struct elf_sh_link_hash_entry *) h;
3967
 
3968
                  for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
3969
                    if (p->section == sreloc)
3970
                      break;
3971
 
3972
                  if (p == NULL)
3973
                    {
3974
                      p = ((struct elf_sh_pcrel_relocs_copied *)
3975
                           bfd_alloc (dynobj, sizeof *p));
3976
                      if (p == NULL)
3977
                        return false;
3978
                      p->next = eh->pcrel_relocs_copied;
3979
                      eh->pcrel_relocs_copied = p;
3980
                      p->section = sreloc;
3981
                      p->count = 0;
3982
                    }
3983
 
3984
                  ++p->count;
3985
                }
3986
            }
3987
 
3988
          break;
3989
        }
3990
    }
3991
 
3992
  return true;
3993
}
3994
 
3995
static boolean
3996
sh_elf_set_mach_from_flags (abfd)
3997
     bfd *abfd;
3998
{
3999
  flagword flags = elf_elfheader (abfd)->e_flags;
4000
 
4001
  switch (flags & EF_SH_MACH_MASK)
4002
    {
4003
    case EF_SH1:
4004
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh);
4005
      break;
4006
    case EF_SH2:
4007
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh2);
4008
      break;
4009
    case EF_SH_DSP:
4010
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh_dsp);
4011
      break;
4012
    case EF_SH3:
4013
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3);
4014
      break;
4015
    case EF_SH3_DSP:
4016
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3_dsp);
4017
      break;
4018
    case EF_SH3E:
4019
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3e);
4020
      break;
4021
    case EF_SH_UNKNOWN:
4022
    case EF_SH4:
4023
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh4);
4024
      break;
4025
    default:
4026
      return false;
4027
    }
4028
  return true;
4029
}
4030
 
4031
/* Function to keep SH specific file flags.  */
4032
 
4033
static boolean
4034
sh_elf_set_private_flags (abfd, flags)
4035
     bfd *abfd;
4036
     flagword flags;
4037
{
4038
  BFD_ASSERT (! elf_flags_init (abfd)
4039
              || elf_elfheader (abfd)->e_flags == flags);
4040
 
4041
  elf_elfheader (abfd)->e_flags = flags;
4042
  elf_flags_init (abfd) = true;
4043
  return sh_elf_set_mach_from_flags (abfd);
4044
}
4045
 
4046
/* Copy backend specific data from one object module to another */
4047
 
4048
static boolean
4049
sh_elf_copy_private_data (ibfd, obfd)
4050
     bfd * ibfd;
4051
     bfd * obfd;
4052
{
4053
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4054
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4055
    return true;
4056
 
4057
  return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
4058
}
4059
 
4060
/* This routine checks for linking big and little endian objects
4061
   together, and for linking sh-dsp with sh3e / sh4 objects.  */
4062
 
4063
static boolean
4064
sh_elf_merge_private_data (ibfd, obfd)
4065
     bfd *ibfd;
4066
     bfd *obfd;
4067
{
4068
  flagword old_flags, new_flags;
4069
 
4070
  if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
4071
    return false;
4072
 
4073
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4074
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4075
    return true;
4076
 
4077
  if (! elf_flags_init (obfd))
4078
    {
4079
      /* This happens when ld starts out with a 'blank' output file.  */
4080
      elf_flags_init (obfd) = true;
4081
      elf_elfheader (obfd)->e_flags = EF_SH1;
4082
    }
4083
  old_flags = elf_elfheader (obfd)->e_flags;
4084
  new_flags = elf_elfheader (ibfd)->e_flags;
4085
  if ((EF_SH_HAS_DSP (old_flags) && EF_SH_HAS_FP (new_flags))
4086
      || (EF_SH_HAS_DSP (new_flags) && EF_SH_HAS_FP (old_flags)))
4087
    {
4088
      (*_bfd_error_handler)
4089
        ("%s: uses %s instructions while previous modules use %s instructions",
4090
         bfd_get_filename (ibfd),
4091
         EF_SH_HAS_DSP (new_flags) ? "dsp" : "floating point",
4092
         EF_SH_HAS_DSP (new_flags) ? "floating point" : "dsp");
4093
      bfd_set_error (bfd_error_bad_value);
4094
      return false;
4095
    }
4096
  elf_elfheader (obfd)->e_flags = EF_SH_MERGE_MACH (old_flags, new_flags);
4097
 
4098
  return sh_elf_set_mach_from_flags (obfd);
4099
}
4100
 
4101
/* Finish up dynamic symbol handling.  We set the contents of various
4102
   dynamic sections here.  */
4103
 
4104
static boolean
4105
sh_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
4106
     bfd *output_bfd;
4107
     struct bfd_link_info *info;
4108
     struct elf_link_hash_entry *h;
4109
     Elf_Internal_Sym *sym;
4110
{
4111
  bfd *dynobj;
4112
 
4113
  dynobj = elf_hash_table (info)->dynobj;
4114
 
4115
  if (h->plt.offset != (bfd_vma) -1)
4116
    {
4117
      asection *splt;
4118
      asection *sgot;
4119
      asection *srel;
4120
 
4121
      bfd_vma plt_index;
4122
      bfd_vma got_offset;
4123
      Elf_Internal_Rela rel;
4124
 
4125
      /* This symbol has an entry in the procedure linkage table.  Set
4126
         it up.  */
4127
 
4128
      BFD_ASSERT (h->dynindx != -1);
4129
 
4130
      splt = bfd_get_section_by_name (dynobj, ".plt");
4131
      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
4132
      srel = bfd_get_section_by_name (dynobj, ".rela.plt");
4133
      BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
4134
 
4135
      /* Get the index in the procedure linkage table which
4136
         corresponds to this symbol.  This is the index of this symbol
4137
         in all the symbols for which we are making plt entries.  The
4138
         first entry in the procedure linkage table is reserved.  */
4139
      plt_index = h->plt.offset / elf_sh_sizeof_plt (info) - 1;
4140
 
4141
      /* Get the offset into the .got table of the entry that
4142
         corresponds to this function.  Each .got entry is 4 bytes.
4143
         The first three are reserved.  */
4144
      got_offset = (plt_index + 3) * 4;
4145
 
4146
      /* Fill in the entry in the procedure linkage table.  */
4147
      if (! info->shared)
4148
        {
4149
          if (elf_sh_plt_entry == NULL)
4150
            {
4151
              elf_sh_plt_entry = (bfd_big_endian (output_bfd) ?
4152
                                  elf_sh_plt_entry_be : elf_sh_plt_entry_le);
4153
            }
4154
          memcpy (splt->contents + h->plt.offset, elf_sh_plt_entry,
4155
                  elf_sh_sizeof_plt (info));
4156
          bfd_put_32 (output_bfd,
4157
                      (sgot->output_section->vma
4158
                       + sgot->output_offset
4159
                       + got_offset),
4160
                      (splt->contents + h->plt.offset
4161
                       + elf_sh_plt_symbol_offset (info)));
4162
 
4163
          bfd_put_32 (output_bfd,
4164
                      (splt->output_section->vma + splt->output_offset),
4165
                      (splt->contents + h->plt.offset
4166
                       + elf_sh_plt_plt0_offset (info)));
4167
        }
4168
      else
4169
        {
4170
          if (elf_sh_pic_plt_entry == NULL)
4171
            {
4172
              elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd) ?
4173
                                      elf_sh_pic_plt_entry_be :
4174
                                      elf_sh_pic_plt_entry_le);
4175
            }
4176
          memcpy (splt->contents + h->plt.offset, elf_sh_pic_plt_entry,
4177
                  elf_sh_sizeof_plt (info));
4178
          bfd_put_32 (output_bfd, got_offset,
4179
                      (splt->contents + h->plt.offset
4180
                       + elf_sh_plt_symbol_offset (info)));
4181
        }
4182
 
4183
      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
4184
                  (splt->contents + h->plt.offset
4185
                   + elf_sh_plt_reloc_offset (info)));
4186
 
4187
      /* Fill in the entry in the global offset table.  */
4188
      bfd_put_32 (output_bfd,
4189
                  (splt->output_section->vma
4190
                   + splt->output_offset
4191
                   + h->plt.offset
4192
                   + elf_sh_plt_temp_offset (info)),
4193
                  sgot->contents + got_offset);
4194
 
4195
      /* Fill in the entry in the .rela.plt section.  */
4196
      rel.r_offset = (sgot->output_section->vma
4197
                      + sgot->output_offset
4198
                      + got_offset);
4199
      rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
4200
      rel.r_addend = 0;
4201
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
4202
                                ((Elf32_External_Rela *) srel->contents
4203
                                 + plt_index));
4204
 
4205
      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
4206
        {
4207
          /* Mark the symbol as undefined, rather than as defined in
4208
             the .plt section.  Leave the value alone.  */
4209
          sym->st_shndx = SHN_UNDEF;
4210
        }
4211
    }
4212
 
4213
  if (h->got.offset != (bfd_vma) -1)
4214
    {
4215
      asection *sgot;
4216
      asection *srel;
4217
      Elf_Internal_Rela rel;
4218
 
4219
      /* This symbol has an entry in the global offset table.  Set it
4220
         up.  */
4221
 
4222
      sgot = bfd_get_section_by_name (dynobj, ".got");
4223
      srel = bfd_get_section_by_name (dynobj, ".rela.got");
4224
      BFD_ASSERT (sgot != NULL && srel != NULL);
4225
 
4226
      rel.r_offset = (sgot->output_section->vma
4227
                      + sgot->output_offset
4228
                      + (h->got.offset &~ 1));
4229
 
4230
      /* If this is a -Bsymbolic link, and the symbol is defined
4231
         locally, we just want to emit a RELATIVE reloc.  Likewise if
4232
         the symbol was forced to be local because of a version file.
4233
         The entry in the global offset table will already have been
4234
         initialized in the relocate_section function.  */
4235
      if (info->shared
4236
          && (info->symbolic || h->dynindx == -1)
4237
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
4238
        {
4239
          rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
4240
          rel.r_addend = (h->root.u.def.value
4241
                          + h->root.u.def.section->output_section->vma
4242
                          + h->root.u.def.section->output_offset);
4243
        }
4244
      else
4245
        {
4246
          bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
4247
          rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
4248
          rel.r_addend = 0;
4249
        }
4250
 
4251
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
4252
                                 ((Elf32_External_Rela *) srel->contents
4253
                                  + srel->reloc_count));
4254
      ++srel->reloc_count;
4255
    }
4256
 
4257
  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
4258
    {
4259
      asection *s;
4260
      Elf_Internal_Rela rel;
4261
 
4262
      /* This symbol needs a copy reloc.  Set it up.  */
4263
 
4264
      BFD_ASSERT (h->dynindx != -1
4265
                  && (h->root.type == bfd_link_hash_defined
4266
                      || h->root.type == bfd_link_hash_defweak));
4267
 
4268
      s = bfd_get_section_by_name (h->root.u.def.section->owner,
4269
                                   ".rela.bss");
4270
      BFD_ASSERT (s != NULL);
4271
 
4272
      rel.r_offset = (h->root.u.def.value
4273
                      + h->root.u.def.section->output_section->vma
4274
                      + h->root.u.def.section->output_offset);
4275
      rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
4276
      rel.r_addend = 0;
4277
      bfd_elf32_swap_reloca_out (output_bfd, &rel,
4278
                                 ((Elf32_External_Rela *) s->contents
4279
                                  + s->reloc_count));
4280
      ++s->reloc_count;
4281
    }
4282
 
4283
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4284
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4285
      || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
4286
    sym->st_shndx = SHN_ABS;
4287
 
4288
  return true;
4289
}
4290
 
4291
/* Finish up the dynamic sections.  */
4292
 
4293
static boolean
4294
sh_elf_finish_dynamic_sections (output_bfd, info)
4295
     bfd *output_bfd;
4296
     struct bfd_link_info *info;
4297
{
4298
  bfd *dynobj;
4299
  asection *sgot;
4300
  asection *sdyn;
4301
 
4302
  dynobj = elf_hash_table (info)->dynobj;
4303
 
4304
  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
4305
  BFD_ASSERT (sgot != NULL);
4306
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4307
 
4308
  if (elf_hash_table (info)->dynamic_sections_created)
4309
    {
4310
      asection *splt;
4311
      Elf32_External_Dyn *dyncon, *dynconend;
4312
 
4313
      BFD_ASSERT (sdyn != NULL);
4314
 
4315
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
4316
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
4317
      for (; dyncon < dynconend; dyncon++)
4318
        {
4319
          Elf_Internal_Dyn dyn;
4320
          const char *name;
4321
          asection *s;
4322
 
4323
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4324
 
4325
          switch (dyn.d_tag)
4326
            {
4327
            default:
4328
              break;
4329
 
4330
            case DT_PLTGOT:
4331
              name = ".got";
4332
              goto get_vma;
4333
 
4334
            case DT_JMPREL:
4335
              name = ".rela.plt";
4336
            get_vma:
4337
              s = bfd_get_section_by_name (output_bfd, name);
4338
              BFD_ASSERT (s != NULL);
4339
              dyn.d_un.d_ptr = s->vma;
4340
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4341
              break;
4342
 
4343
            case DT_PLTRELSZ:
4344
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4345
              BFD_ASSERT (s != NULL);
4346
              if (s->_cooked_size != 0)
4347
                dyn.d_un.d_val = s->_cooked_size;
4348
              else
4349
                dyn.d_un.d_val = s->_raw_size;
4350
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4351
              break;
4352
 
4353
            case DT_RELASZ:
4354
              /* My reading of the SVR4 ABI indicates that the
4355
                 procedure linkage table relocs (DT_JMPREL) should be
4356
                 included in the overall relocs (DT_RELA).  This is
4357
                 what Solaris does.  However, UnixWare can not handle
4358
                 that case.  Therefore, we override the DT_RELASZ entry
4359
                 here to make it not include the JMPREL relocs.  Since
4360
                 the linker script arranges for .rela.plt to follow all
4361
                 other relocation sections, we don't have to worry
4362
                 about changing the DT_RELA entry.  */
4363
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4364
              if (s != NULL)
4365
                {
4366
                  if (s->_cooked_size != 0)
4367
                    dyn.d_un.d_val -= s->_cooked_size;
4368
                  else
4369
                    dyn.d_un.d_val -= s->_raw_size;
4370
                }
4371
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4372
              break;
4373
            }
4374
        }
4375
 
4376
      /* Fill in the first entry in the procedure linkage table.  */
4377
      splt = bfd_get_section_by_name (dynobj, ".plt");
4378
      if (splt && splt->_raw_size > 0)
4379
        {
4380
          if (info->shared)
4381
            {
4382
              if (elf_sh_pic_plt_entry == NULL)
4383
                {
4384
                  elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd) ?
4385
                                          elf_sh_pic_plt_entry_be :
4386
                                          elf_sh_pic_plt_entry_le);
4387
                }
4388
              memcpy (splt->contents, elf_sh_pic_plt_entry,
4389
                      elf_sh_sizeof_plt (info));
4390
            }
4391
          else
4392
            {
4393
              if (elf_sh_plt0_entry == NULL)
4394
                {
4395
                  elf_sh_plt0_entry = (bfd_big_endian (output_bfd) ?
4396
                                       elf_sh_plt0_entry_be :
4397
                                       elf_sh_plt0_entry_le);
4398
                }
4399
              memcpy (splt->contents, elf_sh_plt0_entry, PLT_ENTRY_SIZE);
4400
              bfd_put_32 (output_bfd,
4401
                          sgot->output_section->vma + sgot->output_offset + 4,
4402
                          splt->contents + elf_sh_plt0_gotid_offset (info));
4403
              bfd_put_32 (output_bfd,
4404
                          sgot->output_section->vma + sgot->output_offset + 8,
4405
                          splt->contents + elf_sh_plt0_linker_offset (info));
4406
            }
4407
 
4408
          /* UnixWare sets the entsize of .plt to 4, although that doesn't
4409
             really seem like the right value.  */
4410
          elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
4411
        }
4412
    }
4413
 
4414
  /* Fill in the first three entries in the global offset table.  */
4415
  if (sgot->_raw_size > 0)
4416
    {
4417
      if (sdyn == NULL)
4418
        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
4419
      else
4420
        bfd_put_32 (output_bfd,
4421
                    sdyn->output_section->vma + sdyn->output_offset,
4422
                    sgot->contents);
4423
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
4424
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
4425
    }
4426
 
4427
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
4428
 
4429
  return true;
4430
}
4431
 
4432
#ifndef ELF_ARCH
4433
#define TARGET_BIG_SYM          bfd_elf32_sh_vec
4434
#define TARGET_BIG_NAME         "elf32-sh"
4435
#define TARGET_LITTLE_SYM       bfd_elf32_shl_vec
4436
#define TARGET_LITTLE_NAME      "elf32-shl"
4437
#define ELF_ARCH                bfd_arch_sh
4438
#define ELF_MACHINE_CODE        EM_SH
4439
#define ELF_MAXPAGESIZE         128
4440
 
4441
#define elf_symbol_leading_char '_'
4442
#endif /* ELF_ARCH */
4443
 
4444
#define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
4445
#define elf_info_to_howto               sh_elf_info_to_howto
4446
#define bfd_elf32_bfd_relax_section     sh_elf_relax_section
4447
#define elf_backend_relocate_section    sh_elf_relocate_section
4448
#define bfd_elf32_bfd_get_relocated_section_contents \
4449
                                        sh_elf_get_relocated_section_contents
4450
#define elf_backend_object_p            sh_elf_set_mach_from_flags
4451
#define bfd_elf32_bfd_set_private_bfd_flags \
4452
                                        sh_elf_set_private_flags
4453
#define bfd_elf32_bfd_copy_private_bfd_data \
4454
                                        sh_elf_copy_private_data
4455
#define bfd_elf32_bfd_merge_private_bfd_data \
4456
                                        sh_elf_merge_private_data
4457
 
4458
#define elf_backend_gc_mark_hook        sh_elf_gc_mark_hook
4459
#define elf_backend_gc_sweep_hook       sh_elf_gc_sweep_hook
4460
#define elf_backend_check_relocs        sh_elf_check_relocs
4461
 
4462
#define elf_backend_can_gc_sections     1
4463
#define elf_backend_create_dynamic_sections \
4464
                                        sh_elf_create_dynamic_sections
4465
#define bfd_elf32_bfd_link_hash_table_create \
4466
                                        sh_elf_link_hash_table_create
4467
#define elf_backend_adjust_dynamic_symbol \
4468
                                        sh_elf_adjust_dynamic_symbol
4469
#define elf_backend_size_dynamic_sections \
4470
                                        sh_elf_size_dynamic_sections
4471
#define elf_backend_finish_dynamic_symbol \
4472
                                        sh_elf_finish_dynamic_symbol
4473
#define elf_backend_finish_dynamic_sections \
4474
                                        sh_elf_finish_dynamic_sections
4475
 
4476
#define elf_backend_want_got_plt        1
4477
#define elf_backend_plt_readonly        1
4478
#define elf_backend_want_plt_sym        0
4479
#define elf_backend_got_header_size     12
4480
#define elf_backend_plt_header_size     PLT_ENTRY_SIZE
4481
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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