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