OSDN Git Service

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