* bfd-in.h (bfd_get_section_limit): Define.
[platform/upstream/binutils.git] / bfd / elf32-sh.c
1 /* Renesas / SuperH SH specific support for 32-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4    Contributed by Ian Lance Taylor, Cygnus Support.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/sh.h"
28 #include "libiberty.h"
29
30 static bfd_reloc_status_type sh_elf_reloc
31   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
32 static bfd_reloc_status_type sh_elf_ignore_reloc
33   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
34 static reloc_howto_type *sh_elf_reloc_type_lookup
35   (bfd *, bfd_reloc_code_real_type);
36 static void sh_elf_info_to_howto
37   (bfd *, arelent *, Elf_Internal_Rela *);
38 static bfd_boolean sh_elf_set_private_flags
39   (bfd *, flagword);
40 static bfd_boolean sh_elf_copy_private_data
41   (bfd *, bfd *);
42 static bfd_boolean sh_elf_merge_private_data
43   (bfd *, bfd *);
44 static bfd_boolean sh_elf_set_mach_from_flags
45   (bfd *);
46 static bfd_boolean sh_elf_relax_section
47   (bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
48 static bfd_boolean sh_elf_relax_delete_bytes
49   (bfd *, asection *, bfd_vma, int);
50 static bfd_boolean sh_elf_align_loads
51   (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *);
52 static bfd_boolean sh_elf_swap_insns
53   (bfd *, asection *, void *, bfd_byte *, bfd_vma);
54 static bfd_boolean sh_elf_relocate_section
55   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
56    Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
57 static bfd_byte *sh_elf_get_relocated_section_contents
58   (bfd *, struct bfd_link_info *, struct bfd_link_order *, bfd_byte *,
59    bfd_boolean, asymbol **);
60 static void sh_elf_copy_indirect_symbol
61   (const struct elf_backend_data *, struct elf_link_hash_entry *,
62    struct elf_link_hash_entry *);
63 static int sh_elf_optimized_tls_reloc
64   (struct bfd_link_info *, int, int);
65 static bfd_boolean sh_elf_mkobject
66   (bfd *);
67 static bfd_boolean sh_elf_object_p
68   (bfd *);
69 static bfd_boolean sh_elf_check_relocs
70   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
71 static struct bfd_hash_entry *sh_elf_link_hash_newfunc
72   (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
73 static struct bfd_link_hash_table *sh_elf_link_hash_table_create
74   (bfd *);
75 static bfd_boolean sh_elf_adjust_dynamic_symbol
76   (struct bfd_link_info *, struct elf_link_hash_entry *);
77 static bfd_boolean sh_elf_size_dynamic_sections
78   (bfd *, struct bfd_link_info *);
79 static bfd_boolean sh_elf_finish_dynamic_symbol
80   (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
81    Elf_Internal_Sym *);
82 static bfd_boolean sh_elf_finish_dynamic_sections
83   (bfd *, struct bfd_link_info *);
84 static bfd_reloc_status_type sh_elf_reloc_loop
85   (int, bfd *, asection *, bfd_byte *, bfd_vma, asection *, bfd_vma,
86    bfd_vma);
87 static bfd_boolean create_got_section
88   (bfd *, struct bfd_link_info *);
89 static bfd_boolean sh_elf_create_dynamic_sections
90   (bfd *, struct bfd_link_info *);
91 static bfd_vma dtpoff_base
92   (struct bfd_link_info *);
93 static bfd_vma tpoff
94   (struct bfd_link_info *, bfd_vma);
95 static asection * sh_elf_gc_mark_hook
96   (asection *, struct bfd_link_info *, Elf_Internal_Rela *,
97    struct elf_link_hash_entry *, Elf_Internal_Sym *);
98 static bfd_boolean sh_elf_gc_sweep_hook
99   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
100 static bfd_boolean allocate_dynrelocs
101   (struct elf_link_hash_entry *, void *);
102 static bfd_boolean readonly_dynrelocs
103   (struct elf_link_hash_entry *, void *);
104 static enum elf_reloc_type_class sh_elf_reloc_type_class
105   (const Elf_Internal_Rela *);
106 #ifdef INCLUDE_SHMEDIA
107 inline static void movi_shori_putval (bfd *, unsigned long, char *);
108 #endif
109 static bfd_boolean elf32_shlin_grok_prstatus
110   (bfd *abfd, Elf_Internal_Note *note);
111 static bfd_boolean elf32_shlin_grok_psinfo
112   (bfd *abfd, Elf_Internal_Note *note);
113
114 /* The name of the dynamic interpreter.  This is put in the .interp
115    section.  */
116
117 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
118
119 static reloc_howto_type sh_elf_howto_table[] =
120 {
121   /* No relocation.  */
122   HOWTO (R_SH_NONE,             /* type */
123          0,                     /* rightshift */
124          0,                     /* size (0 = byte, 1 = short, 2 = long) */
125          0,                     /* bitsize */
126          FALSE,                 /* pc_relative */
127          0,                     /* bitpos */
128          complain_overflow_dont, /* complain_on_overflow */
129          sh_elf_ignore_reloc,   /* special_function */
130          "R_SH_NONE",           /* name */
131          FALSE,                 /* partial_inplace */
132          0,                     /* src_mask */
133          0,                     /* dst_mask */
134          FALSE),                /* pcrel_offset */
135
136   /* 32 bit absolute relocation.  Setting partial_inplace to TRUE and
137      src_mask to a non-zero value is similar to the COFF toolchain.  */
138   HOWTO (R_SH_DIR32,            /* type */
139          0,                     /* rightshift */
140          2,                     /* size (0 = byte, 1 = short, 2 = long) */
141          32,                    /* bitsize */
142          FALSE,                 /* pc_relative */
143          0,                     /* bitpos */
144          complain_overflow_bitfield, /* complain_on_overflow */
145          sh_elf_reloc,          /* special_function */
146          "R_SH_DIR32",          /* name */
147          TRUE,                  /* partial_inplace */
148          0xffffffff,            /* src_mask */
149          0xffffffff,            /* dst_mask */
150          FALSE),                /* pcrel_offset */
151
152   /* 32 bit PC relative relocation.  */
153   HOWTO (R_SH_REL32,            /* type */
154          0,                     /* rightshift */
155          2,                     /* size (0 = byte, 1 = short, 2 = long) */
156          32,                    /* bitsize */
157          TRUE,                  /* pc_relative */
158          0,                     /* bitpos */
159          complain_overflow_signed, /* complain_on_overflow */
160          sh_elf_ignore_reloc,   /* special_function */
161          "R_SH_REL32",          /* name */
162          TRUE,                  /* partial_inplace */
163          0xffffffff,            /* src_mask */
164          0xffffffff,            /* dst_mask */
165          TRUE),                 /* pcrel_offset */
166
167   /* 8 bit PC relative branch divided by 2.  */
168   HOWTO (R_SH_DIR8WPN,          /* type */
169          1,                     /* rightshift */
170          1,                     /* size (0 = byte, 1 = short, 2 = long) */
171          8,                     /* bitsize */
172          TRUE,                  /* pc_relative */
173          0,                     /* bitpos */
174          complain_overflow_signed, /* complain_on_overflow */
175          sh_elf_ignore_reloc,   /* special_function */
176          "R_SH_DIR8WPN",        /* name */
177          TRUE,                  /* partial_inplace */
178          0xff,                  /* src_mask */
179          0xff,                  /* dst_mask */
180          TRUE),                 /* pcrel_offset */
181
182   /* 12 bit PC relative branch divided by 2.  */
183   /* This cannot be partial_inplace because relaxation can't know the
184      eventual value of a symbol.  */
185   HOWTO (R_SH_IND12W,           /* type */
186          1,                     /* rightshift */
187          1,                     /* size (0 = byte, 1 = short, 2 = long) */
188          12,                    /* bitsize */
189          TRUE,                  /* pc_relative */
190          0,                     /* bitpos */
191          complain_overflow_signed, /* complain_on_overflow */
192          NULL,                  /* special_function */
193          "R_SH_IND12W",         /* name */
194          FALSE,                 /* partial_inplace */
195          0x0,                   /* src_mask */
196          0xfff,                 /* dst_mask */
197          TRUE),                 /* pcrel_offset */
198
199   /* 8 bit unsigned PC relative divided by 4.  */
200   HOWTO (R_SH_DIR8WPL,          /* type */
201          2,                     /* rightshift */
202          1,                     /* size (0 = byte, 1 = short, 2 = long) */
203          8,                     /* bitsize */
204          TRUE,                  /* pc_relative */
205          0,                     /* bitpos */
206          complain_overflow_unsigned, /* complain_on_overflow */
207          sh_elf_ignore_reloc,   /* special_function */
208          "R_SH_DIR8WPL",        /* name */
209          TRUE,                  /* partial_inplace */
210          0xff,                  /* src_mask */
211          0xff,                  /* dst_mask */
212          TRUE),                 /* pcrel_offset */
213
214   /* 8 bit unsigned PC relative divided by 2.  */
215   HOWTO (R_SH_DIR8WPZ,          /* type */
216          1,                     /* rightshift */
217          1,                     /* size (0 = byte, 1 = short, 2 = long) */
218          8,                     /* bitsize */
219          TRUE,                  /* pc_relative */
220          0,                     /* bitpos */
221          complain_overflow_unsigned, /* complain_on_overflow */
222          sh_elf_ignore_reloc,   /* special_function */
223          "R_SH_DIR8WPZ",        /* name */
224          TRUE,                  /* partial_inplace */
225          0xff,                  /* src_mask */
226          0xff,                  /* dst_mask */
227          TRUE),                 /* pcrel_offset */
228
229   /* 8 bit GBR relative.  FIXME: This only makes sense if we have some
230      special symbol for the GBR relative area, and that is not
231      implemented.  */
232   HOWTO (R_SH_DIR8BP,           /* type */
233          0,                     /* rightshift */
234          1,                     /* size (0 = byte, 1 = short, 2 = long) */
235          8,                     /* bitsize */
236          FALSE,                 /* pc_relative */
237          0,                     /* bitpos */
238          complain_overflow_unsigned, /* complain_on_overflow */
239          sh_elf_ignore_reloc,   /* special_function */
240          "R_SH_DIR8BP",         /* name */
241          FALSE,                 /* partial_inplace */
242          0,                     /* src_mask */
243          0xff,                  /* dst_mask */
244          TRUE),                 /* pcrel_offset */
245
246   /* 8 bit GBR relative divided by 2.  FIXME: This only makes sense if
247      we have some special symbol for the GBR relative area, and that
248      is not implemented.  */
249   HOWTO (R_SH_DIR8W,            /* type */
250          1,                     /* rightshift */
251          1,                     /* size (0 = byte, 1 = short, 2 = long) */
252          8,                     /* bitsize */
253          FALSE,                 /* pc_relative */
254          0,                     /* bitpos */
255          complain_overflow_unsigned, /* complain_on_overflow */
256          sh_elf_ignore_reloc,   /* special_function */
257          "R_SH_DIR8W",          /* name */
258          FALSE,                 /* partial_inplace */
259          0,                     /* src_mask */
260          0xff,                  /* dst_mask */
261          TRUE),                 /* pcrel_offset */
262
263   /* 8 bit GBR relative divided by 4.  FIXME: This only makes sense if
264      we have some special symbol for the GBR relative area, and that
265      is not implemented.  */
266   HOWTO (R_SH_DIR8L,            /* type */
267          2,                     /* rightshift */
268          1,                     /* size (0 = byte, 1 = short, 2 = long) */
269          8,                     /* bitsize */
270          FALSE,                 /* pc_relative */
271          0,                     /* bitpos */
272          complain_overflow_unsigned, /* complain_on_overflow */
273          sh_elf_ignore_reloc,   /* special_function */
274          "R_SH_DIR8L",          /* name */
275          FALSE,                 /* partial_inplace */
276          0,                     /* src_mask */
277          0xff,                  /* dst_mask */
278          TRUE),                 /* pcrel_offset */
279
280   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
281   HOWTO (R_SH_LOOP_START,       /* type */
282          1,                     /* rightshift */
283          1,                     /* size (0 = byte, 1 = short, 2 = long) */
284          8,                     /* bitsize */
285          FALSE,                 /* pc_relative */
286          0,                     /* bitpos */
287          complain_overflow_signed, /* complain_on_overflow */
288          sh_elf_ignore_reloc,   /* special_function */
289          "R_SH_LOOP_START",     /* name */
290          TRUE,                  /* partial_inplace */
291          0xff,                  /* src_mask */
292          0xff,                  /* dst_mask */
293          TRUE),                 /* pcrel_offset */
294
295   /* 8 bit PC relative divided by 2 - but specified in a very odd way.  */
296   HOWTO (R_SH_LOOP_END,         /* type */
297          1,                     /* rightshift */
298          1,                     /* size (0 = byte, 1 = short, 2 = long) */
299          8,                     /* bitsize */
300          FALSE,                 /* pc_relative */
301          0,                     /* bitpos */
302          complain_overflow_signed, /* complain_on_overflow */
303          sh_elf_ignore_reloc,   /* special_function */
304          "R_SH_LOOP_END",       /* name */
305          TRUE,                  /* partial_inplace */
306          0xff,                  /* src_mask */
307          0xff,                  /* dst_mask */
308          TRUE),                 /* pcrel_offset */
309
310   EMPTY_HOWTO (12),
311   EMPTY_HOWTO (13),
312   EMPTY_HOWTO (14),
313   EMPTY_HOWTO (15),
314   EMPTY_HOWTO (16),
315   EMPTY_HOWTO (17),
316   EMPTY_HOWTO (18),
317   EMPTY_HOWTO (19),
318   EMPTY_HOWTO (20),
319   EMPTY_HOWTO (21),
320
321   /* The remaining relocs are a GNU extension used for relaxing.  The
322      final pass of the linker never needs to do anything with any of
323      these relocs.  Any required operations are handled by the
324      relaxation code.  */
325
326   /* GNU extension to record C++ vtable hierarchy */
327   HOWTO (R_SH_GNU_VTINHERIT, /* type */
328          0,                     /* rightshift */
329          2,                     /* size (0 = byte, 1 = short, 2 = long) */
330          0,                     /* bitsize */
331          FALSE,                 /* pc_relative */
332          0,                     /* bitpos */
333          complain_overflow_dont, /* complain_on_overflow */
334          NULL,                  /* special_function */
335          "R_SH_GNU_VTINHERIT", /* name */
336          FALSE,                 /* partial_inplace */
337          0,                     /* src_mask */
338          0,                     /* dst_mask */
339          FALSE),                /* pcrel_offset */
340
341   /* GNU extension to record C++ vtable member usage */
342   HOWTO (R_SH_GNU_VTENTRY,     /* type */
343          0,                     /* rightshift */
344          2,                     /* size (0 = byte, 1 = short, 2 = long) */
345          0,                     /* bitsize */
346          FALSE,                 /* pc_relative */
347          0,                     /* bitpos */
348          complain_overflow_dont, /* complain_on_overflow */
349          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
350          "R_SH_GNU_VTENTRY",   /* name */
351          FALSE,                 /* partial_inplace */
352          0,                     /* src_mask */
353          0,                     /* dst_mask */
354          FALSE),                /* pcrel_offset */
355
356   /* An 8 bit switch table entry.  This is generated for an expression
357      such as ``.word L1 - L2''.  The offset holds the difference
358      between the reloc address and L2.  */
359   HOWTO (R_SH_SWITCH8,          /* type */
360          0,                     /* rightshift */
361          0,                     /* size (0 = byte, 1 = short, 2 = long) */
362          8,                     /* bitsize */
363          FALSE,                 /* pc_relative */
364          0,                     /* bitpos */
365          complain_overflow_unsigned, /* complain_on_overflow */
366          sh_elf_ignore_reloc,   /* special_function */
367          "R_SH_SWITCH8",        /* name */
368          FALSE,                 /* partial_inplace */
369          0,                     /* src_mask */
370          0,                     /* dst_mask */
371          TRUE),                 /* pcrel_offset */
372
373   /* A 16 bit switch table entry.  This is generated for an expression
374      such as ``.word L1 - L2''.  The offset holds the difference
375      between the reloc address and L2.  */
376   HOWTO (R_SH_SWITCH16,         /* type */
377          0,                     /* rightshift */
378          1,                     /* size (0 = byte, 1 = short, 2 = long) */
379          16,                    /* bitsize */
380          FALSE,                 /* pc_relative */
381          0,                     /* bitpos */
382          complain_overflow_unsigned, /* complain_on_overflow */
383          sh_elf_ignore_reloc,   /* special_function */
384          "R_SH_SWITCH16",       /* name */
385          FALSE,                 /* partial_inplace */
386          0,                     /* src_mask */
387          0,                     /* dst_mask */
388          TRUE),                 /* pcrel_offset */
389
390   /* A 32 bit switch table entry.  This is generated for an expression
391      such as ``.long L1 - L2''.  The offset holds the difference
392      between the reloc address and L2.  */
393   HOWTO (R_SH_SWITCH32,         /* type */
394          0,                     /* rightshift */
395          2,                     /* size (0 = byte, 1 = short, 2 = long) */
396          32,                    /* bitsize */
397          FALSE,                 /* pc_relative */
398          0,                     /* bitpos */
399          complain_overflow_unsigned, /* complain_on_overflow */
400          sh_elf_ignore_reloc,   /* special_function */
401          "R_SH_SWITCH32",       /* name */
402          FALSE,                 /* partial_inplace */
403          0,                     /* src_mask */
404          0,                     /* dst_mask */
405          TRUE),                 /* pcrel_offset */
406
407   /* Indicates a .uses pseudo-op.  The compiler will generate .uses
408      pseudo-ops when it finds a function call which can be relaxed.
409      The offset field holds the PC relative offset to the instruction
410      which loads the register used in the function call.  */
411   HOWTO (R_SH_USES,             /* type */
412          0,                     /* rightshift */
413          1,                     /* size (0 = byte, 1 = short, 2 = long) */
414          0,                     /* bitsize */
415          FALSE,                 /* pc_relative */
416          0,                     /* bitpos */
417          complain_overflow_unsigned, /* complain_on_overflow */
418          sh_elf_ignore_reloc,   /* special_function */
419          "R_SH_USES",           /* name */
420          FALSE,                 /* partial_inplace */
421          0,                     /* src_mask */
422          0,                     /* dst_mask */
423          TRUE),                 /* pcrel_offset */
424
425   /* The assembler will generate this reloc for addresses referred to
426      by the register loads associated with USES relocs.  The offset
427      field holds the number of times the address is referenced in the
428      object file.  */
429   HOWTO (R_SH_COUNT,            /* type */
430          0,                     /* rightshift */
431          1,                     /* size (0 = byte, 1 = short, 2 = long) */
432          0,                     /* bitsize */
433          FALSE,                 /* pc_relative */
434          0,                     /* bitpos */
435          complain_overflow_unsigned, /* complain_on_overflow */
436          sh_elf_ignore_reloc,   /* special_function */
437          "R_SH_COUNT",          /* name */
438          FALSE,                 /* partial_inplace */
439          0,                     /* src_mask */
440          0,                     /* dst_mask */
441          TRUE),                 /* pcrel_offset */
442
443   /* Indicates an alignment statement.  The offset field is the power
444      of 2 to which subsequent portions of the object file must be
445      aligned.  */
446   HOWTO (R_SH_ALIGN,            /* type */
447          0,                     /* rightshift */
448          1,                     /* size (0 = byte, 1 = short, 2 = long) */
449          0,                     /* bitsize */
450          FALSE,                 /* pc_relative */
451          0,                     /* bitpos */
452          complain_overflow_unsigned, /* complain_on_overflow */
453          sh_elf_ignore_reloc,   /* special_function */
454          "R_SH_ALIGN",  /* name */
455          FALSE,                 /* partial_inplace */
456          0,                     /* src_mask */
457          0,                     /* dst_mask */
458          TRUE),                 /* pcrel_offset */
459
460   /* The assembler will generate this reloc before a block of
461      instructions.  A section should be processed as assuming it
462      contains data, unless this reloc is seen.  */
463   HOWTO (R_SH_CODE,             /* type */
464          0,                     /* rightshift */
465          1,                     /* size (0 = byte, 1 = short, 2 = long) */
466          0,                     /* bitsize */
467          FALSE,                 /* pc_relative */
468          0,                     /* bitpos */
469          complain_overflow_unsigned, /* complain_on_overflow */
470          sh_elf_ignore_reloc,   /* special_function */
471          "R_SH_CODE",           /* name */
472          FALSE,                 /* partial_inplace */
473          0,                     /* src_mask */
474          0,                     /* dst_mask */
475          TRUE),                 /* pcrel_offset */
476
477   /* The assembler will generate this reloc after a block of
478      instructions when it sees data that is not instructions.  */
479   HOWTO (R_SH_DATA,             /* type */
480          0,                     /* rightshift */
481          1,                     /* size (0 = byte, 1 = short, 2 = long) */
482          0,                     /* bitsize */
483          FALSE,                 /* pc_relative */
484          0,                     /* bitpos */
485          complain_overflow_unsigned, /* complain_on_overflow */
486          sh_elf_ignore_reloc,   /* special_function */
487          "R_SH_DATA",           /* name */
488          FALSE,                 /* partial_inplace */
489          0,                     /* src_mask */
490          0,                     /* dst_mask */
491          TRUE),                 /* pcrel_offset */
492
493   /* The assembler generates this reloc for each label within a block
494      of instructions.  This permits the linker to avoid swapping
495      instructions which are the targets of branches.  */
496   HOWTO (R_SH_LABEL,            /* type */
497          0,                     /* rightshift */
498          1,                     /* size (0 = byte, 1 = short, 2 = long) */
499          0,                     /* bitsize */
500          FALSE,                 /* pc_relative */
501          0,                     /* bitpos */
502          complain_overflow_unsigned, /* complain_on_overflow */
503          sh_elf_ignore_reloc,   /* special_function */
504          "R_SH_LABEL",          /* name */
505          FALSE,                 /* partial_inplace */
506          0,                     /* src_mask */
507          0,                     /* dst_mask */
508          TRUE),                 /* pcrel_offset */
509
510   /* The next 12 are only supported via linking in SHC-generated objects.  */
511   HOWTO (R_SH_DIR16,            /* type */
512          0,                     /* rightshift */
513          1,                     /* size (0 = byte, 1 = short, 2 = long) */
514          16,                    /* bitsize */
515          FALSE,                 /* pc_relative */
516          0,                     /* bitpos */
517          complain_overflow_dont, /* complain_on_overflow */
518          bfd_elf_generic_reloc, /* special_function */
519          "R_SH_DIR16",          /* name */
520          FALSE,                 /* partial_inplace */
521          0,                     /* src_mask */
522          0xffff,                /* dst_mask */
523          FALSE),                /* pcrel_offset */
524
525   HOWTO (R_SH_DIR8,             /* type */
526          0,                     /* rightshift */
527          0,                     /* size (0 = byte, 1 = short, 2 = long) */
528          8,                     /* bitsize */
529          FALSE,                 /* pc_relative */
530          0,                     /* bitpos */
531          complain_overflow_dont, /* complain_on_overflow */
532          bfd_elf_generic_reloc, /* special_function */
533          "R_SH_DIR8",           /* name */
534          FALSE,                 /* partial_inplace */
535          0,                     /* src_mask */
536          0xff,                  /* dst_mask */
537          FALSE),                /* pcrel_offset */
538
539   HOWTO (R_SH_DIR8UL,           /* type */
540          2,                     /* rightshift */
541          0,                     /* size (0 = byte, 1 = short, 2 = long) */
542          8,                     /* bitsize */
543          FALSE,                 /* pc_relative */
544          0,                     /* bitpos */
545          complain_overflow_unsigned, /* complain_on_overflow */
546          bfd_elf_generic_reloc, /* special_function */
547          "R_SH_DIR8UL",         /* name */
548          FALSE,                 /* partial_inplace */
549          0,                     /* src_mask */
550          0xff,                  /* dst_mask */
551          FALSE),                /* pcrel_offset */
552
553   HOWTO (R_SH_DIR8UW,           /* type */
554          1,                     /* rightshift */
555          0,                     /* size (0 = byte, 1 = short, 2 = long) */
556          8,                     /* bitsize */
557          FALSE,                 /* pc_relative */
558          0,                     /* bitpos */
559          complain_overflow_unsigned, /* complain_on_overflow */
560          bfd_elf_generic_reloc, /* special_function */
561          "R_SH_DIR8UW",         /* name */
562          FALSE,                 /* partial_inplace */
563          0,                     /* src_mask */
564          0xff,                  /* dst_mask */
565          FALSE),                /* pcrel_offset */
566
567   HOWTO (R_SH_DIR8U,            /* type */
568          0,                     /* rightshift */
569          0,                     /* size (0 = byte, 1 = short, 2 = long) */
570          8,                     /* bitsize */
571          FALSE,                 /* pc_relative */
572          0,                     /* bitpos */
573          complain_overflow_unsigned, /* complain_on_overflow */
574          bfd_elf_generic_reloc, /* special_function */
575          "R_SH_DIR8U",          /* name */
576          FALSE,                 /* partial_inplace */
577          0,                     /* src_mask */
578          0xff,                  /* dst_mask */
579          FALSE),                /* pcrel_offset */
580
581   HOWTO (R_SH_DIR8SW,           /* type */
582          1,                     /* rightshift */
583          0,                     /* size (0 = byte, 1 = short, 2 = long) */
584          8,                     /* bitsize */
585          FALSE,                 /* pc_relative */
586          0,                     /* bitpos */
587          complain_overflow_signed, /* complain_on_overflow */
588          bfd_elf_generic_reloc, /* special_function */
589          "R_SH_DIR8SW",         /* name */
590          FALSE,                 /* partial_inplace */
591          0,                     /* src_mask */
592          0xff,                  /* dst_mask */
593          FALSE),                /* pcrel_offset */
594
595   HOWTO (R_SH_DIR8S,            /* type */
596          0,                     /* rightshift */
597          0,                     /* size (0 = byte, 1 = short, 2 = long) */
598          8,                     /* bitsize */
599          FALSE,                 /* pc_relative */
600          0,                     /* bitpos */
601          complain_overflow_signed, /* complain_on_overflow */
602          bfd_elf_generic_reloc, /* special_function */
603          "R_SH_DIR8S",          /* name */
604          FALSE,                 /* partial_inplace */
605          0,                     /* src_mask */
606          0xff,                  /* dst_mask */
607          FALSE),                /* pcrel_offset */
608
609   HOWTO (R_SH_DIR4UL,           /* type */
610          2,                     /* rightshift */
611          0,                     /* size (0 = byte, 1 = short, 2 = long) */
612          4,                     /* bitsize */
613          FALSE,                 /* pc_relative */
614          0,                     /* bitpos */
615          complain_overflow_unsigned, /* complain_on_overflow */
616          bfd_elf_generic_reloc, /* special_function */
617          "R_SH_DIR4UL",         /* name */
618          FALSE,                 /* partial_inplace */
619          0,                     /* src_mask */
620          0x0f,                  /* dst_mask */
621          FALSE),                /* pcrel_offset */
622
623   HOWTO (R_SH_DIR4UW,           /* type */
624          1,                     /* rightshift */
625          0,                     /* size (0 = byte, 1 = short, 2 = long) */
626          4,                     /* bitsize */
627          FALSE,                 /* pc_relative */
628          0,                     /* bitpos */
629          complain_overflow_unsigned, /* complain_on_overflow */
630          bfd_elf_generic_reloc, /* special_function */
631          "R_SH_DIR4UW",         /* name */
632          FALSE,                 /* partial_inplace */
633          0,                     /* src_mask */
634          0x0f,                  /* dst_mask */
635          FALSE),                /* pcrel_offset */
636
637   HOWTO (R_SH_DIR4U,            /* type */
638          0,                     /* rightshift */
639          0,                     /* size (0 = byte, 1 = short, 2 = long) */
640          4,                     /* bitsize */
641          FALSE,                 /* pc_relative */
642          0,                     /* bitpos */
643          complain_overflow_unsigned, /* complain_on_overflow */
644          bfd_elf_generic_reloc, /* special_function */
645          "R_SH_DIR4U",          /* name */
646          FALSE,                 /* partial_inplace */
647          0,                     /* src_mask */
648          0x0f,                  /* dst_mask */
649          FALSE),                /* pcrel_offset */
650
651   HOWTO (R_SH_PSHA,             /* type */
652          0,                     /* rightshift */
653          1,                     /* size (0 = byte, 1 = short, 2 = long) */
654          7,                     /* bitsize */
655          FALSE,                 /* pc_relative */
656          4,                     /* bitpos */
657          complain_overflow_signed, /* complain_on_overflow */
658          bfd_elf_generic_reloc, /* special_function */
659          "R_SH_PSHA",           /* name */
660          FALSE,                 /* partial_inplace */
661          0,                     /* src_mask */
662          0x0f,                  /* dst_mask */
663          FALSE),                /* pcrel_offset */
664
665   HOWTO (R_SH_PSHL,             /* type */
666          0,                     /* rightshift */
667          1,                     /* size (0 = byte, 1 = short, 2 = long) */
668          7,                     /* bitsize */
669          FALSE,                 /* pc_relative */
670          4,                     /* bitpos */
671          complain_overflow_signed, /* complain_on_overflow */
672          bfd_elf_generic_reloc, /* special_function */
673          "R_SH_PSHL",           /* name */
674          FALSE,                 /* partial_inplace */
675          0,                     /* src_mask */
676          0x0f,                  /* dst_mask */
677          FALSE),                /* pcrel_offset */
678
679 #ifdef INCLUDE_SHMEDIA
680   /* Used in SHLLI.L and SHLRI.L.  */
681   HOWTO (R_SH_DIR5U,            /* type */
682          0,                     /* rightshift */
683          2,                     /* size (0 = byte, 1 = short, 2 = long) */
684          5,                     /* bitsize */
685          FALSE,                 /* pc_relative */
686          10,                    /* bitpos */
687          complain_overflow_unsigned, /* complain_on_overflow */
688          bfd_elf_generic_reloc, /* special_function */
689          "R_SH_DIR5U",          /* name */
690          FALSE,                 /* partial_inplace */
691          0,                     /* src_mask */
692          0xfc00,                /* dst_mask */
693          FALSE),                /* pcrel_offset */
694
695   /* Used in SHARI, SHLLI et al.  */
696   HOWTO (R_SH_DIR6U,            /* type */
697          0,                     /* rightshift */
698          2,                     /* size (0 = byte, 1 = short, 2 = long) */
699          6,                     /* bitsize */
700          FALSE,                 /* pc_relative */
701          10,                    /* bitpos */
702          complain_overflow_unsigned, /* complain_on_overflow */
703          bfd_elf_generic_reloc, /* special_function */
704          "R_SH_DIR6U",          /* name */
705          FALSE,                 /* partial_inplace */
706          0,                     /* src_mask */
707          0xfc00,                /* dst_mask */
708          FALSE),                /* pcrel_offset */
709
710   /* Used in BxxI, LDHI.L et al.  */
711   HOWTO (R_SH_DIR6S,            /* type */
712          0,                     /* rightshift */
713          2,                     /* size (0 = byte, 1 = short, 2 = long) */
714          6,                     /* bitsize */
715          FALSE,                 /* pc_relative */
716          10,                    /* bitpos */
717          complain_overflow_signed, /* complain_on_overflow */
718          bfd_elf_generic_reloc, /* special_function */
719          "R_SH_DIR6S",          /* name */
720          FALSE,                 /* partial_inplace */
721          0,                     /* src_mask */
722          0xfc00,                /* dst_mask */
723          FALSE),                /* pcrel_offset */
724
725   /* Used in ADDI, ANDI et al.  */
726   HOWTO (R_SH_DIR10S,           /* type */
727          0,                     /* rightshift */
728          2,                     /* size (0 = byte, 1 = short, 2 = long) */
729          10,                    /* bitsize */
730          FALSE,                 /* pc_relative */
731          10,                    /* bitpos */
732          complain_overflow_signed, /* complain_on_overflow */
733          bfd_elf_generic_reloc, /* special_function */
734          "R_SH_DIR10S",         /* name */
735          FALSE,                 /* partial_inplace */
736          0,                     /* src_mask */
737          0xffc00,               /* dst_mask */
738          FALSE),                /* pcrel_offset */
739
740   /* Used in LD.UW, ST.W et al.  */
741   HOWTO (R_SH_DIR10SW,  /* type */
742          1,                     /* rightshift */
743          2,                     /* size (0 = byte, 1 = short, 2 = long) */
744          11,                    /* bitsize */
745          FALSE,                 /* pc_relative */
746          10,                    /* bitpos */
747          complain_overflow_signed, /* complain_on_overflow */
748          bfd_elf_generic_reloc, /* special_function */
749          "R_SH_DIR10SW",        /* name */
750          FALSE,                 /* partial_inplace */
751          0,                     /* src_mask */
752          0xffc00,               /* dst_mask */
753          FALSE),                /* pcrel_offset */
754
755   /* Used in LD.L, FLD.S et al.  */
756   HOWTO (R_SH_DIR10SL,  /* type */
757          2,                     /* rightshift */
758          2,                     /* size (0 = byte, 1 = short, 2 = long) */
759          12,                    /* bitsize */
760          FALSE,                 /* pc_relative */
761          10,                    /* bitpos */
762          complain_overflow_signed, /* complain_on_overflow */
763          bfd_elf_generic_reloc, /* special_function */
764          "R_SH_DIR10SL",        /* name */
765          FALSE,                 /* partial_inplace */
766          0,                     /* src_mask */
767          0xffc00,               /* dst_mask */
768          FALSE),                /* pcrel_offset */
769
770   /* Used in FLD.D, FST.P et al.  */
771   HOWTO (R_SH_DIR10SQ,  /* type */
772          3,                     /* rightshift */
773          2,                     /* size (0 = byte, 1 = short, 2 = long) */
774          13,                    /* bitsize */
775          FALSE,                 /* pc_relative */
776          10,                    /* bitpos */
777          complain_overflow_signed, /* complain_on_overflow */
778          bfd_elf_generic_reloc, /* special_function */
779          "R_SH_DIR10SQ",        /* name */
780          FALSE,                 /* partial_inplace */
781          0,                     /* src_mask */
782          0xffc00,               /* dst_mask */
783          FALSE),                /* pcrel_offset */
784
785 #else
786   EMPTY_HOWTO (45),
787   EMPTY_HOWTO (46),
788   EMPTY_HOWTO (47),
789   EMPTY_HOWTO (48),
790   EMPTY_HOWTO (49),
791   EMPTY_HOWTO (50),
792   EMPTY_HOWTO (51),
793 #endif
794
795   EMPTY_HOWTO (52),
796
797   HOWTO (R_SH_DIR16S,           /* type */
798          0,                     /* rightshift */
799          1,                     /* size (0 = byte, 1 = short, 2 = long) */
800          16,                    /* bitsize */
801          FALSE,                 /* pc_relative */
802          0,                     /* bitpos */
803          complain_overflow_signed, /* complain_on_overflow */
804          bfd_elf_generic_reloc, /* special_function */
805          "R_SH_DIR16S",         /* name */
806          FALSE,                 /* partial_inplace */
807          0,                     /* src_mask */
808          0xffff,                /* dst_mask */
809          FALSE),                /* pcrel_offset */
810
811   EMPTY_HOWTO (54),
812   EMPTY_HOWTO (55),
813   EMPTY_HOWTO (56),
814   EMPTY_HOWTO (57),
815   EMPTY_HOWTO (58),
816   EMPTY_HOWTO (59),
817   EMPTY_HOWTO (60),
818   EMPTY_HOWTO (61),
819   EMPTY_HOWTO (62),
820   EMPTY_HOWTO (63),
821   EMPTY_HOWTO (64),
822   EMPTY_HOWTO (65),
823   EMPTY_HOWTO (66),
824   EMPTY_HOWTO (67),
825   EMPTY_HOWTO (68),
826   EMPTY_HOWTO (69),
827   EMPTY_HOWTO (70),
828   EMPTY_HOWTO (71),
829   EMPTY_HOWTO (72),
830   EMPTY_HOWTO (73),
831   EMPTY_HOWTO (74),
832   EMPTY_HOWTO (75),
833   EMPTY_HOWTO (76),
834   EMPTY_HOWTO (77),
835   EMPTY_HOWTO (78),
836   EMPTY_HOWTO (79),
837   EMPTY_HOWTO (80),
838   EMPTY_HOWTO (81),
839   EMPTY_HOWTO (82),
840   EMPTY_HOWTO (83),
841   EMPTY_HOWTO (84),
842   EMPTY_HOWTO (85),
843   EMPTY_HOWTO (86),
844   EMPTY_HOWTO (87),
845   EMPTY_HOWTO (88),
846   EMPTY_HOWTO (89),
847   EMPTY_HOWTO (90),
848   EMPTY_HOWTO (91),
849   EMPTY_HOWTO (92),
850   EMPTY_HOWTO (93),
851   EMPTY_HOWTO (94),
852   EMPTY_HOWTO (95),
853   EMPTY_HOWTO (96),
854   EMPTY_HOWTO (97),
855   EMPTY_HOWTO (98),
856   EMPTY_HOWTO (99),
857   EMPTY_HOWTO (100),
858   EMPTY_HOWTO (101),
859   EMPTY_HOWTO (102),
860   EMPTY_HOWTO (103),
861   EMPTY_HOWTO (104),
862   EMPTY_HOWTO (105),
863   EMPTY_HOWTO (106),
864   EMPTY_HOWTO (107),
865   EMPTY_HOWTO (108),
866   EMPTY_HOWTO (109),
867   EMPTY_HOWTO (110),
868   EMPTY_HOWTO (111),
869   EMPTY_HOWTO (112),
870   EMPTY_HOWTO (113),
871   EMPTY_HOWTO (114),
872   EMPTY_HOWTO (115),
873   EMPTY_HOWTO (116),
874   EMPTY_HOWTO (117),
875   EMPTY_HOWTO (118),
876   EMPTY_HOWTO (119),
877   EMPTY_HOWTO (120),
878   EMPTY_HOWTO (121),
879   EMPTY_HOWTO (122),
880   EMPTY_HOWTO (123),
881   EMPTY_HOWTO (124),
882   EMPTY_HOWTO (125),
883   EMPTY_HOWTO (126),
884   EMPTY_HOWTO (127),
885   EMPTY_HOWTO (128),
886   EMPTY_HOWTO (129),
887   EMPTY_HOWTO (130),
888   EMPTY_HOWTO (131),
889   EMPTY_HOWTO (132),
890   EMPTY_HOWTO (133),
891   EMPTY_HOWTO (134),
892   EMPTY_HOWTO (135),
893   EMPTY_HOWTO (136),
894   EMPTY_HOWTO (137),
895   EMPTY_HOWTO (138),
896   EMPTY_HOWTO (139),
897   EMPTY_HOWTO (140),
898   EMPTY_HOWTO (141),
899   EMPTY_HOWTO (142),
900   EMPTY_HOWTO (143),
901
902   HOWTO (R_SH_TLS_GD_32,        /* type */
903          0,                     /* rightshift */
904          2,                     /* size (0 = byte, 1 = short, 2 = long) */
905          32,                    /* bitsize */
906          FALSE,                 /* pc_relative */
907          0,                     /* bitpos */
908          complain_overflow_bitfield, /* complain_on_overflow */
909          bfd_elf_generic_reloc, /* */
910          "R_SH_TLS_GD_32",      /* name */
911          TRUE,                  /* partial_inplace */
912          0xffffffff,            /* src_mask */
913          0xffffffff,            /* dst_mask */
914          FALSE),                /* pcrel_offset */
915
916   HOWTO (R_SH_TLS_LD_32,        /* type */
917          0,                     /* rightshift */
918          2,                     /* size (0 = byte, 1 = short, 2 = long) */
919          32,                    /* bitsize */
920          FALSE,                 /* pc_relative */
921          0,                     /* bitpos */
922          complain_overflow_bitfield, /* complain_on_overflow */
923          bfd_elf_generic_reloc, /* */
924          "R_SH_TLS_LD_32",      /* name */
925          TRUE,                  /* partial_inplace */
926          0xffffffff,            /* src_mask */
927          0xffffffff,            /* dst_mask */
928          FALSE),                /* pcrel_offset */
929
930   HOWTO (R_SH_TLS_LDO_32,       /* type */
931          0,                     /* rightshift */
932          2,                     /* size (0 = byte, 1 = short, 2 = long) */
933          32,                    /* bitsize */
934          FALSE,                 /* pc_relative */
935          0,                     /* bitpos */
936          complain_overflow_bitfield, /* complain_on_overflow */
937          bfd_elf_generic_reloc, /* */
938          "R_SH_TLS_LDO_32",     /* name */
939          TRUE,                  /* partial_inplace */
940          0xffffffff,            /* src_mask */
941          0xffffffff,            /* dst_mask */
942          FALSE),                /* pcrel_offset */
943
944   HOWTO (R_SH_TLS_IE_32,        /* type */
945          0,                     /* rightshift */
946          2,                     /* size (0 = byte, 1 = short, 2 = long) */
947          32,                    /* bitsize */
948          FALSE,                 /* pc_relative */
949          0,                     /* bitpos */
950          complain_overflow_bitfield, /* complain_on_overflow */
951          bfd_elf_generic_reloc, /* */
952          "R_SH_TLS_IE_32",      /* name */
953          TRUE,                  /* partial_inplace */
954          0xffffffff,            /* src_mask */
955          0xffffffff,            /* dst_mask */
956          FALSE),                /* pcrel_offset */
957
958   HOWTO (R_SH_TLS_LE_32,        /* type */
959          0,                     /* rightshift */
960          2,                     /* size (0 = byte, 1 = short, 2 = long) */
961          32,                    /* bitsize */
962          FALSE,                 /* pc_relative */
963          0,                     /* bitpos */
964          complain_overflow_bitfield, /* complain_on_overflow */
965          bfd_elf_generic_reloc, /* */
966          "R_SH_TLS_LE_32",      /* name */
967          TRUE,                  /* partial_inplace */
968          0xffffffff,            /* src_mask */
969          0xffffffff,            /* dst_mask */
970          FALSE),                /* pcrel_offset */
971
972   HOWTO (R_SH_TLS_DTPMOD32,     /* type */
973          0,                     /* rightshift */
974          2,                     /* size (0 = byte, 1 = short, 2 = long) */
975          32,                    /* bitsize */
976          FALSE,                 /* pc_relative */
977          0,                     /* bitpos */
978          complain_overflow_bitfield, /* complain_on_overflow */
979          bfd_elf_generic_reloc, /* */
980          "R_SH_TLS_DTPMOD32",   /* name */
981          TRUE,                  /* partial_inplace */
982          0xffffffff,            /* src_mask */
983          0xffffffff,            /* dst_mask */
984          FALSE),                /* pcrel_offset */
985
986   HOWTO (R_SH_TLS_DTPOFF32,     /* type */
987          0,                     /* rightshift */
988          2,                     /* size (0 = byte, 1 = short, 2 = long) */
989          32,                    /* bitsize */
990          FALSE,                 /* pc_relative */
991          0,                     /* bitpos */
992          complain_overflow_bitfield, /* complain_on_overflow */
993          bfd_elf_generic_reloc, /* */
994          "R_SH_TLS_DTPOFF32",   /* name */
995          TRUE,                  /* partial_inplace */
996          0xffffffff,            /* src_mask */
997          0xffffffff,            /* dst_mask */
998          FALSE),                /* pcrel_offset */
999
1000   HOWTO (R_SH_TLS_TPOFF32,      /* type */
1001          0,                     /* rightshift */
1002          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1003          32,                    /* bitsize */
1004          FALSE,                 /* pc_relative */
1005          0,                     /* bitpos */
1006          complain_overflow_bitfield, /* complain_on_overflow */
1007          bfd_elf_generic_reloc, /* */
1008          "R_SH_TLS_TPOFF32",    /* name */
1009          TRUE,                  /* partial_inplace */
1010          0xffffffff,            /* src_mask */
1011          0xffffffff,            /* dst_mask */
1012          FALSE),                /* pcrel_offset */
1013
1014   EMPTY_HOWTO (152),
1015   EMPTY_HOWTO (153),
1016   EMPTY_HOWTO (154),
1017   EMPTY_HOWTO (155),
1018   EMPTY_HOWTO (156),
1019   EMPTY_HOWTO (157),
1020   EMPTY_HOWTO (158),
1021   EMPTY_HOWTO (159),
1022
1023   HOWTO (R_SH_GOT32,            /* type */
1024          0,                     /* rightshift */
1025          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1026          32,                    /* bitsize */
1027          FALSE,                 /* pc_relative */
1028          0,                     /* bitpos */
1029          complain_overflow_bitfield, /* complain_on_overflow */
1030          bfd_elf_generic_reloc, /* */
1031          "R_SH_GOT32",          /* name */
1032          TRUE,                  /* partial_inplace */
1033          0xffffffff,            /* src_mask */
1034          0xffffffff,            /* dst_mask */
1035          FALSE),                /* pcrel_offset */
1036
1037   HOWTO (R_SH_PLT32,            /* type */
1038          0,                     /* rightshift */
1039          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1040          32,                    /* bitsize */
1041          TRUE,                  /* pc_relative */
1042          0,                     /* bitpos */
1043          complain_overflow_bitfield, /* complain_on_overflow */
1044          bfd_elf_generic_reloc, /* */
1045          "R_SH_PLT32",          /* name */
1046          TRUE,                  /* partial_inplace */
1047          0xffffffff,            /* src_mask */
1048          0xffffffff,            /* dst_mask */
1049          TRUE),                 /* pcrel_offset */
1050
1051   HOWTO (R_SH_COPY,             /* type */
1052          0,                     /* rightshift */
1053          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1054          32,                    /* bitsize */
1055          FALSE,                 /* pc_relative */
1056          0,                     /* bitpos */
1057          complain_overflow_bitfield, /* complain_on_overflow */
1058          bfd_elf_generic_reloc, /* */
1059          "R_SH_COPY",           /* name */
1060          TRUE,                  /* partial_inplace */
1061          0xffffffff,            /* src_mask */
1062          0xffffffff,            /* dst_mask */
1063          FALSE),                /* pcrel_offset */
1064
1065   HOWTO (R_SH_GLOB_DAT,         /* type */
1066          0,                     /* rightshift */
1067          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1068          32,                    /* bitsize */
1069          FALSE,                 /* pc_relative */
1070          0,                     /* bitpos */
1071          complain_overflow_bitfield, /* complain_on_overflow */
1072          bfd_elf_generic_reloc, /* */
1073          "R_SH_GLOB_DAT",       /* name */
1074          TRUE,                  /* partial_inplace */
1075          0xffffffff,            /* src_mask */
1076          0xffffffff,            /* dst_mask */
1077          FALSE),                /* pcrel_offset */
1078
1079   HOWTO (R_SH_JMP_SLOT,         /* type */
1080          0,                     /* rightshift */
1081          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1082          32,                    /* bitsize */
1083          FALSE,                 /* pc_relative */
1084          0,                     /* bitpos */
1085          complain_overflow_bitfield, /* complain_on_overflow */
1086          bfd_elf_generic_reloc, /* */
1087          "R_SH_JMP_SLOT",       /* name */
1088          TRUE,                  /* partial_inplace */
1089          0xffffffff,            /* src_mask */
1090          0xffffffff,            /* dst_mask */
1091          FALSE),                /* pcrel_offset */
1092
1093   HOWTO (R_SH_RELATIVE,         /* type */
1094          0,                     /* rightshift */
1095          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1096          32,                    /* bitsize */
1097          FALSE,                 /* pc_relative */
1098          0,                     /* bitpos */
1099          complain_overflow_bitfield, /* complain_on_overflow */
1100          bfd_elf_generic_reloc, /* */
1101          "R_SH_RELATIVE",       /* name */
1102          TRUE,                  /* partial_inplace */
1103          0xffffffff,            /* src_mask */
1104          0xffffffff,            /* dst_mask */
1105          FALSE),                /* pcrel_offset */
1106
1107   HOWTO (R_SH_GOTOFF,           /* type */
1108          0,                     /* rightshift */
1109          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1110          32,                    /* bitsize */
1111          FALSE,                 /* pc_relative */
1112          0,                     /* bitpos */
1113          complain_overflow_bitfield, /* complain_on_overflow */
1114          bfd_elf_generic_reloc, /* */
1115          "R_SH_GOTOFF",         /* name */
1116          TRUE,                  /* partial_inplace */
1117          0xffffffff,            /* src_mask */
1118          0xffffffff,            /* dst_mask */
1119          FALSE),                /* pcrel_offset */
1120
1121   HOWTO (R_SH_GOTPC,            /* type */
1122          0,                     /* rightshift */
1123          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1124          32,                    /* bitsize */
1125          TRUE,                  /* pc_relative */
1126          0,                     /* bitpos */
1127          complain_overflow_bitfield, /* complain_on_overflow */
1128          bfd_elf_generic_reloc, /* */
1129          "R_SH_GOTPC",          /* name */
1130          TRUE,                  /* partial_inplace */
1131          0xffffffff,            /* src_mask */
1132          0xffffffff,            /* dst_mask */
1133          TRUE),                 /* pcrel_offset */
1134
1135   HOWTO (R_SH_GOTPLT32,         /* type */
1136          0,                     /* rightshift */
1137          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1138          32,                    /* bitsize */
1139          FALSE,                 /* pc_relative */
1140          0,                     /* bitpos */
1141          complain_overflow_bitfield, /* complain_on_overflow */
1142          bfd_elf_generic_reloc, /* */
1143          "R_SH_GOTPLT32",       /* name */
1144          FALSE,                 /* partial_inplace */
1145          0xffffffff,            /* src_mask */
1146          0xffffffff,            /* dst_mask */
1147          FALSE),                /* pcrel_offset */
1148
1149 #ifdef INCLUDE_SHMEDIA
1150   /* Used in MOVI and SHORI (x & 65536).  */
1151   HOWTO (R_SH_GOT_LOW16,        /* type */
1152          0,                     /* rightshift */
1153          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1154          64,                    /* bitsize */
1155          FALSE,                 /* pc_relative */
1156          10,                    /* bitpos */
1157          complain_overflow_dont, /* complain_on_overflow */
1158          bfd_elf_generic_reloc, /* special_function */
1159          "R_SH_GOT_LOW16",      /* name */
1160          FALSE,                 /* partial_inplace */
1161          0,                     /* src_mask */
1162          0x3fffc00,             /* dst_mask */
1163          FALSE),                /* pcrel_offset */
1164
1165   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1166   HOWTO (R_SH_GOT_MEDLOW16,     /* type */
1167          16,                    /* rightshift */
1168          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1169          64,                    /* bitsize */
1170          FALSE,                 /* pc_relative */
1171          10,                    /* bitpos */
1172          complain_overflow_dont, /* complain_on_overflow */
1173          bfd_elf_generic_reloc, /* special_function */
1174          "R_SH_GOT_MEDLOW16",   /* name */
1175          FALSE,                 /* partial_inplace */
1176          0,                     /* src_mask */
1177          0x3fffc00,             /* dst_mask */
1178          FALSE),                /* pcrel_offset */
1179
1180   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1181   HOWTO (R_SH_GOT_MEDHI16,      /* type */
1182          32,                    /* rightshift */
1183          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1184          64,                    /* bitsize */
1185          FALSE,                 /* pc_relative */
1186          10,                    /* bitpos */
1187          complain_overflow_dont, /* complain_on_overflow */
1188          bfd_elf_generic_reloc, /* special_function */
1189          "R_SH_GOT_MEDHI16",    /* name */
1190          FALSE,                 /* partial_inplace */
1191          0,                     /* src_mask */
1192          0x3fffc00,             /* dst_mask */
1193          FALSE),                /* pcrel_offset */
1194
1195   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1196   HOWTO (R_SH_GOT_HI16,         /* type */
1197          48,                    /* rightshift */
1198          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1199          64,                    /* bitsize */
1200          FALSE,                 /* pc_relative */
1201          10,                    /* bitpos */
1202          complain_overflow_dont, /* complain_on_overflow */
1203          bfd_elf_generic_reloc, /* special_function */
1204          "R_SH_GOT_HI16",       /* name */
1205          FALSE,                 /* partial_inplace */
1206          0,                     /* src_mask */
1207          0x3fffc00,             /* dst_mask */
1208          FALSE),                /* pcrel_offset */
1209
1210   /* Used in MOVI and SHORI (x & 65536).  */
1211   HOWTO (R_SH_GOTPLT_LOW16,     /* type */
1212          0,                     /* rightshift */
1213          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1214          64,                    /* bitsize */
1215          FALSE,                 /* pc_relative */
1216          10,                    /* bitpos */
1217          complain_overflow_dont, /* complain_on_overflow */
1218          bfd_elf_generic_reloc, /* special_function */
1219          "R_SH_GOTPLT_LOW16",   /* name */
1220          FALSE,                 /* partial_inplace */
1221          0,                     /* src_mask */
1222          0x3fffc00,             /* dst_mask */
1223          FALSE),                /* pcrel_offset */
1224
1225   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1226   HOWTO (R_SH_GOTPLT_MEDLOW16,  /* type */
1227          16,                    /* rightshift */
1228          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1229          64,                    /* bitsize */
1230          FALSE,                 /* pc_relative */
1231          10,                    /* bitpos */
1232          complain_overflow_dont, /* complain_on_overflow */
1233          bfd_elf_generic_reloc, /* special_function */
1234          "R_SH_GOTPLT_MEDLOW16", /* name */
1235          FALSE,                 /* partial_inplace */
1236          0,                     /* src_mask */
1237          0x3fffc00,             /* dst_mask */
1238          FALSE),                /* pcrel_offset */
1239
1240   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1241   HOWTO (R_SH_GOTPLT_MEDHI16,   /* type */
1242          32,                    /* rightshift */
1243          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1244          64,                    /* bitsize */
1245          FALSE,                 /* pc_relative */
1246          10,                    /* bitpos */
1247          complain_overflow_dont, /* complain_on_overflow */
1248          bfd_elf_generic_reloc, /* special_function */
1249          "R_SH_GOTPLT_MEDHI16", /* name */
1250          FALSE,                 /* partial_inplace */
1251          0,                     /* src_mask */
1252          0x3fffc00,             /* dst_mask */
1253          FALSE),                /* pcrel_offset */
1254
1255   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1256   HOWTO (R_SH_GOTPLT_HI16,      /* type */
1257          48,                    /* rightshift */
1258          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1259          64,                    /* bitsize */
1260          FALSE,                 /* pc_relative */
1261          10,                    /* bitpos */
1262          complain_overflow_dont, /* complain_on_overflow */
1263          bfd_elf_generic_reloc, /* special_function */
1264          "R_SH_GOTPLT_HI16",    /* name */
1265          FALSE,                 /* partial_inplace */
1266          0,                     /* src_mask */
1267          0x3fffc00,             /* dst_mask */
1268          FALSE),                /* pcrel_offset */
1269
1270   /* Used in MOVI and SHORI (x & 65536).  */
1271   HOWTO (R_SH_PLT_LOW16,        /* type */
1272          0,                     /* rightshift */
1273          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1274          64,                    /* bitsize */
1275          TRUE,                  /* pc_relative */
1276          10,                    /* bitpos */
1277          complain_overflow_dont, /* complain_on_overflow */
1278          bfd_elf_generic_reloc, /* special_function */
1279          "R_SH_PLT_LOW16",      /* name */
1280          FALSE,                 /* partial_inplace */
1281          0,                     /* src_mask */
1282          0x3fffc00,             /* dst_mask */
1283          TRUE),                 /* pcrel_offset */
1284
1285   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1286   HOWTO (R_SH_PLT_MEDLOW16,     /* type */
1287          16,                    /* rightshift */
1288          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1289          64,                    /* bitsize */
1290          TRUE,                  /* pc_relative */
1291          10,                    /* bitpos */
1292          complain_overflow_dont, /* complain_on_overflow */
1293          bfd_elf_generic_reloc, /* special_function */
1294          "R_SH_PLT_MEDLOW16",   /* name */
1295          FALSE,                 /* partial_inplace */
1296          0,                     /* src_mask */
1297          0x3fffc00,             /* dst_mask */
1298          TRUE),                 /* pcrel_offset */
1299
1300   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1301   HOWTO (R_SH_PLT_MEDHI16,      /* type */
1302          32,                    /* rightshift */
1303          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1304          64,                    /* bitsize */
1305          TRUE,                  /* pc_relative */
1306          10,                    /* bitpos */
1307          complain_overflow_dont, /* complain_on_overflow */
1308          bfd_elf_generic_reloc, /* special_function */
1309          "R_SH_PLT_MEDHI16",    /* name */
1310          FALSE,                 /* partial_inplace */
1311          0,                     /* src_mask */
1312          0x3fffc00,             /* dst_mask */
1313          TRUE),                 /* pcrel_offset */
1314
1315   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1316   HOWTO (R_SH_PLT_HI16,         /* type */
1317          48,                    /* rightshift */
1318          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1319          64,                    /* bitsize */
1320          TRUE,                  /* pc_relative */
1321          10,                    /* bitpos */
1322          complain_overflow_dont, /* complain_on_overflow */
1323          bfd_elf_generic_reloc, /* special_function */
1324          "R_SH_PLT_HI16",       /* name */
1325          FALSE,                 /* partial_inplace */
1326          0,                     /* src_mask */
1327          0x3fffc00,             /* dst_mask */
1328          TRUE),                 /* pcrel_offset */
1329
1330   /* Used in MOVI and SHORI (x & 65536).  */
1331   HOWTO (R_SH_GOTOFF_LOW16,     /* type */
1332          0,                     /* rightshift */
1333          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1334          64,                    /* bitsize */
1335          FALSE,                 /* pc_relative */
1336          10,                    /* bitpos */
1337          complain_overflow_dont, /* complain_on_overflow */
1338          bfd_elf_generic_reloc, /* special_function */
1339          "R_SH_GOTOFF_LOW16",   /* name */
1340          FALSE,                 /* partial_inplace */
1341          0,                     /* src_mask */
1342          0x3fffc00,             /* dst_mask */
1343          FALSE),                /* pcrel_offset */
1344
1345   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1346   HOWTO (R_SH_GOTOFF_MEDLOW16,  /* type */
1347          16,                    /* rightshift */
1348          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1349          64,                    /* bitsize */
1350          FALSE,                 /* pc_relative */
1351          10,                    /* bitpos */
1352          complain_overflow_dont, /* complain_on_overflow */
1353          bfd_elf_generic_reloc, /* special_function */
1354          "R_SH_GOTOFF_MEDLOW16", /* name */
1355          FALSE,                 /* partial_inplace */
1356          0,                     /* src_mask */
1357          0x3fffc00,             /* dst_mask */
1358          FALSE),                /* pcrel_offset */
1359
1360   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1361   HOWTO (R_SH_GOTOFF_MEDHI16,   /* type */
1362          32,                    /* rightshift */
1363          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1364          64,                    /* bitsize */
1365          FALSE,                 /* pc_relative */
1366          10,                    /* bitpos */
1367          complain_overflow_dont, /* complain_on_overflow */
1368          bfd_elf_generic_reloc, /* special_function */
1369          "R_SH_GOTOFF_MEDHI16", /* name */
1370          FALSE,                 /* partial_inplace */
1371          0,                     /* src_mask */
1372          0x3fffc00,             /* dst_mask */
1373          FALSE),                /* pcrel_offset */
1374
1375   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1376   HOWTO (R_SH_GOTOFF_HI16,      /* type */
1377          48,                    /* rightshift */
1378          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1379          64,                    /* bitsize */
1380          FALSE,                 /* pc_relative */
1381          10,                    /* bitpos */
1382          complain_overflow_dont, /* complain_on_overflow */
1383          bfd_elf_generic_reloc, /* special_function */
1384          "R_SH_GOTOFF_HI16",    /* name */
1385          FALSE,                 /* partial_inplace */
1386          0,                     /* src_mask */
1387          0x3fffc00,             /* dst_mask */
1388          FALSE),                /* pcrel_offset */
1389
1390   /* Used in MOVI and SHORI (x & 65536).  */
1391   HOWTO (R_SH_GOTPC_LOW16,      /* type */
1392          0,                     /* rightshift */
1393          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1394          64,                    /* bitsize */
1395          TRUE,                  /* pc_relative */
1396          10,                    /* bitpos */
1397          complain_overflow_dont, /* complain_on_overflow */
1398          bfd_elf_generic_reloc, /* special_function */
1399          "R_SH_GOTPC_LOW16",    /* name */
1400          FALSE,                 /* partial_inplace */
1401          0,                     /* src_mask */
1402          0x3fffc00,             /* dst_mask */
1403          TRUE),                 /* pcrel_offset */
1404
1405   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1406   HOWTO (R_SH_GOTPC_MEDLOW16,   /* type */
1407          16,                    /* rightshift */
1408          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1409          64,                    /* bitsize */
1410          TRUE,                  /* pc_relative */
1411          10,                    /* bitpos */
1412          complain_overflow_dont, /* complain_on_overflow */
1413          bfd_elf_generic_reloc, /* special_function */
1414          "R_SH_GOTPC_MEDLOW16", /* name */
1415          FALSE,                 /* partial_inplace */
1416          0,                     /* src_mask */
1417          0x3fffc00,             /* dst_mask */
1418          TRUE),                 /* pcrel_offset */
1419
1420   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1421   HOWTO (R_SH_GOTPC_MEDHI16,    /* type */
1422          32,                    /* rightshift */
1423          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1424          64,                    /* bitsize */
1425          TRUE,                  /* pc_relative */
1426          10,                    /* bitpos */
1427          complain_overflow_dont, /* complain_on_overflow */
1428          bfd_elf_generic_reloc, /* special_function */
1429          "R_SH_GOTPC_MEDHI16",  /* name */
1430          FALSE,                 /* partial_inplace */
1431          0,                     /* src_mask */
1432          0x3fffc00,             /* dst_mask */
1433          TRUE),                 /* pcrel_offset */
1434
1435   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1436   HOWTO (R_SH_GOTPC_HI16,       /* type */
1437          48,                    /* rightshift */
1438          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1439          64,                    /* bitsize */
1440          TRUE,                  /* pc_relative */
1441          10,                    /* bitpos */
1442          complain_overflow_dont, /* complain_on_overflow */
1443          bfd_elf_generic_reloc, /* special_function */
1444          "R_SH_GOTPC_HI16",     /* name */
1445          FALSE,                 /* partial_inplace */
1446          0,                     /* src_mask */
1447          0x3fffc00,             /* dst_mask */
1448          TRUE),                 /* pcrel_offset */
1449
1450   /* Used in LD.L, FLD.S et al.  */
1451   HOWTO (R_SH_GOT10BY4,         /* type */
1452          2,                     /* rightshift */
1453          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1454          12,                    /* bitsize */
1455          FALSE,                 /* pc_relative */
1456          10,                    /* bitpos */
1457          complain_overflow_signed, /* complain_on_overflow */
1458          bfd_elf_generic_reloc, /* special_function */
1459          "R_SH_GOT10BY4",       /* name */
1460          FALSE,                 /* partial_inplace */
1461          0,                     /* src_mask */
1462          0xffc00,               /* dst_mask */
1463          FALSE),                /* pcrel_offset */
1464
1465   /* Used in LD.L, FLD.S et al.  */
1466   HOWTO (R_SH_GOTPLT10BY4,      /* type */
1467          2,                     /* rightshift */
1468          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1469          12,                    /* bitsize */
1470          FALSE,                 /* pc_relative */
1471          10,                    /* bitpos */
1472          complain_overflow_signed, /* complain_on_overflow */
1473          bfd_elf_generic_reloc, /* special_function */
1474          "R_SH_GOTPLT10BY4",    /* name */
1475          FALSE,                 /* partial_inplace */
1476          0,                     /* src_mask */
1477          0xffc00,               /* dst_mask */
1478          FALSE),                /* pcrel_offset */
1479
1480   /* Used in FLD.D, FST.P et al.  */
1481   HOWTO (R_SH_GOT10BY8,         /* type */
1482          3,                     /* rightshift */
1483          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1484          13,                    /* bitsize */
1485          FALSE,                 /* pc_relative */
1486          10,                    /* bitpos */
1487          complain_overflow_signed, /* complain_on_overflow */
1488          bfd_elf_generic_reloc, /* special_function */
1489          "R_SH_GOT10BY8",       /* name */
1490          FALSE,                 /* partial_inplace */
1491          0,                     /* src_mask */
1492          0xffc00,               /* dst_mask */
1493          FALSE),                /* pcrel_offset */
1494
1495   /* Used in FLD.D, FST.P et al.  */
1496   HOWTO (R_SH_GOTPLT10BY8,      /* type */
1497          3,                     /* rightshift */
1498          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1499          13,                    /* bitsize */
1500          FALSE,                 /* pc_relative */
1501          10,                    /* bitpos */
1502          complain_overflow_signed, /* complain_on_overflow */
1503          bfd_elf_generic_reloc, /* special_function */
1504          "R_SH_GOTPLT10BY8",    /* name */
1505          FALSE,                 /* partial_inplace */
1506          0,                     /* src_mask */
1507          0xffc00,               /* dst_mask */
1508          FALSE),                /* pcrel_offset */
1509
1510   HOWTO (R_SH_COPY64,           /* type */
1511          0,                     /* rightshift */
1512          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1513          64,                    /* bitsize */
1514          FALSE,                 /* pc_relative */
1515          0,                     /* bitpos */
1516          complain_overflow_dont, /* complain_on_overflow */
1517          bfd_elf_generic_reloc, /* special_function */
1518          "R_SH_COPY64",         /* name */
1519          FALSE,                 /* partial_inplace */
1520          0,                     /* src_mask */
1521          ((bfd_vma) 0) - 1,     /* dst_mask */
1522          FALSE),                /* pcrel_offset */
1523
1524   HOWTO (R_SH_GLOB_DAT64,       /* type */
1525          0,                     /* rightshift */
1526          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1527          64,                    /* bitsize */
1528          FALSE,                 /* pc_relative */
1529          0,                     /* bitpos */
1530          complain_overflow_dont, /* complain_on_overflow */
1531          bfd_elf_generic_reloc, /* special_function */
1532          "R_SH_GLOB_DAT64",     /* name */
1533          FALSE,                 /* partial_inplace */
1534          0,                     /* src_mask */
1535          ((bfd_vma) 0) - 1,     /* dst_mask */
1536          FALSE),                /* pcrel_offset */
1537
1538   HOWTO (R_SH_JMP_SLOT64,       /* type */
1539          0,                     /* rightshift */
1540          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1541          64,                    /* bitsize */
1542          FALSE,                 /* pc_relative */
1543          0,                     /* bitpos */
1544          complain_overflow_dont, /* complain_on_overflow */
1545          bfd_elf_generic_reloc, /* special_function */
1546          "R_SH_JMP_SLOT64",     /* name */
1547          FALSE,                 /* partial_inplace */
1548          0,                     /* src_mask */
1549          ((bfd_vma) 0) - 1,     /* dst_mask */
1550          FALSE),                /* pcrel_offset */
1551
1552   HOWTO (R_SH_RELATIVE64,       /* type */
1553          0,                     /* rightshift */
1554          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1555          64,                    /* bitsize */
1556          FALSE,                 /* pc_relative */
1557          0,                     /* bitpos */
1558          complain_overflow_dont, /* complain_on_overflow */
1559          bfd_elf_generic_reloc, /* special_function */
1560          "R_SH_RELATIVE64",     /* name */
1561          FALSE,                 /* partial_inplace */
1562          0,                     /* src_mask */
1563          ((bfd_vma) 0) - 1,     /* dst_mask */
1564          FALSE),                /* pcrel_offset */
1565
1566   EMPTY_HOWTO (197),
1567   EMPTY_HOWTO (198),
1568   EMPTY_HOWTO (199),
1569   EMPTY_HOWTO (200),
1570   EMPTY_HOWTO (201),
1571   EMPTY_HOWTO (202),
1572   EMPTY_HOWTO (203),
1573   EMPTY_HOWTO (204),
1574   EMPTY_HOWTO (205),
1575   EMPTY_HOWTO (206),
1576   EMPTY_HOWTO (207),
1577   EMPTY_HOWTO (208),
1578   EMPTY_HOWTO (209),
1579   EMPTY_HOWTO (210),
1580   EMPTY_HOWTO (211),
1581   EMPTY_HOWTO (212),
1582   EMPTY_HOWTO (213),
1583   EMPTY_HOWTO (214),
1584   EMPTY_HOWTO (215),
1585   EMPTY_HOWTO (216),
1586   EMPTY_HOWTO (217),
1587   EMPTY_HOWTO (218),
1588   EMPTY_HOWTO (219),
1589   EMPTY_HOWTO (220),
1590   EMPTY_HOWTO (221),
1591   EMPTY_HOWTO (222),
1592   EMPTY_HOWTO (223),
1593   EMPTY_HOWTO (224),
1594   EMPTY_HOWTO (225),
1595   EMPTY_HOWTO (226),
1596   EMPTY_HOWTO (227),
1597   EMPTY_HOWTO (228),
1598   EMPTY_HOWTO (229),
1599   EMPTY_HOWTO (230),
1600   EMPTY_HOWTO (231),
1601   EMPTY_HOWTO (232),
1602   EMPTY_HOWTO (233),
1603   EMPTY_HOWTO (234),
1604   EMPTY_HOWTO (235),
1605   EMPTY_HOWTO (236),
1606   EMPTY_HOWTO (237),
1607   EMPTY_HOWTO (238),
1608   EMPTY_HOWTO (239),
1609   EMPTY_HOWTO (240),
1610   EMPTY_HOWTO (241),
1611
1612   /* Relocations for SHmedia code.  None of these are partial_inplace or
1613      use the field being relocated (except R_SH_PT_16).  */
1614
1615   /* The assembler will generate this reloc before a block of SHmedia
1616      instructions.  A section should be processed as assuming it contains
1617      data, unless this reloc is seen.  Note that a block of SHcompact
1618      instructions are instead preceded by R_SH_CODE.
1619      This is currently not implemented, but should be used for SHmedia
1620      linker relaxation.  */
1621   HOWTO (R_SH_SHMEDIA_CODE,     /* type */
1622          0,                     /* rightshift */
1623          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1624          0,                     /* bitsize */
1625          FALSE,                 /* pc_relative */
1626          0,                     /* bitpos */
1627          complain_overflow_unsigned, /* complain_on_overflow */
1628          sh_elf_ignore_reloc,   /* special_function */
1629          "R_SH_SHMEDIA_CODE",   /* name */
1630          FALSE,                 /* partial_inplace */
1631          0,                     /* src_mask */
1632          0,                     /* dst_mask */
1633          FALSE),                /* pcrel_offset */
1634
1635   /* The assembler will generate this reloc at a PTA or PTB instruction,
1636      and the linker checks the right type of target, or changes a PTA to a
1637      PTB, if the original insn was PT.  */
1638   HOWTO (R_SH_PT_16,            /* type */
1639          2,                     /* rightshift */
1640          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1641          18,                    /* bitsize */
1642          TRUE,                  /* pc_relative */
1643          10,                    /* bitpos */
1644          complain_overflow_signed, /* complain_on_overflow */
1645          bfd_elf_generic_reloc, /* special_function */
1646          "R_SH_PT_16",          /* name */
1647          FALSE,                 /* partial_inplace */
1648          0,                     /* src_mask */
1649          0x3fffc00,             /* dst_mask */
1650          TRUE),                 /* pcrel_offset */
1651
1652   /* Used in unexpanded MOVI.  */
1653   HOWTO (R_SH_IMMS16,           /* type */
1654          0,                     /* rightshift */
1655          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1656          16,                    /* bitsize */
1657          FALSE,                 /* pc_relative */
1658          10,                    /* bitpos */
1659          complain_overflow_signed, /* complain_on_overflow */
1660          bfd_elf_generic_reloc, /* special_function */
1661          "R_SH_IMMS16",         /* name */
1662          FALSE,                 /* partial_inplace */
1663          0,                     /* src_mask */
1664          0x3fffc00,             /* dst_mask */
1665          FALSE),                /* pcrel_offset */
1666
1667   /* Used in SHORI.  */
1668   HOWTO (R_SH_IMMU16,           /* type */
1669          0,                     /* rightshift */
1670          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1671          16,                    /* bitsize */
1672          FALSE,                 /* pc_relative */
1673          10,                    /* bitpos */
1674          complain_overflow_unsigned, /* complain_on_overflow */
1675          bfd_elf_generic_reloc, /* special_function */
1676          "R_SH_IMMU16",         /* name */
1677          FALSE,                 /* partial_inplace */
1678          0,                     /* src_mask */
1679          0x3fffc00,             /* dst_mask */
1680          FALSE),                /* pcrel_offset */
1681
1682   /* Used in MOVI and SHORI (x & 65536).  */
1683   HOWTO (R_SH_IMM_LOW16,        /* type */
1684          0,                     /* rightshift */
1685          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1686          64,                    /* bitsize */
1687          FALSE,                 /* pc_relative */
1688          10,                    /* bitpos */
1689          complain_overflow_dont, /* complain_on_overflow */
1690          bfd_elf_generic_reloc, /* special_function */
1691          "R_SH_IMM_LOW16",      /* name */
1692          FALSE,                 /* partial_inplace */
1693          0,                     /* src_mask */
1694          0x3fffc00,             /* dst_mask */
1695          FALSE),                /* pcrel_offset */
1696
1697   /* Used in MOVI and SHORI ((x - $) & 65536).  */
1698   HOWTO (R_SH_IMM_LOW16_PCREL,  /* type */
1699          0,                     /* rightshift */
1700          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1701          64,                    /* bitsize */
1702          TRUE,                  /* pc_relative */
1703          10,                    /* bitpos */
1704          complain_overflow_dont, /* complain_on_overflow */
1705          bfd_elf_generic_reloc, /* special_function */
1706          "R_SH_IMM_LOW16_PCREL", /* name */
1707          FALSE,                 /* partial_inplace */
1708          0,                     /* src_mask */
1709          0x3fffc00,             /* dst_mask */
1710          TRUE),                 /* pcrel_offset */
1711
1712   /* Used in MOVI and SHORI ((x >> 16) & 65536).  */
1713   HOWTO (R_SH_IMM_MEDLOW16,     /* type */
1714          16,                    /* rightshift */
1715          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1716          64,                    /* bitsize */
1717          FALSE,                 /* pc_relative */
1718          10,                    /* bitpos */
1719          complain_overflow_dont, /* complain_on_overflow */
1720          bfd_elf_generic_reloc, /* special_function */
1721          "R_SH_IMM_MEDLOW16",   /* name */
1722          FALSE,                 /* partial_inplace */
1723          0,                     /* src_mask */
1724          0x3fffc00,             /* dst_mask */
1725          FALSE),                /* pcrel_offset */
1726
1727   /* Used in MOVI and SHORI (((x - $) >> 16) & 65536).  */
1728   HOWTO (R_SH_IMM_MEDLOW16_PCREL, /* type */
1729          16,                    /* rightshift */
1730          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1731          64,                    /* bitsize */
1732          TRUE,                  /* pc_relative */
1733          10,                    /* bitpos */
1734          complain_overflow_dont, /* complain_on_overflow */
1735          bfd_elf_generic_reloc, /* special_function */
1736          "R_SH_IMM_MEDLOW16_PCREL", /* name */
1737          FALSE,                 /* partial_inplace */
1738          0,                     /* src_mask */
1739          0x3fffc00,             /* dst_mask */
1740          TRUE),                 /* pcrel_offset */
1741
1742   /* Used in MOVI and SHORI ((x >> 32) & 65536).  */
1743   HOWTO (R_SH_IMM_MEDHI16,      /* type */
1744          32,                    /* rightshift */
1745          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1746          64,                    /* bitsize */
1747          FALSE,                 /* pc_relative */
1748          10,                    /* bitpos */
1749          complain_overflow_dont, /* complain_on_overflow */
1750          bfd_elf_generic_reloc, /* special_function */
1751          "R_SH_IMM_MEDHI16",    /* name */
1752          FALSE,                 /* partial_inplace */
1753          0,                     /* src_mask */
1754          0x3fffc00,             /* dst_mask */
1755          FALSE),                /* pcrel_offset */
1756
1757   /* Used in MOVI and SHORI (((x - $) >> 32) & 65536).  */
1758   HOWTO (R_SH_IMM_MEDHI16_PCREL, /* type */
1759          32,                    /* rightshift */
1760          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1761          64,                    /* bitsize */
1762          TRUE,                  /* pc_relative */
1763          10,                    /* bitpos */
1764          complain_overflow_dont, /* complain_on_overflow */
1765          bfd_elf_generic_reloc, /* special_function */
1766          "R_SH_IMM_MEDHI16_PCREL", /* name */
1767          FALSE,                 /* partial_inplace */
1768          0,                     /* src_mask */
1769          0x3fffc00,             /* dst_mask */
1770          TRUE),                 /* pcrel_offset */
1771
1772   /* Used in MOVI and SHORI ((x >> 48) & 65536).  */
1773   HOWTO (R_SH_IMM_HI16,         /* type */
1774          48,                    /* rightshift */
1775          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1776          64,                    /* bitsize */
1777          FALSE,                 /* pc_relative */
1778          10,                    /* bitpos */
1779          complain_overflow_dont, /* complain_on_overflow */
1780          bfd_elf_generic_reloc, /* special_function */
1781          "R_SH_IMM_HI16",       /* name */
1782          FALSE,                 /* partial_inplace */
1783          0,                     /* src_mask */
1784          0x3fffc00,             /* dst_mask */
1785          FALSE),                /* pcrel_offset */
1786
1787   /* Used in MOVI and SHORI (((x - $) >> 48) & 65536).  */
1788   HOWTO (R_SH_IMM_HI16_PCREL,   /* type */
1789          48,                    /* rightshift */
1790          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1791          64,                    /* bitsize */
1792          TRUE,                  /* pc_relative */
1793          10,                    /* bitpos */
1794          complain_overflow_dont, /* complain_on_overflow */
1795          bfd_elf_generic_reloc, /* special_function */
1796          "R_SH_IMM_HI16_PCREL", /* name */
1797          FALSE,                 /* partial_inplace */
1798          0,                     /* src_mask */
1799          0x3fffc00,             /* dst_mask */
1800          TRUE),                 /* pcrel_offset */
1801
1802   /* For the .uaquad pseudo.  */
1803   HOWTO (R_SH_64,               /* type */
1804          0,                     /* rightshift */
1805          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1806          64,                    /* bitsize */
1807          FALSE,                 /* pc_relative */
1808          0,                     /* bitpos */
1809          complain_overflow_dont, /* complain_on_overflow */
1810          bfd_elf_generic_reloc, /* special_function */
1811          "R_SH_64",             /* name */
1812          FALSE,                 /* partial_inplace */
1813          0,                     /* src_mask */
1814          ((bfd_vma) 0) - 1,     /* dst_mask */
1815          FALSE),                /* pcrel_offset */
1816
1817   /* For the .uaquad pseudo, (x - $).  */
1818   HOWTO (R_SH_64_PCREL,         /* type */
1819          48,                    /* rightshift */
1820          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1821          64,                    /* bitsize */
1822          TRUE,                  /* pc_relative */
1823          10,                    /* bitpos */
1824          complain_overflow_dont, /* complain_on_overflow */
1825          bfd_elf_generic_reloc, /* special_function */
1826          "R_SH_64_PCREL",       /* name */
1827          FALSE,                 /* partial_inplace */
1828          0,                     /* src_mask */
1829          ((bfd_vma) 0) - 1,     /* dst_mask */
1830          TRUE),                 /* pcrel_offset */
1831
1832 #endif
1833 };
1834
1835 static bfd_reloc_status_type
1836 sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED, bfd *input_bfd,
1837                    asection *input_section, bfd_byte *contents,
1838                    bfd_vma addr, asection *symbol_section,
1839                    bfd_vma start, bfd_vma end)
1840 {
1841   static bfd_vma last_addr;
1842   static asection *last_symbol_section;
1843   bfd_byte *start_ptr, *ptr, *last_ptr;
1844   int diff, cum_diff;
1845   bfd_signed_vma x;
1846   int insn;
1847
1848   /* Sanity check the address.  */
1849   if (addr > bfd_get_section_limit (input_bfd, input_section))
1850     return bfd_reloc_outofrange;
1851
1852   /* We require the start and end relocations to be processed consecutively -
1853      although we allow then to be processed forwards or backwards.  */
1854   if (! last_addr)
1855     {
1856       last_addr = addr;
1857       last_symbol_section = symbol_section;
1858       return bfd_reloc_ok;
1859     }
1860   if (last_addr != addr)
1861     abort ();
1862   last_addr = 0;
1863
1864   if (! symbol_section || last_symbol_section != symbol_section || end < start)
1865     return bfd_reloc_outofrange;
1866
1867   /* Get the symbol_section contents.  */
1868   if (symbol_section != input_section)
1869     {
1870       if (elf_section_data (symbol_section)->this_hdr.contents != NULL)
1871         contents = elf_section_data (symbol_section)->this_hdr.contents;
1872       else
1873         {
1874           if (!bfd_malloc_and_get_section (input_bfd, symbol_section,
1875                                            &contents))
1876             {
1877               if (contents != NULL)
1878                 free (contents);
1879               return bfd_reloc_outofrange;
1880             }
1881         }
1882     }
1883 #define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800)
1884   start_ptr = contents + start;
1885   for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;)
1886     {
1887       for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);)
1888         ptr -= 2;
1889       ptr += 2;
1890       diff = (last_ptr - ptr) >> 1;
1891       cum_diff += diff & 1;
1892       cum_diff += diff;
1893     }
1894   /* Calculate the start / end values to load into rs / re minus four -
1895      so that will cancel out the four we would otherwise have to add to
1896      addr to get the value to subtract in order to get relative addressing.  */
1897   if (cum_diff >= 0)
1898     {
1899       start -= 4;
1900       end = (ptr + cum_diff * 2) - contents;
1901     }
1902   else
1903     {
1904       bfd_vma start0 = start - 4;
1905
1906       while (start0 && IS_PPI (contents + start0))
1907         start0 -= 2;
1908       start0 = start - 2 - ((start - start0) & 2);
1909       start = start0 - cum_diff - 2;
1910       end = start0;
1911     }
1912
1913   if (contents != NULL
1914       && elf_section_data (symbol_section)->this_hdr.contents != contents)
1915     free (contents);
1916
1917   insn = bfd_get_16 (input_bfd, contents + addr);
1918
1919   x = (insn & 0x200 ? end : start) - addr;
1920   if (input_section != symbol_section)
1921     x += ((symbol_section->output_section->vma + symbol_section->output_offset)
1922           - (input_section->output_section->vma
1923              + input_section->output_offset));
1924   x >>= 1;
1925   if (x < -128 || x > 127)
1926     return bfd_reloc_overflow;
1927
1928   x = (insn & ~0xff) | (x & 0xff);
1929   bfd_put_16 (input_bfd, (bfd_vma) x, contents + addr);
1930
1931   return bfd_reloc_ok;
1932 }
1933
1934 /* This function is used for normal relocs.  This used to be like the COFF
1935    function, and is almost certainly incorrect for other ELF targets.  */
1936
1937 static bfd_reloc_status_type
1938 sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in,
1939               void *data, asection *input_section, bfd *output_bfd,
1940               char **error_message ATTRIBUTE_UNUSED)
1941 {
1942   unsigned long insn;
1943   bfd_vma sym_value;
1944   enum elf_sh_reloc_type r_type;
1945   bfd_vma addr = reloc_entry->address;
1946   bfd_byte *hit_data = addr + (bfd_byte *) data;
1947
1948   r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type;
1949
1950   if (output_bfd != NULL)
1951     {
1952       /* Partial linking--do nothing.  */
1953       reloc_entry->address += input_section->output_offset;
1954       return bfd_reloc_ok;
1955     }
1956
1957   /* Almost all relocs have to do with relaxing.  If any work must be
1958      done for them, it has been done in sh_relax_section.  */
1959   if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0)
1960     return bfd_reloc_ok;
1961
1962   if (symbol_in != NULL
1963       && bfd_is_und_section (symbol_in->section))
1964     return bfd_reloc_undefined;
1965
1966   if (bfd_is_com_section (symbol_in->section))
1967     sym_value = 0;
1968   else
1969     sym_value = (symbol_in->value +
1970                  symbol_in->section->output_section->vma +
1971                  symbol_in->section->output_offset);
1972
1973   switch (r_type)
1974     {
1975     case R_SH_DIR32:
1976       insn = bfd_get_32 (abfd, hit_data);
1977       insn += sym_value + reloc_entry->addend;
1978       bfd_put_32 (abfd, (bfd_vma) insn, hit_data);
1979       break;
1980     case R_SH_IND12W:
1981       insn = bfd_get_16 (abfd, hit_data);
1982       sym_value += reloc_entry->addend;
1983       sym_value -= (input_section->output_section->vma
1984                     + input_section->output_offset
1985                     + addr
1986                     + 4);
1987       sym_value += (insn & 0xfff) << 1;
1988       if (insn & 0x800)
1989         sym_value -= 0x1000;
1990       insn = (insn & 0xf000) | (sym_value & 0xfff);
1991       bfd_put_16 (abfd, (bfd_vma) insn, hit_data);
1992       if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000)
1993         return bfd_reloc_overflow;
1994       break;
1995     default:
1996       abort ();
1997       break;
1998     }
1999
2000   return bfd_reloc_ok;
2001 }
2002
2003 /* This function is used for relocs which are only used for relaxing,
2004    which the linker should otherwise ignore.  */
2005
2006 static bfd_reloc_status_type
2007 sh_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2008                      asymbol *symbol ATTRIBUTE_UNUSED,
2009                      void *data ATTRIBUTE_UNUSED, asection *input_section,
2010                      bfd *output_bfd,
2011                      char **error_message ATTRIBUTE_UNUSED)
2012 {
2013   if (output_bfd != NULL)
2014     reloc_entry->address += input_section->output_offset;
2015   return bfd_reloc_ok;
2016 }
2017
2018 /* This structure is used to map BFD reloc codes to SH ELF relocs.  */
2019
2020 struct elf_reloc_map
2021 {
2022   bfd_reloc_code_real_type bfd_reloc_val;
2023   unsigned char elf_reloc_val;
2024 };
2025
2026 /* An array mapping BFD reloc codes to SH ELF relocs.  */
2027
2028 static const struct elf_reloc_map sh_reloc_map[] =
2029 {
2030   { BFD_RELOC_NONE, R_SH_NONE },
2031   { BFD_RELOC_32, R_SH_DIR32 },
2032   { BFD_RELOC_16, R_SH_DIR16 },
2033   { BFD_RELOC_8, R_SH_DIR8 },
2034   { BFD_RELOC_CTOR, R_SH_DIR32 },
2035   { BFD_RELOC_32_PCREL, R_SH_REL32 },
2036   { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN },
2037   { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W },
2038   { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ },
2039   { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL },
2040   { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
2041   { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
2042   { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
2043   { BFD_RELOC_SH_USES, R_SH_USES },
2044   { BFD_RELOC_SH_COUNT, R_SH_COUNT },
2045   { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
2046   { BFD_RELOC_SH_CODE, R_SH_CODE },
2047   { BFD_RELOC_SH_DATA, R_SH_DATA },
2048   { BFD_RELOC_SH_LABEL, R_SH_LABEL },
2049   { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT },
2050   { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY },
2051   { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START },
2052   { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END },
2053   { BFD_RELOC_SH_TLS_GD_32, R_SH_TLS_GD_32 },
2054   { BFD_RELOC_SH_TLS_LD_32, R_SH_TLS_LD_32 },
2055   { BFD_RELOC_SH_TLS_LDO_32, R_SH_TLS_LDO_32 },
2056   { BFD_RELOC_SH_TLS_IE_32, R_SH_TLS_IE_32 },
2057   { BFD_RELOC_SH_TLS_LE_32, R_SH_TLS_LE_32 },
2058   { BFD_RELOC_SH_TLS_DTPMOD32, R_SH_TLS_DTPMOD32 },
2059   { BFD_RELOC_SH_TLS_DTPOFF32, R_SH_TLS_DTPOFF32 },
2060   { BFD_RELOC_SH_TLS_TPOFF32, R_SH_TLS_TPOFF32 },
2061   { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 },
2062   { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 },
2063   { BFD_RELOC_SH_COPY, R_SH_COPY },
2064   { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT },
2065   { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT },
2066   { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE },
2067   { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF },
2068   { BFD_RELOC_SH_GOTPC, R_SH_GOTPC },
2069   { BFD_RELOC_SH_GOTPLT32, R_SH_GOTPLT32 },
2070 #ifdef INCLUDE_SHMEDIA
2071   { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 },
2072   { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 },
2073   { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 },
2074   { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 },
2075   { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 },
2076   { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 },
2077   { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 },
2078   { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 },
2079   { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 },
2080   { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 },
2081   { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 },
2082   { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 },
2083   { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 },
2084   { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 },
2085   { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 },
2086   { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 },
2087   { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 },
2088   { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 },
2089   { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 },
2090   { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 },
2091   { BFD_RELOC_SH_COPY64, R_SH_COPY64 },
2092   { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 },
2093   { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 },
2094   { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 },
2095   { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 },
2096   { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 },
2097   { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 },
2098   { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 },
2099   { BFD_RELOC_SH_PT_16, R_SH_PT_16 },
2100   { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE },
2101   { BFD_RELOC_SH_IMMU5, R_SH_DIR5U },
2102   { BFD_RELOC_SH_IMMS6, R_SH_DIR6S },
2103   { BFD_RELOC_SH_IMMU6, R_SH_DIR6U },
2104   { BFD_RELOC_SH_IMMS10, R_SH_DIR10S },
2105   { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW },
2106   { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL },
2107   { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ },
2108   { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 },
2109   { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 },
2110   { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 },
2111   { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL },
2112   { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 },
2113   { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL },
2114   { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 },
2115   { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL },
2116   { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 },
2117   { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL },
2118   { BFD_RELOC_64, R_SH_64 },
2119   { BFD_RELOC_64_PCREL, R_SH_64_PCREL },
2120 #endif /* not INCLUDE_SHMEDIA */
2121 };
2122
2123 /* Given a BFD reloc code, return the howto structure for the
2124    corresponding SH ELf reloc.  */
2125
2126 static reloc_howto_type *
2127 sh_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2128                           bfd_reloc_code_real_type code)
2129 {
2130   unsigned int i;
2131
2132   for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++)
2133     {
2134       if (sh_reloc_map[i].bfd_reloc_val == code)
2135         return &sh_elf_howto_table[(int) sh_reloc_map[i].elf_reloc_val];
2136     }
2137
2138   return NULL;
2139 }
2140
2141 /* Given an ELF reloc, fill in the howto field of a relent.  */
2142
2143 static void
2144 sh_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2145                       Elf_Internal_Rela *dst)
2146 {
2147   unsigned int r;
2148
2149   r = ELF32_R_TYPE (dst->r_info);
2150
2151   BFD_ASSERT (r < (unsigned int) R_SH_max);
2152   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC);
2153   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2);
2154   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3);
2155   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4);
2156   BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5);
2157
2158   cache_ptr->howto = &sh_elf_howto_table[r];
2159 }
2160 \f
2161 /* This function handles relaxing for SH ELF.  See the corresponding
2162    function in coff-sh.c for a description of what this does.  FIXME:
2163    There is a lot of duplication here between this code and the COFF
2164    specific code.  The format of relocs and symbols is wound deeply
2165    into this code, but it would still be better if the duplication
2166    could be eliminated somehow.  Note in particular that although both
2167    functions use symbols like R_SH_CODE, those symbols have different
2168    values; in coff-sh.c they come from include/coff/sh.h, whereas here
2169    they come from enum elf_sh_reloc_type in include/elf/sh.h.  */
2170
2171 static bfd_boolean
2172 sh_elf_relax_section (bfd *abfd, asection *sec,
2173                       struct bfd_link_info *link_info, bfd_boolean *again)
2174 {
2175   Elf_Internal_Shdr *symtab_hdr;
2176   Elf_Internal_Rela *internal_relocs;
2177   bfd_boolean have_code;
2178   Elf_Internal_Rela *irel, *irelend;
2179   bfd_byte *contents = NULL;
2180   Elf_Internal_Sym *isymbuf = NULL;
2181
2182   *again = FALSE;
2183
2184   if (link_info->relocatable
2185       || (sec->flags & SEC_RELOC) == 0
2186       || sec->reloc_count == 0)
2187     return TRUE;
2188
2189 #ifdef INCLUDE_SHMEDIA
2190   if (elf_section_data (sec)->this_hdr.sh_flags
2191       & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED))
2192     {
2193       return TRUE;
2194     }
2195 #endif
2196
2197   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2198
2199   internal_relocs = (_bfd_elf_link_read_relocs
2200                      (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
2201                       link_info->keep_memory));
2202   if (internal_relocs == NULL)
2203     goto error_return;
2204
2205   have_code = FALSE;
2206
2207   irelend = internal_relocs + sec->reloc_count;
2208   for (irel = internal_relocs; irel < irelend; irel++)
2209     {
2210       bfd_vma laddr, paddr, symval;
2211       unsigned short insn;
2212       Elf_Internal_Rela *irelfn, *irelscan, *irelcount;
2213       bfd_signed_vma foff;
2214
2215       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE)
2216         have_code = TRUE;
2217
2218       if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES)
2219         continue;
2220
2221       /* Get the section contents.  */
2222       if (contents == NULL)
2223         {
2224           if (elf_section_data (sec)->this_hdr.contents != NULL)
2225             contents = elf_section_data (sec)->this_hdr.contents;
2226           else
2227             {
2228               if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2229                 goto error_return;
2230             }
2231         }
2232
2233       /* The r_addend field of the R_SH_USES reloc will point us to
2234          the register load.  The 4 is because the r_addend field is
2235          computed as though it were a jump offset, which are based
2236          from 4 bytes after the jump instruction.  */
2237       laddr = irel->r_offset + 4 + irel->r_addend;
2238       if (laddr >= sec->size)
2239         {
2240           (*_bfd_error_handler) (_("%s: 0x%lx: warning: bad R_SH_USES offset"),
2241                                  bfd_archive_filename (abfd),
2242                                  (unsigned long) irel->r_offset);
2243           continue;
2244         }
2245       insn = bfd_get_16 (abfd, contents + laddr);
2246
2247       /* If the instruction is not mov.l NN,rN, we don't know what to
2248          do.  */
2249       if ((insn & 0xf000) != 0xd000)
2250         {
2251           ((*_bfd_error_handler)
2252            (_("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"),
2253             bfd_archive_filename (abfd), (unsigned long) irel->r_offset, insn));
2254           continue;
2255         }
2256
2257       /* Get the address from which the register is being loaded.  The
2258          displacement in the mov.l instruction is quadrupled.  It is a
2259          displacement from four bytes after the movl instruction, but,
2260          before adding in the PC address, two least significant bits
2261          of the PC are cleared.  We assume that the section is aligned
2262          on a four byte boundary.  */
2263       paddr = insn & 0xff;
2264       paddr *= 4;
2265       paddr += (laddr + 4) &~ (bfd_vma) 3;
2266       if (paddr >= sec->size)
2267         {
2268           ((*_bfd_error_handler)
2269            (_("%s: 0x%lx: warning: bad R_SH_USES load offset"),
2270             bfd_archive_filename (abfd), (unsigned long) irel->r_offset));
2271           continue;
2272         }
2273
2274       /* Get the reloc for the address from which the register is
2275          being loaded.  This reloc will tell us which function is
2276          actually being called.  */
2277       for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
2278         if (irelfn->r_offset == paddr
2279             && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32)
2280           break;
2281       if (irelfn >= irelend)
2282         {
2283           ((*_bfd_error_handler)
2284            (_("%s: 0x%lx: warning: could not find expected reloc"),
2285             bfd_archive_filename (abfd), (unsigned long) paddr));
2286           continue;
2287         }
2288
2289       /* Read this BFD's symbols if we haven't done so already.  */
2290       if (isymbuf == NULL && symtab_hdr->sh_info != 0)
2291         {
2292           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2293           if (isymbuf == NULL)
2294             isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2295                                             symtab_hdr->sh_info, 0,
2296                                             NULL, NULL, NULL);
2297           if (isymbuf == NULL)
2298             goto error_return;
2299         }
2300
2301       /* Get the value of the symbol referred to by the reloc.  */
2302       if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
2303         {
2304           /* A local symbol.  */
2305           Elf_Internal_Sym *isym;
2306
2307           isym = isymbuf + ELF32_R_SYM (irelfn->r_info);
2308           if (isym->st_shndx
2309               != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec))
2310             {
2311               ((*_bfd_error_handler)
2312                (_("%s: 0x%lx: warning: symbol in unexpected section"),
2313                 bfd_archive_filename (abfd), (unsigned long) paddr));
2314               continue;
2315             }
2316
2317           symval = (isym->st_value
2318                     + sec->output_section->vma
2319                     + sec->output_offset);
2320         }
2321       else
2322         {
2323           unsigned long indx;
2324           struct elf_link_hash_entry *h;
2325
2326           indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info;
2327           h = elf_sym_hashes (abfd)[indx];
2328           BFD_ASSERT (h != NULL);
2329           if (h->root.type != bfd_link_hash_defined
2330               && h->root.type != bfd_link_hash_defweak)
2331             {
2332               /* This appears to be a reference to an undefined
2333                  symbol.  Just ignore it--it will be caught by the
2334                  regular reloc processing.  */
2335               continue;
2336             }
2337
2338           symval = (h->root.u.def.value
2339                     + h->root.u.def.section->output_section->vma
2340                     + h->root.u.def.section->output_offset);
2341         }
2342
2343       symval += bfd_get_32 (abfd, contents + paddr);
2344
2345       /* See if this function call can be shortened.  */
2346       foff = (symval
2347               - (irel->r_offset
2348                  + sec->output_section->vma
2349                  + sec->output_offset
2350                  + 4));
2351       if (foff < -0x1000 || foff >= 0x1000)
2352         {
2353           /* After all that work, we can't shorten this function call.  */
2354           continue;
2355         }
2356
2357       /* Shorten the function call.  */
2358
2359       /* For simplicity of coding, we are going to modify the section
2360          contents, the section relocs, and the BFD symbol table.  We
2361          must tell the rest of the code not to free up this
2362          information.  It would be possible to instead create a table
2363          of changes which have to be made, as is done in coff-mips.c;
2364          that would be more work, but would require less memory when
2365          the linker is run.  */
2366
2367       elf_section_data (sec)->relocs = internal_relocs;
2368       elf_section_data (sec)->this_hdr.contents = contents;
2369       symtab_hdr->contents = (unsigned char *) isymbuf;
2370
2371       /* Replace the jsr with a bsr.  */
2372
2373       /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and
2374          replace the jsr with a bsr.  */
2375       irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W);
2376       /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
2377          here, but that only checks if the symbol is an external symbol,
2378          not if the symbol is in a different section.  Besides, we need
2379          a consistent meaning for the relocation, so we just assume here that
2380          the value of the symbol is not available.  */
2381 #if 0
2382       if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info)
2383         {
2384           /* If this needs to be changed because of future relaxing,
2385              it will be handled here like other internal IND12W
2386              relocs.  */
2387           bfd_put_16 (abfd,
2388                       (bfd_vma) 0xb000 | ((foff >> 1) & 0xfff),
2389                       contents + irel->r_offset);
2390         }
2391       else
2392 #endif
2393         {
2394           /* We can't fully resolve this yet, because the external
2395              symbol value may be changed by future relaxing.  We let
2396              the final link phase handle it.  */
2397           bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset);
2398         }
2399       irel->r_addend = -4;
2400
2401       /* See if there is another R_SH_USES reloc referring to the same
2402          register load.  */
2403       for (irelscan = internal_relocs; irelscan < irelend; irelscan++)
2404         if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES
2405             && laddr == irelscan->r_offset + 4 + irelscan->r_addend)
2406           break;
2407       if (irelscan < irelend)
2408         {
2409           /* Some other function call depends upon this register load,
2410              and we have not yet converted that function call.
2411              Indeed, we may never be able to convert it.  There is
2412              nothing else we can do at this point.  */
2413           continue;
2414         }
2415
2416       /* Look for a R_SH_COUNT reloc on the location where the
2417          function address is stored.  Do this before deleting any
2418          bytes, to avoid confusion about the address.  */
2419       for (irelcount = internal_relocs; irelcount < irelend; irelcount++)
2420         if (irelcount->r_offset == paddr
2421             && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT)
2422           break;
2423
2424       /* Delete the register load.  */
2425       if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2))
2426         goto error_return;
2427
2428       /* That will change things, so, just in case it permits some
2429          other function call to come within range, we should relax
2430          again.  Note that this is not required, and it may be slow.  */
2431       *again = TRUE;
2432
2433       /* Now check whether we got a COUNT reloc.  */
2434       if (irelcount >= irelend)
2435         {
2436           ((*_bfd_error_handler)
2437            (_("%s: 0x%lx: warning: could not find expected COUNT reloc"),
2438             bfd_archive_filename (abfd), (unsigned long) paddr));
2439           continue;
2440         }
2441
2442       /* The number of uses is stored in the r_addend field.  We've
2443          just deleted one.  */
2444       if (irelcount->r_addend == 0)
2445         {
2446           ((*_bfd_error_handler) (_("%s: 0x%lx: warning: bad count"),
2447                                   bfd_archive_filename (abfd),
2448                                   (unsigned long) paddr));
2449           continue;
2450         }
2451
2452       --irelcount->r_addend;
2453
2454       /* If there are no more uses, we can delete the address.  Reload
2455          the address from irelfn, in case it was changed by the
2456          previous call to sh_elf_relax_delete_bytes.  */
2457       if (irelcount->r_addend == 0)
2458         {
2459           if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4))
2460             goto error_return;
2461         }
2462
2463       /* We've done all we can with that function call.  */
2464     }
2465
2466   /* Look for load and store instructions that we can align on four
2467      byte boundaries.  */
2468   if ((elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK) != EF_SH4
2469       && have_code)
2470     {
2471       bfd_boolean swapped;
2472
2473       /* Get the section contents.  */
2474       if (contents == NULL)
2475         {
2476           if (elf_section_data (sec)->this_hdr.contents != NULL)
2477             contents = elf_section_data (sec)->this_hdr.contents;
2478           else
2479             {
2480               if (!bfd_malloc_and_get_section (abfd, sec, &contents))
2481                 goto error_return;
2482             }
2483         }
2484
2485       if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents,
2486                                 &swapped))
2487         goto error_return;
2488
2489       if (swapped)
2490         {
2491           elf_section_data (sec)->relocs = internal_relocs;
2492           elf_section_data (sec)->this_hdr.contents = contents;
2493           symtab_hdr->contents = (unsigned char *) isymbuf;
2494         }
2495     }
2496
2497   if (isymbuf != NULL
2498       && symtab_hdr->contents != (unsigned char *) isymbuf)
2499     {
2500       if (! link_info->keep_memory)
2501         free (isymbuf);
2502       else
2503         {
2504           /* Cache the symbols for elf_link_input_bfd.  */
2505           symtab_hdr->contents = (unsigned char *) isymbuf;
2506         }
2507     }
2508
2509   if (contents != NULL
2510       && elf_section_data (sec)->this_hdr.contents != contents)
2511     {
2512       if (! link_info->keep_memory)
2513         free (contents);
2514       else
2515         {
2516           /* Cache the section contents for elf_link_input_bfd.  */
2517           elf_section_data (sec)->this_hdr.contents = contents;
2518         }
2519     }
2520
2521   if (internal_relocs != NULL
2522       && elf_section_data (sec)->relocs != internal_relocs)
2523     free (internal_relocs);
2524
2525   return TRUE;
2526
2527  error_return:
2528   if (isymbuf != NULL
2529       && symtab_hdr->contents != (unsigned char *) isymbuf)
2530     free (isymbuf);
2531   if (contents != NULL
2532       && elf_section_data (sec)->this_hdr.contents != contents)
2533     free (contents);
2534   if (internal_relocs != NULL
2535       && elf_section_data (sec)->relocs != internal_relocs)
2536     free (internal_relocs);
2537
2538   return FALSE;
2539 }
2540
2541 /* Delete some bytes from a section while relaxing.  FIXME: There is a
2542    lot of duplication between this function and sh_relax_delete_bytes
2543    in coff-sh.c.  */
2544
2545 static bfd_boolean
2546 sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr,
2547                            int count)
2548 {
2549   Elf_Internal_Shdr *symtab_hdr;
2550   unsigned int sec_shndx;
2551   bfd_byte *contents;
2552   Elf_Internal_Rela *irel, *irelend;
2553   Elf_Internal_Rela *irelalign;
2554   bfd_vma toaddr;
2555   Elf_Internal_Sym *isymbuf, *isym, *isymend;
2556   struct elf_link_hash_entry **sym_hashes;
2557   struct elf_link_hash_entry **end_hashes;
2558   unsigned int symcount;
2559   asection *o;
2560
2561   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2562   isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2563
2564   sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
2565
2566   contents = elf_section_data (sec)->this_hdr.contents;
2567
2568   /* The deletion must stop at the next ALIGN reloc for an aligment
2569      power larger than the number of bytes we are deleting.  */
2570
2571   irelalign = NULL;
2572   toaddr = sec->size;
2573
2574   irel = elf_section_data (sec)->relocs;
2575   irelend = irel + sec->reloc_count;
2576   for (; irel < irelend; irel++)
2577     {
2578       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
2579           && irel->r_offset > addr
2580           && count < (1 << irel->r_addend))
2581         {
2582           irelalign = irel;
2583           toaddr = irel->r_offset;
2584           break;
2585         }
2586     }
2587
2588   /* Actually delete the bytes.  */
2589   memmove (contents + addr, contents + addr + count,
2590            (size_t) (toaddr - addr - count));
2591   if (irelalign == NULL)
2592     sec->size -= count;
2593   else
2594     {
2595       int i;
2596
2597 #define NOP_OPCODE (0x0009)
2598
2599       BFD_ASSERT ((count & 1) == 0);
2600       for (i = 0; i < count; i += 2)
2601         bfd_put_16 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i);
2602     }
2603
2604   /* Adjust all the relocs.  */
2605   for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
2606     {
2607       bfd_vma nraddr, stop;
2608       bfd_vma start = 0;
2609       int insn = 0;
2610       int off, adjust, oinsn;
2611       bfd_signed_vma voff = 0;
2612       bfd_boolean overflow;
2613
2614       /* Get the new reloc address.  */
2615       nraddr = irel->r_offset;
2616       if ((irel->r_offset > addr
2617            && irel->r_offset < toaddr)
2618           || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN
2619               && irel->r_offset == toaddr))
2620         nraddr -= count;
2621
2622       /* See if this reloc was for the bytes we have deleted, in which
2623          case we no longer care about it.  Don't delete relocs which
2624          represent addresses, though.  */
2625       if (irel->r_offset >= addr
2626           && irel->r_offset < addr + count
2627           && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN
2628           && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE
2629           && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA
2630           && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL)
2631         irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
2632                                      (int) R_SH_NONE);
2633
2634       /* If this is a PC relative reloc, see if the range it covers
2635          includes the bytes we have deleted.  */
2636       switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
2637         {
2638         default:
2639           break;
2640
2641         case R_SH_DIR8WPN:
2642         case R_SH_IND12W:
2643         case R_SH_DIR8WPZ:
2644         case R_SH_DIR8WPL:
2645           start = irel->r_offset;
2646           insn = bfd_get_16 (abfd, contents + nraddr);
2647           break;
2648         }
2649
2650       switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
2651         {
2652         default:
2653           start = stop = addr;
2654           break;
2655
2656         case R_SH_DIR32:
2657           /* If this reloc is against a symbol defined in this
2658              section, and the symbol will not be adjusted below, we
2659              must check the addend to see it will put the value in
2660              range to be adjusted, and hence must be changed.  */
2661           if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2662             {
2663               isym = isymbuf + ELF32_R_SYM (irel->r_info);
2664               if (isym->st_shndx == sec_shndx
2665                   && (isym->st_value <= addr
2666                       || isym->st_value >= toaddr))
2667                 {
2668                   bfd_vma val;
2669
2670                   val = bfd_get_32 (abfd, contents + nraddr);
2671                   val += isym->st_value;
2672                   if (val > addr && val < toaddr)
2673                     bfd_put_32 (abfd, val - count, contents + nraddr);
2674                 }
2675             }
2676           start = stop = addr;
2677           break;
2678
2679         case R_SH_DIR8WPN:
2680           off = insn & 0xff;
2681           if (off & 0x80)
2682             off -= 0x100;
2683           stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
2684           break;
2685
2686         case R_SH_IND12W:
2687           off = insn & 0xfff;
2688           if (! off)
2689             {
2690               /* This has been made by previous relaxation.  Since the
2691                  relocation will be against an external symbol, the
2692                  final relocation will just do the right thing.  */
2693               start = stop = addr;
2694             }
2695           else
2696             {
2697               if (off & 0x800)
2698                 off -= 0x1000;
2699               stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2);
2700
2701               /* The addend will be against the section symbol, thus
2702                  for adjusting the addend, the relevant start is the
2703                  start of the section.
2704                  N.B. If we want to abandon in-place changes here and
2705                  test directly using symbol + addend, we have to take into
2706                  account that the addend has already been adjusted by -4.  */
2707               if (stop > addr && stop < toaddr)
2708                 irel->r_addend -= count;
2709             }
2710           break;
2711
2712         case R_SH_DIR8WPZ:
2713           off = insn & 0xff;
2714           stop = start + 4 + off * 2;
2715           break;
2716
2717         case R_SH_DIR8WPL:
2718           off = insn & 0xff;
2719           stop = (start & ~(bfd_vma) 3) + 4 + off * 4;
2720           break;
2721
2722         case R_SH_SWITCH8:
2723         case R_SH_SWITCH16:
2724         case R_SH_SWITCH32:
2725           /* These relocs types represent
2726                .word L2-L1
2727              The r_addend field holds the difference between the reloc
2728              address and L1.  That is the start of the reloc, and
2729              adding in the contents gives us the top.  We must adjust
2730              both the r_offset field and the section contents.
2731              N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset,
2732              and the elf bfd r_offset is called r_vaddr.  */
2733
2734           stop = irel->r_offset;
2735           start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend);
2736
2737           if (start > addr
2738               && start < toaddr
2739               && (stop <= addr || stop >= toaddr))
2740             irel->r_addend += count;
2741           else if (stop > addr
2742                    && stop < toaddr
2743                    && (start <= addr || start >= toaddr))
2744             irel->r_addend -= count;
2745
2746           if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16)
2747             voff = bfd_get_signed_16 (abfd, contents + nraddr);
2748           else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8)
2749             voff = bfd_get_8 (abfd, contents + nraddr);
2750           else
2751             voff = bfd_get_signed_32 (abfd, contents + nraddr);
2752           stop = (bfd_vma) ((bfd_signed_vma) start + voff);
2753
2754           break;
2755
2756         case R_SH_USES:
2757           start = irel->r_offset;
2758           stop = (bfd_vma) ((bfd_signed_vma) start
2759                             + (long) irel->r_addend
2760                             + 4);
2761           break;
2762         }
2763
2764       if (start > addr
2765           && start < toaddr
2766           && (stop <= addr || stop >= toaddr))
2767         adjust = count;
2768       else if (stop > addr
2769                && stop < toaddr
2770                && (start <= addr || start >= toaddr))
2771         adjust = - count;
2772       else
2773         adjust = 0;
2774
2775       if (adjust != 0)
2776         {
2777           oinsn = insn;
2778           overflow = FALSE;
2779           switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info))
2780             {
2781             default:
2782               abort ();
2783               break;
2784
2785             case R_SH_DIR8WPN:
2786             case R_SH_DIR8WPZ:
2787               insn += adjust / 2;
2788               if ((oinsn & 0xff00) != (insn & 0xff00))
2789                 overflow = TRUE;
2790               bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
2791               break;
2792
2793             case R_SH_IND12W:
2794               insn += adjust / 2;
2795               if ((oinsn & 0xf000) != (insn & 0xf000))
2796                 overflow = TRUE;
2797               bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
2798               break;
2799
2800             case R_SH_DIR8WPL:
2801               BFD_ASSERT (adjust == count || count >= 4);
2802               if (count >= 4)
2803                 insn += adjust / 4;
2804               else
2805                 {
2806                   if ((irel->r_offset & 3) == 0)
2807                     ++insn;
2808                 }
2809               if ((oinsn & 0xff00) != (insn & 0xff00))
2810                 overflow = TRUE;
2811               bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr);
2812               break;
2813
2814             case R_SH_SWITCH8:
2815               voff += adjust;
2816               if (voff < 0 || voff >= 0xff)
2817                 overflow = TRUE;
2818               bfd_put_8 (abfd, voff, contents + nraddr);
2819               break;
2820
2821             case R_SH_SWITCH16:
2822               voff += adjust;
2823               if (voff < - 0x8000 || voff >= 0x8000)
2824                 overflow = TRUE;
2825               bfd_put_signed_16 (abfd, (bfd_vma) voff, contents + nraddr);
2826               break;
2827
2828             case R_SH_SWITCH32:
2829               voff += adjust;
2830               bfd_put_signed_32 (abfd, (bfd_vma) voff, contents + nraddr);
2831               break;
2832
2833             case R_SH_USES:
2834               irel->r_addend += adjust;
2835               break;
2836             }
2837
2838           if (overflow)
2839             {
2840               ((*_bfd_error_handler)
2841                (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
2842                 bfd_archive_filename (abfd), (unsigned long) irel->r_offset));
2843               bfd_set_error (bfd_error_bad_value);
2844               return FALSE;
2845             }
2846         }
2847
2848       irel->r_offset = nraddr;
2849     }
2850
2851   /* Look through all the other sections.  If there contain any IMM32
2852      relocs against internal symbols which we are not going to adjust
2853      below, we may need to adjust the addends.  */
2854   for (o = abfd->sections; o != NULL; o = o->next)
2855     {
2856       Elf_Internal_Rela *internal_relocs;
2857       Elf_Internal_Rela *irelscan, *irelscanend;
2858       bfd_byte *ocontents;
2859
2860       if (o == sec
2861           || (o->flags & SEC_RELOC) == 0
2862           || o->reloc_count == 0)
2863         continue;
2864
2865       /* We always cache the relocs.  Perhaps, if info->keep_memory is
2866          FALSE, we should free them, if we are permitted to, when we
2867          leave sh_coff_relax_section.  */
2868       internal_relocs = (_bfd_elf_link_read_relocs
2869                          (abfd, o, NULL, (Elf_Internal_Rela *) NULL, TRUE));
2870       if (internal_relocs == NULL)
2871         return FALSE;
2872
2873       ocontents = NULL;
2874       irelscanend = internal_relocs + o->reloc_count;
2875       for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++)
2876         {
2877           /* Dwarf line numbers use R_SH_SWITCH32 relocs.  */
2878           if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32)
2879             {
2880               bfd_vma start, stop;
2881               bfd_signed_vma voff;
2882
2883               if (ocontents == NULL)
2884                 {
2885                   if (elf_section_data (o)->this_hdr.contents != NULL)
2886                     ocontents = elf_section_data (o)->this_hdr.contents;
2887                   else
2888                     {
2889                       /* We always cache the section contents.
2890                          Perhaps, if info->keep_memory is FALSE, we
2891                          should free them, if we are permitted to,
2892                          when we leave sh_coff_relax_section.  */
2893                       if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
2894                         {
2895                           if (ocontents != NULL)
2896                             free (ocontents);
2897                           return FALSE;
2898                         }
2899
2900                       elf_section_data (o)->this_hdr.contents = ocontents;
2901                     }
2902                 }
2903
2904               stop = irelscan->r_offset;
2905               start
2906                 = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend);
2907
2908               /* STOP is in a different section, so it won't change.  */
2909               if (start > addr && start < toaddr)
2910                 irelscan->r_addend += count;
2911
2912               voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset);
2913               stop = (bfd_vma) ((bfd_signed_vma) start + voff);
2914
2915               if (start > addr
2916                   && start < toaddr
2917                   && (stop <= addr || stop >= toaddr))
2918                 bfd_put_signed_32 (abfd, (bfd_vma) voff + count,
2919                                    ocontents + irelscan->r_offset);
2920               else if (stop > addr
2921                        && stop < toaddr
2922                        && (start <= addr || start >= toaddr))
2923                 bfd_put_signed_32 (abfd, (bfd_vma) voff - count,
2924                                    ocontents + irelscan->r_offset);
2925             }
2926
2927           if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32)
2928             continue;
2929
2930           if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info)
2931             continue;
2932
2933
2934           isym = isymbuf + ELF32_R_SYM (irelscan->r_info);
2935           if (isym->st_shndx == sec_shndx
2936               && (isym->st_value <= addr
2937                   || isym->st_value >= toaddr))
2938             {
2939               bfd_vma val;
2940
2941               if (ocontents == NULL)
2942                 {
2943                   if (elf_section_data (o)->this_hdr.contents != NULL)
2944                     ocontents = elf_section_data (o)->this_hdr.contents;
2945                   else
2946                     {
2947                       /* We always cache the section contents.
2948                          Perhaps, if info->keep_memory is FALSE, we
2949                          should free them, if we are permitted to,
2950                          when we leave sh_coff_relax_section.  */
2951                       if (!bfd_malloc_and_get_section (abfd, o, &ocontents))
2952                         {
2953                           if (ocontents != NULL)
2954                             free (ocontents);
2955                           return FALSE;
2956                         }
2957
2958                       elf_section_data (o)->this_hdr.contents = ocontents;
2959                     }
2960                 }
2961
2962               val = bfd_get_32 (abfd, ocontents + irelscan->r_offset);
2963               val += isym->st_value;
2964               if (val > addr && val < toaddr)
2965                 bfd_put_32 (abfd, val - count,
2966                             ocontents + irelscan->r_offset);
2967             }
2968         }
2969     }
2970
2971   /* Adjust the local symbols defined in this section.  */
2972   isymend = isymbuf + symtab_hdr->sh_info;
2973   for (isym = isymbuf; isym < isymend; isym++)
2974     {
2975       if (isym->st_shndx == sec_shndx
2976           && isym->st_value > addr
2977           && isym->st_value < toaddr)
2978         isym->st_value -= count;
2979     }
2980
2981   /* Now adjust the global symbols defined in this section.  */
2982   symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2983               - symtab_hdr->sh_info);
2984   sym_hashes = elf_sym_hashes (abfd);
2985   end_hashes = sym_hashes + symcount;
2986   for (; sym_hashes < end_hashes; sym_hashes++)
2987     {
2988       struct elf_link_hash_entry *sym_hash = *sym_hashes;
2989       if ((sym_hash->root.type == bfd_link_hash_defined
2990            || sym_hash->root.type == bfd_link_hash_defweak)
2991           && sym_hash->root.u.def.section == sec
2992           && sym_hash->root.u.def.value > addr
2993           && sym_hash->root.u.def.value < toaddr)
2994         {
2995           sym_hash->root.u.def.value -= count;
2996         }
2997     }
2998
2999   /* See if we can move the ALIGN reloc forward.  We have adjusted
3000      r_offset for it already.  */
3001   if (irelalign != NULL)
3002     {
3003       bfd_vma alignto, alignaddr;
3004
3005       alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend);
3006       alignaddr = BFD_ALIGN (irelalign->r_offset,
3007                              1 << irelalign->r_addend);
3008       if (alignto != alignaddr)
3009         {
3010           /* Tail recursion.  */
3011           return sh_elf_relax_delete_bytes (abfd, sec, alignaddr,
3012                                             (int) (alignto - alignaddr));
3013         }
3014     }
3015
3016   return TRUE;
3017 }
3018
3019 /* Look for loads and stores which we can align to four byte
3020    boundaries.  This is like sh_align_loads in coff-sh.c.  */
3021
3022 static bfd_boolean
3023 sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
3024                     Elf_Internal_Rela *internal_relocs,
3025                     bfd_byte *contents ATTRIBUTE_UNUSED,
3026                     bfd_boolean *pswapped)
3027 {
3028   Elf_Internal_Rela *irel, *irelend;
3029   bfd_vma *labels = NULL;
3030   bfd_vma *label, *label_end;
3031   bfd_size_type amt;
3032
3033   *pswapped = FALSE;
3034
3035   irelend = internal_relocs + sec->reloc_count;
3036
3037   /* Get all the addresses with labels on them.  */
3038   amt = sec->reloc_count;
3039   amt *= sizeof (bfd_vma);
3040   labels = (bfd_vma *) bfd_malloc (amt);
3041   if (labels == NULL)
3042     goto error_return;
3043   label_end = labels;
3044   for (irel = internal_relocs; irel < irelend; irel++)
3045     {
3046       if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL)
3047         {
3048           *label_end = irel->r_offset;
3049           ++label_end;
3050         }
3051     }
3052
3053   /* Note that the assembler currently always outputs relocs in
3054      address order.  If that ever changes, this code will need to sort
3055      the label values and the relocs.  */
3056
3057   label = labels;
3058
3059   for (irel = internal_relocs; irel < irelend; irel++)
3060     {
3061       bfd_vma start, stop;
3062
3063       if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE)
3064         continue;
3065
3066       start = irel->r_offset;
3067
3068       for (irel++; irel < irelend; irel++)
3069         if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA)
3070           break;
3071       if (irel < irelend)
3072         stop = irel->r_offset;
3073       else
3074         stop = sec->size;
3075
3076       if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns,
3077                                      internal_relocs, &label,
3078                                      label_end, start, stop, pswapped))
3079         goto error_return;
3080     }
3081
3082   free (labels);
3083
3084   return TRUE;
3085
3086  error_return:
3087   if (labels != NULL)
3088     free (labels);
3089   return FALSE;
3090 }
3091
3092 /* Swap two SH instructions.  This is like sh_swap_insns in coff-sh.c.  */
3093
3094 static bfd_boolean
3095 sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs,
3096                    bfd_byte *contents, bfd_vma addr)
3097 {
3098   Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs;
3099   unsigned short i1, i2;
3100   Elf_Internal_Rela *irel, *irelend;
3101
3102   /* Swap the instructions themselves.  */
3103   i1 = bfd_get_16 (abfd, contents + addr);
3104   i2 = bfd_get_16 (abfd, contents + addr + 2);
3105   bfd_put_16 (abfd, (bfd_vma) i2, contents + addr);
3106   bfd_put_16 (abfd, (bfd_vma) i1, contents + addr + 2);
3107
3108   /* Adjust all reloc addresses.  */
3109   irelend = internal_relocs + sec->reloc_count;
3110   for (irel = internal_relocs; irel < irelend; irel++)
3111     {
3112       enum elf_sh_reloc_type type;
3113       int add;
3114
3115       /* There are a few special types of relocs that we don't want to
3116          adjust.  These relocs do not apply to the instruction itself,
3117          but are only associated with the address.  */
3118       type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info);
3119       if (type == R_SH_ALIGN
3120           || type == R_SH_CODE
3121           || type == R_SH_DATA
3122           || type == R_SH_LABEL)
3123         continue;
3124
3125       /* If an R_SH_USES reloc points to one of the addresses being
3126          swapped, we must adjust it.  It would be incorrect to do this
3127          for a jump, though, since we want to execute both
3128          instructions after the jump.  (We have avoided swapping
3129          around a label, so the jump will not wind up executing an
3130          instruction it shouldn't).  */
3131       if (type == R_SH_USES)
3132         {
3133           bfd_vma off;
3134
3135           off = irel->r_offset + 4 + irel->r_addend;
3136           if (off == addr)
3137             irel->r_offset += 2;
3138           else if (off == addr + 2)
3139             irel->r_offset -= 2;
3140         }
3141
3142       if (irel->r_offset == addr)
3143         {
3144           irel->r_offset += 2;
3145           add = -2;
3146         }
3147       else if (irel->r_offset == addr + 2)
3148         {
3149           irel->r_offset -= 2;
3150           add = 2;
3151         }
3152       else
3153         add = 0;
3154
3155       if (add != 0)
3156         {
3157           bfd_byte *loc;
3158           unsigned short insn, oinsn;
3159           bfd_boolean overflow;
3160
3161           loc = contents + irel->r_offset;
3162           overflow = FALSE;
3163           switch (type)
3164             {
3165             default:
3166               break;
3167
3168             case R_SH_DIR8WPN:
3169             case R_SH_DIR8WPZ:
3170               insn = bfd_get_16 (abfd, loc);
3171               oinsn = insn;
3172               insn += add / 2;
3173               if ((oinsn & 0xff00) != (insn & 0xff00))
3174                 overflow = TRUE;
3175               bfd_put_16 (abfd, (bfd_vma) insn, loc);
3176               break;
3177
3178             case R_SH_IND12W:
3179               insn = bfd_get_16 (abfd, loc);
3180               oinsn = insn;
3181               insn += add / 2;
3182               if ((oinsn & 0xf000) != (insn & 0xf000))
3183                 overflow = TRUE;
3184               bfd_put_16 (abfd, (bfd_vma) insn, loc);
3185               break;
3186
3187             case R_SH_DIR8WPL:
3188               /* This reloc ignores the least significant 3 bits of
3189                  the program counter before adding in the offset.
3190                  This means that if ADDR is at an even address, the
3191                  swap will not affect the offset.  If ADDR is an at an
3192                  odd address, then the instruction will be crossing a
3193                  four byte boundary, and must be adjusted.  */
3194               if ((addr & 3) != 0)
3195                 {
3196                   insn = bfd_get_16 (abfd, loc);
3197                   oinsn = insn;
3198                   insn += add / 2;
3199                   if ((oinsn & 0xff00) != (insn & 0xff00))
3200                     overflow = TRUE;
3201                   bfd_put_16 (abfd, (bfd_vma) insn, loc);
3202                 }
3203
3204               break;
3205             }
3206
3207           if (overflow)
3208             {
3209               ((*_bfd_error_handler)
3210                (_("%s: 0x%lx: fatal: reloc overflow while relaxing"),
3211                 bfd_archive_filename (abfd), (unsigned long) irel->r_offset));
3212               bfd_set_error (bfd_error_bad_value);
3213               return FALSE;
3214             }
3215         }
3216     }
3217
3218   return TRUE;
3219 }
3220 \f
3221 #ifdef INCLUDE_SHMEDIA
3222
3223 /* The size in bytes of an entry in the procedure linkage table.  */
3224
3225 #define PLT_ENTRY_SIZE 64
3226
3227 /* First entry in an absolute procedure linkage table look like this.  */
3228
3229 static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
3230 {
3231   0xcc, 0x00, 0x01, 0x10, /* movi  .got.plt >> 16, r17 */
3232   0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */
3233   0x89, 0x10, 0x09, 0x90, /* ld.l  r17, 8, r25 */
3234   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3235   0x89, 0x10, 0x05, 0x10, /* ld.l  r17, 4, r17 */
3236   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3237   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3238   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3239   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3240   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3241   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3242   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3243   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3244   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3245   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3246   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3247 };
3248
3249 static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
3250 {
3251   0x10, 0x01, 0x00, 0xcc, /* movi  .got.plt >> 16, r17 */
3252   0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */
3253   0x90, 0x09, 0x10, 0x89, /* ld.l  r17, 8, r25 */
3254   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3255   0x10, 0x05, 0x10, 0x89, /* ld.l  r17, 4, r17 */
3256   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3257   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3258   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3259   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3260   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3261   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3262   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3263   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3264   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3265   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3266   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3267 };
3268
3269 /* Sebsequent entries in an absolute procedure linkage table look like
3270    this.  */
3271
3272 static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
3273 {
3274   0xcc, 0x00, 0x01, 0x90, /* movi  nameN-in-GOT >> 16, r25 */
3275   0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */
3276   0x89, 0x90, 0x01, 0x90, /* ld.l  r25, 0, r25 */
3277   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3278   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3279   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3280   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3281   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3282   0xcc, 0x00, 0x01, 0x90, /* movi  .PLT0 >> 16, r25 */
3283   0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */
3284   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3285   0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
3286   0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3287   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3288   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3289   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3290 };
3291
3292 static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
3293 {
3294   0x90, 0x01, 0x00, 0xcc, /* movi  nameN-in-GOT >> 16, r25 */
3295   0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */
3296   0x90, 0x01, 0x90, 0x89, /* ld.l  r25, 0, r25 */
3297   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3298   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3299   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3300   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3301   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3302   0x90, 0x01, 0x00, 0xcc, /* movi  .PLT0 >> 16, r25 */
3303   0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */
3304   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3305   0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3306   0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3307   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3308   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3309   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3310 };
3311
3312 /* Entries in a PIC procedure linkage table look like this.  */
3313
3314 static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
3315 {
3316   0xcc, 0x00, 0x01, 0x90, /* movi  nameN@GOT >> 16, r25 */
3317   0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */
3318   0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */
3319   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3320   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3321   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3322   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3323   0x6f, 0xf0, 0xff, 0xf0, /* nop */
3324   0xce, 0x00, 0x01, 0x10, /* movi  -GOT_BIAS, r17 */
3325   0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */
3326   0x89, 0x10, 0x09, 0x90, /* ld.l  r17, 8, r25 */
3327   0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */
3328   0x89, 0x10, 0x05, 0x10, /* ld.l  r17, 4, r17 */
3329   0xcc, 0x00, 0x01, 0x50, /* movi  reloc-offset >> 16, r21 */
3330   0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */
3331   0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */
3332 };
3333
3334 static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
3335 {
3336   0x90, 0x01, 0x00, 0xcc, /* movi  nameN@GOT >> 16, r25 */
3337   0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */
3338   0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */
3339   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3340   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3341   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3342   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3343   0xf0, 0xff, 0xf0, 0x6f, /* nop */
3344   0x10, 0x01, 0x00, 0xce, /* movi  -GOT_BIAS, r17 */
3345   0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */
3346   0x90, 0x09, 0x10, 0x89, /* ld.l  r17, 8, r25 */
3347   0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */
3348   0x10, 0x05, 0x10, 0x89, /* ld.l  r17, 4, r17 */
3349   0x50, 0x01, 0x00, 0xcc, /* movi  reloc-offset >> 16, r21 */
3350   0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */
3351   0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */
3352 };
3353
3354 static const bfd_byte *elf_sh_plt0_entry;
3355 static const bfd_byte *elf_sh_plt_entry;
3356 static const bfd_byte *elf_sh_pic_plt_entry;
3357
3358 /* Return size of a PLT entry.  */
3359 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3360
3361 /* Return offset of the PLT0 address in an absolute PLT entry.  */
3362 #define elf_sh_plt_plt0_offset(info) 32
3363
3364 /* Return offset of the linker in PLT0 entry.  */
3365 #define elf_sh_plt0_gotplt_offset(info) 0
3366
3367 /* Return offset of the trampoline in PLT entry */
3368 #define elf_sh_plt_temp_offset(info) 33 /* Add one because it's SHmedia.  */
3369
3370 /* Return offset of the symbol in PLT entry.  */
3371 #define elf_sh_plt_symbol_offset(info) 0
3372
3373 /* Return offset of the relocation in PLT entry.  */
3374 #define elf_sh_plt_reloc_offset(info) (info->shared ? 52 : 44)
3375
3376 inline static void
3377 movi_shori_putval (bfd *output_bfd, unsigned long value, char *addr)
3378 {
3379   bfd_put_32 (output_bfd,
3380               bfd_get_32 (output_bfd, addr)
3381               | ((value >> 6) & 0x3fffc00),
3382               addr);
3383   bfd_put_32 (output_bfd,
3384               bfd_get_32 (output_bfd, addr + 4)
3385               | ((value << 10) & 0x3fffc00),
3386               addr + 4);
3387 }
3388
3389 #else
3390 /* The size in bytes of an entry in the procedure linkage table.  */
3391
3392 #define PLT_ENTRY_SIZE 28
3393
3394 /* First entry in an absolute procedure linkage table look like this.  */
3395
3396 #if 1
3397 /* Note - this code has been "optimised" not to use r2.  r2 is used by
3398    GCC to return the address of large structures, so it should not be
3399    corrupted here.  This does mean however, that this PLT does not conform
3400    to the SH PIC ABI.  That spec says that r0 contains the type of the PLT
3401    and r2 contains the GOT id.  This version stores the GOT id in r0 and
3402    ignores the type.  Loaders can easily detect this difference however,
3403    since the type will always be 0 or 8, and the GOT ids will always be
3404    greater than or equal to 12.  */
3405 static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
3406 {
3407   0xd0, 0x05,   /* mov.l 2f,r0 */
3408   0x60, 0x02,   /* mov.l @r0,r0 */
3409   0x2f, 0x06,   /* mov.l r0,@-r15 */
3410   0xd0, 0x03,   /* mov.l 1f,r0 */
3411   0x60, 0x02,   /* mov.l @r0,r0 */
3412   0x40, 0x2b,   /* jmp @r0 */
3413   0x60, 0xf6,   /*  mov.l @r15+,r0 */
3414   0x00, 0x09,   /* nop */
3415   0x00, 0x09,   /* nop */
3416   0x00, 0x09,   /* nop */
3417   0, 0, 0, 0,   /* 1: replaced with address of .got.plt + 8.  */
3418   0, 0, 0, 0,   /* 2: replaced with address of .got.plt + 4.  */
3419 };
3420
3421 static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
3422 {
3423   0x05, 0xd0,   /* mov.l 2f,r0 */
3424   0x02, 0x60,   /* mov.l @r0,r0 */
3425   0x06, 0x2f,   /* mov.l r0,@-r15 */
3426   0x03, 0xd0,   /* mov.l 1f,r0 */
3427   0x02, 0x60,   /* mov.l @r0,r0 */
3428   0x2b, 0x40,   /* jmp @r0 */
3429   0xf6, 0x60,   /*  mov.l @r15+,r0 */
3430   0x09, 0x00,   /* nop */
3431   0x09, 0x00,   /* nop */
3432   0x09, 0x00,   /* nop */
3433   0, 0, 0, 0,   /* 1: replaced with address of .got.plt + 8.  */
3434   0, 0, 0, 0,   /* 2: replaced with address of .got.plt + 4.  */
3435 };
3436
3437 /* Sebsequent entries in an absolute procedure linkage table look like
3438    this.  */
3439
3440 static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
3441 {
3442   0xd0, 0x04,   /* mov.l 1f,r0 */
3443   0x60, 0x02,   /* mov.l @r0,r0 */
3444   0xd1, 0x02,   /* mov.l 0f,r1 */
3445   0x40, 0x2b,   /* jmp @r0 */
3446   0x60, 0x13,   /*  mov r1,r0 */
3447   0xd1, 0x03,   /* mov.l 2f,r1 */
3448   0x40, 0x2b,   /* jmp @r0 */
3449   0x00, 0x09,   /* nop */
3450   0, 0, 0, 0,   /* 0: replaced with address of .PLT0.  */
3451   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3452   0, 0, 0, 0,   /* 2: replaced with offset into relocation table.  */
3453 };
3454
3455 static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
3456 {
3457   0x04, 0xd0,   /* mov.l 1f,r0 */
3458   0x02, 0x60,   /* mov.l @r0,r0 */
3459   0x02, 0xd1,   /* mov.l 0f,r1 */
3460   0x2b, 0x40,   /* jmp @r0 */
3461   0x13, 0x60,   /*  mov r1,r0 */
3462   0x03, 0xd1,   /* mov.l 2f,r1 */
3463   0x2b, 0x40,   /* jmp @r0 */
3464   0x09, 0x00,   /*  nop */
3465   0, 0, 0, 0,   /* 0: replaced with address of .PLT0.  */
3466   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3467   0, 0, 0, 0,   /* 2: replaced with offset into relocation table.  */
3468 };
3469
3470 /* Entries in a PIC procedure linkage table look like this.  */
3471
3472 static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
3473 {
3474   0xd0, 0x04,   /* mov.l 1f,r0 */
3475   0x00, 0xce,   /* mov.l @(r0,r12),r0 */
3476   0x40, 0x2b,   /* jmp @r0 */
3477   0x00, 0x09,   /*  nop */
3478   0x50, 0xc2,   /* mov.l @(8,r12),r0 */
3479   0xd1, 0x03,   /* mov.l 2f,r1 */
3480   0x40, 0x2b,   /* jmp @r0 */
3481   0x50, 0xc1,   /*  mov.l @(4,r12),r0 */
3482   0x00, 0x09,   /* nop */
3483   0x00, 0x09,   /* nop */
3484   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3485   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
3486 };
3487
3488 static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
3489 {
3490   0x04, 0xd0,   /* mov.l 1f,r0 */
3491   0xce, 0x00,   /* mov.l @(r0,r12),r0 */
3492   0x2b, 0x40,   /* jmp @r0 */
3493   0x09, 0x00,   /*  nop */
3494   0xc2, 0x50,   /* mov.l @(8,r12),r0 */
3495   0x03, 0xd1,   /* mov.l 2f,r1 */
3496   0x2b, 0x40,   /* jmp @r0 */
3497   0xc1, 0x50,   /*  mov.l @(4,r12),r0 */
3498   0x09, 0x00,   /*  nop */
3499   0x09, 0x00,   /* nop */
3500   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3501   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
3502 };
3503
3504 #else /* These are the old style PLT entries.  */
3505 static const bfd_byte elf_sh_plt0_entry_be[PLT_ENTRY_SIZE] =
3506 {
3507   0xd0, 0x04,   /* mov.l 1f,r0 */
3508   0xd2, 0x05,   /* mov.l 2f,r2 */
3509   0x60, 0x02,   /* mov.l @r0,r0 */
3510   0x62, 0x22,   /* mov.l @r2,r2 */
3511   0x40, 0x2b,   /* jmp @r0 */
3512   0xe0, 0x00,   /*  mov #0,r0 */
3513   0x00, 0x09,   /* nop */
3514   0x00, 0x09,   /* nop */
3515   0x00, 0x09,   /* nop */
3516   0x00, 0x09,   /* nop */
3517   0, 0, 0, 0,   /* 1: replaced with address of .got.plt + 8.  */
3518   0, 0, 0, 0,   /* 2: replaced with address of .got.plt + 4.  */
3519 };
3520
3521 static const bfd_byte elf_sh_plt0_entry_le[PLT_ENTRY_SIZE] =
3522 {
3523   0x04, 0xd0,   /* mov.l 1f,r0 */
3524   0x05, 0xd2,   /* mov.l 2f,r2 */
3525   0x02, 0x60,   /* mov.l @r0,r0 */
3526   0x22, 0x62,   /* mov.l @r2,r2 */
3527   0x2b, 0x40,   /* jmp @r0 */
3528   0x00, 0xe0,   /*  mov #0,r0 */
3529   0x09, 0x00,   /* nop */
3530   0x09, 0x00,   /* nop */
3531   0x09, 0x00,   /* nop */
3532   0x09, 0x00,   /* nop */
3533   0, 0, 0, 0,   /* 1: replaced with address of .got.plt + 8.  */
3534   0, 0, 0, 0,   /* 2: replaced with address of .got.plt + 4.  */
3535 };
3536
3537 /* Sebsequent entries in an absolute procedure linkage table look like
3538    this.  */
3539
3540 static const bfd_byte elf_sh_plt_entry_be[PLT_ENTRY_SIZE] =
3541 {
3542   0xd0, 0x04,   /* mov.l 1f,r0 */
3543   0x60, 0x02,   /* mov.l @r0,r0 */
3544   0xd2, 0x02,   /* mov.l 0f,r2 */
3545   0x40, 0x2b,   /* jmp @r0 */
3546   0x60, 0x23,   /*  mov r2,r0 */
3547   0xd1, 0x03,   /* mov.l 2f,r1 */
3548   0x40, 0x2b,   /* jmp @r0 */
3549   0x00, 0x09,   /* nop */
3550   0, 0, 0, 0,   /* 0: replaced with address of .PLT0.  */
3551   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3552   0, 0, 0, 0,   /* 2: replaced with offset into relocation table.  */
3553 };
3554
3555 static const bfd_byte elf_sh_plt_entry_le[PLT_ENTRY_SIZE] =
3556 {
3557   0x04, 0xd0,   /* mov.l 1f,r0 */
3558   0x02, 0x60,   /* mov.l @r0,r0 */
3559   0x02, 0xd2,   /* mov.l 0f,r2 */
3560   0x2b, 0x40,   /* jmp @r0 */
3561   0x23, 0x60,   /*  mov r2,r0 */
3562   0x03, 0xd1,   /* mov.l 2f,r1 */
3563   0x2b, 0x40,   /* jmp @r0 */
3564   0x09, 0x00,   /*  nop */
3565   0, 0, 0, 0,   /* 0: replaced with address of .PLT.  */
3566   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3567   0, 0, 0, 0,   /* 2: replaced with offset into relocation table.  */
3568 };
3569
3570 /* Entries in a PIC procedure linkage table look like this.  */
3571
3572 static const bfd_byte elf_sh_pic_plt_entry_be[PLT_ENTRY_SIZE] =
3573 {
3574   0xd0, 0x04,   /* mov.l 1f,r0 */
3575   0x00, 0xce,   /* mov.l @(r0,r12),r0 */
3576   0x40, 0x2b,   /* jmp @r0 */
3577   0x00, 0x09,   /*  nop */
3578   0x50, 0xc2,   /* 0: mov.l @(8,r12),r0 */
3579   0x52, 0xc1,   /* 1: mov.l @(4,r12),r2 */
3580   0xd1, 0x02,   /* mov.l 2f,r1 */
3581   0x40, 0x2b,   /* jmp @r0 */
3582   0xe0, 0x00,   /*  mov #0,r0 ! shows the type of PLT.  */
3583   0x00, 0x09,   /* nop */
3584   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3585   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
3586 };
3587
3588 static const bfd_byte elf_sh_pic_plt_entry_le[PLT_ENTRY_SIZE] =
3589 {
3590   0x04, 0xd0,   /* mov.l 1f,r0 */
3591   0xce, 0x00,   /* mov.l @(r0,r12),r0 */
3592   0x2b, 0x40,   /* jmp @r0 */
3593   0x09, 0x00,   /*  nop */
3594   0xc2, 0x50,   /* 0: mov.l @(8,r12),r0 */
3595   0xc1, 0x52,   /* 1: mov.l @(4,r12),r2 */
3596   0x02, 0xd1,   /* mov.l 2f,r1 */
3597   0x2b, 0x40,   /* jmp @r0 */
3598   0x00, 0xe0,   /*  mov #0,r0 ! shows the type of PLT.  */
3599   0x09, 0x00,   /* nop */
3600   0, 0, 0, 0,   /* 1: replaced with address of this symbol in .got.  */
3601   0, 0, 0, 0    /* 2: replaced with offset into relocation table.  */
3602 };
3603 #endif /* old style PLT entries.  */
3604
3605 static const bfd_byte *elf_sh_plt0_entry;
3606 static const bfd_byte *elf_sh_plt_entry;
3607 static const bfd_byte *elf_sh_pic_plt_entry;
3608
3609 /* Return size of a PLT entry.  */
3610 #define elf_sh_sizeof_plt(info) PLT_ENTRY_SIZE
3611
3612 /* Return offset of the PLT0 address in an absolute PLT entry.  */
3613 #define elf_sh_plt_plt0_offset(info) 16
3614
3615 /* Return offset of the linker in PLT0 entry.  */
3616 #define elf_sh_plt0_linker_offset(info) 20
3617
3618 /* Return offset of the GOT id in PLT0 entry.  */
3619 #define elf_sh_plt0_gotid_offset(info) 24
3620
3621 /* Return offset of the temporary in PLT entry */
3622 #define elf_sh_plt_temp_offset(info) 8
3623
3624 /* Return offset of the symbol in PLT entry.  */
3625 #define elf_sh_plt_symbol_offset(info) 20
3626
3627 /* Return offset of the relocation in PLT entry.  */
3628 #define elf_sh_plt_reloc_offset(info) 24
3629 #endif
3630
3631 /* The sh linker needs to keep track of the number of relocs that it
3632    decides to copy as dynamic relocs in check_relocs for each symbol.
3633    This is so that it can later discard them if they are found to be
3634    unnecessary.  We store the information in a field extending the
3635    regular ELF linker hash table.  */
3636
3637 struct elf_sh_dyn_relocs
3638 {
3639   struct elf_sh_dyn_relocs *next;
3640
3641   /* The input section of the reloc.  */
3642   asection *sec;
3643
3644   /* Total number of relocs copied for the input section.  */
3645   bfd_size_type count;
3646
3647   /* Number of pc-relative relocs copied for the input section.  */
3648   bfd_size_type pc_count;
3649 };
3650
3651 /* sh ELF linker hash entry.  */
3652
3653 struct elf_sh_link_hash_entry
3654 {
3655   struct elf_link_hash_entry root;
3656
3657 #ifdef INCLUDE_SHMEDIA
3658   union
3659   {
3660     bfd_signed_vma refcount;
3661     bfd_vma offset;
3662   } datalabel_got;
3663 #endif
3664
3665   /* Track dynamic relocs copied for this symbol.  */
3666   struct elf_sh_dyn_relocs *dyn_relocs;
3667
3668   bfd_signed_vma gotplt_refcount;
3669
3670   enum {
3671     GOT_UNKNOWN = 0, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE
3672   } tls_type;
3673 };
3674
3675 #define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent))
3676
3677 struct sh_elf_obj_tdata
3678 {
3679   struct elf_obj_tdata root;
3680
3681   /* tls_type for each local got entry.  */
3682   char *local_got_tls_type;
3683 };
3684
3685 #define sh_elf_tdata(abfd) \
3686   ((struct sh_elf_obj_tdata *) (abfd)->tdata.any)
3687
3688 #define sh_elf_local_got_tls_type(abfd) \
3689   (sh_elf_tdata (abfd)->local_got_tls_type)
3690
3691 /* Override the generic function because we need to store sh_elf_obj_tdata
3692    as the specific tdata.  */
3693
3694 static bfd_boolean
3695 sh_elf_mkobject (bfd *abfd)
3696 {
3697   bfd_size_type amt = sizeof (struct sh_elf_obj_tdata);
3698   abfd->tdata.any = bfd_zalloc (abfd, amt);
3699   if (abfd->tdata.any == NULL)
3700     return FALSE;
3701   return TRUE;
3702 }
3703
3704 /* sh ELF linker hash table.  */
3705
3706 struct elf_sh_link_hash_table
3707 {
3708   struct elf_link_hash_table root;
3709
3710   /* Short-cuts to get to dynamic linker sections.  */
3711   asection *sgot;
3712   asection *sgotplt;
3713   asection *srelgot;
3714   asection *splt;
3715   asection *srelplt;
3716   asection *sdynbss;
3717   asection *srelbss;
3718
3719   /* Small local sym to section mapping cache.  */
3720   struct sym_sec_cache sym_sec;
3721
3722   /* A counter or offset to track a TLS got entry.  */
3723   union
3724     {
3725       bfd_signed_vma refcount;
3726       bfd_vma offset;
3727     } tls_ldm_got;
3728 };
3729
3730 /* Traverse an sh ELF linker hash table.  */
3731
3732 #define sh_elf_link_hash_traverse(table, func, info)                    \
3733   (elf_link_hash_traverse                                               \
3734    (&(table)->root,                                                     \
3735     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
3736     (info)))
3737
3738 /* Get the sh ELF linker hash table from a link_info structure.  */
3739
3740 #define sh_elf_hash_table(p) \
3741   ((struct elf_sh_link_hash_table *) ((p)->hash))
3742
3743 /* Create an entry in an sh ELF linker hash table.  */
3744
3745 static struct bfd_hash_entry *
3746 sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3747                           struct bfd_hash_table *table,
3748                           const char *string)
3749 {
3750   struct elf_sh_link_hash_entry *ret =
3751     (struct elf_sh_link_hash_entry *) entry;
3752
3753   /* Allocate the structure if it has not already been allocated by a
3754      subclass.  */
3755   if (ret == (struct elf_sh_link_hash_entry *) NULL)
3756     ret = ((struct elf_sh_link_hash_entry *)
3757            bfd_hash_allocate (table,
3758                               sizeof (struct elf_sh_link_hash_entry)));
3759   if (ret == (struct elf_sh_link_hash_entry *) NULL)
3760     return (struct bfd_hash_entry *) ret;
3761
3762   /* Call the allocation method of the superclass.  */
3763   ret = ((struct elf_sh_link_hash_entry *)
3764          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3765                                      table, string));
3766   if (ret != (struct elf_sh_link_hash_entry *) NULL)
3767     {
3768       ret->dyn_relocs = NULL;
3769       ret->gotplt_refcount = 0;
3770 #ifdef INCLUDE_SHMEDIA
3771       ret->datalabel_got.refcount = ret->root.got.refcount;
3772 #endif
3773       ret->tls_type = GOT_UNKNOWN;
3774     }
3775
3776   return (struct bfd_hash_entry *) ret;
3777 }
3778
3779 /* Create an sh ELF linker hash table.  */
3780
3781 static struct bfd_link_hash_table *
3782 sh_elf_link_hash_table_create (bfd *abfd)
3783 {
3784   struct elf_sh_link_hash_table *ret;
3785   bfd_size_type amt = sizeof (struct elf_sh_link_hash_table);
3786
3787   ret = (struct elf_sh_link_hash_table *) bfd_malloc (amt);
3788   if (ret == (struct elf_sh_link_hash_table *) NULL)
3789     return NULL;
3790
3791   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
3792                                        sh_elf_link_hash_newfunc))
3793     {
3794       free (ret);
3795       return NULL;
3796     }
3797
3798   ret->sgot = NULL;
3799   ret->sgotplt = NULL;
3800   ret->srelgot = NULL;
3801   ret->splt = NULL;
3802   ret->srelplt = NULL;
3803   ret->sdynbss = NULL;
3804   ret->srelbss = NULL;
3805   ret->sym_sec.abfd = NULL;
3806   ret->tls_ldm_got.refcount = 0;
3807
3808   return &ret->root.root;
3809 }
3810
3811 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
3812    shortcuts to them in our hash table.  */
3813
3814 static bfd_boolean
3815 create_got_section (bfd *dynobj, struct bfd_link_info *info)
3816 {
3817   struct elf_sh_link_hash_table *htab;
3818
3819   if (! _bfd_elf_create_got_section (dynobj, info))
3820     return FALSE;
3821
3822   htab = sh_elf_hash_table (info);
3823   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
3824   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
3825   if (! htab->sgot || ! htab->sgotplt)
3826     abort ();
3827
3828   htab->srelgot = bfd_make_section (dynobj, ".rela.got");
3829   if (htab->srelgot == NULL
3830       || ! bfd_set_section_flags (dynobj, htab->srelgot,
3831                                   (SEC_ALLOC
3832                                    | SEC_LOAD
3833                                    | SEC_HAS_CONTENTS
3834                                    | SEC_IN_MEMORY
3835                                    | SEC_LINKER_CREATED
3836                                    | SEC_READONLY))
3837       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
3838     return FALSE;
3839   return TRUE;
3840 }
3841
3842 /* Create dynamic sections when linking against a dynamic object.  */
3843
3844 static bfd_boolean
3845 sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3846 {
3847   struct elf_sh_link_hash_table *htab;
3848   flagword flags, pltflags;
3849   register asection *s;
3850   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3851   int ptralign = 0;
3852
3853   switch (bed->s->arch_size)
3854     {
3855     case 32:
3856       ptralign = 2;
3857       break;
3858
3859     case 64:
3860       ptralign = 3;
3861       break;
3862
3863     default:
3864       bfd_set_error (bfd_error_bad_value);
3865       return FALSE;
3866     }
3867
3868   htab = sh_elf_hash_table (info);
3869   if (htab->root.dynamic_sections_created)
3870     return TRUE;
3871
3872   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
3873      .rel[a].bss sections.  */
3874
3875   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3876            | SEC_LINKER_CREATED);
3877
3878   pltflags = flags;
3879   pltflags |= SEC_CODE;
3880   if (bed->plt_not_loaded)
3881     pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
3882   if (bed->plt_readonly)
3883     pltflags |= SEC_READONLY;
3884
3885   s = bfd_make_section (abfd, ".plt");
3886   htab->splt = s;
3887   if (s == NULL
3888       || ! bfd_set_section_flags (abfd, s, pltflags)
3889       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
3890     return FALSE;
3891
3892   if (bed->want_plt_sym)
3893     {
3894       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
3895          .plt section.  */
3896       struct elf_link_hash_entry *h;
3897       struct bfd_link_hash_entry *bh = NULL;
3898
3899       if (! (_bfd_generic_link_add_one_symbol
3900              (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
3901               (bfd_vma) 0, (const char *) NULL, FALSE,
3902               get_elf_backend_data (abfd)->collect, &bh)))
3903         return FALSE;
3904
3905       h = (struct elf_link_hash_entry *) bh;
3906       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3907       h->type = STT_OBJECT;
3908
3909       if (info->shared
3910           && ! bfd_elf_link_record_dynamic_symbol (info, h))
3911         return FALSE;
3912     }
3913
3914   s = bfd_make_section (abfd,
3915                         bed->default_use_rela_p ? ".rela.plt" : ".rel.plt");
3916   htab->srelplt = s;
3917   if (s == NULL
3918       || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3919       || ! bfd_set_section_alignment (abfd, s, ptralign))
3920     return FALSE;
3921
3922   if (htab->sgot == NULL
3923       && !create_got_section (abfd, info))
3924     return FALSE;
3925
3926   {
3927     const char *secname;
3928     char *relname;
3929     flagword secflags;
3930     asection *sec;
3931
3932     for (sec = abfd->sections; sec; sec = sec->next)
3933       {
3934         secflags = bfd_get_section_flags (abfd, sec);
3935         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
3936             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
3937           continue;
3938         secname = bfd_get_section_name (abfd, sec);
3939         relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
3940         strcpy (relname, ".rela");
3941         strcat (relname, secname);
3942         if (bfd_get_section_by_name (abfd, secname))
3943           continue;
3944         s = bfd_make_section (abfd, relname);
3945         if (s == NULL
3946             || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3947             || ! bfd_set_section_alignment (abfd, s, ptralign))
3948           return FALSE;
3949       }
3950   }
3951
3952   if (bed->want_dynbss)
3953     {
3954       /* The .dynbss section is a place to put symbols which are defined
3955          by dynamic objects, are referenced by regular objects, and are
3956          not functions.  We must allocate space for them in the process
3957          image and use a R_*_COPY reloc to tell the dynamic linker to
3958          initialize them at run time.  The linker script puts the .dynbss
3959          section into the .bss section of the final image.  */
3960       s = bfd_make_section (abfd, ".dynbss");
3961       htab->sdynbss = s;
3962       if (s == NULL
3963           || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
3964         return FALSE;
3965
3966       /* The .rel[a].bss section holds copy relocs.  This section is not
3967          normally needed.  We need to create it here, though, so that the
3968          linker will map it to an output section.  We can't just create it
3969          only if we need it, because we will not know whether we need it
3970          until we have seen all the input files, and the first time the
3971          main linker code calls BFD after examining all the input files
3972          (size_dynamic_sections) the input sections have already been
3973          mapped to the output sections.  If the section turns out not to
3974          be needed, we can discard it later.  We will never need this
3975          section when generating a shared object, since they do not use
3976          copy relocs.  */
3977       if (! info->shared)
3978         {
3979           s = bfd_make_section (abfd,
3980                                 (bed->default_use_rela_p
3981                                  ? ".rela.bss" : ".rel.bss"));
3982           htab->srelbss = s;
3983           if (s == NULL
3984               || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
3985               || ! bfd_set_section_alignment (abfd, s, ptralign))
3986             return FALSE;
3987         }
3988     }
3989
3990   return TRUE;
3991 }
3992 \f
3993 /* Adjust a symbol defined by a dynamic object and referenced by a
3994    regular object.  The current definition is in some section of the
3995    dynamic object, but we're not including those sections.  We have to
3996    change the definition to something the rest of the link can
3997    understand.  */
3998
3999 static bfd_boolean
4000 sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4001                               struct elf_link_hash_entry *h)
4002 {
4003   struct elf_sh_link_hash_table *htab;
4004   struct elf_sh_link_hash_entry *eh;
4005   struct elf_sh_dyn_relocs *p;
4006   asection *s;
4007   unsigned int power_of_two;
4008
4009   htab = sh_elf_hash_table (info);
4010
4011   /* Make sure we know what is going on here.  */
4012   BFD_ASSERT (htab->root.dynobj != NULL
4013               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
4014                   || h->weakdef != NULL
4015                   || ((h->elf_link_hash_flags
4016                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
4017                       && (h->elf_link_hash_flags
4018                           & ELF_LINK_HASH_REF_REGULAR) != 0
4019                       && (h->elf_link_hash_flags
4020                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
4021
4022   /* If this is a function, put it in the procedure linkage table.  We
4023      will fill in the contents of the procedure linkage table later,
4024      when we know the address of the .got section.  */
4025   if (h->type == STT_FUNC
4026       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
4027     {
4028       if (h->plt.refcount <= 0
4029           || SYMBOL_CALLS_LOCAL (info, h)
4030           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4031               && h->root.type == bfd_link_hash_undefweak))
4032         {
4033           /* This case can occur if we saw a PLT reloc in an input
4034              file, but the symbol was never referred to by a dynamic
4035              object.  In such a case, we don't actually need to build
4036              a procedure linkage table, and we can just do a REL32
4037              reloc instead.  */
4038           h->plt.offset = (bfd_vma) -1;
4039           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
4040         }
4041
4042       return TRUE;
4043     }
4044   else
4045     h->plt.offset = (bfd_vma) -1;
4046
4047   /* If this is a weak symbol, and there is a real definition, the
4048      processor independent code will have arranged for us to see the
4049      real definition first, and we can just use the same value.  */
4050   if (h->weakdef != NULL)
4051     {
4052       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
4053                   || h->weakdef->root.type == bfd_link_hash_defweak);
4054       h->root.u.def.section = h->weakdef->root.u.def.section;
4055       h->root.u.def.value = h->weakdef->root.u.def.value;
4056       if (info->nocopyreloc)
4057         h->elf_link_hash_flags
4058           = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
4059              | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
4060       return TRUE;
4061     }
4062
4063   /* This is a reference to a symbol defined by a dynamic object which
4064      is not a function.  */
4065
4066   /* If we are creating a shared library, we must presume that the
4067      only references to the symbol are via the global offset table.
4068      For such cases we need not do anything here; the relocations will
4069      be handled correctly by relocate_section.  */
4070   if (info->shared)
4071     return TRUE;
4072
4073   /* If there are no references to this symbol that do not use the
4074      GOT, we don't need to generate a copy reloc.  */
4075   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
4076     return TRUE;
4077
4078   /* If -z nocopyreloc was given, we won't generate them either.  */
4079   if (info->nocopyreloc)
4080     {
4081       h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
4082       return TRUE;
4083     }
4084
4085   eh = (struct elf_sh_link_hash_entry *) h;
4086   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4087     {
4088       s = p->sec->output_section;
4089       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
4090         break;
4091     }
4092
4093   /* If we didn't find any dynamic relocs in sections which needs the
4094      copy reloc, then we'll be keeping the dynamic relocs and avoiding
4095      the copy reloc.  */
4096   if (p == NULL)
4097     {
4098       h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
4099       return TRUE;
4100     }
4101
4102   /* We must allocate the symbol in our .dynbss section, which will
4103      become part of the .bss section of the executable.  There will be
4104      an entry for this symbol in the .dynsym section.  The dynamic
4105      object will contain position independent code, so all references
4106      from the dynamic object to this symbol will go through the global
4107      offset table.  The dynamic linker will use the .dynsym entry to
4108      determine the address it must put in the global offset table, so
4109      both the dynamic object and the regular object will refer to the
4110      same memory location for the variable.  */
4111
4112   s = htab->sdynbss;
4113   BFD_ASSERT (s != NULL);
4114
4115   /* We must generate a R_SH_COPY reloc to tell the dynamic linker to
4116      copy the initial value out of the dynamic object and into the
4117      runtime process image.  We need to remember the offset into the
4118      .rela.bss section we are going to use.  */
4119   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4120     {
4121       asection *srel;
4122
4123       srel = htab->srelbss;
4124       BFD_ASSERT (srel != NULL);
4125       srel->size += sizeof (Elf32_External_Rela);
4126       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
4127     }
4128
4129   /* We need to figure out the alignment required for this symbol.  I
4130      have no idea how ELF linkers handle this.  */
4131   power_of_two = bfd_log2 (h->size);
4132   if (power_of_two > 3)
4133     power_of_two = 3;
4134
4135   /* Apply the required alignment.  */
4136   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
4137   if (power_of_two > bfd_get_section_alignment (htab->root.dynobj, s))
4138     {
4139       if (! bfd_set_section_alignment (htab->root.dynobj, s, power_of_two))
4140         return FALSE;
4141     }
4142
4143   /* Define the symbol as being at this point in the section.  */
4144   h->root.u.def.section = s;
4145   h->root.u.def.value = s->size;
4146
4147   /* Increment the section size to make room for the symbol.  */
4148   s->size += h->size;
4149
4150   return TRUE;
4151 }
4152
4153 /* Allocate space in .plt, .got and associated reloc sections for
4154    dynamic relocs.  */
4155
4156 static bfd_boolean
4157 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4158 {
4159   struct bfd_link_info *info;
4160   struct elf_sh_link_hash_table *htab;
4161   struct elf_sh_link_hash_entry *eh;
4162   struct elf_sh_dyn_relocs *p;
4163
4164   if (h->root.type == bfd_link_hash_indirect)
4165     return TRUE;
4166
4167   if (h->root.type == bfd_link_hash_warning)
4168     /* When warning symbols are created, they **replace** the "real"
4169        entry in the hash table, thus we never get to see the real
4170        symbol in a hash traversal.  So look at it now.  */
4171     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4172
4173   info = (struct bfd_link_info *) inf;
4174   htab = sh_elf_hash_table (info);
4175
4176   eh = (struct elf_sh_link_hash_entry *) h;
4177   if ((h->got.refcount > 0
4178       || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
4179       && eh->gotplt_refcount > 0)
4180     {
4181       /* The symbol has been forced local, or we have some direct got refs,
4182          so treat all the gotplt refs as got refs. */
4183       h->got.refcount += eh->gotplt_refcount;
4184       if (h->plt.refcount >= eh->gotplt_refcount)
4185         h->plt.refcount -= eh->gotplt_refcount;
4186     }
4187
4188   if (htab->root.dynamic_sections_created
4189       && h->plt.refcount > 0
4190       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4191           || h->root.type != bfd_link_hash_undefweak))
4192     {
4193       /* Make sure this symbol is output as a dynamic symbol.
4194          Undefined weak syms won't yet be marked as dynamic.  */
4195       if (h->dynindx == -1
4196           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
4197         {
4198           if (! bfd_elf_link_record_dynamic_symbol (info, h))
4199             return FALSE;
4200         }
4201
4202       if (info->shared
4203           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
4204         {
4205           asection *s = htab->splt;
4206
4207           /* If this is the first .plt entry, make room for the special
4208              first entry.  */
4209           if (s->size == 0)
4210             s->size += PLT_ENTRY_SIZE;
4211
4212           h->plt.offset = s->size;
4213
4214           /* If this symbol is not defined in a regular file, and we are
4215              not generating a shared library, then set the symbol to this
4216              location in the .plt.  This is required to make function
4217              pointers compare as equal between the normal executable and
4218              the shared library.  */
4219           if (! info->shared
4220               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
4221             {
4222               h->root.u.def.section = s;
4223               h->root.u.def.value = h->plt.offset;
4224             }
4225
4226           /* Make room for this entry.  */
4227           s->size += PLT_ENTRY_SIZE;
4228
4229           /* We also need to make an entry in the .got.plt section, which
4230              will be placed in the .got section by the linker script.  */
4231           htab->sgotplt->size += 4;
4232
4233           /* We also need to make an entry in the .rel.plt section.  */
4234           htab->srelplt->size += sizeof (Elf32_External_Rela);
4235         }
4236       else
4237         {
4238           h->plt.offset = (bfd_vma) -1;
4239           h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
4240         }
4241     }
4242   else
4243     {
4244       h->plt.offset = (bfd_vma) -1;
4245       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
4246     }
4247
4248   if (h->got.refcount > 0)
4249     {
4250       asection *s;
4251       bfd_boolean dyn;
4252       int tls_type = sh_elf_hash_entry (h)->tls_type;
4253
4254       /* Make sure this symbol is output as a dynamic symbol.
4255          Undefined weak syms won't yet be marked as dynamic.  */
4256       if (h->dynindx == -1
4257           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
4258         {
4259           if (! bfd_elf_link_record_dynamic_symbol (info, h))
4260             return FALSE;
4261         }
4262
4263       s = htab->sgot;
4264       h->got.offset = s->size;
4265       s->size += 4;
4266       /* R_SH_TLS_GD needs 2 consecutive GOT slots.  */
4267       if (tls_type == GOT_TLS_GD)
4268         s->size += 4;
4269       dyn = htab->root.dynamic_sections_created;
4270       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
4271          R_SH_TLS_GD needs one if local symbol and two if global.  */
4272       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
4273           || (tls_type == GOT_TLS_IE && dyn))
4274         htab->srelgot->size += sizeof (Elf32_External_Rela);
4275       else if (tls_type == GOT_TLS_GD)
4276         htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
4277       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4278                 || h->root.type != bfd_link_hash_undefweak)
4279                && (info->shared
4280                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
4281         htab->srelgot->size += sizeof (Elf32_External_Rela);
4282     }
4283   else
4284     h->got.offset = (bfd_vma) -1;
4285
4286 #ifdef INCLUDE_SHMEDIA
4287   if (eh->datalabel_got.refcount > 0)
4288     {
4289       asection *s;
4290       bfd_boolean dyn;
4291
4292       /* Make sure this symbol is output as a dynamic symbol.
4293          Undefined weak syms won't yet be marked as dynamic.  */
4294       if (h->dynindx == -1
4295           && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
4296         {
4297           if (! bfd_elf_link_record_dynamic_symbol (info, h))
4298             return FALSE;
4299         }
4300
4301       s = htab->sgot;
4302       eh->datalabel_got.offset = s->size;
4303       s->size += 4;
4304       dyn = htab->root.dynamic_sections_created;
4305       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
4306         htab->srelgot->size += sizeof (Elf32_External_Rela);
4307     }
4308   else
4309     eh->datalabel_got.offset = (bfd_vma) -1;
4310 #endif
4311
4312   if (eh->dyn_relocs == NULL)
4313     return TRUE;
4314
4315   /* In the shared -Bsymbolic case, discard space allocated for
4316      dynamic pc-relative relocs against symbols which turn out to be
4317      defined in regular objects.  For the normal shared case, discard
4318      space for pc-relative relocs that have become local due to symbol
4319      visibility changes.  */
4320
4321   if (info->shared)
4322     {
4323       if (SYMBOL_CALLS_LOCAL (info, h))
4324         {
4325           struct elf_sh_dyn_relocs **pp;
4326
4327           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4328             {
4329               p->count -= p->pc_count;
4330               p->pc_count = 0;
4331               if (p->count == 0)
4332                 *pp = p->next;
4333               else
4334                 pp = &p->next;
4335             }
4336         }
4337
4338       /* Also discard relocs on undefined weak syms with non-default
4339          visibility.  */
4340       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4341           && h->root.type == bfd_link_hash_undefweak)
4342         eh->dyn_relocs = NULL;
4343     }
4344   else
4345     {
4346       /* For the non-shared case, discard space for relocs against
4347          symbols which turn out to need copy relocs or are not
4348          dynamic.  */
4349
4350       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
4351           && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
4352                && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
4353               || (htab->root.dynamic_sections_created
4354                   && (h->root.type == bfd_link_hash_undefweak
4355                       || h->root.type == bfd_link_hash_undefined))))
4356         {
4357           /* Make sure this symbol is output as a dynamic symbol.
4358              Undefined weak syms won't yet be marked as dynamic.  */
4359           if (h->dynindx == -1
4360               && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
4361             {
4362               if (! bfd_elf_link_record_dynamic_symbol (info, h))
4363                 return FALSE;
4364             }
4365
4366           /* If that succeeded, we know we'll be keeping all the
4367              relocs.  */
4368           if (h->dynindx != -1)
4369             goto keep;
4370         }
4371
4372       eh->dyn_relocs = NULL;
4373
4374     keep: ;
4375     }
4376
4377   /* Finally, allocate space.  */
4378   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4379     {
4380       asection *sreloc = elf_section_data (p->sec)->sreloc;
4381       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4382     }
4383
4384   return TRUE;
4385 }
4386
4387 /* Find any dynamic relocs that apply to read-only sections.  */
4388
4389 static bfd_boolean
4390 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4391 {
4392   struct elf_sh_link_hash_entry *eh;
4393   struct elf_sh_dyn_relocs *p;
4394
4395   if (h->root.type == bfd_link_hash_warning)
4396     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4397
4398   eh = (struct elf_sh_link_hash_entry *) h;
4399   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4400     {
4401       asection *s = p->sec->output_section;
4402
4403       if (s != NULL && (s->flags & SEC_READONLY) != 0)
4404         {
4405           struct bfd_link_info *info = (struct bfd_link_info *) inf;
4406
4407           info->flags |= DF_TEXTREL;
4408
4409           /* Not an error, just cut short the traversal.  */
4410           return FALSE;
4411         }
4412     }
4413   return TRUE;
4414 }
4415
4416 /* Set the sizes of the dynamic sections.  */
4417
4418 static bfd_boolean
4419 sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4420                               struct bfd_link_info *info)
4421 {
4422   struct elf_sh_link_hash_table *htab;
4423   bfd *dynobj;
4424   asection *s;
4425   bfd_boolean relocs;
4426   bfd *ibfd;
4427
4428   htab = sh_elf_hash_table (info);
4429   dynobj = htab->root.dynobj;
4430   BFD_ASSERT (dynobj != NULL);
4431
4432   if (htab->root.dynamic_sections_created)
4433     {
4434       /* Set the contents of the .interp section to the interpreter.  */
4435       if (info->executable)
4436         {
4437           s = bfd_get_section_by_name (dynobj, ".interp");
4438           BFD_ASSERT (s != NULL);
4439           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4440           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4441         }
4442     }
4443
4444   /* Set up .got offsets for local syms, and space for local dynamic
4445      relocs.  */
4446   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4447     {
4448       bfd_signed_vma *local_got;
4449       bfd_signed_vma *end_local_got;
4450       char *local_tls_type;
4451       bfd_size_type locsymcount;
4452       Elf_Internal_Shdr *symtab_hdr;
4453       asection *srel;
4454
4455       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4456         continue;
4457
4458       for (s = ibfd->sections; s != NULL; s = s->next)
4459         {
4460           struct elf_sh_dyn_relocs *p;
4461
4462           for (p = ((struct elf_sh_dyn_relocs *)
4463                     elf_section_data (s)->local_dynrel);
4464                p != NULL;
4465                p = p->next)
4466             {
4467               if (! bfd_is_abs_section (p->sec)
4468                   && bfd_is_abs_section (p->sec->output_section))
4469                 {
4470                   /* Input section has been discarded, either because
4471                      it is a copy of a linkonce section or due to
4472                      linker script /DISCARD/, so we'll be discarding
4473                      the relocs too.  */
4474                 }
4475               else if (p->count != 0)
4476                 {
4477                   srel = elf_section_data (p->sec)->sreloc;
4478                   srel->size += p->count * sizeof (Elf32_External_Rela);
4479                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4480                     info->flags |= DF_TEXTREL;
4481                 }
4482             }
4483         }
4484
4485       local_got = elf_local_got_refcounts (ibfd);
4486       if (!local_got)
4487         continue;
4488
4489       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4490       locsymcount = symtab_hdr->sh_info;
4491 #ifdef INCLUDE_SHMEDIA
4492       /* Count datalabel local GOT.  */
4493       locsymcount *= 2;
4494 #endif
4495       end_local_got = local_got + locsymcount;
4496       local_tls_type = sh_elf_local_got_tls_type (ibfd);
4497       s = htab->sgot;
4498       srel = htab->srelgot;
4499       for (; local_got < end_local_got; ++local_got)
4500         {
4501           if (*local_got > 0)
4502             {
4503               *local_got = s->size;
4504               s->size += 4;
4505               if (*local_tls_type == GOT_TLS_GD)
4506                 s->size += 4;
4507               if (info->shared)
4508                 srel->size += sizeof (Elf32_External_Rela);
4509             }
4510           else
4511             *local_got = (bfd_vma) -1;
4512           ++local_tls_type;
4513         }
4514     }
4515
4516   if (htab->tls_ldm_got.refcount > 0)
4517     {
4518       /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
4519          relocs.  */
4520       htab->tls_ldm_got.offset = htab->sgot->size;
4521       htab->sgot->size += 8;
4522       htab->srelgot->size += sizeof (Elf32_External_Rela);
4523     }
4524   else
4525     htab->tls_ldm_got.offset = -1;
4526
4527   /* Allocate global sym .plt and .got entries, and space for global
4528      sym dynamic relocs.  */
4529   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
4530
4531   /* We now have determined the sizes of the various dynamic sections.
4532      Allocate memory for them.  */
4533   relocs = FALSE;
4534   for (s = dynobj->sections; s != NULL; s = s->next)
4535     {
4536       if ((s->flags & SEC_LINKER_CREATED) == 0)
4537         continue;
4538
4539       if (s == htab->splt
4540           || s == htab->sgot
4541           || s == htab->sgotplt)
4542         {
4543           /* Strip this section if we don't need it; see the
4544              comment below.  */
4545         }
4546       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4547         {
4548           if (s->size != 0 && s != htab->srelplt)
4549             relocs = TRUE;
4550
4551           /* We use the reloc_count field as a counter if we need
4552              to copy relocs into the output file.  */
4553           s->reloc_count = 0;
4554         }
4555       else
4556         {
4557           /* It's not one of our sections, so don't allocate space.  */
4558           continue;
4559         }
4560
4561       if (s->size == 0)
4562         {
4563           /* If we don't need this section, strip it from the
4564              output file.  This is mostly to handle .rela.bss and
4565              .rela.plt.  We must create both sections in
4566              create_dynamic_sections, because they must be created
4567              before the linker maps input sections to output
4568              sections.  The linker does that before
4569              adjust_dynamic_symbol is called, and it is that
4570              function which decides whether anything needs to go
4571              into these sections.  */
4572
4573           _bfd_strip_section_from_output (info, s);
4574           continue;
4575         }
4576
4577       /* Allocate memory for the section contents.  We use bfd_zalloc
4578          here in case unused entries are not reclaimed before the
4579          section's contents are written out.  This should not happen,
4580          but this way if it does, we get a R_SH_NONE reloc instead
4581          of garbage.  */
4582       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4583       if (s->contents == NULL)
4584         return FALSE;
4585     }
4586
4587   if (htab->root.dynamic_sections_created)
4588     {
4589       /* Add some entries to the .dynamic section.  We fill in the
4590          values later, in sh_elf_finish_dynamic_sections, but we
4591          must add the entries now so that we get the correct size for
4592          the .dynamic section.  The DT_DEBUG entry is filled in by the
4593          dynamic linker and used by the debugger.  */
4594 #define add_dynamic_entry(TAG, VAL) \
4595   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4596
4597       if (info->executable)
4598         {
4599           if (! add_dynamic_entry (DT_DEBUG, 0))
4600             return FALSE;
4601         }
4602
4603       if (htab->splt->size != 0)
4604         {
4605           if (! add_dynamic_entry (DT_PLTGOT, 0)
4606               || ! add_dynamic_entry (DT_PLTRELSZ, 0)
4607               || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
4608               || ! add_dynamic_entry (DT_JMPREL, 0))
4609             return FALSE;
4610         }
4611
4612       if (relocs)
4613         {
4614           if (! add_dynamic_entry (DT_RELA, 0)
4615               || ! add_dynamic_entry (DT_RELASZ, 0)
4616               || ! add_dynamic_entry (DT_RELAENT,
4617                                       sizeof (Elf32_External_Rela)))
4618             return FALSE;
4619
4620           /* If any dynamic relocs apply to a read-only section,
4621              then we need a DT_TEXTREL entry.  */
4622           if ((info->flags & DF_TEXTREL) == 0)
4623             elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info);
4624
4625           if ((info->flags & DF_TEXTREL) != 0)
4626             {
4627               if (! add_dynamic_entry (DT_TEXTREL, 0))
4628                 return FALSE;
4629             }
4630         }
4631     }
4632 #undef add_dynamic_entry
4633
4634   return TRUE;
4635 }
4636 \f
4637 /* Relocate an SH ELF section.  */
4638
4639 static bfd_boolean
4640 sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4641                          bfd *input_bfd, asection *input_section,
4642                          bfd_byte *contents, Elf_Internal_Rela *relocs,
4643                          Elf_Internal_Sym *local_syms,
4644                          asection **local_sections)
4645 {
4646   struct elf_sh_link_hash_table *htab;
4647   Elf_Internal_Shdr *symtab_hdr;
4648   struct elf_link_hash_entry **sym_hashes;
4649   Elf_Internal_Rela *rel, *relend;
4650   bfd *dynobj;
4651   bfd_vma *local_got_offsets;
4652   asection *sgot;
4653   asection *sgotplt;
4654   asection *splt;
4655   asection *sreloc;
4656   asection *srelgot;
4657
4658   htab = sh_elf_hash_table (info);
4659   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4660   sym_hashes = elf_sym_hashes (input_bfd);
4661   dynobj = htab->root.dynobj;
4662   local_got_offsets = elf_local_got_offsets (input_bfd);
4663
4664   sgot = htab->sgot;
4665   sgotplt = htab->sgotplt;
4666   splt = htab->splt;
4667   sreloc = NULL;
4668   srelgot = NULL;
4669
4670   rel = relocs;
4671   relend = relocs + input_section->reloc_count;
4672   for (; rel < relend; rel++)
4673     {
4674       int r_type;
4675       reloc_howto_type *howto;
4676       unsigned long r_symndx;
4677       Elf_Internal_Sym *sym;
4678       asection *sec;
4679       struct elf_link_hash_entry *h;
4680       bfd_vma relocation;
4681       bfd_vma addend = (bfd_vma) 0;
4682       bfd_reloc_status_type r;
4683       int seen_stt_datalabel = 0;
4684       bfd_vma off;
4685       int tls_type;
4686
4687       r_symndx = ELF32_R_SYM (rel->r_info);
4688
4689       r_type = ELF32_R_TYPE (rel->r_info);
4690
4691       /* Many of the relocs are only used for relaxing, and are
4692          handled entirely by the relaxation code.  */
4693       if (r_type >= (int) R_SH_GNU_VTINHERIT
4694           && r_type <= (int) R_SH_LABEL)
4695         continue;
4696       if (r_type == (int) R_SH_NONE)
4697         continue;
4698
4699       if (r_type < 0
4700           || r_type >= R_SH_max
4701           || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
4702               && r_type <= (int) R_SH_LAST_INVALID_RELOC)
4703           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_3
4704               && r_type <= (int) R_SH_LAST_INVALID_RELOC_3)
4705           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
4706               && r_type <= (int) R_SH_LAST_INVALID_RELOC_4)
4707           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_5
4708               && r_type <= (int) R_SH_LAST_INVALID_RELOC_5)
4709           || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
4710               && r_type <= (int) R_SH_LAST_INVALID_RELOC_2))
4711         {
4712           bfd_set_error (bfd_error_bad_value);
4713           return FALSE;
4714         }
4715
4716       howto = sh_elf_howto_table + r_type;
4717
4718       /* For relocs that aren't partial_inplace, we get the addend from
4719          the relocation.  */
4720       if (! howto->partial_inplace)
4721         addend = rel->r_addend;
4722
4723       h = NULL;
4724       sym = NULL;
4725       sec = NULL;
4726       if (r_symndx < symtab_hdr->sh_info)
4727         {
4728           sym = local_syms + r_symndx;
4729           sec = local_sections[r_symndx];
4730           relocation = (sec->output_section->vma
4731                         + sec->output_offset
4732                         + sym->st_value);
4733           /* A local symbol never has STO_SH5_ISA32, so we don't need
4734              datalabel processing here.  Make sure this does not change
4735              without notice.  */
4736           if ((sym->st_other & STO_SH5_ISA32) != 0)
4737             ((*info->callbacks->reloc_dangerous)
4738              (info,
4739               _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
4740               input_bfd, input_section, rel->r_offset));
4741           if (info->relocatable)
4742             {
4743               /* This is a relocatable link.  We don't have to change
4744                  anything, unless the reloc is against a section symbol,
4745                  in which case we have to adjust according to where the
4746                  section symbol winds up in the output section.  */
4747               sym = local_syms + r_symndx;
4748               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4749                 {
4750                   if (! howto->partial_inplace)
4751                     {
4752                       /* For relocations with the addend in the
4753                          relocation, we need just to update the addend.
4754                          All real relocs are of type partial_inplace; this
4755                          code is mostly for completeness.  */
4756                       rel->r_addend += sec->output_offset + sym->st_value;
4757
4758                       continue;
4759                     }
4760
4761                   /* Relocs of type partial_inplace need to pick up the
4762                      contents in the contents and add the offset resulting
4763                      from the changed location of the section symbol.
4764                      Using _bfd_final_link_relocate (e.g. goto
4765                      final_link_relocate) here would be wrong, because
4766                      relocations marked pc_relative would get the current
4767                      location subtracted, and we must only do that at the
4768                      final link.  */
4769                   r = _bfd_relocate_contents (howto, input_bfd,
4770                                               sec->output_offset
4771                                               + sym->st_value,
4772                                               contents + rel->r_offset);
4773                   goto relocation_done;
4774                 }
4775
4776               continue;
4777             }
4778           else if (! howto->partial_inplace)
4779             {
4780               relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4781               addend = rel->r_addend;
4782             }
4783           else if ((sec->flags & SEC_MERGE)
4784                    && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4785             {
4786               asection *msec;
4787
4788               if (howto->rightshift || howto->src_mask != 0xffffffff)
4789                 {
4790                   (*_bfd_error_handler)
4791                     (_("%s(%s+0x%lx): %s relocation against SEC_MERGE section"),
4792                      bfd_archive_filename (input_bfd),
4793                      bfd_get_section_name (input_bfd, input_section),
4794                      (long) rel->r_offset, howto->name);
4795                   return FALSE;
4796                 }
4797
4798               addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4799               msec = sec;
4800               addend =
4801                 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
4802                 - relocation;
4803               addend += msec->output_section->vma + msec->output_offset;
4804               bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
4805               addend = 0;
4806             }
4807         }
4808       else
4809         {
4810           /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro.  */
4811
4812           /* Section symbol are never (?) placed in the hash table, so
4813              we can just ignore hash relocations when creating a
4814              relocatable object file.  */
4815           if (info->relocatable)
4816             continue;
4817
4818           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4819           while (h->root.type == bfd_link_hash_indirect
4820                  || h->root.type == bfd_link_hash_warning)
4821             {
4822 #ifdef INCLUDE_SHMEDIA
4823               /* If the reference passes a symbol marked with
4824                  STT_DATALABEL, then any STO_SH5_ISA32 on the final value
4825                  doesn't count.  */
4826               seen_stt_datalabel |= h->type == STT_DATALABEL;
4827 #endif
4828               h = (struct elf_link_hash_entry *) h->root.u.i.link;
4829             }
4830           if (h->root.type == bfd_link_hash_defined
4831               || h->root.type == bfd_link_hash_defweak)
4832             {
4833               bfd_boolean dyn;
4834
4835               dyn = htab->root.dynamic_sections_created;
4836               sec = h->root.u.def.section;
4837               /* In these cases, we don't need the relocation value.
4838                  We check specially because in some obscure cases
4839                  sec->output_section will be NULL.  */
4840               if (r_type == R_SH_GOTPC
4841                   || r_type == R_SH_GOTPC_LOW16
4842                   || r_type == R_SH_GOTPC_MEDLOW16
4843                   || r_type == R_SH_GOTPC_MEDHI16
4844                   || r_type == R_SH_GOTPC_HI16
4845                   || ((r_type == R_SH_PLT32
4846                        || r_type == R_SH_PLT_LOW16
4847                        || r_type == R_SH_PLT_MEDLOW16
4848                        || r_type == R_SH_PLT_MEDHI16
4849                        || r_type == R_SH_PLT_HI16)
4850                       && h->plt.offset != (bfd_vma) -1)
4851                   || ((r_type == R_SH_GOT32
4852                        || r_type == R_SH_GOT_LOW16
4853                        || r_type == R_SH_GOT_MEDLOW16
4854                        || r_type == R_SH_GOT_MEDHI16
4855                        || r_type == R_SH_GOT_HI16)
4856                       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
4857                       && (! info->shared
4858                           || (! info->symbolic && h->dynindx != -1)
4859                           || (h->elf_link_hash_flags
4860                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
4861                   /* The cases above are those in which relocation is
4862                      overwritten in the switch block below.  The cases
4863                      below are those in which we must defer relocation
4864                      to run-time, because we can't resolve absolute
4865                      addresses when creating a shared library.  */
4866                   || (info->shared
4867                       && ((! info->symbolic && h->dynindx != -1)
4868                           || (h->elf_link_hash_flags
4869                               & ELF_LINK_HASH_DEF_REGULAR) == 0)
4870                       && ((r_type == R_SH_DIR32
4871                            && (h->elf_link_hash_flags
4872                                & ELF_LINK_FORCED_LOCAL) == 0)
4873                           || r_type == R_SH_REL32)
4874                       && ((input_section->flags & SEC_ALLOC) != 0
4875                           /* DWARF will emit R_SH_DIR32 relocations in its
4876                              sections against symbols defined externally
4877                              in shared libraries.  We can't do anything
4878                              with them here.  */
4879                           || ((input_section->flags & SEC_DEBUGGING) != 0
4880                               && (h->elf_link_hash_flags
4881                                   & ELF_LINK_HASH_DEF_DYNAMIC) != 0)))
4882                   /* Dynamic relocs are not propagated for SEC_DEBUGGING
4883                      sections because such sections are not SEC_ALLOC and
4884                      thus ld.so will not process them.  */
4885                   || (sec->output_section == NULL
4886                       && ((input_section->flags & SEC_DEBUGGING) != 0
4887                           && (h->elf_link_hash_flags
4888                               & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
4889                   || (sec->output_section == NULL
4890                       && (sh_elf_hash_entry (h)->tls_type == GOT_TLS_IE
4891                           || sh_elf_hash_entry (h)->tls_type == GOT_TLS_GD)))
4892                 relocation = 0;
4893               else if (sec->output_section == NULL)
4894                 {
4895                   (*_bfd_error_handler)
4896                     (_("%s: unresolvable relocation against symbol `%s' from %s section"),
4897                      bfd_archive_filename (input_bfd), h->root.root.string,
4898                      bfd_get_section_name (input_bfd, input_section));
4899                   return FALSE;
4900                 }
4901               else
4902                 relocation = ((h->root.u.def.value
4903                               + sec->output_section->vma
4904                               + sec->output_offset)
4905                               /* A STO_SH5_ISA32 causes a "bitor 1" to the
4906                                  symbol value, unless we've seen
4907                                  STT_DATALABEL on the way to it.  */
4908                               | ((h->other & STO_SH5_ISA32) != 0
4909                                  && ! seen_stt_datalabel));
4910             }
4911           else if (h->root.type == bfd_link_hash_undefweak)
4912             relocation = 0;
4913           else if (info->unresolved_syms_in_objects == RM_IGNORE
4914                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4915             relocation = 0;
4916           else
4917             {
4918               if (! info->callbacks->undefined_symbol
4919                   (info, h->root.root.string, input_bfd,
4920                    input_section, rel->r_offset,
4921                    (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4922                     || ELF_ST_VISIBILITY (h->other))))
4923                 return FALSE;
4924               relocation = 0;
4925             }
4926         }
4927
4928       switch ((int) r_type)
4929         {
4930         final_link_relocate:
4931           /* COFF relocs don't use the addend. The addend is used for
4932              R_SH_DIR32 to be compatible with other compilers.  */
4933           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4934                                         contents, rel->r_offset,
4935                                         relocation, addend);
4936           break;
4937
4938         case R_SH_IND12W:
4939           goto final_link_relocate;
4940
4941         case R_SH_DIR8WPN:
4942         case R_SH_DIR8WPZ:
4943         case R_SH_DIR8WPL:
4944           /* If the reloc is against the start of this section, then
4945              the assembler has already taken care of it and the reloc
4946              is here only to assist in relaxing.  If the reloc is not
4947              against the start of this section, then it's against an
4948              external symbol and we must deal with it ourselves.  */
4949           if (input_section->output_section->vma + input_section->output_offset
4950               != relocation)
4951             {
4952               int disp = (relocation
4953                           - input_section->output_section->vma
4954                           - input_section->output_offset
4955                           - rel->r_offset);
4956               int mask = 0;
4957               switch (r_type)
4958                 {
4959                 case R_SH_DIR8WPN:
4960                 case R_SH_DIR8WPZ: mask = 1; break;
4961                 case R_SH_DIR8WPL: mask = 3; break;
4962                 default: mask = 0; break;
4963                 }
4964               if (disp & mask)
4965                 {
4966                   ((*_bfd_error_handler)
4967                    (_("%s: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
4968                     bfd_archive_filename (input_section->owner),
4969                     (unsigned long) rel->r_offset));
4970                   bfd_set_error (bfd_error_bad_value);
4971                   return FALSE;
4972                 }
4973               relocation -= 4;
4974               goto final_link_relocate;
4975             }
4976           r = bfd_reloc_ok;
4977           break;
4978
4979         default:
4980 #ifdef INCLUDE_SHMEDIA
4981           if (shmedia_prepare_reloc (info, input_bfd, input_section,
4982                                      contents, rel, &relocation))
4983             goto final_link_relocate;
4984 #endif
4985           bfd_set_error (bfd_error_bad_value);
4986           return FALSE;
4987
4988         case R_SH_DIR16:
4989         case R_SH_DIR8:
4990         case R_SH_DIR8U:
4991         case R_SH_DIR8S:
4992         case R_SH_DIR4U:
4993           goto final_link_relocate;
4994
4995         case R_SH_DIR8UL:
4996         case R_SH_DIR4UL:
4997           if (relocation & 3)
4998             {
4999               ((*_bfd_error_handler)
5000                (_("%s: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
5001                 bfd_archive_filename (input_section->owner),
5002                 (unsigned long) rel->r_offset, howto->name, 
5003                 (unsigned long)relocation));
5004               bfd_set_error (bfd_error_bad_value);
5005               return FALSE;
5006             }
5007           goto final_link_relocate;
5008
5009         case R_SH_DIR8UW:
5010         case R_SH_DIR8SW:
5011         case R_SH_DIR4UW:
5012           if (relocation & 1)
5013             {
5014               ((*_bfd_error_handler)
5015                (_("%s: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
5016                 bfd_archive_filename (input_section->owner),
5017                 (unsigned long) rel->r_offset, howto->name, 
5018                 (unsigned long)relocation));
5019               bfd_set_error (bfd_error_bad_value);
5020               return FALSE;
5021             }
5022           goto final_link_relocate;
5023
5024         case R_SH_PSHA:
5025           if ((signed int)relocation < -32
5026               || (signed int)relocation > 32)
5027             {
5028               ((*_bfd_error_handler)
5029                (_("%s: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
5030                 bfd_archive_filename (input_section->owner),
5031                 (unsigned long) rel->r_offset,
5032                 (unsigned long)relocation));
5033               bfd_set_error (bfd_error_bad_value);
5034               return FALSE;
5035             }
5036           goto final_link_relocate;
5037
5038         case R_SH_PSHL:
5039           if ((signed int)relocation < -16
5040               || (signed int)relocation > 16)
5041             {
5042               ((*_bfd_error_handler)
5043                (_("%s: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
5044                 bfd_archive_filename (input_section->owner),
5045                 (unsigned long) rel->r_offset,
5046                 (unsigned long)relocation));
5047               bfd_set_error (bfd_error_bad_value);
5048               return FALSE;
5049             }
5050           goto final_link_relocate;
5051
5052         case R_SH_DIR32:
5053         case R_SH_REL32:
5054 #ifdef INCLUDE_SHMEDIA
5055         case R_SH_IMM_LOW16_PCREL:
5056         case R_SH_IMM_MEDLOW16_PCREL:
5057         case R_SH_IMM_MEDHI16_PCREL:
5058         case R_SH_IMM_HI16_PCREL:
5059 #endif
5060           if (info->shared
5061               && (h == NULL
5062                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5063                   || h->root.type != bfd_link_hash_undefweak)
5064               && r_symndx != 0
5065               && (input_section->flags & SEC_ALLOC) != 0
5066               && (r_type == R_SH_DIR32
5067                   || !SYMBOL_CALLS_LOCAL (info, h)))
5068             {
5069               Elf_Internal_Rela outrel;
5070               bfd_byte *loc;
5071               bfd_boolean skip, relocate;
5072
5073               /* When generating a shared object, these relocations
5074                  are copied into the output file to be resolved at run
5075                  time.  */
5076
5077               if (sreloc == NULL)
5078                 {
5079                   const char *name;
5080
5081                   name = (bfd_elf_string_from_elf_section
5082                           (input_bfd,
5083                            elf_elfheader (input_bfd)->e_shstrndx,
5084                            elf_section_data (input_section)->rel_hdr.sh_name));
5085                   if (name == NULL)
5086                     return FALSE;
5087
5088                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5089                               && strcmp (bfd_get_section_name (input_bfd,
5090                                                                input_section),
5091                                          name + 5) == 0);
5092
5093                   sreloc = bfd_get_section_by_name (dynobj, name);
5094                   BFD_ASSERT (sreloc != NULL);
5095                 }
5096
5097               skip = FALSE;
5098               relocate = FALSE;
5099
5100               outrel.r_offset =
5101                 _bfd_elf_section_offset (output_bfd, info, input_section,
5102                                          rel->r_offset);
5103               if (outrel.r_offset == (bfd_vma) -1)
5104                 skip = TRUE;
5105               else if (outrel.r_offset == (bfd_vma) -2)
5106                 skip = TRUE, relocate = TRUE;
5107               outrel.r_offset += (input_section->output_section->vma
5108                                   + input_section->output_offset);
5109
5110               if (skip)
5111                 memset (&outrel, 0, sizeof outrel);
5112               else if (r_type == R_SH_REL32)
5113                 {
5114                   BFD_ASSERT (h != NULL && h->dynindx != -1);
5115                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
5116                   outrel.r_addend
5117                     = bfd_get_32 (input_bfd, contents + rel->r_offset);
5118                 }
5119 #ifdef INCLUDE_SHMEDIA
5120               else if (r_type == R_SH_IMM_LOW16_PCREL
5121                        || r_type == R_SH_IMM_MEDLOW16_PCREL
5122                        || r_type == R_SH_IMM_MEDHI16_PCREL
5123                        || r_type == R_SH_IMM_HI16_PCREL)
5124                 {
5125                   BFD_ASSERT (h != NULL && h->dynindx != -1);
5126                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5127                   outrel.r_addend = addend;
5128                 }
5129 #endif
5130               else
5131                 {
5132                   /* h->dynindx may be -1 if this symbol was marked to
5133                      become local.  */
5134                   if (h == NULL
5135                       || ((info->symbolic || h->dynindx == -1)
5136                           && (h->elf_link_hash_flags
5137                               & ELF_LINK_HASH_DEF_REGULAR) != 0))
5138                     {
5139                       relocate = TRUE;
5140                       outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
5141                       outrel.r_addend
5142                         = relocation + bfd_get_32 (input_bfd,
5143                                                    contents + rel->r_offset);
5144                     }
5145                   else
5146                     {
5147                       BFD_ASSERT (h->dynindx != -1);
5148                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
5149                       outrel.r_addend
5150                         = relocation + bfd_get_32 (input_bfd,
5151                                                    contents + rel->r_offset);
5152                     }
5153                 }
5154
5155               loc = sreloc->contents;
5156               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5157               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5158
5159               /* If this reloc is against an external symbol, we do
5160                  not want to fiddle with the addend.  Otherwise, we
5161                  need to include the symbol value so that it becomes
5162                  an addend for the dynamic reloc.  */
5163               if (! relocate)
5164                 continue;
5165             }
5166           goto final_link_relocate;
5167
5168         case R_SH_GOTPLT32:
5169 #ifdef INCLUDE_SHMEDIA
5170         case R_SH_GOTPLT_LOW16:
5171         case R_SH_GOTPLT_MEDLOW16:
5172         case R_SH_GOTPLT_MEDHI16:
5173         case R_SH_GOTPLT_HI16:
5174         case R_SH_GOTPLT10BY4:
5175         case R_SH_GOTPLT10BY8:
5176 #endif
5177           /* Relocation is to the entry for this symbol in the
5178              procedure linkage table.  */
5179
5180           if (h == NULL
5181               || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)
5182               || ! info->shared
5183               || info->symbolic
5184               || h->dynindx == -1
5185               || h->plt.offset == (bfd_vma) -1
5186               || h->got.offset != (bfd_vma) -1)
5187             goto force_got;
5188
5189           /* Relocation is to the entry for this symbol in the global
5190              offset table extension for the procedure linkage table.  */
5191
5192           BFD_ASSERT (sgotplt != NULL);
5193           relocation = (sgotplt->output_offset
5194                         + ((h->plt.offset / elf_sh_sizeof_plt (info)
5195                             - 1 + 3) * 4));
5196
5197 #ifdef GOT_BIAS
5198           relocation -= GOT_BIAS;
5199 #endif
5200
5201           goto final_link_relocate;
5202
5203         force_got:
5204         case R_SH_GOT32:
5205 #ifdef INCLUDE_SHMEDIA
5206         case R_SH_GOT_LOW16:
5207         case R_SH_GOT_MEDLOW16:
5208         case R_SH_GOT_MEDHI16:
5209         case R_SH_GOT_HI16:
5210         case R_SH_GOT10BY4:
5211         case R_SH_GOT10BY8:
5212 #endif
5213           /* Relocation is to the entry for this symbol in the global
5214              offset table.  */
5215
5216           BFD_ASSERT (sgot != NULL);
5217
5218           if (h != NULL)
5219             {
5220               bfd_boolean dyn;
5221
5222               off = h->got.offset;
5223 #ifdef INCLUDE_SHMEDIA
5224               if (seen_stt_datalabel)
5225                 {
5226                   struct elf_sh_link_hash_entry *hsh;
5227
5228                   hsh = (struct elf_sh_link_hash_entry *)h;
5229                   off = hsh->datalabel_got.offset;
5230                 }
5231 #endif
5232               BFD_ASSERT (off != (bfd_vma) -1);
5233
5234               dyn = htab->root.dynamic_sections_created;
5235               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5236                   || (info->shared
5237                       && SYMBOL_REFERENCES_LOCAL (info, h))
5238                   || (ELF_ST_VISIBILITY (h->other)
5239                       && h->root.type == bfd_link_hash_undefweak))
5240                 {
5241                   /* This is actually a static link, or it is a
5242                      -Bsymbolic link and the symbol is defined
5243                      locally, or the symbol was forced to be local
5244                      because of a version file.  We must initialize
5245                      this entry in the global offset table.  Since the
5246                      offset must always be a multiple of 4, we use the
5247                      least significant bit to record whether we have
5248                      initialized it already.
5249
5250                      When doing a dynamic link, we create a .rela.got
5251                      relocation entry to initialize the value.  This
5252                      is done in the finish_dynamic_symbol routine.  */
5253                   if ((off & 1) != 0)
5254                     off &= ~1;
5255                   else
5256                     {
5257                       bfd_put_32 (output_bfd, relocation,
5258                                   sgot->contents + off);
5259 #ifdef INCLUDE_SHMEDIA
5260                       if (seen_stt_datalabel)
5261                         {
5262                           struct elf_sh_link_hash_entry *hsh;
5263
5264                           hsh = (struct elf_sh_link_hash_entry *)h;
5265                           hsh->datalabel_got.offset |= 1;
5266                         }
5267                       else
5268 #endif
5269                         h->got.offset |= 1;
5270                     }
5271                 }
5272
5273               relocation = sgot->output_offset + off;
5274             }
5275           else
5276             {
5277 #ifdef INCLUDE_SHMEDIA
5278               if (rel->r_addend)
5279                 {
5280                   BFD_ASSERT (local_got_offsets != NULL
5281                               && (local_got_offsets[symtab_hdr->sh_info
5282                                                     + r_symndx]
5283                                   != (bfd_vma) -1));
5284
5285                   off = local_got_offsets[symtab_hdr->sh_info
5286                                           + r_symndx];
5287                 }
5288               else
5289                 {
5290 #endif
5291               BFD_ASSERT (local_got_offsets != NULL
5292                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
5293
5294               off = local_got_offsets[r_symndx];
5295 #ifdef INCLUDE_SHMEDIA
5296                 }
5297 #endif
5298
5299               /* The offset must always be a multiple of 4.  We use
5300                  the least significant bit to record whether we have
5301                  already generated the necessary reloc.  */
5302               if ((off & 1) != 0)
5303                 off &= ~1;
5304               else
5305                 {
5306                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
5307
5308                   if (info->shared)
5309                     {
5310                       Elf_Internal_Rela outrel;
5311                       bfd_byte *loc;
5312
5313                       if (srelgot == NULL)
5314                         {
5315                           srelgot = bfd_get_section_by_name (dynobj,
5316                                                              ".rela.got");
5317                           BFD_ASSERT (srelgot != NULL);
5318                         }
5319
5320                       outrel.r_offset = (sgot->output_section->vma
5321                                          + sgot->output_offset
5322                                          + off);
5323                       outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
5324                       outrel.r_addend = relocation;
5325                       loc = srelgot->contents;
5326                       loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
5327                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5328                     }
5329
5330 #ifdef INCLUDE_SHMEDIA
5331                   if (rel->r_addend)
5332                     local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1;
5333                   else
5334 #endif
5335                     local_got_offsets[r_symndx] |= 1;
5336                 }
5337
5338               relocation = sgot->output_offset + off;
5339             }
5340
5341 #ifdef GOT_BIAS
5342           relocation -= GOT_BIAS;
5343 #endif
5344
5345           goto final_link_relocate;
5346
5347         case R_SH_GOTOFF:
5348 #ifdef INCLUDE_SHMEDIA
5349         case R_SH_GOTOFF_LOW16:
5350         case R_SH_GOTOFF_MEDLOW16:
5351         case R_SH_GOTOFF_MEDHI16:
5352         case R_SH_GOTOFF_HI16:
5353 #endif
5354           /* Relocation is relative to the start of the global offset
5355              table.  */
5356
5357           BFD_ASSERT (sgot != NULL);
5358
5359           /* Note that sgot->output_offset is not involved in this
5360              calculation.  We always want the start of .got.  If we
5361              defined _GLOBAL_OFFSET_TABLE in a different way, as is
5362              permitted by the ABI, we might have to change this
5363              calculation.  */
5364           relocation -= sgot->output_section->vma;
5365
5366 #ifdef GOT_BIAS
5367           relocation -= GOT_BIAS;
5368 #endif
5369
5370           addend = rel->r_addend;
5371
5372           goto final_link_relocate;
5373
5374         case R_SH_GOTPC:
5375 #ifdef INCLUDE_SHMEDIA
5376         case R_SH_GOTPC_LOW16:
5377         case R_SH_GOTPC_MEDLOW16:
5378         case R_SH_GOTPC_MEDHI16:
5379         case R_SH_GOTPC_HI16:
5380 #endif
5381           /* Use global offset table as symbol value.  */
5382
5383           BFD_ASSERT (sgot != NULL);
5384           relocation = sgot->output_section->vma;
5385
5386 #ifdef GOT_BIAS
5387           relocation += GOT_BIAS;
5388 #endif
5389
5390           addend = rel->r_addend;
5391
5392           goto final_link_relocate;
5393
5394         case R_SH_PLT32:
5395 #ifdef INCLUDE_SHMEDIA
5396         case R_SH_PLT_LOW16:
5397         case R_SH_PLT_MEDLOW16:
5398         case R_SH_PLT_MEDHI16:
5399         case R_SH_PLT_HI16:
5400 #endif
5401           /* Relocation is to the entry for this symbol in the
5402              procedure linkage table.  */
5403
5404           /* Resolve a PLT reloc against a local symbol directly,
5405              without using the procedure linkage table.  */
5406           if (h == NULL)
5407             goto final_link_relocate;
5408
5409           if (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)
5410             goto final_link_relocate;
5411
5412           if (h->plt.offset == (bfd_vma) -1)
5413             {
5414               /* We didn't make a PLT entry for this symbol.  This
5415                  happens when statically linking PIC code, or when
5416                  using -Bsymbolic.  */
5417               goto final_link_relocate;
5418             }
5419
5420           BFD_ASSERT (splt != NULL);
5421           relocation = (splt->output_section->vma
5422                         + splt->output_offset
5423                         + h->plt.offset);
5424
5425 #ifdef INCLUDE_SHMEDIA
5426           relocation++;
5427 #endif
5428
5429           addend = rel->r_addend;
5430
5431           goto final_link_relocate;
5432
5433         case R_SH_LOOP_START:
5434           {
5435             static bfd_vma start, end;
5436
5437             start = (relocation + rel->r_addend
5438                      - (sec->output_section->vma + sec->output_offset));
5439             r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
5440                                    rel->r_offset, sec, start, end);
5441             break;
5442
5443         case R_SH_LOOP_END:
5444             end = (relocation + rel->r_addend
5445                    - (sec->output_section->vma + sec->output_offset));
5446             r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
5447                                    rel->r_offset, sec, start, end);
5448             break;
5449           }
5450
5451         case R_SH_TLS_GD_32:
5452         case R_SH_TLS_IE_32:
5453           r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
5454           tls_type = GOT_UNKNOWN;
5455           if (h == NULL && local_got_offsets)
5456             tls_type = sh_elf_local_got_tls_type (input_bfd) [r_symndx];
5457           else if (h != NULL)
5458             {
5459               tls_type = sh_elf_hash_entry (h)->tls_type;
5460               if (! info->shared
5461                   && (h->dynindx == -1
5462                       || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
5463                 r_type = R_SH_TLS_LE_32;
5464             }
5465
5466           if (r_type == R_SH_TLS_GD_32 && tls_type == GOT_TLS_IE)
5467             r_type = R_SH_TLS_IE_32;
5468
5469           if (r_type == R_SH_TLS_LE_32)
5470             {
5471               bfd_vma offset;
5472               unsigned short insn;
5473
5474               if (ELF32_R_TYPE (rel->r_info) == R_SH_TLS_GD_32)
5475                 {
5476                   /* GD->LE transition:
5477                        mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5478                        jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5479                        1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5480                      We change it into:
5481                        mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
5482                        nop; nop; ...
5483                        1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:.  */
5484
5485                   offset = rel->r_offset;
5486                   BFD_ASSERT (offset >= 16);
5487                   /* Size of GD instructions is 16 or 18.  */
5488                   offset -= 16;
5489                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
5490                   if ((insn & 0xff00) == 0xc700)
5491                     {
5492                       BFD_ASSERT (offset >= 2);
5493                       offset -= 2;
5494                       insn = bfd_get_16 (input_bfd, contents + offset + 0);
5495                     }
5496
5497                   BFD_ASSERT ((insn & 0xff00) == 0xd400);
5498                   insn = bfd_get_16 (input_bfd, contents + offset + 2);
5499                   BFD_ASSERT ((insn & 0xff00) == 0xc700);
5500                   insn = bfd_get_16 (input_bfd, contents + offset + 4);
5501                   BFD_ASSERT ((insn & 0xff00) == 0xd100);
5502                   insn = bfd_get_16 (input_bfd, contents + offset + 6);
5503                   BFD_ASSERT (insn == 0x310c);
5504                   insn = bfd_get_16 (input_bfd, contents + offset + 8);
5505                   BFD_ASSERT (insn == 0x410b);
5506                   insn = bfd_get_16 (input_bfd, contents + offset + 10);
5507                   BFD_ASSERT (insn == 0x34cc);
5508
5509                   bfd_put_16 (output_bfd, 0x0012, contents + offset + 2);
5510                   bfd_put_16 (output_bfd, 0x304c, contents + offset + 4);
5511                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
5512                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5513                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5514                 }
5515               else
5516                 {
5517                   int index;
5518
5519                   /* IE->LE transition:
5520                      mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
5521                      bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
5522                      We change it into:
5523                      mov.l .Ln,rM; stc gbr,rN; nop; ...;
5524                      1: x@TPOFF; 2:.  */
5525
5526                   offset = rel->r_offset;
5527                   BFD_ASSERT (offset >= 16);
5528                   /* Size of IE instructions is 10 or 12.  */
5529                   offset -= 10;
5530                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
5531                   if ((insn & 0xf0ff) == 0x0012)
5532                     {
5533                       BFD_ASSERT (offset >= 2);
5534                       offset -= 2;
5535                       insn = bfd_get_16 (input_bfd, contents + offset + 0);
5536                     }
5537
5538                   BFD_ASSERT ((insn & 0xff00) == 0xd000);
5539                   index = insn & 0x00ff;
5540                   insn = bfd_get_16 (input_bfd, contents + offset + 2);
5541                   BFD_ASSERT ((insn & 0xf0ff) == 0x0012);
5542                   insn = bfd_get_16 (input_bfd, contents + offset + 4);
5543                   BFD_ASSERT ((insn & 0xf0ff) == 0x00ce);
5544                   insn = 0xd000 | (insn & 0x0f00) | index;
5545                   bfd_put_16 (output_bfd, insn, contents + offset + 0);
5546                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
5547                 }
5548
5549               bfd_put_32 (output_bfd, tpoff (info, relocation),
5550                           contents + rel->r_offset);
5551               continue;
5552             }
5553
5554           sgot = htab->sgot;
5555           if (sgot == NULL)
5556             abort ();
5557
5558           if (h != NULL)
5559             off = h->got.offset;
5560           else
5561             {
5562               if (local_got_offsets == NULL)
5563                 abort ();
5564
5565               off = local_got_offsets[r_symndx];
5566             }
5567
5568           /* Relocate R_SH_TLS_IE_32 directly when statically linking.  */
5569           if (r_type == R_SH_TLS_IE_32
5570               && ! htab->root.dynamic_sections_created)
5571             {
5572               off &= ~1;
5573               bfd_put_32 (output_bfd, tpoff (info, relocation),
5574                           sgot->contents + off);
5575               bfd_put_32 (output_bfd, sgot->output_offset + off,
5576                           contents + rel->r_offset);
5577               continue;
5578             }
5579
5580           if ((off & 1) != 0)
5581             off &= ~1;
5582           else
5583             {
5584               Elf_Internal_Rela outrel;
5585               bfd_byte *loc;
5586               int dr_type, indx;
5587
5588               if (srelgot == NULL)
5589                 {
5590                   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
5591                   BFD_ASSERT (srelgot != NULL);
5592                 }
5593
5594               outrel.r_offset = (sgot->output_section->vma
5595                                  + sgot->output_offset + off);
5596
5597               if (h == NULL || h->dynindx == -1)
5598                 indx = 0;
5599               else
5600                 indx = h->dynindx;
5601
5602               dr_type = (r_type == R_SH_TLS_GD_32 ? R_SH_TLS_DTPMOD32 :
5603                          R_SH_TLS_TPOFF32);
5604               if (dr_type == R_SH_TLS_TPOFF32 && indx == 0)
5605                 outrel.r_addend = relocation - dtpoff_base (info);
5606               else
5607                 outrel.r_addend = 0;
5608               outrel.r_info = ELF32_R_INFO (indx, dr_type);
5609               loc = srelgot->contents;
5610               loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
5611               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5612
5613               if (r_type == R_SH_TLS_GD_32)
5614                 {
5615                   if (indx == 0)
5616                     {
5617                       bfd_put_32 (output_bfd,
5618                                   relocation - dtpoff_base (info),
5619                                   sgot->contents + off + 4);
5620                     }
5621                   else
5622                     {
5623                       outrel.r_info = ELF32_R_INFO (indx,
5624                                                     R_SH_TLS_DTPOFF32);
5625                       outrel.r_offset += 4;
5626                       outrel.r_addend = 0;
5627                       srelgot->reloc_count++;
5628                       loc += sizeof (Elf32_External_Rela);
5629                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5630                     }
5631                 }
5632
5633               if (h != NULL)
5634                 h->got.offset |= 1;
5635               else
5636                 local_got_offsets[r_symndx] |= 1;
5637             }
5638
5639           if (off >= (bfd_vma) -2)
5640             abort ();
5641
5642           if (r_type == (int) ELF32_R_TYPE (rel->r_info))
5643             relocation = sgot->output_offset + off;
5644           else
5645             {
5646               bfd_vma offset;
5647               unsigned short insn;
5648
5649               /* GD->IE transition:
5650                    mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5651                    jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5652                    1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
5653                  We change it into:
5654                    mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
5655                    nop; nop; bra 3f; nop; .align 2;
5656                    1: .long x@TPOFF; 2:...; 3:.  */
5657
5658               offset = rel->r_offset;
5659               BFD_ASSERT (offset >= 16);
5660               /* Size of GD instructions is 16 or 18.  */
5661               offset -= 16;
5662               insn = bfd_get_16 (input_bfd, contents + offset + 0);
5663               if ((insn & 0xff00) == 0xc700)
5664                 {
5665                   BFD_ASSERT (offset >= 2);
5666                   offset -= 2;
5667                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
5668                 }
5669
5670               BFD_ASSERT ((insn & 0xff00) == 0xd400);
5671
5672               /* Replace mov.l 1f,R4 with mov.l 1f,r0.  */
5673               bfd_put_16 (output_bfd, insn & 0xf0ff, contents + offset);
5674
5675               insn = bfd_get_16 (input_bfd, contents + offset + 2);
5676               BFD_ASSERT ((insn & 0xff00) == 0xc700);
5677               insn = bfd_get_16 (input_bfd, contents + offset + 4);
5678               BFD_ASSERT ((insn & 0xff00) == 0xd100);
5679               insn = bfd_get_16 (input_bfd, contents + offset + 6);
5680               BFD_ASSERT (insn == 0x310c);
5681               insn = bfd_get_16 (input_bfd, contents + offset + 8);
5682               BFD_ASSERT (insn == 0x410b);
5683               insn = bfd_get_16 (input_bfd, contents + offset + 10);
5684               BFD_ASSERT (insn == 0x34cc);
5685
5686               bfd_put_16 (output_bfd, 0x0412, contents + offset + 2);
5687               bfd_put_16 (output_bfd, 0x00ce, contents + offset + 4);
5688               bfd_put_16 (output_bfd, 0x304c, contents + offset + 6);
5689               bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5690               bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5691
5692               bfd_put_32 (output_bfd, sgot->output_offset + off,
5693                           contents + rel->r_offset);
5694
5695               continue;
5696           }
5697
5698           addend = rel->r_addend;
5699
5700           goto final_link_relocate;
5701
5702         case R_SH_TLS_LD_32:
5703           if (! info->shared)
5704             {
5705               bfd_vma offset;
5706               unsigned short insn;
5707
5708               /* LD->LE transition:
5709                    mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
5710                    jsr @r1; add r12,r4; bra 3f; nop; .align 2;
5711                    1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
5712                  We change it into:
5713                    stc gbr,r0; nop; nop; nop;
5714                    nop; nop; bra 3f; ...; 3:.  */
5715
5716               offset = rel->r_offset;
5717               BFD_ASSERT (offset >= 16);
5718               /* Size of LD instructions is 16 or 18.  */
5719               offset -= 16;
5720               insn = bfd_get_16 (input_bfd, contents + offset + 0);
5721               if ((insn & 0xff00) == 0xc700)
5722                 {
5723                   BFD_ASSERT (offset >= 2);
5724                   offset -= 2;
5725                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
5726                 }
5727
5728               BFD_ASSERT ((insn & 0xff00) == 0xd400);
5729               insn = bfd_get_16 (input_bfd, contents + offset + 2);
5730               BFD_ASSERT ((insn & 0xff00) == 0xc700);
5731               insn = bfd_get_16 (input_bfd, contents + offset + 4);
5732               BFD_ASSERT ((insn & 0xff00) == 0xd100);
5733               insn = bfd_get_16 (input_bfd, contents + offset + 6);
5734               BFD_ASSERT (insn == 0x310c);
5735               insn = bfd_get_16 (input_bfd, contents + offset + 8);
5736               BFD_ASSERT (insn == 0x410b);
5737               insn = bfd_get_16 (input_bfd, contents + offset + 10);
5738               BFD_ASSERT (insn == 0x34cc);
5739
5740               bfd_put_16 (output_bfd, 0x0012, contents + offset + 0);
5741               bfd_put_16 (output_bfd, 0x0009, contents + offset + 2);
5742               bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
5743               bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
5744               bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
5745               bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
5746
5747               continue;
5748             }
5749
5750           sgot = htab->sgot;
5751           if (sgot == NULL)
5752             abort ();
5753
5754           off = htab->tls_ldm_got.offset;
5755           if (off & 1)
5756             off &= ~1;
5757           else
5758             {
5759               Elf_Internal_Rela outrel;
5760               bfd_byte *loc;
5761
5762               srelgot = htab->srelgot;
5763               if (srelgot == NULL)
5764                 abort ();
5765
5766               outrel.r_offset = (sgot->output_section->vma
5767                                  + sgot->output_offset + off);
5768               outrel.r_addend = 0;
5769               outrel.r_info = ELF32_R_INFO (0, R_SH_TLS_DTPMOD32);
5770               loc = srelgot->contents;
5771               loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
5772               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5773               htab->tls_ldm_got.offset |= 1;
5774             }
5775
5776           relocation = sgot->output_offset + off;
5777           addend = rel->r_addend;
5778
5779           goto final_link_relocate;
5780
5781         case R_SH_TLS_LDO_32:
5782           if (! info->shared)
5783             relocation = tpoff (info, relocation);
5784           else
5785             relocation -= dtpoff_base (info);
5786
5787           addend = rel->r_addend;
5788           goto final_link_relocate;
5789
5790         case R_SH_TLS_LE_32:
5791           {
5792             int indx;
5793             Elf_Internal_Rela outrel;
5794             bfd_byte *loc;
5795
5796             if (! info->shared)
5797               {
5798                 relocation = tpoff (info, relocation);
5799                 addend = rel->r_addend;
5800                 goto final_link_relocate;
5801               }
5802
5803             if (sreloc == NULL)
5804               {
5805                 const char *name;
5806
5807                 name = (bfd_elf_string_from_elf_section
5808                         (input_bfd,
5809                          elf_elfheader (input_bfd)->e_shstrndx,
5810                          elf_section_data (input_section)->rel_hdr.sh_name));
5811                 if (name == NULL)
5812                   return FALSE;
5813
5814                 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5815                             && strcmp (bfd_get_section_name (input_bfd,
5816                                                              input_section),
5817                                        name + 5) == 0);
5818
5819                 sreloc = bfd_get_section_by_name (dynobj, name);
5820                 BFD_ASSERT (sreloc != NULL);
5821               }
5822
5823             if (h == NULL || h->dynindx == -1)
5824               indx = 0;
5825             else
5826               indx = h->dynindx;
5827
5828             outrel.r_offset = (input_section->output_section->vma
5829                                + input_section->output_offset
5830                                + rel->r_offset);
5831             outrel.r_info = ELF32_R_INFO (indx, R_SH_TLS_TPOFF32);
5832             if (indx == 0)
5833               outrel.r_addend = relocation - dtpoff_base (info);
5834             else
5835               outrel.r_addend = 0;
5836
5837             loc = sreloc->contents;
5838             loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5839             bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5840             continue;
5841           }
5842         }
5843
5844     relocation_done:
5845       if (r != bfd_reloc_ok)
5846         {
5847           switch (r)
5848             {
5849             default:
5850             case bfd_reloc_outofrange:
5851               abort ();
5852             case bfd_reloc_overflow:
5853               {
5854                 const char *name;
5855
5856                 if (h != NULL)
5857                   name = h->root.root.string;
5858                 else
5859                   {
5860                     name = (bfd_elf_string_from_elf_section
5861                             (input_bfd, symtab_hdr->sh_link, sym->st_name));
5862                     if (name == NULL)
5863                       return FALSE;
5864                     if (*name == '\0')
5865                       name = bfd_section_name (input_bfd, sec);
5866                   }
5867                 if (! ((*info->callbacks->reloc_overflow)
5868                        (info, name, howto->name, (bfd_vma) 0,
5869                         input_bfd, input_section, rel->r_offset)))
5870                   return FALSE;
5871               }
5872               break;
5873             }
5874         }
5875     }
5876
5877   return TRUE;
5878 }
5879
5880 /* This is a version of bfd_generic_get_relocated_section_contents
5881    which uses sh_elf_relocate_section.  */
5882
5883 static bfd_byte *
5884 sh_elf_get_relocated_section_contents (bfd *output_bfd,
5885                                        struct bfd_link_info *link_info,
5886                                        struct bfd_link_order *link_order,
5887                                        bfd_byte *data,
5888                                        bfd_boolean relocatable,
5889                                        asymbol **symbols)
5890 {
5891   Elf_Internal_Shdr *symtab_hdr;
5892   asection *input_section = link_order->u.indirect.section;
5893   bfd *input_bfd = input_section->owner;
5894   asection **sections = NULL;
5895   Elf_Internal_Rela *internal_relocs = NULL;
5896   Elf_Internal_Sym *isymbuf = NULL;
5897
5898   /* We only need to handle the case of relaxing, or of having a
5899      particular set of section contents, specially.  */
5900   if (relocatable
5901       || elf_section_data (input_section)->this_hdr.contents == NULL)
5902     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
5903                                                        link_order, data,
5904                                                        relocatable,
5905                                                        symbols);
5906
5907   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5908
5909   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
5910           (size_t) input_section->size);
5911
5912   if ((input_section->flags & SEC_RELOC) != 0
5913       && input_section->reloc_count > 0)
5914     {
5915       asection **secpp;
5916       Elf_Internal_Sym *isym, *isymend;
5917       bfd_size_type amt;
5918
5919       internal_relocs = (_bfd_elf_link_read_relocs
5920                          (input_bfd, input_section, NULL,
5921                           (Elf_Internal_Rela *) NULL, FALSE));
5922       if (internal_relocs == NULL)
5923         goto error_return;
5924
5925       if (symtab_hdr->sh_info != 0)
5926         {
5927           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5928           if (isymbuf == NULL)
5929             isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
5930                                             symtab_hdr->sh_info, 0,
5931                                             NULL, NULL, NULL);
5932           if (isymbuf == NULL)
5933             goto error_return;
5934         }
5935
5936       amt = symtab_hdr->sh_info;
5937       amt *= sizeof (asection *);
5938       sections = (asection **) bfd_malloc (amt);
5939       if (sections == NULL && amt != 0)
5940         goto error_return;
5941
5942       isymend = isymbuf + symtab_hdr->sh_info;
5943       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
5944         {
5945           asection *isec;
5946
5947           if (isym->st_shndx == SHN_UNDEF)
5948             isec = bfd_und_section_ptr;
5949           else if (isym->st_shndx == SHN_ABS)
5950             isec = bfd_abs_section_ptr;
5951           else if (isym->st_shndx == SHN_COMMON)
5952             isec = bfd_com_section_ptr;
5953           else
5954             isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
5955
5956           *secpp = isec;
5957         }
5958
5959       if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
5960                                      input_section, data, internal_relocs,
5961                                      isymbuf, sections))
5962         goto error_return;
5963
5964       if (sections != NULL)
5965         free (sections);
5966       if (isymbuf != NULL
5967           && symtab_hdr->contents != (unsigned char *) isymbuf)
5968         free (isymbuf);
5969       if (elf_section_data (input_section)->relocs != internal_relocs)
5970         free (internal_relocs);
5971     }
5972
5973   return data;
5974
5975  error_return:
5976   if (sections != NULL)
5977     free (sections);
5978   if (isymbuf != NULL
5979       && symtab_hdr->contents != (unsigned char *) isymbuf)
5980     free (isymbuf);
5981   if (internal_relocs != NULL
5982       && elf_section_data (input_section)->relocs != internal_relocs)
5983     free (internal_relocs);
5984   return NULL;
5985 }
5986
5987 /* Return the base VMA address which should be subtracted from real addresses
5988    when resolving @dtpoff relocation.
5989    This is PT_TLS segment p_vaddr.  */
5990
5991 static bfd_vma
5992 dtpoff_base (struct bfd_link_info *info)
5993 {
5994   /* If tls_sec is NULL, we should have signalled an error already.  */
5995   if (elf_hash_table (info)->tls_sec == NULL)
5996     return 0;
5997   return elf_hash_table (info)->tls_sec->vma;
5998 }
5999
6000 /* Return the relocation value for R_SH_TLS_TPOFF32..  */
6001
6002 static bfd_vma
6003 tpoff (struct bfd_link_info *info, bfd_vma address)
6004 {
6005   /* If tls_sec is NULL, we should have signalled an error already.  */
6006   if (elf_hash_table (info)->tls_sec == NULL)
6007     return 0;
6008   /* SH TLS ABI is variant I and static TLS block start just after tcbhead
6009      structure which has 2 pointer fields.  */
6010   return address - elf_hash_table (info)->tls_sec->vma + 8;
6011 }
6012
6013 static asection *
6014 sh_elf_gc_mark_hook (asection *sec,
6015                      struct bfd_link_info *info ATTRIBUTE_UNUSED,
6016                      Elf_Internal_Rela *rel, struct elf_link_hash_entry *h,
6017                      Elf_Internal_Sym *sym)
6018 {
6019   if (h != NULL)
6020     {
6021       switch (ELF32_R_TYPE (rel->r_info))
6022         {
6023         case R_SH_GNU_VTINHERIT:
6024         case R_SH_GNU_VTENTRY:
6025           break;
6026
6027         default:
6028 #ifdef INCLUDE_SHMEDIA
6029           while (h->root.type == bfd_link_hash_indirect
6030                  && h->root.u.i.link)
6031             h = (struct elf_link_hash_entry *) h->root.u.i.link;
6032 #endif
6033           switch (h->root.type)
6034             {
6035             case bfd_link_hash_defined:
6036             case bfd_link_hash_defweak:
6037               return h->root.u.def.section;
6038
6039             case bfd_link_hash_common:
6040               return h->root.u.c.p->section;
6041
6042             default:
6043               break;
6044             }
6045         }
6046     }
6047   else
6048     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6049
6050   return NULL;
6051 }
6052
6053 /* Update the got entry reference counts for the section being removed.  */
6054
6055 static bfd_boolean
6056 sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6057                       asection *sec, const Elf_Internal_Rela *relocs)
6058 {
6059   Elf_Internal_Shdr *symtab_hdr;
6060   struct elf_link_hash_entry **sym_hashes;
6061   bfd_signed_vma *local_got_refcounts;
6062   const Elf_Internal_Rela *rel, *relend;
6063
6064   elf_section_data (sec)->local_dynrel = NULL;
6065
6066   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6067   sym_hashes = elf_sym_hashes (abfd);
6068   local_got_refcounts = elf_local_got_refcounts (abfd);
6069
6070   relend = relocs + sec->reloc_count;
6071   for (rel = relocs; rel < relend; rel++)
6072     {
6073       unsigned long r_symndx;
6074       unsigned int r_type;
6075       struct elf_link_hash_entry *h = NULL;
6076 #ifdef INCLUDE_SHMEDIA
6077       int seen_stt_datalabel = 0;
6078 #endif
6079
6080       r_symndx = ELF32_R_SYM (rel->r_info);
6081       if (r_symndx >= symtab_hdr->sh_info)
6082         {
6083           struct elf_sh_link_hash_entry *eh;
6084           struct elf_sh_dyn_relocs **pp;
6085           struct elf_sh_dyn_relocs *p;
6086
6087           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6088 #ifdef INCLUDE_SHMEDIA
6089           while (h->root.type == bfd_link_hash_indirect
6090                  || h->root.type == bfd_link_hash_warning)
6091             {
6092               seen_stt_datalabel |= h->type == STT_DATALABEL;
6093               h = (struct elf_link_hash_entry *) h->root.u.i.link;
6094             }
6095 #endif
6096           eh = (struct elf_sh_link_hash_entry *) h;
6097           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6098             if (p->sec == sec)
6099               {
6100                 /* Everything must go for SEC.  */
6101                 *pp = p->next;
6102                 break;
6103               }
6104         }
6105
6106       r_type = ELF32_R_TYPE (rel->r_info);
6107       switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL))
6108         {
6109         case R_SH_TLS_LD_32:
6110           if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0)
6111             sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
6112           break;
6113
6114         case R_SH_GOT32:
6115         case R_SH_GOTOFF:
6116         case R_SH_GOTPC:
6117 #ifdef INCLUDE_SHMEDIA
6118         case R_SH_GOT_LOW16:
6119         case R_SH_GOT_MEDLOW16:
6120         case R_SH_GOT_MEDHI16:
6121         case R_SH_GOT_HI16:
6122         case R_SH_GOT10BY4:
6123         case R_SH_GOT10BY8:
6124         case R_SH_GOTOFF_LOW16:
6125         case R_SH_GOTOFF_MEDLOW16:
6126         case R_SH_GOTOFF_MEDHI16:
6127         case R_SH_GOTOFF_HI16:
6128         case R_SH_GOTPC_LOW16:
6129         case R_SH_GOTPC_MEDLOW16:
6130         case R_SH_GOTPC_MEDHI16:
6131         case R_SH_GOTPC_HI16:
6132 #endif
6133         case R_SH_TLS_GD_32:
6134         case R_SH_TLS_IE_32:
6135           if (h != NULL)
6136             {
6137 #ifdef INCLUDE_SHMEDIA
6138               if (seen_stt_datalabel)
6139                 {
6140                   struct elf_sh_link_hash_entry *eh;
6141                   eh = (struct elf_sh_link_hash_entry *) h;
6142                   if (eh->datalabel_got.refcount > 0)
6143                     eh->datalabel_got.refcount -= 1;
6144                 }
6145               else
6146 #endif
6147                 if (h->got.refcount > 0)
6148                   h->got.refcount -= 1;
6149             }
6150           else if (local_got_refcounts != NULL)
6151             {
6152 #ifdef INCLUDE_SHMEDIA
6153               if (rel->r_addend & 1)
6154                 {
6155                   if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
6156                     local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
6157                 }
6158               else
6159 #endif
6160                 if (local_got_refcounts[r_symndx] > 0)
6161                   local_got_refcounts[r_symndx] -= 1;
6162             }
6163           break;
6164
6165         case R_SH_DIR32:
6166         case R_SH_REL32:
6167           if (info->shared)
6168             break;
6169           /* Fall thru */
6170
6171         case R_SH_PLT32:
6172 #ifdef INCLUDE_SHMEDIA
6173         case R_SH_PLT_LOW16:
6174         case R_SH_PLT_MEDLOW16:
6175         case R_SH_PLT_MEDHI16:
6176         case R_SH_PLT_HI16:
6177 #endif
6178           if (h != NULL)
6179             {
6180               if (h->plt.refcount > 0)
6181                 h->plt.refcount -= 1;
6182             }
6183           break;
6184
6185         case R_SH_GOTPLT32:
6186 #ifdef INCLUDE_SHMEDIA
6187         case R_SH_GOTPLT_LOW16:
6188         case R_SH_GOTPLT_MEDLOW16:
6189         case R_SH_GOTPLT_MEDHI16:
6190         case R_SH_GOTPLT_HI16:
6191         case R_SH_GOTPLT10BY4:
6192         case R_SH_GOTPLT10BY8:
6193 #endif
6194           if (h != NULL)
6195             {
6196               struct elf_sh_link_hash_entry *eh;
6197               eh = (struct elf_sh_link_hash_entry *) h;
6198               if (eh->gotplt_refcount > 0)
6199                 {
6200                   eh->gotplt_refcount -= 1;
6201                   if (h->plt.refcount > 0)
6202                     h->plt.refcount -= 1;
6203                 }
6204 #ifdef INCLUDE_SHMEDIA
6205               else if (seen_stt_datalabel)
6206                 {
6207                   if (eh->datalabel_got.refcount > 0)
6208                     eh->datalabel_got.refcount -= 1;
6209                 }
6210 #endif
6211               else if (h->got.refcount > 0)
6212                 h->got.refcount -= 1;
6213             }
6214           else if (local_got_refcounts != NULL)
6215             {
6216 #ifdef INCLUDE_SHMEDIA
6217               if (rel->r_addend & 1)
6218                 {
6219                   if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
6220                     local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
6221                 }
6222               else
6223 #endif
6224                 if (local_got_refcounts[r_symndx] > 0)
6225                   local_got_refcounts[r_symndx] -= 1;
6226             }
6227           break;
6228
6229         default:
6230           break;
6231         }
6232     }
6233
6234   return TRUE;
6235 }
6236
6237 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
6238
6239 static void
6240 sh_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
6241                              struct elf_link_hash_entry *dir,
6242                              struct elf_link_hash_entry *ind)
6243 {
6244   struct elf_sh_link_hash_entry *edir, *eind;
6245 #ifdef INCLUDE_SHMEDIA
6246   bfd_signed_vma tmp;
6247 #endif
6248
6249   edir = (struct elf_sh_link_hash_entry *) dir;
6250   eind = (struct elf_sh_link_hash_entry *) ind;
6251
6252   if (eind->dyn_relocs != NULL)
6253     {
6254       if (edir->dyn_relocs != NULL)
6255         {
6256           struct elf_sh_dyn_relocs **pp;
6257           struct elf_sh_dyn_relocs *p;
6258
6259           BFD_ASSERT (ind->root.type != bfd_link_hash_indirect);
6260
6261           /* Add reloc counts against the weak sym to the strong sym
6262              list.  Merge any entries against the same section.  */
6263           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
6264             {
6265               struct elf_sh_dyn_relocs *q;
6266
6267               for (q = edir->dyn_relocs; q != NULL; q = q->next)
6268                 if (q->sec == p->sec)
6269                   {
6270                     q->pc_count += p->pc_count;
6271                     q->count += p->count;
6272                     *pp = p->next;
6273                     break;
6274                   }
6275               if (q == NULL)
6276                 pp = &p->next;
6277             }
6278           *pp = edir->dyn_relocs;
6279         }
6280
6281       edir->dyn_relocs = eind->dyn_relocs;
6282       eind->dyn_relocs = NULL;
6283     }
6284   edir->gotplt_refcount = eind->gotplt_refcount;
6285   eind->gotplt_refcount = 0;
6286 #ifdef INCLUDE_SHMEDIA
6287   tmp = edir->datalabel_got.refcount;
6288   if (tmp < 1)
6289     {
6290       edir->datalabel_got.refcount = eind->datalabel_got.refcount;
6291       eind->datalabel_got.refcount = tmp;
6292     }
6293   else
6294     BFD_ASSERT (eind->datalabel_got.refcount < 1);
6295 #endif
6296
6297   if (ind->root.type == bfd_link_hash_indirect
6298       && dir->got.refcount <= 0)
6299     {
6300       edir->tls_type = eind->tls_type;
6301       eind->tls_type = GOT_UNKNOWN;
6302     }
6303
6304   if (ind->root.type != bfd_link_hash_indirect
6305       && (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
6306     /* If called to transfer flags for a weakdef during processing
6307        of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
6308        We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
6309     dir->elf_link_hash_flags |=
6310       (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
6311                                    | ELF_LINK_HASH_REF_REGULAR
6312                                    | ELF_LINK_HASH_REF_REGULAR_NONWEAK
6313                                    | ELF_LINK_HASH_NEEDS_PLT));
6314   else
6315     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
6316 }
6317
6318 static int
6319 sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
6320                             int is_local)
6321 {
6322   if (info->shared)
6323     return r_type;
6324
6325   switch (r_type)
6326     {
6327     case R_SH_TLS_GD_32:
6328     case R_SH_TLS_IE_32:
6329       if (is_local)
6330         return R_SH_TLS_LE_32;
6331       return R_SH_TLS_IE_32;
6332     case R_SH_TLS_LD_32:
6333       return R_SH_TLS_LE_32;
6334     }
6335
6336   return r_type;
6337 }
6338
6339 /* Look through the relocs for a section during the first phase.
6340    Since we don't do .gots or .plts, we just need to consider the
6341    virtual table relocs for gc.  */
6342
6343 static bfd_boolean
6344 sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
6345                      const Elf_Internal_Rela *relocs)
6346 {
6347   Elf_Internal_Shdr *symtab_hdr;
6348   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
6349   struct elf_sh_link_hash_table *htab;
6350   const Elf_Internal_Rela *rel;
6351   const Elf_Internal_Rela *rel_end;
6352   bfd_vma *local_got_offsets;
6353   asection *sgot;
6354   asection *srelgot;
6355   asection *sreloc;
6356   unsigned int r_type;
6357   int tls_type, old_tls_type;
6358
6359   sgot = NULL;
6360   srelgot = NULL;
6361   sreloc = NULL;
6362
6363   if (info->relocatable)
6364     return TRUE;
6365
6366   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6367   sym_hashes = elf_sym_hashes (abfd);
6368   sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof (Elf32_External_Sym);
6369   if (!elf_bad_symtab (abfd))
6370     sym_hashes_end -= symtab_hdr->sh_info;
6371
6372   htab = sh_elf_hash_table (info);
6373   local_got_offsets = elf_local_got_offsets (abfd);
6374
6375   rel_end = relocs + sec->reloc_count;
6376   for (rel = relocs; rel < rel_end; rel++)
6377     {
6378       struct elf_link_hash_entry *h;
6379       unsigned long r_symndx;
6380 #ifdef INCLUDE_SHMEDIA
6381       int seen_stt_datalabel = 0;
6382 #endif
6383
6384       r_symndx = ELF32_R_SYM (rel->r_info);
6385       r_type = ELF32_R_TYPE (rel->r_info);
6386
6387       if (r_symndx < symtab_hdr->sh_info)
6388         h = NULL;
6389       else
6390         {
6391           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6392 #ifdef INCLUDE_SHMEDIA
6393           while (h->root.type == bfd_link_hash_indirect
6394                  || h->root.type == bfd_link_hash_warning)
6395             {
6396               seen_stt_datalabel |= h->type == STT_DATALABEL;
6397               h = (struct elf_link_hash_entry *) h->root.u.i.link;
6398             }
6399 #endif
6400         }
6401
6402       r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
6403       if (! info->shared
6404           && r_type == R_SH_TLS_IE_32
6405           && h != NULL
6406           && h->root.type != bfd_link_hash_undefined
6407           && h->root.type != bfd_link_hash_undefweak
6408           && (h->dynindx == -1
6409               || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
6410         r_type = R_SH_TLS_LE_32;
6411
6412       /* Some relocs require a global offset table.  */
6413       if (htab->sgot == NULL)
6414         {
6415           switch (r_type)
6416             {
6417             case R_SH_GOTPLT32:
6418             case R_SH_GOT32:
6419             case R_SH_GOTOFF:
6420             case R_SH_GOTPC:
6421 #ifdef INCLUDE_SHMEDIA
6422             case R_SH_GOTPLT_LOW16:
6423             case R_SH_GOTPLT_MEDLOW16:
6424             case R_SH_GOTPLT_MEDHI16:
6425             case R_SH_GOTPLT_HI16:
6426             case R_SH_GOTPLT10BY4:
6427             case R_SH_GOTPLT10BY8:
6428             case R_SH_GOT_LOW16:
6429             case R_SH_GOT_MEDLOW16:
6430             case R_SH_GOT_MEDHI16:
6431             case R_SH_GOT_HI16:
6432             case R_SH_GOT10BY4:
6433             case R_SH_GOT10BY8:
6434             case R_SH_GOTOFF_LOW16:
6435             case R_SH_GOTOFF_MEDLOW16:
6436             case R_SH_GOTOFF_MEDHI16:
6437             case R_SH_GOTOFF_HI16:
6438             case R_SH_GOTPC_LOW16:
6439             case R_SH_GOTPC_MEDLOW16:
6440             case R_SH_GOTPC_MEDHI16:
6441             case R_SH_GOTPC_HI16:
6442 #endif
6443             case R_SH_TLS_GD_32:
6444             case R_SH_TLS_LD_32:
6445             case R_SH_TLS_IE_32:
6446               if (htab->sgot == NULL)
6447                 {
6448                   if (htab->root.dynobj == NULL)
6449                     htab->root.dynobj = abfd;
6450                   if (!create_got_section (htab->root.dynobj, info))
6451                     return FALSE;
6452                 }
6453               break;
6454
6455             default:
6456               break;
6457             }
6458         }
6459
6460       switch (r_type)
6461         {
6462           /* This relocation describes the C++ object vtable hierarchy.
6463              Reconstruct it for later use during GC.  */
6464         case R_SH_GNU_VTINHERIT:
6465           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6466             return FALSE;
6467           break;
6468
6469           /* This relocation describes which C++ vtable entries are actually
6470              used.  Record for later use during GC.  */
6471         case R_SH_GNU_VTENTRY:
6472           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
6473             return FALSE;
6474           break;
6475
6476         case R_SH_TLS_IE_32:
6477           if (info->shared)
6478             info->flags |= DF_STATIC_TLS;
6479
6480           /* FALLTHROUGH */
6481         force_got:
6482         case R_SH_TLS_GD_32:
6483         case R_SH_GOT32:
6484 #ifdef INCLUDE_SHMEDIA
6485         case R_SH_GOT_LOW16:
6486         case R_SH_GOT_MEDLOW16:
6487         case R_SH_GOT_MEDHI16:
6488         case R_SH_GOT_HI16:
6489         case R_SH_GOT10BY4:
6490         case R_SH_GOT10BY8:
6491 #endif
6492           switch (r_type)
6493             {
6494             default:
6495               tls_type = GOT_NORMAL;
6496               break;
6497             case R_SH_TLS_GD_32:
6498               tls_type = GOT_TLS_GD;
6499               break;
6500             case R_SH_TLS_IE_32:
6501               tls_type = GOT_TLS_IE;
6502               break;
6503             }
6504
6505           if (h != NULL)
6506             {
6507 #ifdef INCLUDE_SHMEDIA
6508               if (seen_stt_datalabel)
6509                 {
6510                   struct elf_sh_link_hash_entry *eh
6511                     = (struct elf_sh_link_hash_entry *) h;
6512
6513                   eh->datalabel_got.refcount += 1;
6514                 }
6515               else
6516 #endif
6517                 h->got.refcount += 1;
6518               old_tls_type = sh_elf_hash_entry (h)->tls_type;
6519             }
6520           else
6521             {
6522               bfd_signed_vma *local_got_refcounts;
6523
6524               /* This is a global offset table entry for a local
6525                  symbol.  */
6526               local_got_refcounts = elf_local_got_refcounts (abfd);
6527               if (local_got_refcounts == NULL)
6528                 {
6529                   bfd_size_type size;
6530
6531                   size = symtab_hdr->sh_info;
6532                   size *= sizeof (bfd_signed_vma);
6533 #ifdef INCLUDE_SHMEDIA
6534                   /* Reserve space for both the datalabel and
6535                      codelabel local GOT offsets.  */
6536                   size *= 2;
6537 #endif
6538                   size += symtab_hdr->sh_info;
6539                   local_got_refcounts = ((bfd_signed_vma *)
6540                                          bfd_zalloc (abfd, size));
6541                   if (local_got_refcounts == NULL)
6542                     return FALSE;
6543                   elf_local_got_refcounts (abfd) = local_got_refcounts;
6544 #ifdef  INCLUDE_SHMEDIA
6545                   /* Take care of both the datalabel and codelabel local
6546                      GOT offsets.  */
6547                   sh_elf_local_got_tls_type (abfd)
6548                     = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
6549 #else
6550                   sh_elf_local_got_tls_type (abfd)
6551                     = (char *) (local_got_refcounts + symtab_hdr->sh_info);
6552 #endif
6553                 }
6554 #ifdef INCLUDE_SHMEDIA
6555               if (rel->r_addend & 1)
6556                 local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1;
6557               else
6558 #endif
6559                 local_got_refcounts[r_symndx] += 1;
6560               old_tls_type = sh_elf_local_got_tls_type (abfd) [r_symndx];
6561             }
6562
6563           /* If a TLS symbol is accessed using IE at least once,
6564              there is no point to use dynamic model for it.  */
6565           if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
6566               && (old_tls_type != GOT_TLS_GD || tls_type != GOT_TLS_IE))
6567             {
6568               if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
6569                 tls_type = GOT_TLS_IE;
6570               else
6571                 {
6572                   (*_bfd_error_handler)
6573                     (_("%s: `%s' accessed both as normal and thread local symbol"),
6574                      bfd_archive_filename (abfd), h->root.root.string);
6575                   return FALSE;
6576                 }
6577             }
6578
6579           if (old_tls_type != tls_type)
6580             {
6581               if (h != NULL)
6582                 sh_elf_hash_entry (h)->tls_type = tls_type;
6583               else
6584                 sh_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
6585             }
6586
6587           break;
6588
6589         case R_SH_TLS_LD_32:
6590           sh_elf_hash_table(info)->tls_ldm_got.refcount += 1;
6591           break;
6592
6593         case R_SH_GOTPLT32:
6594 #ifdef INCLUDE_SHMEDIA
6595         case R_SH_GOTPLT_LOW16:
6596         case R_SH_GOTPLT_MEDLOW16:
6597         case R_SH_GOTPLT_MEDHI16:
6598         case R_SH_GOTPLT_HI16:
6599         case R_SH_GOTPLT10BY4:
6600         case R_SH_GOTPLT10BY8:
6601 #endif
6602           /* If this is a local symbol, we resolve it directly without
6603              creating a procedure linkage table entry.  */
6604
6605           if (h == NULL
6606               || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)
6607               || ! info->shared
6608               || info->symbolic
6609               || h->dynindx == -1)
6610             goto force_got;
6611
6612           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
6613           h->plt.refcount += 1;
6614           ((struct elf_sh_link_hash_entry *) h)->gotplt_refcount += 1;
6615
6616           break;
6617
6618         case R_SH_PLT32:
6619 #ifdef INCLUDE_SHMEDIA
6620         case R_SH_PLT_LOW16:
6621         case R_SH_PLT_MEDLOW16:
6622         case R_SH_PLT_MEDHI16:
6623         case R_SH_PLT_HI16:
6624 #endif
6625           /* This symbol requires a procedure linkage table entry.  We
6626              actually build the entry in adjust_dynamic_symbol,
6627              because this might be a case of linking PIC code which is
6628              never referenced by a dynamic object, in which case we
6629              don't need to generate a procedure linkage table entry
6630              after all.  */
6631
6632           /* If this is a local symbol, we resolve it directly without
6633              creating a procedure linkage table entry.  */
6634           if (h == NULL)
6635             continue;
6636
6637           if (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)
6638             break;
6639
6640           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
6641           h->plt.refcount += 1;
6642           break;
6643
6644         case R_SH_DIR32:
6645         case R_SH_REL32:
6646 #ifdef INCLUDE_SHMEDIA
6647         case R_SH_IMM_LOW16_PCREL:
6648         case R_SH_IMM_MEDLOW16_PCREL:
6649         case R_SH_IMM_MEDHI16_PCREL:
6650         case R_SH_IMM_HI16_PCREL:
6651 #endif
6652           if (h != NULL && ! info->shared)
6653             {
6654               h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
6655               h->plt.refcount += 1;
6656             }
6657
6658           /* If we are creating a shared library, and this is a reloc
6659              against a global symbol, or a non PC relative reloc
6660              against a local symbol, then we need to copy the reloc
6661              into the shared library.  However, if we are linking with
6662              -Bsymbolic, we do not need to copy a reloc against a
6663              global symbol which is defined in an object we are
6664              including in the link (i.e., DEF_REGULAR is set).  At
6665              this point we have not seen all the input files, so it is
6666              possible that DEF_REGULAR is not set now but will be set
6667              later (it is never cleared).  We account for that
6668              possibility below by storing information in the
6669              dyn_relocs field of the hash table entry. A similar
6670              situation occurs when creating shared libraries and symbol
6671              visibility changes render the symbol local.
6672
6673              If on the other hand, we are creating an executable, we
6674              may need to keep relocations for symbols satisfied by a
6675              dynamic library if we manage to avoid copy relocs for the
6676              symbol.  */
6677           if ((info->shared
6678                && (sec->flags & SEC_ALLOC) != 0
6679                && (r_type != R_SH_REL32
6680                    || (h != NULL
6681                        && (! info->symbolic
6682                            || h->root.type == bfd_link_hash_defweak
6683                            || (h->elf_link_hash_flags
6684                                & ELF_LINK_HASH_DEF_REGULAR) == 0))))
6685               || (! info->shared
6686                   && (sec->flags & SEC_ALLOC) != 0
6687                   && h != NULL
6688                   && (h->root.type == bfd_link_hash_defweak
6689                       || (h->elf_link_hash_flags
6690                           & ELF_LINK_HASH_DEF_REGULAR) == 0)))
6691             {
6692               struct elf_sh_dyn_relocs *p;
6693               struct elf_sh_dyn_relocs **head;
6694
6695               if (htab->root.dynobj == NULL)
6696                 htab->root.dynobj = abfd;
6697
6698               /* When creating a shared object, we must copy these
6699                  reloc types into the output file.  We create a reloc
6700                  section in dynobj and make room for this reloc.  */
6701               if (sreloc == NULL)
6702                 {
6703                   const char *name;
6704
6705                   name = (bfd_elf_string_from_elf_section
6706                           (abfd,
6707                            elf_elfheader (abfd)->e_shstrndx,
6708                            elf_section_data (sec)->rel_hdr.sh_name));
6709                   if (name == NULL)
6710                     return FALSE;
6711
6712                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
6713                               && strcmp (bfd_get_section_name (abfd, sec),
6714                                          name + 5) == 0);
6715
6716                   sreloc = bfd_get_section_by_name (htab->root.dynobj, name);
6717                   if (sreloc == NULL)
6718                     {
6719                       flagword flags;
6720
6721                       sreloc = bfd_make_section (htab->root.dynobj, name);
6722                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
6723                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
6724                       if ((sec->flags & SEC_ALLOC) != 0)
6725                         flags |= SEC_ALLOC | SEC_LOAD;
6726                       if (sreloc == NULL
6727                           || ! bfd_set_section_flags (htab->root.dynobj,
6728                                                       sreloc, flags)
6729                           || ! bfd_set_section_alignment (htab->root.dynobj,
6730                                                           sreloc, 2))
6731                         return FALSE;
6732                     }
6733                   elf_section_data (sec)->sreloc = sreloc;
6734                 }
6735
6736               /* If this is a global symbol, we count the number of
6737                  relocations we need for this symbol.  */
6738               if (h != NULL)
6739                 head = &((struct elf_sh_link_hash_entry *) h)->dyn_relocs;
6740               else
6741                 {
6742                   asection *s;
6743
6744                   /* Track dynamic relocs needed for local syms too.  */
6745                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
6746                                                  sec, r_symndx);
6747                   if (s == NULL)
6748                     return FALSE;
6749
6750                   head = ((struct elf_sh_dyn_relocs **)
6751                           &elf_section_data (s)->local_dynrel);
6752                 }
6753
6754               p = *head;
6755               if (p == NULL || p->sec != sec)
6756                 {
6757                   bfd_size_type amt = sizeof (*p);
6758                   p = bfd_alloc (htab->root.dynobj, amt);
6759                   if (p == NULL)
6760                     return FALSE;
6761                   p->next = *head;
6762                   *head = p;
6763                   p->sec = sec;
6764                   p->count = 0;
6765                   p->pc_count = 0;
6766                 }
6767
6768               p->count += 1;
6769               if (r_type == R_SH_REL32
6770 #ifdef INCLUDE_SHMEDIA
6771                   || r_type == R_SH_IMM_LOW16_PCREL
6772                   || r_type == R_SH_IMM_MEDLOW16_PCREL
6773                   || r_type == R_SH_IMM_MEDHI16_PCREL
6774                   || r_type == R_SH_IMM_HI16_PCREL
6775 #endif
6776                   )
6777                 p->pc_count += 1;
6778             }
6779
6780           break;
6781
6782         case R_SH_TLS_LE_32:
6783           if (info->shared)
6784             {
6785               (*_bfd_error_handler) (_("%s: TLS local exec code cannot be linked into shared objects"),
6786                                      bfd_archive_filename (abfd));
6787               return FALSE;
6788             }
6789
6790           break;
6791
6792         case R_SH_TLS_LDO_32:
6793           /* Nothing to do.  */
6794           break;
6795
6796         default:
6797           break;
6798         }
6799     }
6800
6801   return TRUE;
6802 }
6803
6804 #ifndef sh_elf_set_mach_from_flags
6805 static unsigned int sh_ef_bfd_table[] = { EF_SH_BFD_TABLE };
6806
6807 static bfd_boolean
6808 sh_elf_set_mach_from_flags (bfd *abfd)
6809 {
6810   flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
6811
6812   if (flags >= sizeof(sh_ef_bfd_table))
6813     return FALSE;
6814
6815   if (sh_ef_bfd_table[flags] == 0)
6816     return FALSE;
6817   
6818   bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
6819
6820   return TRUE;
6821 }
6822
6823
6824 /* Reverse table lookup for sh_ef_bfd_table[].
6825    Given a bfd MACH value from archures.c
6826    return the equivalent ELF flags from the table.
6827    Return -1 if no match is found.  */
6828
6829 int
6830 sh_elf_get_flags_from_mach (unsigned long mach)
6831 {
6832   int i = ARRAY_SIZE (sh_ef_bfd_table);
6833   
6834   for (; i>0; i--)
6835     if (sh_ef_bfd_table[i] == mach)
6836       return i;
6837   
6838   /* shouldn't get here */
6839   BFD_FAIL();
6840
6841   return -1;
6842 }
6843 #endif /* not sh_elf_set_mach_from_flags */
6844
6845 #ifndef sh_elf_set_private_flags
6846 /* Function to keep SH specific file flags.  */
6847
6848 static bfd_boolean
6849 sh_elf_set_private_flags (bfd *abfd, flagword flags)
6850 {
6851   BFD_ASSERT (! elf_flags_init (abfd)
6852               || elf_elfheader (abfd)->e_flags == flags);
6853
6854   elf_elfheader (abfd)->e_flags = flags;
6855   elf_flags_init (abfd) = TRUE;
6856   return sh_elf_set_mach_from_flags (abfd);
6857 }
6858 #endif /* not sh_elf_set_private_flags */
6859
6860 #ifndef sh_elf_copy_private_data
6861 /* Copy backend specific data from one object module to another */
6862
6863 static bfd_boolean
6864 sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
6865 {
6866   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6867       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6868     return TRUE;
6869
6870   return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
6871 }
6872 #endif /* not sh_elf_copy_private_data */
6873
6874 #ifndef sh_elf_merge_private_data
6875
6876 /* This function returns the ELF architecture number that
6877    corresponds to the given arch_sh* flags.  */
6878 int
6879 sh_find_elf_flags (unsigned int arch_set)
6880 {
6881   unsigned long bfd_mach = sh_get_bfd_mach_from_arch_set (arch_set);
6882
6883   return sh_elf_get_flags_from_mach (bfd_mach);
6884 }
6885
6886
6887 /* This routine initialises the elf flags when required and
6888    calls sh_merge_bfd_arch() to check dsp/fpu compatibility.  */
6889
6890 static bfd_boolean
6891 sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
6892 {
6893   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6894       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6895     return TRUE;
6896
6897   if (! elf_flags_init (obfd))
6898     {
6899       /* This happens when ld starts out with a 'blank' output file.  */
6900       elf_flags_init (obfd) = TRUE;
6901       elf_elfheader (obfd)->e_flags = EF_SH1;
6902       sh_elf_set_mach_from_flags (obfd);
6903     }
6904
6905   if ( ! sh_merge_bfd_arch (ibfd, obfd) )
6906     return FALSE;
6907
6908   elf_elfheader (obfd)->e_flags =
6909     sh_elf_get_flags_from_mach (bfd_get_mach (obfd));
6910   
6911   return TRUE;
6912 }
6913 #endif /* not sh_elf_merge_private_data */
6914
6915 /* Override the generic function because we need to store sh_elf_obj_tdata
6916    as the specific tdata.  We set also the machine architecture from flags
6917    here.  */
6918
6919 static bfd_boolean
6920 sh_elf_object_p (bfd *abfd)
6921 {
6922   return sh_elf_set_mach_from_flags (abfd);
6923 }
6924
6925 /* Finish up dynamic symbol handling.  We set the contents of various
6926    dynamic sections here.  */
6927
6928 static bfd_boolean
6929 sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
6930                               struct elf_link_hash_entry *h,
6931                               Elf_Internal_Sym *sym)
6932 {
6933   struct elf_sh_link_hash_table *htab;
6934
6935   htab = sh_elf_hash_table (info);
6936
6937   if (h->plt.offset != (bfd_vma) -1)
6938     {
6939       asection *splt;
6940       asection *sgot;
6941       asection *srel;
6942
6943       bfd_vma plt_index;
6944       bfd_vma got_offset;
6945       Elf_Internal_Rela rel;
6946       bfd_byte *loc;
6947
6948       /* This symbol has an entry in the procedure linkage table.  Set
6949          it up.  */
6950
6951       BFD_ASSERT (h->dynindx != -1);
6952
6953       splt = htab->splt;
6954       sgot = htab->sgotplt;
6955       srel = htab->srelplt;
6956       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
6957
6958       /* Get the index in the procedure linkage table which
6959          corresponds to this symbol.  This is the index of this symbol
6960          in all the symbols for which we are making plt entries.  The
6961          first entry in the procedure linkage table is reserved.  */
6962       plt_index = h->plt.offset / elf_sh_sizeof_plt (info) - 1;
6963
6964       /* Get the offset into the .got table of the entry that
6965          corresponds to this function.  Each .got entry is 4 bytes.
6966          The first three are reserved.  */
6967       got_offset = (plt_index + 3) * 4;
6968
6969 #ifdef GOT_BIAS
6970       if (info->shared)
6971         got_offset -= GOT_BIAS;
6972 #endif
6973
6974       /* Fill in the entry in the procedure linkage table.  */
6975       if (! info->shared)
6976         {
6977           if (elf_sh_plt_entry == NULL)
6978             {
6979               elf_sh_plt_entry = (bfd_big_endian (output_bfd) ?
6980                                   elf_sh_plt_entry_be : elf_sh_plt_entry_le);
6981             }
6982           memcpy (splt->contents + h->plt.offset, elf_sh_plt_entry,
6983                   elf_sh_sizeof_plt (info));
6984 #ifdef INCLUDE_SHMEDIA
6985           movi_shori_putval (output_bfd,
6986                              (sgot->output_section->vma
6987                               + sgot->output_offset
6988                               + got_offset),
6989                              (splt->contents + h->plt.offset
6990                               + elf_sh_plt_symbol_offset (info)));
6991
6992           /* Set bottom bit because its for a branch to SHmedia */
6993           movi_shori_putval (output_bfd,
6994                              (splt->output_section->vma + splt->output_offset)
6995                              | 1,
6996                              (splt->contents + h->plt.offset
6997                               + elf_sh_plt_plt0_offset (info)));
6998 #else
6999           bfd_put_32 (output_bfd,
7000                       (sgot->output_section->vma
7001                        + sgot->output_offset
7002                        + got_offset),
7003                       (splt->contents + h->plt.offset
7004                        + elf_sh_plt_symbol_offset (info)));
7005
7006           bfd_put_32 (output_bfd,
7007                       (splt->output_section->vma + splt->output_offset),
7008                       (splt->contents + h->plt.offset
7009                        + elf_sh_plt_plt0_offset (info)));
7010 #endif
7011         }
7012       else
7013         {
7014           if (elf_sh_pic_plt_entry == NULL)
7015             {
7016               elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd) ?
7017                                       elf_sh_pic_plt_entry_be :
7018                                       elf_sh_pic_plt_entry_le);
7019             }
7020           memcpy (splt->contents + h->plt.offset, elf_sh_pic_plt_entry,
7021                   elf_sh_sizeof_plt (info));
7022 #ifdef INCLUDE_SHMEDIA
7023           movi_shori_putval (output_bfd, got_offset,
7024                              (splt->contents + h->plt.offset
7025                               + elf_sh_plt_symbol_offset (info)));
7026 #else
7027           bfd_put_32 (output_bfd, got_offset,
7028                       (splt->contents + h->plt.offset
7029                        + elf_sh_plt_symbol_offset (info)));
7030 #endif
7031         }
7032
7033 #ifdef GOT_BIAS
7034       if (info->shared)
7035         got_offset += GOT_BIAS;
7036 #endif
7037
7038 #ifdef INCLUDE_SHMEDIA
7039       movi_shori_putval (output_bfd,
7040                          plt_index * sizeof (Elf32_External_Rela),
7041                          (splt->contents + h->plt.offset
7042                           + elf_sh_plt_reloc_offset (info)));
7043 #else
7044       bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
7045                   (splt->contents + h->plt.offset
7046                    + elf_sh_plt_reloc_offset (info)));
7047 #endif
7048
7049       /* Fill in the entry in the global offset table.  */
7050       bfd_put_32 (output_bfd,
7051                   (splt->output_section->vma
7052                    + splt->output_offset
7053                    + h->plt.offset
7054                    + elf_sh_plt_temp_offset (info)),
7055                   sgot->contents + got_offset);
7056
7057       /* Fill in the entry in the .rela.plt section.  */
7058       rel.r_offset = (sgot->output_section->vma
7059                       + sgot->output_offset
7060                       + got_offset);
7061       rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
7062       rel.r_addend = 0;
7063 #ifdef GOT_BIAS
7064       rel.r_addend = GOT_BIAS;
7065 #endif
7066       loc = srel->contents + plt_index * sizeof (Elf32_External_Rela);
7067       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7068
7069       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
7070         {
7071           /* Mark the symbol as undefined, rather than as defined in
7072              the .plt section.  Leave the value alone.  */
7073           sym->st_shndx = SHN_UNDEF;
7074         }
7075     }
7076
7077   if (h->got.offset != (bfd_vma) -1
7078       && sh_elf_hash_entry (h)->tls_type != GOT_TLS_GD
7079       && sh_elf_hash_entry (h)->tls_type != GOT_TLS_IE)
7080     {
7081       asection *sgot;
7082       asection *srel;
7083       Elf_Internal_Rela rel;
7084       bfd_byte *loc;
7085
7086       /* This symbol has an entry in the global offset table.  Set it
7087          up.  */
7088
7089       sgot = htab->sgot;
7090       srel = htab->srelgot;
7091       BFD_ASSERT (sgot != NULL && srel != NULL);
7092
7093       rel.r_offset = (sgot->output_section->vma
7094                       + sgot->output_offset
7095                       + (h->got.offset &~ (bfd_vma) 1));
7096
7097       /* If this is a static link, or it is a -Bsymbolic link and the
7098          symbol is defined locally or was forced to be local because
7099          of a version file, we just want to emit a RELATIVE reloc.
7100          The entry in the global offset table will already have been
7101          initialized in the relocate_section function.  */
7102       if (info->shared
7103           && SYMBOL_REFERENCES_LOCAL (info, h))
7104         {
7105           rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
7106           rel.r_addend = (h->root.u.def.value
7107                           + h->root.u.def.section->output_section->vma
7108                           + h->root.u.def.section->output_offset);
7109         }
7110       else
7111         {
7112           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
7113           rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
7114           rel.r_addend = 0;
7115         }
7116
7117       loc = srel->contents;
7118       loc += srel->reloc_count++ * sizeof (Elf32_External_Rela);
7119       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7120     }
7121
7122 #ifdef INCLUDE_SHMEDIA
7123   {
7124     struct elf_sh_link_hash_entry *eh;
7125
7126     eh = (struct elf_sh_link_hash_entry *) h;
7127     if (eh->datalabel_got.offset != (bfd_vma) -1)
7128       {
7129         asection *sgot;
7130         asection *srel;
7131         Elf_Internal_Rela rel;
7132         bfd_byte *loc;
7133
7134         /* This symbol has a datalabel entry in the global offset table.
7135            Set it up.  */
7136
7137         sgot = htab->sgot;
7138         srel = htab->srelgot;
7139         BFD_ASSERT (sgot != NULL && srel != NULL);
7140
7141         rel.r_offset = (sgot->output_section->vma
7142                         + sgot->output_offset
7143                         + (eh->datalabel_got.offset &~ (bfd_vma) 1));
7144
7145         /* If this is a static link, or it is a -Bsymbolic link and the
7146            symbol is defined locally or was forced to be local because
7147            of a version file, we just want to emit a RELATIVE reloc.
7148            The entry in the global offset table will already have been
7149            initialized in the relocate_section function.  */
7150         if (info->shared
7151             && SYMBOL_REFERENCES_LOCAL (info, h))
7152           {
7153             rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
7154             rel.r_addend = (h->root.u.def.value
7155                             + h->root.u.def.section->output_section->vma
7156                             + h->root.u.def.section->output_offset);
7157           }
7158         else
7159           {
7160             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents
7161                         + eh->datalabel_got.offset);
7162             rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
7163             rel.r_addend = 0;
7164           }
7165
7166         loc = srel->contents;
7167         loc += srel->reloc_count++ * sizeof (Elf32_External_Rela);
7168         bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7169       }
7170   }
7171 #endif
7172
7173   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
7174     {
7175       asection *s;
7176       Elf_Internal_Rela rel;
7177       bfd_byte *loc;
7178
7179       /* This symbol needs a copy reloc.  Set it up.  */
7180
7181       BFD_ASSERT (h->dynindx != -1
7182                   && (h->root.type == bfd_link_hash_defined
7183                       || h->root.type == bfd_link_hash_defweak));
7184
7185       s = bfd_get_section_by_name (h->root.u.def.section->owner,
7186                                    ".rela.bss");
7187       BFD_ASSERT (s != NULL);
7188
7189       rel.r_offset = (h->root.u.def.value
7190                       + h->root.u.def.section->output_section->vma
7191                       + h->root.u.def.section->output_offset);
7192       rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
7193       rel.r_addend = 0;
7194       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
7195       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
7196     }
7197
7198   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
7199   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
7200       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
7201     sym->st_shndx = SHN_ABS;
7202
7203   return TRUE;
7204 }
7205
7206 /* Finish up the dynamic sections.  */
7207
7208 static bfd_boolean
7209 sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
7210 {
7211   struct elf_sh_link_hash_table *htab;
7212   asection *sgot;
7213   asection *sdyn;
7214
7215   htab = sh_elf_hash_table (info);
7216   sgot = htab->sgotplt;
7217   sdyn = bfd_get_section_by_name (htab->root.dynobj, ".dynamic");
7218
7219   if (htab->root.dynamic_sections_created)
7220     {
7221       asection *splt;
7222       Elf32_External_Dyn *dyncon, *dynconend;
7223
7224       BFD_ASSERT (sgot != NULL && sdyn != NULL);
7225
7226       dyncon = (Elf32_External_Dyn *) sdyn->contents;
7227       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
7228       for (; dyncon < dynconend; dyncon++)
7229         {
7230           Elf_Internal_Dyn dyn;
7231           asection *s;
7232 #ifdef INCLUDE_SHMEDIA
7233           const char *name;
7234 #endif
7235
7236           bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn);
7237
7238           switch (dyn.d_tag)
7239             {
7240             default:
7241               break;
7242
7243 #ifdef INCLUDE_SHMEDIA
7244             case DT_INIT:
7245               name = info->init_function;
7246               goto get_sym;
7247
7248             case DT_FINI:
7249               name = info->fini_function;
7250             get_sym:
7251               if (dyn.d_un.d_val != 0)
7252                 {
7253                   struct elf_link_hash_entry *h;
7254
7255                   h = elf_link_hash_lookup (&htab->root, name,
7256                                             FALSE, FALSE, TRUE);
7257                   if (h != NULL && (h->other & STO_SH5_ISA32))
7258                     {
7259                       dyn.d_un.d_val |= 1;
7260                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7261                     }
7262                 }
7263               break;
7264 #endif
7265
7266             case DT_PLTGOT:
7267               s = htab->sgot->output_section;
7268               goto get_vma;
7269
7270             case DT_JMPREL:
7271               s = htab->srelplt->output_section;
7272             get_vma:
7273               BFD_ASSERT (s != NULL);
7274               dyn.d_un.d_ptr = s->vma;
7275               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7276               break;
7277
7278             case DT_PLTRELSZ:
7279               s = htab->srelplt->output_section;
7280               BFD_ASSERT (s != NULL);
7281               dyn.d_un.d_val = s->size;
7282               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7283               break;
7284
7285             case DT_RELASZ:
7286               /* My reading of the SVR4 ABI indicates that the
7287                  procedure linkage table relocs (DT_JMPREL) should be
7288                  included in the overall relocs (DT_RELA).  This is
7289                  what Solaris does.  However, UnixWare can not handle
7290                  that case.  Therefore, we override the DT_RELASZ entry
7291                  here to make it not include the JMPREL relocs.  Since
7292                  the linker script arranges for .rela.plt to follow all
7293                  other relocation sections, we don't have to worry
7294                  about changing the DT_RELA entry.  */
7295               if (htab->srelplt != NULL)
7296                 {
7297                   s = htab->srelplt->output_section;
7298                   dyn.d_un.d_val -= s->size;
7299                 }
7300               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7301               break;
7302             }
7303         }
7304
7305       /* Fill in the first entry in the procedure linkage table.  */
7306       splt = htab->splt;
7307       if (splt && splt->size > 0)
7308         {
7309           if (info->shared)
7310             {
7311               if (elf_sh_pic_plt_entry == NULL)
7312                 {
7313                   elf_sh_pic_plt_entry = (bfd_big_endian (output_bfd) ?
7314                                           elf_sh_pic_plt_entry_be :
7315                                           elf_sh_pic_plt_entry_le);
7316                 }
7317               memcpy (splt->contents, elf_sh_pic_plt_entry,
7318                       elf_sh_sizeof_plt (info));
7319             }
7320           else
7321             {
7322               if (elf_sh_plt0_entry == NULL)
7323                 {
7324                   elf_sh_plt0_entry = (bfd_big_endian (output_bfd) ?
7325                                        elf_sh_plt0_entry_be :
7326                                        elf_sh_plt0_entry_le);
7327                 }
7328               memcpy (splt->contents, elf_sh_plt0_entry, PLT_ENTRY_SIZE);
7329 #ifdef INCLUDE_SHMEDIA
7330               movi_shori_putval (output_bfd,
7331                                  sgot->output_section->vma
7332                                  + sgot->output_offset,
7333                                  splt->contents
7334                                  + elf_sh_plt0_gotplt_offset (info));
7335 #else
7336               bfd_put_32 (output_bfd,
7337                           sgot->output_section->vma + sgot->output_offset + 4,
7338                           splt->contents + elf_sh_plt0_gotid_offset (info));
7339               bfd_put_32 (output_bfd,
7340                           sgot->output_section->vma + sgot->output_offset + 8,
7341                           splt->contents + elf_sh_plt0_linker_offset (info));
7342 #endif
7343             }
7344
7345           /* UnixWare sets the entsize of .plt to 4, although that doesn't
7346              really seem like the right value.  */
7347           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
7348         }
7349     }
7350
7351   /* Fill in the first three entries in the global offset table.  */
7352   if (sgot && sgot->size > 0)
7353     {
7354       if (sdyn == NULL)
7355         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
7356       else
7357         bfd_put_32 (output_bfd,
7358                     sdyn->output_section->vma + sdyn->output_offset,
7359                     sgot->contents);
7360       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
7361       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
7362
7363       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
7364     }
7365
7366   return TRUE;
7367 }
7368
7369 static enum elf_reloc_type_class
7370 sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
7371 {
7372   switch ((int) ELF32_R_TYPE (rela->r_info))
7373     {
7374     case R_SH_RELATIVE:
7375       return reloc_class_relative;
7376     case R_SH_JMP_SLOT:
7377       return reloc_class_plt;
7378     case R_SH_COPY:
7379       return reloc_class_copy;
7380     default:
7381       return reloc_class_normal;
7382     }
7383 }
7384
7385 /* Support for Linux core dump NOTE sections.  */
7386 static bfd_boolean
7387 elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
7388 {
7389   int offset;
7390   unsigned int size;
7391
7392   switch (note->descsz)
7393     {
7394       default:
7395         return FALSE;
7396
7397       case 168:         /* Linux/SH */
7398         /* pr_cursig */
7399         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
7400
7401         /* pr_pid */
7402         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
7403
7404         /* pr_reg */
7405         offset = 72;
7406         size = 92;
7407
7408         break;
7409     }
7410
7411   /* Make a ".reg/999" section.  */
7412   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
7413                                           size, note->descpos + offset);
7414 }
7415
7416 static bfd_boolean
7417 elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
7418 {
7419   switch (note->descsz)
7420     {
7421       default:
7422         return FALSE;
7423
7424       case 124:         /* Linux/SH elf_prpsinfo */
7425         elf_tdata (abfd)->core_program
7426          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
7427         elf_tdata (abfd)->core_command
7428          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
7429     }
7430
7431   /* Note that for some reason, a spurious space is tacked
7432      onto the end of the args in some (at least one anyway)
7433      implementations, so strip it off if it exists.  */
7434
7435   {
7436     char *command = elf_tdata (abfd)->core_command;
7437     int n = strlen (command);
7438
7439     if (0 < n && command[n - 1] == ' ')
7440       command[n - 1] = '\0';
7441   }
7442
7443   return TRUE;
7444 }
7445
7446  
7447 /* Return address for Ith PLT stub in section PLT, for relocation REL
7448    or (bfd_vma) -1 if it should not be included.  */
7449
7450 static bfd_vma
7451 sh_elf_plt_sym_val (bfd_vma i, const asection *plt,
7452                     const arelent *rel ATTRIBUTE_UNUSED)
7453 {
7454   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
7455 }
7456
7457 #define TARGET_BIG_SYM          bfd_elf32_sh_vec
7458 #define TARGET_BIG_NAME         "elf32-sh"
7459 #define TARGET_LITTLE_SYM       bfd_elf32_shl_vec
7460 #define TARGET_LITTLE_NAME      "elf32-shl"
7461 #define ELF_ARCH                bfd_arch_sh
7462 #define ELF_MACHINE_CODE        EM_SH
7463 #ifdef __QNXTARGET__
7464 #define ELF_MAXPAGESIZE         0x1000
7465 #else
7466 #define ELF_MAXPAGESIZE         0x80
7467 #endif
7468
7469 #define elf_symbol_leading_char '_'
7470
7471 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
7472 #define elf_info_to_howto               sh_elf_info_to_howto
7473 #define bfd_elf32_bfd_relax_section     sh_elf_relax_section
7474 #define elf_backend_relocate_section    sh_elf_relocate_section
7475 #define bfd_elf32_bfd_get_relocated_section_contents \
7476                                         sh_elf_get_relocated_section_contents
7477 #define bfd_elf32_mkobject              sh_elf_mkobject
7478 #define elf_backend_object_p            sh_elf_object_p
7479 #define bfd_elf32_bfd_set_private_bfd_flags \
7480                                         sh_elf_set_private_flags
7481 #define bfd_elf32_bfd_copy_private_bfd_data \
7482                                         sh_elf_copy_private_data
7483 #define bfd_elf32_bfd_merge_private_bfd_data \
7484                                         sh_elf_merge_private_data
7485
7486 #define elf_backend_gc_mark_hook        sh_elf_gc_mark_hook
7487 #define elf_backend_gc_sweep_hook       sh_elf_gc_sweep_hook
7488 #define elf_backend_check_relocs        sh_elf_check_relocs
7489 #define elf_backend_copy_indirect_symbol \
7490                                         sh_elf_copy_indirect_symbol
7491 #define elf_backend_create_dynamic_sections \
7492                                         sh_elf_create_dynamic_sections
7493 #define bfd_elf32_bfd_link_hash_table_create \
7494                                         sh_elf_link_hash_table_create
7495 #define elf_backend_adjust_dynamic_symbol \
7496                                         sh_elf_adjust_dynamic_symbol
7497 #define elf_backend_size_dynamic_sections \
7498                                         sh_elf_size_dynamic_sections
7499 #define elf_backend_finish_dynamic_symbol \
7500                                         sh_elf_finish_dynamic_symbol
7501 #define elf_backend_finish_dynamic_sections \
7502                                         sh_elf_finish_dynamic_sections
7503 #define elf_backend_reloc_type_class    sh_elf_reloc_type_class
7504 #define elf_backend_plt_sym_val         sh_elf_plt_sym_val
7505
7506 #define elf_backend_can_gc_sections     1
7507 #define elf_backend_can_refcount        1
7508 #define elf_backend_want_got_plt        1
7509 #define elf_backend_plt_readonly        1
7510 #define elf_backend_want_plt_sym        0
7511 #define elf_backend_got_header_size     12
7512
7513 #ifndef INCLUDE_SHMEDIA
7514
7515 #include "elf32-target.h"
7516
7517 /* NetBSD support.  */
7518 #undef  TARGET_BIG_SYM
7519 #define TARGET_BIG_SYM                  bfd_elf32_shnbsd_vec
7520 #undef  TARGET_BIG_NAME
7521 #define TARGET_BIG_NAME                 "elf32-sh-nbsd"
7522 #undef  TARGET_LITTLE_SYM
7523 #define TARGET_LITTLE_SYM               bfd_elf32_shlnbsd_vec
7524 #undef  TARGET_LITTLE_NAME
7525 #define TARGET_LITTLE_NAME              "elf32-shl-nbsd"
7526 #undef  ELF_MAXPAGESIZE
7527 #define ELF_MAXPAGESIZE                 0x10000
7528 #undef  elf_symbol_leading_char
7529 #define elf_symbol_leading_char         0
7530 #undef  elf32_bed
7531 #define elf32_bed                       elf32_sh_nbsd_bed
7532
7533 #include "elf32-target.h"
7534
7535
7536 /* Linux support.  */
7537 #undef  TARGET_BIG_SYM
7538 #define TARGET_BIG_SYM                  bfd_elf32_shblin_vec
7539 #undef  TARGET_BIG_NAME
7540 #define TARGET_BIG_NAME                 "elf32-shbig-linux"
7541 #undef  TARGET_LITTLE_SYM
7542 #define TARGET_LITTLE_SYM               bfd_elf32_shlin_vec
7543 #undef  TARGET_LITTLE_NAME
7544 #define TARGET_LITTLE_NAME              "elf32-sh-linux"
7545
7546 #undef  elf_backend_grok_prstatus
7547 #define elf_backend_grok_prstatus       elf32_shlin_grok_prstatus
7548 #undef  elf_backend_grok_psinfo
7549 #define elf_backend_grok_psinfo         elf32_shlin_grok_psinfo
7550 #undef  elf32_bed
7551 #define elf32_bed                       elf32_sh_lin_bed
7552
7553 #include "elf32-target.h"
7554
7555 #endif /* INCLUDE_SHMEDIA */