OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-sh.c] - Blame information for rev 14

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

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