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 (CONST_STRNEQ (name, ".rela")
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,
2370		       Elf_Internal_Rela *rel,
2371		       struct elf_link_hash_entry *h,
2372		       Elf_Internal_Sym *sym)
2373{
2374  if (h != NULL)
2375    switch (ELF64_R_TYPE (rel->r_info))
2376      {
2377      case R_SH_GNU_VTINHERIT:
2378      case R_SH_GNU_VTENTRY:
2379	return NULL;
2380      }
2381
2382  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2383}
2384
2385/* Look through the relocs for a section during the first phase.
2386   Since we don't do .gots or .plts, we just need to consider the
2387   virtual table relocs for gc.  */
2388
2389static bfd_boolean
2390sh_elf64_check_relocs (bfd *abfd, struct bfd_link_info *info,
2391		       asection *sec, const Elf_Internal_Rela *relocs)
2392{
2393  Elf_Internal_Shdr *symtab_hdr;
2394  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2395  const Elf_Internal_Rela *rel;
2396  const Elf_Internal_Rela *rel_end;
2397  bfd *dynobj;
2398  bfd_vma *local_got_offsets;
2399  asection *sgot;
2400  asection *srelgot;
2401  asection *sreloc;
2402
2403  sgot = NULL;
2404  srelgot = NULL;
2405  sreloc = NULL;
2406
2407  if (info->relocatable)
2408    return TRUE;
2409
2410  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2411  sym_hashes = elf_sym_hashes (abfd);
2412  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf64_External_Sym);
2413  if (!elf_bad_symtab (abfd))
2414    sym_hashes_end -= symtab_hdr->sh_info;
2415
2416  dynobj = elf_hash_table (info)->dynobj;
2417  local_got_offsets = elf_local_got_offsets (abfd);
2418
2419  rel_end = relocs + sec->reloc_count;
2420  for (rel = relocs; rel < rel_end; rel++)
2421    {
2422      struct elf_link_hash_entry *h;
2423      unsigned long r_symndx;
2424
2425      r_symndx = ELF64_R_SYM (rel->r_info);
2426      if (r_symndx < symtab_hdr->sh_info)
2427        h = NULL;
2428      else
2429	{
2430	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2431	  while (h->root.type == bfd_link_hash_indirect
2432		 || h->root.type == bfd_link_hash_warning)
2433	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
2434	}
2435
2436      /* Some relocs require a global offset table.  */
2437      if (dynobj == NULL)
2438	{
2439	  switch (ELF64_R_TYPE (rel->r_info))
2440	    {
2441	    case R_SH_GOTPLT_LOW16:
2442	    case R_SH_GOTPLT_MEDLOW16:
2443	    case R_SH_GOTPLT_MEDHI16:
2444	    case R_SH_GOTPLT_HI16:
2445	    case R_SH_GOTPLT10BY4:
2446	    case R_SH_GOTPLT10BY8:
2447	    case R_SH_GOT_LOW16:
2448	    case R_SH_GOT_MEDLOW16:
2449	    case R_SH_GOT_MEDHI16:
2450	    case R_SH_GOT_HI16:
2451	    case R_SH_GOT10BY4:
2452	    case R_SH_GOT10BY8:
2453	    case R_SH_GOTOFF_LOW16:
2454	    case R_SH_GOTOFF_MEDLOW16:
2455	    case R_SH_GOTOFF_MEDHI16:
2456	    case R_SH_GOTOFF_HI16:
2457	    case R_SH_GOTPC_LOW16:
2458	    case R_SH_GOTPC_MEDLOW16:
2459	    case R_SH_GOTPC_MEDHI16:
2460	    case R_SH_GOTPC_HI16:
2461	      elf_hash_table (info)->dynobj = dynobj = abfd;
2462	      if (! _bfd_elf_create_got_section (dynobj, info))
2463		return FALSE;
2464	      break;
2465
2466	    default:
2467	      break;
2468	    }
2469	}
2470
2471      switch (ELF64_R_TYPE (rel->r_info))
2472        {
2473	  /* This relocation describes the C++ object vtable hierarchy.
2474	     Reconstruct it for later use during GC.  */
2475        case R_SH_GNU_VTINHERIT:
2476          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2477            return FALSE;
2478          break;
2479
2480	  /* This relocation describes which C++ vtable entries are actually
2481	     used.  Record for later use during GC.  */
2482        case R_SH_GNU_VTENTRY:
2483          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2484            return FALSE;
2485          break;
2486
2487	force_got:
2488	case R_SH_GOT_LOW16:
2489	case R_SH_GOT_MEDLOW16:
2490	case R_SH_GOT_MEDHI16:
2491	case R_SH_GOT_HI16:
2492	case R_SH_GOT10BY4:
2493	case R_SH_GOT10BY8:
2494	  /* This symbol requires a global offset table entry.  */
2495
2496	  if (sgot == NULL)
2497	    {
2498	      sgot = bfd_get_section_by_name (dynobj, ".got");
2499	      BFD_ASSERT (sgot != NULL);
2500	    }
2501
2502	  if (srelgot == NULL
2503	      && (h != NULL || info->shared))
2504	    {
2505	      srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
2506	      if (srelgot == NULL)
2507		{
2508		  srelgot = bfd_make_section_with_flags (dynobj,
2509							 ".rela.got",
2510							 (SEC_ALLOC
2511							  | SEC_LOAD
2512							  | SEC_HAS_CONTENTS
2513							  | SEC_IN_MEMORY
2514							  | SEC_LINKER_CREATED
2515							  | SEC_READONLY));
2516		  if (srelgot == NULL
2517		      || ! bfd_set_section_alignment (dynobj, srelgot, 2))
2518		    return FALSE;
2519		}
2520	    }
2521
2522	  if (h != NULL)
2523	    {
2524	      if (h->type == STT_DATALABEL)
2525		{
2526		  struct elf_sh64_link_hash_entry *hsh;
2527
2528		  h = (struct elf_link_hash_entry *) h->root.u.i.link;
2529		  hsh = (struct elf_sh64_link_hash_entry *)h;
2530		  if (hsh->datalabel_got_offset != (bfd_vma) -1)
2531		    break;
2532
2533		  hsh->datalabel_got_offset = sgot->size;
2534		}
2535	      else
2536		{
2537		  if (h->got.offset != (bfd_vma) -1)
2538		    {
2539		      /* We have already allocated space in the .got.  */
2540		      break;
2541		    }
2542		  h->got.offset = sgot->size;
2543		}
2544
2545	      /* Make sure this symbol is output as a dynamic symbol.  */
2546	      if (h->dynindx == -1)
2547		{
2548		  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2549		    return FALSE;
2550		}
2551
2552	      srelgot->size += sizeof (Elf64_External_Rela);
2553	    }
2554	  else
2555	    {
2556     	      /* This is a global offset table entry for a local
2557		 symbol.  */
2558	      if (local_got_offsets == NULL)
2559		{
2560		  size_t size;
2561		  register unsigned int i;
2562
2563		  size = symtab_hdr->sh_info * sizeof (bfd_vma);
2564		  /* Reserve space for both the datalabel and
2565		     codelabel local GOT offsets.  */
2566		  size *= 2;
2567		  local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
2568		  if (local_got_offsets == NULL)
2569		    return FALSE;
2570		  elf_local_got_offsets (abfd) = local_got_offsets;
2571		  for (i = 0; i < symtab_hdr->sh_info; i++)
2572		    local_got_offsets[i] = (bfd_vma) -1;
2573		  for (; i < 2 * symtab_hdr->sh_info; i++)
2574		    local_got_offsets[i] = (bfd_vma) -1;
2575		}
2576	      if ((rel->r_addend & 1) != 0)
2577		{
2578		  if (local_got_offsets[symtab_hdr->sh_info
2579					+ r_symndx] != (bfd_vma) -1)
2580		    {
2581		      /* We have already allocated space in the .got.  */
2582		      break;
2583		    }
2584		  local_got_offsets[symtab_hdr->sh_info
2585				    + r_symndx] = sgot->size;
2586		}
2587	      else
2588		{
2589		  if (local_got_offsets[r_symndx] != (bfd_vma) -1)
2590		    {
2591		      /* We have already allocated space in the .got.  */
2592		      break;
2593		    }
2594		  local_got_offsets[r_symndx] = sgot->size;
2595		}
2596
2597	      if (info->shared)
2598		{
2599		  /* If we are generating a shared object, we need to
2600		     output a R_SH_RELATIVE reloc so that the dynamic
2601		     linker can adjust this GOT entry.  */
2602		  srelgot->size += sizeof (Elf64_External_Rela);
2603		}
2604	    }
2605
2606	  sgot->size += 8;
2607
2608	  break;
2609
2610	case R_SH_GOTPLT_LOW16:
2611	case R_SH_GOTPLT_MEDLOW16:
2612	case R_SH_GOTPLT_MEDHI16:
2613	case R_SH_GOTPLT_HI16:
2614	case R_SH_GOTPLT10BY4:
2615	case R_SH_GOTPLT10BY8:
2616	  /* If this is a local symbol, we resolve it directly without
2617	     creating a procedure linkage table entry.  */
2618
2619	  if (h == NULL
2620	      || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2621	      || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
2622	      || ! info->shared
2623	      || info->symbolic
2624	      || h->dynindx == -1
2625	      || h->got.offset != (bfd_vma) -1)
2626	    goto force_got;
2627
2628	  /* Make sure this symbol is output as a dynamic symbol.  */
2629	  if (h->dynindx == -1)
2630	    {
2631	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2632		return FALSE;
2633	    }
2634
2635	  h->needs_plt = 1;
2636
2637	  break;
2638
2639	case R_SH_PLT_LOW16:
2640	case R_SH_PLT_MEDLOW16:
2641	case R_SH_PLT_MEDHI16:
2642	case R_SH_PLT_HI16:
2643	  /* This symbol requires a procedure linkage table entry.  We
2644	     actually build the entry in adjust_dynamic_symbol,
2645	     because this might be a case of linking PIC code which is
2646	     never referenced by a dynamic object, in which case we
2647	     don't need to generate a procedure linkage table entry
2648	     after all.  */
2649
2650	  /* If this is a local symbol, we resolve it directly without
2651	     creating a procedure linkage table entry.  */
2652	  if (h == NULL)
2653	    continue;
2654
2655	  if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
2656	      || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
2657	    break;
2658
2659	  h->needs_plt = 1;
2660
2661	  break;
2662
2663	case R_SH_64:
2664	case R_SH_64_PCREL:
2665	  if (h != NULL)
2666	    h->non_got_ref = 1;
2667
2668	  /* If we are creating a shared library, and this is a reloc
2669	     against a global symbol, or a non PC relative reloc
2670	     against a local symbol, then we need to copy the reloc
2671	     into the shared library.  However, if we are linking with
2672	     -Bsymbolic, we do not need to copy a reloc against a
2673	     global symbol which is defined in an object we are
2674	     including in the link (i.e., DEF_REGULAR is set).  At
2675	     this point we have not seen all the input files, so it is
2676	     possible that DEF_REGULAR is not set now but will be set
2677	     later (it is never cleared).  We account for that
2678	     possibility below by storing information in the
2679	     pcrel_relocs_copied field of the hash table entry.  */
2680	  if (info->shared
2681	      && (sec->flags & SEC_ALLOC) != 0
2682	      && (ELF32_R_TYPE (rel->r_info) != R_SH_64_PCREL
2683		  || (h != NULL
2684		      && (! info->symbolic
2685			  || !h->def_regular))))
2686	    {
2687	      /* When creating a shared object, we must copy these
2688		 reloc types into the output file.  We create a reloc
2689		 section in dynobj and make room for this reloc.  */
2690	      if (sreloc == NULL)
2691		{
2692		  const char *name;
2693
2694		  name = (bfd_elf_string_from_elf_section
2695			  (abfd,
2696			   elf_elfheader (abfd)->e_shstrndx,
2697			   elf_section_data (sec)->rel_hdr.sh_name));
2698		  if (name == NULL)
2699		    return FALSE;
2700
2701		  BFD_ASSERT (CONST_STRNEQ (name, ".rela")
2702			      && strcmp (bfd_get_section_name (abfd, sec),
2703					 name + 5) == 0);
2704
2705		  sreloc = bfd_get_section_by_name (dynobj, name);
2706		  if (sreloc == NULL)
2707		    {
2708		      flagword flags;
2709
2710		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
2711			       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2712		      if ((sec->flags & SEC_ALLOC) != 0)
2713			flags |= SEC_ALLOC | SEC_LOAD;
2714		      sreloc = bfd_make_section_with_flags (dynobj,
2715							    name,
2716							    flags);
2717		      if (sreloc == NULL
2718			  || ! bfd_set_section_alignment (dynobj, sreloc, 2))
2719			return FALSE;
2720		    }
2721		}
2722
2723	      sreloc->size += sizeof (Elf64_External_Rela);
2724
2725	      /* If we are linking with -Bsymbolic, and this is a
2726		 global symbol, we count the number of PC relative
2727		 relocations we have entered for this symbol, so that
2728		 we can discard them again if the symbol is later
2729		 defined by a regular object.  Note that this function
2730		 is only called if we are using an elf_sh linker
2731		 hash table, which means that h is really a pointer to
2732		 an elf_sh_link_hash_entry.  */
2733	      if (h != NULL && info->symbolic
2734		  && ELF64_R_TYPE (rel->r_info) == R_SH_64_PCREL)
2735		{
2736		  struct elf_sh64_link_hash_entry *eh;
2737		  struct elf_sh64_pcrel_relocs_copied *p;
2738
2739		  eh = (struct elf_sh64_link_hash_entry *) h;
2740
2741		  for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
2742		    if (p->section == sreloc)
2743		      break;
2744
2745		  if (p == NULL)
2746		    {
2747		      p = ((struct elf_sh64_pcrel_relocs_copied *)
2748			   bfd_alloc (dynobj, sizeof *p));
2749		      if (p == NULL)
2750			return FALSE;
2751		      p->next = eh->pcrel_relocs_copied;
2752		      eh->pcrel_relocs_copied = p;
2753		      p->section = sreloc;
2754		      p->count = 0;
2755		    }
2756
2757		  ++p->count;
2758		}
2759	    }
2760
2761	  break;
2762        }
2763    }
2764
2765  return TRUE;
2766}
2767
2768static int
2769sh64_elf64_get_symbol_type (Elf_Internal_Sym * elf_sym, int type)
2770{
2771  if (ELF_ST_TYPE (elf_sym->st_info) == STT_DATALABEL)
2772    return STT_DATALABEL;
2773
2774  return type;
2775}
2776
2777/* FIXME: This is a copy of sh64_elf_add_symbol_hook in elf32-sh64.c.
2778   Either file can presumably exist without the other, but do not differ
2779   in elf-size-ness.  How to share?
2780
2781   Hook called by the linker routine which adds symbols from an object
2782   file.  We must make indirect symbols for undefined symbols marked with
2783   STT_DATALABEL, so relocations passing them will pick up that attribute
2784   and neutralize STO_SH5_ISA32 found on the symbol definition.
2785
2786   There is a problem, though: We want to fill in the hash-table entry for
2787   this symbol and signal to the caller that no further processing is
2788   needed.  But we don't have the index for this hash-table entry.  We
2789   rely here on that the current entry is the first hash-entry with NULL,
2790   which seems brittle.  Also, iterating over the hash-table to find that
2791   entry is a linear operation on the number of symbols in this input
2792   file, and this function should take constant time, so that's not good
2793   too.  Only comfort is that DataLabel references should only be found in
2794   hand-written assembly code and thus be rare.  FIXME: Talk maintainers
2795   into adding an option to elf_add_symbol_hook (preferably) for the index
2796   or the hash entry, alternatively adding the index to Elf_Internal_Sym
2797   (not so good).  */
2798
2799static bfd_boolean
2800sh64_elf64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
2801			    Elf_Internal_Sym *sym, const char **namep,
2802			    flagword *flagsp ATTRIBUTE_UNUSED,
2803			    asection **secp, bfd_vma *valp)
2804{
2805  /* We want to do this for relocatable as well as final linking.  */
2806  if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL
2807      && is_elf_hash_table (info->hash))
2808    {
2809      struct elf_link_hash_entry *h;
2810
2811      /* For relocatable links, we register the DataLabel sym in its own
2812	 right, and tweak the name when it's output.  Otherwise, we make
2813	 an indirect symbol of it.  */
2814      flagword flags
2815	= info->relocatable || info->emitrelocations
2816	? BSF_GLOBAL : BSF_GLOBAL | BSF_INDIRECT;
2817
2818      char *dl_name
2819	= bfd_malloc (strlen (*namep) + sizeof (DATALABEL_SUFFIX));
2820      struct elf_link_hash_entry ** sym_hash = elf_sym_hashes (abfd);
2821
2822      BFD_ASSERT (sym_hash != NULL);
2823
2824      /* Allocation may fail.  */
2825      if (dl_name == NULL)
2826	return FALSE;
2827
2828      strcpy (dl_name, *namep);
2829      strcat (dl_name, DATALABEL_SUFFIX);
2830
2831      h = (struct elf_link_hash_entry *)
2832	bfd_link_hash_lookup (info->hash, dl_name, FALSE, FALSE, FALSE);
2833
2834      if (h == NULL)
2835	{
2836	  /* No previous datalabel symbol.  Make one.  */
2837	  struct bfd_link_hash_entry *bh = NULL;
2838	  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2839
2840	  if (! _bfd_generic_link_add_one_symbol (info, abfd, dl_name,
2841						  flags, *secp, *valp,
2842						  *namep, FALSE,
2843						  bed->collect, &bh))
2844	    {
2845	      free (dl_name);
2846	      return FALSE;
2847	    }
2848
2849	  h = (struct elf_link_hash_entry *) bh;
2850	  h->non_elf = 0;
2851	  h->type = STT_DATALABEL;
2852	}
2853      else
2854	/* If a new symbol was created, it holds the allocated name.
2855	   Otherwise, we don't need it anymore and should deallocate it.  */
2856	free (dl_name);
2857
2858      if (h->type != STT_DATALABEL
2859	  || ((info->relocatable || info->emitrelocations)
2860	      && h->root.type != bfd_link_hash_undefined)
2861	  || (! info->relocatable && !info->emitrelocations
2862	      && h->root.type != bfd_link_hash_indirect))
2863	{
2864	  /* Make sure we don't get confused on invalid input.  */
2865	  (*_bfd_error_handler)
2866	    (_("%s: encountered datalabel symbol in input"),
2867	     bfd_get_filename (abfd));
2868	  bfd_set_error (bfd_error_bad_value);
2869	  return FALSE;
2870	}
2871
2872      /* Now find the hash-table slot for this entry and fill it in.  */
2873      while (*sym_hash != NULL)
2874	sym_hash++;
2875      *sym_hash = h;
2876
2877      /* Signal to caller to skip this symbol - we've handled it.  */
2878      *namep = NULL;
2879    }
2880
2881  return TRUE;
2882}
2883
2884/* This hook function is called before the linker writes out a global
2885   symbol.  For relocatable links, DataLabel symbols will be present in
2886   linker output.  We cut off the special suffix on those symbols, so the
2887   right name appears in the output.
2888
2889   When linking and emitting relocations, there can appear global symbols
2890   that are not referenced by relocs, but rather only implicitly through
2891   DataLabel references, a relation that is not visible to the linker.
2892   Since no stripping of global symbols in done when doing such linking,
2893   we don't need to look up and make sure to emit the main symbol for each
2894   DataLabel symbol.  */
2895
2896static bfd_boolean
2897sh64_elf64_link_output_symbol_hook (struct bfd_link_info *info,
2898				    const char *cname,
2899				    Elf_Internal_Sym *sym,
2900				    asection *input_sec ATTRIBUTE_UNUSED,
2901				    struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2902{
2903  char *name = (char *) cname;
2904
2905  if (info->relocatable || info->emitrelocations)
2906    {
2907      if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL)
2908	name[strlen (name) - strlen (DATALABEL_SUFFIX)] = 0;
2909    }
2910
2911  return TRUE;
2912}
2913
2914/* Set bit 0 on the entry address; it always points to SHmedia code.  This
2915   is mostly for symmetry with the 32-bit format, where code can be
2916   SHcompact and we need to make a distinction to make sure execution
2917   starts in the right ISA mode.  It is also convenient for a loader,
2918   which would otherwise have to set this bit when loading a TR register
2919   before jumping to the program entry.  */
2920
2921static void
2922sh64_elf64_final_write_processing (bfd *abfd,
2923				   bfd_boolean linker ATTRIBUTE_UNUSED)
2924{
2925  /* FIXME: Perhaps we shouldn't do this if the entry address was supplied
2926     numerically, but we currently lack the infrastructure to recognize
2927     that: The entry symbol, and info whether it is numeric or a symbol
2928     name is kept private in the linker.  */
2929  if (elf_elfheader (abfd)->e_type == ET_EXEC)
2930    elf_elfheader (abfd)->e_entry |= 1;
2931}
2932
2933/* First entry in an absolute procedure linkage table look like this.  */
2934
2935static const bfd_byte elf_sh64_plt0_entry_be[PLT_ENTRY_SIZE] =
2936{
2937  0xcc, 0x00, 0x01, 0x10, /* movi  .got.plt >> 48, r17 */
2938  0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 32) & 65535, r17 */
2939  0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 16) & 65535, r17 */
2940  0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
2941  0x8d, 0x10, 0x09, 0x90, /* ld.q  r17, 16, r25 */
2942  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
2943  0x8d, 0x10, 0x05, 0x10, /* ld.q  r17, 8, r17 */
2944  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
2945  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2946  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2947  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2948  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2949  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2950  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2951  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2952  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2953};
2954
2955static const bfd_byte elf_sh64_plt0_entry_le[PLT_ENTRY_SIZE] =
2956{
2957  0x10, 0x01, 0x00, 0xcc, /* movi  .got.plt >> 16, r17 */
2958  0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 32) & 65535, r17 */
2959  0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 16) & 65535, r17 */
2960  0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
2961  0x90, 0x09, 0x10, 0x8d, /* ld.q  r17, 16, r25 */
2962  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
2963  0x10, 0x05, 0x10, 0x8d, /* ld.q  r17, 8, r17 */
2964  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
2965  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2966  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2967  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2968  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2969  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2970  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2971  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2972  0xf0, 0xff, 0xf0, 0x6f, /* nop */
2973};
2974
2975/* Sebsequent entries in an absolute procedure linkage table look like
2976   this.  */
2977
2978static const bfd_byte elf_sh64_plt_entry_be[PLT_ENTRY_SIZE] =
2979{
2980  0xcc, 0x00, 0x01, 0x90, /* movi  nameN-in-GOT >> 48, r25 */
2981  0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 32) & 65535, r25 */
2982  0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 16) & 65535, r25 */
2983  0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
2984  0x8d, 0x90, 0x01, 0x90, /* ld.q  r25, 0, r25 */
2985  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
2986  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
2987  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2988  0xcc, 0x00, 0x01, 0x90, /* movi  (.+8-.PLT0) >> 16, r25 */
2989  0xc8, 0x00, 0x01, 0x90, /* shori (.+4-.PLT0) & 65535, r25 */
2990  0x6b, 0xf5, 0x66, 0x00, /* ptrel r25, tr0 */
2991  0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
2992  0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
2993  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
2994  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2995  0x6f, 0xf0, 0xff, 0xf0, /* nop */
2996};
2997
2998static const bfd_byte elf_sh64_plt_entry_le[PLT_ENTRY_SIZE] =
2999{
3000  0x90, 0x01, 0x00, 0xcc, /* movi  nameN-in-GOT >> 16, r25 */
3001  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3002  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3003  0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3004  0x90, 0x01, 0x90, 0x8d, /* ld.q  r25, 0, r25 */
3005  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3006  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3007  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3008  0x90, 0x01, 0x00, 0xcc, /* movi  (.+8-.PLT0) >> 16, r25 */
3009  0x90, 0x01, 0x00, 0xc8, /* shori (.+4-.PLT0) & 65535, r25 */
3010  0x00, 0x66, 0xf5, 0x6b, /* ptrel r25, tr0 */
3011  0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3012  0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3013  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3014  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3015  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3016};
3017
3018/* Entries in a PIC procedure linkage table look like this.  */
3019
3020static const bfd_byte elf_sh64_pic_plt_entry_be[PLT_ENTRY_SIZE] =
3021{
3022  0xcc, 0x00, 0x01, 0x90, /* movi  nameN@GOT >> 16, r25 */
3023  0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3024  0x40, 0xc3, 0x65, 0x90, /* ldx.q r12, r25, r25 */
3025  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3026  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3027  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3028  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3029  0x6f, 0xf0, 0xff, 0xf0, /* nop */
3030  0xce, 0x00, 0x01, 0x10, /* movi  -GOT_BIAS, r17 */
3031  0x00, 0xc9, 0x45, 0x10, /* add   r12, r17, r17 */
3032  0x8d, 0x10, 0x09, 0x90, /* ld.q  r17, 16, r25 */
3033  0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3034  0x8d, 0x10, 0x05, 0x10, /* ld.q  r17, 8, r17 */
3035  0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
3036  0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3037  0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3038};
3039
3040static const bfd_byte elf_sh64_pic_plt_entry_le[PLT_ENTRY_SIZE] =
3041{
3042  0x90, 0x01, 0x00, 0xcc, /* movi  nameN@GOT >> 16, r25 */
3043  0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3044  0x90, 0x65, 0xc3, 0x40, /* ldx.q r12, r25, r25 */
3045  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3046  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3047  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3048  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3049  0xf0, 0xff, 0xf0, 0x6f, /* nop */
3050  0x10, 0x01, 0x00, 0xce, /* movi  -GOT_BIAS, r17 */
3051  0x10, 0x45, 0xc9, 0x00, /* add   r12, r17, r17 */
3052  0x90, 0x09, 0x10, 0x8d, /* ld.q  r17, 16, r25 */
3053  0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3054  0x10, 0x05, 0x10, 0x8d, /* ld.q  r17, 8, r17 */
3055  0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3056  0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3057  0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3058};
3059
3060static const bfd_byte *elf_sh64_plt0_entry;
3061static const bfd_byte *elf_sh64_plt_entry;
3062static const bfd_byte *elf_sh64_pic_plt_entry;
3063
3064/* Create an entry in an sh ELF linker hash table.  */
3065
3066static struct bfd_hash_entry *
3067sh64_elf64_link_hash_newfunc (struct bfd_hash_entry *entry,
3068			      struct bfd_hash_table *table,
3069			      const char *string)
3070{
3071  struct elf_sh64_link_hash_entry *ret =
3072    (struct elf_sh64_link_hash_entry *) entry;
3073
3074  /* Allocate the structure if it has not already been allocated by a
3075     subclass.  */
3076  if (ret == (struct elf_sh64_link_hash_entry *) NULL)
3077    ret = ((struct elf_sh64_link_hash_entry *)
3078	   bfd_hash_allocate (table,
3079			      sizeof (struct elf_sh64_link_hash_entry)));
3080  if (ret == (struct elf_sh64_link_hash_entry *) NULL)
3081    return (struct bfd_hash_entry *) ret;
3082
3083  /* Call the allocation method of the superclass.  */
3084  ret = ((struct elf_sh64_link_hash_entry *)
3085	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3086				     table, string));
3087  if (ret != (struct elf_sh64_link_hash_entry *) NULL)
3088    {
3089      ret->pcrel_relocs_copied = NULL;
3090      ret->datalabel_got_offset = (bfd_vma) -1;
3091    }
3092
3093  return (struct bfd_hash_entry *) ret;
3094}
3095
3096/* Create an sh64 ELF linker hash table.  */
3097
3098static struct bfd_link_hash_table *
3099sh64_elf64_link_hash_table_create (bfd *abfd)
3100{
3101  struct elf_sh64_link_hash_table *ret;
3102
3103  ret = ((struct elf_sh64_link_hash_table *)
3104	 bfd_malloc (sizeof (struct elf_sh64_link_hash_table)));
3105  if (ret == (struct elf_sh64_link_hash_table *) NULL)
3106    return NULL;
3107
3108  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
3109				      sh64_elf64_link_hash_newfunc,
3110				      sizeof (struct elf_sh64_link_hash_entry)))
3111    {
3112      free (ret);
3113      return NULL;
3114    }
3115
3116  return &ret->root.root;
3117}
3118
3119inline static void
3120movi_shori_putval (bfd *output_bfd, unsigned long value, bfd_byte *addr)
3121{
3122  bfd_put_32 (output_bfd,
3123	      bfd_get_32 (output_bfd, addr)
3124	      | ((value >> 6) & 0x3fffc00),
3125	      addr);
3126  bfd_put_32 (output_bfd,
3127	      bfd_get_32 (output_bfd, addr + 4)
3128	      | ((value << 10) & 0x3fffc00),
3129	      addr + 4);
3130}
3131
3132inline static void
3133movi_3shori_putval (bfd *output_bfd, bfd_vma value, bfd_byte *addr)
3134{
3135  bfd_put_32 (output_bfd,
3136	      bfd_get_32 (output_bfd, addr)
3137	      | ((value >> 38) & 0x3fffc00),
3138	      addr);
3139  bfd_put_32 (output_bfd,
3140	      bfd_get_32 (output_bfd, addr + 4)
3141	      | ((value >> 22) & 0x3fffc00),
3142	      addr + 4);
3143  bfd_put_32 (output_bfd,
3144	      bfd_get_32 (output_bfd, addr + 8)
3145	      | ((value >> 6) & 0x3fffc00),
3146	      addr + 8);
3147  bfd_put_32 (output_bfd,
3148	      bfd_get_32 (output_bfd, addr + 12)
3149	      | ((value << 10) & 0x3fffc00),
3150	      addr + 12);
3151}
3152
3153/* Create dynamic sections when linking against a dynamic object.  */
3154
3155static bfd_boolean
3156sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3157{
3158  flagword flags, pltflags;
3159  register asection *s;
3160  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3161  int ptralign = 0;
3162
3163  switch (bed->s->arch_size)
3164    {
3165    case 32:
3166      ptralign = 2;
3167      break;
3168
3169    case 64:
3170      ptralign = 3;
3171      break;
3172
3173    default:
3174      bfd_set_error (bfd_error_bad_value);
3175      return FALSE;
3176    }
3177
3178  /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3179     .rel[a].bss sections.  */
3180
3181  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3182	   | SEC_LINKER_CREATED);
3183
3184  pltflags = flags;
3185  pltflags |= SEC_CODE;
3186  if (bed->plt_not_loaded)
3187    pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
3188  if (bed->plt_readonly)
3189    pltflags |= SEC_READONLY;
3190
3191  s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
3192  if (s == NULL
3193      || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3194    return FALSE;
3195
3196  if (bed->want_plt_sym)
3197    {
3198      /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3199	 .plt section.  */
3200      struct elf_link_hash_entry *h;
3201      struct bfd_link_hash_entry *bh = NULL;
3202
3203      if (! (_bfd_generic_link_add_one_symbol
3204	     (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3205	      (bfd_vma) 0, (const char *) NULL, FALSE, bed->collect, &bh)))
3206	return FALSE;
3207
3208      h = (struct elf_link_hash_entry *) bh;
3209      h->def_regular = 1;
3210      h->type = STT_OBJECT;
3211      elf_hash_table (info)->hplt = h;
3212
3213      if (info->shared
3214	  && ! bfd_elf_link_record_dynamic_symbol (info, h))
3215	return FALSE;
3216    }
3217
3218  s = bfd_make_section_with_flags (abfd,
3219				   bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
3220				   flags | SEC_READONLY);
3221  if (s == NULL
3222      || ! bfd_set_section_alignment (abfd, s, ptralign))
3223    return FALSE;
3224
3225  if (! _bfd_elf_create_got_section (abfd, info))
3226    return FALSE;
3227
3228  {
3229    const char *secname;
3230    char *relname;
3231    flagword secflags;
3232    asection *sec;
3233
3234    for (sec = abfd->sections; sec; sec = sec->next)
3235      {
3236	secflags = bfd_get_section_flags (abfd, sec);
3237	if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3238	    || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3239	  continue;
3240	secname = bfd_get_section_name (abfd, sec);
3241	relname = (char *) bfd_malloc (strlen (secname) + 6);
3242	strcpy (relname, ".rela");
3243	strcat (relname, secname);
3244	s = bfd_make_section_with_flags (abfd, relname,
3245					 flags | SEC_READONLY);
3246	if (s == NULL
3247	    || ! bfd_set_section_alignment (abfd, s, ptralign))
3248	  return FALSE;
3249      }
3250  }
3251
3252  if (bed->want_dynbss)
3253    {
3254      /* The .dynbss section is a place to put symbols which are defined
3255	 by dynamic objects, are referenced by regular objects, and are
3256	 not functions.  We must allocate space for them in the process
3257	 image and use a R_*_COPY reloc to tell the dynamic linker to
3258	 initialize them at run time.  The linker script puts the .dynbss
3259	 section into the .bss section of the final image.  */
3260      s = bfd_make_section_with_flags (abfd, ".dynbss",
3261				       SEC_ALLOC | SEC_LINKER_CREATED);
3262      if (s == NULL)
3263	return FALSE;
3264
3265      /* The .rel[a].bss section holds copy relocs.  This section is not
3266	 normally needed.  We need to create it here, though, so that the
3267	 linker will map it to an output section.  We can't just create it
3268	 only if we need it, because we will not know whether we need it
3269	 until we have seen all the input files, and the first time the
3270	 main linker code calls BFD after examining all the input files
3271	 (size_dynamic_sections) the input sections have already been
3272	 mapped to the output sections.  If the section turns out not to
3273	 be needed, we can discard it later.  We will never need this
3274	 section when generating a shared object, since they do not use
3275	 copy relocs.  */
3276      if (! info->shared)
3277	{
3278	  s = bfd_make_section_with_flags (abfd,
3279					   (bed->default_use_rela_p
3280					    ? ".rela.bss" : ".rel.bss"),
3281					   flags | SEC_READONLY);
3282	  if (s == NULL
3283	      || ! bfd_set_section_alignment (abfd, s, ptralign))
3284	    return FALSE;
3285	}
3286    }
3287
3288  return TRUE;
3289}
3290
3291/* Adjust a symbol defined by a dynamic object and referenced by a
3292   regular object.  The current definition is in some section of the
3293   dynamic object, but we're not including those sections.  We have to
3294   change the definition to something the rest of the link can
3295   understand.  */
3296
3297static bfd_boolean
3298sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
3299				  struct elf_link_hash_entry *h)
3300{
3301  bfd *dynobj;
3302  asection *s;
3303  unsigned int power_of_two;
3304
3305  dynobj = elf_hash_table (info)->dynobj;
3306
3307  /* Make sure we know what is going on here.  */
3308  BFD_ASSERT (dynobj != NULL
3309	      && (h->needs_plt
3310		  || h->u.weakdef != NULL
3311		  || (h->def_dynamic
3312		      && h->ref_regular
3313		      && !h->def_regular)));
3314
3315  /* If this is a function, put it in the procedure linkage table.  We
3316     will fill in the contents of the procedure linkage table later,
3317     when we know the address of the .got section.  */
3318  if (h->type == STT_FUNC
3319      || h->needs_plt)
3320    {
3321      if (! info->shared
3322	  && !h->def_dynamic
3323	  && !h->ref_dynamic)
3324	{
3325	  /* This case can occur if we saw a PLT reloc in an input
3326	     file, but the symbol was never referred to by a dynamic
3327	     object.  In such a case, we don't actually need to build
3328	     a procedure linkage table, and we can just do a REL64
3329	     reloc instead.  */
3330	  BFD_ASSERT (h->needs_plt);
3331	  return TRUE;
3332	}
3333
3334      /* Make sure this symbol is output as a dynamic symbol.  */
3335      if (h->dynindx == -1)
3336	{
3337	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
3338	    return FALSE;
3339	}
3340
3341      s = bfd_get_section_by_name (dynobj, ".plt");
3342      BFD_ASSERT (s != NULL);
3343
3344      /* If this is the first .plt entry, make room for the special
3345	 first entry.  */
3346      if (s->size == 0)
3347	s->size += PLT_ENTRY_SIZE;
3348
3349      /* If this symbol is not defined in a regular file, and we are
3350	 not generating a shared library, then set the symbol to this
3351	 location in the .plt.  This is required to make function
3352	 pointers compare as equal between the normal executable and
3353	 the shared library.  */
3354      if (! info->shared
3355	  && !h->def_regular)
3356	{
3357	  h->root.u.def.section = s;
3358	  h->root.u.def.value = s->size;
3359	}
3360
3361      h->plt.offset = s->size;
3362
3363      /* Make room for this entry.  */
3364      s->size += elf_sh64_sizeof_plt (info);
3365
3366      /* We also need to make an entry in the .got.plt section, which
3367	 will be placed in the .got section by the linker script.  */
3368
3369      s = bfd_get_section_by_name (dynobj, ".got.plt");
3370      BFD_ASSERT (s != NULL);
3371      s->size += 8;
3372
3373      /* We also need to make an entry in the .rela.plt section.  */
3374
3375      s = bfd_get_section_by_name (dynobj, ".rela.plt");
3376      BFD_ASSERT (s != NULL);
3377      s->size += sizeof (Elf64_External_Rela);
3378
3379      return TRUE;
3380    }
3381
3382  /* If this is a weak symbol, and there is a real definition, the
3383     processor independent code will have arranged for us to see the
3384     real definition first, and we can just use the same value.  */
3385  if (h->u.weakdef != NULL)
3386    {
3387      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3388		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
3389      h->root.u.def.section = h->u.weakdef->root.u.def.section;
3390      h->root.u.def.value = h->u.weakdef->root.u.def.value;
3391      return TRUE;
3392    }
3393
3394  /* This is a reference to a symbol defined by a dynamic object which
3395     is not a function.  */
3396
3397  /* If we are creating a shared library, we must presume that the
3398     only references to the symbol are via the global offset table.
3399     For such cases we need not do anything here; the relocations will
3400     be handled correctly by relocate_section.  */
3401  if (info->shared)
3402    return TRUE;
3403
3404  /* If there are no references to this symbol that do not use the
3405     GOT, we don't need to generate a copy reloc.  */
3406  if (!h->non_got_ref)
3407    return TRUE;
3408
3409  if (h->size == 0)
3410    {
3411      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
3412			     h->root.root.string);
3413      return TRUE;
3414    }
3415
3416  /* We must allocate the symbol in our .dynbss section, which will
3417     become part of the .bss section of the executable.  There will be
3418     an entry for this symbol in the .dynsym section.  The dynamic
3419     object will contain position independent code, so all references
3420     from the dynamic object to this symbol will go through the global
3421     offset table.  The dynamic linker will use the .dynsym entry to
3422     determine the address it must put in the global offset table, so
3423     both the dynamic object and the regular object will refer to the
3424     same memory location for the variable.  */
3425
3426  s = bfd_get_section_by_name (dynobj, ".dynbss");
3427  BFD_ASSERT (s != NULL);
3428
3429  /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
3430     copy the initial value out of the dynamic object and into the
3431     runtime process image.  We need to remember the offset into the
3432     .rela.bss section we are going to use.  */
3433  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3434    {
3435      asection *srel;
3436
3437      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
3438      BFD_ASSERT (srel != NULL);
3439      srel->size += sizeof (Elf64_External_Rela);
3440      h->needs_copy = 1;
3441    }
3442
3443  /* We need to figure out the alignment required for this symbol.  I
3444     have no idea how ELF linkers handle this.  */
3445  power_of_two = bfd_log2 (h->size);
3446  if (power_of_two > 3)
3447    power_of_two = 3;
3448
3449  /* Apply the required alignment.  */
3450  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3451  if (power_of_two > bfd_get_section_alignment (dynobj, s))
3452    {
3453      if (! bfd_set_section_alignment (dynobj, s, power_of_two))
3454	return FALSE;
3455    }
3456
3457  /* Define the symbol as being at this point in the section.  */
3458  h->root.u.def.section = s;
3459  h->root.u.def.value = s->size;
3460
3461  /* Increment the section size to make room for the symbol.  */
3462  s->size += h->size;
3463
3464  return TRUE;
3465}
3466
3467/* This function is called via sh_elf_link_hash_traverse if we are
3468   creating a shared object with -Bsymbolic.  It discards the space
3469   allocated to copy PC relative relocs against symbols which are
3470   defined in regular objects.  We allocated space for them in the
3471   check_relocs routine, but we won't fill them in in the
3472   relocate_section routine.  */
3473
3474static bfd_boolean
3475sh64_elf64_discard_copies (struct elf_sh64_link_hash_entry *h,
3476			   void *ignore ATTRIBUTE_UNUSED)
3477{
3478  struct elf_sh64_pcrel_relocs_copied *s;
3479
3480  if (h->root.root.type == bfd_link_hash_warning)
3481    h = (struct elf_sh64_link_hash_entry *) h->root.root.u.i.link;
3482
3483  /* We only discard relocs for symbols defined in a regular object.  */
3484  if (!h->root.def_regular)
3485    return TRUE;
3486
3487  for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
3488    s->section->size -= s->count * sizeof (Elf64_External_Rela);
3489
3490  return TRUE;
3491}
3492
3493/* Set the sizes of the dynamic sections.  */
3494
3495static bfd_boolean
3496sh64_elf64_size_dynamic_sections (bfd *output_bfd,
3497				  struct bfd_link_info *info)
3498{
3499  bfd *dynobj;
3500  asection *s;
3501  bfd_boolean plt;
3502  bfd_boolean relocs;
3503  bfd_boolean reltext;
3504
3505  dynobj = elf_hash_table (info)->dynobj;
3506  BFD_ASSERT (dynobj != NULL);
3507
3508  if (elf_hash_table (info)->dynamic_sections_created)
3509    {
3510      /* Set the contents of the .interp section to the interpreter.  */
3511      if (info->executable)
3512	{
3513	  s = bfd_get_section_by_name (dynobj, ".interp");
3514	  BFD_ASSERT (s != NULL);
3515	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3516	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3517	}
3518    }
3519  else
3520    {
3521      /* We may have created entries in the .rela.got section.
3522	 However, if we are not creating the dynamic sections, we will
3523	 not actually use these entries.  Reset the size of .rela.got,
3524	 which will cause it to get stripped from the output file
3525	 below.  */
3526      s = bfd_get_section_by_name (dynobj, ".rela.got");
3527      if (s != NULL)
3528	s->size = 0;
3529    }
3530
3531  /* If this is a -Bsymbolic shared link, then we need to discard all
3532     PC relative relocs against symbols defined in a regular object.
3533     We allocated space for them in the check_relocs routine, but we
3534     will not fill them in in the relocate_section routine.  */
3535  if (info->shared && info->symbolic)
3536    sh64_elf64_link_hash_traverse (sh64_elf64_hash_table (info),
3537				   sh64_elf64_discard_copies, NULL);
3538
3539  /* The check_relocs and adjust_dynamic_symbol entry points have
3540     determined the sizes of the various dynamic sections.  Allocate
3541     memory for them.  */
3542  plt = FALSE;
3543  relocs = FALSE;
3544  reltext = FALSE;
3545  for (s = dynobj->sections; s != NULL; s = s->next)
3546    {
3547      const char *name;
3548
3549      if ((s->flags & SEC_LINKER_CREATED) == 0)
3550	continue;
3551
3552      /* It's OK to base decisions on the section name, because none
3553	 of the dynobj section names depend upon the input files.  */
3554      name = bfd_get_section_name (dynobj, s);
3555
3556      if (strcmp (name, ".plt") == 0)
3557	{
3558	  /* Remember whether there is a PLT.  */
3559	  plt = s->size != 0;
3560	}
3561      else if (CONST_STRNEQ (name, ".rela"))
3562	{
3563	  if (s->size != 0)
3564	    {
3565	      asection *target;
3566
3567	      /* Remember whether there are any reloc sections other
3568		 than .rela.plt.  */
3569	      if (strcmp (name, ".rela.plt") != 0)
3570		{
3571		  const char *outname;
3572
3573		  relocs = TRUE;
3574
3575		  /* If this relocation section applies to a read only
3576		     section, then we probably need a DT_TEXTREL
3577		     entry.  The entries in the .rela.plt section
3578		     really apply to the .got section, which we
3579		     created ourselves and so know is not readonly.  */
3580		  outname = bfd_get_section_name (output_bfd,
3581						  s->output_section);
3582		  target = bfd_get_section_by_name (output_bfd, outname + 5);
3583		  if (target != NULL
3584		      && (target->flags & SEC_READONLY) != 0
3585		      && (target->flags & SEC_ALLOC) != 0)
3586		    reltext = TRUE;
3587		}
3588
3589	      /* We use the reloc_count field as a counter if we need
3590		 to copy relocs into the output file.  */
3591	      s->reloc_count = 0;
3592	    }
3593	}
3594      else if (! CONST_STRNEQ (name, ".got")
3595	       && strcmp (name, ".dynbss") != 0)
3596	{
3597	  /* It's not one of our sections, so don't allocate space.  */
3598	  continue;
3599	}
3600
3601      if (s->size == 0)
3602	{
3603	  /* If we don't need this section, strip it from the
3604	     output file.  This is mostly to handle .rela.bss and
3605	     .rela.plt.  We must create both sections in
3606	     create_dynamic_sections, because they must be created
3607	     before the linker maps input sections to output
3608	     sections.  The linker does that before
3609	     adjust_dynamic_symbol is called, and it is that
3610	     function which decides whether anything needs to go
3611	     into these sections.  */
3612	  s->flags |= SEC_EXCLUDE;
3613	  continue;
3614	}
3615
3616      if ((s->flags & SEC_HAS_CONTENTS) == 0)
3617	continue;
3618
3619      /* Allocate memory for the section contents.  */
3620      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3621      if (s->contents == NULL)
3622	return FALSE;
3623    }
3624
3625  if (elf_hash_table (info)->dynamic_sections_created)
3626    {
3627      /* Add some entries to the .dynamic section.  We fill in the
3628	 values later, in sh64_elf64_finish_dynamic_sections, but we
3629	 must add the entries now so that we get the correct size for
3630	 the .dynamic section.  The DT_DEBUG entry is filled in by the
3631	 dynamic linker and used by the debugger.  */
3632      if (info->executable)
3633	{
3634	  if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
3635	    return FALSE;
3636	}
3637
3638      if (plt)
3639	{
3640	  if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
3641	      || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3642	      || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
3643	      || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
3644	    return FALSE;
3645	}
3646
3647      if (relocs)
3648	{
3649	  if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
3650	      || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
3651	      || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
3652					      sizeof (Elf64_External_Rela)))
3653	    return FALSE;
3654	}
3655
3656      if (reltext)
3657	{
3658	  if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
3659	    return FALSE;
3660	}
3661    }
3662
3663  return TRUE;
3664}
3665
3666/* Finish up dynamic symbol handling.  We set the contents of various
3667   dynamic sections here.  */
3668
3669static bfd_boolean
3670sh64_elf64_finish_dynamic_symbol (bfd *output_bfd,
3671				  struct bfd_link_info *info,
3672				  struct elf_link_hash_entry *h,
3673				  Elf_Internal_Sym *sym)
3674{
3675  bfd *dynobj;
3676
3677  dynobj = elf_hash_table (info)->dynobj;
3678
3679  if (h->plt.offset != (bfd_vma) -1)
3680    {
3681      asection *splt;
3682      asection *sgot;
3683      asection *srel;
3684
3685      bfd_vma plt_index;
3686      bfd_vma got_offset;
3687      Elf_Internal_Rela rel;
3688      bfd_byte *loc;
3689
3690      /* This symbol has an entry in the procedure linkage table.  Set
3691	 it up.  */
3692
3693      BFD_ASSERT (h->dynindx != -1);
3694
3695      splt = bfd_get_section_by_name (dynobj, ".plt");
3696      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3697      srel = bfd_get_section_by_name (dynobj, ".rela.plt");
3698      BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
3699
3700      /* Get the index in the procedure linkage table which
3701	 corresponds to this symbol.  This is the index of this symbol
3702	 in all the symbols for which we are making plt entries.  The
3703	 first entry in the procedure linkage table is reserved.  */
3704      plt_index = h->plt.offset / elf_sh64_sizeof_plt (info) - 1;
3705
3706      /* Get the offset into the .got table of the entry that
3707	 corresponds to this function.  Each .got entry is 8 bytes.
3708	 The first three are reserved.  */
3709      got_offset = (plt_index + 3) * 8;
3710
3711      if (info->shared)
3712	got_offset -= GOT_BIAS;
3713
3714      /* Fill in the entry in the procedure linkage table.  */
3715      if (! info->shared)
3716	{
3717	  if (elf_sh64_plt_entry == NULL)
3718	    {
3719	      elf_sh64_plt_entry = (bfd_big_endian (output_bfd) ?
3720				  elf_sh64_plt_entry_be : elf_sh64_plt_entry_le);
3721	    }
3722	  memcpy (splt->contents + h->plt.offset, elf_sh64_plt_entry,
3723		  elf_sh64_sizeof_plt (info));
3724	  movi_3shori_putval (output_bfd,
3725			      (sgot->output_section->vma
3726			       + sgot->output_offset
3727			       + got_offset),
3728			      (splt->contents + h->plt.offset
3729			       + elf_sh64_plt_symbol_offset (info)));
3730
3731	  /* Set bottom bit because its for a branch to SHmedia */
3732	  movi_shori_putval (output_bfd,
3733			     -(h->plt.offset
3734			      + elf_sh64_plt_plt0_offset (info) + 8)
3735			     | 1,
3736			     (splt->contents + h->plt.offset
3737			      + elf_sh64_plt_plt0_offset (info)));
3738	}
3739      else
3740	{
3741	  if (elf_sh64_pic_plt_entry == NULL)
3742	    {
3743	      elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ?
3744				      elf_sh64_pic_plt_entry_be :
3745				      elf_sh64_pic_plt_entry_le);
3746	    }
3747	  memcpy (splt->contents + h->plt.offset, elf_sh64_pic_plt_entry,
3748		  elf_sh64_sizeof_plt (info));
3749	  movi_shori_putval (output_bfd, got_offset,
3750			     (splt->contents + h->plt.offset
3751			      + elf_sh64_plt_symbol_offset (info)));
3752	}
3753
3754      if (info->shared)
3755	got_offset += GOT_BIAS;
3756
3757      movi_shori_putval (output_bfd,
3758			 plt_index * sizeof (Elf64_External_Rela),
3759			 (splt->contents + h->plt.offset
3760			  + elf_sh64_plt_reloc_offset (info)));
3761
3762      /* Fill in the entry in the global offset table.  */
3763      bfd_put_64 (output_bfd,
3764		  (splt->output_section->vma
3765		   + splt->output_offset
3766		   + h->plt.offset
3767		   + elf_sh64_plt_temp_offset (info)),
3768		  sgot->contents + got_offset);
3769
3770      /* Fill in the entry in the .rela.plt section.  */
3771      rel.r_offset = (sgot->output_section->vma
3772		      + sgot->output_offset
3773		      + got_offset);
3774      rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_JMP_SLOT64);
3775      rel.r_addend = 0;
3776      rel.r_addend = GOT_BIAS;
3777      loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
3778      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3779
3780      if (!h->def_regular)
3781	{
3782	  /* Mark the symbol as undefined, rather than as defined in
3783	     the .plt section.  Leave the value alone.  */
3784	  sym->st_shndx = SHN_UNDEF;
3785	}
3786    }
3787
3788  if (h->got.offset != (bfd_vma) -1)
3789    {
3790      asection *sgot;
3791      asection *srel;
3792      Elf_Internal_Rela rel;
3793      bfd_byte *loc;
3794
3795      /* This symbol has an entry in the global offset table.  Set it
3796	 up.  */
3797
3798      sgot = bfd_get_section_by_name (dynobj, ".got");
3799      srel = bfd_get_section_by_name (dynobj, ".rela.got");
3800      BFD_ASSERT (sgot != NULL && srel != NULL);
3801
3802      rel.r_offset = (sgot->output_section->vma
3803		      + sgot->output_offset
3804		      + (h->got.offset &~ 1));
3805
3806      /* If this is a -Bsymbolic link, and the symbol is defined
3807	 locally, we just want to emit a RELATIVE reloc.  Likewise if
3808	 the symbol was forced to be local because of a version file.
3809	 The entry in the global offset table will already have been
3810	 initialized in the relocate_section function.  */
3811      if (info->shared
3812	  && (info->symbolic || h->dynindx == -1)
3813	  && h->def_regular)
3814	{
3815	  rel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64);
3816	  rel.r_addend = (h->root.u.def.value
3817			  + h->root.u.def.section->output_section->vma
3818			  + h->root.u.def.section->output_offset);
3819	}
3820      else
3821	{
3822	  bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
3823	  rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_GLOB_DAT64);
3824	  rel.r_addend = 0;
3825	}
3826
3827      loc = srel->contents;
3828      loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
3829      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3830    }
3831
3832  if (h->needs_copy)
3833    {
3834      asection *s;
3835      Elf_Internal_Rela rel;
3836      bfd_byte *loc;
3837
3838      /* This symbol needs a copy reloc.  Set it up.  */
3839
3840      BFD_ASSERT (h->dynindx != -1
3841		  && (h->root.type == bfd_link_hash_defined
3842		      || h->root.type == bfd_link_hash_defweak));
3843
3844      s = bfd_get_section_by_name (h->root.u.def.section->owner,
3845				   ".rela.bss");
3846      BFD_ASSERT (s != NULL);
3847
3848      rel.r_offset = (h->root.u.def.value
3849		      + h->root.u.def.section->output_section->vma
3850		      + h->root.u.def.section->output_offset);
3851      rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_COPY64);
3852      rel.r_addend = 0;
3853      loc = s->contents;
3854      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
3855      bfd_elf64_swap_reloca_out (output_bfd, &rel, loc);
3856    }
3857
3858  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3859  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3860      || h == elf_hash_table (info)->hgot)
3861    sym->st_shndx = SHN_ABS;
3862
3863  return TRUE;
3864}
3865
3866/* Finish up the dynamic sections.  */
3867
3868static bfd_boolean
3869sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
3870				    struct bfd_link_info *info)
3871{
3872  bfd *dynobj;
3873  asection *sgot;
3874  asection *sdyn;
3875
3876  dynobj = elf_hash_table (info)->dynobj;
3877
3878  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
3879  BFD_ASSERT (sgot != NULL);
3880  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3881
3882  if (elf_hash_table (info)->dynamic_sections_created)
3883    {
3884      asection *splt;
3885      Elf64_External_Dyn *dyncon, *dynconend;
3886
3887      BFD_ASSERT (sdyn != NULL);
3888
3889      dyncon = (Elf64_External_Dyn *) sdyn->contents;
3890      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3891      for (; dyncon < dynconend; dyncon++)
3892	{
3893	  Elf_Internal_Dyn dyn;
3894	  const char *name;
3895	  asection *s;
3896	  struct elf_link_hash_entry *h;
3897
3898	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3899
3900	  switch (dyn.d_tag)
3901	    {
3902	    default:
3903	      break;
3904
3905	    case DT_INIT:
3906	      name = info->init_function;
3907	      goto get_sym;
3908
3909	    case DT_FINI:
3910	      name = info->fini_function;
3911	    get_sym:
3912	      if (dyn.d_un.d_val != 0)
3913		{
3914		  h = elf_link_hash_lookup (elf_hash_table (info), name,
3915					    FALSE, FALSE, TRUE);
3916		  if (h != NULL && (h->other & STO_SH5_ISA32))
3917		    {
3918		      dyn.d_un.d_val |= 1;
3919		      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3920		    }
3921		}
3922	      break;
3923
3924	    case DT_PLTGOT:
3925	      name = ".got";
3926	      goto get_vma;
3927
3928	    case DT_JMPREL:
3929	      name = ".rela.plt";
3930	    get_vma:
3931	      s = bfd_get_section_by_name (output_bfd, name);
3932	      BFD_ASSERT (s != NULL);
3933	      dyn.d_un.d_ptr = s->vma;
3934	      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3935	      break;
3936
3937	    case DT_PLTRELSZ:
3938	      s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3939	      BFD_ASSERT (s != NULL);
3940	      dyn.d_un.d_val = s->size;
3941	      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3942	      break;
3943
3944	    case DT_RELASZ:
3945	      /* My reading of the SVR4 ABI indicates that the
3946		 procedure linkage table relocs (DT_JMPREL) should be
3947		 included in the overall relocs (DT_RELA).  This is
3948		 what Solaris does.  However, UnixWare can not handle
3949		 that case.  Therefore, we override the DT_RELASZ entry
3950		 here to make it not include the JMPREL relocs.  Since
3951		 the linker script arranges for .rela.plt to follow all
3952		 other relocation sections, we don't have to worry
3953		 about changing the DT_RELA entry.  */
3954	      s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3955	      if (s != NULL)
3956		dyn.d_un.d_val -= s->size;
3957	      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3958	      break;
3959	    }
3960	}
3961
3962      /* Fill in the first entry in the procedure linkage table.  */
3963      splt = bfd_get_section_by_name (dynobj, ".plt");
3964      if (splt && splt->size > 0)
3965	{
3966	  if (info->shared)
3967	    {
3968	      if (elf_sh64_pic_plt_entry == NULL)
3969		{
3970		  elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ?
3971					  elf_sh64_pic_plt_entry_be :
3972					  elf_sh64_pic_plt_entry_le);
3973		}
3974	      memcpy (splt->contents, elf_sh64_pic_plt_entry,
3975		      elf_sh64_sizeof_plt (info));
3976	    }
3977	  else
3978	    {
3979	      if (elf_sh64_plt0_entry == NULL)
3980		{
3981		  elf_sh64_plt0_entry = (bfd_big_endian (output_bfd) ?
3982				       elf_sh64_plt0_entry_be :
3983				       elf_sh64_plt0_entry_le);
3984		}
3985	      memcpy (splt->contents, elf_sh64_plt0_entry, PLT_ENTRY_SIZE);
3986	      movi_3shori_putval (output_bfd,
3987				  sgot->output_section->vma
3988				  + sgot->output_offset,
3989				  splt->contents
3990				  + elf_sh64_plt0_gotplt_offset (info));
3991	    }
3992
3993	  /* UnixWare sets the entsize of .plt to 8, although that doesn't
3994	     really seem like the right value.  */
3995	  elf_section_data (splt->output_section)->this_hdr.sh_entsize = 8;
3996	}
3997    }
3998
3999  /* Fill in the first three entries in the global offset table.  */
4000  if (sgot->size > 0)
4001    {
4002      if (sdyn == NULL)
4003	bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents);
4004      else
4005	bfd_put_64 (output_bfd,
4006		    sdyn->output_section->vma + sdyn->output_offset,
4007		    sgot->contents);
4008      bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
4009      bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 16);
4010    }
4011
4012  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8;
4013
4014  return TRUE;
4015}
4016
4017/* Merge non visibility st_other attribute when the symbol comes from
4018   a dynamic object.  */
4019static void
4020sh64_elf64_merge_symbol_attribute (struct elf_link_hash_entry *h,
4021				   const Elf_Internal_Sym *isym,
4022				   bfd_boolean definition,
4023				   bfd_boolean dynamic ATTRIBUTE_UNUSED)
4024{
4025  if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
4026    {
4027      unsigned char other;
4028
4029      /* Take the balance of OTHER from the definition.  */
4030      other = (definition ? isym->st_other : h->other);
4031      other &= ~ ELF_ST_VISIBILITY (-1);
4032      h->other = other | ELF_ST_VISIBILITY (h->other);
4033    }
4034
4035  return;
4036}
4037
4038static const struct bfd_elf_special_section sh64_elf64_special_sections[]=
4039{
4040  { STRING_COMMA_LEN (".cranges"), 0, SHT_PROGBITS, 0 },
4041  { NULL,                       0, 0, 0,            0 }
4042};
4043
4044#define TARGET_BIG_SYM		bfd_elf64_sh64_vec
4045#define TARGET_BIG_NAME		"elf64-sh64"
4046#define TARGET_LITTLE_SYM	bfd_elf64_sh64l_vec
4047#define TARGET_LITTLE_NAME	"elf64-sh64l"
4048#define ELF_ARCH		bfd_arch_sh
4049#define ELF_MACHINE_CODE	EM_SH
4050#define ELF_MAXPAGESIZE		128
4051
4052#define elf_symbol_leading_char '_'
4053
4054#define bfd_elf64_bfd_reloc_type_lookup	sh_elf64_reloc_type_lookup
4055#define elf_info_to_howto		sh_elf64_info_to_howto
4056
4057/* Note: there's no relaxation at present.  */
4058
4059#define elf_backend_relocate_section	sh_elf64_relocate_section
4060#define bfd_elf64_bfd_get_relocated_section_contents \
4061					sh_elf64_get_relocated_section_contents
4062#define elf_backend_object_p		sh_elf64_set_mach_from_flags
4063#define bfd_elf64_bfd_set_private_flags \
4064					sh_elf64_set_private_flags
4065#define bfd_elf64_bfd_copy_private_bfd_data \
4066					sh_elf64_copy_private_data
4067#define bfd_elf64_bfd_merge_private_bfd_data \
4068					sh_elf64_merge_private_data
4069#define elf_backend_fake_sections	sh64_elf64_fake_sections
4070
4071#define elf_backend_gc_mark_hook        sh_elf64_gc_mark_hook
4072#define elf_backend_check_relocs        sh_elf64_check_relocs
4073
4074#define elf_backend_can_gc_sections	1
4075
4076#define elf_backend_get_symbol_type	sh64_elf64_get_symbol_type
4077
4078#define elf_backend_add_symbol_hook	sh64_elf64_add_symbol_hook
4079
4080#define elf_backend_link_output_symbol_hook \
4081	sh64_elf64_link_output_symbol_hook
4082
4083#define	elf_backend_merge_symbol_attribute \
4084	sh64_elf64_merge_symbol_attribute
4085
4086#define elf_backend_final_write_processing \
4087 	sh64_elf64_final_write_processing
4088
4089#define elf_backend_create_dynamic_sections \
4090					sh64_elf64_create_dynamic_sections
4091#define bfd_elf64_bfd_link_hash_table_create \
4092					sh64_elf64_link_hash_table_create
4093#define elf_backend_adjust_dynamic_symbol \
4094					sh64_elf64_adjust_dynamic_symbol
4095#define elf_backend_size_dynamic_sections \
4096					sh64_elf64_size_dynamic_sections
4097#define elf_backend_omit_section_dynsym \
4098  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4099#define elf_backend_finish_dynamic_symbol \
4100					sh64_elf64_finish_dynamic_symbol
4101#define elf_backend_finish_dynamic_sections \
4102					sh64_elf64_finish_dynamic_sections
4103#define elf_backend_special_sections	sh64_elf64_special_sections
4104
4105#define elf_backend_want_got_plt	1
4106#define elf_backend_plt_readonly	1
4107#define elf_backend_want_plt_sym	0
4108#define elf_backend_got_header_size	24
4109
4110#include "elf64-target.h"
4111
4112/* NetBSD support.  */
4113#undef	TARGET_BIG_SYM
4114#define	TARGET_BIG_SYM			bfd_elf64_sh64nbsd_vec
4115#undef	TARGET_BIG_NAME
4116#define	TARGET_BIG_NAME			"elf64-sh64-nbsd"
4117#undef	TARGET_LITTLE_SYM
4118#define	TARGET_LITTLE_SYM		bfd_elf64_sh64lnbsd_vec
4119#undef	TARGET_LITTLE_NAME
4120#define	TARGET_LITTLE_NAME		"elf64-sh64l-nbsd"
4121#undef	ELF_MAXPAGESIZE
4122#define	ELF_MAXPAGESIZE			0x10000
4123#undef	elf_symbol_leading_char
4124#define	elf_symbol_leading_char		0
4125
4126#define	elf64_bed			elf64_sh64_nbsd_bed
4127
4128#include "elf64-target.h"
4129
4130/* Linux support.  */
4131#undef	TARGET_BIG_SYM
4132#define	TARGET_BIG_SYM			bfd_elf64_sh64blin_vec
4133#undef	TARGET_BIG_NAME
4134#define	TARGET_BIG_NAME			"elf64-sh64big-linux"
4135#undef	TARGET_LITTLE_SYM
4136#define	TARGET_LITTLE_SYM		bfd_elf64_sh64lin_vec
4137#undef	TARGET_LITTLE_NAME
4138#define	TARGET_LITTLE_NAME		"elf64-sh64-linux"
4139#undef elf64_bed
4140#define	elf64_bed			elf64_sh64_linux_bed
4141
4142#include "elf64-target.h"
4143