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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [bfd/] [elf64-sh64.c] - Blame information for rev 157

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

Line No. Rev Author Line
1 24 jeremybenn
/* SuperH SH64-specific support for 64-bit ELF
2
   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#define SH64_ELF64
23
 
24
#include "sysdep.h"
25
#include "bfd.h"
26
#include "bfdlink.h"
27
#include "libbfd.h"
28
#include "elf-bfd.h"
29
#include "elf/sh.h"
30
 
31
/* Add a suffix for datalabel indirection symbols.  It must not match any
32
   other symbols; user symbols with or without version or other
33
   decoration.  It must only be used internally and not emitted by any
34
   means.  */
35
#define DATALABEL_SUFFIX " DL"
36
 
37
#define GOT_BIAS (-((long)-32768))
38
 
39
#define PLT_ENTRY_SIZE 64
40
 
41
/* Return size of a PLT entry.  */
42
#define elf_sh64_sizeof_plt(info) PLT_ENTRY_SIZE
43
 
44
/* Return offset of the PLT0 address in an absolute PLT entry.  */
45
#define elf_sh64_plt_plt0_offset(info) 32
46
 
47
/* Return offset of the linker in PLT0 entry.  */
48
#define elf_sh64_plt0_gotplt_offset(info) 0
49
 
50
/* Return offset of the trampoline in PLT entry */
51
#define elf_sh64_plt_temp_offset(info) 33 /* Add one because it's SHmedia.  */
52
 
53
/* Return offset of the symbol in PLT entry.  */
54
#define elf_sh64_plt_symbol_offset(info) 0
55
 
56
/* Return offset of the relocation in PLT entry.  */
57
#define elf_sh64_plt_reloc_offset(info) (info->shared ? 52 : 44)
58
 
59
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
60
 
61
/* The sh linker needs to keep track of the number of relocs that it
62
   decides to copy in check_relocs for each symbol.  This is so that
63
   it can discard PC relative relocs if it doesn't need them when
64
   linking with -Bsymbolic.  We store the information in a field
65
   extending the regular ELF linker hash table.  */
66
 
67
/* This structure keeps track of the number of PC relative relocs we
68
   have copied for a given symbol.  */
69
 
70
struct elf_sh64_pcrel_relocs_copied
71
{
72
  /* Next section.  */
73
  struct elf_sh64_pcrel_relocs_copied *next;
74
  /* A section in dynobj.  */
75
  asection *section;
76
  /* Number of relocs copied in this section.  */
77
  bfd_size_type count;
78
};
79
 
80
/* sh ELF linker hash entry.  */
81
 
82
struct elf_sh64_link_hash_entry
83
{
84
  struct elf_link_hash_entry root;
85
 
86
  bfd_vma datalabel_got_offset;
87
 
88
  /* Number of PC relative relocs copied for this symbol.  */
89
  struct elf_sh64_pcrel_relocs_copied *pcrel_relocs_copied;
90
};
91
 
92
/* sh ELF linker hash table.  */
93
 
94
struct elf_sh64_link_hash_table
95
{
96
  struct elf_link_hash_table root;
97
};
98
 
99
/* Traverse an sh ELF linker hash table.  */
100
 
101
#define sh64_elf64_link_hash_traverse(table, func, info)                \
102
  (elf_link_hash_traverse                                               \
103
   (&(table)->root,                                                     \
104
    (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
105
    (info)))
106
 
107
/* Get the sh ELF linker hash table from a link_info structure.  */
108
 
109
#define sh64_elf64_hash_table(p) \
110
  ((struct elf_sh64_link_hash_table *) ((p)->hash))
111
 
112
static bfd_reloc_status_type sh_elf64_ignore_reloc
113
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
114
static bfd_reloc_status_type sh_elf64_reloc
115
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
116
 
117
static reloc_howto_type sh_elf64_howto_table[] = {
118
  /* No relocation.  */
119
  HOWTO (R_SH_NONE,             /* type */
120
         0,                      /* rightshift */
121
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
122
         0,                      /* bitsize */
123
         FALSE,                 /* pc_relative */
124
         0,                      /* bitpos */
125
         complain_overflow_dont, /* complain_on_overflow */
126
         sh_elf64_ignore_reloc, /* special_function */
127
         "R_SH_NONE",           /* name */
128
         FALSE,                 /* partial_inplace */
129
         0,                      /* src_mask */
130
         0,                      /* dst_mask */
131
         FALSE),                /* pcrel_offset */
132
 
133
  /* 32 bit absolute relocation.  Setting partial_inplace to TRUE and
134
     src_mask to a non-zero value is similar to the COFF toolchain.  */
135
  HOWTO (R_SH_DIR32,            /* type */
136
         0,                      /* rightshift */
137
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
138
         32,                    /* bitsize */
139
         FALSE,                 /* pc_relative */
140
         0,                      /* bitpos */
141
         complain_overflow_bitfield, /* complain_on_overflow */
142
         sh_elf64_reloc,                /* special_function */
143
         "R_SH_DIR32",          /* name */
144
         TRUE,                  /* partial_inplace */
145
         0xffffffff,            /* src_mask */
146
         0xffffffff,            /* dst_mask */
147
         FALSE),                /* pcrel_offset */
148
 
149
  /* 32 bit PC relative relocation.  */
150
  HOWTO (R_SH_REL32,            /* type */
151
         0,                      /* rightshift */
152
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
153
         32,                    /* bitsize */
154
         TRUE,                  /* pc_relative */
155
         0,                      /* bitpos */
156
         complain_overflow_signed, /* complain_on_overflow */
157
         sh_elf64_ignore_reloc, /* special_function */
158
         "R_SH_REL32",          /* name */
159
         FALSE,                 /* partial_inplace */
160
         0,                      /* src_mask */
161
         0xffffffff,            /* dst_mask */
162
         TRUE),                 /* pcrel_offset */
163
 
164
  /* For 32-bit sh, this is R_SH_DIR8WPN.  */
165
  EMPTY_HOWTO (3),
166
 
167
  /* For 32-bit sh, this is R_SH_IND12W.  */
168
  EMPTY_HOWTO (4),
169
 
170
  /* For 32-bit sh, this is R_SH_DIR8WPL.  */
171
  EMPTY_HOWTO (5),
172
 
173
  /* For 32-bit sh, this is R_SH_DIR8WPZ.  */
174
  EMPTY_HOWTO (6),
175
 
176
  /* For 32-bit sh, this is R_SH_DIR8BP.  */
177
  EMPTY_HOWTO (7),
178
 
179
  /* For 32-bit sh, this is R_SH_DIR8W.  */
180
  EMPTY_HOWTO (8),
181
 
182
  /* For 32-bit sh, this is R_SH_DIR8L.  */
183
  EMPTY_HOWTO (9),
184
 
185
  EMPTY_HOWTO (10),
186
  EMPTY_HOWTO (11),
187
  EMPTY_HOWTO (12),
188
  EMPTY_HOWTO (13),
189
  EMPTY_HOWTO (14),
190
  EMPTY_HOWTO (15),
191
  EMPTY_HOWTO (16),
192
  EMPTY_HOWTO (17),
193
  EMPTY_HOWTO (18),
194
  EMPTY_HOWTO (19),
195
  EMPTY_HOWTO (20),
196
  EMPTY_HOWTO (21),
197
  EMPTY_HOWTO (22),
198
  EMPTY_HOWTO (23),
199
  EMPTY_HOWTO (24),
200
 
201
  /* The remaining relocs are a GNU extension used for relaxing.  The
202
     final pass of the linker never needs to do anything with any of
203
     these relocs.  Any required operations are handled by the
204
     relaxation code.  */
205
 
206
  /* A 16 bit switch table entry.  This is generated for an expression
207
     such as ``.word L1 - L2''.  The offset holds the difference
208
     between the reloc address and L2.  */
209
  HOWTO (R_SH_SWITCH16,         /* type */
210
         0,                      /* rightshift */
211
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
212
         16,                    /* bitsize */
213
         FALSE,                 /* pc_relative */
214
         0,                      /* bitpos */
215
         complain_overflow_unsigned, /* complain_on_overflow */
216
         sh_elf64_ignore_reloc, /* special_function */
217
         "R_SH_SWITCH16",       /* name */
218
         FALSE,                 /* partial_inplace */
219
         0,                      /* src_mask */
220
         0,                      /* dst_mask */
221
         TRUE),                 /* pcrel_offset */
222
 
223
  /* A 32 bit switch table entry.  This is generated for an expression
224
     such as ``.long L1 - L2''.  The offset holds the difference
225
     between the reloc address and L2.  */
226
  HOWTO (R_SH_SWITCH32,         /* type */
227
         0,                      /* rightshift */
228
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
229
         32,                    /* bitsize */
230
         FALSE,                 /* pc_relative */
231
         0,                      /* bitpos */
232
         complain_overflow_unsigned, /* complain_on_overflow */
233
         sh_elf64_ignore_reloc, /* special_function */
234
         "R_SH_SWITCH32",       /* name */
235
         FALSE,                 /* partial_inplace */
236
         0,                      /* src_mask */
237
         0,                      /* dst_mask */
238
         TRUE),                 /* pcrel_offset */
239
 
240
  /* For 32-bit sh, this is R_SH_USES.  */
241
  EMPTY_HOWTO (27),
242
 
243
  /* For 32-bit sh, this is R_SH_COUNT.  */
244
  EMPTY_HOWTO (28),
245
 
246
  /* For 32-bit sh, this is R_SH_ALIGN.  FIXME: For linker relaxation,
247
     this might be emitted.  When linker relaxation is implemented, we
248
     might want to use it.  */
249
  EMPTY_HOWTO (29),
250
 
251
  /* For 32-bit sh, this is R_SH_CODE.  FIXME: For linker relaxation,
252
     this might be emitted.  When linker relaxation is implemented, we
253
     might want to use it.  */
254
  EMPTY_HOWTO (30),
255
 
256
  /* For 32-bit sh, this is R_SH_DATA.  FIXME: For linker relaxation,
257
     this might be emitted.  When linker relaxation is implemented, we
258
     might want to use it.  */
259
  EMPTY_HOWTO (31),
260
 
261
  /* For 32-bit sh, this is R_SH_LABEL.  FIXME: For linker relaxation,
262
     this might be emitted.  When linker relaxation is implemented, we
263
     might want to use it.  */
264
  EMPTY_HOWTO (32),
265
 
266
  /* An 8 bit switch table entry.  This is generated for an expression
267
     such as ``.word L1 - L2''.  The offset holds the difference
268
     between the reloc address and L2.  */
269
  HOWTO (R_SH_SWITCH8,          /* type */
270
         0,                      /* rightshift */
271
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
272
         8,                     /* bitsize */
273
         FALSE,                 /* pc_relative */
274
         0,                      /* bitpos */
275
         complain_overflow_unsigned, /* complain_on_overflow */
276
         sh_elf64_ignore_reloc, /* special_function */
277
         "R_SH_SWITCH8",        /* name */
278
         FALSE,                 /* partial_inplace */
279
         0,                      /* src_mask */
280
         0,                      /* dst_mask */
281
         TRUE),                 /* pcrel_offset */
282
 
283
  /* GNU extension to record C++ vtable hierarchy */
284
  HOWTO (R_SH_GNU_VTINHERIT, /* type */
285
         0,                     /* rightshift */
286
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
287
         0,                     /* bitsize */
288
         FALSE,                 /* pc_relative */
289
         0,                     /* bitpos */
290
         complain_overflow_dont, /* complain_on_overflow */
291
         NULL,                  /* special_function */
292
         "R_SH_GNU_VTINHERIT", /* name */
293
         FALSE,                 /* partial_inplace */
294
         0,                     /* src_mask */
295
         0,                     /* dst_mask */
296
         FALSE),                /* pcrel_offset */
297
 
298
  /* GNU extension to record C++ vtable member usage */
299
  HOWTO (R_SH_GNU_VTENTRY,     /* type */
300
         0,                     /* rightshift */
301
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
302
         0,                     /* bitsize */
303
         FALSE,                 /* pc_relative */
304
         0,                     /* bitpos */
305
         complain_overflow_dont, /* complain_on_overflow */
306
         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
307
         "R_SH_GNU_VTENTRY",   /* name */
308
         FALSE,                 /* partial_inplace */
309
         0,                     /* src_mask */
310
         0,                     /* dst_mask */
311
         FALSE),                /* pcrel_offset */
312
 
313
  /* For 32-bit sh, this is R_SH_LOOP_START.  */
314
  EMPTY_HOWTO (36),
315
 
316
  /* For 32-bit sh, this is R_SH_LOOP_END.  */
317
  EMPTY_HOWTO (37),
318
 
319
  EMPTY_HOWTO (38),
320
  EMPTY_HOWTO (39),
321
  EMPTY_HOWTO (40),
322
  EMPTY_HOWTO (41),
323
  EMPTY_HOWTO (42),
324
  EMPTY_HOWTO (43),
325
  EMPTY_HOWTO (44),
326
 
327
  /* Used in SHLLI.L and SHLRI.L.  */
328
  HOWTO (R_SH_DIR5U,            /* type */
329
         0,                      /* rightshift */
330
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
331
         5,                     /* bitsize */
332
         FALSE,                 /* pc_relative */
333
         10,                    /* bitpos */
334
         complain_overflow_unsigned, /* complain_on_overflow */
335
         bfd_elf_generic_reloc, /* special_function */
336
         "R_SH_DIR5U",          /* name */
337
         FALSE,                 /* partial_inplace */
338
         0,                      /* src_mask */
339
         0xfc00,                /* dst_mask */
340
         FALSE),                /* pcrel_offset */
341
 
342
  /* Used in SHARI, SHLLI et al.  */
343
  HOWTO (R_SH_DIR6U,            /* type */
344
         0,                      /* rightshift */
345
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
346
         6,                     /* bitsize */
347
         FALSE,                 /* pc_relative */
348
         10,                    /* bitpos */
349
         complain_overflow_unsigned, /* complain_on_overflow */
350
         bfd_elf_generic_reloc, /* special_function */
351
         "R_SH_DIR6U",          /* name */
352
         FALSE,                 /* partial_inplace */
353
         0,                      /* src_mask */
354
         0xfc00,                /* dst_mask */
355
         FALSE),                /* pcrel_offset */
356
 
357
  /* Used in BxxI, LDHI.L et al.  */
358
  HOWTO (R_SH_DIR6S,            /* type */
359
         0,                      /* rightshift */
360
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
361
         6,                     /* bitsize */
362
         FALSE,                 /* pc_relative */
363
         10,                    /* bitpos */
364
         complain_overflow_signed, /* complain_on_overflow */
365
         bfd_elf_generic_reloc, /* special_function */
366
         "R_SH_DIR6S",          /* name */
367
         FALSE,                 /* partial_inplace */
368
         0,                      /* src_mask */
369
         0xfc00,                /* dst_mask */
370
         FALSE),                /* pcrel_offset */
371
 
372
  /* Used in ADDI, ANDI et al.  */
373
  HOWTO (R_SH_DIR10S,           /* type */
374
         0,                      /* rightshift */
375
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
376
         10,                    /* bitsize */
377
         FALSE,                 /* pc_relative */
378
         10,                    /* bitpos */
379
         complain_overflow_signed, /* complain_on_overflow */
380
         bfd_elf_generic_reloc, /* special_function */
381
         "R_SH_DIR10S",         /* name */
382
         FALSE,                 /* partial_inplace */
383
         0,                      /* src_mask */
384
         0xffc00,               /* dst_mask */
385
         FALSE),                /* pcrel_offset */
386
 
387
  /* Used in LD.UW, ST.W et al.  */
388
  HOWTO (R_SH_DIR10SW,  /* type */
389
         1,                     /* rightshift */
390
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
391
         11,                    /* bitsize */
392
         FALSE,                 /* pc_relative */
393
         10,                    /* bitpos */
394
         complain_overflow_signed, /* complain_on_overflow */
395
         bfd_elf_generic_reloc, /* special_function */
396
         "R_SH_DIR10SW",        /* name */
397
         FALSE,                 /* partial_inplace */
398
         0,                      /* src_mask */
399
         0xffc00,               /* dst_mask */
400
         FALSE),                /* pcrel_offset */
401
 
402
  /* Used in LD.L, FLD.S et al.  */
403
  HOWTO (R_SH_DIR10SL,  /* type */
404
         2,                     /* rightshift */
405
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
406
         12,                    /* bitsize */
407
         FALSE,                 /* pc_relative */
408
         10,                    /* bitpos */
409
         complain_overflow_signed, /* complain_on_overflow */
410
         bfd_elf_generic_reloc, /* special_function */
411
         "R_SH_DIR10SL",        /* name */
412
         FALSE,                 /* partial_inplace */
413
         0,                      /* src_mask */
414
         0xffc00,               /* dst_mask */
415
         FALSE),                /* pcrel_offset */
416
 
417
  /* Used in FLD.D, FST.P et al.  */
418
  HOWTO (R_SH_DIR10SQ,  /* type */
419
         3,                     /* rightshift */
420
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
421
         13,                    /* bitsize */
422
         FALSE,                 /* pc_relative */
423
         10,                    /* bitpos */
424
         complain_overflow_signed, /* complain_on_overflow */
425
         bfd_elf_generic_reloc, /* special_function */
426
         "R_SH_DIR10SQ",        /* name */
427
         FALSE,                 /* partial_inplace */
428
         0,                      /* src_mask */
429
         0xffc00,               /* dst_mask */
430
         FALSE),                /* pcrel_offset */
431
 
432
  EMPTY_HOWTO (52),
433
  EMPTY_HOWTO (53),
434
  EMPTY_HOWTO (54),
435
  EMPTY_HOWTO (55),
436
  EMPTY_HOWTO (56),
437
  EMPTY_HOWTO (57),
438
  EMPTY_HOWTO (58),
439
  EMPTY_HOWTO (59),
440
  EMPTY_HOWTO (60),
441
  EMPTY_HOWTO (61),
442
  EMPTY_HOWTO (62),
443
  EMPTY_HOWTO (63),
444
  EMPTY_HOWTO (64),
445
  EMPTY_HOWTO (65),
446
  EMPTY_HOWTO (66),
447
  EMPTY_HOWTO (67),
448
  EMPTY_HOWTO (68),
449
  EMPTY_HOWTO (69),
450
  EMPTY_HOWTO (70),
451
  EMPTY_HOWTO (71),
452
  EMPTY_HOWTO (72),
453
  EMPTY_HOWTO (73),
454
  EMPTY_HOWTO (74),
455
  EMPTY_HOWTO (75),
456
  EMPTY_HOWTO (76),
457
  EMPTY_HOWTO (77),
458
  EMPTY_HOWTO (78),
459
  EMPTY_HOWTO (79),
460
  EMPTY_HOWTO (80),
461
  EMPTY_HOWTO (81),
462
  EMPTY_HOWTO (82),
463
  EMPTY_HOWTO (83),
464
  EMPTY_HOWTO (84),
465
  EMPTY_HOWTO (85),
466
  EMPTY_HOWTO (86),
467
  EMPTY_HOWTO (87),
468
  EMPTY_HOWTO (88),
469
  EMPTY_HOWTO (89),
470
  EMPTY_HOWTO (90),
471
  EMPTY_HOWTO (91),
472
  EMPTY_HOWTO (92),
473
  EMPTY_HOWTO (93),
474
  EMPTY_HOWTO (94),
475
  EMPTY_HOWTO (95),
476
  EMPTY_HOWTO (96),
477
  EMPTY_HOWTO (97),
478
  EMPTY_HOWTO (98),
479
  EMPTY_HOWTO (99),
480
  EMPTY_HOWTO (100),
481
  EMPTY_HOWTO (101),
482
  EMPTY_HOWTO (102),
483
  EMPTY_HOWTO (103),
484
  EMPTY_HOWTO (104),
485
  EMPTY_HOWTO (105),
486
  EMPTY_HOWTO (106),
487
  EMPTY_HOWTO (107),
488
  EMPTY_HOWTO (108),
489
  EMPTY_HOWTO (109),
490
  EMPTY_HOWTO (110),
491
  EMPTY_HOWTO (111),
492
  EMPTY_HOWTO (112),
493
  EMPTY_HOWTO (113),
494
  EMPTY_HOWTO (114),
495
  EMPTY_HOWTO (115),
496
  EMPTY_HOWTO (116),
497
  EMPTY_HOWTO (117),
498
  EMPTY_HOWTO (118),
499
  EMPTY_HOWTO (119),
500
  EMPTY_HOWTO (120),
501
  EMPTY_HOWTO (121),
502
  EMPTY_HOWTO (122),
503
  EMPTY_HOWTO (123),
504
  EMPTY_HOWTO (124),
505
  EMPTY_HOWTO (125),
506
  EMPTY_HOWTO (126),
507
  EMPTY_HOWTO (127),
508
  EMPTY_HOWTO (128),
509
  EMPTY_HOWTO (129),
510
  EMPTY_HOWTO (130),
511
  EMPTY_HOWTO (131),
512
  EMPTY_HOWTO (132),
513
  EMPTY_HOWTO (133),
514
  EMPTY_HOWTO (134),
515
  EMPTY_HOWTO (135),
516
  EMPTY_HOWTO (136),
517
  EMPTY_HOWTO (137),
518
  EMPTY_HOWTO (138),
519
  EMPTY_HOWTO (139),
520
  EMPTY_HOWTO (140),
521
  EMPTY_HOWTO (141),
522
  EMPTY_HOWTO (142),
523
  EMPTY_HOWTO (143),
524
  EMPTY_HOWTO (144),
525
  EMPTY_HOWTO (145),
526
  EMPTY_HOWTO (146),
527
  EMPTY_HOWTO (147),
528
  EMPTY_HOWTO (148),
529
  EMPTY_HOWTO (149),
530
  EMPTY_HOWTO (150),
531
  EMPTY_HOWTO (151),
532
  EMPTY_HOWTO (152),
533
  EMPTY_HOWTO (153),
534
  EMPTY_HOWTO (154),
535
  EMPTY_HOWTO (155),
536
  EMPTY_HOWTO (156),
537
  EMPTY_HOWTO (157),
538
  EMPTY_HOWTO (158),
539
  EMPTY_HOWTO (159),
540
 
541
  /* Relocs for dynamic linking for 32-bit SH would follow.  We don't have
542
     any dynamic linking support for 64-bit SH at present.  */
543
 
544
  EMPTY_HOWTO (160),
545
  EMPTY_HOWTO (161),
546
  EMPTY_HOWTO (162),
547
  EMPTY_HOWTO (163),
548
  EMPTY_HOWTO (164),
549
  EMPTY_HOWTO (165),
550
  EMPTY_HOWTO (166),
551
  EMPTY_HOWTO (167),
552
  EMPTY_HOWTO (168),
553
 
554
  /* Back to SH5 relocations.  */
555
  /* Used in MOVI and SHORI (x & 65536).  */
556
  HOWTO (R_SH_GOT_LOW16,        /* type */
557
         0,                      /* rightshift */
558
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
559
         64,                    /* bitsize */
560
         FALSE,                 /* pc_relative */
561
         10,                    /* bitpos */
562
         complain_overflow_dont, /* complain_on_overflow */
563
         bfd_elf_generic_reloc, /* special_function */
564
         "R_SH_GOT_LOW16",      /* name */
565
         FALSE,                 /* partial_inplace */
566
         0,                      /* src_mask */
567
         0x3fffc00,             /* dst_mask */
568
         FALSE),                /* pcrel_offset */
569
 
570
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
571
  HOWTO (R_SH_GOT_MEDLOW16,     /* type */
572
         16,                    /* rightshift */
573
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
574
         64,                    /* bitsize */
575
         FALSE,                 /* pc_relative */
576
         10,                    /* bitpos */
577
         complain_overflow_dont, /* complain_on_overflow */
578
         bfd_elf_generic_reloc, /* special_function */
579
         "R_SH_GOT_MEDLOW16",   /* name */
580
         FALSE,                 /* partial_inplace */
581
         0,                      /* src_mask */
582
         0x3fffc00,             /* dst_mask */
583
         FALSE),                /* pcrel_offset */
584
 
585
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
586
  HOWTO (R_SH_GOT_MEDHI16,      /* type */
587
         32,                    /* rightshift */
588
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
589
         64,                    /* bitsize */
590
         FALSE,                 /* pc_relative */
591
         10,                    /* bitpos */
592
         complain_overflow_dont, /* complain_on_overflow */
593
         bfd_elf_generic_reloc, /* special_function */
594
         "R_SH_GOT_MEDHI16",    /* name */
595
         FALSE,                 /* partial_inplace */
596
         0,                      /* src_mask */
597
         0x3fffc00,             /* dst_mask */
598
         FALSE),                /* pcrel_offset */
599
 
600
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
601
  HOWTO (R_SH_GOT_HI16,         /* type */
602
         48,                    /* rightshift */
603
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
604
         64,                    /* bitsize */
605
         FALSE,                 /* pc_relative */
606
         10,                    /* bitpos */
607
         complain_overflow_dont, /* complain_on_overflow */
608
         bfd_elf_generic_reloc, /* special_function */
609
         "R_SH_GOT_HI16",       /* name */
610
         FALSE,                 /* partial_inplace */
611
         0,                      /* src_mask */
612
         0x3fffc00,             /* dst_mask */
613
         FALSE),                /* pcrel_offset */
614
 
615
  /* Used in MOVI and SHORI (x & 65536).  */
616
  HOWTO (R_SH_GOTPLT_LOW16,     /* type */
617
         0,                      /* rightshift */
618
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
619
         64,                    /* bitsize */
620
         FALSE,                 /* pc_relative */
621
         10,                    /* bitpos */
622
         complain_overflow_dont, /* complain_on_overflow */
623
         bfd_elf_generic_reloc, /* special_function */
624
         "R_SH_GOTPLT_LOW16",   /* name */
625
         FALSE,                 /* partial_inplace */
626
         0,                      /* src_mask */
627
         0x3fffc00,             /* dst_mask */
628
         FALSE),                /* pcrel_offset */
629
 
630
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
631
  HOWTO (R_SH_GOTPLT_MEDLOW16,  /* type */
632
         16,                    /* rightshift */
633
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
634
         64,                    /* bitsize */
635
         FALSE,                 /* pc_relative */
636
         10,                    /* bitpos */
637
         complain_overflow_dont, /* complain_on_overflow */
638
         bfd_elf_generic_reloc, /* special_function */
639
         "R_SH_GOTPLT_MEDLOW16", /* name */
640
         FALSE,                 /* partial_inplace */
641
         0,                      /* src_mask */
642
         0x3fffc00,             /* dst_mask */
643
         FALSE),                /* pcrel_offset */
644
 
645
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
646
  HOWTO (R_SH_GOTPLT_MEDHI16,   /* type */
647
         32,                    /* rightshift */
648
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
649
         64,                    /* bitsize */
650
         FALSE,                 /* pc_relative */
651
         10,                    /* bitpos */
652
         complain_overflow_dont, /* complain_on_overflow */
653
         bfd_elf_generic_reloc, /* special_function */
654
         "R_SH_GOTPLT_MEDHI16", /* name */
655
         FALSE,                 /* partial_inplace */
656
         0,                      /* src_mask */
657
         0x3fffc00,             /* dst_mask */
658
         FALSE),                /* pcrel_offset */
659
 
660
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
661
  HOWTO (R_SH_GOTPLT_HI16,      /* type */
662
         48,                    /* rightshift */
663
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
664
         64,                    /* bitsize */
665
         FALSE,                 /* pc_relative */
666
         10,                    /* bitpos */
667
         complain_overflow_dont, /* complain_on_overflow */
668
         bfd_elf_generic_reloc, /* special_function */
669
         "R_SH_GOTPLT_HI16",    /* name */
670
         FALSE,                 /* partial_inplace */
671
         0,                      /* src_mask */
672
         0x3fffc00,             /* dst_mask */
673
         FALSE),                /* pcrel_offset */
674
 
675
  /* Used in MOVI and SHORI (x & 65536).  */
676
  HOWTO (R_SH_PLT_LOW16,        /* type */
677
         0,                      /* rightshift */
678
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
679
         64,                    /* bitsize */
680
         TRUE,                  /* pc_relative */
681
         10,                    /* bitpos */
682
         complain_overflow_dont, /* complain_on_overflow */
683
         bfd_elf_generic_reloc, /* special_function */
684
         "R_SH_PLT_LOW16",      /* name */
685
         FALSE,                 /* partial_inplace */
686
         0,                      /* src_mask */
687
         0x3fffc00,             /* dst_mask */
688
         TRUE),                 /* pcrel_offset */
689
 
690
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
691
  HOWTO (R_SH_PLT_MEDLOW16,     /* type */
692
         16,                    /* rightshift */
693
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
694
         64,                    /* bitsize */
695
         TRUE,                  /* pc_relative */
696
         10,                    /* bitpos */
697
         complain_overflow_dont, /* complain_on_overflow */
698
         bfd_elf_generic_reloc, /* special_function */
699
         "R_SH_PLT_MEDLOW16",   /* name */
700
         FALSE,                 /* partial_inplace */
701
         0,                      /* src_mask */
702
         0x3fffc00,             /* dst_mask */
703
         TRUE),                 /* pcrel_offset */
704
 
705
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
706
  HOWTO (R_SH_PLT_MEDHI16,      /* type */
707
         32,                    /* rightshift */
708
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
709
         64,                    /* bitsize */
710
         TRUE,                  /* pc_relative */
711
         10,                    /* bitpos */
712
         complain_overflow_dont, /* complain_on_overflow */
713
         bfd_elf_generic_reloc, /* special_function */
714
         "R_SH_PLT_MEDHI16",    /* name */
715
         FALSE,                 /* partial_inplace */
716
         0,                      /* src_mask */
717
         0x3fffc00,             /* dst_mask */
718
         TRUE),                 /* pcrel_offset */
719
 
720
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
721
  HOWTO (R_SH_PLT_HI16,         /* type */
722
         48,                    /* rightshift */
723
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
724
         64,                    /* bitsize */
725
         TRUE,                  /* pc_relative */
726
         10,                    /* bitpos */
727
         complain_overflow_dont, /* complain_on_overflow */
728
         bfd_elf_generic_reloc, /* special_function */
729
         "R_SH_PLT_HI16",       /* name */
730
         FALSE,                 /* partial_inplace */
731
         0,                      /* src_mask */
732
         0x3fffc00,             /* dst_mask */
733
         TRUE),                 /* pcrel_offset */
734
 
735
  /* Used in MOVI and SHORI (x & 65536).  */
736
  HOWTO (R_SH_GOTOFF_LOW16,     /* type */
737
         0,                      /* rightshift */
738
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
739
         64,                    /* bitsize */
740
         FALSE,                 /* pc_relative */
741
         10,                    /* bitpos */
742
         complain_overflow_dont, /* complain_on_overflow */
743
         bfd_elf_generic_reloc, /* special_function */
744
         "R_SH_GOTOFF_LOW16",   /* name */
745
         FALSE,                 /* partial_inplace */
746
         0,                      /* src_mask */
747
         0x3fffc00,             /* dst_mask */
748
         FALSE),                /* pcrel_offset */
749
 
750
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
751
  HOWTO (R_SH_GOTOFF_MEDLOW16,  /* type */
752
         16,                    /* rightshift */
753
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
754
         64,                    /* bitsize */
755
         FALSE,                 /* pc_relative */
756
         10,                    /* bitpos */
757
         complain_overflow_dont, /* complain_on_overflow */
758
         bfd_elf_generic_reloc, /* special_function */
759
         "R_SH_GOTOFF_MEDLOW16", /* name */
760
         FALSE,                 /* partial_inplace */
761
         0,                      /* src_mask */
762
         0x3fffc00,             /* dst_mask */
763
         FALSE),                /* pcrel_offset */
764
 
765
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
766
  HOWTO (R_SH_GOTOFF_MEDHI16,   /* type */
767
         32,                    /* rightshift */
768
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
769
         64,                    /* bitsize */
770
         FALSE,                 /* pc_relative */
771
         10,                    /* bitpos */
772
         complain_overflow_dont, /* complain_on_overflow */
773
         bfd_elf_generic_reloc, /* special_function */
774
         "R_SH_GOTOFF_MEDHI16", /* name */
775
         FALSE,                 /* partial_inplace */
776
         0,                      /* src_mask */
777
         0x3fffc00,             /* dst_mask */
778
         FALSE),                /* pcrel_offset */
779
 
780
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
781
  HOWTO (R_SH_GOTOFF_HI16,      /* type */
782
         48,                    /* rightshift */
783
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
784
         64,                    /* bitsize */
785
         FALSE,                 /* pc_relative */
786
         10,                    /* bitpos */
787
         complain_overflow_dont, /* complain_on_overflow */
788
         bfd_elf_generic_reloc, /* special_function */
789
         "R_SH_GOTOFF_HI16",    /* name */
790
         FALSE,                 /* partial_inplace */
791
         0,                      /* src_mask */
792
         0x3fffc00,             /* dst_mask */
793
         FALSE),                /* pcrel_offset */
794
 
795
  /* Used in MOVI and SHORI (x & 65536).  */
796
  HOWTO (R_SH_GOTPC_LOW16,      /* type */
797
         0,                      /* rightshift */
798
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
799
         64,                    /* bitsize */
800
         TRUE,                  /* pc_relative */
801
         10,                    /* bitpos */
802
         complain_overflow_dont, /* complain_on_overflow */
803
         bfd_elf_generic_reloc, /* special_function */
804
         "R_SH_GOTPC_LOW16",    /* name */
805
         FALSE,                 /* partial_inplace */
806
         0,                      /* src_mask */
807
         0x3fffc00,             /* dst_mask */
808
         TRUE),                 /* pcrel_offset */
809
 
810
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
811
  HOWTO (R_SH_GOTPC_MEDLOW16,   /* type */
812
         16,                    /* rightshift */
813
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
814
         64,                    /* bitsize */
815
         TRUE,                  /* pc_relative */
816
         10,                    /* bitpos */
817
         complain_overflow_dont, /* complain_on_overflow */
818
         bfd_elf_generic_reloc, /* special_function */
819
         "R_SH_GOTPC_MEDLOW16", /* name */
820
         FALSE,                 /* partial_inplace */
821
         0,                      /* src_mask */
822
         0x3fffc00,             /* dst_mask */
823
         TRUE),                 /* pcrel_offset */
824
 
825
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
826
  HOWTO (R_SH_GOTPC_MEDHI16,    /* type */
827
         32,                    /* rightshift */
828
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
829
         64,                    /* bitsize */
830
         TRUE,                  /* pc_relative */
831
         10,                    /* bitpos */
832
         complain_overflow_dont, /* complain_on_overflow */
833
         bfd_elf_generic_reloc, /* special_function */
834
         "R_SH_GOTPC_MEDHI16",  /* name */
835
         FALSE,                 /* partial_inplace */
836
         0,                      /* src_mask */
837
         0x3fffc00,             /* dst_mask */
838
         TRUE),                 /* pcrel_offset */
839
 
840
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
841
  HOWTO (R_SH_GOTPC_HI16,       /* type */
842
         48,                    /* rightshift */
843
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
844
         64,                    /* bitsize */
845
         TRUE,                  /* pc_relative */
846
         10,                    /* bitpos */
847
         complain_overflow_dont, /* complain_on_overflow */
848
         bfd_elf_generic_reloc, /* special_function */
849
         "R_SH_GOTPC_HI16",     /* name */
850
         FALSE,                 /* partial_inplace */
851
         0,                      /* src_mask */
852
         0x3fffc00,             /* dst_mask */
853
         TRUE),                 /* pcrel_offset */
854
 
855
  /* Used in LD.L, FLD.S et al.  */
856
  HOWTO (R_SH_GOT10BY4,         /* type */
857
         2,                     /* rightshift */
858
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
859
         12,                    /* bitsize */
860
         FALSE,                 /* pc_relative */
861
         10,                    /* bitpos */
862
         complain_overflow_signed, /* complain_on_overflow */
863
         bfd_elf_generic_reloc, /* special_function */
864
         "R_SH_GOT10BY4",       /* name */
865
         FALSE,                 /* partial_inplace */
866
         0,                      /* src_mask */
867
         0xffc00,               /* dst_mask */
868
         FALSE),                /* pcrel_offset */
869
 
870
  /* Used in LD.L, FLD.S et al.  */
871
  HOWTO (R_SH_GOTPLT10BY4,      /* type */
872
         2,                     /* rightshift */
873
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
874
         12,                    /* bitsize */
875
         FALSE,                 /* pc_relative */
876
         10,                    /* bitpos */
877
         complain_overflow_signed, /* complain_on_overflow */
878
         bfd_elf_generic_reloc, /* special_function */
879
         "R_SH_GOTPLT10BY4",    /* name */
880
         FALSE,                 /* partial_inplace */
881
         0,                      /* src_mask */
882
         0xffc00,               /* dst_mask */
883
         FALSE),                /* pcrel_offset */
884
 
885
  /* Used in FLD.D, FST.P et al.  */
886
  HOWTO (R_SH_GOT10BY8,         /* type */
887
         3,                     /* rightshift */
888
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
889
         13,                    /* bitsize */
890
         FALSE,                 /* pc_relative */
891
         10,                    /* bitpos */
892
         complain_overflow_signed, /* complain_on_overflow */
893
         bfd_elf_generic_reloc, /* special_function */
894
         "R_SH_GOT10BY8",       /* name */
895
         FALSE,                 /* partial_inplace */
896
         0,                      /* src_mask */
897
         0xffc00,               /* dst_mask */
898
         FALSE),                /* pcrel_offset */
899
 
900
  /* Used in FLD.D, FST.P et al.  */
901
  HOWTO (R_SH_GOTPLT10BY8,      /* type */
902
         3,                     /* rightshift */
903
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
904
         13,                    /* bitsize */
905
         FALSE,                 /* pc_relative */
906
         10,                    /* bitpos */
907
         complain_overflow_signed, /* complain_on_overflow */
908
         bfd_elf_generic_reloc, /* special_function */
909
         "R_SH_GOTPLT10BY8",    /* name */
910
         FALSE,                 /* partial_inplace */
911
         0,                      /* src_mask */
912
         0xffc00,               /* dst_mask */
913
         FALSE),                /* pcrel_offset */
914
 
915
  HOWTO (R_SH_COPY64,           /* type */
916
         0,                      /* rightshift */
917
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
918
         64,                    /* bitsize */
919
         FALSE,                 /* pc_relative */
920
         0,                      /* bitpos */
921
         complain_overflow_dont, /* complain_on_overflow */
922
         bfd_elf_generic_reloc, /* special_function */
923
         "R_SH_COPY64",         /* name */
924
         FALSE,                 /* partial_inplace */
925
         0,                      /* src_mask */
926
         ((bfd_vma) 0) - 1,      /* dst_mask */
927
         FALSE),                /* pcrel_offset */
928
 
929
  HOWTO (R_SH_GLOB_DAT64,       /* type */
930
         0,                      /* rightshift */
931
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
932
         64,                    /* bitsize */
933
         FALSE,                 /* pc_relative */
934
         0,                      /* bitpos */
935
         complain_overflow_dont, /* complain_on_overflow */
936
         bfd_elf_generic_reloc, /* special_function */
937
         "R_SH_GLOB_DAT64",     /* name */
938
         FALSE,                 /* partial_inplace */
939
         0,                      /* src_mask */
940
         ((bfd_vma) 0) - 1,      /* dst_mask */
941
         FALSE),                /* pcrel_offset */
942
 
943
  HOWTO (R_SH_JMP_SLOT64,       /* type */
944
         0,                      /* rightshift */
945
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
946
         64,                    /* bitsize */
947
         FALSE,                 /* pc_relative */
948
         0,                      /* bitpos */
949
         complain_overflow_dont, /* complain_on_overflow */
950
         bfd_elf_generic_reloc, /* special_function */
951
         "R_SH_JMP_SLOT64",     /* name */
952
         FALSE,                 /* partial_inplace */
953
         0,                      /* src_mask */
954
         ((bfd_vma) 0) - 1,      /* dst_mask */
955
         FALSE),                /* pcrel_offset */
956
 
957
  HOWTO (R_SH_RELATIVE64,       /* type */
958
         0,                      /* rightshift */
959
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
960
         64,                    /* bitsize */
961
         FALSE,                 /* pc_relative */
962
         0,                      /* bitpos */
963
         complain_overflow_dont, /* complain_on_overflow */
964
         bfd_elf_generic_reloc, /* special_function */
965
         "R_SH_RELATIVE64",     /* name */
966
         FALSE,                 /* partial_inplace */
967
         0,                      /* src_mask */
968
         ((bfd_vma) 0) - 1,      /* dst_mask */
969
         FALSE),                /* pcrel_offset */
970
 
971
  EMPTY_HOWTO (197),
972
  EMPTY_HOWTO (198),
973
  EMPTY_HOWTO (199),
974
  EMPTY_HOWTO (200),
975
  EMPTY_HOWTO (201),
976
  EMPTY_HOWTO (202),
977
  EMPTY_HOWTO (203),
978
  EMPTY_HOWTO (204),
979
  EMPTY_HOWTO (205),
980
  EMPTY_HOWTO (206),
981
  EMPTY_HOWTO (207),
982
  EMPTY_HOWTO (208),
983
  EMPTY_HOWTO (209),
984
  EMPTY_HOWTO (210),
985
  EMPTY_HOWTO (211),
986
  EMPTY_HOWTO (212),
987
  EMPTY_HOWTO (213),
988
  EMPTY_HOWTO (214),
989
  EMPTY_HOWTO (215),
990
  EMPTY_HOWTO (216),
991
  EMPTY_HOWTO (217),
992
  EMPTY_HOWTO (218),
993
  EMPTY_HOWTO (219),
994
  EMPTY_HOWTO (220),
995
  EMPTY_HOWTO (221),
996
  EMPTY_HOWTO (222),
997
  EMPTY_HOWTO (223),
998
  EMPTY_HOWTO (224),
999
  EMPTY_HOWTO (225),
1000
  EMPTY_HOWTO (226),
1001
  EMPTY_HOWTO (227),
1002
  EMPTY_HOWTO (228),
1003
  EMPTY_HOWTO (229),
1004
  EMPTY_HOWTO (230),
1005
  EMPTY_HOWTO (231),
1006
  EMPTY_HOWTO (232),
1007
  EMPTY_HOWTO (233),
1008
  EMPTY_HOWTO (234),
1009
  EMPTY_HOWTO (235),
1010
  EMPTY_HOWTO (236),
1011
  EMPTY_HOWTO (237),
1012
  EMPTY_HOWTO (238),
1013
  EMPTY_HOWTO (239),
1014
  EMPTY_HOWTO (240),
1015
  EMPTY_HOWTO (241),
1016
 
1017
  /* Relocations for SHmedia code.  None of these are partial_inplace or
1018
     use the field being relocated.  */
1019
 
1020
  /* The assembler will generate this reloc before a block of SHmedia
1021
     instructions.  A section should be processed as assuming it contains
1022
     data, unless this reloc is seen.  Note that a block of SHcompact
1023
     instructions are instead preceded by R_SH_CODE.
1024
     This is currently not implemented, but should be used for SHmedia
1025
     linker relaxation.  */
1026
  HOWTO (R_SH_SHMEDIA_CODE,     /* type */
1027
         0,                      /* rightshift */
1028
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1029
         0,                      /* bitsize */
1030
         FALSE,                 /* pc_relative */
1031
         0,                      /* bitpos */
1032
         complain_overflow_unsigned, /* complain_on_overflow */
1033
         sh_elf64_ignore_reloc, /* special_function */
1034
         "R_SH_SHMEDIA_CODE",   /* name */
1035
         FALSE,                 /* partial_inplace */
1036
         0,                      /* src_mask */
1037
         0,                      /* dst_mask */
1038
         FALSE),                /* pcrel_offset */
1039
 
1040
  /* The assembler will generate this reloc at a PTA or PTB instruction,
1041
     and the linker checks the right type of target, or changes a PTA to a
1042
     PTB, if the original insn was PT.  */
1043
  HOWTO (R_SH_PT_16,            /* type */
1044
         2,                     /* rightshift */
1045
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1046
         18,                    /* bitsize */
1047
         TRUE,                  /* pc_relative */
1048
         10,                    /* bitpos */
1049
         complain_overflow_signed, /* complain_on_overflow */
1050
         bfd_elf_generic_reloc, /* special_function */
1051
         "R_SH_PT_16",          /* name */
1052
         FALSE,                 /* partial_inplace */
1053
         0,                      /* src_mask */
1054
         0x3fffc00,             /* dst_mask */
1055
         TRUE),                 /* pcrel_offset */
1056
 
1057
  /* Used in unexpanded MOVI.  */
1058
  HOWTO (R_SH_IMMS16,           /* type */
1059
         0,                      /* rightshift */
1060
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1061
         16,                    /* bitsize */
1062
         FALSE,                 /* pc_relative */
1063
         10,                    /* bitpos */
1064
         complain_overflow_signed, /* complain_on_overflow */
1065
         bfd_elf_generic_reloc, /* special_function */
1066
         "R_SH_IMMS16",         /* name */
1067
         FALSE,                 /* partial_inplace */
1068
         0,                      /* src_mask */
1069
         0x3fffc00,             /* dst_mask */
1070
         FALSE),                /* pcrel_offset */
1071
 
1072
  /* Used in SHORI.  */
1073
  HOWTO (R_SH_IMMU16,           /* type */
1074
         0,                      /* rightshift */
1075
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1076
         16,                    /* bitsize */
1077
         FALSE,                 /* pc_relative */
1078
         10,                    /* bitpos */
1079
         complain_overflow_unsigned, /* complain_on_overflow */
1080
         bfd_elf_generic_reloc, /* special_function */
1081
         "R_SH_IMMU16",         /* name */
1082
         FALSE,                 /* partial_inplace */
1083
         0,                      /* src_mask */
1084
         0x3fffc00,             /* dst_mask */
1085
         FALSE),                /* pcrel_offset */
1086
 
1087
  /* Used in MOVI and SHORI (x & 65536).  */
1088
  HOWTO (R_SH_IMM_LOW16,        /* type */
1089
         0,                      /* rightshift */
1090
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1091
         64,                    /* bitsize */
1092
         FALSE,                 /* pc_relative */
1093
         10,                    /* bitpos */
1094
         complain_overflow_dont, /* complain_on_overflow */
1095
         bfd_elf_generic_reloc, /* special_function */
1096
         "R_SH_IMM_LOW16",      /* name */
1097
         FALSE,                 /* partial_inplace */
1098
         0,                      /* src_mask */
1099
         0x3fffc00,             /* dst_mask */
1100
         FALSE),                /* pcrel_offset */
1101
 
1102
  /* Used in MOVI and SHORI ((x - $) & 65536).  */
1103
  HOWTO (R_SH_IMM_LOW16_PCREL,  /* type */
1104
         0,                      /* rightshift */
1105
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1106
         64,                    /* bitsize */
1107
         TRUE,                  /* pc_relative */
1108
         10,                    /* bitpos */
1109
         complain_overflow_dont, /* complain_on_overflow */
1110
         bfd_elf_generic_reloc, /* special_function */
1111
         "R_SH_IMM_LOW16_PCREL", /* name */
1112
         FALSE,                 /* partial_inplace */
1113
         0,                      /* src_mask */
1114
         0x3fffc00,             /* dst_mask */
1115
         TRUE),                 /* pcrel_offset */
1116
 
1117
  /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1118
  HOWTO (R_SH_IMM_MEDLOW16,     /* type */
1119
         16,                    /* rightshift */
1120
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1121
         64,                    /* bitsize */
1122
         FALSE,                 /* pc_relative */
1123
         10,                    /* bitpos */
1124
         complain_overflow_dont, /* complain_on_overflow */
1125
         bfd_elf_generic_reloc, /* special_function */
1126
         "R_SH_IMM_MEDLOW16",   /* name */
1127
         FALSE,                 /* partial_inplace */
1128
         0,                      /* src_mask */
1129
         0x3fffc00,             /* dst_mask */
1130
         FALSE),                /* pcrel_offset */
1131
 
1132
  /* Used in MOVI and SHORI (((x - $) >> 16) & 65536).  */
1133
  HOWTO (R_SH_IMM_MEDLOW16_PCREL, /* type */
1134
         16,                    /* rightshift */
1135
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1136
         64,                    /* bitsize */
1137
         TRUE,                  /* pc_relative */
1138
         10,                    /* bitpos */
1139
         complain_overflow_dont, /* complain_on_overflow */
1140
         bfd_elf_generic_reloc, /* special_function */
1141
         "R_SH_IMM_MEDLOW16_PCREL", /* name */
1142
         FALSE,                 /* partial_inplace */
1143
         0,                      /* src_mask */
1144
         0x3fffc00,             /* dst_mask */
1145
         TRUE),                 /* pcrel_offset */
1146
 
1147
  /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1148
  HOWTO (R_SH_IMM_MEDHI16,      /* type */
1149
         32,                    /* rightshift */
1150
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1151
         64,                    /* bitsize */
1152
         FALSE,                 /* pc_relative */
1153
         10,                    /* bitpos */
1154
         complain_overflow_dont, /* complain_on_overflow */
1155
         bfd_elf_generic_reloc, /* special_function */
1156
         "R_SH_IMM_MEDHI16",    /* name */
1157
         FALSE,                 /* partial_inplace */
1158
         0,                      /* src_mask */
1159
         0x3fffc00,             /* dst_mask */
1160
         FALSE),                /* pcrel_offset */
1161
 
1162
  /* Used in MOVI and SHORI (((x - $) >> 32) & 65536).  */
1163
  HOWTO (R_SH_IMM_MEDHI16_PCREL, /* type */
1164
         32,                    /* rightshift */
1165
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1166
         64,                    /* bitsize */
1167
         TRUE,                  /* pc_relative */
1168
         10,                    /* bitpos */
1169
         complain_overflow_dont, /* complain_on_overflow */
1170
         bfd_elf_generic_reloc, /* special_function */
1171
         "R_SH_IMM_MEDHI16_PCREL", /* name */
1172
         FALSE,                 /* partial_inplace */
1173
         0,                      /* src_mask */
1174
         0x3fffc00,             /* dst_mask */
1175
         TRUE),                 /* pcrel_offset */
1176
 
1177
  /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1178
  HOWTO (R_SH_IMM_HI16,         /* type */
1179
         48,                    /* rightshift */
1180
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1181
         64,                    /* bitsize */
1182
         FALSE,                 /* pc_relative */
1183
         10,                    /* bitpos */
1184
         complain_overflow_dont, /* complain_on_overflow */
1185
         bfd_elf_generic_reloc, /* special_function */
1186
         "R_SH_IMM_HI16",       /* name */
1187
         FALSE,                 /* partial_inplace */
1188
         0,                      /* src_mask */
1189
         0x3fffc00,             /* dst_mask */
1190
         FALSE),                /* pcrel_offset */
1191
 
1192
  /* Used in MOVI and SHORI (((x - $) >> 48) & 65536).  */
1193
  HOWTO (R_SH_IMM_HI16_PCREL,   /* type */
1194
         48,                    /* rightshift */
1195
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1196
         64,                    /* bitsize */
1197
         TRUE,                  /* pc_relative */
1198
         10,                    /* bitpos */
1199
         complain_overflow_dont, /* complain_on_overflow */
1200
         bfd_elf_generic_reloc, /* special_function */
1201
         "R_SH_IMM_HI16_PCREL", /* name */
1202
         FALSE,                 /* partial_inplace */
1203
         0,                      /* src_mask */
1204
         0x3fffc00,             /* dst_mask */
1205
         TRUE),                 /* pcrel_offset */
1206
 
1207
  /* For the .uaquad pseudo.  */
1208
  HOWTO (R_SH_64,               /* type */
1209
         0,                      /* rightshift */
1210
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1211
         64,                    /* bitsize */
1212
         FALSE,                 /* pc_relative */
1213
         0,                      /* bitpos */
1214
         complain_overflow_dont, /* complain_on_overflow */
1215
         bfd_elf_generic_reloc, /* special_function */
1216
         "R_SH_64",             /* name */
1217
         FALSE,                 /* partial_inplace */
1218
         0,                      /* src_mask */
1219
         ((bfd_vma) 0) - 1,      /* dst_mask */
1220
         FALSE),                /* pcrel_offset */
1221
 
1222
  /* For the .uaquad pseudo, (x - $).  */
1223
  HOWTO (R_SH_64_PCREL,         /* type */
1224
         48,                    /* rightshift */
1225
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1226
         64,                    /* bitsize */
1227
         TRUE,                  /* pc_relative */
1228
         10,                    /* bitpos */
1229
         complain_overflow_dont, /* complain_on_overflow */
1230
         bfd_elf_generic_reloc, /* special_function */
1231
         "R_SH_64_PCREL",       /* name */
1232
         FALSE,                 /* partial_inplace */
1233
         0,                      /* src_mask */
1234
         ((bfd_vma) 0) - 1,      /* dst_mask */
1235
         TRUE),                 /* pcrel_offset */
1236
 
1237
};
1238
 
1239
/* This function is used for relocs which are only used for relaxing,
1240
   which the linker should otherwise ignore.  */
1241
 
1242
static bfd_reloc_status_type
1243
sh_elf64_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1244
                       asymbol *symbol ATTRIBUTE_UNUSED,
1245
                       void *data ATTRIBUTE_UNUSED, asection *input_section,
1246
                       bfd *output_bfd,
1247
                       char **error_message ATTRIBUTE_UNUSED)
1248
{
1249
  if (output_bfd != NULL)
1250
    reloc_entry->address += input_section->output_offset;
1251
  return bfd_reloc_ok;
1252
}
1253
 
1254
/* This function is used for normal relocs.  This used to be like the COFF
1255
   function, and is almost certainly incorrect for other ELF targets.
1256
 
1257
   See sh_elf_reloc in elf32-sh.c for the original.  */
1258
 
1259
static bfd_reloc_status_type
1260
sh_elf64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in,
1261
                void *data, asection *input_section, bfd *output_bfd,
1262
                char **error_message ATTRIBUTE_UNUSED)
1263
{
1264
  unsigned long insn;
1265
  bfd_vma sym_value;
1266
  enum elf_sh_reloc_type r_type;
1267
  bfd_vma addr = reloc_entry->address;
1268
  bfd_byte *hit_data = addr + (bfd_byte *) data;
1269
 
1270
  r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
1271
 
1272
  if (output_bfd != NULL)
1273
    {
1274
      /* Partial linking--do nothing.  */
1275
      reloc_entry->address += input_section->output_offset;
1276
      return bfd_reloc_ok;
1277
    }
1278
 
1279
  if (symbol_in != NULL
1280
      && bfd_is_und_section (symbol_in->section))
1281
    return bfd_reloc_undefined;
1282
 
1283
  if (bfd_is_com_section (symbol_in->section))
1284
    sym_value = 0;
1285
  else
1286
    sym_value = (symbol_in->value +
1287
                 symbol_in->section->output_section->vma +
1288
                 symbol_in->section->output_offset);
1289
 
1290
  switch (r_type)
1291
    {
1292
    case R_SH_DIR32:
1293
      insn = bfd_get_32 (abfd, hit_data);
1294
      insn += sym_value + reloc_entry->addend;
1295
      bfd_put_32 (abfd, insn, hit_data);
1296
      break;
1297
 
1298
    default:
1299
      abort ();
1300
      break;
1301
    }
1302
 
1303
  return bfd_reloc_ok;
1304
}
1305
 
1306
/* This structure is used to map BFD reloc codes to SH ELF relocs.  */
1307
 
1308
struct elf_reloc_map
1309
{
1310
  bfd_reloc_code_real_type bfd_reloc_val;
1311
  unsigned char elf_reloc_val;
1312
};
1313
 
1314
/* An array mapping BFD reloc codes to SH ELF relocs.  */
1315
 
1316
static const struct elf_reloc_map sh64_reloc_map[] =
1317
{
1318
  { BFD_RELOC_NONE, R_SH_NONE },
1319
  { BFD_RELOC_32, R_SH_DIR32 },
1320
  { BFD_RELOC_CTOR, R_SH_DIR32 },
1321
  { BFD_RELOC_32_PCREL, R_SH_REL32 },
1322
  { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
1323
  { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
1324
  { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
1325
  { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
1326
  { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
1327
  { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 },
1328
  { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 },
1329
  { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 },
1330
  { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 },
1331
  { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 },
1332
  { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 },
1333
  { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 },
1334
  { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 },
1335
  { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 },
1336
  { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 },
1337
  { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 },
1338
  { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 },
1339
  { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 },
1340
  { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 },
1341
  { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 },
1342
  { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 },
1343
  { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 },
1344
  { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 },
1345
  { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 },
1346
  { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 },
1347
  { BFD_RELOC_SH_COPY64, R_SH_COPY64 },
1348
  { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 },
1349
  { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 },
1350
  { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 },
1351
  { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 },
1352
  { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 },
1353
  { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 },
1354
  { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 },
1355
  { BFD_RELOC_SH_PT_16, R_SH_PT_16 },
1356
  { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE },
1357
  { BFD_RELOC_SH_IMMU5, R_SH_DIR5U },
1358
  { BFD_RELOC_SH_IMMS6, R_SH_DIR6S },
1359
  { BFD_RELOC_SH_IMMU6, R_SH_DIR6U },
1360
  { BFD_RELOC_SH_IMMS10, R_SH_DIR10S },
1361
  { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW },
1362
  { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL },
1363
  { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ },
1364
  { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 },
1365
  { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 },
1366
  { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 },
1367
  { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL },
1368
  { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 },
1369
  { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL },
1370
  { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 },
1371
  { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL },
1372
  { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 },
1373
  { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL },
1374
  { BFD_RELOC_64, R_SH_64 },
1375
  { BFD_RELOC_64_PCREL, R_SH_64_PCREL },
1376
};
1377
 
1378
/* Given a BFD reloc code, return the howto structure for the
1379
   corresponding SH ELf reloc.  */
1380
 
1381
static reloc_howto_type *
1382
sh_elf64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1383
                            bfd_reloc_code_real_type code)
1384
{
1385
  unsigned int i;
1386
 
1387
  for (i = 0; i < sizeof (sh64_reloc_map) / sizeof (struct elf_reloc_map); i++)
1388
    {
1389
      if (sh64_reloc_map[i].bfd_reloc_val == code)
1390
        return &sh_elf64_howto_table[(int) sh64_reloc_map[i].elf_reloc_val];
1391
    }
1392
 
1393
  return NULL;
1394
}
1395
 
1396
static reloc_howto_type *
1397
sh_elf64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1398
                            const char *r_name)
1399
{
1400
  unsigned int i;
1401
 
1402
  for (i = 0;
1403
       i < sizeof (sh_elf64_howto_table) / sizeof (sh_elf64_howto_table[0]);
1404
       i++)
1405
    if (sh_elf64_howto_table[i].name != NULL
1406
        && strcasecmp (sh_elf64_howto_table[i].name, r_name) == 0)
1407
      return &sh_elf64_howto_table[i];
1408
 
1409
  return NULL;
1410
}
1411
 
1412
/* Given an ELF reloc, fill in the howto field of a relent.
1413
 
1414
   See sh_elf_info_to_howto in elf32-sh.c for the original.  */
1415
 
1416
static void
1417
sh_elf64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
1418
                        Elf_Internal_Rela *dst)
1419
{
1420
  unsigned int r;
1421
 
1422
  r = ELF64_R_TYPE (dst->r_info);
1423
 
1424
  BFD_ASSERT (r <= (unsigned int) R_SH_64_PCREL);
1425
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
1426
  BFD_ASSERT (r < R_SH_DIR8WPN || r > R_SH_LAST_INVALID_RELOC_2);
1427
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_GOTPLT32);
1428
  BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4);
1429
 
1430
  cache_ptr->howto = &sh_elf64_howto_table[r];
1431
}
1432
 
1433
/* Relocate an SH ELF section.
1434
 
1435
   See sh_elf_info_to_howto in elf32-sh.c for the original.  */
1436
 
1437
static bfd_boolean
1438
sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1439
                           struct bfd_link_info *info, bfd *input_bfd,
1440
                           asection *input_section, bfd_byte *contents,
1441
                           Elf_Internal_Rela *relocs,
1442
                           Elf_Internal_Sym *local_syms,
1443
                           asection **local_sections)
1444
{
1445
  Elf_Internal_Shdr *symtab_hdr;
1446
  struct elf_link_hash_entry **sym_hashes;
1447
  Elf_Internal_Rela *rel, *relend;
1448
  bfd *dynobj;
1449
  bfd_vma *local_got_offsets;
1450
  asection *sgot;
1451
  asection *sgotplt;
1452
  asection *splt;
1453
  asection *sreloc;
1454
  bfd_vma disp, dropped;
1455
 
1456
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1457
  sym_hashes = elf_sym_hashes (input_bfd);
1458
  dynobj = elf_hash_table (info)->dynobj;
1459
  local_got_offsets = elf_local_got_offsets (input_bfd);
1460
 
1461
  sgot = NULL;
1462
  sgotplt = NULL;
1463
  splt = NULL;
1464
  sreloc = NULL;
1465
 
1466
  rel = relocs;
1467
  relend = relocs + input_section->reloc_count;
1468
  for (; rel < relend; rel++)
1469
    {
1470
      int r_type;
1471
      reloc_howto_type *howto;
1472
      unsigned long r_symndx;
1473
      Elf_Internal_Sym *sym;
1474
      asection *sec;
1475
      struct elf_link_hash_entry *h;
1476
      bfd_vma relocation;
1477
      bfd_vma addend = (bfd_vma)0;
1478
      bfd_reloc_status_type r;
1479
      int seen_stt_datalabel = 0;
1480
 
1481
      r_symndx = ELF64_R_SYM (rel->r_info);
1482
 
1483
      r_type = ELF64_R_TYPE (rel->r_info);
1484
 
1485
      if (r_type == (int) R_SH_NONE)
1486
        continue;
1487
 
1488
      if (r_type < 0
1489
          || r_type > R_SH_64_PCREL
1490
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
1491
              && r_type <= (int) R_SH_LAST_INVALID_RELOC)
1492
          || (r_type >= (int) R_SH_DIR8WPN
1493
              && r_type <= (int) R_SH_LAST_INVALID_RELOC)
1494
          || (r_type >= (int) R_SH_GNU_VTINHERIT
1495
              && r_type <= (int) R_SH_PSHL)
1496
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
1497
              && r_type <= R_SH_GOTPLT32)
1498
          || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
1499
              && r_type <= (int) R_SH_LAST_INVALID_RELOC_4))
1500
        {
1501
          bfd_set_error (bfd_error_bad_value);
1502
          return FALSE;
1503
        }
1504
 
1505
      howto = sh_elf64_howto_table + r_type;
1506
 
1507
      h = NULL;
1508
      sym = NULL;
1509
      sec = NULL;
1510
      relocation = 0;
1511
      if (r_symndx < symtab_hdr->sh_info)
1512
        {
1513
          sym = local_syms + r_symndx;
1514
          sec = local_sections[r_symndx];
1515
          relocation = ((sec->output_section->vma
1516
                         + sec->output_offset
1517
                         + sym->st_value)
1518
                        | ((sym->st_other & STO_SH5_ISA32) != 0));
1519
 
1520
          /* A local symbol never has STO_SH5_ISA32, so we don't need
1521
             datalabel processing here.  Make sure this does not change
1522
             without notice.  */
1523
          if ((sym->st_other & STO_SH5_ISA32) != 0)
1524
            ((*info->callbacks->reloc_dangerous)
1525
             (info,
1526
              _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
1527
              input_bfd, input_section, rel->r_offset));
1528
 
1529
          if (sec != NULL && elf_discarded_section (sec))
1530
            /* Handled below.  */
1531
            ;
1532
          else if (info->relocatable)
1533
            {
1534
              /* This is a relocatable link.  We don't have to change
1535
                 anything, unless the reloc is against a section symbol,
1536
                 in which case we have to adjust according to where the
1537
                 section symbol winds up in the output section.  */
1538
              if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1539
                goto final_link_relocate;
1540
 
1541
              continue;
1542
            }
1543
          else if (! howto->partial_inplace)
1544
            {
1545
              relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1546
              relocation |= ((sym->st_other & STO_SH5_ISA32) != 0);
1547
            }
1548
          else if ((sec->flags & SEC_MERGE)
1549
                   && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1550
            {
1551
              asection *msec;
1552
 
1553
              if (howto->rightshift || howto->src_mask != 0xffffffff)
1554
                {
1555
                  (*_bfd_error_handler)
1556
                    (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
1557
                     input_bfd, input_section,
1558
                     (long) rel->r_offset, howto->name);
1559
                  return FALSE;
1560
                }
1561
 
1562
              addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
1563
              msec = sec;
1564
              addend =
1565
                _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
1566
                - relocation;
1567
              addend += msec->output_section->vma + msec->output_offset;
1568
              bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
1569
              addend = 0;
1570
            }
1571
        }
1572
      else
1573
        {
1574
          /* ??? Could we use the RELOC_FOR_GLOBAL_SYMBOL macro here ?  */
1575
 
1576
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1577
          while (h->root.type == bfd_link_hash_indirect
1578
                 || h->root.type == bfd_link_hash_warning)
1579
            {
1580
              /* If the reference passes a symbol marked with
1581
                 STT_DATALABEL, then any STO_SH5_ISA32 on the final value
1582
                 doesn't count.  */
1583
              seen_stt_datalabel |= h->type == STT_DATALABEL;
1584
              h = (struct elf_link_hash_entry *) h->root.u.i.link;
1585
            }
1586
 
1587
          if (h->root.type == bfd_link_hash_defined
1588
              || h->root.type == bfd_link_hash_defweak)
1589
            {
1590
              sec = h->root.u.def.section;
1591
              /* In these cases, we don't need the relocation value.
1592
                 We check specially because in some obscure cases
1593
                 sec->output_section will be NULL.  */
1594
              if (r_type == R_SH_GOTPC_LOW16
1595
                  || r_type == R_SH_GOTPC_MEDLOW16
1596
                  || r_type == R_SH_GOTPC_MEDHI16
1597
                  || r_type == R_SH_GOTPC_HI16
1598
                  || ((r_type == R_SH_PLT_LOW16
1599
                       || r_type == R_SH_PLT_MEDLOW16
1600
                       || r_type == R_SH_PLT_MEDHI16
1601
                       || r_type == R_SH_PLT_HI16)
1602
                      && h->plt.offset != (bfd_vma) -1)
1603
                  || ((r_type == R_SH_GOT_LOW16
1604
                       || r_type == R_SH_GOT_MEDLOW16
1605
                       || r_type == R_SH_GOT_MEDHI16
1606
                       || r_type == R_SH_GOT_HI16)
1607
                      && elf_hash_table (info)->dynamic_sections_created
1608
                      && (! info->shared
1609
                          || (! info->symbolic && h->dynindx != -1)
1610
                          || !h->def_regular))
1611
                  /* The cases above are those in which relocation is
1612
                     overwritten in the switch block below.  The cases
1613
                     below are those in which we must defer relocation
1614
                     to run-time, because we can't resolve absolute
1615
                     addresses when creating a shared library.  */
1616
                  || (info->shared
1617
                      && ((! info->symbolic && h->dynindx != -1)
1618
                          || !h->def_regular)
1619
                      && ((r_type == R_SH_64
1620
                           && !(ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
1621
                                || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN))
1622
                          || r_type == R_SH_64_PCREL)
1623
                      && ((input_section->flags & SEC_ALLOC) != 0
1624
                          /* DWARF will emit R_SH_DIR32 relocations in its
1625
                             sections against symbols defined externally
1626
                             in shared libraries.  We can't do anything
1627
                             with them here.  */
1628
                          || (input_section->flags & SEC_DEBUGGING) != 0))
1629
                  /* Dynamic relocs are not propagated for SEC_DEBUGGING
1630
                     sections because such sections are not SEC_ALLOC and
1631
                     thus ld.so will not process them.  */
1632
                  || (sec->output_section == NULL
1633
                      && ((input_section->flags & SEC_DEBUGGING) != 0
1634
                          && h->def_dynamic)))
1635
                ;
1636
              else if (sec->output_section != NULL)
1637
                relocation = ((h->root.u.def.value
1638
                               + sec->output_section->vma
1639
                               + sec->output_offset)
1640
                              /* A STO_SH5_ISA32 causes a "bitor 1" to the
1641
                                 symbol value, unless we've seen
1642
                                 STT_DATALABEL on the way to it.  */
1643
                              | ((h->other & STO_SH5_ISA32) != 0
1644
                                 && ! seen_stt_datalabel));
1645
              else if (!info->relocatable)
1646
                {
1647
                  (*_bfd_error_handler)
1648
                    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
1649
                     input_bfd,
1650
                     input_section,
1651
                     (long) rel->r_offset,
1652
                     howto->name,
1653
                     h->root.root.string);
1654
                }
1655
            }
1656
          else if (h->root.type == bfd_link_hash_undefweak)
1657
            ;
1658
          else if (info->unresolved_syms_in_objects == RM_IGNORE
1659
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1660
            ;
1661
          else if (!info->relocatable)
1662
            {
1663
              if (! ((*info->callbacks->undefined_symbol)
1664
                     (info, h->root.root.string, input_bfd,
1665
                      input_section, rel->r_offset,
1666
                      (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1667
                       || ELF_ST_VISIBILITY (h->other)))))
1668
                return FALSE;
1669
            }
1670
        }
1671
 
1672
      if (sec != NULL && elf_discarded_section (sec))
1673
        {
1674
          /* For relocs against symbols from removed linkonce sections,
1675
             or sections discarded by a linker script, we just want the
1676
             section contents zeroed.  Avoid any special processing.  */
1677
          _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1678
          rel->r_info = 0;
1679
          rel->r_addend = 0;
1680
          continue;
1681
        }
1682
 
1683
      if (info->relocatable)
1684
        continue;
1685
 
1686
      disp = (relocation
1687
              - input_section->output_section->vma
1688
              - input_section->output_offset
1689
              - rel->r_offset);
1690
      dropped = 0;
1691
      switch ((int)r_type)
1692
        {
1693
        case R_SH_PT_16:     dropped = disp & 2; break;
1694
        case R_SH_DIR10SW: dropped = disp & 1; break;
1695
        case R_SH_DIR10SL: dropped = disp & 3; break;
1696
        case R_SH_DIR10SQ: dropped = disp & 7; break;
1697
        }
1698
      if (dropped != 0)
1699
        {
1700
          (*_bfd_error_handler)
1701
            (_("%s: error: unaligned relocation type %d at %08x reloc %08x\n"),
1702
             bfd_get_filename (input_bfd), (int)r_type, (unsigned)rel->r_offset, (unsigned)relocation);
1703
          bfd_set_error (bfd_error_bad_value);
1704
          return FALSE;
1705
        }
1706
      switch ((int)r_type)
1707
        {
1708
        case R_SH_64:
1709
        case R_SH_64_PCREL:
1710
          if (info->shared
1711
              && (input_section->flags & SEC_ALLOC) != 0
1712
              && (r_type != R_SH_64_PCREL
1713
                  || (h != NULL
1714
                      && h->dynindx != -1
1715
                      && (! info->symbolic
1716
                          || !h->def_regular))))
1717
            {
1718
              Elf_Internal_Rela outrel;
1719
              bfd_byte *loc;
1720
              bfd_boolean skip, relocate;
1721
 
1722
              /* When generating a shared object, these relocations
1723
                 are copied into the output file to be resolved at run
1724
                 time.  */
1725
 
1726
              if (sreloc == NULL)
1727
                {
1728
                  const char *name;
1729
 
1730
                  name = (bfd_elf_string_from_elf_section
1731
                          (input_bfd,
1732
                           elf_elfheader (input_bfd)->e_shstrndx,
1733
                           elf_section_data (input_section)->rel_hdr.sh_name));
1734
                  if (name == NULL)
1735
                    return FALSE;
1736
 
1737
                  BFD_ASSERT (CONST_STRNEQ (name, ".rela")
1738
                              && strcmp (bfd_get_section_name (input_bfd,
1739
                                                               input_section),
1740
                                         name + 5) == 0);
1741
 
1742
                  sreloc = bfd_get_section_by_name (dynobj, name);
1743
                  BFD_ASSERT (sreloc != NULL);
1744
                }
1745
 
1746
              skip = FALSE;
1747
              relocate = FALSE;
1748
 
1749
              outrel.r_offset
1750
                = _bfd_elf_section_offset (output_bfd, info,
1751
                                           input_section, rel->r_offset);
1752
 
1753
              if (outrel.r_offset == (bfd_vma) -1)
1754
                skip = TRUE;
1755
              else if (outrel.r_offset == (bfd_vma) -2)
1756
                skip = TRUE, relocate = TRUE;
1757
 
1758
              outrel.r_offset += (input_section->output_section->vma
1759
                                  + input_section->output_offset);
1760
 
1761
              if (skip)
1762
                memset (&outrel, 0, sizeof outrel);
1763
              else if (r_type == R_SH_64_PCREL)
1764
                {
1765
                  BFD_ASSERT (h != NULL && h->dynindx != -1);
1766
                  outrel.r_info = ELF64_R_INFO (h->dynindx, R_SH_64_PCREL);
1767
                  outrel.r_addend = rel->r_addend;
1768
                }
1769
              else
1770
                {
1771
                  /* h->dynindx may be -1 if this symbol was marked to
1772
                     become local.  */
1773
                  if (h == NULL
1774
                      || ((info->symbolic || h->dynindx == -1)
1775
                          && h->def_regular))
1776
                    {
1777
                      relocate = TRUE;
1778
                      outrel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64);
1779
                      outrel.r_addend = relocation + rel->r_addend;
1780
                    }
1781
                  else
1782
                    {
1783
                      BFD_ASSERT (h->dynindx != -1);
1784
                      outrel.r_info = ELF64_R_INFO (h->dynindx, R_SH_64);
1785
                      outrel.r_addend = relocation + rel->r_addend;
1786
                    }
1787
                }
1788
 
1789
              loc = sreloc->contents;
1790
              loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
1791
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1792
 
1793
              /* If this reloc is against an external symbol, we do
1794
                 not want to fiddle with the addend.  Otherwise, we
1795
                 need to include the symbol value so that it becomes
1796
                 an addend for the dynamic reloc.  */
1797
              if (! relocate)
1798
                continue;
1799
            }
1800
          else if (r_type == R_SH_64)
1801
            addend = rel->r_addend;
1802
          goto final_link_relocate;
1803
 
1804
        case R_SH_GOTPLT_LOW16:
1805
        case R_SH_GOTPLT_MEDLOW16:
1806
        case R_SH_GOTPLT_MEDHI16:
1807
        case R_SH_GOTPLT_HI16:
1808
        case R_SH_GOTPLT10BY4:
1809
        case R_SH_GOTPLT10BY8:
1810
          /* Relocation is to the entry for this symbol in the
1811
             procedure linkage table.  */
1812
 
1813
          if (h == NULL
1814
              || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
1815
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
1816
              || ! info->shared
1817
              || info->symbolic
1818
              || h->dynindx == -1
1819
              || h->plt.offset == (bfd_vma) -1
1820
              || h->got.offset != (bfd_vma) -1)
1821
            goto force_got;
1822
 
1823
          /* Relocation is to the entry for this symbol in the global
1824
             offset table extension for the procedure linkage table.  */
1825
          if (sgotplt == NULL)
1826
            {
1827
              sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1828
              BFD_ASSERT (sgotplt != NULL);
1829
            }
1830
 
1831
          relocation = (sgotplt->output_offset
1832
                        + ((h->plt.offset / elf_sh64_sizeof_plt (info)
1833
                            - 1 + 3) * 8));
1834
 
1835
          relocation -= GOT_BIAS;
1836
 
1837
          goto final_link_relocate;
1838
 
1839
        force_got:
1840
        case R_SH_GOT_LOW16:
1841
        case R_SH_GOT_MEDLOW16:
1842
        case R_SH_GOT_MEDHI16:
1843
        case R_SH_GOT_HI16:
1844
        case R_SH_GOT10BY4:
1845
        case R_SH_GOT10BY8:
1846
          /* Relocation is to the entry for this symbol in the global
1847
             offset table.  */
1848
          if (sgot == NULL)
1849
            {
1850
              sgot = bfd_get_section_by_name (dynobj, ".got");
1851
              BFD_ASSERT (sgot != NULL);
1852
            }
1853
 
1854
          if (h != NULL)
1855
            {
1856
              bfd_vma off;
1857
 
1858
              off = h->got.offset;
1859
              if (seen_stt_datalabel)
1860
                {
1861
                  struct elf_sh64_link_hash_entry *hsh;
1862
 
1863
                  hsh = (struct elf_sh64_link_hash_entry *)h;
1864
                  off = hsh->datalabel_got_offset;
1865
                }
1866
              BFD_ASSERT (off != (bfd_vma) -1);
1867
 
1868
              if (! elf_hash_table (info)->dynamic_sections_created
1869
                  || (info->shared
1870
                      && (info->symbolic || h->dynindx == -1
1871
                          || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
1872
                          || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
1873
                      && h->def_regular))
1874
                {
1875
                  /* This is actually a static link, or it is a
1876
                     -Bsymbolic link and the symbol is defined
1877
                     locally, or the symbol was forced to be local
1878
                     because of a version file.  We must initialize
1879
                     this entry in the global offset table.  Since the
1880
                     offset must always be a multiple of 4, we use the
1881
                     least significant bit to record whether we have
1882
                     initialized it already.
1883
 
1884
                     When doing a dynamic link, we create a .rela.got
1885
                     relocation entry to initialize the value.  This
1886
                     is done in the finish_dynamic_symbol routine.  */
1887
                  if ((off & 1) != 0)
1888
                    off &= ~1;
1889
                  else
1890
                    {
1891
                      bfd_put_64 (output_bfd, relocation,
1892
                                  sgot->contents + off);
1893
                      if (seen_stt_datalabel)
1894
                        {
1895
                          struct elf_sh64_link_hash_entry *hsh;
1896
 
1897
                          hsh = (struct elf_sh64_link_hash_entry *)h;
1898
                          hsh->datalabel_got_offset |= 1;
1899
                        }
1900
                      else
1901
                        h->got.offset |= 1;
1902
                    }
1903
                }
1904
 
1905
              relocation = sgot->output_offset + off;
1906
            }
1907
          else
1908
            {
1909
              bfd_vma off;
1910
 
1911
              if (rel->r_addend)
1912
                {
1913
                  BFD_ASSERT (local_got_offsets != NULL
1914
                              && (local_got_offsets[symtab_hdr->sh_info
1915
                                                    + r_symndx]
1916
                                  != (bfd_vma) -1));
1917
 
1918
                  off = local_got_offsets[symtab_hdr->sh_info
1919
                                          + r_symndx];
1920
                }
1921
              else
1922
                {
1923
                  BFD_ASSERT (local_got_offsets != NULL
1924
                              && local_got_offsets[r_symndx] != (bfd_vma) -1);
1925
 
1926
                  off = local_got_offsets[r_symndx];
1927
                }
1928
 
1929
              /* The offset must always be a multiple of 8.  We use
1930
                 the least significant bit to record whether we have
1931
                 already generated the necessary reloc.  */
1932
              if ((off & 1) != 0)
1933
                off &= ~1;
1934
              else
1935
                {
1936
                  bfd_put_64 (output_bfd, relocation, sgot->contents + off);
1937
 
1938
                  if (info->shared)
1939
                    {
1940
                      asection *s;
1941
                      Elf_Internal_Rela outrel;
1942
                      bfd_byte *loc;
1943
 
1944
                      s = bfd_get_section_by_name (dynobj, ".rela.got");
1945
                      BFD_ASSERT (s != NULL);
1946
 
1947
                      outrel.r_offset = (sgot->output_section->vma
1948
                                         + sgot->output_offset
1949
                                         + off);
1950
                      outrel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64);
1951
                      outrel.r_addend = relocation;
1952
                      loc = s->contents;
1953
                      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
1954
                      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
1955
                    }
1956
 
1957
                  if (rel->r_addend)
1958
                    local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1;
1959
                  else
1960
                    local_got_offsets[r_symndx] |= 1;
1961
                }
1962
 
1963
              relocation = sgot->output_offset + off;
1964
            }
1965
 
1966
          relocation -= GOT_BIAS;
1967
 
1968
          goto final_link_relocate;
1969
 
1970
        case R_SH_GOTOFF_LOW16:
1971
        case R_SH_GOTOFF_MEDLOW16:
1972
        case R_SH_GOTOFF_MEDHI16:
1973
        case R_SH_GOTOFF_HI16:
1974
          /* Relocation is relative to the start of the global offset
1975
             table.  */
1976
 
1977
          if (sgot == NULL)
1978
            {
1979
              sgot = bfd_get_section_by_name (dynobj, ".got");
1980
              BFD_ASSERT (sgot != NULL);
1981
            }
1982
 
1983
          /* Note that sgot->output_offset is not involved in this
1984
             calculation.  We always want the start of .got.  If we
1985
             defined _GLOBAL_OFFSET_TABLE in a different way, as is
1986
             permitted by the ABI, we might have to change this
1987
             calculation.  */
1988
          relocation -= sgot->output_section->vma;
1989
 
1990
          relocation -= GOT_BIAS;
1991
 
1992
          addend = rel->r_addend;
1993
 
1994
          goto final_link_relocate;
1995
 
1996
        case R_SH_GOTPC_LOW16:
1997
        case R_SH_GOTPC_MEDLOW16:
1998
        case R_SH_GOTPC_MEDHI16:
1999
        case R_SH_GOTPC_HI16:
2000
          /* Use global offset table as symbol value.  */
2001
 
2002
          if (sgot == NULL)
2003
            {
2004
              sgot = bfd_get_section_by_name (dynobj, ".got");
2005
              BFD_ASSERT (sgot != NULL);
2006
            }
2007
 
2008
          relocation = sgot->output_section->vma;
2009
 
2010
          relocation += GOT_BIAS;
2011
 
2012
          addend = rel->r_addend;
2013
 
2014
          goto final_link_relocate;
2015
 
2016
        case R_SH_PLT_LOW16:
2017
        case R_SH_PLT_MEDLOW16:
2018
        case R_SH_PLT_MEDHI16:
2019
        case R_SH_PLT_HI16:
2020
          /* Relocation is to the entry for this symbol in the
2021
             procedure linkage table.  */
2022
 
2023
          /* Resolve a PLT reloc against a local symbol directly,
2024
             without using the procedure linkage table.  */
2025
          if (h == NULL)
2026
            goto final_link_relocate;
2027
 
2028
          if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2029
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
2030
            goto final_link_relocate;
2031
 
2032
          if (h->plt.offset == (bfd_vma) -1)
2033
            {
2034
              /* We didn't make a PLT entry for this symbol.  This
2035
                 happens when statically linking PIC code, or when
2036
                 using -Bsymbolic.  */
2037
              goto final_link_relocate;
2038
            }
2039
 
2040
          if (splt == NULL)
2041
            {
2042
              splt = bfd_get_section_by_name (dynobj, ".plt");
2043
              BFD_ASSERT (splt != NULL);
2044
            }
2045
 
2046
          relocation = (splt->output_section->vma
2047
                        + splt->output_offset
2048
                        + h->plt.offset);
2049
          relocation++;
2050
 
2051
          addend = rel->r_addend;
2052
 
2053
          goto final_link_relocate;
2054
 
2055
        case R_SH_DIR32:
2056
        case R_SH_SHMEDIA_CODE:
2057
        case R_SH_PT_16:
2058
        case R_SH_DIR5U:
2059
        case R_SH_DIR6S:
2060
        case R_SH_DIR6U:
2061
        case R_SH_DIR10S:
2062
        case R_SH_DIR10SW:
2063
        case R_SH_DIR10SL:
2064
        case R_SH_DIR10SQ:
2065
        case R_SH_IMMS16:
2066
        case R_SH_IMMU16:
2067
        case R_SH_IMM_LOW16:
2068
        case R_SH_IMM_LOW16_PCREL:
2069
        case R_SH_IMM_MEDLOW16:
2070
        case R_SH_IMM_MEDLOW16_PCREL:
2071
        case R_SH_IMM_MEDHI16:
2072
        case R_SH_IMM_MEDHI16_PCREL:
2073
        case R_SH_IMM_HI16:
2074
        case R_SH_IMM_HI16_PCREL:
2075
          addend = rel->r_addend;
2076
          /* Fall through.  */
2077
        case R_SH_REL32:
2078
        final_link_relocate:
2079
          r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2080
                                        contents, rel->r_offset,
2081
                                        relocation, addend);
2082
          break;
2083
 
2084
        default:
2085
          bfd_set_error (bfd_error_bad_value);
2086
          return FALSE;
2087
 
2088
        }
2089
 
2090
      if (r != bfd_reloc_ok)
2091
        {
2092
          switch (r)
2093
            {
2094
            default:
2095
            case bfd_reloc_outofrange:
2096
              abort ();
2097
            case bfd_reloc_overflow:
2098
              {
2099
                const char *name;
2100
 
2101
                if (h != NULL)
2102
                  name = NULL;
2103
                else
2104
                  {
2105
                    name = (bfd_elf_string_from_elf_section
2106
                            (input_bfd, symtab_hdr->sh_link, sym->st_name));
2107
                    if (name == NULL)
2108
                      return FALSE;
2109
                    if (*name == '\0')
2110
                      name = bfd_section_name (input_bfd, sec);
2111
                  }
2112
                if (! ((*info->callbacks->reloc_overflow)
2113
                       (info, (h ? &h->root : NULL), name, howto->name,
2114
                        (bfd_vma) 0, input_bfd, input_section,
2115
                        rel->r_offset)))
2116
                  return FALSE;
2117
              }
2118
              break;
2119
            }
2120
        }
2121
    }
2122
 
2123
  return TRUE;
2124
}
2125
 
2126
/* This is a version of bfd_generic_get_relocated_section_contents
2127
   that uses sh_elf64_relocate_section.
2128
 
2129
   See sh_elf_relocate_section in elf32-sh.c for the original.  */
2130
 
2131
static bfd_byte *
2132
sh_elf64_get_relocated_section_contents (bfd *output_bfd,
2133
                                         struct bfd_link_info *link_info,
2134
                                         struct bfd_link_order *link_order,
2135
                                         bfd_byte *data,
2136
                                         bfd_boolean relocatable,
2137
                                         asymbol **symbols)
2138
{
2139
  Elf_Internal_Shdr *symtab_hdr;
2140
  asection *input_section = link_order->u.indirect.section;
2141
  bfd *input_bfd = input_section->owner;
2142
  asection **sections = NULL;
2143
  Elf_Internal_Rela *internal_relocs = NULL;
2144
  Elf_Internal_Sym *isymbuf = NULL;
2145
 
2146
  /* We only need to handle the case of relaxing, or of having a
2147
     particular set of section contents, specially.  */
2148
  if (relocatable
2149
      || elf_section_data (input_section)->this_hdr.contents == NULL)
2150
    return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
2151
                                                       link_order, data,
2152
                                                       relocatable,
2153
                                                       symbols);
2154
 
2155
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2156
 
2157
  memcpy (data, elf_section_data (input_section)->this_hdr.contents,
2158
          input_section->size);
2159
 
2160
  if ((input_section->flags & SEC_RELOC) != 0
2161
      && input_section->reloc_count > 0)
2162
    {
2163
      Elf_Internal_Sym *isymp;
2164
      Elf_Internal_Sym *isymend;
2165
      asection **secpp;
2166
 
2167
      /* Read this BFD's local symbols.  */
2168
      if (symtab_hdr->sh_info != 0)
2169
        {
2170
          isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2171
          if (isymbuf == NULL)
2172
            isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2173
                                            symtab_hdr->sh_info, 0,
2174
                                            NULL, NULL, NULL);
2175
          if (isymbuf == NULL)
2176
            goto error_return;
2177
        }
2178
 
2179
      internal_relocs = (_bfd_elf_link_read_relocs
2180
                         (input_bfd, input_section, NULL,
2181
                          (Elf_Internal_Rela *) NULL, FALSE));
2182
      if (internal_relocs == NULL)
2183
        goto error_return;
2184
 
2185
      sections = (asection **) bfd_malloc (symtab_hdr->sh_info
2186
                                           * sizeof (asection *));
2187
      if (sections == NULL && symtab_hdr->sh_info > 0)
2188
        goto error_return;
2189
 
2190
      secpp = sections;
2191
      isymend = isymbuf + symtab_hdr->sh_info;
2192
      for (isymp = isymbuf; isymp < isymend; ++isymp, ++secpp)
2193
        {
2194
          asection *isec;
2195
 
2196
          if (isymp->st_shndx == SHN_UNDEF)
2197
            isec = bfd_und_section_ptr;
2198
          else if (isymp->st_shndx > 0 && isymp->st_shndx < SHN_LORESERVE)
2199
            isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx);
2200
          else if (isymp->st_shndx == SHN_ABS)
2201
            isec = bfd_abs_section_ptr;
2202
          else if (isymp->st_shndx == SHN_COMMON)
2203
            isec = bfd_com_section_ptr;
2204
          else
2205
            {
2206
              /* Who knows?  */
2207
              isec = NULL;
2208
            }
2209
 
2210
          *secpp = isec;
2211
        }
2212
 
2213
      if (! sh_elf64_relocate_section (output_bfd, link_info, input_bfd,
2214
                                       input_section, data, internal_relocs,
2215
                                       isymbuf, sections))
2216
        goto error_return;
2217
 
2218
      if (sections != NULL)
2219
        free (sections);
2220
      if (internal_relocs != elf_section_data (input_section)->relocs)
2221
        free (internal_relocs);
2222
      if (isymbuf != NULL
2223
          && (unsigned char *) isymbuf != symtab_hdr->contents)
2224
        free (isymbuf);
2225
    }
2226
 
2227
  return data;
2228
 
2229
 error_return:
2230
  if (sections != NULL)
2231
    free (sections);
2232
  if (internal_relocs != NULL
2233
      && internal_relocs != elf_section_data (input_section)->relocs)
2234
    free (internal_relocs);
2235
  if (isymbuf != NULL
2236
      && (unsigned char *) isymbuf != symtab_hdr->contents)
2237
    free (isymbuf);
2238
  return NULL;
2239
}
2240
 
2241
/* Set the SHF_SH5_ISA32 flag for ISA SHmedia code sections.  */
2242
 
2243
static bfd_boolean
2244
sh64_elf64_fake_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2245
                          Elf_Internal_Shdr *elf_section_hdr,
2246
                          asection *asect)
2247
{
2248
  /* Code sections can only contain SH64 code, so mark them as such.  */
2249
  if (bfd_get_section_flags (output_bfd, asect) & SEC_CODE)
2250
    elf_section_hdr->sh_flags |= SHF_SH5_ISA32;
2251
 
2252
  return TRUE;
2253
}
2254
 
2255
static bfd_boolean
2256
sh_elf64_set_mach_from_flags (bfd *abfd)
2257
{
2258
  flagword flags = elf_elfheader (abfd)->e_flags;
2259
 
2260
  switch (flags & EF_SH_MACH_MASK)
2261
    {
2262
    case EF_SH5:
2263
      /* Just one, but keep the switch construct to make additions easy.  */
2264
      bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh5);
2265
      break;
2266
 
2267
    default:
2268
      bfd_set_error (bfd_error_wrong_format);
2269
      return FALSE;
2270
    }
2271
  return TRUE;
2272
}
2273
 
2274
/* Function to keep SH64 specific file flags.
2275
 
2276
   See sh64_elf_set_private_flags in elf32-sh64.c for the original.  */
2277
 
2278
static bfd_boolean
2279
sh_elf64_set_private_flags (bfd *abfd, flagword flags)
2280
{
2281
  BFD_ASSERT (! elf_flags_init (abfd)
2282
              || elf_elfheader (abfd)->e_flags == flags);
2283
 
2284
  elf_elfheader (abfd)->e_flags = flags;
2285
  elf_flags_init (abfd) = TRUE;
2286
  return sh_elf64_set_mach_from_flags (abfd);
2287
}
2288
 
2289
/* Copy the SHF_SH5_ISA32 attribute that we keep on all sections with
2290
   code, to keep attributes the same as for SHmedia in 32-bit ELF.  */
2291
 
2292
static bfd_boolean
2293
sh_elf64_copy_private_data_internal (bfd *ibfd, bfd *obfd)
2294
{
2295
  Elf_Internal_Shdr **o_shdrp;
2296
  asection *isec;
2297
  asection *osec;
2298
 
2299
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2300
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2301
    return TRUE;
2302
 
2303
  o_shdrp = elf_elfsections (obfd);
2304
  for (osec = obfd->sections; osec; osec = osec->next)
2305
    {
2306
      int oIndex = ((struct bfd_elf_section_data *) elf_section_data (osec))->this_idx;
2307
      for (isec = ibfd->sections; isec; isec = isec->next)
2308
        {
2309
          if (strcmp (osec->name, isec->name) == 0)
2310
            {
2311
              /* Note that we're not disallowing mixing data and code.  */
2312
              if ((elf_section_data (isec)->this_hdr.sh_flags
2313
                   & SHF_SH5_ISA32) != 0)
2314
                o_shdrp[oIndex]->sh_flags |= SHF_SH5_ISA32;
2315
              break;
2316
            }
2317
        }
2318
    }
2319
 
2320
  /* Copy object attributes.  */
2321
  _bfd_elf_copy_obj_attributes (ibfd, obfd);
2322
 
2323
  return sh_elf64_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
2324
}
2325
 
2326
static bfd_boolean
2327
sh_elf64_copy_private_data (bfd *ibfd, bfd *obfd)
2328
{
2329
  return sh_elf64_copy_private_data_internal (ibfd, obfd);
2330
}
2331
 
2332
static bfd_boolean
2333
sh_elf64_merge_private_data (bfd *ibfd, bfd *obfd)
2334
{
2335
  flagword old_flags, new_flags;
2336
 
2337
  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2338
    return FALSE;
2339
 
2340
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2341
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2342
    return TRUE;
2343
 
2344
  if (bfd_get_arch_size (ibfd) != bfd_get_arch_size (obfd))
2345
    {
2346
      const char *msg;
2347
 
2348
      if (bfd_get_arch_size (ibfd) == 32
2349
          && bfd_get_arch_size (obfd) == 64)
2350
        msg = _("%s: compiled as 32-bit object and %s is 64-bit");
2351
      else if (bfd_get_arch_size (ibfd) == 64
2352
               && bfd_get_arch_size (obfd) == 32)
2353
        msg = _("%s: compiled as 64-bit object and %s is 32-bit");
2354
      else
2355
        msg = _("%s: object size does not match that of target %s");
2356
 
2357
      (*_bfd_error_handler) (msg, bfd_get_filename (ibfd),
2358
                             bfd_get_filename (obfd));
2359
      bfd_set_error (bfd_error_wrong_format);
2360
      return FALSE;
2361
    }
2362
 
2363
  old_flags = elf_elfheader (obfd)->e_flags;
2364
  new_flags = elf_elfheader (ibfd)->e_flags;
2365
  if (! elf_flags_init (obfd))
2366
    {
2367
      /* This happens when ld starts out with a 'blank' output file.  */
2368
      elf_flags_init (obfd) = TRUE;
2369
      elf_elfheader (obfd)->e_flags = old_flags = new_flags;
2370
    }
2371
  /* We don't allow linking in anything else than SH64 code, and since
2372
     this is a 64-bit ELF, we assume the 64-bit ABI is used.  Add code
2373
     here as things change.  */
2374
  else if ((new_flags & EF_SH_MACH_MASK) != EF_SH5)
2375
    {
2376
      (*_bfd_error_handler)
2377
        ("%s: does not use the SH64 64-bit ABI as previous modules do",
2378
         bfd_get_filename (ibfd));
2379
      bfd_set_error (bfd_error_bad_value);
2380
      return FALSE;
2381
    }
2382
 
2383
  sh_elf64_copy_private_data_internal (ibfd, obfd);
2384
 
2385
  /* I can't think of anything sane other than old_flags being EF_SH5 and
2386
     that we need to preserve that.  */
2387
  elf_elfheader (obfd)->e_flags = old_flags;
2388
 
2389
  return sh_elf64_set_mach_from_flags (obfd);
2390
}
2391
 
2392
/* Return the section that should be marked against GC for a given
2393
   relocation.  */
2394
 
2395
static asection *
2396
sh_elf64_gc_mark_hook (asection *sec,
2397
                       struct bfd_link_info *info,
2398
                       Elf_Internal_Rela *rel,
2399
                       struct elf_link_hash_entry *h,
2400
                       Elf_Internal_Sym *sym)
2401
{
2402
  if (h != NULL)
2403
    switch (ELF64_R_TYPE (rel->r_info))
2404
      {
2405
      case R_SH_GNU_VTINHERIT:
2406
      case R_SH_GNU_VTENTRY:
2407
        return NULL;
2408
      }
2409
 
2410
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2411
}
2412
 
2413
/* Look through the relocs for a section during the first phase.
2414
   Since we don't do .gots or .plts, we just need to consider the
2415
   virtual table relocs for gc.  */
2416
 
2417
static bfd_boolean
2418
sh_elf64_check_relocs (bfd *abfd, struct bfd_link_info *info,
2419
                       asection *sec, const Elf_Internal_Rela *relocs)
2420
{
2421
  Elf_Internal_Shdr *symtab_hdr;
2422
  struct elf_link_hash_entry **sym_hashes;
2423
  const Elf_Internal_Rela *rel;
2424
  const Elf_Internal_Rela *rel_end;
2425
  bfd *dynobj;
2426
  bfd_vma *local_got_offsets;
2427
  asection *sgot;
2428
  asection *srelgot;
2429
  asection *sreloc;
2430
 
2431
  sgot = NULL;
2432
  srelgot = NULL;
2433
  sreloc = NULL;
2434
 
2435
  if (info->relocatable)
2436
    return TRUE;
2437
 
2438
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2439
  sym_hashes = elf_sym_hashes (abfd);
2440
 
2441
  dynobj = elf_hash_table (info)->dynobj;
2442
  local_got_offsets = elf_local_got_offsets (abfd);
2443
 
2444
  rel_end = relocs + sec->reloc_count;
2445
  for (rel = relocs; rel < rel_end; rel++)
2446
    {
2447
      struct elf_link_hash_entry *h;
2448
      unsigned long r_symndx;
2449
 
2450
      r_symndx = ELF64_R_SYM (rel->r_info);
2451
      if (r_symndx < symtab_hdr->sh_info)
2452
        h = NULL;
2453
      else
2454
        {
2455
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2456
          while (h->root.type == bfd_link_hash_indirect
2457
                 || h->root.type == bfd_link_hash_warning)
2458
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
2459
        }
2460
 
2461
      /* Some relocs require a global offset table.  */
2462
      if (dynobj == NULL)
2463
        {
2464
          switch (ELF64_R_TYPE (rel->r_info))
2465
            {
2466
            case R_SH_GOTPLT_LOW16:
2467
            case R_SH_GOTPLT_MEDLOW16:
2468
            case R_SH_GOTPLT_MEDHI16:
2469
            case R_SH_GOTPLT_HI16:
2470
            case R_SH_GOTPLT10BY4:
2471
            case R_SH_GOTPLT10BY8:
2472
            case R_SH_GOT_LOW16:
2473
            case R_SH_GOT_MEDLOW16:
2474
            case R_SH_GOT_MEDHI16:
2475
            case R_SH_GOT_HI16:
2476
            case R_SH_GOT10BY4:
2477
            case R_SH_GOT10BY8:
2478
            case R_SH_GOTOFF_LOW16:
2479
            case R_SH_GOTOFF_MEDLOW16:
2480
            case R_SH_GOTOFF_MEDHI16:
2481
            case R_SH_GOTOFF_HI16:
2482
            case R_SH_GOTPC_LOW16:
2483
            case R_SH_GOTPC_MEDLOW16:
2484
            case R_SH_GOTPC_MEDHI16:
2485
            case R_SH_GOTPC_HI16:
2486
              elf_hash_table (info)->dynobj = dynobj = abfd;
2487
              if (! _bfd_elf_create_got_section (dynobj, info))
2488
                return FALSE;
2489
              break;
2490
 
2491
            default:
2492
              break;
2493
            }
2494
        }
2495
 
2496
      switch (ELF64_R_TYPE (rel->r_info))
2497
        {
2498
          /* This relocation describes the C++ object vtable hierarchy.
2499
             Reconstruct it for later use during GC.  */
2500
        case R_SH_GNU_VTINHERIT:
2501
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2502
            return FALSE;
2503
          break;
2504
 
2505
          /* This relocation describes which C++ vtable entries are actually
2506
             used.  Record for later use during GC.  */
2507
        case R_SH_GNU_VTENTRY:
2508
          BFD_ASSERT (h != NULL);
2509
          if (h != NULL
2510
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2511
            return FALSE;
2512
          break;
2513
 
2514
        force_got:
2515
        case R_SH_GOT_LOW16:
2516
        case R_SH_GOT_MEDLOW16:
2517
        case R_SH_GOT_MEDHI16:
2518
        case R_SH_GOT_HI16:
2519
        case R_SH_GOT10BY4:
2520
        case R_SH_GOT10BY8:
2521
          /* This symbol requires a global offset table entry.  */
2522
 
2523
          if (sgot == NULL)
2524
            {
2525
              sgot = bfd_get_section_by_name (dynobj, ".got");
2526
              BFD_ASSERT (sgot != NULL);
2527
            }
2528
 
2529
          if (srelgot == NULL
2530
              && (h != NULL || info->shared))
2531
            {
2532
              srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2533
              if (srelgot == NULL)
2534
                {
2535
                  srelgot = bfd_make_section_with_flags (dynobj,
2536
                                                         ".rela.got",
2537
                                                         (SEC_ALLOC
2538
                                                          | SEC_LOAD
2539
                                                          | SEC_HAS_CONTENTS
2540
                                                          | SEC_IN_MEMORY
2541
                                                          | SEC_LINKER_CREATED
2542
                                                          | SEC_READONLY));
2543
                  if (srelgot == NULL
2544
                      || ! bfd_set_section_alignment (dynobj, srelgot, 2))
2545
                    return FALSE;
2546
                }
2547
            }
2548
 
2549
          if (h != NULL)
2550
            {
2551
              if (h->type == STT_DATALABEL)
2552
                {
2553
                  struct elf_sh64_link_hash_entry *hsh;
2554
 
2555
                  h = (struct elf_link_hash_entry *) h->root.u.i.link;
2556
                  hsh = (struct elf_sh64_link_hash_entry *)h;
2557
                  if (hsh->datalabel_got_offset != (bfd_vma) -1)
2558
                    break;
2559
 
2560
                  hsh->datalabel_got_offset = sgot->size;
2561
                }
2562
              else
2563
                {
2564
                  if (h->got.offset != (bfd_vma) -1)
2565
                    {
2566
                      /* We have already allocated space in the .got.  */
2567
                      break;
2568
                    }
2569
                  h->got.offset = sgot->size;
2570
                }
2571
 
2572
              /* Make sure this symbol is output as a dynamic symbol.  */
2573
              if (h->dynindx == -1)
2574
                {
2575
                  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2576
                    return FALSE;
2577
                }
2578
 
2579
              srelgot->size += sizeof (Elf64_External_Rela);
2580
            }
2581
          else
2582
            {
2583
              /* This is a global offset table entry for a local
2584
                 symbol.  */
2585
              if (local_got_offsets == NULL)
2586
                {
2587
                  size_t size;
2588
                  register unsigned int i;
2589
 
2590
                  size = symtab_hdr->sh_info * sizeof (bfd_vma);
2591
                  /* Reserve space for both the datalabel and
2592
                     codelabel local GOT offsets.  */
2593
                  size *= 2;
2594
                  local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
2595
                  if (local_got_offsets == NULL)
2596
                    return FALSE;
2597
                  elf_local_got_offsets (abfd) = local_got_offsets;
2598
                  for (i = 0; i < symtab_hdr->sh_info; i++)
2599
                    local_got_offsets[i] = (bfd_vma) -1;
2600
                  for (; i < 2 * symtab_hdr->sh_info; i++)
2601
                    local_got_offsets[i] = (bfd_vma) -1;
2602
                }
2603
              if ((rel->r_addend & 1) != 0)
2604
                {
2605
                  if (local_got_offsets[symtab_hdr->sh_info
2606
                                        + r_symndx] != (bfd_vma) -1)
2607
                    {
2608
                      /* We have already allocated space in the .got.  */
2609
                      break;
2610
                    }
2611
                  local_got_offsets[symtab_hdr->sh_info
2612
                                    + r_symndx] = sgot->size;
2613
                }
2614
              else
2615
                {
2616
                  if (local_got_offsets[r_symndx] != (bfd_vma) -1)
2617
                    {
2618
                      /* We have already allocated space in the .got.  */
2619
                      break;
2620
                    }
2621
                  local_got_offsets[r_symndx] = sgot->size;
2622
                }
2623
 
2624
              if (info->shared)
2625
                {
2626
                  /* If we are generating a shared object, we need to
2627
                     output a R_SH_RELATIVE reloc so that the dynamic
2628
                     linker can adjust this GOT entry.  */
2629
                  srelgot->size += sizeof (Elf64_External_Rela);
2630
                }
2631
            }
2632
 
2633
          sgot->size += 8;
2634
 
2635
          break;
2636
 
2637
        case R_SH_GOTPLT_LOW16:
2638
        case R_SH_GOTPLT_MEDLOW16:
2639
        case R_SH_GOTPLT_MEDHI16:
2640
        case R_SH_GOTPLT_HI16:
2641
        case R_SH_GOTPLT10BY4:
2642
        case R_SH_GOTPLT10BY8:
2643
          /* If this is a local symbol, we resolve it directly without
2644
             creating a procedure linkage table entry.  */
2645
 
2646
          if (h == NULL
2647
              || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2648
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
2649
              || ! info->shared
2650
              || info->symbolic
2651
              || h->dynindx == -1
2652
              || h->got.offset != (bfd_vma) -1)
2653
            goto force_got;
2654
 
2655
          /* Make sure this symbol is output as a dynamic symbol.  */
2656
          if (h->dynindx == -1)
2657
            {
2658
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
2659
                return FALSE;
2660
            }
2661
 
2662
          h->needs_plt = 1;
2663
 
2664
          break;
2665
 
2666
        case R_SH_PLT_LOW16:
2667
        case R_SH_PLT_MEDLOW16:
2668
        case R_SH_PLT_MEDHI16:
2669
        case R_SH_PLT_HI16:
2670
          /* This symbol requires a procedure linkage table entry.  We
2671
             actually build the entry in adjust_dynamic_symbol,
2672
             because this might be a case of linking PIC code which is
2673
             never referenced by a dynamic object, in which case we
2674
             don't need to generate a procedure linkage table entry
2675
             after all.  */
2676
 
2677
          /* If this is a local symbol, we resolve it directly without
2678
             creating a procedure linkage table entry.  */
2679
          if (h == NULL)
2680
            continue;
2681
 
2682
          if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2683
              || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
2684
            break;
2685
 
2686
          h->needs_plt = 1;
2687
 
2688
          break;
2689
 
2690
        case R_SH_64:
2691
        case R_SH_64_PCREL:
2692
          if (h != NULL)
2693
            h->non_got_ref = 1;
2694
 
2695
          /* If we are creating a shared library, and this is a reloc
2696
             against a global symbol, or a non PC relative reloc
2697
             against a local symbol, then we need to copy the reloc
2698
             into the shared library.  However, if we are linking with
2699
             -Bsymbolic, we do not need to copy a reloc against a
2700
             global symbol which is defined in an object we are
2701
             including in the link (i.e., DEF_REGULAR is set).  At
2702
             this point we have not seen all the input files, so it is
2703
             possible that DEF_REGULAR is not set now but will be set
2704
             later (it is never cleared).  We account for that
2705
             possibility below by storing information in the
2706
             pcrel_relocs_copied field of the hash table entry.  */
2707
          if (info->shared
2708
              && (sec->flags & SEC_ALLOC) != 0
2709
              && (ELF32_R_TYPE (rel->r_info) != R_SH_64_PCREL
2710
                  || (h != NULL
2711
                      && (! info->symbolic
2712
                          || !h->def_regular))))
2713
            {
2714
              /* When creating a shared object, we must copy these
2715
                 reloc types into the output file.  We create a reloc
2716
                 section in dynobj and make room for this reloc.  */
2717
              if (sreloc == NULL)
2718
                {
2719
                  const char *name;
2720
 
2721
                  name = (bfd_elf_string_from_elf_section
2722
                          (abfd,
2723
                           elf_elfheader (abfd)->e_shstrndx,
2724
                           elf_section_data (sec)->rel_hdr.sh_name));
2725
                  if (name == NULL)
2726
                    return FALSE;
2727
 
2728
                  BFD_ASSERT (CONST_STRNEQ (name, ".rela")
2729
                              && strcmp (bfd_get_section_name (abfd, sec),
2730
                                         name + 5) == 0);
2731
 
2732
                  sreloc = bfd_get_section_by_name (dynobj, name);
2733
                  if (sreloc == NULL)
2734
                    {
2735
                      flagword flags;
2736
 
2737
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
2738
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2739
                      if ((sec->flags & SEC_ALLOC) != 0)
2740
                        flags |= SEC_ALLOC | SEC_LOAD;
2741
                      sreloc = bfd_make_section_with_flags (dynobj,
2742
                                                            name,
2743
                                                            flags);
2744
                      if (sreloc == NULL
2745
                          || ! bfd_set_section_alignment (dynobj, sreloc, 2))
2746
                        return FALSE;
2747
                    }
2748
                }
2749
 
2750
              sreloc->size += sizeof (Elf64_External_Rela);
2751
 
2752
              /* If we are linking with -Bsymbolic, and this is a
2753
                 global symbol, we count the number of PC relative
2754
                 relocations we have entered for this symbol, so that
2755
                 we can discard them again if the symbol is later
2756
                 defined by a regular object.  Note that this function
2757
                 is only called if we are using an elf_sh linker
2758
                 hash table, which means that h is really a pointer to
2759
                 an elf_sh_link_hash_entry.  */
2760
              if (h != NULL && info->symbolic
2761
                  && ELF64_R_TYPE (rel->r_info) == R_SH_64_PCREL)
2762
                {
2763
                  struct elf_sh64_link_hash_entry *eh;
2764
                  struct elf_sh64_pcrel_relocs_copied *p;
2765
 
2766
                  eh = (struct elf_sh64_link_hash_entry *) h;
2767
 
2768
                  for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2769
                    if (p->section == sreloc)
2770
                      break;
2771
 
2772
                  if (p == NULL)
2773
                    {
2774
                      p = ((struct elf_sh64_pcrel_relocs_copied *)
2775
                           bfd_alloc (dynobj, sizeof *p));
2776
                      if (p == NULL)
2777
                        return FALSE;
2778
                      p->next = eh->pcrel_relocs_copied;
2779
                      eh->pcrel_relocs_copied = p;
2780
                      p->section = sreloc;
2781
                      p->count = 0;
2782
                    }
2783
 
2784
                  ++p->count;
2785
                }
2786
            }
2787
 
2788
          break;
2789
        }
2790
    }
2791
 
2792
  return TRUE;
2793
}
2794
 
2795
static int
2796
sh64_elf64_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
2797
{
2798
  if (ELF_ST_TYPE (elf_sym->st_info) == STT_DATALABEL)
2799
    return STT_DATALABEL;
2800
 
2801
  return type;
2802
}
2803
 
2804
/* FIXME: This is a copy of sh64_elf_add_symbol_hook in elf32-sh64.c.
2805
   Either file can presumably exist without the other, but do not differ
2806
   in elf-size-ness.  How to share?
2807
 
2808
   Hook called by the linker routine which adds symbols from an object
2809
   file.  We must make indirect symbols for undefined symbols marked with
2810
   STT_DATALABEL, so relocations passing them will pick up that attribute
2811
   and neutralize STO_SH5_ISA32 found on the symbol definition.
2812
 
2813
   There is a problem, though: We want to fill in the hash-table entry for
2814
   this symbol and signal to the caller that no further processing is
2815
   needed.  But we don't have the index for this hash-table entry.  We
2816
   rely here on that the current entry is the first hash-entry with NULL,
2817
   which seems brittle.  Also, iterating over the hash-table to find that
2818
   entry is a linear operation on the number of symbols in this input
2819
   file, and this function should take constant time, so that's not good
2820
   too.  Only comfort is that DataLabel references should only be found in
2821
   hand-written assembly code and thus be rare.  FIXME: Talk maintainers
2822
   into adding an option to elf_add_symbol_hook (preferably) for the index
2823
   or the hash entry, alternatively adding the index to Elf_Internal_Sym
2824
   (not so good).  */
2825
 
2826
static bfd_boolean
2827
sh64_elf64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
2828
                            Elf_Internal_Sym *sym, const char **namep,
2829
                            flagword *flagsp ATTRIBUTE_UNUSED,
2830
                            asection **secp, bfd_vma *valp)
2831
{
2832
  /* We want to do this for relocatable as well as final linking.  */
2833
  if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL
2834
      && is_elf_hash_table (info->hash))
2835
    {
2836
      struct elf_link_hash_entry *h;
2837
 
2838
      /* For relocatable links, we register the DataLabel sym in its own
2839
         right, and tweak the name when it's output.  Otherwise, we make
2840
         an indirect symbol of it.  */
2841
      flagword flags
2842
        = info->relocatable || info->emitrelocations
2843
        ? BSF_GLOBAL : BSF_GLOBAL | BSF_INDIRECT;
2844
 
2845
      char *dl_name
2846
        = bfd_malloc (strlen (*namep) + sizeof (DATALABEL_SUFFIX));
2847
      struct elf_link_hash_entry ** sym_hash = elf_sym_hashes (abfd);
2848
 
2849
      BFD_ASSERT (sym_hash != NULL);
2850
 
2851
      /* Allocation may fail.  */
2852
      if (dl_name == NULL)
2853
        return FALSE;
2854
 
2855
      strcpy (dl_name, *namep);
2856
      strcat (dl_name, DATALABEL_SUFFIX);
2857
 
2858
      h = (struct elf_link_hash_entry *)
2859
        bfd_link_hash_lookup (info->hash, dl_name, FALSE, FALSE, FALSE);
2860
 
2861
      if (h == NULL)
2862
        {
2863
          /* No previous datalabel symbol.  Make one.  */
2864
          struct bfd_link_hash_entry *bh = NULL;
2865
          const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2866
 
2867
          if (! _bfd_generic_link_add_one_symbol (info, abfd, dl_name,
2868
                                                  flags, *secp, *valp,
2869
                                                  *namep, FALSE,
2870
                                                  bed->collect, &bh))
2871
            {
2872
              free (dl_name);
2873
              return FALSE;
2874
            }
2875
 
2876
          h = (struct elf_link_hash_entry *) bh;
2877
          h->non_elf = 0;
2878
          h->type = STT_DATALABEL;
2879
        }
2880
      else
2881
        /* If a new symbol was created, it holds the allocated name.
2882
           Otherwise, we don't need it anymore and should deallocate it.  */
2883
        free (dl_name);
2884
 
2885
      if (h->type != STT_DATALABEL
2886
          || ((info->relocatable || info->emitrelocations)
2887
              && h->root.type != bfd_link_hash_undefined)
2888
          || (! info->relocatable && !info->emitrelocations
2889
              && h->root.type != bfd_link_hash_indirect))
2890
        {
2891
          /* Make sure we don't get confused on invalid input.  */
2892
          (*_bfd_error_handler)
2893
            (_("%s: encountered datalabel symbol in input"),
2894
             bfd_get_filename (abfd));
2895
          bfd_set_error (bfd_error_bad_value);
2896
          return FALSE;
2897
        }
2898
 
2899
      /* Now find the hash-table slot for this entry and fill it in.  */
2900
      while (*sym_hash != NULL)
2901
        sym_hash++;
2902
      *sym_hash = h;
2903
 
2904
      /* Signal to caller to skip this symbol - we've handled it.  */
2905
      *namep = NULL;
2906
    }
2907
 
2908
  return TRUE;
2909
}
2910
 
2911
/* This hook function is called before the linker writes out a global
2912
   symbol.  For relocatable links, DataLabel symbols will be present in
2913
   linker output.  We cut off the special suffix on those symbols, so the
2914
   right name appears in the output.
2915
 
2916
   When linking and emitting relocations, there can appear global symbols
2917
   that are not referenced by relocs, but rather only implicitly through
2918
   DataLabel references, a relation that is not visible to the linker.
2919
   Since no stripping of global symbols in done when doing such linking,
2920
   we don't need to look up and make sure to emit the main symbol for each
2921
   DataLabel symbol.  */
2922
 
2923
static bfd_boolean
2924
sh64_elf64_link_output_symbol_hook (struct bfd_link_info *info,
2925
                                    const char *cname,
2926
                                    Elf_Internal_Sym *sym,
2927
                                    asection *input_sec ATTRIBUTE_UNUSED,
2928
                                    struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2929
{
2930
  char *name = (char *) cname;
2931
 
2932
  if (info->relocatable || info->emitrelocations)
2933
    {
2934
      if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL)
2935
        name[strlen (name) - strlen (DATALABEL_SUFFIX)] = 0;
2936
    }
2937
 
2938
  return TRUE;
2939
}
2940
 
2941
/* Set bit 0 on the entry address; it always points to SHmedia code.  This
2942
   is mostly for symmetry with the 32-bit format, where code can be
2943
   SHcompact and we need to make a distinction to make sure execution
2944
   starts in the right ISA mode.  It is also convenient for a loader,
2945
   which would otherwise have to set this bit when loading a TR register
2946
   before jumping to the program entry.  */
2947
 
2948
static void
2949
sh64_elf64_final_write_processing (bfd *abfd,
2950
                                   bfd_boolean linker ATTRIBUTE_UNUSED)
2951
{
2952
  /* FIXME: Perhaps we shouldn't do this if the entry address was supplied
2953
     numerically, but we currently lack the infrastructure to recognize
2954
     that: The entry symbol, and info whether it is numeric or a symbol
2955
     name is kept private in the linker.  */
2956
  if (elf_elfheader (abfd)->e_type == ET_EXEC)
2957
    elf_elfheader (abfd)->e_entry |= 1;
2958
}
2959
 
2960
/* First entry in an absolute procedure linkage table look like this.  */
2961
 
2962
static const bfd_byte elf_sh64_plt0_entry_be[PLT_ENTRY_SIZE] =
2963
{
2964
  0xcc, 0x00, 0x01, 0x10, /* movi  .got.plt >> 48, r17 */
2965
  0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 32) & 65535, r17 */
2966
  0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 16) & 65535, r17 */
2967
  0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
2968
  0x8d, 0x10, 0x09, 0x90, /* ld.q  r17, 16, r25 */
2969
  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
2970
  0x8d, 0x10, 0x05, 0x10, /* ld.q  r17, 8, r17 */
2971
  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
2972
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2973
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2974
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2975
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2976
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2977
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2978
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2979
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2980
};
2981
 
2982
static const bfd_byte elf_sh64_plt0_entry_le[PLT_ENTRY_SIZE] =
2983
{
2984
  0x10, 0x01, 0x00, 0xcc, /* movi  .got.plt >> 16, r17 */
2985
  0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 32) & 65535, r17 */
2986
  0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 16) & 65535, r17 */
2987
  0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
2988
  0x90, 0x09, 0x10, 0x8d, /* ld.q  r17, 16, r25 */
2989
  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
2990
  0x10, 0x05, 0x10, 0x8d, /* ld.q  r17, 8, r17 */
2991
  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
2992
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2993
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2994
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2995
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2996
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2997
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2998
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2999
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3000
};
3001
 
3002
/* Sebsequent entries in an absolute procedure linkage table look like
3003
   this.  */
3004
 
3005
static const bfd_byte elf_sh64_plt_entry_be[PLT_ENTRY_SIZE] =
3006
{
3007
  0xcc, 0x00, 0x01, 0x90, /* movi  nameN-in-GOT >> 48, r25 */
3008
  0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 32) & 65535, r25 */
3009
  0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 16) & 65535, r25 */
3010
  0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
3011
  0x8d, 0x90, 0x01, 0x90, /* ld.q  r25, 0, r25 */
3012
  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3013
  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3014
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3015
  0xcc, 0x00, 0x01, 0x90, /* movi  (.+8-.PLT0) >> 16, r25 */
3016
  0xc8, 0x00, 0x01, 0x90, /* shori (.+4-.PLT0) & 65535, r25 */
3017
  0x6b, 0xf5, 0x66, 0x00, /* ptrel r25, tr0 */
3018
  0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
3019
  0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3020
  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3021
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3022
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3023
};
3024
 
3025
static const bfd_byte elf_sh64_plt_entry_le[PLT_ENTRY_SIZE] =
3026
{
3027
  0x90, 0x01, 0x00, 0xcc, /* movi  nameN-in-GOT >> 16, r25 */
3028
  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3029
  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3030
  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3031
  0x90, 0x01, 0x90, 0x8d, /* ld.q  r25, 0, r25 */
3032
  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3033
  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3034
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3035
  0x90, 0x01, 0x00, 0xcc, /* movi  (.+8-.PLT0) >> 16, r25 */
3036
  0x90, 0x01, 0x00, 0xc8, /* shori (.+4-.PLT0) & 65535, r25 */
3037
  0x00, 0x66, 0xf5, 0x6b, /* ptrel r25, tr0 */
3038
  0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3039
  0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3040
  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3041
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3042
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3043
};
3044
 
3045
/* Entries in a PIC procedure linkage table look like this.  */
3046
 
3047
static const bfd_byte elf_sh64_pic_plt_entry_be[PLT_ENTRY_SIZE] =
3048
{
3049
  0xcc, 0x00, 0x01, 0x90, /* movi  nameN@GOT >> 16, r25 */
3050
  0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3051
  0x40, 0xc3, 0x65, 0x90, /* ldx.q r12, r25, r25 */
3052
  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3053
  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3054
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3055
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3056
  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3057
  0xce, 0x00, 0x01, 0x10, /* movi  -GOT_BIAS, r17 */
3058
  0x00, 0xc9, 0x45, 0x10, /* add   r12, r17, r17 */
3059
  0x8d, 0x10, 0x09, 0x90, /* ld.q  r17, 16, r25 */
3060
  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3061
  0x8d, 0x10, 0x05, 0x10, /* ld.q  r17, 8, r17 */
3062
  0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
3063
  0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3064
  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3065
};
3066
 
3067
static const bfd_byte elf_sh64_pic_plt_entry_le[PLT_ENTRY_SIZE] =
3068
{
3069
  0x90, 0x01, 0x00, 0xcc, /* movi  nameN@GOT >> 16, r25 */
3070
  0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3071
  0x90, 0x65, 0xc3, 0x40, /* ldx.q r12, r25, r25 */
3072
  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3073
  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3074
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3075
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3076
  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3077
  0x10, 0x01, 0x00, 0xce, /* movi  -GOT_BIAS, r17 */
3078
  0x10, 0x45, 0xc9, 0x00, /* add   r12, r17, r17 */
3079
  0x90, 0x09, 0x10, 0x8d, /* ld.q  r17, 16, r25 */
3080
  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3081
  0x10, 0x05, 0x10, 0x8d, /* ld.q  r17, 8, r17 */
3082
  0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3083
  0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3084
  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3085
};
3086
 
3087
static const bfd_byte *elf_sh64_plt0_entry;
3088
static const bfd_byte *elf_sh64_plt_entry;
3089
static const bfd_byte *elf_sh64_pic_plt_entry;
3090
 
3091
/* Create an entry in an sh ELF linker hash table.  */
3092
 
3093
static struct bfd_hash_entry *
3094
sh64_elf64_link_hash_newfunc (struct bfd_hash_entry *entry,
3095
                              struct bfd_hash_table *table,
3096
                              const char *string)
3097
{
3098
  struct elf_sh64_link_hash_entry *ret =
3099
    (struct elf_sh64_link_hash_entry *) entry;
3100
 
3101
  /* Allocate the structure if it has not already been allocated by a
3102
     subclass.  */
3103
  if (ret == (struct elf_sh64_link_hash_entry *) NULL)
3104
    ret = ((struct elf_sh64_link_hash_entry *)
3105
           bfd_hash_allocate (table,
3106
                              sizeof (struct elf_sh64_link_hash_entry)));
3107
  if (ret == (struct elf_sh64_link_hash_entry *) NULL)
3108
    return (struct bfd_hash_entry *) ret;
3109
 
3110
  /* Call the allocation method of the superclass.  */
3111
  ret = ((struct elf_sh64_link_hash_entry *)
3112
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3113
                                     table, string));
3114
  if (ret != (struct elf_sh64_link_hash_entry *) NULL)
3115
    {
3116
      ret->pcrel_relocs_copied = NULL;
3117
      ret->datalabel_got_offset = (bfd_vma) -1;
3118
    }
3119
 
3120
  return (struct bfd_hash_entry *) ret;
3121
}
3122
 
3123
/* Create an sh64 ELF linker hash table.  */
3124
 
3125
static struct bfd_link_hash_table *
3126
sh64_elf64_link_hash_table_create (bfd *abfd)
3127
{
3128
  struct elf_sh64_link_hash_table *ret;
3129
 
3130
  ret = ((struct elf_sh64_link_hash_table *)
3131
         bfd_malloc (sizeof (struct elf_sh64_link_hash_table)));
3132
  if (ret == (struct elf_sh64_link_hash_table *) NULL)
3133
    return NULL;
3134
 
3135
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3136
                                      sh64_elf64_link_hash_newfunc,
3137
                                      sizeof (struct elf_sh64_link_hash_entry)))
3138
    {
3139
      free (ret);
3140
      return NULL;
3141
    }
3142
 
3143
  return &ret->root.root;
3144
}
3145
 
3146
inline static void
3147
movi_shori_putval (bfd *output_bfd, unsigned long value, bfd_byte *addr)
3148
{
3149
  bfd_put_32 (output_bfd,
3150
              bfd_get_32 (output_bfd, addr)
3151
              | ((value >> 6) & 0x3fffc00),
3152
              addr);
3153
  bfd_put_32 (output_bfd,
3154
              bfd_get_32 (output_bfd, addr + 4)
3155
              | ((value << 10) & 0x3fffc00),
3156
              addr + 4);
3157
}
3158
 
3159
inline static void
3160
movi_3shori_putval (bfd *output_bfd, bfd_vma value, bfd_byte *addr)
3161
{
3162
  bfd_put_32 (output_bfd,
3163
              bfd_get_32 (output_bfd, addr)
3164
              | ((value >> 38) & 0x3fffc00),
3165
              addr);
3166
  bfd_put_32 (output_bfd,
3167
              bfd_get_32 (output_bfd, addr + 4)
3168
              | ((value >> 22) & 0x3fffc00),
3169
              addr + 4);
3170
  bfd_put_32 (output_bfd,
3171
              bfd_get_32 (output_bfd, addr + 8)
3172
              | ((value >> 6) & 0x3fffc00),
3173
              addr + 8);
3174
  bfd_put_32 (output_bfd,
3175
              bfd_get_32 (output_bfd, addr + 12)
3176
              | ((value << 10) & 0x3fffc00),
3177
              addr + 12);
3178
}
3179
 
3180
/* Create dynamic sections when linking against a dynamic object.  */
3181
 
3182
static bfd_boolean
3183
sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3184
{
3185
  flagword flags, pltflags;
3186
  register asection *s;
3187
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3188
  int ptralign = 0;
3189
 
3190
  switch (bed->s->arch_size)
3191
    {
3192
    case 32:
3193
      ptralign = 2;
3194
      break;
3195
 
3196
    case 64:
3197
      ptralign = 3;
3198
      break;
3199
 
3200
    default:
3201
      bfd_set_error (bfd_error_bad_value);
3202
      return FALSE;
3203
    }
3204
 
3205
  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3206
     .rel[a].bss sections.  */
3207
 
3208
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3209
           | SEC_LINKER_CREATED);
3210
 
3211
  pltflags = flags;
3212
  pltflags |= SEC_CODE;
3213
  if (bed->plt_not_loaded)
3214
    pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
3215
  if (bed->plt_readonly)
3216
    pltflags |= SEC_READONLY;
3217
 
3218
  s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
3219
  if (s == NULL
3220
      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3221
    return FALSE;
3222
 
3223
  if (bed->want_plt_sym)
3224
    {
3225
      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3226
         .plt section.  */
3227
      struct elf_link_hash_entry *h;
3228
      struct bfd_link_hash_entry *bh = NULL;
3229
 
3230
      if (! (_bfd_generic_link_add_one_symbol
3231
             (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3232
              (bfd_vma) 0, (const char *) NULL, FALSE, bed->collect, &bh)))
3233
        return FALSE;
3234
 
3235
      h = (struct elf_link_hash_entry *) bh;
3236
      h->def_regular = 1;
3237
      h->type = STT_OBJECT;
3238
      elf_hash_table (info)->hplt = h;
3239
 
3240
      if (info->shared
3241
          && ! bfd_elf_link_record_dynamic_symbol (info, h))
3242
        return FALSE;
3243
    }
3244
 
3245
  s = bfd_make_section_with_flags (abfd,
3246
                                   bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
3247
                                   flags | SEC_READONLY);
3248
  if (s == NULL
3249
      || ! bfd_set_section_alignment (abfd, s, ptralign))
3250
    return FALSE;
3251
 
3252
  if (! _bfd_elf_create_got_section (abfd, info))
3253
    return FALSE;
3254
 
3255
  {
3256
    const char *secname;
3257
    char *relname;
3258
    flagword secflags;
3259
    asection *sec;
3260
 
3261
    for (sec = abfd->sections; sec; sec = sec->next)
3262
      {
3263
        secflags = bfd_get_section_flags (abfd, sec);
3264
        if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3265
            || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3266
          continue;
3267
        secname = bfd_get_section_name (abfd, sec);
3268
        relname = (char *) bfd_malloc (strlen (secname) + 6);
3269
        strcpy (relname, ".rela");
3270
        strcat (relname, secname);
3271
        s = bfd_make_section_with_flags (abfd, relname,
3272
                                         flags | SEC_READONLY);
3273
        if (s == NULL
3274
            || ! bfd_set_section_alignment (abfd, s, ptralign))
3275
          return FALSE;
3276
      }
3277
  }
3278
 
3279
  if (bed->want_dynbss)
3280
    {
3281
      /* The .dynbss section is a place to put symbols which are defined
3282
         by dynamic objects, are referenced by regular objects, and are
3283
         not functions.  We must allocate space for them in the process
3284
         image and use a R_*_COPY reloc to tell the dynamic linker to
3285
         initialize them at run time.  The linker script puts the .dynbss
3286
         section into the .bss section of the final image.  */
3287
      s = bfd_make_section_with_flags (abfd, ".dynbss",
3288
                                       SEC_ALLOC | SEC_LINKER_CREATED);
3289
      if (s == NULL)
3290
        return FALSE;
3291
 
3292
      /* The .rel[a].bss section holds copy relocs.  This section is not
3293
         normally needed.  We need to create it here, though, so that the
3294
         linker will map it to an output section.  We can't just create it
3295
         only if we need it, because we will not know whether we need it
3296
         until we have seen all the input files, and the first time the
3297
         main linker code calls BFD after examining all the input files
3298
         (size_dynamic_sections) the input sections have already been
3299
         mapped to the output sections.  If the section turns out not to
3300
         be needed, we can discard it later.  We will never need this
3301
         section when generating a shared object, since they do not use
3302
         copy relocs.  */
3303
      if (! info->shared)
3304
        {
3305
          s = bfd_make_section_with_flags (abfd,
3306
                                           (bed->default_use_rela_p
3307
                                            ? ".rela.bss" : ".rel.bss"),
3308
                                           flags | SEC_READONLY);
3309
          if (s == NULL
3310
              || ! bfd_set_section_alignment (abfd, s, ptralign))
3311
            return FALSE;
3312
        }
3313
    }
3314
 
3315
  return TRUE;
3316
}
3317
 
3318
/* Adjust a symbol defined by a dynamic object and referenced by a
3319
   regular object.  The current definition is in some section of the
3320
   dynamic object, but we're not including those sections.  We have to
3321
   change the definition to something the rest of the link can
3322
   understand.  */
3323
 
3324
static bfd_boolean
3325
sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
3326
                                  struct elf_link_hash_entry *h)
3327
{
3328
  bfd *dynobj;
3329
  asection *s;
3330
 
3331
  dynobj = elf_hash_table (info)->dynobj;
3332
 
3333
  /* Make sure we know what is going on here.  */
3334
  BFD_ASSERT (dynobj != NULL
3335
              && (h->needs_plt
3336
                  || h->u.weakdef != NULL
3337
                  || (h->def_dynamic
3338
                      && h->ref_regular
3339
                      && !h->def_regular)));
3340
 
3341
  /* If this is a function, put it in the procedure linkage table.  We
3342
     will fill in the contents of the procedure linkage table later,
3343
     when we know the address of the .got section.  */
3344
  if (h->type == STT_FUNC
3345
      || h->needs_plt)
3346
    {
3347
      if (! info->shared
3348
          && !h->def_dynamic
3349
          && !h->ref_dynamic)
3350
        {
3351
          /* This case can occur if we saw a PLT reloc in an input
3352
             file, but the symbol was never referred to by a dynamic
3353
             object.  In such a case, we don't actually need to build
3354
             a procedure linkage table, and we can just do a REL64
3355
             reloc instead.  */
3356
          BFD_ASSERT (h->needs_plt);
3357
          return TRUE;
3358
        }
3359
 
3360
      /* Make sure this symbol is output as a dynamic symbol.  */
3361
      if (h->dynindx == -1)
3362
        {
3363
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
3364
            return FALSE;
3365
        }
3366
 
3367
      s = bfd_get_section_by_name (dynobj, ".plt");
3368
      BFD_ASSERT (s != NULL);
3369
 
3370
      /* If this is the first .plt entry, make room for the special
3371
         first entry.  */
3372
      if (s->size == 0)
3373
        s->size += PLT_ENTRY_SIZE;
3374
 
3375
      /* If this symbol is not defined in a regular file, and we are
3376
         not generating a shared library, then set the symbol to this
3377
         location in the .plt.  This is required to make function
3378
         pointers compare as equal between the normal executable and
3379
         the shared library.  */
3380
      if (! info->shared
3381
          && !h->def_regular)
3382
        {
3383
          h->root.u.def.section = s;
3384
          h->root.u.def.value = s->size;
3385
        }
3386
 
3387
      h->plt.offset = s->size;
3388
 
3389
      /* Make room for this entry.  */
3390
      s->size += elf_sh64_sizeof_plt (info);
3391
 
3392
      /* We also need to make an entry in the .got.plt section, which
3393
         will be placed in the .got section by the linker script.  */
3394
 
3395
      s = bfd_get_section_by_name (dynobj, ".got.plt");
3396
      BFD_ASSERT (s != NULL);
3397
      s->size += 8;
3398
 
3399
      /* We also need to make an entry in the .rela.plt section.  */
3400
 
3401
      s = bfd_get_section_by_name (dynobj, ".rela.plt");
3402
      BFD_ASSERT (s != NULL);
3403
      s->size += sizeof (Elf64_External_Rela);
3404
 
3405
      return TRUE;
3406
    }
3407
 
3408
  /* If this is a weak symbol, and there is a real definition, the
3409
     processor independent code will have arranged for us to see the
3410
     real definition first, and we can just use the same value.  */
3411
  if (h->u.weakdef != NULL)
3412
    {
3413
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3414
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
3415
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
3416
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
3417
      return TRUE;
3418
    }
3419
 
3420
  /* This is a reference to a symbol defined by a dynamic object which
3421
     is not a function.  */
3422
 
3423
  /* If we are creating a shared library, we must presume that the
3424
     only references to the symbol are via the global offset table.
3425
     For such cases we need not do anything here; the relocations will
3426
     be handled correctly by relocate_section.  */
3427
  if (info->shared)
3428
    return TRUE;
3429
 
3430
  /* If there are no references to this symbol that do not use the
3431
     GOT, we don't need to generate a copy reloc.  */
3432
  if (!h->non_got_ref)
3433
    return TRUE;
3434
 
3435
  if (h->size == 0)
3436
    {
3437
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
3438
                             h->root.root.string);
3439
      return TRUE;
3440
    }
3441
 
3442
  /* We must allocate the symbol in our .dynbss section, which will
3443
     become part of the .bss section of the executable.  There will be
3444
     an entry for this symbol in the .dynsym section.  The dynamic
3445
     object will contain position independent code, so all references
3446
     from the dynamic object to this symbol will go through the global
3447
     offset table.  The dynamic linker will use the .dynsym entry to
3448
     determine the address it must put in the global offset table, so
3449
     both the dynamic object and the regular object will refer to the
3450
     same memory location for the variable.  */
3451
 
3452
  s = bfd_get_section_by_name (dynobj, ".dynbss");
3453
  BFD_ASSERT (s != NULL);
3454
 
3455
  /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
3456
     copy the initial value out of the dynamic object and into the
3457
     runtime process image.  We need to remember the offset into the
3458
     .rela.bss section we are going to use.  */
3459
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3460
    {
3461
      asection *srel;
3462
 
3463
      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
3464
      BFD_ASSERT (srel != NULL);
3465
      srel->size += sizeof (Elf64_External_Rela);
3466
      h->needs_copy = 1;
3467
    }
3468
 
3469
  return _bfd_elf_adjust_dynamic_copy (h, s);
3470
}
3471
 
3472
/* This function is called via sh_elf_link_hash_traverse if we are
3473
   creating a shared object with -Bsymbolic.  It discards the space
3474
   allocated to copy PC relative relocs against symbols which are
3475
   defined in regular objects.  We allocated space for them in the
3476
   check_relocs routine, but we won't fill them in in the
3477
   relocate_section routine.  */
3478
 
3479
static bfd_boolean
3480
sh64_elf64_discard_copies (struct elf_sh64_link_hash_entry *h,
3481
                           void *ignore ATTRIBUTE_UNUSED)
3482
{
3483
  struct elf_sh64_pcrel_relocs_copied *s;
3484
 
3485
  if (h->root.root.type == bfd_link_hash_warning)
3486
    h = (struct elf_sh64_link_hash_entry *) h->root.root.u.i.link;
3487
 
3488
  /* We only discard relocs for symbols defined in a regular object.  */
3489
  if (!h->root.def_regular)
3490
    return TRUE;
3491
 
3492
  for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
3493
    s->section->size -= s->count * sizeof (Elf64_External_Rela);
3494
 
3495
  return TRUE;
3496
}
3497
 
3498
/* Set the sizes of the dynamic sections.  */
3499
 
3500
static bfd_boolean
3501
sh64_elf64_size_dynamic_sections (bfd *output_bfd,
3502
                                  struct bfd_link_info *info)
3503
{
3504
  bfd *dynobj;
3505
  asection *s;
3506
  bfd_boolean plt;
3507
  bfd_boolean relocs;
3508
  bfd_boolean reltext;
3509
 
3510
  dynobj = elf_hash_table (info)->dynobj;
3511
  BFD_ASSERT (dynobj != NULL);
3512
 
3513
  if (elf_hash_table (info)->dynamic_sections_created)
3514
    {
3515
      /* Set the contents of the .interp section to the interpreter.  */
3516
      if (info->executable)
3517
        {
3518
          s = bfd_get_section_by_name (dynobj, ".interp");
3519
          BFD_ASSERT (s != NULL);
3520
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3521
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3522
        }
3523
    }
3524
  else
3525
    {
3526
      /* We may have created entries in the .rela.got section.
3527
         However, if we are not creating the dynamic sections, we will
3528
         not actually use these entries.  Reset the size of .rela.got,
3529
         which will cause it to get stripped from the output file
3530
         below.  */
3531
      s = bfd_get_section_by_name (dynobj, ".rela.got");
3532
      if (s != NULL)
3533
        s->size = 0;
3534
    }
3535
 
3536
  /* If this is a -Bsymbolic shared link, then we need to discard all
3537
     PC relative relocs against symbols defined in a regular object.
3538
     We allocated space for them in the check_relocs routine, but we
3539
     will not fill them in in the relocate_section routine.  */
3540
  if (info->shared && info->symbolic)
3541
    sh64_elf64_link_hash_traverse (sh64_elf64_hash_table (info),
3542
                                   sh64_elf64_discard_copies, NULL);
3543
 
3544
  /* The check_relocs and adjust_dynamic_symbol entry points have
3545
     determined the sizes of the various dynamic sections.  Allocate
3546
     memory for them.  */
3547
  plt = FALSE;
3548
  relocs = FALSE;
3549
  reltext = FALSE;
3550
  for (s = dynobj->sections; s != NULL; s = s->next)
3551
    {
3552
      const char *name;
3553
 
3554
      if ((s->flags & SEC_LINKER_CREATED) == 0)
3555
        continue;
3556
 
3557
      /* It's OK to base decisions on the section name, because none
3558
         of the dynobj section names depend upon the input files.  */
3559
      name = bfd_get_section_name (dynobj, s);
3560
 
3561
      if (strcmp (name, ".plt") == 0)
3562
        {
3563
          /* Remember whether there is a PLT.  */
3564
          plt = s->size != 0;
3565
        }
3566
      else if (CONST_STRNEQ (name, ".rela"))
3567
        {
3568
          if (s->size != 0)
3569
            {
3570
              asection *target;
3571
 
3572
              /* Remember whether there are any reloc sections other
3573
                 than .rela.plt.  */
3574
              if (strcmp (name, ".rela.plt") != 0)
3575
                {
3576
                  const char *outname;
3577
 
3578
                  relocs = TRUE;
3579
 
3580
                  /* If this relocation section applies to a read only
3581
                     section, then we probably need a DT_TEXTREL
3582
                     entry.  The entries in the .rela.plt section
3583
                     really apply to the .got section, which we
3584
                     created ourselves and so know is not readonly.  */
3585
                  outname = bfd_get_section_name (output_bfd,
3586
                                                  s->output_section);
3587
                  target = bfd_get_section_by_name (output_bfd, outname + 5);
3588
                  if (target != NULL
3589
                      && (target->flags & SEC_READONLY) != 0
3590
                      && (target->flags & SEC_ALLOC) != 0)
3591
                    reltext = TRUE;
3592
                }
3593
 
3594
              /* We use the reloc_count field as a counter if we need
3595
                 to copy relocs into the output file.  */
3596
              s->reloc_count = 0;
3597
            }
3598
        }
3599
      else if (! CONST_STRNEQ (name, ".got")
3600
               && strcmp (name, ".dynbss") != 0)
3601
        {
3602
          /* It's not one of our sections, so don't allocate space.  */
3603
          continue;
3604
        }
3605
 
3606
      if (s->size == 0)
3607
        {
3608
          /* If we don't need this section, strip it from the
3609
             output file.  This is mostly to handle .rela.bss and
3610
             .rela.plt.  We must create both sections in
3611
             create_dynamic_sections, because they must be created
3612
             before the linker maps input sections to output
3613
             sections.  The linker does that before
3614
             adjust_dynamic_symbol is called, and it is that
3615
             function which decides whether anything needs to go
3616
             into these sections.  */
3617
          s->flags |= SEC_EXCLUDE;
3618
          continue;
3619
        }
3620
 
3621
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
3622
        continue;
3623
 
3624
      /* Allocate memory for the section contents.  */
3625
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3626
      if (s->contents == NULL)
3627
        return FALSE;
3628
    }
3629
 
3630
  if (elf_hash_table (info)->dynamic_sections_created)
3631
    {
3632
      /* Add some entries to the .dynamic section.  We fill in the
3633
         values later, in sh64_elf64_finish_dynamic_sections, but we
3634
         must add the entries now so that we get the correct size for
3635
         the .dynamic section.  The DT_DEBUG entry is filled in by the
3636
         dynamic linker and used by the debugger.  */
3637
      if (info->executable)
3638
        {
3639
          if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
3640
            return FALSE;
3641
        }
3642
 
3643
      if (plt)
3644
        {
3645
          if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
3646
              || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3647
              || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
3648
              || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
3649
            return FALSE;
3650
        }
3651
 
3652
      if (relocs)
3653
        {
3654
          if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
3655
              || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
3656
              || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
3657
                                              sizeof (Elf64_External_Rela)))
3658
            return FALSE;
3659
        }
3660
 
3661
      if (reltext)
3662
        {
3663
          if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
3664
            return FALSE;
3665
        }
3666
    }
3667
 
3668
  return TRUE;
3669
}
3670
 
3671
/* Finish up dynamic symbol handling.  We set the contents of various
3672
   dynamic sections here.  */
3673
 
3674
static bfd_boolean
3675
sh64_elf64_finish_dynamic_symbol (bfd *output_bfd,
3676
                                  struct bfd_link_info *info,
3677
                                  struct elf_link_hash_entry *h,
3678
                                  Elf_Internal_Sym *sym)
3679
{
3680
  bfd *dynobj;
3681
 
3682
  dynobj = elf_hash_table (info)->dynobj;
3683
 
3684
  if (h->plt.offset != (bfd_vma) -1)
3685
    {
3686
      asection *splt;
3687
      asection *sgot;
3688
      asection *srel;
3689
 
3690
      bfd_vma plt_index;
3691
      bfd_vma got_offset;
3692
      Elf_Internal_Rela rel;
3693
      bfd_byte *loc;
3694
 
3695
      /* This symbol has an entry in the procedure linkage table.  Set
3696
         it up.  */
3697
 
3698
      BFD_ASSERT (h->dynindx != -1);
3699
 
3700
      splt = bfd_get_section_by_name (dynobj, ".plt");
3701
      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3702
      srel = bfd_get_section_by_name (dynobj, ".rela.plt");
3703
      BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
3704
 
3705
      /* Get the index in the procedure linkage table which
3706
         corresponds to this symbol.  This is the index of this symbol
3707
         in all the symbols for which we are making plt entries.  The
3708
         first entry in the procedure linkage table is reserved.  */
3709
      plt_index = h->plt.offset / elf_sh64_sizeof_plt (info) - 1;
3710
 
3711
      /* Get the offset into the .got table of the entry that
3712
         corresponds to this function.  Each .got entry is 8 bytes.
3713
         The first three are reserved.  */
3714
      got_offset = (plt_index + 3) * 8;
3715
 
3716
      if (info->shared)
3717
        got_offset -= GOT_BIAS;
3718
 
3719
      /* Fill in the entry in the procedure linkage table.  */
3720
      if (! info->shared)
3721
        {
3722
          if (elf_sh64_plt_entry == NULL)
3723
            {
3724
              elf_sh64_plt_entry = (bfd_big_endian (output_bfd) ?
3725
                                  elf_sh64_plt_entry_be : elf_sh64_plt_entry_le);
3726
            }
3727
          memcpy (splt->contents + h->plt.offset, elf_sh64_plt_entry,
3728
                  elf_sh64_sizeof_plt (info));
3729
          movi_3shori_putval (output_bfd,
3730
                              (sgot->output_section->vma
3731
                               + sgot->output_offset
3732
                               + got_offset),
3733
                              (splt->contents + h->plt.offset
3734
                               + elf_sh64_plt_symbol_offset (info)));
3735
 
3736
          /* Set bottom bit because its for a branch to SHmedia */
3737
          movi_shori_putval (output_bfd,
3738
                             -(h->plt.offset
3739
                              + elf_sh64_plt_plt0_offset (info) + 8)
3740
                             | 1,
3741
                             (splt->contents + h->plt.offset
3742
                              + elf_sh64_plt_plt0_offset (info)));
3743
        }
3744
      else
3745
        {
3746
          if (elf_sh64_pic_plt_entry == NULL)
3747
            {
3748
              elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ?
3749
                                      elf_sh64_pic_plt_entry_be :
3750
                                      elf_sh64_pic_plt_entry_le);
3751
            }
3752
          memcpy (splt->contents + h->plt.offset, elf_sh64_pic_plt_entry,
3753
                  elf_sh64_sizeof_plt (info));
3754
          movi_shori_putval (output_bfd, got_offset,
3755
                             (splt->contents + h->plt.offset
3756
                              + elf_sh64_plt_symbol_offset (info)));
3757
        }
3758
 
3759
      if (info->shared)
3760
        got_offset += GOT_BIAS;
3761
 
3762
      movi_shori_putval (output_bfd,
3763
                         plt_index * sizeof (Elf64_External_Rela),
3764
                         (splt->contents + h->plt.offset
3765
                          + elf_sh64_plt_reloc_offset (info)));
3766
 
3767
      /* Fill in the entry in the global offset table.  */
3768
      bfd_put_64 (output_bfd,
3769
                  (splt->output_section->vma
3770
                   + splt->output_offset
3771
                   + h->plt.offset
3772
                   + elf_sh64_plt_temp_offset (info)),
3773
                  sgot->contents + got_offset);
3774
 
3775
      /* Fill in the entry in the .rela.plt section.  */
3776
      rel.r_offset = (sgot->output_section->vma
3777
                      + sgot->output_offset
3778
                      + got_offset);
3779
      rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_JMP_SLOT64);
3780
      rel.r_addend = 0;
3781
      rel.r_addend = GOT_BIAS;
3782
      loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
3783
      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3784
 
3785
      if (!h->def_regular)
3786
        {
3787
          /* Mark the symbol as undefined, rather than as defined in
3788
             the .plt section.  Leave the value alone.  */
3789
          sym->st_shndx = SHN_UNDEF;
3790
        }
3791
    }
3792
 
3793
  if (h->got.offset != (bfd_vma) -1)
3794
    {
3795
      asection *sgot;
3796
      asection *srel;
3797
      Elf_Internal_Rela rel;
3798
      bfd_byte *loc;
3799
 
3800
      /* This symbol has an entry in the global offset table.  Set it
3801
         up.  */
3802
 
3803
      sgot = bfd_get_section_by_name (dynobj, ".got");
3804
      srel = bfd_get_section_by_name (dynobj, ".rela.got");
3805
      BFD_ASSERT (sgot != NULL && srel != NULL);
3806
 
3807
      rel.r_offset = (sgot->output_section->vma
3808
                      + sgot->output_offset
3809
                      + (h->got.offset &~ 1));
3810
 
3811
      /* If this is a -Bsymbolic link, and the symbol is defined
3812
         locally, we just want to emit a RELATIVE reloc.  Likewise if
3813
         the symbol was forced to be local because of a version file.
3814
         The entry in the global offset table will already have been
3815
         initialized in the relocate_section function.  */
3816
      if (info->shared
3817
          && (info->symbolic || h->dynindx == -1)
3818
          && h->def_regular)
3819
        {
3820
          rel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64);
3821
          rel.r_addend = (h->root.u.def.value
3822
                          + h->root.u.def.section->output_section->vma
3823
                          + h->root.u.def.section->output_offset);
3824
        }
3825
      else
3826
        {
3827
          bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
3828
          rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_GLOB_DAT64);
3829
          rel.r_addend = 0;
3830
        }
3831
 
3832
      loc = srel->contents;
3833
      loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
3834
      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3835
    }
3836
 
3837
  if (h->needs_copy)
3838
    {
3839
      asection *s;
3840
      Elf_Internal_Rela rel;
3841
      bfd_byte *loc;
3842
 
3843
      /* This symbol needs a copy reloc.  Set it up.  */
3844
 
3845
      BFD_ASSERT (h->dynindx != -1
3846
                  && (h->root.type == bfd_link_hash_defined
3847
                      || h->root.type == bfd_link_hash_defweak));
3848
 
3849
      s = bfd_get_section_by_name (h->root.u.def.section->owner,
3850
                                   ".rela.bss");
3851
      BFD_ASSERT (s != NULL);
3852
 
3853
      rel.r_offset = (h->root.u.def.value
3854
                      + h->root.u.def.section->output_section->vma
3855
                      + h->root.u.def.section->output_offset);
3856
      rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_COPY64);
3857
      rel.r_addend = 0;
3858
      loc = s->contents;
3859
      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
3860
      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3861
    }
3862
 
3863
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3864
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3865
      || h == elf_hash_table (info)->hgot)
3866
    sym->st_shndx = SHN_ABS;
3867
 
3868
  return TRUE;
3869
}
3870
 
3871
/* Finish up the dynamic sections.  */
3872
 
3873
static bfd_boolean
3874
sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
3875
                                    struct bfd_link_info *info)
3876
{
3877
  bfd *dynobj;
3878
  asection *sgot;
3879
  asection *sdyn;
3880
 
3881
  dynobj = elf_hash_table (info)->dynobj;
3882
 
3883
  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3884
  BFD_ASSERT (sgot != NULL);
3885
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3886
 
3887
  if (elf_hash_table (info)->dynamic_sections_created)
3888
    {
3889
      asection *splt;
3890
      Elf64_External_Dyn *dyncon, *dynconend;
3891
 
3892
      BFD_ASSERT (sdyn != NULL);
3893
 
3894
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
3895
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3896
      for (; dyncon < dynconend; dyncon++)
3897
        {
3898
          Elf_Internal_Dyn dyn;
3899
          const char *name;
3900
          asection *s;
3901
          struct elf_link_hash_entry *h;
3902
 
3903
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3904
 
3905
          switch (dyn.d_tag)
3906
            {
3907
            default:
3908
              break;
3909
 
3910
            case DT_INIT:
3911
              name = info->init_function;
3912
              goto get_sym;
3913
 
3914
            case DT_FINI:
3915
              name = info->fini_function;
3916
            get_sym:
3917
              if (dyn.d_un.d_val != 0)
3918
                {
3919
                  h = elf_link_hash_lookup (elf_hash_table (info), name,
3920
                                            FALSE, FALSE, TRUE);
3921
                  if (h != NULL && (h->other & STO_SH5_ISA32))
3922
                    {
3923
                      dyn.d_un.d_val |= 1;
3924
                      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3925
                    }
3926
                }
3927
              break;
3928
 
3929
            case DT_PLTGOT:
3930
              name = ".got";
3931
              goto get_vma;
3932
 
3933
            case DT_JMPREL:
3934
              name = ".rela.plt";
3935
            get_vma:
3936
              s = bfd_get_section_by_name (output_bfd, name);
3937
              BFD_ASSERT (s != NULL);
3938
              dyn.d_un.d_ptr = s->vma;
3939
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3940
              break;
3941
 
3942
            case DT_PLTRELSZ:
3943
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3944
              BFD_ASSERT (s != NULL);
3945
              dyn.d_un.d_val = s->size;
3946
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3947
              break;
3948
 
3949
            case DT_RELASZ:
3950
              /* My reading of the SVR4 ABI indicates that the
3951
                 procedure linkage table relocs (DT_JMPREL) should be
3952
                 included in the overall relocs (DT_RELA).  This is
3953
                 what Solaris does.  However, UnixWare can not handle
3954
                 that case.  Therefore, we override the DT_RELASZ entry
3955
                 here to make it not include the JMPREL relocs.  Since
3956
                 the linker script arranges for .rela.plt to follow all
3957
                 other relocation sections, we don't have to worry
3958
                 about changing the DT_RELA entry.  */
3959
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3960
              if (s != NULL)
3961
                dyn.d_un.d_val -= s->size;
3962
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3963
              break;
3964
            }
3965
        }
3966
 
3967
      /* Fill in the first entry in the procedure linkage table.  */
3968
      splt = bfd_get_section_by_name (dynobj, ".plt");
3969
      if (splt && splt->size > 0)
3970
        {
3971
          if (info->shared)
3972
            {
3973
              if (elf_sh64_pic_plt_entry == NULL)
3974
                {
3975
                  elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ?
3976
                                          elf_sh64_pic_plt_entry_be :
3977
                                          elf_sh64_pic_plt_entry_le);
3978
                }
3979
              memcpy (splt->contents, elf_sh64_pic_plt_entry,
3980
                      elf_sh64_sizeof_plt (info));
3981
            }
3982
          else
3983
            {
3984
              if (elf_sh64_plt0_entry == NULL)
3985
                {
3986
                  elf_sh64_plt0_entry = (bfd_big_endian (output_bfd) ?
3987
                                       elf_sh64_plt0_entry_be :
3988
                                       elf_sh64_plt0_entry_le);
3989
                }
3990
              memcpy (splt->contents, elf_sh64_plt0_entry, PLT_ENTRY_SIZE);
3991
              movi_3shori_putval (output_bfd,
3992
                                  sgot->output_section->vma
3993
                                  + sgot->output_offset,
3994
                                  splt->contents
3995
                                  + elf_sh64_plt0_gotplt_offset (info));
3996
            }
3997
 
3998
          /* UnixWare sets the entsize of .plt to 8, although that doesn't
3999
             really seem like the right value.  */
4000
          elf_section_data (splt->output_section)->this_hdr.sh_entsize = 8;
4001
        }
4002
    }
4003
 
4004
  /* Fill in the first three entries in the global offset table.  */
4005
  if (sgot->size > 0)
4006
    {
4007
      if (sdyn == NULL)
4008
        bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents);
4009
      else
4010
        bfd_put_64 (output_bfd,
4011
                    sdyn->output_section->vma + sdyn->output_offset,
4012
                    sgot->contents);
4013
      bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
4014
      bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 16);
4015
    }
4016
 
4017
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8;
4018
 
4019
  return TRUE;
4020
}
4021
 
4022
/* Merge non visibility st_other attribute when the symbol comes from
4023
   a dynamic object.  */
4024
static void
4025
sh64_elf64_merge_symbol_attribute (struct elf_link_hash_entry *h,
4026
                                   const Elf_Internal_Sym *isym,
4027
                                   bfd_boolean definition,
4028
                                   bfd_boolean dynamic ATTRIBUTE_UNUSED)
4029
{
4030
  if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
4031
    {
4032
      unsigned char other;
4033
 
4034
      /* Take the balance of OTHER from the definition.  */
4035
      other = (definition ? isym->st_other : h->other);
4036
      other &= ~ ELF_ST_VISIBILITY (-1);
4037
      h->other = other | ELF_ST_VISIBILITY (h->other);
4038
    }
4039
 
4040
  return;
4041
}
4042
 
4043
static const struct bfd_elf_special_section sh64_elf64_special_sections[]=
4044
{
4045
  { STRING_COMMA_LEN (".cranges"), 0, SHT_PROGBITS, 0 },
4046
  { NULL,                       0, 0, 0,            0 }
4047
};
4048
 
4049
#define TARGET_BIG_SYM          bfd_elf64_sh64_vec
4050
#define TARGET_BIG_NAME         "elf64-sh64"
4051
#define TARGET_LITTLE_SYM       bfd_elf64_sh64l_vec
4052
#define TARGET_LITTLE_NAME      "elf64-sh64l"
4053
#define ELF_ARCH                bfd_arch_sh
4054
#define ELF_MACHINE_CODE        EM_SH
4055
#define ELF_MAXPAGESIZE         128
4056
 
4057
#define elf_symbol_leading_char '_'
4058
 
4059
#define bfd_elf64_bfd_reloc_type_lookup sh_elf64_reloc_type_lookup
4060
#define bfd_elf64_bfd_reloc_name_lookup \
4061
                                        sh_elf64_reloc_name_lookup
4062
#define elf_info_to_howto               sh_elf64_info_to_howto
4063
 
4064
/* Note: there's no relaxation at present.  */
4065
 
4066
#define elf_backend_relocate_section    sh_elf64_relocate_section
4067
#define bfd_elf64_bfd_get_relocated_section_contents \
4068
                                        sh_elf64_get_relocated_section_contents
4069
#define elf_backend_object_p            sh_elf64_set_mach_from_flags
4070
#define bfd_elf64_bfd_set_private_flags \
4071
                                        sh_elf64_set_private_flags
4072
#define bfd_elf64_bfd_copy_private_bfd_data \
4073
                                        sh_elf64_copy_private_data
4074
#define bfd_elf64_bfd_merge_private_bfd_data \
4075
                                        sh_elf64_merge_private_data
4076
#define elf_backend_fake_sections       sh64_elf64_fake_sections
4077
 
4078
#define elf_backend_gc_mark_hook        sh_elf64_gc_mark_hook
4079
#define elf_backend_check_relocs        sh_elf64_check_relocs
4080
 
4081
#define elf_backend_can_gc_sections     1
4082
 
4083
#define elf_backend_get_symbol_type     sh64_elf64_get_symbol_type
4084
 
4085
#define elf_backend_add_symbol_hook     sh64_elf64_add_symbol_hook
4086
 
4087
#define elf_backend_link_output_symbol_hook \
4088
        sh64_elf64_link_output_symbol_hook
4089
 
4090
#define elf_backend_merge_symbol_attribute \
4091
        sh64_elf64_merge_symbol_attribute
4092
 
4093
#define elf_backend_final_write_processing \
4094
        sh64_elf64_final_write_processing
4095
 
4096
#define elf_backend_create_dynamic_sections \
4097
                                        sh64_elf64_create_dynamic_sections
4098
#define bfd_elf64_bfd_link_hash_table_create \
4099
                                        sh64_elf64_link_hash_table_create
4100
#define elf_backend_adjust_dynamic_symbol \
4101
                                        sh64_elf64_adjust_dynamic_symbol
4102
#define elf_backend_size_dynamic_sections \
4103
                                        sh64_elf64_size_dynamic_sections
4104
#define elf_backend_omit_section_dynsym \
4105
  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4106
#define elf_backend_finish_dynamic_symbol \
4107
                                        sh64_elf64_finish_dynamic_symbol
4108
#define elf_backend_finish_dynamic_sections \
4109
                                        sh64_elf64_finish_dynamic_sections
4110
#define elf_backend_special_sections    sh64_elf64_special_sections
4111
 
4112
#define elf_backend_want_got_plt        1
4113
#define elf_backend_plt_readonly        1
4114
#define elf_backend_want_plt_sym        0
4115
#define elf_backend_got_header_size     24
4116
 
4117
#include "elf64-target.h"
4118
 
4119
/* NetBSD support.  */
4120
#undef  TARGET_BIG_SYM
4121
#define TARGET_BIG_SYM                  bfd_elf64_sh64nbsd_vec
4122
#undef  TARGET_BIG_NAME
4123
#define TARGET_BIG_NAME                 "elf64-sh64-nbsd"
4124
#undef  TARGET_LITTLE_SYM
4125
#define TARGET_LITTLE_SYM               bfd_elf64_sh64lnbsd_vec
4126
#undef  TARGET_LITTLE_NAME
4127
#define TARGET_LITTLE_NAME              "elf64-sh64l-nbsd"
4128
#undef  ELF_MAXPAGESIZE
4129
#define ELF_MAXPAGESIZE                 0x10000
4130
#undef  elf_symbol_leading_char
4131
#define elf_symbol_leading_char         0
4132
 
4133
#define elf64_bed                       elf64_sh64_nbsd_bed
4134
 
4135
#include "elf64-target.h"
4136
 
4137
/* Linux support.  */
4138
#undef  TARGET_BIG_SYM
4139
#define TARGET_BIG_SYM                  bfd_elf64_sh64blin_vec
4140
#undef  TARGET_BIG_NAME
4141
#define TARGET_BIG_NAME                 "elf64-sh64big-linux"
4142
#undef  TARGET_LITTLE_SYM
4143
#define TARGET_LITTLE_SYM               bfd_elf64_sh64lin_vec
4144
#undef  TARGET_LITTLE_NAME
4145
#define TARGET_LITTLE_NAME              "elf64-sh64-linux"
4146
#undef elf64_bed
4147
#define elf64_bed                       elf64_sh64_linux_bed
4148
 
4149
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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