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