OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gdb/] [gdb-6.8/] [gdb-6.8.openrisc-2.1/] [bfd/] [elf32-sh.c] - Blame information for rev 450

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.