OSDN Git Service

2008-01-11 Tristan Gingold <gingold@adacore.com>
[pf3gnuchains/pf3gnuchains3x.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 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_tdata (abfd)->symtab_hdr;
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_tdata (abfd)->symtab_hdr;
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 index)
2093 {
2094   return info->plt0_entry_size + (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 /* Override the generic function because we need to store sh_elf_obj_tdata
2158    as the specific tdata.  */
2159
2160 static bfd_boolean
2161 sh_elf_mkobject (bfd *abfd)
2162 {
2163   if (abfd->tdata.any == NULL)
2164     {
2165       bfd_size_type amt = sizeof (struct sh_elf_obj_tdata);
2166       abfd->tdata.any = bfd_zalloc (abfd, amt);
2167       if (abfd->tdata.any == NULL)
2168         return FALSE;
2169     }
2170   return bfd_elf_mkobject (abfd);
2171 }
2172
2173 /* sh ELF linker hash table.  */
2174
2175 struct elf_sh_link_hash_table
2176 {
2177   struct elf_link_hash_table root;
2178
2179   /* Short-cuts to get to dynamic linker sections.  */
2180   asection *sgot;
2181   asection *sgotplt;
2182   asection *srelgot;
2183   asection *splt;
2184   asection *srelplt;
2185   asection *sdynbss;
2186   asection *srelbss;
2187
2188   /* The (unloaded but important) VxWorks .rela.plt.unloaded section.  */
2189   asection *srelplt2;
2190
2191   /* Small local sym to section mapping cache.  */
2192   struct sym_sec_cache sym_sec;
2193
2194   /* A counter or offset to track a TLS got entry.  */
2195   union
2196     {
2197       bfd_signed_vma refcount;
2198       bfd_vma offset;
2199     } tls_ldm_got;
2200
2201   /* The type of PLT to use.  */
2202   const struct elf_sh_plt_info *plt_info;
2203
2204   /* True if the target system is VxWorks.  */
2205   bfd_boolean vxworks_p;
2206 };
2207
2208 /* Traverse an sh ELF linker hash table.  */
2209
2210 #define sh_elf_link_hash_traverse(table, func, info)                    \
2211   (elf_link_hash_traverse                                               \
2212    (&(table)->root,                                                     \
2213     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
2214     (info)))
2215
2216 /* Get the sh ELF linker hash table from a link_info structure.  */
2217
2218 #define sh_elf_hash_table(p) \
2219   ((struct elf_sh_link_hash_table *) ((p)->hash))
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     {
2273       free (ret);
2274       return NULL;
2275     }
2276
2277   ret->sgot = NULL;
2278   ret->sgotplt = NULL;
2279   ret->srelgot = NULL;
2280   ret->splt = NULL;
2281   ret->srelplt = NULL;
2282   ret->sdynbss = NULL;
2283   ret->srelbss = NULL;
2284   ret->srelplt2 = NULL;
2285   ret->sym_sec.abfd = NULL;
2286   ret->tls_ldm_got.refcount = 0;
2287   ret->plt_info = NULL;
2288   ret->vxworks_p = vxworks_object_p (abfd);
2289
2290   return &ret->root.root;
2291 }
2292
2293 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
2294    shortcuts to them in our hash table.  */
2295
2296 static bfd_boolean
2297 create_got_section (bfd *dynobj, struct bfd_link_info *info)
2298 {
2299   struct elf_sh_link_hash_table *htab;
2300
2301   if (! _bfd_elf_create_got_section (dynobj, info))
2302     return FALSE;
2303
2304   htab = sh_elf_hash_table (info);
2305   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2306   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2307   if (! htab->sgot || ! htab->sgotplt)
2308     abort ();
2309
2310   htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
2311                                                (SEC_ALLOC | SEC_LOAD
2312                                                 | SEC_HAS_CONTENTS
2313                                                 | SEC_IN_MEMORY
2314                                                 | SEC_LINKER_CREATED
2315                                                 | SEC_READONLY));
2316   if (htab->srelgot == NULL
2317       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
2318     return FALSE;
2319   return TRUE;
2320 }
2321
2322 /* Create dynamic sections when linking against a dynamic object.  */
2323
2324 static bfd_boolean
2325 sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2326 {
2327   struct elf_sh_link_hash_table *htab;
2328   flagword flags, pltflags;
2329   register asection *s;
2330   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2331   int ptralign = 0;
2332
2333   switch (bed->s->arch_size)
2334     {
2335     case 32:
2336       ptralign = 2;
2337       break;
2338
2339     case 64:
2340       ptralign = 3;
2341       break;
2342
2343     default:
2344       bfd_set_error (bfd_error_bad_value);
2345       return FALSE;
2346     }
2347
2348   htab = sh_elf_hash_table (info);
2349   if (htab->root.dynamic_sections_created)
2350     return TRUE;
2351
2352   /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and
2353      .rel[a].bss sections.  */
2354
2355   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2356            | SEC_LINKER_CREATED);
2357
2358   pltflags = flags;
2359   pltflags |= SEC_CODE;
2360   if (bed->plt_not_loaded)
2361     pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
2362   if (bed->plt_readonly)
2363     pltflags |= SEC_READONLY;
2364
2365   s = bfd_make_section_with_flags (abfd, ".plt", pltflags);
2366   htab->splt = s;
2367   if (s == NULL
2368       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
2369     return FALSE;
2370
2371   if (bed->want_plt_sym)
2372     {
2373       /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2374          .plt section.  */
2375       struct elf_link_hash_entry *h;
2376       struct bfd_link_hash_entry *bh = NULL;
2377
2378       if (! (_bfd_generic_link_add_one_symbol
2379              (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
2380               (bfd_vma) 0, (const char *) NULL, FALSE,
2381               get_elf_backend_data (abfd)->collect, &bh)))
2382         return FALSE;
2383
2384       h = (struct elf_link_hash_entry *) bh;
2385       h->def_regular = 1;
2386       h->type = STT_OBJECT;
2387       htab->root.hplt = h;
2388
2389       if (info->shared
2390           && ! bfd_elf_link_record_dynamic_symbol (info, h))
2391         return FALSE;
2392     }
2393
2394   s = bfd_make_section_with_flags (abfd,
2395                                    bed->default_use_rela_p ? ".rela.plt" : ".rel.plt",
2396                                    flags | SEC_READONLY);
2397   htab->srelplt = s;
2398   if (s == NULL
2399       || ! bfd_set_section_alignment (abfd, s, ptralign))
2400     return FALSE;
2401
2402   if (htab->sgot == NULL
2403       && !create_got_section (abfd, info))
2404     return FALSE;
2405
2406   {
2407     const char *secname;
2408     char *relname;
2409     flagword secflags;
2410     asection *sec;
2411
2412     for (sec = abfd->sections; sec; sec = sec->next)
2413       {
2414         secflags = bfd_get_section_flags (abfd, sec);
2415         if ((secflags & (SEC_DATA | SEC_LINKER_CREATED))
2416             || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS))
2417           continue;
2418         secname = bfd_get_section_name (abfd, sec);
2419         relname = (char *) bfd_malloc ((bfd_size_type) strlen (secname) + 6);
2420         strcpy (relname, ".rela");
2421         strcat (relname, secname);
2422         if (bfd_get_section_by_name (abfd, secname))
2423           continue;
2424         s = bfd_make_section_with_flags (abfd, relname,
2425                                          flags | SEC_READONLY);
2426         if (s == NULL
2427             || ! bfd_set_section_alignment (abfd, s, ptralign))
2428           return FALSE;
2429       }
2430   }
2431
2432   if (bed->want_dynbss)
2433     {
2434       /* The .dynbss section is a place to put symbols which are defined
2435          by dynamic objects, are referenced by regular objects, and are
2436          not functions.  We must allocate space for them in the process
2437          image and use a R_*_COPY reloc to tell the dynamic linker to
2438          initialize them at run time.  The linker script puts the .dynbss
2439          section into the .bss section of the final image.  */
2440       s = bfd_make_section_with_flags (abfd, ".dynbss",
2441                                        SEC_ALLOC | SEC_LINKER_CREATED);
2442       htab->sdynbss = s;
2443       if (s == NULL)
2444         return FALSE;
2445
2446       /* The .rel[a].bss section holds copy relocs.  This section is not
2447          normally needed.  We need to create it here, though, so that the
2448          linker will map it to an output section.  We can't just create it
2449          only if we need it, because we will not know whether we need it
2450          until we have seen all the input files, and the first time the
2451          main linker code calls BFD after examining all the input files
2452          (size_dynamic_sections) the input sections have already been
2453          mapped to the output sections.  If the section turns out not to
2454          be needed, we can discard it later.  We will never need this
2455          section when generating a shared object, since they do not use
2456          copy relocs.  */
2457       if (! info->shared)
2458         {
2459           s = bfd_make_section_with_flags (abfd,
2460                                            (bed->default_use_rela_p
2461                                             ? ".rela.bss" : ".rel.bss"),
2462                                            flags | SEC_READONLY);
2463           htab->srelbss = s;
2464           if (s == NULL
2465               || ! bfd_set_section_alignment (abfd, s, ptralign))
2466             return FALSE;
2467         }
2468     }
2469
2470   if (htab->vxworks_p)
2471     {
2472       if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
2473         return FALSE;
2474     }
2475
2476   return TRUE;
2477 }
2478 \f
2479 /* Adjust a symbol defined by a dynamic object and referenced by a
2480    regular object.  The current definition is in some section of the
2481    dynamic object, but we're not including those sections.  We have to
2482    change the definition to something the rest of the link can
2483    understand.  */
2484
2485 static bfd_boolean
2486 sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2487                               struct elf_link_hash_entry *h)
2488 {
2489   struct elf_sh_link_hash_table *htab;
2490   struct elf_sh_link_hash_entry *eh;
2491   struct elf_sh_dyn_relocs *p;
2492   asection *s;
2493
2494   htab = sh_elf_hash_table (info);
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
2642   eh = (struct elf_sh_link_hash_entry *) h;
2643   if ((h->got.refcount > 0
2644        || h->forced_local)
2645       && eh->gotplt_refcount > 0)
2646     {
2647       /* The symbol has been forced local, or we have some direct got refs,
2648          so treat all the gotplt refs as got refs. */
2649       h->got.refcount += eh->gotplt_refcount;
2650       if (h->plt.refcount >= eh->gotplt_refcount)
2651         h->plt.refcount -= eh->gotplt_refcount;
2652     }
2653
2654   if (htab->root.dynamic_sections_created
2655       && h->plt.refcount > 0
2656       && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2657           || h->root.type != bfd_link_hash_undefweak))
2658     {
2659       /* Make sure this symbol is output as a dynamic symbol.
2660          Undefined weak syms won't yet be marked as dynamic.  */
2661       if (h->dynindx == -1
2662           && !h->forced_local)
2663         {
2664           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2665             return FALSE;
2666         }
2667
2668       if (info->shared
2669           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2670         {
2671           asection *s = htab->splt;
2672
2673           /* If this is the first .plt entry, make room for the special
2674              first entry.  */
2675           if (s->size == 0)
2676             s->size += htab->plt_info->plt0_entry_size;
2677
2678           h->plt.offset = s->size;
2679
2680           /* If this symbol is not defined in a regular file, and we are
2681              not generating a shared library, then set the symbol to this
2682              location in the .plt.  This is required to make function
2683              pointers compare as equal between the normal executable and
2684              the shared library.  */
2685           if (! info->shared
2686               && !h->def_regular)
2687             {
2688               h->root.u.def.section = s;
2689               h->root.u.def.value = h->plt.offset;
2690             }
2691
2692           /* Make room for this entry.  */
2693           s->size += htab->plt_info->symbol_entry_size;
2694
2695           /* We also need to make an entry in the .got.plt section, which
2696              will be placed in the .got section by the linker script.  */
2697           htab->sgotplt->size += 4;
2698
2699           /* We also need to make an entry in the .rel.plt section.  */
2700           htab->srelplt->size += sizeof (Elf32_External_Rela);
2701
2702           if (htab->vxworks_p && !info->shared)
2703             {
2704               /* VxWorks executables have a second set of relocations
2705                  for each PLT entry.  They go in a separate relocation
2706                  section, which is processed by the kernel loader.  */
2707
2708               /* There is a relocation for the initial PLT entry:
2709                  an R_SH_DIR32 relocation for _GLOBAL_OFFSET_TABLE_.  */
2710               if (h->plt.offset == htab->plt_info->plt0_entry_size)
2711                 htab->srelplt2->size += sizeof (Elf32_External_Rela);
2712
2713               /* There are two extra relocations for each subsequent
2714                  PLT entry: an R_SH_DIR32 relocation for the GOT entry,
2715                  and an R_SH_DIR32 relocation for the PLT entry.  */
2716               htab->srelplt2->size += sizeof (Elf32_External_Rela) * 2;
2717             }
2718         }
2719       else
2720         {
2721           h->plt.offset = (bfd_vma) -1;
2722           h->needs_plt = 0;
2723         }
2724     }
2725   else
2726     {
2727       h->plt.offset = (bfd_vma) -1;
2728       h->needs_plt = 0;
2729     }
2730
2731   if (h->got.refcount > 0)
2732     {
2733       asection *s;
2734       bfd_boolean dyn;
2735       int tls_type = sh_elf_hash_entry (h)->tls_type;
2736
2737       /* Make sure this symbol is output as a dynamic symbol.
2738          Undefined weak syms won't yet be marked as dynamic.  */
2739       if (h->dynindx == -1
2740           && !h->forced_local)
2741         {
2742           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2743             return FALSE;
2744         }
2745
2746       s = htab->sgot;
2747       h->got.offset = s->size;
2748       s->size += 4;
2749       /* R_SH_TLS_GD needs 2 consecutive GOT slots.  */
2750       if (tls_type == GOT_TLS_GD)
2751         s->size += 4;
2752       dyn = htab->root.dynamic_sections_created;
2753       /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic,
2754          R_SH_TLS_GD needs one if local symbol and two if global.  */
2755       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
2756           || (tls_type == GOT_TLS_IE && dyn))
2757         htab->srelgot->size += sizeof (Elf32_External_Rela);
2758       else if (tls_type == GOT_TLS_GD)
2759         htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2760       else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2761                 || h->root.type != bfd_link_hash_undefweak)
2762                && (info->shared
2763                    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2764         htab->srelgot->size += sizeof (Elf32_External_Rela);
2765     }
2766   else
2767     h->got.offset = (bfd_vma) -1;
2768
2769 #ifdef INCLUDE_SHMEDIA
2770   if (eh->datalabel_got.refcount > 0)
2771     {
2772       asection *s;
2773       bfd_boolean dyn;
2774
2775       /* Make sure this symbol is output as a dynamic symbol.
2776          Undefined weak syms won't yet be marked as dynamic.  */
2777       if (h->dynindx == -1
2778           && !h->forced_local)
2779         {
2780           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2781             return FALSE;
2782         }
2783
2784       s = htab->sgot;
2785       eh->datalabel_got.offset = s->size;
2786       s->size += 4;
2787       dyn = htab->root.dynamic_sections_created;
2788       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
2789         htab->srelgot->size += sizeof (Elf32_External_Rela);
2790     }
2791   else
2792     eh->datalabel_got.offset = (bfd_vma) -1;
2793 #endif
2794
2795   if (eh->dyn_relocs == NULL)
2796     return TRUE;
2797
2798   /* In the shared -Bsymbolic case, discard space allocated for
2799      dynamic pc-relative relocs against symbols which turn out to be
2800      defined in regular objects.  For the normal shared case, discard
2801      space for pc-relative relocs that have become local due to symbol
2802      visibility changes.  */
2803
2804   if (info->shared)
2805     {
2806       if (SYMBOL_CALLS_LOCAL (info, h))
2807         {
2808           struct elf_sh_dyn_relocs **pp;
2809
2810           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2811             {
2812               p->count -= p->pc_count;
2813               p->pc_count = 0;
2814               if (p->count == 0)
2815                 *pp = p->next;
2816               else
2817                 pp = &p->next;
2818             }
2819         }
2820
2821       /* Also discard relocs on undefined weak syms with non-default
2822          visibility.  */
2823       if (eh->dyn_relocs != NULL
2824           && h->root.type == bfd_link_hash_undefweak)
2825         {
2826           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2827             eh->dyn_relocs = NULL;
2828
2829           /* Make sure undefined weak symbols are output as a dynamic
2830              symbol in PIEs.  */
2831           else if (h->dynindx == -1
2832                    && !h->forced_local)
2833             {
2834               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2835                 return FALSE;
2836             }
2837         }
2838     }
2839   else
2840     {
2841       /* For the non-shared case, discard space for relocs against
2842          symbols which turn out to need copy relocs or are not
2843          dynamic.  */
2844
2845       if (!h->non_got_ref
2846           && ((h->def_dynamic
2847                && !h->def_regular)
2848               || (htab->root.dynamic_sections_created
2849                   && (h->root.type == bfd_link_hash_undefweak
2850                       || h->root.type == bfd_link_hash_undefined))))
2851         {
2852           /* Make sure this symbol is output as a dynamic symbol.
2853              Undefined weak syms won't yet be marked as dynamic.  */
2854           if (h->dynindx == -1
2855               && !h->forced_local)
2856             {
2857               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2858                 return FALSE;
2859             }
2860
2861           /* If that succeeded, we know we'll be keeping all the
2862              relocs.  */
2863           if (h->dynindx != -1)
2864             goto keep;
2865         }
2866
2867       eh->dyn_relocs = NULL;
2868
2869     keep: ;
2870     }
2871
2872   /* Finally, allocate space.  */
2873   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2874     {
2875       asection *sreloc = elf_section_data (p->sec)->sreloc;
2876       sreloc->size += p->count * sizeof (Elf32_External_Rela);
2877     }
2878
2879   return TRUE;
2880 }
2881
2882 /* Find any dynamic relocs that apply to read-only sections.  */
2883
2884 static bfd_boolean
2885 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2886 {
2887   struct elf_sh_link_hash_entry *eh;
2888   struct elf_sh_dyn_relocs *p;
2889
2890   if (h->root.type == bfd_link_hash_warning)
2891     h = (struct elf_link_hash_entry *) h->root.u.i.link;
2892
2893   eh = (struct elf_sh_link_hash_entry *) h;
2894   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2895     {
2896       asection *s = p->sec->output_section;
2897
2898       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2899         {
2900           struct bfd_link_info *info = (struct bfd_link_info *) inf;
2901
2902           info->flags |= DF_TEXTREL;
2903
2904           /* Not an error, just cut short the traversal.  */
2905           return FALSE;
2906         }
2907     }
2908   return TRUE;
2909 }
2910
2911 /* This function is called after all the input files have been read,
2912    and the input sections have been assigned to output sections.
2913    It's a convenient place to determine the PLT style.  */
2914
2915 static bfd_boolean
2916 sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
2917 {
2918   sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared);
2919   return TRUE;
2920 }
2921
2922 /* Set the sizes of the dynamic sections.  */
2923
2924 static bfd_boolean
2925 sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2926                               struct bfd_link_info *info)
2927 {
2928   struct elf_sh_link_hash_table *htab;
2929   bfd *dynobj;
2930   asection *s;
2931   bfd_boolean relocs;
2932   bfd *ibfd;
2933
2934   htab = sh_elf_hash_table (info);
2935   dynobj = htab->root.dynobj;
2936   BFD_ASSERT (dynobj != NULL);
2937
2938   if (htab->root.dynamic_sections_created)
2939     {
2940       /* Set the contents of the .interp section to the interpreter.  */
2941       if (info->executable)
2942         {
2943           s = bfd_get_section_by_name (dynobj, ".interp");
2944           BFD_ASSERT (s != NULL);
2945           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2946           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2947         }
2948     }
2949
2950   /* Set up .got offsets for local syms, and space for local dynamic
2951      relocs.  */
2952   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2953     {
2954       bfd_signed_vma *local_got;
2955       bfd_signed_vma *end_local_got;
2956       char *local_tls_type;
2957       bfd_size_type locsymcount;
2958       Elf_Internal_Shdr *symtab_hdr;
2959       asection *srel;
2960
2961       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2962         continue;
2963
2964       for (s = ibfd->sections; s != NULL; s = s->next)
2965         {
2966           struct elf_sh_dyn_relocs *p;
2967
2968           for (p = ((struct elf_sh_dyn_relocs *)
2969                     elf_section_data (s)->local_dynrel);
2970                p != NULL;
2971                p = p->next)
2972             {
2973               if (! bfd_is_abs_section (p->sec)
2974                   && bfd_is_abs_section (p->sec->output_section))
2975                 {
2976                   /* Input section has been discarded, either because
2977                      it is a copy of a linkonce section or due to
2978                      linker script /DISCARD/, so we'll be discarding
2979                      the relocs too.  */
2980                 }
2981               else if (p->count != 0)
2982                 {
2983                   srel = elf_section_data (p->sec)->sreloc;
2984                   srel->size += p->count * sizeof (Elf32_External_Rela);
2985                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2986                     info->flags |= DF_TEXTREL;
2987                 }
2988             }
2989         }
2990
2991       local_got = elf_local_got_refcounts (ibfd);
2992       if (!local_got)
2993         continue;
2994
2995       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2996       locsymcount = symtab_hdr->sh_info;
2997 #ifdef INCLUDE_SHMEDIA
2998       /* Count datalabel local GOT.  */
2999       locsymcount *= 2;
3000 #endif
3001       end_local_got = local_got + locsymcount;
3002       local_tls_type = sh_elf_local_got_tls_type (ibfd);
3003       s = htab->sgot;
3004       srel = htab->srelgot;
3005       for (; local_got < end_local_got; ++local_got)
3006         {
3007           if (*local_got > 0)
3008             {
3009               *local_got = s->size;
3010               s->size += 4;
3011               if (*local_tls_type == GOT_TLS_GD)
3012                 s->size += 4;
3013               if (info->shared)
3014                 srel->size += sizeof (Elf32_External_Rela);
3015             }
3016           else
3017             *local_got = (bfd_vma) -1;
3018           ++local_tls_type;
3019         }
3020     }
3021
3022   if (htab->tls_ldm_got.refcount > 0)
3023     {
3024       /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32
3025          relocs.  */
3026       htab->tls_ldm_got.offset = htab->sgot->size;
3027       htab->sgot->size += 8;
3028       htab->srelgot->size += sizeof (Elf32_External_Rela);
3029     }
3030   else
3031     htab->tls_ldm_got.offset = -1;
3032
3033   /* Allocate global sym .plt and .got entries, and space for global
3034      sym dynamic relocs.  */
3035   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
3036
3037   /* We now have determined the sizes of the various dynamic sections.
3038      Allocate memory for them.  */
3039   relocs = FALSE;
3040   for (s = dynobj->sections; s != NULL; s = s->next)
3041     {
3042       if ((s->flags & SEC_LINKER_CREATED) == 0)
3043         continue;
3044
3045       if (s == htab->splt
3046           || s == htab->sgot
3047           || s == htab->sgotplt
3048           || s == htab->sdynbss)
3049         {
3050           /* Strip this section if we don't need it; see the
3051              comment below.  */
3052         }
3053       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3054         {
3055           if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
3056             relocs = TRUE;
3057
3058           /* We use the reloc_count field as a counter if we need
3059              to copy relocs into the output file.  */
3060           s->reloc_count = 0;
3061         }
3062       else
3063         {
3064           /* It's not one of our sections, so don't allocate space.  */
3065           continue;
3066         }
3067
3068       if (s->size == 0)
3069         {
3070           /* If we don't need this section, strip it from the
3071              output file.  This is mostly to handle .rela.bss and
3072              .rela.plt.  We must create both sections in
3073              create_dynamic_sections, because they must be created
3074              before the linker maps input sections to output
3075              sections.  The linker does that before
3076              adjust_dynamic_symbol is called, and it is that
3077              function which decides whether anything needs to go
3078              into these sections.  */
3079
3080           s->flags |= SEC_EXCLUDE;
3081           continue;
3082         }
3083
3084       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3085         continue;
3086
3087       /* Allocate memory for the section contents.  We use bfd_zalloc
3088          here in case unused entries are not reclaimed before the
3089          section's contents are written out.  This should not happen,
3090          but this way if it does, we get a R_SH_NONE reloc instead
3091          of garbage.  */
3092       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
3093       if (s->contents == NULL)
3094         return FALSE;
3095     }
3096
3097   if (htab->root.dynamic_sections_created)
3098     {
3099       /* Add some entries to the .dynamic section.  We fill in the
3100          values later, in sh_elf_finish_dynamic_sections, but we
3101          must add the entries now so that we get the correct size for
3102          the .dynamic section.  The DT_DEBUG entry is filled in by the
3103          dynamic linker and used by the debugger.  */
3104 #define add_dynamic_entry(TAG, VAL) \
3105   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3106
3107       if (info->executable)
3108         {
3109           if (! add_dynamic_entry (DT_DEBUG, 0))
3110             return FALSE;
3111         }
3112
3113       if (htab->splt->size != 0)
3114         {
3115           if (! add_dynamic_entry (DT_PLTGOT, 0)
3116               || ! add_dynamic_entry (DT_PLTRELSZ, 0)
3117               || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
3118               || ! add_dynamic_entry (DT_JMPREL, 0))
3119             return FALSE;
3120         }
3121
3122       if (relocs)
3123         {
3124           if (! add_dynamic_entry (DT_RELA, 0)
3125               || ! add_dynamic_entry (DT_RELASZ, 0)
3126               || ! add_dynamic_entry (DT_RELAENT,
3127                                       sizeof (Elf32_External_Rela)))
3128             return FALSE;
3129
3130           /* If any dynamic relocs apply to a read-only section,
3131              then we need a DT_TEXTREL entry.  */
3132           if ((info->flags & DF_TEXTREL) == 0)
3133             elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info);
3134
3135           if ((info->flags & DF_TEXTREL) != 0)
3136             {
3137               if (! add_dynamic_entry (DT_TEXTREL, 0))
3138                 return FALSE;
3139             }
3140         }
3141       if (htab->vxworks_p
3142           && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3143         return FALSE;
3144     }
3145 #undef add_dynamic_entry
3146
3147   return TRUE;
3148 }
3149 \f
3150 /* Relocate an SH ELF section.  */
3151
3152 static bfd_boolean
3153 sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
3154                          bfd *input_bfd, asection *input_section,
3155                          bfd_byte *contents, Elf_Internal_Rela *relocs,
3156                          Elf_Internal_Sym *local_syms,
3157                          asection **local_sections)
3158 {
3159   struct elf_sh_link_hash_table *htab;
3160   Elf_Internal_Shdr *symtab_hdr;
3161   struct elf_link_hash_entry **sym_hashes;
3162   Elf_Internal_Rela *rel, *relend;
3163   bfd *dynobj;
3164   bfd_vma *local_got_offsets;
3165   asection *sgot;
3166   asection *sgotplt;
3167   asection *splt;
3168   asection *sreloc;
3169   asection *srelgot;
3170
3171   htab = sh_elf_hash_table (info);
3172   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3173   sym_hashes = elf_sym_hashes (input_bfd);
3174   dynobj = htab->root.dynobj;
3175   local_got_offsets = elf_local_got_offsets (input_bfd);
3176
3177   sgot = htab->sgot;
3178   sgotplt = htab->sgotplt;
3179   splt = htab->splt;
3180   sreloc = NULL;
3181   srelgot = NULL;
3182
3183   rel = relocs;
3184   relend = relocs + input_section->reloc_count;
3185   for (; rel < relend; rel++)
3186     {
3187       int r_type;
3188       reloc_howto_type *howto;
3189       unsigned long r_symndx;
3190       Elf_Internal_Sym *sym;
3191       asection *sec;
3192       struct elf_link_hash_entry *h;
3193       bfd_vma relocation;
3194       bfd_vma addend = (bfd_vma) 0;
3195       bfd_reloc_status_type r;
3196       int seen_stt_datalabel = 0;
3197       bfd_vma off;
3198       int tls_type;
3199
3200       r_symndx = ELF32_R_SYM (rel->r_info);
3201
3202       r_type = ELF32_R_TYPE (rel->r_info);
3203
3204       /* Many of the relocs are only used for relaxing, and are
3205          handled entirely by the relaxation code.  */
3206       if (r_type >= (int) R_SH_GNU_VTINHERIT
3207           && r_type <= (int) R_SH_LABEL)
3208         continue;
3209       if (r_type == (int) R_SH_NONE)
3210         continue;
3211
3212       if (r_type < 0
3213           || r_type >= R_SH_max
3214           || (r_type >= (int) R_SH_FIRST_INVALID_RELOC
3215               && r_type <= (int) R_SH_LAST_INVALID_RELOC)
3216           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_3
3217               && r_type <= (int) R_SH_LAST_INVALID_RELOC_3)
3218           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_4
3219               && r_type <= (int) R_SH_LAST_INVALID_RELOC_4)
3220           || (   r_type >= (int) R_SH_FIRST_INVALID_RELOC_5
3221               && r_type <= (int) R_SH_LAST_INVALID_RELOC_5)
3222           || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2
3223               && r_type <= (int) R_SH_LAST_INVALID_RELOC_2))
3224         {
3225           bfd_set_error (bfd_error_bad_value);
3226           return FALSE;
3227         }
3228
3229       howto = get_howto_table (output_bfd) + r_type;
3230
3231       /* For relocs that aren't partial_inplace, we get the addend from
3232          the relocation.  */
3233       if (! howto->partial_inplace)
3234         addend = rel->r_addend;
3235
3236       h = NULL;
3237       sym = NULL;
3238       sec = NULL;
3239       if (r_symndx < symtab_hdr->sh_info)
3240         {
3241           sym = local_syms + r_symndx;
3242           sec = local_sections[r_symndx];
3243           relocation = (sec->output_section->vma
3244                         + sec->output_offset
3245                         + sym->st_value);
3246           /* A local symbol never has STO_SH5_ISA32, so we don't need
3247              datalabel processing here.  Make sure this does not change
3248              without notice.  */
3249           if ((sym->st_other & STO_SH5_ISA32) != 0)
3250             ((*info->callbacks->reloc_dangerous)
3251              (info,
3252               _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
3253               input_bfd, input_section, rel->r_offset));
3254
3255           if (sec != NULL && elf_discarded_section (sec))
3256             /* Handled below.  */
3257             ;
3258           else if (info->relocatable)
3259             {
3260               /* This is a relocatable link.  We don't have to change
3261                  anything, unless the reloc is against a section symbol,
3262                  in which case we have to adjust according to where the
3263                  section symbol winds up in the output section.  */
3264               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3265                 {
3266                   if (! howto->partial_inplace)
3267                     {
3268                       /* For relocations with the addend in the
3269                          relocation, we need just to update the addend.
3270                          All real relocs are of type partial_inplace; this
3271                          code is mostly for completeness.  */
3272                       rel->r_addend += sec->output_offset;
3273
3274                       continue;
3275                     }
3276
3277                   /* Relocs of type partial_inplace need to pick up the
3278                      contents in the contents and add the offset resulting
3279                      from the changed location of the section symbol.
3280                      Using _bfd_final_link_relocate (e.g. goto
3281                      final_link_relocate) here would be wrong, because
3282                      relocations marked pc_relative would get the current
3283                      location subtracted, and we must only do that at the
3284                      final link.  */
3285                   r = _bfd_relocate_contents (howto, input_bfd,
3286                                               sec->output_offset
3287                                               + sym->st_value,
3288                                               contents + rel->r_offset);
3289                   goto relocation_done;
3290                 }
3291
3292               continue;
3293             }
3294           else if (! howto->partial_inplace)
3295             {
3296               relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3297               addend = rel->r_addend;
3298             }
3299           else if ((sec->flags & SEC_MERGE)
3300                    && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3301             {
3302               asection *msec;
3303
3304               if (howto->rightshift || howto->src_mask != 0xffffffff)
3305                 {
3306                   (*_bfd_error_handler)
3307                     (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"),
3308                      input_bfd, input_section,
3309                      (long) rel->r_offset, howto->name);
3310                   return FALSE;
3311                 }
3312
3313               addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
3314               msec = sec;
3315               addend =
3316                 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend)
3317                 - relocation;
3318               addend += msec->output_section->vma + msec->output_offset;
3319               bfd_put_32 (input_bfd, addend, contents + rel->r_offset);
3320               addend = 0;
3321             }
3322         }
3323       else
3324         {
3325           /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro.  */
3326
3327           relocation = 0;
3328           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3329           while (h->root.type == bfd_link_hash_indirect
3330                  || h->root.type == bfd_link_hash_warning)
3331             {
3332 #ifdef INCLUDE_SHMEDIA
3333               /* If the reference passes a symbol marked with
3334                  STT_DATALABEL, then any STO_SH5_ISA32 on the final value
3335                  doesn't count.  */
3336               seen_stt_datalabel |= h->type == STT_DATALABEL;
3337 #endif
3338               h = (struct elf_link_hash_entry *) h->root.u.i.link;
3339             }
3340           if (h->root.type == bfd_link_hash_defined
3341               || h->root.type == bfd_link_hash_defweak)
3342             {
3343               bfd_boolean dyn;
3344
3345               dyn = htab->root.dynamic_sections_created;
3346               sec = h->root.u.def.section;
3347               /* In these cases, we don't need the relocation value.
3348                  We check specially because in some obscure cases
3349                  sec->output_section will be NULL.  */
3350               if (r_type == R_SH_GOTPC
3351                   || r_type == R_SH_GOTPC_LOW16
3352                   || r_type == R_SH_GOTPC_MEDLOW16
3353                   || r_type == R_SH_GOTPC_MEDHI16
3354                   || r_type == R_SH_GOTPC_HI16
3355                   || ((r_type == R_SH_PLT32
3356                        || r_type == R_SH_PLT_LOW16
3357                        || r_type == R_SH_PLT_MEDLOW16
3358                        || r_type == R_SH_PLT_MEDHI16
3359                        || r_type == R_SH_PLT_HI16)
3360                       && h->plt.offset != (bfd_vma) -1)
3361                   || ((r_type == R_SH_GOT32
3362                        || r_type == R_SH_GOT_LOW16
3363                        || r_type == R_SH_GOT_MEDLOW16
3364                        || r_type == R_SH_GOT_MEDHI16
3365                        || r_type == R_SH_GOT_HI16)
3366                       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3367                       && (! info->shared
3368                           || (! info->symbolic && h->dynindx != -1)
3369                           || !h->def_regular))
3370                   /* The cases above are those in which relocation is
3371                      overwritten in the switch block below.  The cases
3372                      below are those in which we must defer relocation
3373                      to run-time, because we can't resolve absolute
3374                      addresses when creating a shared library.  */
3375                   || (info->shared
3376                       && ((! info->symbolic && h->dynindx != -1)
3377                           || !h->def_regular)
3378                       && ((r_type == R_SH_DIR32
3379                            && !h->forced_local)
3380                           || (r_type == R_SH_REL32
3381                               && !SYMBOL_CALLS_LOCAL (info, h)))
3382                       && ((input_section->flags & SEC_ALLOC) != 0
3383                           /* DWARF will emit R_SH_DIR32 relocations in its
3384                              sections against symbols defined externally
3385                              in shared libraries.  We can't do anything
3386                              with them here.  */
3387                           || ((input_section->flags & SEC_DEBUGGING) != 0
3388                               && h->def_dynamic)))
3389                   /* Dynamic relocs are not propagated for SEC_DEBUGGING
3390                      sections because such sections are not SEC_ALLOC and
3391                      thus ld.so will not process them.  */
3392                   || (sec->output_section == NULL
3393                       && ((input_section->flags & SEC_DEBUGGING) != 0
3394                           && h->def_dynamic))
3395                   || (sec->output_section == NULL
3396                       && (sh_elf_hash_entry (h)->tls_type == GOT_TLS_IE
3397                           || sh_elf_hash_entry (h)->tls_type == GOT_TLS_GD)))
3398                 ;
3399               else if (sec->output_section != NULL)
3400                 relocation = ((h->root.u.def.value
3401                               + sec->output_section->vma
3402                               + sec->output_offset)
3403                               /* A STO_SH5_ISA32 causes a "bitor 1" to the
3404                                  symbol value, unless we've seen
3405                                  STT_DATALABEL on the way to it.  */
3406                               | ((h->other & STO_SH5_ISA32) != 0
3407                                  && ! seen_stt_datalabel));
3408               else if (!info->relocatable)
3409                 {
3410                   (*_bfd_error_handler)
3411                     (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3412                      input_bfd,
3413                      input_section,
3414                      (long) rel->r_offset,
3415                      howto->name,
3416                      h->root.root.string);
3417                   return FALSE;
3418                 }
3419             }
3420           else if (h->root.type == bfd_link_hash_undefweak)
3421             ;
3422           else if (info->unresolved_syms_in_objects == RM_IGNORE
3423                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
3424             ;
3425           else if (!info->relocatable)
3426             {
3427               if (! info->callbacks->undefined_symbol
3428                   (info, h->root.root.string, input_bfd,
3429                    input_section, rel->r_offset,
3430                    (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
3431                     || ELF_ST_VISIBILITY (h->other))))
3432                 return FALSE;
3433             }
3434         }
3435
3436       if (sec != NULL && elf_discarded_section (sec))
3437         {
3438           /* For relocs against symbols from removed linkonce sections,
3439              or sections discarded by a linker script, we just want the
3440              section contents zeroed.  Avoid any special processing.  */
3441           _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
3442           rel->r_info = 0;
3443           rel->r_addend = 0;
3444           continue;
3445         }
3446
3447       if (info->relocatable)
3448         continue;
3449
3450       switch ((int) r_type)
3451         {
3452         final_link_relocate:
3453           /* COFF relocs don't use the addend. The addend is used for
3454              R_SH_DIR32 to be compatible with other compilers.  */
3455           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3456                                         contents, rel->r_offset,
3457                                         relocation, addend);
3458           break;
3459
3460         case R_SH_IND12W:
3461           goto final_link_relocate;
3462
3463         case R_SH_DIR8WPN:
3464         case R_SH_DIR8WPZ:
3465         case R_SH_DIR8WPL:
3466           /* If the reloc is against the start of this section, then
3467              the assembler has already taken care of it and the reloc
3468              is here only to assist in relaxing.  If the reloc is not
3469              against the start of this section, then it's against an
3470              external symbol and we must deal with it ourselves.  */
3471           if (input_section->output_section->vma + input_section->output_offset
3472               != relocation)
3473             {
3474               int disp = (relocation
3475                           - input_section->output_section->vma
3476                           - input_section->output_offset
3477                           - rel->r_offset);
3478               int mask = 0;
3479               switch (r_type)
3480                 {
3481                 case R_SH_DIR8WPN:
3482                 case R_SH_DIR8WPZ: mask = 1; break;
3483                 case R_SH_DIR8WPL: mask = 3; break;
3484                 default: mask = 0; break;
3485                 }
3486               if (disp & mask)
3487                 {
3488                   ((*_bfd_error_handler)
3489                    (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"),
3490                     input_section->owner,
3491                     (unsigned long) rel->r_offset));
3492                   bfd_set_error (bfd_error_bad_value);
3493                   return FALSE;
3494                 }
3495               relocation -= 4;
3496               goto final_link_relocate;
3497             }
3498           r = bfd_reloc_ok;
3499           break;
3500
3501         default:
3502 #ifdef INCLUDE_SHMEDIA
3503           if (shmedia_prepare_reloc (info, input_bfd, input_section,
3504                                      contents, rel, &relocation))
3505             goto final_link_relocate;
3506 #endif
3507           bfd_set_error (bfd_error_bad_value);
3508           return FALSE;
3509
3510         case R_SH_DIR16:
3511         case R_SH_DIR8:
3512         case R_SH_DIR8U:
3513         case R_SH_DIR8S:
3514         case R_SH_DIR4U:
3515           goto final_link_relocate;
3516
3517         case R_SH_DIR8UL:
3518         case R_SH_DIR4UL:
3519           if (relocation & 3)
3520             {
3521               ((*_bfd_error_handler)
3522                (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
3523                 input_section->owner,
3524                 (unsigned long) rel->r_offset, howto->name, 
3525                 (unsigned long) relocation));
3526               bfd_set_error (bfd_error_bad_value);
3527               return FALSE;
3528             }
3529           goto final_link_relocate;
3530
3531         case R_SH_DIR8UW:
3532         case R_SH_DIR8SW:
3533         case R_SH_DIR4UW:
3534           if (relocation & 1)
3535             {
3536               ((*_bfd_error_handler)
3537                (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"),
3538                 input_section->owner,
3539                 (unsigned long) rel->r_offset, howto->name, 
3540                 (unsigned long) relocation));
3541               bfd_set_error (bfd_error_bad_value);
3542               return FALSE;
3543             }
3544           goto final_link_relocate;
3545
3546         case R_SH_PSHA:
3547           if ((signed int)relocation < -32
3548               || (signed int)relocation > 32)
3549             {
3550               ((*_bfd_error_handler)
3551                (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"),
3552                 input_section->owner,
3553                 (unsigned long) rel->r_offset,
3554                 (unsigned long) relocation));
3555               bfd_set_error (bfd_error_bad_value);
3556               return FALSE;
3557             }
3558           goto final_link_relocate;
3559
3560         case R_SH_PSHL:
3561           if ((signed int)relocation < -16
3562               || (signed int)relocation > 16)
3563             {
3564               ((*_bfd_error_handler)
3565                (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"),
3566                 input_section->owner,
3567                 (unsigned long) rel->r_offset,
3568                 (unsigned long) relocation));
3569               bfd_set_error (bfd_error_bad_value);
3570               return FALSE;
3571             }
3572           goto final_link_relocate;
3573
3574         case R_SH_DIR32:
3575         case R_SH_REL32:
3576 #ifdef INCLUDE_SHMEDIA
3577         case R_SH_IMM_LOW16_PCREL:
3578         case R_SH_IMM_MEDLOW16_PCREL:
3579         case R_SH_IMM_MEDHI16_PCREL:
3580         case R_SH_IMM_HI16_PCREL:
3581 #endif
3582           if (info->shared
3583               && (h == NULL
3584                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3585                   || h->root.type != bfd_link_hash_undefweak)
3586               && r_symndx != 0
3587               && (input_section->flags & SEC_ALLOC) != 0
3588               && (r_type == R_SH_DIR32
3589                   || !SYMBOL_CALLS_LOCAL (info, h)))
3590             {
3591               Elf_Internal_Rela outrel;
3592               bfd_byte *loc;
3593               bfd_boolean skip, relocate;
3594
3595               /* When generating a shared object, these relocations
3596                  are copied into the output file to be resolved at run
3597                  time.  */
3598
3599               if (sreloc == NULL)
3600                 {
3601                   const char *name;
3602
3603                   name = (bfd_elf_string_from_elf_section
3604                           (input_bfd,
3605                            elf_elfheader (input_bfd)->e_shstrndx,
3606                            elf_section_data (input_section)->rel_hdr.sh_name));
3607                   if (name == NULL)
3608                     return FALSE;
3609
3610                   BFD_ASSERT (CONST_STRNEQ (name, ".rela")
3611                               && strcmp (bfd_get_section_name (input_bfd,
3612                                                                input_section),
3613                                          name + 5) == 0);
3614
3615                   sreloc = bfd_get_section_by_name (dynobj, name);
3616                   BFD_ASSERT (sreloc != NULL);
3617                 }
3618
3619               skip = FALSE;
3620               relocate = FALSE;
3621
3622               outrel.r_offset =
3623                 _bfd_elf_section_offset (output_bfd, info, input_section,
3624                                          rel->r_offset);
3625               if (outrel.r_offset == (bfd_vma) -1)
3626                 skip = TRUE;
3627               else if (outrel.r_offset == (bfd_vma) -2)
3628                 skip = TRUE, relocate = TRUE;
3629               outrel.r_offset += (input_section->output_section->vma
3630                                   + input_section->output_offset);
3631
3632               if (skip)
3633                 memset (&outrel, 0, sizeof outrel);
3634               else if (r_type == R_SH_REL32)
3635                 {
3636                   BFD_ASSERT (h != NULL && h->dynindx != -1);
3637                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
3638                   outrel.r_addend
3639                     = (howto->partial_inplace
3640                        ? bfd_get_32 (input_bfd, contents + rel->r_offset)
3641                        : addend);
3642                 }
3643 #ifdef INCLUDE_SHMEDIA
3644               else if (r_type == R_SH_IMM_LOW16_PCREL
3645                        || r_type == R_SH_IMM_MEDLOW16_PCREL
3646                        || r_type == R_SH_IMM_MEDHI16_PCREL
3647                        || r_type == R_SH_IMM_HI16_PCREL)
3648                 {
3649                   BFD_ASSERT (h != NULL && h->dynindx != -1);
3650                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
3651                   outrel.r_addend = addend;
3652                 }
3653 #endif
3654               else
3655                 {
3656                   /* h->dynindx may be -1 if this symbol was marked to
3657                      become local.  */
3658                   if (h == NULL
3659                       || ((info->symbolic || h->dynindx == -1)
3660                           && h->def_regular))
3661                     {
3662                       relocate = howto->partial_inplace;
3663                       outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3664                     }
3665                   else
3666                     {
3667                       BFD_ASSERT (h->dynindx != -1);
3668                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
3669                     }
3670                   outrel.r_addend = relocation;
3671                   outrel.r_addend
3672                     += (howto->partial_inplace
3673                         ? bfd_get_32 (input_bfd, contents + rel->r_offset)
3674                         : addend);
3675                 }
3676
3677               loc = sreloc->contents;
3678               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3679               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3680
3681               /* If this reloc is against an external symbol, we do
3682                  not want to fiddle with the addend.  Otherwise, we
3683                  need to include the symbol value so that it becomes
3684                  an addend for the dynamic reloc.  */
3685               if (! relocate)
3686                 continue;
3687             }
3688           goto final_link_relocate;
3689
3690         case R_SH_GOTPLT32:
3691 #ifdef INCLUDE_SHMEDIA
3692         case R_SH_GOTPLT_LOW16:
3693         case R_SH_GOTPLT_MEDLOW16:
3694         case R_SH_GOTPLT_MEDHI16:
3695         case R_SH_GOTPLT_HI16:
3696         case R_SH_GOTPLT10BY4:
3697         case R_SH_GOTPLT10BY8:
3698 #endif
3699           /* Relocation is to the entry for this symbol in the
3700              procedure linkage table.  */
3701
3702           if (h == NULL
3703               || h->forced_local
3704               || ! info->shared
3705               || info->symbolic
3706               || h->dynindx == -1
3707               || h->plt.offset == (bfd_vma) -1
3708               || h->got.offset != (bfd_vma) -1)
3709             goto force_got;
3710
3711           /* Relocation is to the entry for this symbol in the global
3712              offset table extension for the procedure linkage table.  */
3713
3714           BFD_ASSERT (sgotplt != NULL);
3715           relocation = (sgotplt->output_offset
3716                         + (get_plt_index (htab->plt_info, h->plt.offset)
3717                            + 3) * 4);
3718
3719 #ifdef GOT_BIAS
3720           relocation -= GOT_BIAS;
3721 #endif
3722
3723           goto final_link_relocate;
3724
3725         force_got:
3726         case R_SH_GOT32:
3727 #ifdef INCLUDE_SHMEDIA
3728         case R_SH_GOT_LOW16:
3729         case R_SH_GOT_MEDLOW16:
3730         case R_SH_GOT_MEDHI16:
3731         case R_SH_GOT_HI16:
3732         case R_SH_GOT10BY4:
3733         case R_SH_GOT10BY8:
3734 #endif
3735           /* Relocation is to the entry for this symbol in the global
3736              offset table.  */
3737
3738           BFD_ASSERT (sgot != NULL);
3739
3740           if (h != NULL)
3741             {
3742               bfd_boolean dyn;
3743
3744               off = h->got.offset;
3745 #ifdef INCLUDE_SHMEDIA
3746               if (seen_stt_datalabel)
3747                 {
3748                   struct elf_sh_link_hash_entry *hsh;
3749
3750                   hsh = (struct elf_sh_link_hash_entry *)h;
3751                   off = hsh->datalabel_got.offset;
3752                 }
3753 #endif
3754               BFD_ASSERT (off != (bfd_vma) -1);
3755
3756               dyn = htab->root.dynamic_sections_created;
3757               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3758                   || (info->shared
3759                       && SYMBOL_REFERENCES_LOCAL (info, h))
3760                   || (ELF_ST_VISIBILITY (h->other)
3761                       && h->root.type == bfd_link_hash_undefweak))
3762                 {
3763                   /* This is actually a static link, or it is a
3764                      -Bsymbolic link and the symbol is defined
3765                      locally, or the symbol was forced to be local
3766                      because of a version file.  We must initialize
3767                      this entry in the global offset table.  Since the
3768                      offset must always be a multiple of 4, we use the
3769                      least significant bit to record whether we have
3770                      initialized it already.
3771
3772                      When doing a dynamic link, we create a .rela.got
3773                      relocation entry to initialize the value.  This
3774                      is done in the finish_dynamic_symbol routine.  */
3775                   if ((off & 1) != 0)
3776                     off &= ~1;
3777                   else
3778                     {
3779                       bfd_put_32 (output_bfd, relocation,
3780                                   sgot->contents + off);
3781 #ifdef INCLUDE_SHMEDIA
3782                       if (seen_stt_datalabel)
3783                         {
3784                           struct elf_sh_link_hash_entry *hsh;
3785
3786                           hsh = (struct elf_sh_link_hash_entry *)h;
3787                           hsh->datalabel_got.offset |= 1;
3788                         }
3789                       else
3790 #endif
3791                         h->got.offset |= 1;
3792                     }
3793                 }
3794
3795               relocation = sgot->output_offset + off;
3796             }
3797           else
3798             {
3799 #ifdef INCLUDE_SHMEDIA
3800               if (rel->r_addend)
3801                 {
3802                   BFD_ASSERT (local_got_offsets != NULL
3803                               && (local_got_offsets[symtab_hdr->sh_info
3804                                                     + r_symndx]
3805                                   != (bfd_vma) -1));
3806
3807                   off = local_got_offsets[symtab_hdr->sh_info
3808                                           + r_symndx];
3809                 }
3810               else
3811                 {
3812 #endif
3813               BFD_ASSERT (local_got_offsets != NULL
3814                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
3815
3816               off = local_got_offsets[r_symndx];
3817 #ifdef INCLUDE_SHMEDIA
3818                 }
3819 #endif
3820
3821               /* The offset must always be a multiple of 4.  We use
3822                  the least significant bit to record whether we have
3823                  already generated the necessary reloc.  */
3824               if ((off & 1) != 0)
3825                 off &= ~1;
3826               else
3827                 {
3828                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
3829
3830                   if (info->shared)
3831                     {
3832                       Elf_Internal_Rela outrel;
3833                       bfd_byte *loc;
3834
3835                       if (srelgot == NULL)
3836                         {
3837                           srelgot = bfd_get_section_by_name (dynobj,
3838                                                              ".rela.got");
3839                           BFD_ASSERT (srelgot != NULL);
3840                         }
3841
3842                       outrel.r_offset = (sgot->output_section->vma
3843                                          + sgot->output_offset
3844                                          + off);
3845                       outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
3846                       outrel.r_addend = relocation;
3847                       loc = srelgot->contents;
3848                       loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
3849                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3850                     }
3851
3852 #ifdef INCLUDE_SHMEDIA
3853                   if (rel->r_addend)
3854                     local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1;
3855                   else
3856 #endif
3857                     local_got_offsets[r_symndx] |= 1;
3858                 }
3859
3860               relocation = sgot->output_offset + off;
3861             }
3862
3863 #ifdef GOT_BIAS
3864           relocation -= GOT_BIAS;
3865 #endif
3866
3867           goto final_link_relocate;
3868
3869         case R_SH_GOTOFF:
3870 #ifdef INCLUDE_SHMEDIA
3871         case R_SH_GOTOFF_LOW16:
3872         case R_SH_GOTOFF_MEDLOW16:
3873         case R_SH_GOTOFF_MEDHI16:
3874         case R_SH_GOTOFF_HI16:
3875 #endif
3876           /* Relocation is relative to the start of the global offset
3877              table.  */
3878
3879           BFD_ASSERT (sgot != NULL);
3880
3881           /* Note that sgot->output_offset is not involved in this
3882              calculation.  We always want the start of .got.  If we
3883              defined _GLOBAL_OFFSET_TABLE in a different way, as is
3884              permitted by the ABI, we might have to change this
3885              calculation.  */
3886           relocation -= sgot->output_section->vma;
3887
3888 #ifdef GOT_BIAS
3889           relocation -= GOT_BIAS;
3890 #endif
3891
3892           addend = rel->r_addend;
3893
3894           goto final_link_relocate;
3895
3896         case R_SH_GOTPC:
3897 #ifdef INCLUDE_SHMEDIA
3898         case R_SH_GOTPC_LOW16:
3899         case R_SH_GOTPC_MEDLOW16:
3900         case R_SH_GOTPC_MEDHI16:
3901         case R_SH_GOTPC_HI16:
3902 #endif
3903           /* Use global offset table as symbol value.  */
3904
3905           BFD_ASSERT (sgot != NULL);
3906           relocation = sgot->output_section->vma;
3907
3908 #ifdef GOT_BIAS
3909           relocation += GOT_BIAS;
3910 #endif
3911
3912           addend = rel->r_addend;
3913
3914           goto final_link_relocate;
3915
3916         case R_SH_PLT32:
3917 #ifdef INCLUDE_SHMEDIA
3918         case R_SH_PLT_LOW16:
3919         case R_SH_PLT_MEDLOW16:
3920         case R_SH_PLT_MEDHI16:
3921         case R_SH_PLT_HI16:
3922 #endif
3923           /* Relocation is to the entry for this symbol in the
3924              procedure linkage table.  */
3925
3926           /* Resolve a PLT reloc against a local symbol directly,
3927              without using the procedure linkage table.  */
3928           if (h == NULL)
3929             goto final_link_relocate;
3930
3931           if (h->forced_local)
3932             goto final_link_relocate;
3933
3934           if (h->plt.offset == (bfd_vma) -1)
3935             {
3936               /* We didn't make a PLT entry for this symbol.  This
3937                  happens when statically linking PIC code, or when
3938                  using -Bsymbolic.  */
3939               goto final_link_relocate;
3940             }
3941
3942           BFD_ASSERT (splt != NULL);
3943           relocation = (splt->output_section->vma
3944                         + splt->output_offset
3945                         + h->plt.offset);
3946
3947 #ifdef INCLUDE_SHMEDIA
3948           relocation++;
3949 #endif
3950
3951           addend = rel->r_addend;
3952
3953           goto final_link_relocate;
3954
3955         case R_SH_LOOP_START:
3956           {
3957             static bfd_vma start, end;
3958
3959             start = (relocation + rel->r_addend
3960                      - (sec->output_section->vma + sec->output_offset));
3961             r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3962                                    rel->r_offset, sec, start, end);
3963             break;
3964
3965         case R_SH_LOOP_END:
3966             end = (relocation + rel->r_addend
3967                    - (sec->output_section->vma + sec->output_offset));
3968             r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents,
3969                                    rel->r_offset, sec, start, end);
3970             break;
3971           }
3972
3973         case R_SH_TLS_GD_32:
3974         case R_SH_TLS_IE_32:
3975           r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
3976           tls_type = GOT_UNKNOWN;
3977           if (h == NULL && local_got_offsets)
3978             tls_type = sh_elf_local_got_tls_type (input_bfd) [r_symndx];
3979           else if (h != NULL)
3980             {
3981               tls_type = sh_elf_hash_entry (h)->tls_type;
3982               if (! info->shared
3983                   && (h->dynindx == -1
3984                       || h->def_regular))
3985                 r_type = R_SH_TLS_LE_32;
3986             }
3987
3988           if (r_type == R_SH_TLS_GD_32 && tls_type == GOT_TLS_IE)
3989             r_type = R_SH_TLS_IE_32;
3990
3991           if (r_type == R_SH_TLS_LE_32)
3992             {
3993               bfd_vma offset;
3994               unsigned short insn;
3995
3996               if (ELF32_R_TYPE (rel->r_info) == R_SH_TLS_GD_32)
3997                 {
3998                   /* GD->LE transition:
3999                        mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
4000                        jsr @r1; add r12,r4; bra 3f; nop; .align 2;
4001                        1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
4002                      We change it into:
4003                        mov.l 1f,r4; stc gbr,r0; add r4,r0; nop;
4004                        nop; nop; ...
4005                        1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:.  */
4006
4007                   offset = rel->r_offset;
4008                   BFD_ASSERT (offset >= 16);
4009                   /* Size of GD instructions is 16 or 18.  */
4010                   offset -= 16;
4011                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
4012                   if ((insn & 0xff00) == 0xc700)
4013                     {
4014                       BFD_ASSERT (offset >= 2);
4015                       offset -= 2;
4016                       insn = bfd_get_16 (input_bfd, contents + offset + 0);
4017                     }
4018
4019                   BFD_ASSERT ((insn & 0xff00) == 0xd400);
4020                   insn = bfd_get_16 (input_bfd, contents + offset + 2);
4021                   BFD_ASSERT ((insn & 0xff00) == 0xc700);
4022                   insn = bfd_get_16 (input_bfd, contents + offset + 4);
4023                   BFD_ASSERT ((insn & 0xff00) == 0xd100);
4024                   insn = bfd_get_16 (input_bfd, contents + offset + 6);
4025                   BFD_ASSERT (insn == 0x310c);
4026                   insn = bfd_get_16 (input_bfd, contents + offset + 8);
4027                   BFD_ASSERT (insn == 0x410b);
4028                   insn = bfd_get_16 (input_bfd, contents + offset + 10);
4029                   BFD_ASSERT (insn == 0x34cc);
4030
4031                   bfd_put_16 (output_bfd, 0x0012, contents + offset + 2);
4032                   bfd_put_16 (output_bfd, 0x304c, contents + offset + 4);
4033                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
4034                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
4035                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
4036                 }
4037               else
4038                 {
4039                   int index;
4040
4041                   /* IE->LE transition:
4042                      mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM;
4043                      bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2:
4044                      We change it into:
4045                      mov.l .Ln,rM; stc gbr,rN; nop; ...;
4046                      1: x@TPOFF; 2:.  */
4047
4048                   offset = rel->r_offset;
4049                   BFD_ASSERT (offset >= 16);
4050                   /* Size of IE instructions is 10 or 12.  */
4051                   offset -= 10;
4052                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
4053                   if ((insn & 0xf0ff) == 0x0012)
4054                     {
4055                       BFD_ASSERT (offset >= 2);
4056                       offset -= 2;
4057                       insn = bfd_get_16 (input_bfd, contents + offset + 0);
4058                     }
4059
4060                   BFD_ASSERT ((insn & 0xff00) == 0xd000);
4061                   index = insn & 0x00ff;
4062                   insn = bfd_get_16 (input_bfd, contents + offset + 2);
4063                   BFD_ASSERT ((insn & 0xf0ff) == 0x0012);
4064                   insn = bfd_get_16 (input_bfd, contents + offset + 4);
4065                   BFD_ASSERT ((insn & 0xf0ff) == 0x00ce);
4066                   insn = 0xd000 | (insn & 0x0f00) | index;
4067                   bfd_put_16 (output_bfd, insn, contents + offset + 0);
4068                   bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
4069                 }
4070
4071               bfd_put_32 (output_bfd, tpoff (info, relocation),
4072                           contents + rel->r_offset);
4073               continue;
4074             }
4075
4076           sgot = htab->sgot;
4077           if (sgot == NULL)
4078             abort ();
4079
4080           if (h != NULL)
4081             off = h->got.offset;
4082           else
4083             {
4084               if (local_got_offsets == NULL)
4085                 abort ();
4086
4087               off = local_got_offsets[r_symndx];
4088             }
4089
4090           /* Relocate R_SH_TLS_IE_32 directly when statically linking.  */
4091           if (r_type == R_SH_TLS_IE_32
4092               && ! htab->root.dynamic_sections_created)
4093             {
4094               off &= ~1;
4095               bfd_put_32 (output_bfd, tpoff (info, relocation),
4096                           sgot->contents + off);
4097               bfd_put_32 (output_bfd, sgot->output_offset + off,
4098                           contents + rel->r_offset);
4099               continue;
4100             }
4101
4102           if ((off & 1) != 0)
4103             off &= ~1;
4104           else
4105             {
4106               Elf_Internal_Rela outrel;
4107               bfd_byte *loc;
4108               int dr_type, indx;
4109
4110               if (srelgot == NULL)
4111                 {
4112                   srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
4113                   BFD_ASSERT (srelgot != NULL);
4114                 }
4115
4116               outrel.r_offset = (sgot->output_section->vma
4117                                  + sgot->output_offset + off);
4118
4119               if (h == NULL || h->dynindx == -1)
4120                 indx = 0;
4121               else
4122                 indx = h->dynindx;
4123
4124               dr_type = (r_type == R_SH_TLS_GD_32 ? R_SH_TLS_DTPMOD32 :
4125                          R_SH_TLS_TPOFF32);
4126               if (dr_type == R_SH_TLS_TPOFF32 && indx == 0)
4127                 outrel.r_addend = relocation - dtpoff_base (info);
4128               else
4129                 outrel.r_addend = 0;
4130               outrel.r_info = ELF32_R_INFO (indx, dr_type);
4131               loc = srelgot->contents;
4132               loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4133               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4134
4135               if (r_type == R_SH_TLS_GD_32)
4136                 {
4137                   if (indx == 0)
4138                     {
4139                       bfd_put_32 (output_bfd,
4140                                   relocation - dtpoff_base (info),
4141                                   sgot->contents + off + 4);
4142                     }
4143                   else
4144                     {
4145                       outrel.r_info = ELF32_R_INFO (indx,
4146                                                     R_SH_TLS_DTPOFF32);
4147                       outrel.r_offset += 4;
4148                       outrel.r_addend = 0;
4149                       srelgot->reloc_count++;
4150                       loc += sizeof (Elf32_External_Rela);
4151                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4152                     }
4153                 }
4154
4155               if (h != NULL)
4156                 h->got.offset |= 1;
4157               else
4158                 local_got_offsets[r_symndx] |= 1;
4159             }
4160
4161           if (off >= (bfd_vma) -2)
4162             abort ();
4163
4164           if (r_type == (int) ELF32_R_TYPE (rel->r_info))
4165             relocation = sgot->output_offset + off;
4166           else
4167             {
4168               bfd_vma offset;
4169               unsigned short insn;
4170
4171               /* GD->IE transition:
4172                    mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
4173                    jsr @r1; add r12,r4; bra 3f; nop; .align 2;
4174                    1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3:
4175                  We change it into:
4176                    mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0;
4177                    nop; nop; bra 3f; nop; .align 2;
4178                    1: .long x@TPOFF; 2:...; 3:.  */
4179
4180               offset = rel->r_offset;
4181               BFD_ASSERT (offset >= 16);
4182               /* Size of GD instructions is 16 or 18.  */
4183               offset -= 16;
4184               insn = bfd_get_16 (input_bfd, contents + offset + 0);
4185               if ((insn & 0xff00) == 0xc700)
4186                 {
4187                   BFD_ASSERT (offset >= 2);
4188                   offset -= 2;
4189                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
4190                 }
4191
4192               BFD_ASSERT ((insn & 0xff00) == 0xd400);
4193
4194               /* Replace mov.l 1f,R4 with mov.l 1f,r0.  */
4195               bfd_put_16 (output_bfd, insn & 0xf0ff, contents + offset);
4196
4197               insn = bfd_get_16 (input_bfd, contents + offset + 2);
4198               BFD_ASSERT ((insn & 0xff00) == 0xc700);
4199               insn = bfd_get_16 (input_bfd, contents + offset + 4);
4200               BFD_ASSERT ((insn & 0xff00) == 0xd100);
4201               insn = bfd_get_16 (input_bfd, contents + offset + 6);
4202               BFD_ASSERT (insn == 0x310c);
4203               insn = bfd_get_16 (input_bfd, contents + offset + 8);
4204               BFD_ASSERT (insn == 0x410b);
4205               insn = bfd_get_16 (input_bfd, contents + offset + 10);
4206               BFD_ASSERT (insn == 0x34cc);
4207
4208               bfd_put_16 (output_bfd, 0x0412, contents + offset + 2);
4209               bfd_put_16 (output_bfd, 0x00ce, contents + offset + 4);
4210               bfd_put_16 (output_bfd, 0x304c, contents + offset + 6);
4211               bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
4212               bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
4213
4214               bfd_put_32 (output_bfd, sgot->output_offset + off,
4215                           contents + rel->r_offset);
4216
4217               continue;
4218           }
4219
4220           addend = rel->r_addend;
4221
4222           goto final_link_relocate;
4223
4224         case R_SH_TLS_LD_32:
4225           if (! info->shared)
4226             {
4227               bfd_vma offset;
4228               unsigned short insn;
4229
4230               /* LD->LE transition:
4231                    mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1;
4232                    jsr @r1; add r12,r4; bra 3f; nop; .align 2;
4233                    1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3:
4234                  We change it into:
4235                    stc gbr,r0; nop; nop; nop;
4236                    nop; nop; bra 3f; ...; 3:.  */
4237
4238               offset = rel->r_offset;
4239               BFD_ASSERT (offset >= 16);
4240               /* Size of LD instructions is 16 or 18.  */
4241               offset -= 16;
4242               insn = bfd_get_16 (input_bfd, contents + offset + 0);
4243               if ((insn & 0xff00) == 0xc700)
4244                 {
4245                   BFD_ASSERT (offset >= 2);
4246                   offset -= 2;
4247                   insn = bfd_get_16 (input_bfd, contents + offset + 0);
4248                 }
4249
4250               BFD_ASSERT ((insn & 0xff00) == 0xd400);
4251               insn = bfd_get_16 (input_bfd, contents + offset + 2);
4252               BFD_ASSERT ((insn & 0xff00) == 0xc700);
4253               insn = bfd_get_16 (input_bfd, contents + offset + 4);
4254               BFD_ASSERT ((insn & 0xff00) == 0xd100);
4255               insn = bfd_get_16 (input_bfd, contents + offset + 6);
4256               BFD_ASSERT (insn == 0x310c);
4257               insn = bfd_get_16 (input_bfd, contents + offset + 8);
4258               BFD_ASSERT (insn == 0x410b);
4259               insn = bfd_get_16 (input_bfd, contents + offset + 10);
4260               BFD_ASSERT (insn == 0x34cc);
4261
4262               bfd_put_16 (output_bfd, 0x0012, contents + offset + 0);
4263               bfd_put_16 (output_bfd, 0x0009, contents + offset + 2);
4264               bfd_put_16 (output_bfd, 0x0009, contents + offset + 4);
4265               bfd_put_16 (output_bfd, 0x0009, contents + offset + 6);
4266               bfd_put_16 (output_bfd, 0x0009, contents + offset + 8);
4267               bfd_put_16 (output_bfd, 0x0009, contents + offset + 10);
4268
4269               continue;
4270             }
4271
4272           sgot = htab->sgot;
4273           if (sgot == NULL)
4274             abort ();
4275
4276           off = htab->tls_ldm_got.offset;
4277           if (off & 1)
4278             off &= ~1;
4279           else
4280             {
4281               Elf_Internal_Rela outrel;
4282               bfd_byte *loc;
4283
4284               srelgot = htab->srelgot;
4285               if (srelgot == NULL)
4286                 abort ();
4287
4288               outrel.r_offset = (sgot->output_section->vma
4289                                  + sgot->output_offset + off);
4290               outrel.r_addend = 0;
4291               outrel.r_info = ELF32_R_INFO (0, R_SH_TLS_DTPMOD32);
4292               loc = srelgot->contents;
4293               loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4294               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4295               htab->tls_ldm_got.offset |= 1;
4296             }
4297
4298           relocation = sgot->output_offset + off;
4299           addend = rel->r_addend;
4300
4301           goto final_link_relocate;
4302
4303         case R_SH_TLS_LDO_32:
4304           if (! info->shared)
4305             relocation = tpoff (info, relocation);
4306           else
4307             relocation -= dtpoff_base (info);
4308
4309           addend = rel->r_addend;
4310           goto final_link_relocate;
4311
4312         case R_SH_TLS_LE_32:
4313           {
4314             int indx;
4315             Elf_Internal_Rela outrel;
4316             bfd_byte *loc;
4317
4318             if (! info->shared)
4319               {
4320                 relocation = tpoff (info, relocation);
4321                 addend = rel->r_addend;
4322                 goto final_link_relocate;
4323               }
4324
4325             if (sreloc == NULL)
4326               {
4327                 const char *name;
4328
4329                 name = (bfd_elf_string_from_elf_section
4330                         (input_bfd,
4331                          elf_elfheader (input_bfd)->e_shstrndx,
4332                          elf_section_data (input_section)->rel_hdr.sh_name));
4333                 if (name == NULL)
4334                   return FALSE;
4335
4336                 BFD_ASSERT (CONST_STRNEQ (name, ".rela")
4337                             && strcmp (bfd_get_section_name (input_bfd,
4338                                                              input_section),
4339                                        name + 5) == 0);
4340
4341                 sreloc = bfd_get_section_by_name (dynobj, name);
4342                 BFD_ASSERT (sreloc != NULL);
4343               }
4344
4345             if (h == NULL || h->dynindx == -1)
4346               indx = 0;
4347             else
4348               indx = h->dynindx;
4349
4350             outrel.r_offset = (input_section->output_section->vma
4351                                + input_section->output_offset
4352                                + rel->r_offset);
4353             outrel.r_info = ELF32_R_INFO (indx, R_SH_TLS_TPOFF32);
4354             if (indx == 0)
4355               outrel.r_addend = relocation - dtpoff_base (info);
4356             else
4357               outrel.r_addend = 0;
4358
4359             loc = sreloc->contents;
4360             loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4361             bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4362             continue;
4363           }
4364         }
4365
4366     relocation_done:
4367       if (r != bfd_reloc_ok)
4368         {
4369           switch (r)
4370             {
4371             default:
4372             case bfd_reloc_outofrange:
4373               abort ();
4374             case bfd_reloc_overflow:
4375               {
4376                 const char *name;
4377
4378                 if (h != NULL)
4379                   name = NULL;
4380                 else
4381                   {
4382                     name = (bfd_elf_string_from_elf_section
4383                             (input_bfd, symtab_hdr->sh_link, sym->st_name));
4384                     if (name == NULL)
4385                       return FALSE;
4386                     if (*name == '\0')
4387                       name = bfd_section_name (input_bfd, sec);
4388                   }
4389                 if (! ((*info->callbacks->reloc_overflow)
4390                        (info, (h ? &h->root : NULL), name, howto->name,
4391                         (bfd_vma) 0, input_bfd, input_section,
4392                         rel->r_offset)))
4393                   return FALSE;
4394               }
4395               break;
4396             }
4397         }
4398     }
4399
4400   return TRUE;
4401 }
4402
4403 /* This is a version of bfd_generic_get_relocated_section_contents
4404    which uses sh_elf_relocate_section.  */
4405
4406 static bfd_byte *
4407 sh_elf_get_relocated_section_contents (bfd *output_bfd,
4408                                        struct bfd_link_info *link_info,
4409                                        struct bfd_link_order *link_order,
4410                                        bfd_byte *data,
4411                                        bfd_boolean relocatable,
4412                                        asymbol **symbols)
4413 {
4414   Elf_Internal_Shdr *symtab_hdr;
4415   asection *input_section = link_order->u.indirect.section;
4416   bfd *input_bfd = input_section->owner;
4417   asection **sections = NULL;
4418   Elf_Internal_Rela *internal_relocs = NULL;
4419   Elf_Internal_Sym *isymbuf = NULL;
4420
4421   /* We only need to handle the case of relaxing, or of having a
4422      particular set of section contents, specially.  */
4423   if (relocatable
4424       || elf_section_data (input_section)->this_hdr.contents == NULL)
4425     return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
4426                                                        link_order, data,
4427                                                        relocatable,
4428                                                        symbols);
4429
4430   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4431
4432   memcpy (data, elf_section_data (input_section)->this_hdr.contents,
4433           (size_t) input_section->size);
4434
4435   if ((input_section->flags & SEC_RELOC) != 0
4436       && input_section->reloc_count > 0)
4437     {
4438       asection **secpp;
4439       Elf_Internal_Sym *isym, *isymend;
4440       bfd_size_type amt;
4441
4442       internal_relocs = (_bfd_elf_link_read_relocs
4443                          (input_bfd, input_section, NULL,
4444                           (Elf_Internal_Rela *) NULL, FALSE));
4445       if (internal_relocs == NULL)
4446         goto error_return;
4447
4448       if (symtab_hdr->sh_info != 0)
4449         {
4450           isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4451           if (isymbuf == NULL)
4452             isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
4453                                             symtab_hdr->sh_info, 0,
4454                                             NULL, NULL, NULL);
4455           if (isymbuf == NULL)
4456             goto error_return;
4457         }
4458
4459       amt = symtab_hdr->sh_info;
4460       amt *= sizeof (asection *);
4461       sections = (asection **) bfd_malloc (amt);
4462       if (sections == NULL && amt != 0)
4463         goto error_return;
4464
4465       isymend = isymbuf + symtab_hdr->sh_info;
4466       for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp)
4467         {
4468           asection *isec;
4469
4470           if (isym->st_shndx == SHN_UNDEF)
4471             isec = bfd_und_section_ptr;
4472           else if (isym->st_shndx == SHN_ABS)
4473             isec = bfd_abs_section_ptr;
4474           else if (isym->st_shndx == SHN_COMMON)
4475             isec = bfd_com_section_ptr;
4476           else
4477             isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx);
4478
4479           *secpp = isec;
4480         }
4481
4482       if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd,
4483                                      input_section, data, internal_relocs,
4484                                      isymbuf, sections))
4485         goto error_return;
4486
4487       if (sections != NULL)
4488         free (sections);
4489       if (isymbuf != NULL
4490           && symtab_hdr->contents != (unsigned char *) isymbuf)
4491         free (isymbuf);
4492       if (elf_section_data (input_section)->relocs != internal_relocs)
4493         free (internal_relocs);
4494     }
4495
4496   return data;
4497
4498  error_return:
4499   if (sections != NULL)
4500     free (sections);
4501   if (isymbuf != NULL
4502       && symtab_hdr->contents != (unsigned char *) isymbuf)
4503     free (isymbuf);
4504   if (internal_relocs != NULL
4505       && elf_section_data (input_section)->relocs != internal_relocs)
4506     free (internal_relocs);
4507   return NULL;
4508 }
4509
4510 /* Return the base VMA address which should be subtracted from real addresses
4511    when resolving @dtpoff relocation.
4512    This is PT_TLS segment p_vaddr.  */
4513
4514 static bfd_vma
4515 dtpoff_base (struct bfd_link_info *info)
4516 {
4517   /* If tls_sec is NULL, we should have signalled an error already.  */
4518   if (elf_hash_table (info)->tls_sec == NULL)
4519     return 0;
4520   return elf_hash_table (info)->tls_sec->vma;
4521 }
4522
4523 /* Return the relocation value for R_SH_TLS_TPOFF32..  */
4524
4525 static bfd_vma
4526 tpoff (struct bfd_link_info *info, bfd_vma address)
4527 {
4528   /* If tls_sec is NULL, we should have signalled an error already.  */
4529   if (elf_hash_table (info)->tls_sec == NULL)
4530     return 0;
4531   /* SH TLS ABI is variant I and static TLS block start just after tcbhead
4532      structure which has 2 pointer fields.  */
4533   return (address - elf_hash_table (info)->tls_sec->vma
4534           + align_power ((bfd_vma) 8,
4535                          elf_hash_table (info)->tls_sec->alignment_power));
4536 }
4537
4538 static asection *
4539 sh_elf_gc_mark_hook (asection *sec,
4540                      struct bfd_link_info *info,
4541                      Elf_Internal_Rela *rel,
4542                      struct elf_link_hash_entry *h,
4543                      Elf_Internal_Sym *sym)
4544 {
4545   if (h != NULL)
4546     switch (ELF32_R_TYPE (rel->r_info))
4547       {
4548       case R_SH_GNU_VTINHERIT:
4549       case R_SH_GNU_VTENTRY:
4550         return NULL;
4551       }
4552
4553   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4554 }
4555
4556 /* Update the got entry reference counts for the section being removed.  */
4557
4558 static bfd_boolean
4559 sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
4560                       asection *sec, const Elf_Internal_Rela *relocs)
4561 {
4562   Elf_Internal_Shdr *symtab_hdr;
4563   struct elf_link_hash_entry **sym_hashes;
4564   bfd_signed_vma *local_got_refcounts;
4565   const Elf_Internal_Rela *rel, *relend;
4566
4567   if (info->relocatable)
4568     return TRUE;
4569
4570   elf_section_data (sec)->local_dynrel = NULL;
4571
4572   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4573   sym_hashes = elf_sym_hashes (abfd);
4574   local_got_refcounts = elf_local_got_refcounts (abfd);
4575
4576   relend = relocs + sec->reloc_count;
4577   for (rel = relocs; rel < relend; rel++)
4578     {
4579       unsigned long r_symndx;
4580       unsigned int r_type;
4581       struct elf_link_hash_entry *h = NULL;
4582 #ifdef INCLUDE_SHMEDIA
4583       int seen_stt_datalabel = 0;
4584 #endif
4585
4586       r_symndx = ELF32_R_SYM (rel->r_info);
4587       if (r_symndx >= symtab_hdr->sh_info)
4588         {
4589           struct elf_sh_link_hash_entry *eh;
4590           struct elf_sh_dyn_relocs **pp;
4591           struct elf_sh_dyn_relocs *p;
4592
4593           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4594           while (h->root.type == bfd_link_hash_indirect
4595                  || h->root.type == bfd_link_hash_warning)
4596             {
4597 #ifdef INCLUDE_SHMEDIA
4598               seen_stt_datalabel |= h->type == STT_DATALABEL;
4599 #endif
4600               h = (struct elf_link_hash_entry *) h->root.u.i.link;
4601             }
4602           eh = (struct elf_sh_link_hash_entry *) h;
4603           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4604             if (p->sec == sec)
4605               {
4606                 /* Everything must go for SEC.  */
4607                 *pp = p->next;
4608                 break;
4609               }
4610         }
4611
4612       r_type = ELF32_R_TYPE (rel->r_info);
4613       switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL))
4614         {
4615         case R_SH_TLS_LD_32:
4616           if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0)
4617             sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
4618           break;
4619
4620         case R_SH_GOT32:
4621         case R_SH_GOTOFF:
4622         case R_SH_GOTPC:
4623 #ifdef INCLUDE_SHMEDIA
4624         case R_SH_GOT_LOW16:
4625         case R_SH_GOT_MEDLOW16:
4626         case R_SH_GOT_MEDHI16:
4627         case R_SH_GOT_HI16:
4628         case R_SH_GOT10BY4:
4629         case R_SH_GOT10BY8:
4630         case R_SH_GOTOFF_LOW16:
4631         case R_SH_GOTOFF_MEDLOW16:
4632         case R_SH_GOTOFF_MEDHI16:
4633         case R_SH_GOTOFF_HI16:
4634         case R_SH_GOTPC_LOW16:
4635         case R_SH_GOTPC_MEDLOW16:
4636         case R_SH_GOTPC_MEDHI16:
4637         case R_SH_GOTPC_HI16:
4638 #endif
4639         case R_SH_TLS_GD_32:
4640         case R_SH_TLS_IE_32:
4641           if (h != NULL)
4642             {
4643 #ifdef INCLUDE_SHMEDIA
4644               if (seen_stt_datalabel)
4645                 {
4646                   struct elf_sh_link_hash_entry *eh;
4647                   eh = (struct elf_sh_link_hash_entry *) h;
4648                   if (eh->datalabel_got.refcount > 0)
4649                     eh->datalabel_got.refcount -= 1;
4650                 }
4651               else
4652 #endif
4653                 if (h->got.refcount > 0)
4654                   h->got.refcount -= 1;
4655             }
4656           else if (local_got_refcounts != NULL)
4657             {
4658 #ifdef INCLUDE_SHMEDIA
4659               if (rel->r_addend & 1)
4660                 {
4661                   if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
4662                     local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
4663                 }
4664               else
4665 #endif
4666                 if (local_got_refcounts[r_symndx] > 0)
4667                   local_got_refcounts[r_symndx] -= 1;
4668             }
4669           break;
4670
4671         case R_SH_DIR32:
4672         case R_SH_REL32:
4673           if (info->shared)
4674             break;
4675           /* Fall thru */
4676
4677         case R_SH_PLT32:
4678 #ifdef INCLUDE_SHMEDIA
4679         case R_SH_PLT_LOW16:
4680         case R_SH_PLT_MEDLOW16:
4681         case R_SH_PLT_MEDHI16:
4682         case R_SH_PLT_HI16:
4683 #endif
4684           if (h != NULL)
4685             {
4686               if (h->plt.refcount > 0)
4687                 h->plt.refcount -= 1;
4688             }
4689           break;
4690
4691         case R_SH_GOTPLT32:
4692 #ifdef INCLUDE_SHMEDIA
4693         case R_SH_GOTPLT_LOW16:
4694         case R_SH_GOTPLT_MEDLOW16:
4695         case R_SH_GOTPLT_MEDHI16:
4696         case R_SH_GOTPLT_HI16:
4697         case R_SH_GOTPLT10BY4:
4698         case R_SH_GOTPLT10BY8:
4699 #endif
4700           if (h != NULL)
4701             {
4702               struct elf_sh_link_hash_entry *eh;
4703               eh = (struct elf_sh_link_hash_entry *) h;
4704               if (eh->gotplt_refcount > 0)
4705                 {
4706                   eh->gotplt_refcount -= 1;
4707                   if (h->plt.refcount > 0)
4708                     h->plt.refcount -= 1;
4709                 }
4710 #ifdef INCLUDE_SHMEDIA
4711               else if (seen_stt_datalabel)
4712                 {
4713                   if (eh->datalabel_got.refcount > 0)
4714                     eh->datalabel_got.refcount -= 1;
4715                 }
4716 #endif
4717               else if (h->got.refcount > 0)
4718                 h->got.refcount -= 1;
4719             }
4720           else if (local_got_refcounts != NULL)
4721             {
4722 #ifdef INCLUDE_SHMEDIA
4723               if (rel->r_addend & 1)
4724                 {
4725                   if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0)
4726                     local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1;
4727                 }
4728               else
4729 #endif
4730                 if (local_got_refcounts[r_symndx] > 0)
4731                   local_got_refcounts[r_symndx] -= 1;
4732             }
4733           break;
4734
4735         default:
4736           break;
4737         }
4738     }
4739
4740   return TRUE;
4741 }
4742
4743 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
4744
4745 static void
4746 sh_elf_copy_indirect_symbol (struct bfd_link_info *info,
4747                              struct elf_link_hash_entry *dir,
4748                              struct elf_link_hash_entry *ind)
4749 {
4750   struct elf_sh_link_hash_entry *edir, *eind;
4751
4752   edir = (struct elf_sh_link_hash_entry *) dir;
4753   eind = (struct elf_sh_link_hash_entry *) ind;
4754
4755   if (eind->dyn_relocs != NULL)
4756     {
4757       if (edir->dyn_relocs != NULL)
4758         {
4759           struct elf_sh_dyn_relocs **pp;
4760           struct elf_sh_dyn_relocs *p;
4761
4762           /* Add reloc counts against the indirect sym to the direct sym
4763              list.  Merge any entries against the same section.  */
4764           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4765             {
4766               struct elf_sh_dyn_relocs *q;
4767
4768               for (q = edir->dyn_relocs; q != NULL; q = q->next)
4769                 if (q->sec == p->sec)
4770                   {
4771                     q->pc_count += p->pc_count;
4772                     q->count += p->count;
4773                     *pp = p->next;
4774                     break;
4775                   }
4776               if (q == NULL)
4777                 pp = &p->next;
4778             }
4779           *pp = edir->dyn_relocs;
4780         }
4781
4782       edir->dyn_relocs = eind->dyn_relocs;
4783       eind->dyn_relocs = NULL;
4784     }
4785   edir->gotplt_refcount = eind->gotplt_refcount;
4786   eind->gotplt_refcount = 0;
4787 #ifdef INCLUDE_SHMEDIA
4788   edir->datalabel_got.refcount += eind->datalabel_got.refcount;
4789   eind->datalabel_got.refcount = 0;
4790 #endif
4791
4792   if (ind->root.type == bfd_link_hash_indirect
4793       && dir->got.refcount <= 0)
4794     {
4795       edir->tls_type = eind->tls_type;
4796       eind->tls_type = GOT_UNKNOWN;
4797     }
4798
4799   if (ind->root.type != bfd_link_hash_indirect
4800       && dir->dynamic_adjusted)
4801     {
4802       /* If called to transfer flags for a weakdef during processing
4803          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
4804          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
4805       dir->ref_dynamic |= ind->ref_dynamic;
4806       dir->ref_regular |= ind->ref_regular;
4807       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
4808       dir->needs_plt |= ind->needs_plt;
4809     }
4810   else
4811     _bfd_elf_link_hash_copy_indirect (info, dir, ind);
4812 }
4813
4814 static int
4815 sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type,
4816                             int is_local)
4817 {
4818   if (info->shared)
4819     return r_type;
4820
4821   switch (r_type)
4822     {
4823     case R_SH_TLS_GD_32:
4824     case R_SH_TLS_IE_32:
4825       if (is_local)
4826         return R_SH_TLS_LE_32;
4827       return R_SH_TLS_IE_32;
4828     case R_SH_TLS_LD_32:
4829       return R_SH_TLS_LE_32;
4830     }
4831
4832   return r_type;
4833 }
4834
4835 /* Look through the relocs for a section during the first phase.
4836    Since we don't do .gots or .plts, we just need to consider the
4837    virtual table relocs for gc.  */
4838
4839 static bfd_boolean
4840 sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
4841                      const Elf_Internal_Rela *relocs)
4842 {
4843   Elf_Internal_Shdr *symtab_hdr;
4844   struct elf_link_hash_entry **sym_hashes;
4845   struct elf_sh_link_hash_table *htab;
4846   const Elf_Internal_Rela *rel;
4847   const Elf_Internal_Rela *rel_end;
4848   bfd_vma *local_got_offsets;
4849   asection *sgot;
4850   asection *srelgot;
4851   asection *sreloc;
4852   unsigned int r_type;
4853   int tls_type, old_tls_type;
4854
4855   sgot = NULL;
4856   srelgot = NULL;
4857   sreloc = NULL;
4858
4859   if (info->relocatable)
4860     return TRUE;
4861
4862   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4863   sym_hashes = elf_sym_hashes (abfd);
4864
4865   htab = sh_elf_hash_table (info);
4866   local_got_offsets = elf_local_got_offsets (abfd);
4867
4868   rel_end = relocs + sec->reloc_count;
4869   for (rel = relocs; rel < rel_end; rel++)
4870     {
4871       struct elf_link_hash_entry *h;
4872       unsigned long r_symndx;
4873 #ifdef INCLUDE_SHMEDIA
4874       int seen_stt_datalabel = 0;
4875 #endif
4876
4877       r_symndx = ELF32_R_SYM (rel->r_info);
4878       r_type = ELF32_R_TYPE (rel->r_info);
4879
4880       if (r_symndx < symtab_hdr->sh_info)
4881         h = NULL;
4882       else
4883         {
4884           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4885           while (h->root.type == bfd_link_hash_indirect
4886                  || h->root.type == bfd_link_hash_warning)
4887             {
4888 #ifdef INCLUDE_SHMEDIA
4889               seen_stt_datalabel |= h->type == STT_DATALABEL;
4890 #endif
4891               h = (struct elf_link_hash_entry *) h->root.u.i.link;
4892             }
4893         }
4894
4895       r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL);
4896       if (! info->shared
4897           && r_type == R_SH_TLS_IE_32
4898           && h != NULL
4899           && h->root.type != bfd_link_hash_undefined
4900           && h->root.type != bfd_link_hash_undefweak
4901           && (h->dynindx == -1
4902               || h->def_regular))
4903         r_type = R_SH_TLS_LE_32;
4904
4905       /* Some relocs require a global offset table.  */
4906       if (htab->sgot == NULL)
4907         {
4908           switch (r_type)
4909             {
4910             case R_SH_GOTPLT32:
4911             case R_SH_GOT32:
4912             case R_SH_GOTOFF:
4913             case R_SH_GOTPC:
4914 #ifdef INCLUDE_SHMEDIA
4915             case R_SH_GOTPLT_LOW16:
4916             case R_SH_GOTPLT_MEDLOW16:
4917             case R_SH_GOTPLT_MEDHI16:
4918             case R_SH_GOTPLT_HI16:
4919             case R_SH_GOTPLT10BY4:
4920             case R_SH_GOTPLT10BY8:
4921             case R_SH_GOT_LOW16:
4922             case R_SH_GOT_MEDLOW16:
4923             case R_SH_GOT_MEDHI16:
4924             case R_SH_GOT_HI16:
4925             case R_SH_GOT10BY4:
4926             case R_SH_GOT10BY8:
4927             case R_SH_GOTOFF_LOW16:
4928             case R_SH_GOTOFF_MEDLOW16:
4929             case R_SH_GOTOFF_MEDHI16:
4930             case R_SH_GOTOFF_HI16:
4931             case R_SH_GOTPC_LOW16:
4932             case R_SH_GOTPC_MEDLOW16:
4933             case R_SH_GOTPC_MEDHI16:
4934             case R_SH_GOTPC_HI16:
4935 #endif
4936             case R_SH_TLS_GD_32:
4937             case R_SH_TLS_LD_32:
4938             case R_SH_TLS_IE_32:
4939               if (htab->sgot == NULL)
4940                 {
4941                   if (htab->root.dynobj == NULL)
4942                     htab->root.dynobj = abfd;
4943                   if (!create_got_section (htab->root.dynobj, info))
4944                     return FALSE;
4945                 }
4946               break;
4947
4948             default:
4949               break;
4950             }
4951         }
4952
4953       switch (r_type)
4954         {
4955           /* This relocation describes the C++ object vtable hierarchy.
4956              Reconstruct it for later use during GC.  */
4957         case R_SH_GNU_VTINHERIT:
4958           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4959             return FALSE;
4960           break;
4961
4962           /* This relocation describes which C++ vtable entries are actually
4963              used.  Record for later use during GC.  */
4964         case R_SH_GNU_VTENTRY:
4965           BFD_ASSERT (h != NULL);
4966           if (h != NULL
4967               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4968             return FALSE;
4969           break;
4970
4971         case R_SH_TLS_IE_32:
4972           if (info->shared)
4973             info->flags |= DF_STATIC_TLS;
4974
4975           /* FALLTHROUGH */
4976         force_got:
4977         case R_SH_TLS_GD_32:
4978         case R_SH_GOT32:
4979 #ifdef INCLUDE_SHMEDIA
4980         case R_SH_GOT_LOW16:
4981         case R_SH_GOT_MEDLOW16:
4982         case R_SH_GOT_MEDHI16:
4983         case R_SH_GOT_HI16:
4984         case R_SH_GOT10BY4:
4985         case R_SH_GOT10BY8:
4986 #endif
4987           switch (r_type)
4988             {
4989             default:
4990               tls_type = GOT_NORMAL;
4991               break;
4992             case R_SH_TLS_GD_32:
4993               tls_type = GOT_TLS_GD;
4994               break;
4995             case R_SH_TLS_IE_32:
4996               tls_type = GOT_TLS_IE;
4997               break;
4998             }
4999
5000           if (h != NULL)
5001             {
5002 #ifdef INCLUDE_SHMEDIA
5003               if (seen_stt_datalabel)
5004                 {
5005                   struct elf_sh_link_hash_entry *eh
5006                     = (struct elf_sh_link_hash_entry *) h;
5007
5008                   eh->datalabel_got.refcount += 1;
5009                 }
5010               else
5011 #endif
5012                 h->got.refcount += 1;
5013               old_tls_type = sh_elf_hash_entry (h)->tls_type;
5014             }
5015           else
5016             {
5017               bfd_signed_vma *local_got_refcounts;
5018
5019               /* This is a global offset table entry for a local
5020                  symbol.  */
5021               local_got_refcounts = elf_local_got_refcounts (abfd);
5022               if (local_got_refcounts == NULL)
5023                 {
5024                   bfd_size_type size;
5025
5026                   size = symtab_hdr->sh_info;
5027                   size *= sizeof (bfd_signed_vma);
5028 #ifdef INCLUDE_SHMEDIA
5029                   /* Reserve space for both the datalabel and
5030                      codelabel local GOT offsets.  */
5031                   size *= 2;
5032 #endif
5033                   size += symtab_hdr->sh_info;
5034                   local_got_refcounts = ((bfd_signed_vma *)
5035                                          bfd_zalloc (abfd, size));
5036                   if (local_got_refcounts == NULL)
5037                     return FALSE;
5038                   elf_local_got_refcounts (abfd) = local_got_refcounts;
5039 #ifdef  INCLUDE_SHMEDIA
5040                   /* Take care of both the datalabel and codelabel local
5041                      GOT offsets.  */
5042                   sh_elf_local_got_tls_type (abfd)
5043                     = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
5044 #else
5045                   sh_elf_local_got_tls_type (abfd)
5046                     = (char *) (local_got_refcounts + symtab_hdr->sh_info);
5047 #endif
5048                 }
5049 #ifdef INCLUDE_SHMEDIA
5050               if (rel->r_addend & 1)
5051                 local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1;
5052               else
5053 #endif
5054                 local_got_refcounts[r_symndx] += 1;
5055               old_tls_type = sh_elf_local_got_tls_type (abfd) [r_symndx];
5056             }
5057
5058           /* If a TLS symbol is accessed using IE at least once,
5059              there is no point to use dynamic model for it.  */
5060           if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
5061               && (old_tls_type != GOT_TLS_GD || tls_type != GOT_TLS_IE))
5062             {
5063               if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
5064                 tls_type = GOT_TLS_IE;
5065               else
5066                 {
5067                   (*_bfd_error_handler)
5068                     (_("%B: `%s' accessed both as normal and thread local symbol"),
5069                      abfd, h->root.root.string);
5070                   return FALSE;
5071                 }
5072             }
5073
5074           if (old_tls_type != tls_type)
5075             {
5076               if (h != NULL)
5077                 sh_elf_hash_entry (h)->tls_type = tls_type;
5078               else
5079                 sh_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
5080             }
5081
5082           break;
5083
5084         case R_SH_TLS_LD_32:
5085           sh_elf_hash_table(info)->tls_ldm_got.refcount += 1;
5086           break;
5087
5088         case R_SH_GOTPLT32:
5089 #ifdef INCLUDE_SHMEDIA
5090         case R_SH_GOTPLT_LOW16:
5091         case R_SH_GOTPLT_MEDLOW16:
5092         case R_SH_GOTPLT_MEDHI16:
5093         case R_SH_GOTPLT_HI16:
5094         case R_SH_GOTPLT10BY4:
5095         case R_SH_GOTPLT10BY8:
5096 #endif
5097           /* If this is a local symbol, we resolve it directly without
5098              creating a procedure linkage table entry.  */
5099
5100           if (h == NULL
5101               || h->forced_local
5102               || ! info->shared
5103               || info->symbolic
5104               || h->dynindx == -1)
5105             goto force_got;
5106
5107           h->needs_plt = 1;
5108           h->plt.refcount += 1;
5109           ((struct elf_sh_link_hash_entry *) h)->gotplt_refcount += 1;
5110
5111           break;
5112
5113         case R_SH_PLT32:
5114 #ifdef INCLUDE_SHMEDIA
5115         case R_SH_PLT_LOW16:
5116         case R_SH_PLT_MEDLOW16:
5117         case R_SH_PLT_MEDHI16:
5118         case R_SH_PLT_HI16:
5119 #endif
5120           /* This symbol requires a procedure linkage table entry.  We
5121              actually build the entry in adjust_dynamic_symbol,
5122              because this might be a case of linking PIC code which is
5123              never referenced by a dynamic object, in which case we
5124              don't need to generate a procedure linkage table entry
5125              after all.  */
5126
5127           /* If this is a local symbol, we resolve it directly without
5128              creating a procedure linkage table entry.  */
5129           if (h == NULL)
5130             continue;
5131
5132           if (h->forced_local)
5133             break;
5134
5135           h->needs_plt = 1;
5136           h->plt.refcount += 1;
5137           break;
5138
5139         case R_SH_DIR32:
5140         case R_SH_REL32:
5141 #ifdef INCLUDE_SHMEDIA
5142         case R_SH_IMM_LOW16_PCREL:
5143         case R_SH_IMM_MEDLOW16_PCREL:
5144         case R_SH_IMM_MEDHI16_PCREL:
5145         case R_SH_IMM_HI16_PCREL:
5146 #endif
5147           if (h != NULL && ! info->shared)
5148             {
5149               h->non_got_ref = 1;
5150               h->plt.refcount += 1;
5151             }
5152
5153           /* If we are creating a shared library, and this is a reloc
5154              against a global symbol, or a non PC relative reloc
5155              against a local symbol, then we need to copy the reloc
5156              into the shared library.  However, if we are linking with
5157              -Bsymbolic, we do not need to copy a reloc against a
5158              global symbol which is defined in an object we are
5159              including in the link (i.e., DEF_REGULAR is set).  At
5160              this point we have not seen all the input files, so it is
5161              possible that DEF_REGULAR is not set now but will be set
5162              later (it is never cleared).  We account for that
5163              possibility below by storing information in the
5164              dyn_relocs field of the hash table entry. A similar
5165              situation occurs when creating shared libraries and symbol
5166              visibility changes render the symbol local.
5167
5168              If on the other hand, we are creating an executable, we
5169              may need to keep relocations for symbols satisfied by a
5170              dynamic library if we manage to avoid copy relocs for the
5171              symbol.  */
5172           if ((info->shared
5173                && (sec->flags & SEC_ALLOC) != 0
5174                && (r_type != R_SH_REL32
5175                    || (h != NULL
5176                        && (! info->symbolic
5177                            || h->root.type == bfd_link_hash_defweak
5178                            || !h->def_regular))))
5179               || (! info->shared
5180                   && (sec->flags & SEC_ALLOC) != 0
5181                   && h != NULL
5182                   && (h->root.type == bfd_link_hash_defweak
5183                       || !h->def_regular)))
5184             {
5185               struct elf_sh_dyn_relocs *p;
5186               struct elf_sh_dyn_relocs **head;
5187
5188               if (htab->root.dynobj == NULL)
5189                 htab->root.dynobj = abfd;
5190
5191               /* When creating a shared object, we must copy these
5192                  reloc types into the output file.  We create a reloc
5193                  section in dynobj and make room for this reloc.  */
5194               if (sreloc == NULL)
5195                 {
5196                   const char *name;
5197
5198                   name = (bfd_elf_string_from_elf_section
5199                           (abfd,
5200                            elf_elfheader (abfd)->e_shstrndx,
5201                            elf_section_data (sec)->rel_hdr.sh_name));
5202                   if (name == NULL)
5203                     return FALSE;
5204
5205                   BFD_ASSERT (CONST_STRNEQ (name, ".rela")
5206                               && strcmp (bfd_get_section_name (abfd, sec),
5207                                          name + 5) == 0);
5208
5209                   sreloc = bfd_get_section_by_name (htab->root.dynobj, name);
5210                   if (sreloc == NULL)
5211                     {
5212                       flagword flags;
5213
5214                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
5215                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5216                       if ((sec->flags & SEC_ALLOC) != 0)
5217                         flags |= SEC_ALLOC | SEC_LOAD;
5218                       sreloc = bfd_make_section_with_flags (htab->root.dynobj,
5219                                                             name,
5220                                                             flags);
5221                       if (sreloc == NULL
5222                           || ! bfd_set_section_alignment (htab->root.dynobj,
5223                                                           sreloc, 2))
5224                         return FALSE;
5225                     }
5226                   elf_section_data (sec)->sreloc = sreloc;
5227                 }
5228
5229               /* If this is a global symbol, we count the number of
5230                  relocations we need for this symbol.  */
5231               if (h != NULL)
5232                 head = &((struct elf_sh_link_hash_entry *) h)->dyn_relocs;
5233               else
5234                 {
5235                   asection *s;
5236                   void *vpp;
5237
5238                   /* Track dynamic relocs needed for local syms too.  */
5239                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
5240                                                  sec, r_symndx);
5241                   if (s == NULL)
5242                     return FALSE;
5243
5244                   vpp = &elf_section_data (s)->local_dynrel;
5245                   head = (struct elf_sh_dyn_relocs **) vpp;
5246                 }
5247
5248               p = *head;
5249               if (p == NULL || p->sec != sec)
5250                 {
5251                   bfd_size_type amt = sizeof (*p);
5252                   p = bfd_alloc (htab->root.dynobj, amt);
5253                   if (p == NULL)
5254                     return FALSE;
5255                   p->next = *head;
5256                   *head = p;
5257                   p->sec = sec;
5258                   p->count = 0;
5259                   p->pc_count = 0;
5260                 }
5261
5262               p->count += 1;
5263               if (r_type == R_SH_REL32
5264 #ifdef INCLUDE_SHMEDIA
5265                   || r_type == R_SH_IMM_LOW16_PCREL
5266                   || r_type == R_SH_IMM_MEDLOW16_PCREL
5267                   || r_type == R_SH_IMM_MEDHI16_PCREL
5268                   || r_type == R_SH_IMM_HI16_PCREL
5269 #endif
5270                   )
5271                 p->pc_count += 1;
5272             }
5273
5274           break;
5275
5276         case R_SH_TLS_LE_32:
5277           if (info->shared)
5278             {
5279               (*_bfd_error_handler)
5280                 (_("%B: TLS local exec code cannot be linked into shared objects"),
5281                  abfd);
5282               return FALSE;
5283             }
5284
5285           break;
5286
5287         case R_SH_TLS_LDO_32:
5288           /* Nothing to do.  */
5289           break;
5290
5291         default:
5292           break;
5293         }
5294     }
5295
5296   return TRUE;
5297 }
5298
5299 #ifndef sh_elf_set_mach_from_flags
5300 static unsigned int sh_ef_bfd_table[] = { EF_SH_BFD_TABLE };
5301
5302 static bfd_boolean
5303 sh_elf_set_mach_from_flags (bfd *abfd)
5304 {
5305   flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK;
5306
5307   if (flags >= sizeof(sh_ef_bfd_table))
5308     return FALSE;
5309
5310   if (sh_ef_bfd_table[flags] == 0)
5311     return FALSE;
5312   
5313   bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]);
5314
5315   return TRUE;
5316 }
5317
5318
5319 /* Reverse table lookup for sh_ef_bfd_table[].
5320    Given a bfd MACH value from archures.c
5321    return the equivalent ELF flags from the table.
5322    Return -1 if no match is found.  */
5323
5324 int
5325 sh_elf_get_flags_from_mach (unsigned long mach)
5326 {
5327   int i = ARRAY_SIZE (sh_ef_bfd_table) - 1;
5328   
5329   for (; i>0; i--)
5330     if (sh_ef_bfd_table[i] == mach)
5331       return i;
5332   
5333   /* shouldn't get here */
5334   BFD_FAIL();
5335
5336   return -1;
5337 }
5338 #endif /* not sh_elf_set_mach_from_flags */
5339
5340 #ifndef sh_elf_set_private_flags
5341 /* Function to keep SH specific file flags.  */
5342
5343 static bfd_boolean
5344 sh_elf_set_private_flags (bfd *abfd, flagword flags)
5345 {
5346   BFD_ASSERT (! elf_flags_init (abfd)
5347               || elf_elfheader (abfd)->e_flags == flags);
5348
5349   elf_elfheader (abfd)->e_flags = flags;
5350   elf_flags_init (abfd) = TRUE;
5351   return sh_elf_set_mach_from_flags (abfd);
5352 }
5353 #endif /* not sh_elf_set_private_flags */
5354
5355 #ifndef sh_elf_copy_private_data
5356 /* Copy backend specific data from one object module to another */
5357
5358 static bfd_boolean
5359 sh_elf_copy_private_data (bfd * ibfd, bfd * obfd)
5360 {
5361   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5362       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5363     return TRUE;
5364
5365   /* Copy object attributes.  */
5366   _bfd_elf_copy_obj_attributes (ibfd, obfd);
5367
5368   return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
5369 }
5370 #endif /* not sh_elf_copy_private_data */
5371
5372 #ifndef sh_elf_merge_private_data
5373
5374 /* This function returns the ELF architecture number that
5375    corresponds to the given arch_sh* flags.  */
5376
5377 int
5378 sh_find_elf_flags (unsigned int arch_set)
5379 {
5380   extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int);
5381   unsigned long bfd_mach = sh_get_bfd_mach_from_arch_set (arch_set);
5382
5383   return sh_elf_get_flags_from_mach (bfd_mach);
5384 }
5385
5386 /* This routine initialises the elf flags when required and
5387    calls sh_merge_bfd_arch() to check dsp/fpu compatibility.  */
5388
5389 static bfd_boolean
5390 sh_elf_merge_private_data (bfd *ibfd, bfd *obfd)
5391 {
5392   extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *);
5393
5394   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
5395       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
5396     return TRUE;
5397
5398   if (! elf_flags_init (obfd))
5399     {
5400       /* This happens when ld starts out with a 'blank' output file.  */
5401       elf_flags_init (obfd) = TRUE;
5402       elf_elfheader (obfd)->e_flags = EF_SH1;
5403       sh_elf_set_mach_from_flags (obfd);
5404     }
5405
5406   if (! sh_merge_bfd_arch (ibfd, obfd))
5407     {
5408       _bfd_error_handler ("%B: uses instructions which are incompatible "
5409                           "with instructions used in previous modules",
5410                           ibfd);
5411       bfd_set_error (bfd_error_bad_value);
5412       return FALSE;
5413     }
5414
5415   elf_elfheader (obfd)->e_flags =
5416     sh_elf_get_flags_from_mach (bfd_get_mach (obfd));
5417   
5418   return TRUE;
5419 }
5420 #endif /* not sh_elf_merge_private_data */
5421
5422 /* Override the generic function because we need to store sh_elf_obj_tdata
5423    as the specific tdata.  We set also the machine architecture from flags
5424    here.  */
5425
5426 static bfd_boolean
5427 sh_elf_object_p (bfd *abfd)
5428 {
5429   return sh_elf_set_mach_from_flags (abfd);
5430 }
5431
5432 /* Finish up dynamic symbol handling.  We set the contents of various
5433    dynamic sections here.  */
5434
5435 static bfd_boolean
5436 sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
5437                               struct elf_link_hash_entry *h,
5438                               Elf_Internal_Sym *sym)
5439 {
5440   struct elf_sh_link_hash_table *htab;
5441
5442   htab = sh_elf_hash_table (info);
5443
5444   if (h->plt.offset != (bfd_vma) -1)
5445     {
5446       asection *splt;
5447       asection *sgot;
5448       asection *srel;
5449
5450       bfd_vma plt_index;
5451       bfd_vma got_offset;
5452       Elf_Internal_Rela rel;
5453       bfd_byte *loc;
5454
5455       /* This symbol has an entry in the procedure linkage table.  Set
5456          it up.  */
5457
5458       BFD_ASSERT (h->dynindx != -1);
5459
5460       splt = htab->splt;
5461       sgot = htab->sgotplt;
5462       srel = htab->srelplt;
5463       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
5464
5465       /* Get the index in the procedure linkage table which
5466          corresponds to this symbol.  This is the index of this symbol
5467          in all the symbols for which we are making plt entries.  The
5468          first entry in the procedure linkage table is reserved.  */
5469       plt_index = get_plt_index (htab->plt_info, h->plt.offset);
5470
5471       /* Get the offset into the .got table of the entry that
5472          corresponds to this function.  Each .got entry is 4 bytes.
5473          The first three are reserved.  */
5474       got_offset = (plt_index + 3) * 4;
5475
5476 #ifdef GOT_BIAS
5477       if (info->shared)
5478         got_offset -= GOT_BIAS;
5479 #endif
5480
5481       /* Fill in the entry in the procedure linkage table.  */
5482       memcpy (splt->contents + h->plt.offset,
5483               htab->plt_info->symbol_entry,
5484               htab->plt_info->symbol_entry_size);
5485
5486       if (info->shared)
5487         install_plt_field (output_bfd, FALSE, got_offset,
5488                            (splt->contents
5489                             + h->plt.offset
5490                             + htab->plt_info->symbol_fields.got_entry));
5491       else
5492         {
5493           install_plt_field (output_bfd, FALSE,
5494                              (sgot->output_section->vma
5495                               + sgot->output_offset
5496                               + got_offset),
5497                              (splt->contents
5498                               + h->plt.offset
5499                               + htab->plt_info->symbol_fields.got_entry));
5500           if (htab->vxworks_p)
5501             {
5502               unsigned int reachable_plts, plts_per_4k;
5503               int distance;
5504
5505               /* Divide the PLT into groups.  The first group contains
5506                  REACHABLE_PLTS entries and the other groups contain
5507                  PLTS_PER_4K entries.  Entries in the first group can
5508                  branch directly to .plt; those in later groups branch
5509                  to the last element of the previous group.  */
5510               /* ??? It would be better to create multiple copies of
5511                  the common resolver stub.  */
5512               reachable_plts = ((4096
5513                                  - htab->plt_info->plt0_entry_size
5514                                  - (htab->plt_info->symbol_fields.plt + 4))
5515                                 / htab->plt_info->symbol_entry_size) + 1;
5516               plts_per_4k = (4096 / htab->plt_info->symbol_entry_size);
5517               if (plt_index < reachable_plts)
5518                 distance = -(h->plt.offset
5519                              + htab->plt_info->symbol_fields.plt);
5520               else
5521                 distance = -(((plt_index - reachable_plts) % plts_per_4k + 1)
5522                              * htab->plt_info->symbol_entry_size);
5523
5524               /* Install the 'bra' with this offset.  */
5525               bfd_put_16 (output_bfd,
5526                           0xa000 | (0x0fff & ((distance - 4) / 2)),
5527                           (splt->contents
5528                            + h->plt.offset
5529                            + htab->plt_info->symbol_fields.plt));
5530             }
5531           else
5532             install_plt_field (output_bfd, TRUE,
5533                                splt->output_section->vma + splt->output_offset,
5534                                (splt->contents
5535                                 + h->plt.offset
5536                                 + htab->plt_info->symbol_fields.plt));
5537         }
5538
5539 #ifdef GOT_BIAS
5540       if (info->shared)
5541         got_offset += GOT_BIAS;
5542 #endif
5543
5544       install_plt_field (output_bfd, FALSE,
5545                          plt_index * sizeof (Elf32_External_Rela),
5546                          (splt->contents
5547                           + h->plt.offset
5548                           + htab->plt_info->symbol_fields.reloc_offset));
5549
5550       /* Fill in the entry in the global offset table.  */
5551       bfd_put_32 (output_bfd,
5552                   (splt->output_section->vma
5553                    + splt->output_offset
5554                    + h->plt.offset
5555                    + htab->plt_info->symbol_resolve_offset),
5556                   sgot->contents + got_offset);
5557
5558       /* Fill in the entry in the .rela.plt section.  */
5559       rel.r_offset = (sgot->output_section->vma
5560                       + sgot->output_offset
5561                       + got_offset);
5562       rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT);
5563       rel.r_addend = 0;
5564 #ifdef GOT_BIAS
5565       rel.r_addend = GOT_BIAS;
5566 #endif
5567       loc = srel->contents + plt_index * sizeof (Elf32_External_Rela);
5568       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5569
5570       if (htab->vxworks_p && !info->shared)
5571         {
5572           /* Create the .rela.plt.unloaded relocations for this PLT entry.
5573              Begin by pointing LOC to the first such relocation.  */
5574           loc = (htab->srelplt2->contents
5575                  + (plt_index * 2 + 1) * sizeof (Elf32_External_Rela));
5576
5577           /* Create a .rela.plt.unloaded R_SH_DIR32 relocation
5578              for the PLT entry's pointer to the .got.plt entry.  */
5579           rel.r_offset = (htab->splt->output_section->vma
5580                           + htab->splt->output_offset
5581                           + h->plt.offset
5582                           + htab->plt_info->symbol_fields.got_entry);
5583           rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
5584           rel.r_addend = got_offset;
5585           bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5586           loc += sizeof (Elf32_External_Rela);
5587
5588           /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for
5589              the .got.plt entry, which initially points to .plt.  */
5590           rel.r_offset = (htab->sgotplt->output_section->vma
5591                           + htab->sgotplt->output_offset
5592                           + got_offset);
5593           rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_SH_DIR32);
5594           rel.r_addend = 0;
5595           bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5596         }
5597
5598       if (!h->def_regular)
5599         {
5600           /* Mark the symbol as undefined, rather than as defined in
5601              the .plt section.  Leave the value alone.  */
5602           sym->st_shndx = SHN_UNDEF;
5603         }
5604     }
5605
5606   if (h->got.offset != (bfd_vma) -1
5607       && sh_elf_hash_entry (h)->tls_type != GOT_TLS_GD
5608       && sh_elf_hash_entry (h)->tls_type != GOT_TLS_IE)
5609     {
5610       asection *sgot;
5611       asection *srel;
5612       Elf_Internal_Rela rel;
5613       bfd_byte *loc;
5614
5615       /* This symbol has an entry in the global offset table.  Set it
5616          up.  */
5617
5618       sgot = htab->sgot;
5619       srel = htab->srelgot;
5620       BFD_ASSERT (sgot != NULL && srel != NULL);
5621
5622       rel.r_offset = (sgot->output_section->vma
5623                       + sgot->output_offset
5624                       + (h->got.offset &~ (bfd_vma) 1));
5625
5626       /* If this is a static link, or it is a -Bsymbolic link and the
5627          symbol is defined locally or was forced to be local because
5628          of a version file, we just want to emit a RELATIVE reloc.
5629          The entry in the global offset table will already have been
5630          initialized in the relocate_section function.  */
5631       if (info->shared
5632           && SYMBOL_REFERENCES_LOCAL (info, h))
5633         {
5634           rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
5635           rel.r_addend = (h->root.u.def.value
5636                           + h->root.u.def.section->output_section->vma
5637                           + h->root.u.def.section->output_offset);
5638         }
5639       else
5640         {
5641           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
5642           rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
5643           rel.r_addend = 0;
5644         }
5645
5646       loc = srel->contents;
5647       loc += srel->reloc_count++ * sizeof (Elf32_External_Rela);
5648       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5649     }
5650
5651 #ifdef INCLUDE_SHMEDIA
5652   {
5653     struct elf_sh_link_hash_entry *eh;
5654
5655     eh = (struct elf_sh_link_hash_entry *) h;
5656     if (eh->datalabel_got.offset != (bfd_vma) -1)
5657       {
5658         asection *sgot;
5659         asection *srel;
5660         Elf_Internal_Rela rel;
5661         bfd_byte *loc;
5662
5663         /* This symbol has a datalabel entry in the global offset table.
5664            Set it up.  */
5665
5666         sgot = htab->sgot;
5667         srel = htab->srelgot;
5668         BFD_ASSERT (sgot != NULL && srel != NULL);
5669
5670         rel.r_offset = (sgot->output_section->vma
5671                         + sgot->output_offset
5672                         + (eh->datalabel_got.offset &~ (bfd_vma) 1));
5673
5674         /* If this is a static link, or it is a -Bsymbolic link and the
5675            symbol is defined locally or was forced to be local because
5676            of a version file, we just want to emit a RELATIVE reloc.
5677            The entry in the global offset table will already have been
5678            initialized in the relocate_section function.  */
5679         if (info->shared
5680             && SYMBOL_REFERENCES_LOCAL (info, h))
5681           {
5682             rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
5683             rel.r_addend = (h->root.u.def.value
5684                             + h->root.u.def.section->output_section->vma
5685                             + h->root.u.def.section->output_offset);
5686           }
5687         else
5688           {
5689             bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents
5690                         + eh->datalabel_got.offset);
5691             rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT);
5692             rel.r_addend = 0;
5693           }
5694
5695         loc = srel->contents;
5696         loc += srel->reloc_count++ * sizeof (Elf32_External_Rela);
5697         bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5698       }
5699   }
5700 #endif
5701
5702   if (h->needs_copy)
5703     {
5704       asection *s;
5705       Elf_Internal_Rela rel;
5706       bfd_byte *loc;
5707
5708       /* This symbol needs a copy reloc.  Set it up.  */
5709
5710       BFD_ASSERT (h->dynindx != -1
5711                   && (h->root.type == bfd_link_hash_defined
5712                       || h->root.type == bfd_link_hash_defweak));
5713
5714       s = bfd_get_section_by_name (h->root.u.def.section->owner,
5715                                    ".rela.bss");
5716       BFD_ASSERT (s != NULL);
5717
5718       rel.r_offset = (h->root.u.def.value
5719                       + h->root.u.def.section->output_section->vma
5720                       + h->root.u.def.section->output_offset);
5721       rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY);
5722       rel.r_addend = 0;
5723       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5724       bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5725     }
5726
5727   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  On VxWorks,
5728      _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
5729      ".got" section.  */
5730   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
5731       || (!htab->vxworks_p && h == htab->root.hgot))
5732     sym->st_shndx = SHN_ABS;
5733
5734   return TRUE;
5735 }
5736
5737 /* Finish up the dynamic sections.  */
5738
5739 static bfd_boolean
5740 sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
5741 {
5742   struct elf_sh_link_hash_table *htab;
5743   asection *sgot;
5744   asection *sdyn;
5745
5746   htab = sh_elf_hash_table (info);
5747   sgot = htab->sgotplt;
5748   sdyn = bfd_get_section_by_name (htab->root.dynobj, ".dynamic");
5749
5750   if (htab->root.dynamic_sections_created)
5751     {
5752       asection *splt;
5753       Elf32_External_Dyn *dyncon, *dynconend;
5754
5755       BFD_ASSERT (sgot != NULL && sdyn != NULL);
5756
5757       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5758       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5759       for (; dyncon < dynconend; dyncon++)
5760         {
5761           Elf_Internal_Dyn dyn;
5762           asection *s;
5763 #ifdef INCLUDE_SHMEDIA
5764           const char *name;
5765 #endif
5766
5767           bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn);
5768
5769           switch (dyn.d_tag)
5770             {
5771             default:
5772               if (htab->vxworks_p
5773                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5774                 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5775               break;
5776
5777 #ifdef INCLUDE_SHMEDIA
5778             case DT_INIT:
5779               name = info->init_function;
5780               goto get_sym;
5781
5782             case DT_FINI:
5783               name = info->fini_function;
5784             get_sym:
5785               if (dyn.d_un.d_val != 0)
5786                 {
5787                   struct elf_link_hash_entry *h;
5788
5789                   h = elf_link_hash_lookup (&htab->root, name,
5790                                             FALSE, FALSE, TRUE);
5791                   if (h != NULL && (h->other & STO_SH5_ISA32))
5792                     {
5793                       dyn.d_un.d_val |= 1;
5794                       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5795                     }
5796                 }
5797               break;
5798 #endif
5799
5800             case DT_PLTGOT:
5801               s = htab->sgot->output_section;
5802               goto get_vma;
5803
5804             case DT_JMPREL:
5805               s = htab->srelplt->output_section;
5806             get_vma:
5807               BFD_ASSERT (s != NULL);
5808               dyn.d_un.d_ptr = s->vma;
5809               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5810               break;
5811
5812             case DT_PLTRELSZ:
5813               s = htab->srelplt->output_section;
5814               BFD_ASSERT (s != NULL);
5815               dyn.d_un.d_val = s->size;
5816               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5817               break;
5818
5819             case DT_RELASZ:
5820               /* My reading of the SVR4 ABI indicates that the
5821                  procedure linkage table relocs (DT_JMPREL) should be
5822                  included in the overall relocs (DT_RELA).  This is
5823                  what Solaris does.  However, UnixWare can not handle
5824                  that case.  Therefore, we override the DT_RELASZ entry
5825                  here to make it not include the JMPREL relocs.  Since
5826                  the linker script arranges for .rela.plt to follow all
5827                  other relocation sections, we don't have to worry
5828                  about changing the DT_RELA entry.  */
5829               if (htab->srelplt != NULL)
5830                 {
5831                   s = htab->srelplt->output_section;
5832                   dyn.d_un.d_val -= s->size;
5833                 }
5834               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5835               break;
5836             }
5837         }
5838
5839       /* Fill in the first entry in the procedure linkage table.  */
5840       splt = htab->splt;
5841       if (splt && splt->size > 0 && htab->plt_info->plt0_entry)
5842         {
5843           unsigned int i;
5844
5845           memcpy (splt->contents,
5846                   htab->plt_info->plt0_entry,
5847                   htab->plt_info->plt0_entry_size);
5848           for (i = 0; i < ARRAY_SIZE (htab->plt_info->plt0_got_fields); i++)
5849             if (htab->plt_info->plt0_got_fields[i] != MINUS_ONE)
5850               install_plt_field (output_bfd, FALSE,
5851                                  (sgot->output_section->vma
5852                                   + sgot->output_offset
5853                                   + (i * 4)),
5854                                  (splt->contents
5855                                   + htab->plt_info->plt0_got_fields[i]));
5856
5857           if (htab->vxworks_p)
5858             {
5859               /* Finalize the .rela.plt.unloaded contents.  */
5860               Elf_Internal_Rela rel;
5861               bfd_byte *loc;
5862
5863               /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for the
5864                  first PLT entry's pointer to _GLOBAL_OFFSET_TABLE_ + 8.  */
5865               loc = htab->srelplt2->contents;
5866               rel.r_offset = (splt->output_section->vma
5867                               + splt->output_offset
5868                               + htab->plt_info->plt0_got_fields[2]);
5869               rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32);
5870               rel.r_addend = 8;
5871               bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
5872               loc += sizeof (Elf32_External_Rela);
5873
5874               /* Fix up the remaining .rela.plt.unloaded relocations.
5875                  They may have the wrong symbol index for _G_O_T_ or
5876                  _P_L_T_ depending on the order in which symbols were
5877                  output.  */
5878               while (loc < htab->srelplt2->contents + htab->srelplt2->size)
5879                 {
5880                   /* The PLT entry's pointer to the .got.plt slot.  */
5881                   bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
5882                   rel.r_info = ELF32_R_INFO (htab->root.hgot->indx,
5883                                              R_SH_DIR32);
5884                   bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5885                   loc += sizeof (Elf32_External_Rela);
5886
5887                   /* The .got.plt slot's pointer to .plt.  */
5888                   bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
5889                   rel.r_info = ELF32_R_INFO (htab->root.hplt->indx,
5890                                              R_SH_DIR32);
5891                   bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5892                   loc += sizeof (Elf32_External_Rela);
5893                 }
5894             }
5895
5896           /* UnixWare sets the entsize of .plt to 4, although that doesn't
5897              really seem like the right value.  */
5898           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
5899         }
5900     }
5901
5902   /* Fill in the first three entries in the global offset table.  */
5903   if (sgot && sgot->size > 0)
5904     {
5905       if (sdyn == NULL)
5906         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5907       else
5908         bfd_put_32 (output_bfd,
5909                     sdyn->output_section->vma + sdyn->output_offset,
5910                     sgot->contents);
5911       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
5912       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
5913
5914       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5915     }
5916
5917   return TRUE;
5918 }
5919
5920 static enum elf_reloc_type_class
5921 sh_elf_reloc_type_class (const Elf_Internal_Rela *rela)
5922 {
5923   switch ((int) ELF32_R_TYPE (rela->r_info))
5924     {
5925     case R_SH_RELATIVE:
5926       return reloc_class_relative;
5927     case R_SH_JMP_SLOT:
5928       return reloc_class_plt;
5929     case R_SH_COPY:
5930       return reloc_class_copy;
5931     default:
5932       return reloc_class_normal;
5933     }
5934 }
5935
5936 #if !defined SH_TARGET_ALREADY_DEFINED
5937 /* Support for Linux core dump NOTE sections.  */
5938
5939 static bfd_boolean
5940 elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
5941 {
5942   int offset;
5943   unsigned int size;
5944
5945   switch (note->descsz)
5946     {
5947       default:
5948         return FALSE;
5949
5950       case 168:         /* Linux/SH */
5951         /* pr_cursig */
5952         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
5953
5954         /* pr_pid */
5955         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
5956
5957         /* pr_reg */
5958         offset = 72;
5959         size = 92;
5960
5961         break;
5962     }
5963
5964   /* Make a ".reg/999" section.  */
5965   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
5966                                           size, note->descpos + offset);
5967 }
5968
5969 static bfd_boolean
5970 elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
5971 {
5972   switch (note->descsz)
5973     {
5974       default:
5975         return FALSE;
5976
5977       case 124:         /* Linux/SH elf_prpsinfo */
5978         elf_tdata (abfd)->core_program
5979          = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
5980         elf_tdata (abfd)->core_command
5981          = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
5982     }
5983
5984   /* Note that for some reason, a spurious space is tacked
5985      onto the end of the args in some (at least one anyway)
5986      implementations, so strip it off if it exists.  */
5987
5988   {
5989     char *command = elf_tdata (abfd)->core_command;
5990     int n = strlen (command);
5991
5992     if (0 < n && command[n - 1] == ' ')
5993       command[n - 1] = '\0';
5994   }
5995
5996   return TRUE;
5997 }
5998 #endif /* not SH_TARGET_ALREADY_DEFINED */
5999
6000  
6001 /* Return address for Ith PLT stub in section PLT, for relocation REL
6002    or (bfd_vma) -1 if it should not be included.  */
6003
6004 static bfd_vma
6005 sh_elf_plt_sym_val (bfd_vma i, const asection *plt,
6006                     const arelent *rel ATTRIBUTE_UNUSED)
6007 {
6008   const struct elf_sh_plt_info *plt_info;
6009
6010   plt_info = get_plt_info (plt->owner, (plt->owner->flags & DYNAMIC) != 0);
6011   return plt->vma + get_plt_offset (plt_info, i);
6012 }
6013
6014 #if !defined SH_TARGET_ALREADY_DEFINED
6015 #define TARGET_BIG_SYM          bfd_elf32_sh_vec
6016 #define TARGET_BIG_NAME         "elf32-sh"
6017 #define TARGET_LITTLE_SYM       bfd_elf32_shl_vec
6018 #define TARGET_LITTLE_NAME      "elf32-shl"
6019 #endif
6020
6021 #define ELF_ARCH                bfd_arch_sh
6022 #define ELF_MACHINE_CODE        EM_SH
6023 #ifdef __QNXTARGET__
6024 #define ELF_MAXPAGESIZE         0x1000
6025 #else
6026 #define ELF_MAXPAGESIZE         0x80
6027 #endif
6028
6029 #define elf_symbol_leading_char '_'
6030
6031 #define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup
6032 #define bfd_elf32_bfd_reloc_name_lookup \
6033                                         sh_elf_reloc_name_lookup
6034 #define elf_info_to_howto               sh_elf_info_to_howto
6035 #define bfd_elf32_bfd_relax_section     sh_elf_relax_section
6036 #define elf_backend_relocate_section    sh_elf_relocate_section
6037 #define bfd_elf32_bfd_get_relocated_section_contents \
6038                                         sh_elf_get_relocated_section_contents
6039 #define bfd_elf32_mkobject              sh_elf_mkobject
6040 #define elf_backend_object_p            sh_elf_object_p
6041 #define bfd_elf32_bfd_set_private_bfd_flags \
6042                                         sh_elf_set_private_flags
6043 #define bfd_elf32_bfd_copy_private_bfd_data \
6044                                         sh_elf_copy_private_data
6045 #define bfd_elf32_bfd_merge_private_bfd_data \
6046                                         sh_elf_merge_private_data
6047
6048 #define elf_backend_gc_mark_hook        sh_elf_gc_mark_hook
6049 #define elf_backend_gc_sweep_hook       sh_elf_gc_sweep_hook
6050 #define elf_backend_check_relocs        sh_elf_check_relocs
6051 #define elf_backend_copy_indirect_symbol \
6052                                         sh_elf_copy_indirect_symbol
6053 #define elf_backend_create_dynamic_sections \
6054                                         sh_elf_create_dynamic_sections
6055 #define bfd_elf32_bfd_link_hash_table_create \
6056                                         sh_elf_link_hash_table_create
6057 #define elf_backend_adjust_dynamic_symbol \
6058                                         sh_elf_adjust_dynamic_symbol
6059 #define elf_backend_always_size_sections \
6060                                         sh_elf_always_size_sections
6061 #define elf_backend_size_dynamic_sections \
6062                                         sh_elf_size_dynamic_sections
6063 #define elf_backend_omit_section_dynsym \
6064   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6065 #define elf_backend_finish_dynamic_symbol \
6066                                         sh_elf_finish_dynamic_symbol
6067 #define elf_backend_finish_dynamic_sections \
6068                                         sh_elf_finish_dynamic_sections
6069 #define elf_backend_reloc_type_class    sh_elf_reloc_type_class
6070 #define elf_backend_plt_sym_val         sh_elf_plt_sym_val
6071
6072 #define elf_backend_can_gc_sections     1
6073 #define elf_backend_can_refcount        1
6074 #define elf_backend_want_got_plt        1
6075 #define elf_backend_plt_readonly        1
6076 #define elf_backend_want_plt_sym        0
6077 #define elf_backend_got_header_size     12
6078
6079 #if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED
6080
6081 #include "elf32-target.h"
6082
6083 /* NetBSD support.  */
6084 #undef  TARGET_BIG_SYM
6085 #define TARGET_BIG_SYM                  bfd_elf32_shnbsd_vec
6086 #undef  TARGET_BIG_NAME
6087 #define TARGET_BIG_NAME                 "elf32-sh-nbsd"
6088 #undef  TARGET_LITTLE_SYM
6089 #define TARGET_LITTLE_SYM               bfd_elf32_shlnbsd_vec
6090 #undef  TARGET_LITTLE_NAME
6091 #define TARGET_LITTLE_NAME              "elf32-shl-nbsd"
6092 #undef  ELF_MAXPAGESIZE
6093 #define ELF_MAXPAGESIZE                 0x10000
6094 #undef  ELF_COMMONPAGESIZE
6095 #undef  elf_symbol_leading_char
6096 #define elf_symbol_leading_char         0
6097 #undef  elf32_bed
6098 #define elf32_bed                       elf32_sh_nbsd_bed
6099
6100 #include "elf32-target.h"
6101
6102
6103 /* Linux support.  */
6104 #undef  TARGET_BIG_SYM
6105 #define TARGET_BIG_SYM                  bfd_elf32_shblin_vec
6106 #undef  TARGET_BIG_NAME
6107 #define TARGET_BIG_NAME                 "elf32-shbig-linux"
6108 #undef  TARGET_LITTLE_SYM
6109 #define TARGET_LITTLE_SYM               bfd_elf32_shlin_vec
6110 #undef  TARGET_LITTLE_NAME
6111 #define TARGET_LITTLE_NAME              "elf32-sh-linux"
6112 #undef  ELF_COMMONPAGESIZE
6113 #define ELF_COMMONPAGESIZE              0x1000
6114
6115 #undef  elf_backend_grok_prstatus
6116 #define elf_backend_grok_prstatus       elf32_shlin_grok_prstatus
6117 #undef  elf_backend_grok_psinfo
6118 #define elf_backend_grok_psinfo         elf32_shlin_grok_psinfo
6119 #undef  elf32_bed
6120 #define elf32_bed                       elf32_sh_lin_bed
6121
6122 #include "elf32-target.h"
6123
6124 #undef  TARGET_BIG_SYM
6125 #define TARGET_BIG_SYM                  bfd_elf32_shvxworks_vec
6126 #undef  TARGET_BIG_NAME
6127 #define TARGET_BIG_NAME                 "elf32-sh-vxworks"
6128 #undef  TARGET_LITTLE_SYM
6129 #define TARGET_LITTLE_SYM               bfd_elf32_shlvxworks_vec
6130 #undef  TARGET_LITTLE_NAME
6131 #define TARGET_LITTLE_NAME              "elf32-shl-vxworks"
6132 #undef  elf32_bed
6133 #define elf32_bed                       elf32_sh_vxworks_bed
6134
6135 #undef  elf_backend_want_plt_sym
6136 #define elf_backend_want_plt_sym        1
6137 #undef  elf_symbol_leading_char
6138 #define elf_symbol_leading_char         '_'
6139 #define elf_backend_want_got_underscore 1
6140 #undef  elf_backend_grok_prstatus
6141 #undef  elf_backend_grok_psinfo
6142 #undef  elf_backend_add_symbol_hook
6143 #define elf_backend_add_symbol_hook     elf_vxworks_add_symbol_hook
6144 #undef  elf_backend_link_output_symbol_hook
6145 #define elf_backend_link_output_symbol_hook \
6146                                         elf_vxworks_link_output_symbol_hook
6147 #undef  elf_backend_emit_relocs
6148 #define elf_backend_emit_relocs         elf_vxworks_emit_relocs
6149 #undef  elf_backend_final_write_processing
6150 #define elf_backend_final_write_processing \
6151                                         elf_vxworks_final_write_processing
6152 #undef  ELF_MAXPAGESIZE
6153 #define ELF_MAXPAGESIZE                 0x1000
6154 #undef  ELF_COMMONPAGESIZE
6155
6156 #include "elf32-target.h"
6157
6158 #endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */