Coverage Report

Created: 2023-08-28 06:26

/src/binutils-gdb/bfd/elfxx-sparc.c
Line
Count
Source (jump to first uncovered line)
1
/* SPARC-specific support for ELF
2
   Copyright (C) 2005-2023 Free Software Foundation, Inc.
3
4
   This file is part of BFD, the Binary File Descriptor library.
5
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3 of the License, or
9
   (at your option) any later version.
10
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19
   MA 02110-1301, USA.  */
20
21
22
/* This file handles functionality common to the different SPARC ABI's.  */
23
24
#include "sysdep.h"
25
#include "bfd.h"
26
#include "bfdlink.h"
27
#include "libbfd.h"
28
#include "libiberty.h"
29
#include "elf-bfd.h"
30
#include "elf/sparc.h"
31
#include "opcode/sparc.h"
32
#include "elfxx-sparc.h"
33
#include "elf-vxworks.h"
34
#include "objalloc.h"
35
#include "hashtab.h"
36
37
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
38
0
#define MINUS_ONE (~ (bfd_vma) 0)
39
40
#define ABI_64_P(abfd) \
41
8
  (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
42
43
/* The relocation "howto" table.  */
44
45
/* Utility for performing the standard initial work of an instruction
46
   relocation.
47
   *PRELOCATION will contain the relocated item.
48
   *PINSN will contain the instruction from the input stream.
49
   If the result is `bfd_reloc_other' the caller can continue with
50
   performing the relocation.  Otherwise it must stop and return the
51
   value to its caller.  */
52
53
static bfd_reloc_status_type
54
init_insn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
55
     void * data, asection *input_section, bfd *output_bfd,
56
     bfd_vma *prelocation, bfd_vma *pinsn)
57
0
{
58
0
  bfd_vma relocation;
59
0
  reloc_howto_type *howto = reloc_entry->howto;
60
61
0
  if (output_bfd != (bfd *) NULL
62
0
      && (symbol->flags & BSF_SECTION_SYM) == 0
63
0
      && (! howto->partial_inplace
64
0
    || reloc_entry->addend == 0))
65
0
    {
66
0
      reloc_entry->address += input_section->output_offset;
67
0
      return bfd_reloc_ok;
68
0
    }
69
70
  /* This works because partial_inplace is FALSE.  */
71
0
  if (output_bfd != NULL)
72
0
    return bfd_reloc_continue;
73
74
0
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
75
0
    return bfd_reloc_outofrange;
76
77
0
  relocation = (symbol->value
78
0
    + symbol->section->output_section->vma
79
0
    + symbol->section->output_offset);
80
0
  relocation += reloc_entry->addend;
81
0
  if (howto->pc_relative)
82
0
    {
83
0
      relocation -= (input_section->output_section->vma
84
0
         + input_section->output_offset);
85
0
      relocation -= reloc_entry->address;
86
0
    }
87
88
0
  *prelocation = relocation;
89
0
  *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
90
0
  return bfd_reloc_other;
91
0
}
92
93
/* For unsupported relocs.  */
94
95
static bfd_reloc_status_type
96
sparc_elf_notsup_reloc (bfd *abfd ATTRIBUTE_UNUSED,
97
      arelent *reloc_entry ATTRIBUTE_UNUSED,
98
      asymbol *symbol ATTRIBUTE_UNUSED,
99
      void * data ATTRIBUTE_UNUSED,
100
      asection *input_section ATTRIBUTE_UNUSED,
101
      bfd *output_bfd ATTRIBUTE_UNUSED,
102
      char **error_message ATTRIBUTE_UNUSED)
103
0
{
104
0
  return bfd_reloc_notsupported;
105
0
}
106
107
/* Handle the WDISP16 reloc.  */
108
109
static bfd_reloc_status_type
110
sparc_elf_wdisp16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
111
       void * data, asection *input_section, bfd *output_bfd,
112
       char **error_message ATTRIBUTE_UNUSED)
113
0
{
114
0
  bfd_vma relocation;
115
0
  bfd_vma insn;
116
0
  bfd_reloc_status_type status;
117
118
0
  status = init_insn_reloc (abfd, reloc_entry, symbol, data,
119
0
          input_section, output_bfd, &relocation, &insn);
120
0
  if (status != bfd_reloc_other)
121
0
    return status;
122
123
0
  insn &= ~ (bfd_vma) 0x303fff;
124
0
  insn |= (((relocation >> 2) & 0xc000) << 6) | ((relocation >> 2) & 0x3fff);
125
0
  bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
126
127
0
  if ((bfd_signed_vma) relocation < - 0x40000
128
0
      || (bfd_signed_vma) relocation > 0x3ffff)
129
0
    return bfd_reloc_overflow;
130
0
  else
131
0
    return bfd_reloc_ok;
132
0
}
133
134
/* Handle the WDISP10 reloc.  */
135
136
static bfd_reloc_status_type
137
sparc_elf_wdisp10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
138
       void * data, asection *input_section, bfd *output_bfd,
139
       char **error_message ATTRIBUTE_UNUSED)
140
0
{
141
0
  bfd_vma relocation;
142
0
  bfd_vma insn;
143
0
  bfd_reloc_status_type status;
144
145
0
  status = init_insn_reloc (abfd, reloc_entry, symbol, data,
146
0
          input_section, output_bfd, &relocation, &insn);
147
0
  if (status != bfd_reloc_other)
148
0
    return status;
149
150
0
  insn &= ~ (bfd_vma) 0x181fe0;
151
0
  insn |= (((relocation >> 2) & 0x300) << 11)
152
0
    | (((relocation >> 2) & 0xff) << 5);
153
0
  bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
154
155
0
  if ((bfd_signed_vma) relocation < - 0x1000
156
0
      || (bfd_signed_vma) relocation > 0xfff)
157
0
    return bfd_reloc_overflow;
158
0
  else
159
0
    return bfd_reloc_ok;
160
0
}
161
162
/* Handle the HIX22 reloc.  */
163
164
static bfd_reloc_status_type
165
sparc_elf_hix22_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
166
           void * data, asection *input_section, bfd *output_bfd,
167
           char **error_message ATTRIBUTE_UNUSED)
168
0
{
169
0
  bfd_vma relocation;
170
0
  bfd_vma insn;
171
0
  bfd_reloc_status_type status;
172
173
0
  status = init_insn_reloc (abfd, reloc_entry, symbol, data,
174
0
          input_section, output_bfd, &relocation, &insn);
175
0
  if (status != bfd_reloc_other)
176
0
    return status;
177
178
0
  relocation ^= MINUS_ONE;
179
0
  insn = (insn &~ (bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
180
0
  bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
181
182
0
  if ((relocation & ~ (bfd_vma) 0xffffffff) != 0)
183
0
    return bfd_reloc_overflow;
184
0
  else
185
0
    return bfd_reloc_ok;
186
0
}
187
188
/* Handle the LOX10 reloc.  */
189
190
static bfd_reloc_status_type
191
sparc_elf_lox10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
192
           void * data, asection *input_section, bfd *output_bfd,
193
           char **error_message ATTRIBUTE_UNUSED)
194
0
{
195
0
  bfd_vma relocation;
196
0
  bfd_vma insn;
197
0
  bfd_reloc_status_type status;
198
199
0
  status = init_insn_reloc (abfd, reloc_entry, symbol, data,
200
0
          input_section, output_bfd, &relocation, &insn);
201
0
  if (status != bfd_reloc_other)
202
0
    return status;
203
204
0
  insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
205
0
  bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
206
207
0
  return bfd_reloc_ok;
208
0
}
209
210
static reloc_howto_type _bfd_sparc_elf_howto_table[] =
211
{
212
  HOWTO(R_SPARC_NONE,    0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",  false,0,0x00000000,true),
213
  HOWTO(R_SPARC_8,     0,1, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_8", false,0,0x000000ff,true),
214
  HOWTO(R_SPARC_16,    0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_16",  false,0,0x0000ffff,true),
215
  HOWTO(R_SPARC_32,    0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_32",  false,0,0xffffffff,true),
216
  HOWTO(R_SPARC_DISP8,     0,1, 8,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP8", false,0,0x000000ff,true),
217
  HOWTO(R_SPARC_DISP16,    0,2,16,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP16",  false,0,0x0000ffff,true),
218
  HOWTO(R_SPARC_DISP32,    0,4,32,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP32",  false,0,0xffffffff,true),
219
  HOWTO(R_SPARC_WDISP30,   2,4,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP30", false,0,0x3fffffff,true),
220
  HOWTO(R_SPARC_WDISP22,   2,4,22,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP22", false,0,0x003fffff,true),
221
  HOWTO(R_SPARC_HI22,   10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HI22",  false,0,0x003fffff,true),
222
  HOWTO(R_SPARC_22,    0,4,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_22",  false,0,0x003fffff,true),
223
  HOWTO(R_SPARC_13,    0,4,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_13",  false,0,0x00001fff,true),
224
  HOWTO(R_SPARC_LO10,    0,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LO10",  false,0,0x000003ff,true),
225
  HOWTO(R_SPARC_GOT10,     0,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT10", false,0,0x000003ff,true),
226
  HOWTO(R_SPARC_GOT13,     0,4,13,false,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_GOT13", false,0,0x00001fff,true),
227
  HOWTO(R_SPARC_GOT22,    10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT22", false,0,0x003fffff,true),
228
  HOWTO(R_SPARC_PC10,    0,4,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC10",  false,0,0x000003ff,true),
229
  HOWTO(R_SPARC_PC22,   10,4,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PC22",  false,0,0x003fffff,true),
230
  HOWTO(R_SPARC_WPLT30,    2,4,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WPLT30",  false,0,0x3fffffff,true),
231
  HOWTO(R_SPARC_COPY,    0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_COPY",  false,0,0x00000000,true),
232
  HOWTO(R_SPARC_GLOB_DAT,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GLOB_DAT",false,0,0x00000000,true),
233
  HOWTO(R_SPARC_JMP_SLOT,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_JMP_SLOT",false,0,0x00000000,true),
234
  HOWTO(R_SPARC_RELATIVE,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_RELATIVE",false,0,0x00000000,true),
235
  HOWTO(R_SPARC_UA32,    0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA32",  false,0,0xffffffff,true),
236
  HOWTO(R_SPARC_PLT32,     0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT32", false,0,0xffffffff,true),
237
  HOWTO(R_SPARC_HIPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_HIPLT22",  false,0,0x00000000,true),
238
  HOWTO(R_SPARC_LOPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_LOPLT10",  false,0,0x00000000,true),
239
  HOWTO(R_SPARC_PCPLT32,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT32",  false,0,0x00000000,true),
240
  HOWTO(R_SPARC_PCPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT22",  false,0,0x00000000,true),
241
  HOWTO(R_SPARC_PCPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT10",  false,0,0x00000000,true),
242
  HOWTO(R_SPARC_10,    0,4,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_10",  false,0,0x000003ff,true),
243
  HOWTO(R_SPARC_11,    0,4,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_11",  false,0,0x000007ff,true),
244
  HOWTO(R_SPARC_64,    0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_64",  false,0,MINUS_ONE, true),
245
  HOWTO(R_SPARC_OLO10,     0,4,13,false,0,complain_overflow_signed,  sparc_elf_notsup_reloc, "R_SPARC_OLO10", false,0,0x00001fff,true),
246
  HOWTO(R_SPARC_HH22,   42,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_HH22",  false,0,0x003fffff,true),
247
  HOWTO(R_SPARC_HM10,   32,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HM10",  false,0,0x000003ff,true),
248
  HOWTO(R_SPARC_LM22,   10,4,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LM22",  false,0,0x003fffff,true),
249
  HOWTO(R_SPARC_PC_HH22,  42,4,22,true, 0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_PC_HH22",    false,0,0x003fffff,true),
250
  HOWTO(R_SPARC_PC_HM10,  32,4,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_HM10",    false,0,0x000003ff,true),
251
  HOWTO(R_SPARC_PC_LM22,  10,4,22,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_LM22",    false,0,0x003fffff,true),
252
  HOWTO(R_SPARC_WDISP16,   2,4,16,true, 0,complain_overflow_signed,  sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true),
253
  HOWTO(R_SPARC_WDISP19,   2,4,19,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP19", false,0,0x0007ffff,true),
254
  HOWTO(R_SPARC_UNUSED_42, 0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_UNUSED_42",false,0,0x00000000,true),
255
  HOWTO(R_SPARC_7,     0,4, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_7", false,0,0x0000007f,true),
256
  HOWTO(R_SPARC_5,     0,4, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_5", false,0,0x0000001f,true),
257
  HOWTO(R_SPARC_6,     0,4, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_6", false,0,0x0000003f,true),
258
  HOWTO(R_SPARC_DISP64,    0,8,64,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP64",  false,0,MINUS_ONE, true),
259
  HOWTO(R_SPARC_PLT64,     0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT64", false,0,MINUS_ONE, true),
260
  HOWTO(R_SPARC_HIX22,     0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,  "R_SPARC_HIX22", false,0,MINUS_ONE, false),
261
  HOWTO(R_SPARC_LOX10,     0,8, 0,false,0,complain_overflow_dont,    sparc_elf_lox10_reloc,  "R_SPARC_LOX10", false,0,MINUS_ONE, false),
262
  HOWTO(R_SPARC_H44,    22,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_H44", false,0,0x003fffff,false),
263
  HOWTO(R_SPARC_M44,    12,4,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_M44", false,0,0x000003ff,false),
264
  HOWTO(R_SPARC_L44,     0,4,13,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_L44", false,0,0x00000fff,false),
265
  HOWTO(R_SPARC_REGISTER,  0,8, 0,false,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",false,0,MINUS_ONE, false),
266
  HOWTO(R_SPARC_UA64,    0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA64",      false,0,MINUS_ONE, true),
267
  HOWTO(R_SPARC_UA16,    0,2,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",      false,0,0x0000ffff,true),
268
  HOWTO(R_SPARC_TLS_GD_HI22,10,4,22,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_HI22",false,0,0x003fffff,true),
269
  HOWTO(R_SPARC_TLS_GD_LO10,0,4,10,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_LO10",false,0,0x000003ff,true),
270
  HOWTO(R_SPARC_TLS_GD_ADD,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_ADD",false,0,0x00000000,true),
271
  HOWTO(R_SPARC_TLS_GD_CALL,2,4,30,true,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_CALL",false,0,0x3fffffff,true),
272
  HOWTO(R_SPARC_TLS_LDM_HI22,10,4,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_HI22",false,0,0x003fffff,true),
273
  HOWTO(R_SPARC_TLS_LDM_LO10,0,4,10,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_LO10",false,0,0x000003ff,true),
274
  HOWTO(R_SPARC_TLS_LDM_ADD,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_ADD",false,0,0x00000000,true),
275
  HOWTO(R_SPARC_TLS_LDM_CALL,2,4,30,true,0,complain_overflow_signed, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_CALL",false,0,0x3fffffff,true),
276
  HOWTO(R_SPARC_TLS_LDO_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_TLS_LDO_HIX22",false,0,0x003fffff, false),
277
  HOWTO(R_SPARC_TLS_LDO_LOX10,0,4,0,false,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_TLS_LDO_LOX10",false,0,0x000003ff, false),
278
  HOWTO(R_SPARC_TLS_LDO_ADD,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDO_ADD",false,0,0x00000000,true),
279
  HOWTO(R_SPARC_TLS_IE_HI22,10,4,22,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_HI22",false,0,0x003fffff,true),
280
  HOWTO(R_SPARC_TLS_IE_LO10,0,4,10,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LO10",false,0,0x000003ff,true),
281
  HOWTO(R_SPARC_TLS_IE_LD,0,0, 0,false,0,complain_overflow_dont,     bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LD",false,0,0x00000000,true),
282
  HOWTO(R_SPARC_TLS_IE_LDX,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LDX",false,0,0x00000000,true),
283
  HOWTO(R_SPARC_TLS_IE_ADD,0,0, 0,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_ADD",false,0,0x00000000,true),
284
  HOWTO(R_SPARC_TLS_LE_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_TLS_LE_HIX22",false,0,0x003fffff, false),
285
  HOWTO(R_SPARC_TLS_LE_LOX10,0,4,0,false,0,complain_overflow_dont,   sparc_elf_lox10_reloc,  "R_SPARC_TLS_LE_LOX10",false,0,0x000003ff, false),
286
  HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD32",false,0,0x00000000,true),
287
  HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,false,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD64",false,0,0x00000000,true),
288
  HOWTO(R_SPARC_TLS_DTPOFF32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",false,0,0xffffffff,true),
289
  HOWTO(R_SPARC_TLS_DTPOFF64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",false,0,MINUS_ONE,true),
290
  HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF32",false,0,0x00000000,true),
291
  HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF64",false,0,0x00000000,true),
292
  HOWTO(R_SPARC_GOTDATA_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_HIX22",false,0,0x003fffff, false),
293
  HOWTO(R_SPARC_GOTDATA_LOX10,0,4,0,false,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_GOTDATA_LOX10",false,0,0x000003ff, false),
294
  HOWTO(R_SPARC_GOTDATA_OP_HIX22,0,4,0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_OP_HIX22",false,0,0x003fffff, false),
295
  HOWTO(R_SPARC_GOTDATA_OP_LOX10,0,4,0,false,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_GOTDATA_OP_LOX10",false,0,0x000003ff, false),
296
  HOWTO(R_SPARC_GOTDATA_OP,0,0, 0,false,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_GOTDATA_OP",false,0,0x00000000,true),
297
  HOWTO(R_SPARC_H34,12,4,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,"R_SPARC_H34",false,0,0x003fffff,false),
298
  HOWTO(R_SPARC_SIZE32,0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE32",false,0,0xffffffff,true),
299
  HOWTO(R_SPARC_SIZE64,0,8,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE64",false,0,MINUS_ONE, true),
300
  HOWTO(R_SPARC_WDISP10,2,4,10,true, 0,complain_overflow_signed,sparc_elf_wdisp10_reloc,"R_SPARC_WDISP10",false,0,0x00000000,true),
301
};
302
static reloc_howto_type sparc_jmp_irel_howto =
303
  HOWTO(R_SPARC_JMP_IREL,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_JMP_IREL",false,0,0x00000000,true);
304
static reloc_howto_type sparc_irelative_howto =
305
  HOWTO(R_SPARC_IRELATIVE,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_IRELATIVE",false,0,0x00000000,true);
306
static reloc_howto_type sparc_vtinherit_howto =
307
  HOWTO (R_SPARC_GNU_VTINHERIT, 0,4,0,false,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", false,0, 0, false);
308
static reloc_howto_type sparc_vtentry_howto =
309
  HOWTO (R_SPARC_GNU_VTENTRY, 0,4,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", false,0,0, false);
310
static reloc_howto_type sparc_rev32_howto =
311
  HOWTO(R_SPARC_REV32, 0,4,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", false,0,0xffffffff,true);
312
313
reloc_howto_type *
314
_bfd_sparc_elf_reloc_type_lookup (bfd *abfd,
315
          bfd_reloc_code_real_type code)
316
0
{
317
  /* We explicitly handle each relocation type in the switch
318
     instead of using a lookup table for efficiency.  */
319
0
  switch (code)
320
0
    {
321
0
    case BFD_RELOC_NONE:
322
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_NONE];
323
324
0
    case BFD_RELOC_8:
325
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_8];
326
327
0
    case BFD_RELOC_16:
328
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_16];
329
330
0
    case BFD_RELOC_32:
331
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_32];
332
333
0
    case BFD_RELOC_8_PCREL:
334
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_DISP8];
335
336
0
    case BFD_RELOC_16_PCREL:
337
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_DISP16];
338
339
0
    case BFD_RELOC_32_PCREL:
340
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_DISP32];
341
342
0
    case BFD_RELOC_32_PCREL_S2:
343
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP30];
344
345
0
    case BFD_RELOC_SPARC_WDISP22:
346
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP22];
347
348
0
    case BFD_RELOC_HI22:
349
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_HI22];
350
351
0
    case BFD_RELOC_SPARC22:
352
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_22];
353
354
0
    case BFD_RELOC_SPARC13:
355
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_13];
356
357
0
    case BFD_RELOC_LO10:
358
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_LO10];
359
360
0
    case BFD_RELOC_SPARC_GOT10:
361
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOT10];
362
363
0
    case BFD_RELOC_SPARC_GOT13:
364
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOT13];
365
366
0
    case BFD_RELOC_SPARC_GOT22:
367
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOT22];
368
369
0
    case BFD_RELOC_SPARC_PC10:
370
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PC10];
371
372
0
    case BFD_RELOC_SPARC_PC22:
373
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PC22];
374
375
0
    case BFD_RELOC_SPARC_WPLT30:
376
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WPLT30];
377
378
0
    case BFD_RELOC_SPARC_COPY:
379
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_COPY];
380
381
0
    case BFD_RELOC_SPARC_GLOB_DAT:
382
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GLOB_DAT];
383
384
0
    case BFD_RELOC_SPARC_JMP_SLOT:
385
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_JMP_SLOT];
386
387
0
    case BFD_RELOC_SPARC_RELATIVE:
388
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_RELATIVE];
389
390
0
    case BFD_RELOC_SPARC_UA32:
391
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_UA32];
392
393
0
    case BFD_RELOC_SPARC_PLT32:
394
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PLT32];
395
396
0
    case BFD_RELOC_SPARC_10:
397
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_10];
398
399
0
    case BFD_RELOC_SPARC_11:
400
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_11];
401
402
0
    case BFD_RELOC_SPARC_64:
403
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_64];
404
405
0
    case BFD_RELOC_SPARC_OLO10:
406
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_OLO10];
407
408
0
    case BFD_RELOC_SPARC_HH22:
409
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_HH22];
410
411
0
    case BFD_RELOC_SPARC_HM10:
412
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_HM10];
413
414
0
    case BFD_RELOC_SPARC_LM22:
415
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_LM22];
416
417
0
    case BFD_RELOC_SPARC_PC_HH22:
418
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HH22];
419
420
0
    case BFD_RELOC_SPARC_PC_HM10:
421
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HM10];
422
423
0
    case BFD_RELOC_SPARC_PC_LM22:
424
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PC_LM22];
425
426
0
    case BFD_RELOC_SPARC_WDISP16:
427
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP16];
428
429
0
    case BFD_RELOC_SPARC_WDISP19:
430
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP19];
431
432
0
    case BFD_RELOC_SPARC_7:
433
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_7];
434
435
0
    case BFD_RELOC_SPARC_5:
436
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_5];
437
438
0
    case BFD_RELOC_SPARC_6:
439
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_6];
440
441
0
    case BFD_RELOC_SPARC_DISP64:
442
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_DISP64];
443
444
0
    case BFD_RELOC_SPARC_PLT64:
445
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_PLT64];
446
447
0
    case BFD_RELOC_SPARC_HIX22:
448
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_HIX22];
449
450
0
    case BFD_RELOC_SPARC_LOX10:
451
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_LOX10];
452
453
0
    case BFD_RELOC_SPARC_H44:
454
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_H44];
455
456
0
    case BFD_RELOC_SPARC_M44:
457
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_M44];
458
459
0
    case BFD_RELOC_SPARC_L44:
460
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_L44];
461
462
0
    case BFD_RELOC_SPARC_REGISTER:
463
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_REGISTER];
464
465
0
    case BFD_RELOC_SPARC_UA64:
466
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_UA64];
467
468
0
    case BFD_RELOC_SPARC_UA16:
469
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_UA16];
470
471
0
    case BFD_RELOC_SPARC_TLS_GD_HI22:
472
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_HI22];
473
474
0
    case BFD_RELOC_SPARC_TLS_GD_LO10:
475
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_LO10];
476
477
0
    case BFD_RELOC_SPARC_TLS_GD_ADD:
478
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_ADD];
479
480
0
    case BFD_RELOC_SPARC_TLS_GD_CALL:
481
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_CALL];
482
483
0
    case BFD_RELOC_SPARC_TLS_LDM_HI22:
484
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_HI22];
485
486
0
    case BFD_RELOC_SPARC_TLS_LDM_LO10:
487
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_LO10];
488
489
0
    case BFD_RELOC_SPARC_TLS_LDM_ADD:
490
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_ADD];
491
492
0
    case BFD_RELOC_SPARC_TLS_LDM_CALL:
493
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_CALL];
494
495
0
    case BFD_RELOC_SPARC_TLS_LDO_HIX22:
496
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_HIX22];
497
498
0
    case BFD_RELOC_SPARC_TLS_LDO_LOX10:
499
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_LOX10];
500
501
0
    case BFD_RELOC_SPARC_TLS_LDO_ADD:
502
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_ADD];
503
504
0
    case BFD_RELOC_SPARC_TLS_IE_HI22:
505
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_HI22];
506
507
0
    case BFD_RELOC_SPARC_TLS_IE_LO10:
508
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LO10];
509
510
0
    case BFD_RELOC_SPARC_TLS_IE_LD:
511
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LD];
512
513
0
    case BFD_RELOC_SPARC_TLS_IE_LDX:
514
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LDX];
515
516
0
    case BFD_RELOC_SPARC_TLS_IE_ADD:
517
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_ADD];
518
519
0
    case BFD_RELOC_SPARC_TLS_LE_HIX22:
520
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_HIX22];
521
522
0
    case BFD_RELOC_SPARC_TLS_LE_LOX10:
523
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_LOX10];
524
525
0
    case BFD_RELOC_SPARC_TLS_DTPMOD32:
526
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD32];
527
528
0
    case BFD_RELOC_SPARC_TLS_DTPMOD64:
529
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD64];
530
531
0
    case BFD_RELOC_SPARC_TLS_DTPOFF32:
532
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF32];
533
534
0
    case BFD_RELOC_SPARC_TLS_DTPOFF64:
535
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF64];
536
537
0
    case BFD_RELOC_SPARC_TLS_TPOFF32:
538
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF32];
539
540
0
    case BFD_RELOC_SPARC_TLS_TPOFF64:
541
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF64];
542
543
0
    case BFD_RELOC_SPARC_GOTDATA_HIX22:
544
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_HIX22];
545
546
0
    case BFD_RELOC_SPARC_GOTDATA_LOX10:
547
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_LOX10];
548
549
0
    case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
550
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_HIX22];
551
552
0
    case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
553
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_LOX10];
554
555
0
    case BFD_RELOC_SPARC_GOTDATA_OP:
556
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP];
557
558
0
    case BFD_RELOC_SPARC_H34:
559
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_H34];
560
561
0
    case BFD_RELOC_SPARC_SIZE32:
562
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE32];
563
564
0
    case BFD_RELOC_SPARC_SIZE64:
565
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE64];
566
567
0
    case BFD_RELOC_SPARC_WDISP10:
568
0
      return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP10];
569
570
0
    case BFD_RELOC_SPARC_JMP_IREL:
571
0
      return &sparc_jmp_irel_howto;
572
573
0
    case BFD_RELOC_SPARC_IRELATIVE:
574
0
      return &sparc_irelative_howto;
575
576
0
    case BFD_RELOC_VTABLE_INHERIT:
577
0
      return &sparc_vtinherit_howto;
578
579
0
    case BFD_RELOC_VTABLE_ENTRY:
580
0
      return &sparc_vtentry_howto;
581
582
0
    case BFD_RELOC_SPARC_REV32:
583
0
      return &sparc_rev32_howto;
584
585
0
    default:
586
0
      break;
587
0
    }
588
  /* xgettext:c-format */
589
0
  _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
590
0
  bfd_set_error (bfd_error_bad_value);
591
0
  return NULL;
592
0
}
593
594
reloc_howto_type *
595
_bfd_sparc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
596
          const char *r_name)
597
0
{
598
0
  unsigned int i;
599
600
0
  for (i = 0; i < ARRAY_SIZE (_bfd_sparc_elf_howto_table); i++)
601
0
    if (_bfd_sparc_elf_howto_table[i].name != NULL
602
0
  && strcasecmp (_bfd_sparc_elf_howto_table[i].name, r_name) == 0)
603
0
      return &_bfd_sparc_elf_howto_table[i];
604
605
0
  if (strcasecmp (sparc_vtinherit_howto.name, r_name) == 0)
606
0
    return &sparc_vtinherit_howto;
607
0
  if (strcasecmp (sparc_vtentry_howto.name, r_name) == 0)
608
0
    return &sparc_vtentry_howto;
609
0
  if (strcasecmp (sparc_rev32_howto.name, r_name) == 0)
610
0
    return &sparc_rev32_howto;
611
612
0
  return NULL;
613
0
}
614
615
reloc_howto_type *
616
_bfd_sparc_elf_info_to_howto_ptr (bfd *abfd ATTRIBUTE_UNUSED,
617
          unsigned int r_type)
618
0
{
619
0
  switch (r_type)
620
0
    {
621
0
    case R_SPARC_JMP_IREL:
622
0
      return &sparc_jmp_irel_howto;
623
624
0
    case R_SPARC_IRELATIVE:
625
0
      return &sparc_irelative_howto;
626
627
0
    case R_SPARC_GNU_VTINHERIT:
628
0
      return &sparc_vtinherit_howto;
629
630
0
    case R_SPARC_GNU_VTENTRY:
631
0
      return &sparc_vtentry_howto;
632
633
0
    case R_SPARC_REV32:
634
0
      return &sparc_rev32_howto;
635
636
0
    default:
637
0
      if (r_type >= (unsigned int) R_SPARC_max_std)
638
0
  {
639
0
    _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
640
0
            abfd, r_type);
641
0
    bfd_set_error (bfd_error_bad_value);
642
0
    return NULL;
643
0
  }
644
0
      return &_bfd_sparc_elf_howto_table[r_type];
645
0
    }
646
0
}
647
648
/* Both 32-bit and 64-bit sparc encode this in an identical manner,
649
   so just take advantage of that.  */
650
#define SPARC_ELF_R_TYPE(r_info)  \
651
0
  ((r_info) & 0xff)
652
653
bool
654
_bfd_sparc_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
655
            Elf_Internal_Rela *dst)
656
0
{
657
0
  unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
658
659
0
  if ((cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type)) == NULL)
660
0
    {
661
0
      bfd_set_error (bfd_error_bad_value);
662
0
      return false;
663
0
    }
664
0
  return true;
665
0
}
666

667
668
/* The nop opcode we use.  */
669
0
#define SPARC_NOP 0x01000000
670
671
0
#define SPARC_INSN_BYTES  4
672
673
/* Is an undefined weak symbol resolved to 0 ?
674
   Reference to an undefined weak symbol is resolved to 0 when
675
   building an executable if it isn't dynamic and
676
   1. Has non-GOT/non-PLT relocations in text section.
677
   Or
678
   2. Has no GOT/PLT relocation.  */
679
#define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH)   \
680
0
  ((EH)->elf.root.type == bfd_link_hash_undefweak    \
681
0
   && bfd_link_executable (INFO)       \
682
0
   && (_bfd_sparc_elf_hash_table (INFO)->interp == NULL    \
683
0
       || !(INFO)->dynamic_undefined_weak      \
684
0
       || (EH)->has_non_got_reloc        \
685
0
       || !(EH)->has_got_reloc))
686
687
/* SPARC ELF linker hash entry.  */
688
689
struct _bfd_sparc_elf_link_hash_entry
690
{
691
  struct elf_link_hash_entry elf;
692
693
0
#define GOT_UNKNOWN     0
694
0
#define GOT_NORMAL      1
695
0
#define GOT_TLS_GD      2
696
0
#define GOT_TLS_IE      3
697
  unsigned char tls_type;
698
699
  /* Symbol has GOT or PLT relocations.  */
700
  unsigned int has_got_reloc : 1;
701
702
  /* Symbol has old-style, non-relaxable GOT relocations.  */
703
  unsigned int has_old_style_got_reloc : 1;
704
705
  /* Symbol has non-GOT/non-PLT relocations in text sections.  */
706
  unsigned int has_non_got_reloc : 1;
707
708
};
709
710
0
#define _bfd_sparc_elf_hash_entry(ent) ((struct _bfd_sparc_elf_link_hash_entry *)(ent))
711
712
struct _bfd_sparc_elf_obj_tdata
713
{
714
  struct elf_obj_tdata root;
715
716
  /* tls_type for each local got entry.  */
717
  char *local_got_tls_type;
718
719
  /* TRUE if TLS GD relocs has been seen for this object.  */
720
  bool has_tlsgd;
721
};
722
723
#define _bfd_sparc_elf_tdata(abfd) \
724
0
  ((struct _bfd_sparc_elf_obj_tdata *) (abfd)->tdata.any)
725
726
#define _bfd_sparc_elf_local_got_tls_type(abfd) \
727
0
  (_bfd_sparc_elf_tdata (abfd)->local_got_tls_type)
728
729
#define is_sparc_elf(bfd)       \
730
0
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour  \
731
0
   && elf_tdata (bfd) != NULL        \
732
0
   && elf_object_id (bfd) == SPARC_ELF_DATA)
733
734
bool
735
_bfd_sparc_elf_mkobject (bfd *abfd)
736
166
{
737
166
  return bfd_elf_allocate_object (abfd, sizeof (struct _bfd_sparc_elf_obj_tdata),
738
166
          SPARC_ELF_DATA);
739
166
}
740
741
static void
742
sparc_put_word_32 (bfd *abfd, bfd_vma val, void *ptr)
743
0
{
744
0
  bfd_put_32 (abfd, val, ptr);
745
0
}
746
747
static void
748
sparc_put_word_64 (bfd *abfd, bfd_vma val, void *ptr)
749
0
{
750
0
  bfd_put_64 (abfd, val, ptr);
751
0
}
752
753
static void
754
sparc_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
755
0
{
756
0
  const struct elf_backend_data *bed;
757
0
  bfd_byte *loc;
758
759
0
  bed = get_elf_backend_data (abfd);
760
0
  BFD_ASSERT (s->reloc_count * bed->s->sizeof_rela < s->size);
761
0
  loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
762
0
  bed->s->swap_reloca_out (abfd, rel, loc);
763
0
}
764
765
static bfd_vma
766
sparc_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
767
         bfd_vma rel_index ATTRIBUTE_UNUSED,
768
         bfd_vma type ATTRIBUTE_UNUSED)
769
0
{
770
0
  return ELF64_R_INFO (rel_index,
771
0
           (in_rel ?
772
0
      ELF64_R_TYPE_INFO (ELF64_R_TYPE_DATA (in_rel->r_info),
773
0
             type) : type));
774
0
}
775
776
static bfd_vma
777
sparc_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
778
         bfd_vma rel_index, bfd_vma type)
779
0
{
780
0
  return ELF32_R_INFO (rel_index, type);
781
0
}
782
783
static bfd_vma
784
sparc_elf_r_symndx_64 (bfd_vma r_info)
785
0
{
786
0
  bfd_vma r_symndx = ELF32_R_SYM (r_info);
787
0
  return (r_symndx >> 24);
788
0
}
789
790
static bfd_vma
791
sparc_elf_r_symndx_32 (bfd_vma r_info)
792
0
{
793
0
  return ELF32_R_SYM (r_info);
794
0
}
795
796
/* PLT/GOT stuff */
797
798
0
#define PLT32_ENTRY_SIZE 12
799
0
#define PLT32_HEADER_SIZE (4 * PLT32_ENTRY_SIZE)
800
801
/* The first four entries in a 32-bit procedure linkage table are reserved,
802
   and the initial contents are unimportant (we zero them out).
803
   Subsequent entries look like this.  See the SVR4 ABI SPARC
804
   supplement to see how this works.  */
805
806
/* sethi %hi(.-.plt0),%g1.  We fill in the address later.  */
807
#define PLT32_ENTRY_WORD0 0x03000000
808
/* b,a .plt0.  We fill in the offset later.  */
809
#define PLT32_ENTRY_WORD1 0x30800000
810
/* nop.  */
811
#define PLT32_ENTRY_WORD2 SPARC_NOP
812
813
static int
814
sparc32_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
815
       bfd_vma max ATTRIBUTE_UNUSED,
816
       bfd_vma *r_offset)
817
0
{
818
0
      bfd_put_32 (output_bfd,
819
0
      PLT32_ENTRY_WORD0 + offset,
820
0
      splt->contents + offset);
821
0
      bfd_put_32 (output_bfd,
822
0
      (PLT32_ENTRY_WORD1
823
0
       + (((- (offset + 4)) >> 2) & 0x3fffff)),
824
0
      splt->contents + offset + 4);
825
0
      bfd_put_32 (output_bfd, (bfd_vma) PLT32_ENTRY_WORD2,
826
0
      splt->contents + offset + 8);
827
828
0
      *r_offset = offset;
829
830
0
      return offset / PLT32_ENTRY_SIZE - 4;
831
0
}
832
833
/* Both the headers and the entries are icache aligned.  */
834
0
#define PLT64_ENTRY_SIZE  32
835
0
#define PLT64_HEADER_SIZE (4 * PLT64_ENTRY_SIZE)
836
0
#define PLT64_LARGE_THRESHOLD 32768
837
838
static int
839
sparc64_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
840
       bfd_vma max, bfd_vma *r_offset)
841
0
{
842
0
  unsigned char *entry = splt->contents + offset;
843
0
  const unsigned int nop = SPARC_NOP;
844
0
  int plt_index;
845
846
0
  if (offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
847
0
    {
848
0
      unsigned int sethi, ba;
849
850
0
      *r_offset = offset;
851
852
0
      plt_index = (offset / PLT64_ENTRY_SIZE);
853
854
0
      sethi = 0x03000000 | (plt_index * PLT64_ENTRY_SIZE);
855
0
      ba = 0x30680000
856
0
  | (((splt->contents + PLT64_ENTRY_SIZE) - (entry + 4)) / 4 & 0x7ffff);
857
858
0
      bfd_put_32 (output_bfd, (bfd_vma) sethi, entry);
859
0
      bfd_put_32 (output_bfd, (bfd_vma) ba,    entry + 4);
860
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 8);
861
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 12);
862
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 16);
863
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 20);
864
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 24);
865
0
      bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 28);
866
0
    }
867
0
  else
868
0
    {
869
0
      unsigned char *ptr;
870
0
      unsigned int ldx;
871
0
      int block, last_block, ofs, last_ofs, chunks_this_block;
872
0
      const int insn_chunk_size = (6 * 4);
873
0
      const int ptr_chunk_size = (1 * 8);
874
0
      const int entries_per_block = 160;
875
0
      const int block_size = entries_per_block * (insn_chunk_size
876
0
              + ptr_chunk_size);
877
878
      /* Entries 32768 and higher are grouped into blocks of 160.
879
   The blocks are further subdivided into 160 sequences of
880
   6 instructions and 160 pointers.  If a block does not require
881
   the full 160 entries, let's say it requires N, then there
882
   will be N sequences of 6 instructions and N pointers.  */
883
884
0
      offset -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
885
0
      max -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
886
887
0
      block = offset / block_size;
888
0
      last_block = max / block_size;
889
0
      if (block != last_block)
890
0
  {
891
0
    chunks_this_block = 160;
892
0
  }
893
0
      else
894
0
  {
895
0
    last_ofs = max % block_size;
896
0
    chunks_this_block = last_ofs / (insn_chunk_size + ptr_chunk_size);
897
0
  }
898
899
0
      ofs = offset % block_size;
900
901
0
      plt_index = (PLT64_LARGE_THRESHOLD +
902
0
         (block * 160) +
903
0
         (ofs / insn_chunk_size));
904
905
0
      ptr = splt->contents
906
0
  + (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
907
0
  + (block * block_size)
908
0
  + (chunks_this_block * insn_chunk_size)
909
0
  + (ofs / insn_chunk_size) * ptr_chunk_size;
910
911
0
      *r_offset = (bfd_vma) (ptr - splt->contents);
912
913
0
      ldx = 0xc25be000 | ((ptr - (entry+4)) & 0x1fff);
914
915
      /* mov %o7,%g5
916
   call .+8
917
   nop
918
   ldx [%o7+P],%g1
919
   jmpl %o7+%g1,%g1
920
   mov %g5,%o7  */
921
0
      bfd_put_32 (output_bfd, (bfd_vma) 0x8a10000f, entry);
922
0
      bfd_put_32 (output_bfd, (bfd_vma) 0x40000002, entry + 4);
923
0
      bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,  entry + 8);
924
0
      bfd_put_32 (output_bfd, (bfd_vma) ldx,      entry + 12);
925
0
      bfd_put_32 (output_bfd, (bfd_vma) 0x83c3c001, entry + 16);
926
0
      bfd_put_32 (output_bfd, (bfd_vma) 0x9e100005, entry + 20);
927
928
0
      bfd_put_64 (output_bfd, (bfd_vma) (splt->contents - (entry + 4)), ptr);
929
0
    }
930
931
0
  return plt_index - 4;
932
0
}
933
934
/* The format of the first PLT entry in a VxWorks executable.  */
935
static const bfd_vma sparc_vxworks_exec_plt0_entry[] =
936
  {
937
    0x05000000, /* sethi  %hi(_GLOBAL_OFFSET_TABLE_+8), %g2 */
938
    0x8410a000, /* or     %g2, %lo(_GLOBAL_OFFSET_TABLE_+8), %g2 */
939
    0xc4008000, /* ld     [ %g2 ], %g2 */
940
    0x81c08000, /* jmp    %g2 */
941
    0x01000000  /* nop */
942
  };
943
944
/* The format of subsequent PLT entries.  */
945
static const bfd_vma sparc_vxworks_exec_plt_entry[] =
946
  {
947
    0x03000000, /* sethi  %hi(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
948
    0x82106000, /* or     %g1, %lo(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
949
    0xc2004000, /* ld     [ %g1 ], %g1 */
950
    0x81c04000, /* jmp    %g1 */
951
    0x01000000, /* nop */
952
    0x03000000, /* sethi  %hi(f@pltindex), %g1 */
953
    0x10800000, /* b      _PLT_resolve */
954
    0x82106000  /* or     %g1, %lo(f@pltindex), %g1 */
955
  };
956
957
/* The format of the first PLT entry in a VxWorks shared object.  */
958
static const bfd_vma sparc_vxworks_shared_plt0_entry[] =
959
  {
960
    0xc405e008, /* ld     [ %l7 + 8 ], %g2 */
961
    0x81c08000, /* jmp    %g2 */
962
    0x01000000  /* nop */
963
  };
964
965
/* The format of subsequent PLT entries.  */
966
static const bfd_vma sparc_vxworks_shared_plt_entry[] =
967
  {
968
    0x03000000, /* sethi  %hi(f@got), %g1 */
969
    0x82106000, /* or     %g1, %lo(f@got), %g1 */
970
    0xc205c001, /* ld     [ %l7 + %g1 ], %g1 */
971
    0x81c04000, /* jmp    %g1 */
972
    0x01000000, /* nop */
973
    0x03000000, /* sethi  %hi(f@pltindex), %g1 */
974
    0x10800000, /* b      _PLT_resolve */
975
    0x82106000  /* or     %g1, %lo(f@pltindex), %g1 */
976
  };
977
978
#define SPARC_ELF_PUT_WORD(htab, bfd, val, ptr) \
979
0
  htab->put_word(bfd, val, ptr)
980
981
#define SPARC_ELF_R_INFO(htab, in_rel, index, type) \
982
0
  htab->r_info(in_rel, index, type)
983
984
#define SPARC_ELF_R_SYMNDX(htab, r_info)  \
985
0
  htab->r_symndx(r_info)
986
987
#define SPARC_ELF_WORD_BYTES(htab)  \
988
0
  htab->bytes_per_word
989
990
#define SPARC_ELF_RELA_BYTES(htab)  \
991
0
  htab->bytes_per_rela
992
993
#define SPARC_ELF_DTPOFF_RELOC(htab)  \
994
  htab->dtpoff_reloc
995
996
#define SPARC_ELF_DTPMOD_RELOC(htab)  \
997
0
  htab->dtpmod_reloc
998
999
#define SPARC_ELF_TPOFF_RELOC(htab) \
1000
0
  htab->tpoff_reloc
1001
1002
#define SPARC_ELF_BUILD_PLT_ENTRY(htab, obfd, splt, off, max, r_off) \
1003
0
  htab->build_plt_entry (obfd, splt, off, max, r_off)
1004
1005
/* Create an entry in an SPARC ELF linker hash table.  */
1006
1007
static struct bfd_hash_entry *
1008
link_hash_newfunc (struct bfd_hash_entry *entry,
1009
       struct bfd_hash_table *table, const char *string)
1010
0
{
1011
  /* Allocate the structure if it has not already been allocated by a
1012
     subclass.  */
1013
0
  if (entry == NULL)
1014
0
    {
1015
0
      entry = bfd_hash_allocate (table,
1016
0
         sizeof (struct _bfd_sparc_elf_link_hash_entry));
1017
0
      if (entry == NULL)
1018
0
  return entry;
1019
0
    }
1020
1021
  /* Call the allocation method of the superclass.  */
1022
0
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1023
0
  if (entry != NULL)
1024
0
    {
1025
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
1026
1027
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) entry;
1028
0
      eh->tls_type = GOT_UNKNOWN;
1029
0
      eh->has_got_reloc = 0;
1030
0
      eh->has_non_got_reloc = 0;
1031
0
    }
1032
1033
0
  return entry;
1034
0
}
1035
1036
/* The name of the dynamic interpreter.  This is put in the .interp
1037
   section.  */
1038
1039
0
#define ELF32_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1040
0
#define ELF64_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1"
1041
1042
/* Compute a hash of a local hash entry.  We use elf_link_hash_entry
1043
   for local symbol so that we can handle local STT_GNU_IFUNC symbols
1044
   as global symbol.  We reuse indx and dynstr_index for local symbol
1045
   hash since they aren't used by global symbols in this backend.  */
1046
1047
static hashval_t
1048
elf_sparc_local_htab_hash (const void *ptr)
1049
0
{
1050
0
  struct elf_link_hash_entry *h
1051
0
    = (struct elf_link_hash_entry *) ptr;
1052
0
  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
1053
0
}
1054
1055
/* Compare local hash entries.  */
1056
1057
static int
1058
elf_sparc_local_htab_eq (const void *ptr1, const void *ptr2)
1059
0
{
1060
0
  struct elf_link_hash_entry *h1
1061
0
     = (struct elf_link_hash_entry *) ptr1;
1062
0
  struct elf_link_hash_entry *h2
1063
0
    = (struct elf_link_hash_entry *) ptr2;
1064
1065
0
  return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
1066
0
}
1067
1068
/* Find and/or create a hash entry for local symbol.  */
1069
1070
static struct elf_link_hash_entry *
1071
elf_sparc_get_local_sym_hash (struct _bfd_sparc_elf_link_hash_table *htab,
1072
            bfd *abfd, const Elf_Internal_Rela *rel,
1073
            bool create)
1074
0
{
1075
0
  struct _bfd_sparc_elf_link_hash_entry e, *ret;
1076
0
  asection *sec = abfd->sections;
1077
0
  unsigned long r_symndx;
1078
0
  hashval_t h;
1079
0
  void **slot;
1080
1081
0
  r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1082
0
  h = ELF_LOCAL_SYMBOL_HASH (sec->id, r_symndx);
1083
1084
0
  e.elf.indx = sec->id;
1085
0
  e.elf.dynstr_index = r_symndx;
1086
0
  slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
1087
0
           create ? INSERT : NO_INSERT);
1088
1089
0
  if (!slot)
1090
0
    return NULL;
1091
1092
0
  if (*slot)
1093
0
    {
1094
0
      ret = (struct _bfd_sparc_elf_link_hash_entry *) *slot;
1095
0
      return &ret->elf;
1096
0
    }
1097
1098
0
  ret = (struct _bfd_sparc_elf_link_hash_entry *)
1099
0
  objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
1100
0
      sizeof (struct _bfd_sparc_elf_link_hash_entry));
1101
0
  if (ret)
1102
0
    {
1103
0
      memset (ret, 0, sizeof (*ret));
1104
0
      ret->elf.indx = sec->id;
1105
0
      ret->elf.dynstr_index = r_symndx;
1106
0
      ret->elf.dynindx = -1;
1107
0
      ret->elf.plt.offset = (bfd_vma) -1;
1108
0
      ret->elf.got.offset = (bfd_vma) -1;
1109
0
      *slot = ret;
1110
0
    }
1111
0
  return &ret->elf;
1112
0
}
1113
1114
/* Destroy a SPARC ELF linker hash table.  */
1115
1116
static void
1117
_bfd_sparc_elf_link_hash_table_free (bfd *obfd)
1118
0
{
1119
0
  struct _bfd_sparc_elf_link_hash_table *htab
1120
0
    = (struct _bfd_sparc_elf_link_hash_table *) obfd->link.hash;
1121
1122
0
  if (htab->loc_hash_table)
1123
0
    htab_delete (htab->loc_hash_table);
1124
0
  if (htab->loc_hash_memory)
1125
0
    objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1126
0
  _bfd_elf_link_hash_table_free (obfd);
1127
0
}
1128
1129
/* Create a SPARC ELF linker hash table.  */
1130
1131
struct bfd_link_hash_table *
1132
_bfd_sparc_elf_link_hash_table_create (bfd *abfd)
1133
0
{
1134
0
  struct _bfd_sparc_elf_link_hash_table *ret;
1135
0
  size_t amt = sizeof (struct _bfd_sparc_elf_link_hash_table);
1136
1137
0
  ret = (struct _bfd_sparc_elf_link_hash_table *) bfd_zmalloc (amt);
1138
0
  if (ret == NULL)
1139
0
    return NULL;
1140
1141
0
  if (ABI_64_P (abfd))
1142
0
    {
1143
0
      ret->put_word = sparc_put_word_64;
1144
0
      ret->r_info = sparc_elf_r_info_64;
1145
0
      ret->r_symndx = sparc_elf_r_symndx_64;
1146
0
      ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF64;
1147
0
      ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD64;
1148
0
      ret->tpoff_reloc = R_SPARC_TLS_TPOFF64;
1149
0
      ret->word_align_power = 3;
1150
0
      ret->align_power_max = 4;
1151
0
      ret->bytes_per_word = 8;
1152
0
      ret->bytes_per_rela = sizeof (Elf64_External_Rela);
1153
0
      ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1154
0
      ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1155
1156
0
      ret->build_plt_entry = sparc64_plt_entry_build;
1157
0
      ret->plt_header_size = PLT64_HEADER_SIZE;
1158
0
      ret->plt_entry_size = PLT64_ENTRY_SIZE;
1159
0
    }
1160
0
  else
1161
0
    {
1162
0
      ret->put_word = sparc_put_word_32;
1163
0
      ret->r_info = sparc_elf_r_info_32;
1164
0
      ret->r_symndx = sparc_elf_r_symndx_32;
1165
0
      ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF32;
1166
0
      ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD32;
1167
0
      ret->tpoff_reloc = R_SPARC_TLS_TPOFF32;
1168
0
      ret->word_align_power = 2;
1169
0
      ret->align_power_max = 3;
1170
0
      ret->bytes_per_word = 4;
1171
0
      ret->bytes_per_rela = sizeof (Elf32_External_Rela);
1172
0
      ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1173
0
      ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1174
1175
0
      ret->build_plt_entry = sparc32_plt_entry_build;
1176
0
      ret->plt_header_size = PLT32_HEADER_SIZE;
1177
0
      ret->plt_entry_size = PLT32_ENTRY_SIZE;
1178
0
    }
1179
1180
0
  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
1181
0
              sizeof (struct _bfd_sparc_elf_link_hash_entry),
1182
0
              SPARC_ELF_DATA))
1183
0
    {
1184
0
      free (ret);
1185
0
      return NULL;
1186
0
    }
1187
1188
0
  ret->loc_hash_table = htab_try_create (1024,
1189
0
           elf_sparc_local_htab_hash,
1190
0
           elf_sparc_local_htab_eq,
1191
0
           NULL);
1192
0
  ret->loc_hash_memory = objalloc_create ();
1193
0
  if (!ret->loc_hash_table || !ret->loc_hash_memory)
1194
0
    {
1195
0
      _bfd_sparc_elf_link_hash_table_free (abfd);
1196
0
      return NULL;
1197
0
    }
1198
0
  ret->elf.root.hash_table_free = _bfd_sparc_elf_link_hash_table_free;
1199
1200
0
  return &ret->elf.root;
1201
0
}
1202
1203
/* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
1204
   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1205
   hash table.  */
1206
1207
bool
1208
_bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
1209
          struct bfd_link_info *info)
1210
0
{
1211
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1212
1213
0
  htab = _bfd_sparc_elf_hash_table (info);
1214
0
  BFD_ASSERT (htab != NULL);
1215
1216
0
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1217
0
    return false;
1218
1219
0
  if (htab->elf.target_os == is_vxworks)
1220
0
    {
1221
0
      if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
1222
0
  return false;
1223
0
      if (bfd_link_pic (info))
1224
0
  {
1225
0
    htab->plt_header_size
1226
0
      = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
1227
0
    htab->plt_entry_size
1228
0
      = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt_entry);
1229
0
  }
1230
0
      else
1231
0
  {
1232
0
    htab->plt_header_size
1233
0
      = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt0_entry);
1234
0
    htab->plt_entry_size
1235
0
      = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt_entry);
1236
0
  }
1237
0
    }
1238
1239
0
  if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
1240
0
      || (!bfd_link_pic (info) && !htab->elf.srelbss))
1241
0
    abort ();
1242
1243
0
  return true;
1244
0
}
1245
1246
static bool
1247
create_ifunc_sections (bfd *abfd, struct bfd_link_info *info)
1248
0
{
1249
0
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1250
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
1251
0
  flagword flags, pltflags;
1252
0
  asection *s;
1253
1254
0
  if (htab->irelifunc != NULL || htab->iplt != NULL)
1255
0
    return true;
1256
1257
0
  flags = bed->dynamic_sec_flags;
1258
0
  pltflags = flags | SEC_ALLOC | SEC_CODE | SEC_LOAD;
1259
1260
0
  s = bfd_make_section_with_flags (abfd, ".iplt", pltflags);
1261
0
  if (s == NULL
1262
0
      || !bfd_set_section_alignment (s, bed->plt_alignment))
1263
0
    return false;
1264
0
  htab->iplt = s;
1265
1266
0
  s = bfd_make_section_with_flags (abfd, ".rela.iplt",
1267
0
           flags | SEC_READONLY);
1268
0
  if (s == NULL
1269
0
      || !bfd_set_section_alignment (s, bed->s->log_file_align))
1270
0
    return false;
1271
0
  htab->irelplt = s;
1272
1273
0
  return true;
1274
0
}
1275
1276
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
1277
1278
void
1279
_bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info,
1280
             struct elf_link_hash_entry *dir,
1281
             struct elf_link_hash_entry *ind)
1282
0
{
1283
0
  struct _bfd_sparc_elf_link_hash_entry *edir, *eind;
1284
1285
0
  edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
1286
0
  eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
1287
1288
0
  if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0)
1289
0
    {
1290
0
      edir->tls_type = eind->tls_type;
1291
0
      eind->tls_type = GOT_UNKNOWN;
1292
0
    }
1293
1294
  /* Copy has_got_reloc and has_non_got_reloc.  */
1295
0
  edir->has_got_reloc |= eind->has_got_reloc;
1296
0
  edir->has_non_got_reloc |= eind->has_non_got_reloc;
1297
1298
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1299
0
}
1300
1301
static int
1302
sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
1303
        int r_type, int is_local)
1304
0
{
1305
0
  if (! ABI_64_P (abfd)
1306
0
      && r_type == R_SPARC_TLS_GD_HI22
1307
0
      && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
1308
0
    return R_SPARC_REV32;
1309
1310
0
  if (!bfd_link_executable (info))
1311
0
    return r_type;
1312
1313
0
  switch (r_type)
1314
0
    {
1315
0
    case R_SPARC_TLS_GD_HI22:
1316
0
      return is_local ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_IE_HI22;
1317
0
    case R_SPARC_TLS_GD_LO10:
1318
0
      return is_local ? R_SPARC_TLS_LE_LOX10 : R_SPARC_TLS_IE_LO10;
1319
0
    case R_SPARC_TLS_LDM_HI22:
1320
0
      return R_SPARC_TLS_LE_HIX22;
1321
0
    case R_SPARC_TLS_LDM_LO10:
1322
0
      return R_SPARC_TLS_LE_LOX10;
1323
0
    case R_SPARC_TLS_IE_HI22:
1324
0
      return is_local ? R_SPARC_TLS_LE_HIX22 : r_type;
1325
0
    case R_SPARC_TLS_IE_LO10:
1326
0
      return is_local ? R_SPARC_TLS_LE_LOX10 : r_type;
1327
0
    }
1328
1329
0
  return r_type;
1330
0
}
1331

1332
/* Look through the relocs for a section during the first phase, and
1333
   allocate space in the global offset table or procedure linkage
1334
   table.  */
1335
1336
bool
1337
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1338
           asection *sec, const Elf_Internal_Rela *relocs)
1339
0
{
1340
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1341
0
  Elf_Internal_Shdr *symtab_hdr;
1342
0
  struct elf_link_hash_entry **sym_hashes;
1343
0
  const Elf_Internal_Rela *rel;
1344
0
  const Elf_Internal_Rela *rel_end;
1345
0
  asection *sreloc;
1346
0
  int num_relocs;
1347
0
  bool checked_tlsgd = false;
1348
1349
0
  if (bfd_link_relocatable (info))
1350
0
    return true;
1351
1352
0
  htab = _bfd_sparc_elf_hash_table (info);
1353
0
  BFD_ASSERT (htab != NULL);
1354
0
  symtab_hdr = &elf_symtab_hdr (abfd);
1355
0
  sym_hashes = elf_sym_hashes (abfd);
1356
1357
0
  sreloc = NULL;
1358
1359
0
  if (ABI_64_P (abfd))
1360
0
    num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (sec));
1361
0
  else
1362
0
    num_relocs = sec->reloc_count;
1363
1364
0
  BFD_ASSERT (is_sparc_elf (abfd) || num_relocs == 0);
1365
1366
0
  if (htab->elf.dynobj == NULL)
1367
0
    htab->elf.dynobj = abfd;
1368
0
  if (!create_ifunc_sections (htab->elf.dynobj, info))
1369
0
    return false;
1370
1371
0
  rel_end = relocs + num_relocs;
1372
0
  for (rel = relocs; rel < rel_end; rel++)
1373
0
    {
1374
0
      unsigned int r_type;
1375
0
      unsigned int r_symndx;
1376
0
      struct elf_link_hash_entry *h;
1377
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
1378
0
      Elf_Internal_Sym *isym;
1379
1380
0
      r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1381
0
      r_type = SPARC_ELF_R_TYPE (rel->r_info);
1382
1383
0
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1384
0
  {
1385
    /* xgettext:c-format */
1386
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
1387
0
    return false;
1388
0
  }
1389
1390
0
      isym = NULL;
1391
0
      if (r_symndx < symtab_hdr->sh_info)
1392
0
  {
1393
    /* A local symbol.  */
1394
0
    isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
1395
0
          r_symndx);
1396
0
    if (isym == NULL)
1397
0
      return false;
1398
1399
    /* Check relocation against local STT_GNU_IFUNC symbol.  */
1400
0
    if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1401
0
      {
1402
0
        h = elf_sparc_get_local_sym_hash (htab, abfd, rel, true);
1403
0
        if (h == NULL)
1404
0
    return false;
1405
1406
        /* Fake a STT_GNU_IFUNC symbol.  */
1407
0
        h->type = STT_GNU_IFUNC;
1408
0
        h->def_regular = 1;
1409
0
        h->ref_regular = 1;
1410
0
        h->forced_local = 1;
1411
0
        h->root.type = bfd_link_hash_defined;
1412
0
      }
1413
0
    else
1414
0
      h = NULL;
1415
0
  }
1416
0
      else
1417
0
  {
1418
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1419
0
    while (h->root.type == bfd_link_hash_indirect
1420
0
     || h->root.type == bfd_link_hash_warning)
1421
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
1422
0
  }
1423
1424
0
      if (h && h->type == STT_GNU_IFUNC && h->def_regular)
1425
0
  {
1426
0
    h->ref_regular = 1;
1427
0
    h->plt.refcount += 1;
1428
0
  }
1429
1430
      /* Compatibility with old R_SPARC_REV32 reloc conflicting
1431
   with R_SPARC_TLS_GD_HI22.  */
1432
0
      if (! ABI_64_P (abfd) && ! checked_tlsgd)
1433
0
  switch (r_type)
1434
0
    {
1435
0
    case R_SPARC_TLS_GD_HI22:
1436
0
      {
1437
0
        const Elf_Internal_Rela *relt;
1438
1439
0
        for (relt = rel + 1; relt < rel_end; relt++)
1440
0
    if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
1441
0
        || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
1442
0
        || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
1443
0
      break;
1444
0
        checked_tlsgd = true;
1445
0
        _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end;
1446
0
      }
1447
0
      break;
1448
0
    case R_SPARC_TLS_GD_LO10:
1449
0
    case R_SPARC_TLS_GD_ADD:
1450
0
    case R_SPARC_TLS_GD_CALL:
1451
0
      checked_tlsgd = true;
1452
0
      _bfd_sparc_elf_tdata (abfd)->has_tlsgd = true;
1453
0
      break;
1454
0
    }
1455
1456
0
      r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
1457
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1458
1459
0
      switch (r_type)
1460
0
  {
1461
0
  case R_SPARC_TLS_LDM_HI22:
1462
0
  case R_SPARC_TLS_LDM_LO10:
1463
0
    htab->tls_ldm_got.refcount += 1;
1464
0
    if (eh != NULL)
1465
0
      eh->has_got_reloc = 1;
1466
0
    break;
1467
1468
0
  case R_SPARC_TLS_LE_HIX22:
1469
0
  case R_SPARC_TLS_LE_LOX10:
1470
0
    if (!bfd_link_executable (info))
1471
0
      goto r_sparc_plt32;
1472
0
    break;
1473
1474
0
  case R_SPARC_TLS_IE_HI22:
1475
0
  case R_SPARC_TLS_IE_LO10:
1476
0
    if (!bfd_link_executable (info))
1477
0
      info->flags |= DF_STATIC_TLS;
1478
    /* Fall through */
1479
1480
0
  case R_SPARC_GOT10:
1481
0
  case R_SPARC_GOT13:
1482
0
  case R_SPARC_GOT22:
1483
0
  case R_SPARC_GOTDATA_HIX22:
1484
0
  case R_SPARC_GOTDATA_LOX10:
1485
0
  case R_SPARC_GOTDATA_OP_HIX22:
1486
0
  case R_SPARC_GOTDATA_OP_LOX10:
1487
0
  case R_SPARC_TLS_GD_HI22:
1488
0
  case R_SPARC_TLS_GD_LO10:
1489
    /* This symbol requires a global offset table entry.  */
1490
0
    {
1491
0
      int tls_type, old_tls_type;
1492
1493
0
      switch (r_type)
1494
0
        {
1495
0
        case R_SPARC_TLS_GD_HI22:
1496
0
        case R_SPARC_TLS_GD_LO10:
1497
0
    tls_type = GOT_TLS_GD;
1498
0
    break;
1499
0
        case R_SPARC_TLS_IE_HI22:
1500
0
        case R_SPARC_TLS_IE_LO10:
1501
0
    tls_type = GOT_TLS_IE;
1502
0
    break;
1503
0
        default:
1504
0
    tls_type = GOT_NORMAL;
1505
0
    break;
1506
0
        }
1507
1508
0
      if (h != NULL)
1509
0
        {
1510
0
    h->got.refcount += 1;
1511
0
    old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
1512
0
        }
1513
0
      else
1514
0
        {
1515
0
    bfd_signed_vma *local_got_refcounts;
1516
1517
    /* This is a global offset table entry for a local symbol.  */
1518
0
    local_got_refcounts = elf_local_got_refcounts (abfd);
1519
0
    if (local_got_refcounts == NULL)
1520
0
      {
1521
0
        bfd_size_type size;
1522
1523
0
        size = symtab_hdr->sh_info;
1524
0
        size *= (sizeof (bfd_signed_vma) + sizeof(char));
1525
0
        local_got_refcounts = ((bfd_signed_vma *)
1526
0
             bfd_zalloc (abfd, size));
1527
0
        if (local_got_refcounts == NULL)
1528
0
          return false;
1529
0
        elf_local_got_refcounts (abfd) = local_got_refcounts;
1530
0
        _bfd_sparc_elf_local_got_tls_type (abfd)
1531
0
          = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1532
0
      }
1533
1534
0
    if (r_type != R_SPARC_GOTDATA_OP_HIX22
1535
0
        && r_type != R_SPARC_GOTDATA_OP_LOX10)
1536
0
      local_got_refcounts[r_symndx] += 1;
1537
1538
0
    old_tls_type
1539
0
      = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx];
1540
0
        }
1541
1542
      /* If a TLS symbol is accessed using IE at least once, there is no
1543
         point in using the dynamic model for it.  */
1544
0
      if (old_tls_type != tls_type)
1545
0
        {
1546
0
    if (old_tls_type == GOT_UNKNOWN)
1547
0
      ;
1548
0
    else if (old_tls_type == GOT_TLS_GD && tls_type == GOT_TLS_IE)
1549
0
      ;
1550
0
    else if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1551
0
      tls_type = old_tls_type;
1552
0
    else
1553
0
      {
1554
0
        _bfd_error_handler
1555
          /* xgettext:c-format */
1556
0
          (_("%pB: `%s' accessed both as normal and thread local symbol"),
1557
0
           abfd, h ? h->root.root.string : "<local>");
1558
0
        return false;
1559
0
      }
1560
1561
0
    if (h != NULL)
1562
0
      _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type;
1563
0
    else
1564
0
      _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1565
0
        }
1566
0
    }
1567
1568
0
    if (!htab->elf.sgot
1569
0
        && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
1570
0
      return false;
1571
1572
0
    if (eh != NULL)
1573
0
      {
1574
0
        eh->has_got_reloc = 1;
1575
0
        if (r_type == R_SPARC_GOT10
1576
0
      || r_type == R_SPARC_GOT13
1577
0
      || r_type == R_SPARC_GOT22)
1578
0
    eh->has_old_style_got_reloc = 1;
1579
0
      }
1580
0
    break;
1581
1582
0
  case R_SPARC_TLS_GD_CALL:
1583
0
  case R_SPARC_TLS_LDM_CALL:
1584
0
    if (bfd_link_executable (info))
1585
0
      break;
1586
1587
    /* Essentially R_SPARC_WPLT30 relocs against __tls_get_addr.  */
1588
0
    h = (struct elf_link_hash_entry *)
1589
0
         bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
1590
0
             false, true);
1591
0
    BFD_ASSERT (h != NULL);
1592
    /* Fall through */
1593
1594
0
  case R_SPARC_WPLT30:
1595
0
  case R_SPARC_PLT32:
1596
0
  case R_SPARC_PLT64:
1597
0
  case R_SPARC_HIPLT22:
1598
0
  case R_SPARC_LOPLT10:
1599
0
  case R_SPARC_PCPLT32:
1600
0
  case R_SPARC_PCPLT22:
1601
0
  case R_SPARC_PCPLT10:
1602
    /* This symbol requires a procedure linkage table entry.
1603
       We actually build the entry in adjust_dynamic_symbol,
1604
       because this might be a case of linking PIC code without
1605
       linking in any dynamic objects, in which case we don't
1606
       need to generate a procedure linkage table after all.  */
1607
1608
0
    if (h == NULL)
1609
0
      {
1610
0
        if (! ABI_64_P (abfd))
1611
0
    {
1612
      /* The Solaris native assembler will generate a WPLT30
1613
         reloc for a local symbol if you assemble a call from
1614
         one section to another when using -K pic.  We treat
1615
         it as WDISP30.  */
1616
0
      if (r_type == R_SPARC_PLT32)
1617
0
        goto r_sparc_plt32;
1618
0
      break;
1619
0
    }
1620
        /* PR 7027: We need similar behaviour for 64-bit binaries.  */
1621
0
        else if (r_type == R_SPARC_WPLT30)
1622
0
    break;
1623
1624
        /* It does not make sense to have a procedure linkage
1625
     table entry for a local symbol.  */
1626
0
        bfd_set_error (bfd_error_bad_value);
1627
0
        return false;
1628
0
      }
1629
1630
0
    h->needs_plt = 1;
1631
1632
0
    if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
1633
0
      goto r_sparc_plt32;
1634
1635
0
    h->plt.refcount += 1;
1636
1637
0
    eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1638
0
    eh->has_got_reloc = 1;
1639
0
    break;
1640
1641
0
  case R_SPARC_PC10:
1642
0
  case R_SPARC_PC22:
1643
0
  case R_SPARC_PC_HH22:
1644
0
  case R_SPARC_PC_HM10:
1645
0
  case R_SPARC_PC_LM22:
1646
0
    if (h != NULL)
1647
0
      h->non_got_ref = 1;
1648
1649
0
    if (h != NULL
1650
0
        && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1651
0
      break;
1652
    /* Fall through.  */
1653
1654
0
  case R_SPARC_DISP8:
1655
0
  case R_SPARC_DISP16:
1656
0
  case R_SPARC_DISP32:
1657
0
  case R_SPARC_DISP64:
1658
0
  case R_SPARC_WDISP30:
1659
0
  case R_SPARC_WDISP22:
1660
0
  case R_SPARC_WDISP19:
1661
0
  case R_SPARC_WDISP16:
1662
0
  case R_SPARC_WDISP10:
1663
0
  case R_SPARC_8:
1664
0
  case R_SPARC_16:
1665
0
  case R_SPARC_32:
1666
0
  case R_SPARC_HI22:
1667
0
  case R_SPARC_22:
1668
0
  case R_SPARC_13:
1669
0
  case R_SPARC_LO10:
1670
0
  case R_SPARC_UA16:
1671
0
  case R_SPARC_UA32:
1672
0
  case R_SPARC_10:
1673
0
  case R_SPARC_11:
1674
0
  case R_SPARC_64:
1675
0
  case R_SPARC_OLO10:
1676
0
  case R_SPARC_HH22:
1677
0
  case R_SPARC_HM10:
1678
0
  case R_SPARC_LM22:
1679
0
  case R_SPARC_7:
1680
0
  case R_SPARC_5:
1681
0
  case R_SPARC_6:
1682
0
  case R_SPARC_HIX22:
1683
0
  case R_SPARC_LOX10:
1684
0
  case R_SPARC_H44:
1685
0
  case R_SPARC_M44:
1686
0
  case R_SPARC_L44:
1687
0
  case R_SPARC_H34:
1688
0
  case R_SPARC_UA64:
1689
0
    if (h != NULL)
1690
0
      h->non_got_ref = 1;
1691
1692
0
    if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1693
0
      eh->has_non_got_reloc = 1;
1694
1695
0
  r_sparc_plt32:
1696
0
    if (h != NULL && !bfd_link_pic (info))
1697
0
      {
1698
        /* We may need a .plt entry if the function this reloc
1699
     refers to is in a shared lib.  */
1700
0
        h->plt.refcount += 1;
1701
0
      }
1702
1703
    /* If we are creating a shared library, and this is a reloc
1704
       against a global symbol, or a non PC relative reloc
1705
       against a local symbol, then we need to copy the reloc
1706
       into the shared library.  However, if we are linking with
1707
       -Bsymbolic, we do not need to copy a reloc against a
1708
       global symbol which is defined in an object we are
1709
       including in the link (i.e., DEF_REGULAR is set).  At
1710
       this point we have not seen all the input files, so it is
1711
       possible that DEF_REGULAR is not set now but will be set
1712
       later (it is never cleared).  In case of a weak definition,
1713
       DEF_REGULAR may be cleared later by a strong definition in
1714
       a shared library.  We account for that possibility below by
1715
       storing information in the relocs_copied field of the hash
1716
       table entry.  A similar situation occurs when creating
1717
       shared libraries and symbol visibility changes render the
1718
       symbol local.
1719
1720
       If on the other hand, we are creating an executable, we
1721
       may need to keep relocations for symbols satisfied by a
1722
       dynamic library if we manage to avoid copy relocs for the
1723
       symbol.  */
1724
0
    if ((bfd_link_pic (info)
1725
0
         && (sec->flags & SEC_ALLOC) != 0
1726
0
         && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1727
0
       || (h != NULL
1728
0
           && (! SYMBOLIC_BIND (info, h)
1729
0
         || h->root.type == bfd_link_hash_defweak
1730
0
         || !h->def_regular))))
1731
0
        || (!bfd_link_pic (info)
1732
0
      && (sec->flags & SEC_ALLOC) != 0
1733
0
      && h != NULL
1734
0
      && (h->root.type == bfd_link_hash_defweak
1735
0
          || !h->def_regular))
1736
0
        || (!bfd_link_pic (info)
1737
0
      && h != NULL
1738
0
      && h->type == STT_GNU_IFUNC))
1739
0
      {
1740
0
        struct elf_dyn_relocs *p;
1741
0
        struct elf_dyn_relocs **head;
1742
1743
        /* When creating a shared object, we must copy these
1744
     relocs into the output file.  We create a reloc
1745
     section in dynobj and make room for the reloc.  */
1746
0
        if (sreloc == NULL)
1747
0
    {
1748
0
      sreloc = _bfd_elf_make_dynamic_reloc_section
1749
0
        (sec, htab->elf.dynobj, htab->word_align_power,
1750
0
         abfd, /*rela?*/ true);
1751
1752
0
      if (sreloc == NULL)
1753
0
        return false;
1754
0
    }
1755
1756
        /* If this is a global symbol, we count the number of
1757
     relocations we need for this symbol.  */
1758
0
        if (h != NULL)
1759
0
    head = &h->dyn_relocs;
1760
0
        else
1761
0
    {
1762
      /* Track dynamic relocs needed for local syms too.
1763
         We really need local syms available to do this
1764
         easily.  Oh well.  */
1765
0
      asection *s;
1766
0
      void *vpp;
1767
1768
0
      BFD_ASSERT (isym != NULL);
1769
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1770
0
      if (s == NULL)
1771
0
        s = sec;
1772
1773
0
      vpp = &elf_section_data (s)->local_dynrel;
1774
0
      head = (struct elf_dyn_relocs **) vpp;
1775
0
    }
1776
1777
0
        p = *head;
1778
0
        if (p == NULL || p->sec != sec)
1779
0
    {
1780
0
      size_t amt = sizeof *p;
1781
0
      p = ((struct elf_dyn_relocs *)
1782
0
           bfd_alloc (htab->elf.dynobj, amt));
1783
0
      if (p == NULL)
1784
0
        return false;
1785
0
      p->next = *head;
1786
0
      *head = p;
1787
0
      p->sec = sec;
1788
0
      p->count = 0;
1789
0
      p->pc_count = 0;
1790
0
    }
1791
1792
0
        p->count += 1;
1793
0
        if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1794
0
    p->pc_count += 1;
1795
0
      }
1796
1797
0
    break;
1798
1799
0
  case R_SPARC_GNU_VTINHERIT:
1800
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1801
0
      return false;
1802
0
    break;
1803
1804
0
  case R_SPARC_GNU_VTENTRY:
1805
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1806
0
      return false;
1807
0
    break;
1808
1809
0
  case R_SPARC_REGISTER:
1810
    /* Nothing to do.  */
1811
0
    break;
1812
1813
0
  default:
1814
0
    break;
1815
0
  }
1816
0
    }
1817
1818
0
  return true;
1819
0
}
1820

1821
asection *
1822
_bfd_sparc_elf_gc_mark_hook (asection *sec,
1823
           struct bfd_link_info *info,
1824
           Elf_Internal_Rela *rel,
1825
           struct elf_link_hash_entry *h,
1826
           Elf_Internal_Sym *sym)
1827
0
{
1828
0
  if (h != NULL)
1829
0
    switch (SPARC_ELF_R_TYPE (rel->r_info))
1830
0
      {
1831
0
      case R_SPARC_GNU_VTINHERIT:
1832
0
      case R_SPARC_GNU_VTENTRY:
1833
0
  return NULL;
1834
0
      }
1835
1836
0
  if (!bfd_link_executable (info))
1837
0
    {
1838
0
      switch (SPARC_ELF_R_TYPE (rel->r_info))
1839
0
  {
1840
0
  case R_SPARC_TLS_GD_CALL:
1841
0
  case R_SPARC_TLS_LDM_CALL:
1842
    /* This reloc implicitly references __tls_get_addr.  We know
1843
       another reloc will reference the same symbol as the one
1844
       on this reloc, so the real symbol and section will be
1845
       gc marked when processing the other reloc.  That lets
1846
       us handle __tls_get_addr here.  */
1847
0
    h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
1848
0
            false, false, true);
1849
0
    BFD_ASSERT (h != NULL);
1850
0
    h->mark = 1;
1851
0
    if (h->is_weakalias)
1852
0
      weakdef (h)->mark = 1;
1853
0
    sym = NULL;
1854
0
  }
1855
0
    }
1856
1857
0
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1858
0
}
1859
1860
static Elf_Internal_Rela *
1861
sparc_elf_find_reloc_at_ofs (Elf_Internal_Rela *rel,
1862
           Elf_Internal_Rela *relend,
1863
           bfd_vma offset)
1864
0
{
1865
0
  while (rel < relend)
1866
0
    {
1867
0
      if (rel->r_offset == offset)
1868
0
  return rel;
1869
0
      rel++;
1870
0
    }
1871
0
  return NULL;
1872
0
}
1873
1874
/* Remove undefined weak symbol from the dynamic symbol table if it
1875
   is resolved to 0.   */
1876
1877
bool
1878
_bfd_sparc_elf_fixup_symbol (struct bfd_link_info *info,
1879
           struct elf_link_hash_entry *h)
1880
0
{
1881
0
  if (h->dynindx != -1
1882
0
      && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
1883
0
            _bfd_sparc_elf_hash_entry (h)))
1884
0
    {
1885
0
      h->dynindx = -1;
1886
0
      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1887
0
            h->dynstr_index);
1888
0
    }
1889
0
  return true;
1890
0
}
1891
1892
/* Adjust a symbol defined by a dynamic object and referenced by a
1893
   regular object.  The current definition is in some section of the
1894
   dynamic object, but we're not including those sections.  We have to
1895
   change the definition to something the rest of the link can
1896
   understand.  */
1897
1898
bool
1899
_bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1900
             struct elf_link_hash_entry *h)
1901
0
{
1902
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1903
0
  asection *s, *srel;
1904
1905
0
  htab = _bfd_sparc_elf_hash_table (info);
1906
0
  BFD_ASSERT (htab != NULL);
1907
1908
  /* Make sure we know what is going on here.  */
1909
0
  BFD_ASSERT (htab->elf.dynobj != NULL
1910
0
        && (h->needs_plt
1911
0
      || h->type == STT_GNU_IFUNC
1912
0
      || h->is_weakalias
1913
0
      || (h->def_dynamic
1914
0
          && h->ref_regular
1915
0
          && !h->def_regular)));
1916
1917
  /* If this is a function, put it in the procedure linkage table.  We
1918
     will fill in the contents of the procedure linkage table later
1919
     (although we could actually do it here).  The STT_NOTYPE
1920
     condition is a hack specifically for the Oracle libraries
1921
     delivered for Solaris; for some inexplicable reason, they define
1922
     some of their functions as STT_NOTYPE when they really should be
1923
     STT_FUNC.  */
1924
0
  if (h->type == STT_FUNC
1925
0
      || h->type == STT_GNU_IFUNC
1926
0
      || h->needs_plt
1927
0
      || (h->type == STT_NOTYPE
1928
0
    && (h->root.type == bfd_link_hash_defined
1929
0
        || h->root.type == bfd_link_hash_defweak)
1930
0
    && (h->root.u.def.section->flags & SEC_CODE) != 0))
1931
0
    {
1932
0
      if (h->plt.refcount <= 0
1933
0
    || (h->type != STT_GNU_IFUNC
1934
0
        && (SYMBOL_CALLS_LOCAL (info, h)
1935
0
      || (h->root.type == bfd_link_hash_undefweak
1936
0
          && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT))))
1937
0
  {
1938
    /* This case can occur if we saw a WPLT30 reloc in an input
1939
       file, but the symbol was never referred to by a dynamic
1940
       object, or if all references were garbage collected.  In
1941
       such a case, we don't actually need to build a procedure
1942
       linkage table, and we can just do a WDISP30 reloc instead.  */
1943
0
    h->plt.offset = (bfd_vma) -1;
1944
0
    h->needs_plt = 0;
1945
0
  }
1946
1947
0
      return true;
1948
0
    }
1949
0
  else
1950
0
    h->plt.offset = (bfd_vma) -1;
1951
1952
  /* If this is a weak symbol, and there is a real definition, the
1953
     processor independent code will have arranged for us to see the
1954
     real definition first, and we can just use the same value.  */
1955
0
  if (h->is_weakalias)
1956
0
    {
1957
0
      struct elf_link_hash_entry *def = weakdef (h);
1958
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1959
0
      h->root.u.def.section = def->root.u.def.section;
1960
0
      h->root.u.def.value = def->root.u.def.value;
1961
0
      return true;
1962
0
    }
1963
1964
  /* This is a reference to a symbol defined by a dynamic object which
1965
     is not a function.  */
1966
1967
  /* If we are creating a shared library, we must presume that the
1968
     only references to the symbol are via the global offset table.
1969
     For such cases we need not do anything here; the relocations will
1970
     be handled correctly by relocate_section.  */
1971
0
  if (bfd_link_pic (info))
1972
0
    return true;
1973
1974
  /* If there are no references to this symbol that do not use the
1975
     GOT, we don't need to generate a copy reloc.  */
1976
0
  if (!h->non_got_ref)
1977
0
    return true;
1978
1979
  /* If -z nocopyreloc was given, we won't generate them either.  */
1980
0
  if (info->nocopyreloc)
1981
0
    {
1982
0
      h->non_got_ref = 0;
1983
0
      return true;
1984
0
    }
1985
1986
  /* If we don't find any dynamic relocs in read-only sections, then
1987
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1988
0
  if (!_bfd_elf_readonly_dynrelocs (h))
1989
0
    {
1990
0
      h->non_got_ref = 0;
1991
0
      return true;
1992
0
    }
1993
1994
  /* We must allocate the symbol in our .dynbss section, which will
1995
     become part of the .bss section of the executable.  There will be
1996
     an entry for this symbol in the .dynsym section.  The dynamic
1997
     object will contain position independent code, so all references
1998
     from the dynamic object to this symbol will go through the global
1999
     offset table.  The dynamic linker will use the .dynsym entry to
2000
     determine the address it must put in the global offset table, so
2001
     both the dynamic object and the regular object will refer to the
2002
     same memory location for the variable.  */
2003
2004
  /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
2005
     to copy the initial value out of the dynamic object and into the
2006
     runtime process image.  We need to remember the offset into the
2007
     .rel.bss section we are going to use.  */
2008
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2009
0
    {
2010
0
      s = htab->elf.sdynrelro;
2011
0
      srel = htab->elf.sreldynrelro;
2012
0
    }
2013
0
  else
2014
0
    {
2015
0
      s = htab->elf.sdynbss;
2016
0
      srel = htab->elf.srelbss;
2017
0
    }
2018
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2019
0
    {
2020
0
      srel->size += SPARC_ELF_RELA_BYTES (htab);
2021
0
      h->needs_copy = 1;
2022
0
    }
2023
2024
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
2025
0
}
2026
2027
/* Allocate space in .plt, .got and associated reloc sections for
2028
   dynamic relocs.  */
2029
2030
static bool
2031
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2032
0
{
2033
0
  struct bfd_link_info *info;
2034
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2035
0
  struct _bfd_sparc_elf_link_hash_entry *eh;
2036
0
  struct elf_dyn_relocs *p;
2037
0
  bool resolved_to_zero;
2038
2039
0
  if (h->root.type == bfd_link_hash_indirect)
2040
0
    return true;
2041
2042
0
  info = (struct bfd_link_info *) inf;
2043
0
  htab = _bfd_sparc_elf_hash_table (info);
2044
0
  BFD_ASSERT (htab != NULL);
2045
2046
0
  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2047
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2048
2049
0
  if ((htab->elf.dynamic_sections_created
2050
0
       && h->plt.refcount > 0)
2051
0
      || (h->type == STT_GNU_IFUNC
2052
0
    && h->def_regular
2053
0
    && h->ref_regular))
2054
0
    {
2055
      /* Undefined weak syms won't yet be marked as dynamic.  */
2056
0
      if (h->root.type == bfd_link_hash_undefweak
2057
0
    && !resolved_to_zero
2058
0
    && h->dynindx == -1
2059
0
    && !h->forced_local)
2060
0
  {
2061
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2062
0
      return false;
2063
0
  }
2064
2065
0
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)
2066
0
    || (h->type == STT_GNU_IFUNC
2067
0
        && h->def_regular))
2068
0
  {
2069
0
    asection *s = htab->elf.splt;
2070
2071
0
    if (s == NULL)
2072
0
      s = htab->elf.iplt;
2073
2074
    /* Allocate room for the header.  */
2075
0
    if (s->size == 0)
2076
0
      {
2077
0
        s->size = htab->plt_header_size;
2078
2079
        /* Allocate space for the .rela.plt.unloaded relocations.  */
2080
0
        if (htab->elf.target_os == is_vxworks
2081
0
      && !bfd_link_pic (info))
2082
0
    htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
2083
0
      }
2084
2085
    /* The procedure linkage table size is bounded by the magnitude
2086
       of the offset we can describe in the entry.  */
2087
0
    if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ?
2088
0
        (((bfd_vma)1 << 31) << 1) : 0x400000))
2089
0
      {
2090
0
        bfd_set_error (bfd_error_bad_value);
2091
0
        return false;
2092
0
      }
2093
2094
0
    if (SPARC_ELF_WORD_BYTES(htab) == 8
2095
0
        && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
2096
0
      {
2097
0
        bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE;
2098
2099
2100
0
        off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE;
2101
2102
0
        h->plt.offset = (s->size - (off * 8));
2103
0
      }
2104
0
    else
2105
0
      h->plt.offset = s->size;
2106
2107
    /* If this symbol is not defined in a regular file, and we are
2108
       not generating a shared library, then set the symbol to this
2109
       location in the .plt.  This is required to make function
2110
       pointers compare as equal between the normal executable and
2111
       the shared library.  */
2112
0
    if (! bfd_link_pic (info)
2113
0
        && !h->def_regular)
2114
0
      {
2115
0
        h->root.u.def.section = s;
2116
0
        h->root.u.def.value = h->plt.offset;
2117
0
      }
2118
2119
    /* Make room for this entry.  */
2120
0
    s->size += htab->plt_entry_size;
2121
2122
    /* There should be no PLT relocations against resolved undefined
2123
       weak symbols in the executable.  */
2124
0
    if (!resolved_to_zero)
2125
0
      {
2126
        /* We also need to make an entry in the .rela.plt section.  */
2127
0
        if (s == htab->elf.splt)
2128
0
    htab->elf.srelplt->size += SPARC_ELF_RELA_BYTES (htab);
2129
0
        else
2130
0
    htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab);
2131
0
      }
2132
2133
0
    if (htab->elf.target_os == is_vxworks)
2134
0
      {
2135
        /* Allocate space for the .got.plt entry.  */
2136
0
        htab->elf.sgotplt->size += 4;
2137
2138
        /* ...and for the .rela.plt.unloaded relocations.  */
2139
0
        if (!bfd_link_pic (info))
2140
0
    htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
2141
0
      }
2142
0
  }
2143
0
      else
2144
0
  {
2145
0
    h->plt.offset = (bfd_vma) -1;
2146
0
    h->needs_plt = 0;
2147
0
  }
2148
0
    }
2149
0
  else
2150
0
    {
2151
0
      h->plt.offset = (bfd_vma) -1;
2152
0
      h->needs_plt = 0;
2153
0
    }
2154
2155
  /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
2156
     make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry.  */
2157
0
  if (h->got.refcount > 0
2158
0
      && bfd_link_executable (info)
2159
0
      && h->dynindx == -1
2160
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
2161
0
    h->got.offset = (bfd_vma) -1;
2162
0
  else if (h->got.refcount > 0)
2163
0
    {
2164
0
      asection *s;
2165
0
      bool dyn;
2166
0
      int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
2167
2168
      /* Undefined weak syms won't yet be marked as dynamic.  */
2169
0
      if (h->root.type == bfd_link_hash_undefweak
2170
0
    && !resolved_to_zero
2171
0
    && h->dynindx == -1
2172
0
    && !h->forced_local)
2173
0
  {
2174
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2175
0
      return false;
2176
0
  }
2177
2178
0
      s = htab->elf.sgot;
2179
0
      h->got.offset = s->size;
2180
0
      s->size += SPARC_ELF_WORD_BYTES (htab);
2181
      /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots.  */
2182
0
      if (tls_type == GOT_TLS_GD)
2183
0
  s->size += SPARC_ELF_WORD_BYTES (htab);
2184
0
      dyn = htab->elf.dynamic_sections_created;
2185
      /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
2186
   R_SPARC_TLS_GD_{HI22,LO10} needs one if local and two if global.  */
2187
0
      if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
2188
0
    || tls_type == GOT_TLS_IE
2189
0
    || h->type == STT_GNU_IFUNC)
2190
0
  htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2191
0
      else if (tls_type == GOT_TLS_GD)
2192
0
  htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
2193
0
      else if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
2194
    /* Even if the symbol isn't dynamic, we may generate a
2195
       reloc for the dynamic linker in PIC mode.  */
2196
0
    || (h->dynindx == -1
2197
0
        && !h->forced_local
2198
0
        && h->root.type != bfd_link_hash_undefweak
2199
0
        && bfd_link_pic (info)))
2200
         /* No dynamic relocations are needed against resolved
2201
      undefined weak symbols in an executable.  */
2202
0
         && !(h->root.type == bfd_link_hash_undefweak
2203
0
        && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2204
0
      || resolved_to_zero)))
2205
0
  htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2206
0
    }
2207
0
  else
2208
0
    h->got.offset = (bfd_vma) -1;
2209
2210
0
  if (h->dyn_relocs == NULL)
2211
0
    return true;
2212
2213
  /* In the shared -Bsymbolic case, discard space allocated for
2214
     dynamic pc-relative relocs against symbols which turn out to be
2215
     defined in regular objects.  For the normal shared case, discard
2216
     space for pc-relative relocs that have become local due to symbol
2217
     visibility changes.  */
2218
2219
0
  if (bfd_link_pic (info))
2220
0
    {
2221
0
      if (SYMBOL_CALLS_LOCAL (info, h))
2222
0
  {
2223
0
    struct elf_dyn_relocs **pp;
2224
2225
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
2226
0
      {
2227
0
        p->count -= p->pc_count;
2228
0
        p->pc_count = 0;
2229
0
        if (p->count == 0)
2230
0
    *pp = p->next;
2231
0
        else
2232
0
    pp = &p->next;
2233
0
      }
2234
0
  }
2235
2236
0
      if (htab->elf.target_os == is_vxworks)
2237
0
  {
2238
0
    struct elf_dyn_relocs **pp;
2239
2240
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
2241
0
      {
2242
0
        if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2243
0
    *pp = p->next;
2244
0
        else
2245
0
    pp = &p->next;
2246
0
      }
2247
0
  }
2248
2249
      /* Also discard relocs on undefined weak syms with non-default
2250
   visibility or in PIE.  */
2251
0
      if (h->dyn_relocs != NULL
2252
0
    && h->root.type == bfd_link_hash_undefweak)
2253
0
  {
2254
    /* An undefined weak symbol is never
2255
       bound locally in a shared library.  */
2256
2257
0
    if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2258
0
        || resolved_to_zero)
2259
0
      {
2260
0
        if (h->non_got_ref)
2261
0
    {
2262
      /* Keep dynamic non-GOT/non-PLT relocation so that we
2263
         can branch to 0 without PLT.  */
2264
0
      struct elf_dyn_relocs **pp;
2265
2266
0
      for (pp = &h->dyn_relocs; (p = *pp) != NULL;)
2267
0
        if (p->pc_count == 0)
2268
0
          *pp = p->next;
2269
0
        else
2270
0
          {
2271
      /* Remove other relocations.  */
2272
0
      p->count = p->pc_count;
2273
0
      pp = &p->next;
2274
0
          }
2275
2276
0
      if (h->dyn_relocs != NULL)
2277
0
        {
2278
          /* Make sure undefined weak symbols are output
2279
       as dynamic symbols in PIEs for dynamic non-GOT
2280
       non-PLT reloations.  */
2281
0
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
2282
0
      return false;
2283
0
        }
2284
0
    }
2285
0
        else
2286
0
    h->dyn_relocs = NULL;
2287
0
      }
2288
2289
    /* Make sure undefined weak symbols are output as a dynamic
2290
       symbol in PIEs.  */
2291
0
    else if (h->dynindx == -1
2292
0
       && !h->forced_local)
2293
0
      {
2294
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
2295
0
    return false;
2296
0
      }
2297
0
  }
2298
0
    }
2299
0
  else
2300
0
    {
2301
      /* For the non-shared case, discard space for relocs against
2302
   symbols which turn out to need copy relocs or are not
2303
   dynamic.  */
2304
2305
0
      if ((!h->non_got_ref
2306
0
     || (h->root.type == bfd_link_hash_undefweak
2307
0
         && !resolved_to_zero))
2308
0
    && ((h->def_dynamic
2309
0
         && !h->def_regular)
2310
0
        || (htab->elf.dynamic_sections_created
2311
0
      && (h->root.type == bfd_link_hash_undefweak
2312
0
          || h->root.type == bfd_link_hash_undefined))))
2313
0
  {
2314
    /* Undefined weak syms won't yet be marked as dynamic.  */
2315
0
    if (h->root.type == bfd_link_hash_undefweak
2316
0
        && !resolved_to_zero
2317
0
        && h->dynindx == -1
2318
0
        && !h->forced_local)
2319
0
      {
2320
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
2321
0
    return false;
2322
0
      }
2323
2324
    /* If that succeeded, we know we'll be keeping all the
2325
       relocs.  */
2326
0
    if (h->dynindx != -1)
2327
0
      goto keep;
2328
0
  }
2329
2330
0
      h->dyn_relocs = NULL;
2331
2332
0
    keep: ;
2333
0
    }
2334
2335
  /* Finally, allocate space.  */
2336
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
2337
0
    {
2338
0
      asection *sreloc = elf_section_data (p->sec)->sreloc;
2339
0
      sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2340
0
    }
2341
2342
0
  return true;
2343
0
}
2344
2345
/* Allocate space in .plt, .got and associated reloc sections for
2346
   local dynamic relocs.  */
2347
2348
static int
2349
allocate_local_dynrelocs (void **slot, void *inf)
2350
0
{
2351
0
  struct elf_link_hash_entry *h
2352
0
    = (struct elf_link_hash_entry *) *slot;
2353
2354
0
  if (h->type != STT_GNU_IFUNC
2355
0
      || !h->def_regular
2356
0
      || !h->ref_regular
2357
0
      || !h->forced_local
2358
0
      || h->root.type != bfd_link_hash_defined)
2359
0
    abort ();
2360
2361
0
  return allocate_dynrelocs (h, inf);
2362
0
}
2363
2364
/* Return true if the dynamic symbol for a given section should be
2365
   omitted when creating a shared library.  */
2366
2367
bool
2368
_bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
2369
            struct bfd_link_info *info,
2370
            asection *p)
2371
0
{
2372
  /* We keep the .got section symbol so that explicit relocations
2373
     against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2374
     can be turned into relocations against the .got symbol.  */
2375
0
  if (strcmp (p->name, ".got") == 0)
2376
0
    return false;
2377
2378
0
  return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p);
2379
0
}
2380
2381
/* Set the sizes of the dynamic sections.  */
2382
2383
bool
2384
_bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
2385
              struct bfd_link_info *info)
2386
0
{
2387
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2388
0
  bfd *dynobj;
2389
0
  asection *s;
2390
0
  bfd *ibfd;
2391
2392
0
  htab = _bfd_sparc_elf_hash_table (info);
2393
0
  BFD_ASSERT (htab != NULL);
2394
0
  dynobj = htab->elf.dynobj;
2395
0
  BFD_ASSERT (dynobj != NULL);
2396
2397
0
  if (elf_hash_table (info)->dynamic_sections_created)
2398
0
    {
2399
      /* Set the contents of the .interp section to the interpreter.  */
2400
0
      if (bfd_link_executable (info) && !info->nointerp)
2401
0
  {
2402
0
    s = bfd_get_linker_section (dynobj, ".interp");
2403
0
    BFD_ASSERT (s != NULL);
2404
0
    s->size = htab->dynamic_interpreter_size;
2405
0
    s->contents = (unsigned char *) htab->dynamic_interpreter;
2406
0
    htab->interp = s;
2407
0
  }
2408
0
    }
2409
2410
  /* Set up .got offsets for local syms, and space for local dynamic
2411
     relocs.  */
2412
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2413
0
    {
2414
0
      bfd_signed_vma *local_got;
2415
0
      bfd_signed_vma *end_local_got;
2416
0
      char *local_tls_type;
2417
0
      bfd_size_type locsymcount;
2418
0
      Elf_Internal_Shdr *symtab_hdr;
2419
0
      asection *srel;
2420
2421
0
      if (! is_sparc_elf (ibfd))
2422
0
  continue;
2423
2424
0
      for (s = ibfd->sections; s != NULL; s = s->next)
2425
0
  {
2426
0
    struct elf_dyn_relocs *p;
2427
2428
0
    for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2429
0
      {
2430
0
        if (!bfd_is_abs_section (p->sec)
2431
0
      && bfd_is_abs_section (p->sec->output_section))
2432
0
    {
2433
      /* Input section has been discarded, either because
2434
         it is a copy of a linkonce section or due to
2435
         linker script /DISCARD/, so we'll be discarding
2436
         the relocs too.  */
2437
0
    }
2438
0
        else if (htab->elf.target_os == is_vxworks
2439
0
           && strcmp (p->sec->output_section->name,
2440
0
          ".tls_vars") == 0)
2441
0
    {
2442
      /* Relocations in vxworks .tls_vars sections are
2443
         handled specially by the loader.  */
2444
0
    }
2445
0
        else if (p->count != 0)
2446
0
    {
2447
0
      srel = elf_section_data (p->sec)->sreloc;
2448
0
      if (!htab->elf.dynamic_sections_created)
2449
0
        srel = htab->elf.irelplt;
2450
0
      srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2451
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2452
0
        {
2453
0
          info->flags |= DF_TEXTREL;
2454
0
          info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
2455
0
                p->sec->owner, p->sec);
2456
0
        }
2457
0
    }
2458
0
      }
2459
0
  }
2460
2461
0
      local_got = elf_local_got_refcounts (ibfd);
2462
0
      if (!local_got)
2463
0
  continue;
2464
2465
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
2466
0
      locsymcount = symtab_hdr->sh_info;
2467
0
      end_local_got = local_got + locsymcount;
2468
0
      local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
2469
0
      s = htab->elf.sgot;
2470
0
      srel = htab->elf.srelgot;
2471
0
      for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2472
0
  {
2473
0
    if (*local_got > 0)
2474
0
      {
2475
0
        *local_got = s->size;
2476
0
        s->size += SPARC_ELF_WORD_BYTES (htab);
2477
0
        if (*local_tls_type == GOT_TLS_GD)
2478
0
    s->size += SPARC_ELF_WORD_BYTES (htab);
2479
0
        if (bfd_link_pic (info)
2480
0
      || *local_tls_type == GOT_TLS_GD
2481
0
      || *local_tls_type == GOT_TLS_IE)
2482
0
    srel->size += SPARC_ELF_RELA_BYTES (htab);
2483
0
      }
2484
0
    else
2485
0
      *local_got = (bfd_vma) -1;
2486
0
  }
2487
0
    }
2488
2489
0
  if (htab->tls_ldm_got.refcount > 0)
2490
0
    {
2491
      /* Allocate 2 got entries and 1 dynamic reloc for
2492
   R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
2493
0
      htab->tls_ldm_got.offset = htab->elf.sgot->size;
2494
0
      htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
2495
0
      htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2496
0
    }
2497
0
  else
2498
0
    htab->tls_ldm_got.offset = -1;
2499
2500
  /* Allocate global sym .plt and .got entries, and space for global
2501
     sym dynamic relocs.  */
2502
0
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2503
2504
  /* Allocate .plt and .got entries, and space for local symbols.  */
2505
0
  htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
2506
2507
0
  if (! ABI_64_P (output_bfd)
2508
0
      && htab->elf.target_os != is_vxworks
2509
0
      && elf_hash_table (info)->dynamic_sections_created)
2510
0
    {
2511
      /* Make space for the trailing nop in .plt.  */
2512
0
      if (htab->elf.splt->size > 0)
2513
0
  htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
2514
2515
      /* If the .got section is more than 0x1000 bytes, we add
2516
   0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
2517
   bit relocations have a greater chance of working.
2518
2519
   FIXME: Make this optimization work for 64-bit too.  */
2520
0
      if (htab->elf.sgot->size >= 0x1000
2521
0
    && elf_hash_table (info)->hgot->root.u.def.value == 0)
2522
0
  elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
2523
0
    }
2524
2525
  /* The check_relocs and adjust_dynamic_symbol entry points have
2526
     determined the sizes of the various dynamic sections.  Allocate
2527
     memory for them.  */
2528
0
  for (s = dynobj->sections; s != NULL; s = s->next)
2529
0
    {
2530
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2531
0
  continue;
2532
2533
0
      if (s == htab->elf.splt
2534
0
    || s == htab->elf.sgot
2535
0
    || s == htab->elf.sdynbss
2536
0
    || s == htab->elf.sdynrelro
2537
0
    || s == htab->elf.iplt
2538
0
    || s == htab->elf.sgotplt)
2539
0
  {
2540
    /* Strip this section if we don't need it; see the
2541
       comment below.  */
2542
0
  }
2543
0
      else if (startswith (s->name, ".rela"))
2544
0
  {
2545
0
    if (s->size != 0)
2546
0
      {
2547
        /* We use the reloc_count field as a counter if we need
2548
     to copy relocs into the output file.  */
2549
0
        s->reloc_count = 0;
2550
0
      }
2551
0
  }
2552
0
      else
2553
0
  {
2554
    /* It's not one of our sections.  */
2555
0
    continue;
2556
0
  }
2557
2558
0
      if (s->size == 0)
2559
0
  {
2560
    /* If we don't need this section, strip it from the
2561
       output file.  This is mostly to handle .rela.bss and
2562
       .rela.plt.  We must create both sections in
2563
       create_dynamic_sections, because they must be created
2564
       before the linker maps input sections to output
2565
       sections.  The linker does that before
2566
       adjust_dynamic_symbol is called, and it is that
2567
       function which decides whether anything needs to go
2568
       into these sections.  */
2569
0
    s->flags |= SEC_EXCLUDE;
2570
0
    continue;
2571
0
  }
2572
2573
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2574
0
  continue;
2575
2576
      /* Allocate memory for the section contents.  Zero the memory
2577
   for the benefit of .rela.plt, which has 4 unused entries
2578
   at the beginning, and we don't want garbage.  */
2579
0
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2580
0
      if (s->contents == NULL)
2581
0
  return false;
2582
0
    }
2583
2584
0
  if (elf_hash_table (info)->dynamic_sections_created)
2585
0
    {
2586
      /* Add some entries to the .dynamic section.  We fill in the
2587
   values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
2588
   must add the entries now so that we get the correct size for
2589
   the .dynamic section.  The DT_DEBUG entry is filled in by the
2590
   dynamic linker and used by the debugger.  */
2591
0
#define add_dynamic_entry(TAG, VAL) \
2592
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2593
2594
0
      if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
2595
0
                true))
2596
0
  return false;
2597
2598
0
      if (ABI_64_P (output_bfd))
2599
0
  {
2600
0
    int reg;
2601
0
    struct _bfd_sparc_elf_app_reg * app_regs;
2602
0
    struct elf_strtab_hash *dynstr;
2603
0
    struct elf_link_hash_table *eht = elf_hash_table (info);
2604
2605
    /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
2606
       entries if needed.  */
2607
0
    app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
2608
0
    dynstr = eht->dynstr;
2609
2610
0
    for (reg = 0; reg < 4; reg++)
2611
0
      if (app_regs [reg].name != NULL)
2612
0
        {
2613
0
    struct elf_link_local_dynamic_entry *entry, *e;
2614
2615
0
    if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
2616
0
      return false;
2617
2618
0
    entry = (struct elf_link_local_dynamic_entry *)
2619
0
      bfd_hash_allocate (&info->hash->table, sizeof (*entry));
2620
0
    if (entry == NULL)
2621
0
      return false;
2622
2623
    /* We cheat here a little bit: the symbol will not be local, so we
2624
       put it at the end of the dynlocal linked list.  We will fix it
2625
       later on, as we have to fix other fields anyway.  */
2626
0
    entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
2627
0
    entry->isym.st_size = 0;
2628
0
    if (*app_regs [reg].name != '\0')
2629
0
      entry->isym.st_name
2630
0
        = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, false);
2631
0
    else
2632
0
      entry->isym.st_name = 0;
2633
0
    entry->isym.st_other = 0;
2634
0
    entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
2635
0
               STT_REGISTER);
2636
0
    entry->isym.st_shndx = app_regs [reg].shndx;
2637
0
    entry->isym.st_target_internal = 0;
2638
0
    entry->next = NULL;
2639
0
    entry->input_bfd = output_bfd;
2640
0
    entry->input_indx = -1;
2641
2642
0
    if (eht->dynlocal == NULL)
2643
0
      eht->dynlocal = entry;
2644
0
    else
2645
0
      {
2646
0
        for (e = eht->dynlocal; e->next; e = e->next)
2647
0
          ;
2648
0
        e->next = entry;
2649
0
      }
2650
0
    eht->dynsymcount++;
2651
0
        }
2652
0
  }
2653
0
    }
2654
0
#undef add_dynamic_entry
2655
2656
0
  return true;
2657
0
}
2658

2659
bool
2660
_bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
2661
240
{
2662
240
  if (!sec->used_by_bfd)
2663
240
    {
2664
240
      struct _bfd_sparc_elf_section_data *sdata;
2665
240
      size_t amt = sizeof (*sdata);
2666
2667
240
      sdata = bfd_zalloc (abfd, amt);
2668
240
      if (sdata == NULL)
2669
0
  return false;
2670
240
      sec->used_by_bfd = sdata;
2671
240
    }
2672
2673
240
  return _bfd_elf_new_section_hook (abfd, sec);
2674
240
}
2675
2676
bool
2677
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
2678
            struct bfd_section *section,
2679
            struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2680
            bool *again)
2681
0
{
2682
0
  if (bfd_link_relocatable (link_info))
2683
0
    (*link_info->callbacks->einfo)
2684
0
      (_("%P%F: --relax and -r may not be used together\n"));
2685
2686
0
  *again = false;
2687
0
  sec_do_relax (section) = 1;
2688
0
  return true;
2689
0
}
2690

2691
/* Return the base VMA address which should be subtracted from real addresses
2692
   when resolving @dtpoff relocation.
2693
   This is PT_TLS segment p_vaddr.  */
2694
2695
static bfd_vma
2696
dtpoff_base (struct bfd_link_info *info)
2697
0
{
2698
  /* If tls_sec is NULL, we should have signalled an error already.  */
2699
0
  if (elf_hash_table (info)->tls_sec == NULL)
2700
0
    return 0;
2701
0
  return elf_hash_table (info)->tls_sec->vma;
2702
0
}
2703
2704
/* Return the relocation value for @tpoff relocation
2705
   if STT_TLS virtual address is ADDRESS.  */
2706
2707
static bfd_vma
2708
tpoff (struct bfd_link_info *info, bfd_vma address)
2709
0
{
2710
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2711
0
  const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
2712
0
  bfd_vma static_tls_size;
2713
2714
  /* If tls_sec is NULL, we should have signalled an error already.  */
2715
0
  if (htab->tls_sec == NULL)
2716
0
    return 0;
2717
2718
  /* Consider special static TLS alignment requirements.  */
2719
0
  static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
2720
0
  return address - static_tls_size - htab->tls_sec->vma;
2721
0
}
2722
2723
/* Return the relocation value for a %gdop relocation.  */
2724
2725
static bfd_vma
2726
gdopoff (struct bfd_link_info *info, bfd_vma address)
2727
0
{
2728
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2729
0
  bfd_vma got_base;
2730
2731
0
  got_base = (htab->hgot->root.u.def.value
2732
0
        + htab->hgot->root.u.def.section->output_offset
2733
0
        + htab->hgot->root.u.def.section->output_section->vma);
2734
2735
0
  return address - got_base;
2736
0
}
2737
2738
/* Return whether H is local and its ADDRESS is within 4G of
2739
   _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a
2740
   sethi, xor sequence.  */
2741
2742
static bool
2743
gdop_relative_offset_ok (struct bfd_link_info *info,
2744
       struct elf_link_hash_entry *h,
2745
       bfd_vma address ATTRIBUTE_UNUSED)
2746
0
{
2747
0
  if (!SYMBOL_REFERENCES_LOCAL (info, h))
2748
0
    return false;
2749
  /* If H is undefined, ADDRESS will be zero.  We can't allow a
2750
     relative offset to "zero" when producing PIEs or shared libs.
2751
     Note that to get here with an undefined symbol it must also be
2752
     hidden or internal visibility.  */
2753
0
  if (bfd_link_pic (info)
2754
0
      && h != NULL
2755
0
      && (h->root.type == bfd_link_hash_undefweak
2756
0
    || h->root.type == bfd_link_hash_undefined))
2757
0
    return false;
2758
0
#ifdef BFD64
2759
0
  return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32;
2760
#else
2761
  return true;
2762
#endif
2763
0
}
2764
2765
/* Relocate a SPARC ELF section.  */
2766
2767
int
2768
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
2769
         struct bfd_link_info *info,
2770
         bfd *input_bfd,
2771
         asection *input_section,
2772
         bfd_byte *contents,
2773
         Elf_Internal_Rela *relocs,
2774
         Elf_Internal_Sym *local_syms,
2775
         asection **local_sections)
2776
0
{
2777
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2778
0
  Elf_Internal_Shdr *symtab_hdr;
2779
0
  struct elf_link_hash_entry **sym_hashes;
2780
0
  bfd_vma *local_got_offsets;
2781
0
  bfd_vma got_base;
2782
0
  asection *sreloc;
2783
0
  Elf_Internal_Rela *rel;
2784
0
  Elf_Internal_Rela *relend;
2785
0
  int num_relocs;
2786
0
  bool is_vxworks_tls;
2787
2788
0
  htab = _bfd_sparc_elf_hash_table (info);
2789
0
  BFD_ASSERT (htab != NULL);
2790
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
2791
0
  sym_hashes = elf_sym_hashes (input_bfd);
2792
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
2793
2794
0
  if (elf_hash_table (info)->hgot == NULL)
2795
0
    got_base = 0;
2796
0
  else
2797
0
    got_base = elf_hash_table (info)->hgot->root.u.def.value;
2798
2799
0
  sreloc = elf_section_data (input_section)->sreloc;
2800
  /* We have to handle relocations in vxworks .tls_vars sections
2801
     specially, because the dynamic loader is 'weird'.  */
2802
0
  is_vxworks_tls = (htab->elf.target_os == is_vxworks
2803
0
        && bfd_link_pic (info)
2804
0
        && !strcmp (input_section->output_section->name,
2805
0
        ".tls_vars"));
2806
2807
0
  rel = relocs;
2808
0
  if (ABI_64_P (output_bfd))
2809
0
    num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
2810
0
  else
2811
0
    num_relocs = input_section->reloc_count;
2812
0
  relend = relocs + num_relocs;
2813
0
  for (; rel < relend; rel++)
2814
0
    {
2815
0
      int r_type, tls_type;
2816
0
      reloc_howto_type *howto;
2817
0
      unsigned long r_symndx;
2818
0
      struct elf_link_hash_entry *h;
2819
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
2820
0
      Elf_Internal_Sym *sym;
2821
0
      asection *sec;
2822
0
      bfd_vma relocation, off;
2823
0
      bfd_reloc_status_type r;
2824
0
      bool is_plt = false;
2825
0
      bool unresolved_reloc;
2826
0
      bool resolved_to_zero;
2827
0
      bool relative_reloc;
2828
2829
0
      r_type = SPARC_ELF_R_TYPE (rel->r_info);
2830
0
      if (r_type == R_SPARC_GNU_VTINHERIT
2831
0
    || r_type == R_SPARC_GNU_VTENTRY)
2832
0
  continue;
2833
2834
0
      if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2835
0
  {
2836
0
    bfd_set_error (bfd_error_bad_value);
2837
0
    return false;
2838
0
  }
2839
2840
0
      howto = _bfd_sparc_elf_howto_table + r_type;
2841
0
      r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
2842
0
      h = NULL;
2843
0
      sym = NULL;
2844
0
      sec = NULL;
2845
0
      unresolved_reloc = false;
2846
0
      if (r_symndx < symtab_hdr->sh_info)
2847
0
  {
2848
0
    sym = local_syms + r_symndx;
2849
0
    sec = local_sections[r_symndx];
2850
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2851
2852
0
    if (!bfd_link_relocatable (info)
2853
0
        && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2854
0
      {
2855
        /* Relocate against local STT_GNU_IFUNC symbol.  */
2856
0
        h = elf_sparc_get_local_sym_hash (htab, input_bfd,
2857
0
            rel, false);
2858
0
        if (h == NULL)
2859
0
    abort ();
2860
2861
        /* Set STT_GNU_IFUNC symbol value.  */
2862
0
        h->root.u.def.value = sym->st_value;
2863
0
        h->root.u.def.section = sec;
2864
0
      }
2865
0
  }
2866
0
      else
2867
0
  {
2868
0
    bool warned, ignored;
2869
2870
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2871
0
           r_symndx, symtab_hdr, sym_hashes,
2872
0
           h, sec, relocation,
2873
0
           unresolved_reloc, warned, ignored);
2874
0
    if (warned)
2875
0
      {
2876
        /* To avoid generating warning messages about truncated
2877
     relocations, set the relocation's address to be the same as
2878
     the start of this section.  */
2879
0
        if (input_section->output_section != NULL)
2880
0
    relocation = input_section->output_section->vma;
2881
0
        else
2882
0
    relocation = 0;
2883
0
      }
2884
0
  }
2885
2886
0
      if (sec != NULL && discarded_section (sec))
2887
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2888
0
           rel, 1, relend, howto, 0, contents);
2889
2890
0
      if (bfd_link_relocatable (info))
2891
0
  continue;
2892
2893
0
      if (h != NULL
2894
0
    && h->type == STT_GNU_IFUNC
2895
0
    && h->def_regular)
2896
0
  {
2897
0
    asection *plt_sec;
2898
0
    const char *name;
2899
2900
0
    if ((input_section->flags & SEC_ALLOC) == 0
2901
0
        || h->plt.offset == (bfd_vma) -1)
2902
0
      {
2903
        /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2904
           STT_GNU_IFUNC symbol as STT_FUNC.  */
2905
0
        if (elf_section_type (input_section) == SHT_NOTE)
2906
0
    goto skip_ifunc;
2907
2908
        /* Dynamic relocs are not propagated for SEC_DEBUGGING
2909
     sections because such sections are not SEC_ALLOC and
2910
     thus ld.so will not process them.  */
2911
0
        if ((input_section->flags & SEC_ALLOC) == 0
2912
0
      && (input_section->flags & SEC_DEBUGGING) != 0)
2913
0
    continue;
2914
2915
0
        _bfd_error_handler
2916
    /* xgettext:c-format */
2917
0
    (_("%pB(%pA+%#" PRIx64 "): "
2918
0
       "unresolvable %s relocation against symbol `%s'"),
2919
0
     input_bfd,
2920
0
     input_section,
2921
0
     (uint64_t) rel->r_offset,
2922
0
     howto->name,
2923
0
     h->root.root.string);
2924
0
        bfd_set_error (bfd_error_bad_value);
2925
0
        return false;
2926
0
      }
2927
2928
0
    plt_sec = htab->elf.splt;
2929
0
    if (! plt_sec)
2930
0
      plt_sec =htab->elf.iplt;
2931
2932
0
    switch (r_type)
2933
0
      {
2934
0
      case R_SPARC_GOTDATA_OP:
2935
0
        continue;
2936
2937
0
      case R_SPARC_GOTDATA_OP_HIX22:
2938
0
      case R_SPARC_GOTDATA_OP_LOX10:
2939
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
2940
0
      ? R_SPARC_GOT22
2941
0
      : R_SPARC_GOT10);
2942
0
        howto = _bfd_sparc_elf_howto_table + r_type;
2943
        /* Fall through.  */
2944
2945
0
      case R_SPARC_GOT10:
2946
0
      case R_SPARC_GOT13:
2947
0
      case R_SPARC_GOT22:
2948
0
        if (htab->elf.sgot == NULL)
2949
0
    abort ();
2950
0
        off = h->got.offset;
2951
0
        if (off == (bfd_vma) -1)
2952
0
    abort();
2953
0
        relocation = htab->elf.sgot->output_offset + off - got_base;
2954
0
        goto do_relocation;
2955
2956
0
      case R_SPARC_WPLT30:
2957
0
      case R_SPARC_WDISP30:
2958
0
        relocation = (plt_sec->output_section->vma
2959
0
          + plt_sec->output_offset + h->plt.offset);
2960
0
        goto do_relocation;
2961
2962
0
      case R_SPARC_32:
2963
0
      case R_SPARC_64:
2964
0
        if (bfd_link_pic (info) && h->non_got_ref)
2965
0
    {
2966
0
      Elf_Internal_Rela outrel;
2967
0
      bfd_vma offset;
2968
2969
0
      offset = _bfd_elf_section_offset (output_bfd, info,
2970
0
                input_section,
2971
0
                rel->r_offset);
2972
0
      if (offset == (bfd_vma) -1
2973
0
          || offset == (bfd_vma) -2)
2974
0
        abort();
2975
2976
0
      outrel.r_offset = (input_section->output_section->vma
2977
0
             + input_section->output_offset
2978
0
             + offset);
2979
2980
0
      if (h->dynindx == -1
2981
0
          || h->forced_local
2982
0
          || bfd_link_executable (info))
2983
0
        {
2984
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2985
0
              0, R_SPARC_IRELATIVE);
2986
0
          outrel.r_addend = relocation + rel->r_addend;
2987
0
        }
2988
0
      else
2989
0
        {
2990
0
          if (h->dynindx == -1)
2991
0
      abort();
2992
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
2993
0
          outrel.r_addend = rel->r_addend;
2994
0
        }
2995
2996
0
      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
2997
0
      continue;
2998
0
    }
2999
3000
0
        relocation = (plt_sec->output_section->vma
3001
0
          + plt_sec->output_offset + h->plt.offset);
3002
0
        goto do_relocation;
3003
3004
0
      case R_SPARC_HI22:
3005
0
      case R_SPARC_LO10:
3006
        /* We should only see such relocs in static links.  */
3007
0
        if (bfd_link_pic (info))
3008
0
    abort();
3009
0
        relocation = (plt_sec->output_section->vma
3010
0
          + plt_sec->output_offset + h->plt.offset);
3011
0
        goto do_relocation;
3012
3013
0
      default:
3014
0
        if (h->root.root.string)
3015
0
    name = h->root.root.string;
3016
0
        else
3017
0
    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3018
0
           NULL);
3019
0
        _bfd_error_handler
3020
    /* xgettext:c-format */
3021
0
    (_("%pB: relocation %s against STT_GNU_IFUNC "
3022
0
       "symbol `%s' isn't handled by %s"), input_bfd,
3023
0
     _bfd_sparc_elf_howto_table[r_type].name,
3024
0
     name, __func__);
3025
0
        bfd_set_error (bfd_error_bad_value);
3026
0
        return false;
3027
0
      }
3028
0
  }
3029
3030
0
    skip_ifunc:
3031
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
3032
0
      resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
3033
3034
0
      switch (r_type)
3035
0
  {
3036
0
  case R_SPARC_GOTDATA_OP_HIX22:
3037
0
  case R_SPARC_GOTDATA_OP_LOX10:
3038
0
    if (gdop_relative_offset_ok (info, h, relocation))
3039
0
      {
3040
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3041
0
      ? R_SPARC_GOTDATA_HIX22
3042
0
      : R_SPARC_GOTDATA_LOX10);
3043
0
        howto = _bfd_sparc_elf_howto_table + r_type;
3044
0
      }
3045
0
    break;
3046
3047
0
  case R_SPARC_GOTDATA_OP:
3048
0
    if (gdop_relative_offset_ok (info, h, relocation))
3049
0
      {
3050
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3051
3052
        /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
3053
0
        relocation = 0x80000000 | (insn & 0x3e07c01f);
3054
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3055
3056
        /* If the symbol is global but not dynamic, an .rela.* slot has
3057
     been allocated for it in the GOT so output R_SPARC_NONE here,
3058
     if it isn't also subject to another, old-style GOT relocation.
3059
     See also the handling of these GOT relocations just below.  */
3060
0
        if (h != NULL
3061
0
      && h->dynindx == -1
3062
0
      && !h->forced_local
3063
0
      && h->root.type != bfd_link_hash_undefweak
3064
0
      && !eh->has_old_style_got_reloc
3065
0
      && (h->got.offset & 1) == 0
3066
0
      && bfd_link_pic (info))
3067
0
    {
3068
0
      asection *s = htab->elf.srelgot;
3069
0
      Elf_Internal_Rela outrel;
3070
3071
0
      BFD_ASSERT (s != NULL);
3072
3073
0
      memset (&outrel, 0, sizeof outrel);
3074
0
      sparc_elf_append_rela (output_bfd, s, &outrel);
3075
0
      h->got.offset |= 1;
3076
0
    }
3077
0
      }
3078
0
    continue;
3079
0
  }
3080
3081
0
      switch (r_type)
3082
0
  {
3083
0
  case R_SPARC_GOTDATA_HIX22:
3084
0
  case R_SPARC_GOTDATA_LOX10:
3085
0
    relocation = gdopoff (info, relocation);
3086
0
    break;
3087
3088
0
  case R_SPARC_GOTDATA_OP_HIX22:
3089
0
  case R_SPARC_GOTDATA_OP_LOX10:
3090
0
  case R_SPARC_GOT10:
3091
0
  case R_SPARC_GOT13:
3092
0
  case R_SPARC_GOT22:
3093
    /* Relocation is to the entry for this symbol in the global
3094
       offset table.  */
3095
0
    if (htab->elf.sgot == NULL)
3096
0
      abort ();
3097
3098
0
    relative_reloc = false;
3099
0
    if (h != NULL)
3100
0
      {
3101
0
        bool dyn;
3102
3103
0
        off = h->got.offset;
3104
0
        BFD_ASSERT (off != (bfd_vma) -1);
3105
0
        dyn = elf_hash_table (info)->dynamic_sections_created;
3106
3107
0
        if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3108
0
                 bfd_link_pic (info),
3109
0
                 h)
3110
0
      || (bfd_link_pic (info)
3111
0
          && SYMBOL_REFERENCES_LOCAL (info, h)))
3112
0
    {
3113
      /* This is actually a static link, or it is a
3114
         -Bsymbolic link and the symbol is defined
3115
         locally, or the symbol was forced to be local
3116
         because of a version file.  We must initialize
3117
         this entry in the global offset table.  Since the
3118
         offset must always be a multiple of 8 for 64-bit
3119
         and 4 for 32-bit, we use the least significant bit
3120
         to record whether we have initialized it already.
3121
3122
         When doing a dynamic link, we create a .rela.got
3123
         relocation entry to initialize the value.  This
3124
         is done in the finish_dynamic_symbol routine.  */
3125
0
      if ((off & 1) != 0)
3126
0
        off &= ~1;
3127
0
      else
3128
0
        {
3129
          /* If this symbol isn't dynamic in PIC mode, treat it
3130
       like a local symbol in PIC mode below.  */
3131
0
          if (h->dynindx == -1
3132
0
        && !h->forced_local
3133
0
        && h->root.type != bfd_link_hash_undefweak
3134
0
        && bfd_link_pic (info))
3135
0
      relative_reloc = true;
3136
0
          else
3137
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3138
0
              htab->elf.sgot->contents + off);
3139
0
          h->got.offset |= 1;
3140
0
        }
3141
0
    }
3142
0
        else
3143
0
    unresolved_reloc = false;
3144
0
      }
3145
0
    else
3146
0
      {
3147
0
        BFD_ASSERT (local_got_offsets != NULL
3148
0
        && local_got_offsets[r_symndx] != (bfd_vma) -1);
3149
3150
0
        off = local_got_offsets[r_symndx];
3151
3152
        /* The offset must always be a multiple of 8 on 64-bit and
3153
     4 on 32-bit.  We use the least significant bit to record
3154
     whether we have already processed this entry.  */
3155
0
        if ((off & 1) != 0)
3156
0
    off &= ~1;
3157
0
        else
3158
0
    {
3159
      /* For a local symbol in PIC mode, we need to generate a
3160
         R_SPARC_RELATIVE reloc for the dynamic linker.  */
3161
0
      if (bfd_link_pic (info))
3162
0
        relative_reloc = true;
3163
0
      else
3164
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3165
0
          htab->elf.sgot->contents + off);
3166
0
      local_got_offsets[r_symndx] |= 1;
3167
0
    }
3168
0
      }
3169
3170
0
    if (relative_reloc)
3171
0
      {
3172
0
        asection *s = htab->elf.srelgot;
3173
0
        Elf_Internal_Rela outrel;
3174
3175
0
        BFD_ASSERT (s != NULL);
3176
3177
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3178
0
         + htab->elf.sgot->output_offset
3179
0
         + off);
3180
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3181
0
            0, R_SPARC_RELATIVE);
3182
0
        outrel.r_addend = relocation;
3183
0
        sparc_elf_append_rela (output_bfd, s, &outrel);
3184
        /* Versions of glibc ld.so at least up to 2.26 wrongly
3185
     add the section contents to the value calculated for
3186
     a RELATIVE reloc.  Zero the contents to work around
3187
     this bug.  */
3188
0
        relocation = 0;
3189
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3190
0
          htab->elf.sgot->contents + off);
3191
0
      }
3192
3193
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3194
0
    break;
3195
3196
0
  case R_SPARC_PLT32:
3197
0
  case R_SPARC_PLT64:
3198
0
    if (h == NULL || h->plt.offset == (bfd_vma) -1)
3199
0
      {
3200
0
        r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
3201
0
        goto r_sparc_plt32;
3202
0
      }
3203
    /* Fall through.  */
3204
3205
0
  case R_SPARC_WPLT30:
3206
0
  case R_SPARC_HIPLT22:
3207
0
  case R_SPARC_LOPLT10:
3208
0
  case R_SPARC_PCPLT32:
3209
0
  case R_SPARC_PCPLT22:
3210
0
  case R_SPARC_PCPLT10:
3211
0
  r_sparc_wplt30:
3212
    /* Relocation is to the entry for this symbol in the
3213
       procedure linkage table.  */
3214
3215
0
    if (! ABI_64_P (output_bfd))
3216
0
      {
3217
        /* The Solaris native assembler will generate a WPLT30 reloc
3218
     for a local symbol if you assemble a call from one
3219
     section to another when using -K pic.  We treat it as
3220
     WDISP30.  */
3221
0
        if (h == NULL)
3222
0
    break;
3223
0
      }
3224
    /* PR 7027: We need similar behaviour for 64-bit binaries.  */
3225
0
    else if (r_type == R_SPARC_WPLT30 && h == NULL)
3226
0
      break;
3227
0
    else
3228
0
      {
3229
0
        BFD_ASSERT (h != NULL);
3230
0
      }
3231
3232
0
    if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3233
0
      {
3234
        /* We didn't make a PLT entry for this symbol.  This
3235
     happens when statically linking PIC code, or when
3236
     using -Bsymbolic.  */
3237
0
        break;
3238
0
      }
3239
3240
0
    relocation = (htab->elf.splt->output_section->vma
3241
0
      + htab->elf.splt->output_offset
3242
0
      + h->plt.offset);
3243
0
    unresolved_reloc = false;
3244
0
    if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
3245
0
      {
3246
0
        r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
3247
0
        is_plt = true;
3248
0
        goto r_sparc_plt32;
3249
0
      }
3250
0
    break;
3251
3252
0
  case R_SPARC_PC10:
3253
0
  case R_SPARC_PC22:
3254
0
  case R_SPARC_PC_HH22:
3255
0
  case R_SPARC_PC_HM10:
3256
0
  case R_SPARC_PC_LM22:
3257
0
    if (h != NULL
3258
0
        && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3259
0
      break;
3260
    /* Fall through.  */
3261
0
  case R_SPARC_DISP8:
3262
0
  case R_SPARC_DISP16:
3263
0
  case R_SPARC_DISP32:
3264
0
  case R_SPARC_DISP64:
3265
0
  case R_SPARC_WDISP30:
3266
0
  case R_SPARC_WDISP22:
3267
0
  case R_SPARC_WDISP19:
3268
0
  case R_SPARC_WDISP16:
3269
0
  case R_SPARC_WDISP10:
3270
0
  case R_SPARC_8:
3271
0
  case R_SPARC_16:
3272
0
  case R_SPARC_32:
3273
0
  case R_SPARC_HI22:
3274
0
  case R_SPARC_22:
3275
0
  case R_SPARC_13:
3276
0
  case R_SPARC_LO10:
3277
0
  case R_SPARC_UA16:
3278
0
  case R_SPARC_UA32:
3279
0
  case R_SPARC_10:
3280
0
  case R_SPARC_11:
3281
0
  case R_SPARC_64:
3282
0
  case R_SPARC_OLO10:
3283
0
  case R_SPARC_HH22:
3284
0
  case R_SPARC_HM10:
3285
0
  case R_SPARC_LM22:
3286
0
  case R_SPARC_7:
3287
0
  case R_SPARC_5:
3288
0
  case R_SPARC_6:
3289
0
  case R_SPARC_HIX22:
3290
0
  case R_SPARC_LOX10:
3291
0
  case R_SPARC_H44:
3292
0
  case R_SPARC_M44:
3293
0
  case R_SPARC_L44:
3294
0
  case R_SPARC_H34:
3295
0
  case R_SPARC_UA64:
3296
0
  r_sparc_plt32:
3297
0
    if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls)
3298
0
      break;
3299
3300
    /* Copy dynamic function pointer relocations.  Don't generate
3301
       dynamic relocations against resolved undefined weak symbols
3302
       in PIE.  */
3303
0
    if ((bfd_link_pic (info)
3304
0
         && (h == NULL
3305
0
       || !(h->root.type == bfd_link_hash_undefweak
3306
0
      && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3307
0
          || resolved_to_zero)))
3308
0
         && (! howto->pc_relative
3309
0
       || !SYMBOL_CALLS_LOCAL (info, h)))
3310
0
        || (!bfd_link_pic (info)
3311
0
      && h != NULL
3312
0
      && h->dynindx != -1
3313
0
      && !h->non_got_ref
3314
0
      && ((h->def_dynamic
3315
0
           && !h->def_regular)
3316
0
          || (h->root.type == bfd_link_hash_undefweak
3317
0
        && !resolved_to_zero)
3318
0
          || h->root.type == bfd_link_hash_undefined)))
3319
0
      {
3320
0
        Elf_Internal_Rela outrel;
3321
0
        bool skip, relocate = false;
3322
3323
        /* When generating a shared object, these relocations
3324
     are copied into the output file to be resolved at run
3325
     time.  */
3326
3327
0
        BFD_ASSERT (sreloc != NULL);
3328
3329
0
        skip = false;
3330
3331
0
        outrel.r_offset =
3332
0
    _bfd_elf_section_offset (output_bfd, info, input_section,
3333
0
           rel->r_offset);
3334
0
        if (outrel.r_offset == (bfd_vma) -1)
3335
0
    skip = true;
3336
0
        else if (outrel.r_offset == (bfd_vma) -2)
3337
0
    skip = true, relocate = true;
3338
0
        outrel.r_offset += (input_section->output_section->vma
3339
0
          + input_section->output_offset);
3340
3341
        /* Optimize unaligned reloc usage now that we know where
3342
     it finally resides.  */
3343
0
        switch (r_type)
3344
0
    {
3345
0
    case R_SPARC_16:
3346
0
      if (outrel.r_offset & 1)
3347
0
        r_type = R_SPARC_UA16;
3348
0
      break;
3349
0
    case R_SPARC_UA16:
3350
0
      if (!(outrel.r_offset & 1))
3351
0
        r_type = R_SPARC_16;
3352
0
      break;
3353
0
    case R_SPARC_32:
3354
0
      if (outrel.r_offset & 3)
3355
0
        r_type = R_SPARC_UA32;
3356
0
      break;
3357
0
    case R_SPARC_UA32:
3358
0
      if (!(outrel.r_offset & 3))
3359
0
        r_type = R_SPARC_32;
3360
0
      break;
3361
0
    case R_SPARC_64:
3362
0
      if (outrel.r_offset & 7)
3363
0
        r_type = R_SPARC_UA64;
3364
0
      break;
3365
0
    case R_SPARC_UA64:
3366
0
      if (!(outrel.r_offset & 7))
3367
0
        r_type = R_SPARC_64;
3368
0
      break;
3369
0
    case R_SPARC_DISP8:
3370
0
    case R_SPARC_DISP16:
3371
0
    case R_SPARC_DISP32:
3372
0
    case R_SPARC_DISP64:
3373
      /* If the symbol is not dynamic, we should not keep
3374
         a dynamic relocation.  But an .rela.* slot has been
3375
         allocated for it, output R_SPARC_NONE.
3376
         FIXME: Add code tracking needed dynamic relocs as
3377
         e.g. i386 has.  */
3378
0
      if (h->dynindx == -1)
3379
0
        skip = true, relocate = true;
3380
0
      break;
3381
0
    }
3382
3383
0
        if (skip)
3384
0
    memset (&outrel, 0, sizeof outrel);
3385
        /* h->dynindx may be -1 if the symbol was marked to
3386
     become local.  */
3387
0
        else if (h != NULL
3388
0
           && h->dynindx != -1
3389
0
           && (_bfd_sparc_elf_howto_table[r_type].pc_relative
3390
0
         || !bfd_link_pic (info)
3391
0
         || !SYMBOLIC_BIND (info, h)
3392
0
         || !h->def_regular))
3393
0
    {
3394
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3395
0
      outrel.r_addend = rel->r_addend;
3396
0
    }
3397
0
        else
3398
0
    {
3399
0
      if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
3400
0
          || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
3401
0
        {
3402
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3403
0
              0, R_SPARC_RELATIVE);
3404
0
          outrel.r_addend = relocation + rel->r_addend;
3405
0
        }
3406
0
      else
3407
0
        {
3408
0
          long indx;
3409
3410
0
          outrel.r_addend = relocation + rel->r_addend;
3411
3412
0
          if (is_plt)
3413
0
      sec = htab->elf.splt;
3414
3415
0
          if (bfd_is_abs_section (sec))
3416
0
      indx = 0;
3417
0
          else if (sec == NULL || sec->owner == NULL)
3418
0
      {
3419
0
        bfd_set_error (bfd_error_bad_value);
3420
0
        return false;
3421
0
      }
3422
0
          else
3423
0
      {
3424
0
        asection *osec;
3425
3426
        /* We are turning this relocation into one
3427
           against a section symbol.  It would be
3428
           proper to subtract the symbol's value,
3429
           osec->vma, from the emitted reloc addend,
3430
           but ld.so expects buggy relocs.  */
3431
0
        osec = sec->output_section;
3432
0
        indx = elf_section_data (osec)->dynindx;
3433
3434
0
        if (indx == 0)
3435
0
          {
3436
0
            osec = htab->elf.text_index_section;
3437
0
            indx = elf_section_data (osec)->dynindx;
3438
0
          }
3439
3440
        /* FIXME: we really should be able to link non-pic
3441
           shared libraries.  */
3442
0
        if (indx == 0)
3443
0
          {
3444
0
            BFD_FAIL ();
3445
0
            _bfd_error_handler
3446
0
        (_("%pB: probably compiled without -fPIC?"),
3447
0
         input_bfd);
3448
0
            bfd_set_error (bfd_error_bad_value);
3449
0
            return false;
3450
0
          }
3451
0
      }
3452
3453
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3454
0
              r_type);
3455
0
        }
3456
0
    }
3457
3458
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3459
3460
        /* This reloc will be computed at runtime, so there's no
3461
     need to do anything now.  */
3462
0
        if (! relocate)
3463
0
    continue;
3464
0
      }
3465
0
    break;
3466
3467
0
  case R_SPARC_TLS_GD_HI22:
3468
0
  case R_SPARC_TLS_GD_LO10:
3469
0
  case R_SPARC_TLS_IE_HI22:
3470
0
  case R_SPARC_TLS_IE_LO10:
3471
0
    r_type = sparc_elf_tls_transition (info, input_bfd, r_type,
3472
0
               h == NULL || h->dynindx == -1);
3473
0
    if (r_type == R_SPARC_REV32)
3474
0
      break;
3475
0
    if (h != NULL)
3476
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3477
0
    else if (local_got_offsets)
3478
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3479
0
    else
3480
0
      tls_type = GOT_UNKNOWN;
3481
0
    if (tls_type == GOT_TLS_IE)
3482
0
      switch (r_type)
3483
0
        {
3484
0
        case R_SPARC_TLS_GD_HI22:
3485
0
    r_type = R_SPARC_TLS_IE_HI22;
3486
0
    break;
3487
0
        case R_SPARC_TLS_GD_LO10:
3488
0
    r_type = R_SPARC_TLS_IE_LO10;
3489
0
    break;
3490
0
        }
3491
3492
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3493
0
      {
3494
0
        relocation = tpoff (info, relocation);
3495
0
        break;
3496
0
      }
3497
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3498
0
      {
3499
        /* Change add into xor.  */
3500
0
        relocation = tpoff (info, relocation);
3501
0
        bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3502
0
               contents + rel->r_offset)
3503
0
               | 0x80182000), contents + rel->r_offset);
3504
0
        break;
3505
0
      }
3506
3507
0
    if (h != NULL)
3508
0
      {
3509
0
        off = h->got.offset;
3510
0
        h->got.offset |= 1;
3511
0
      }
3512
0
    else
3513
0
      {
3514
0
        BFD_ASSERT (local_got_offsets != NULL);
3515
0
        off = local_got_offsets[r_symndx];
3516
0
        local_got_offsets[r_symndx] |= 1;
3517
0
      }
3518
3519
0
  r_sparc_tlsldm:
3520
0
    if (htab->elf.sgot == NULL)
3521
0
      abort ();
3522
3523
0
    if ((off & 1) != 0)
3524
0
      off &= ~1;
3525
0
    else
3526
0
      {
3527
0
        Elf_Internal_Rela outrel;
3528
0
        int dr_type, indx;
3529
3530
0
        if (htab->elf.srelgot == NULL)
3531
0
    abort ();
3532
3533
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3534
0
          htab->elf.sgot->contents + off);
3535
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3536
0
         + htab->elf.sgot->output_offset + off);
3537
0
        indx = h && h->dynindx != -1 ? h->dynindx : 0;
3538
0
        if (r_type == R_SPARC_TLS_IE_HI22
3539
0
      || r_type == R_SPARC_TLS_IE_LO10)
3540
0
    dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3541
0
        else
3542
0
    dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3543
0
        if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3544
0
    outrel.r_addend = relocation - dtpoff_base (info);
3545
0
        else
3546
0
    outrel.r_addend = 0;
3547
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3548
0
        sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3549
3550
0
        if (r_type == R_SPARC_TLS_GD_HI22
3551
0
      || r_type == R_SPARC_TLS_GD_LO10)
3552
0
    {
3553
0
      if (indx == 0)
3554
0
        {
3555
0
          BFD_ASSERT (! unresolved_reloc);
3556
0
          SPARC_ELF_PUT_WORD (htab, output_bfd,
3557
0
            relocation - dtpoff_base (info),
3558
0
            (htab->elf.sgot->contents + off
3559
0
             + SPARC_ELF_WORD_BYTES (htab)));
3560
0
        }
3561
0
      else
3562
0
        {
3563
0
          SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3564
0
            (htab->elf.sgot->contents + off
3565
0
             + SPARC_ELF_WORD_BYTES (htab)));
3566
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3567
0
              SPARC_ELF_DTPOFF_RELOC (htab));
3568
0
          outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3569
0
          sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3570
0
               &outrel);
3571
0
        }
3572
0
    }
3573
0
        else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3574
0
    {
3575
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3576
0
              (htab->elf.sgot->contents + off
3577
0
               + SPARC_ELF_WORD_BYTES (htab)));
3578
0
    }
3579
0
      }
3580
3581
0
    if (off >= (bfd_vma) -2)
3582
0
      abort ();
3583
3584
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3585
0
    unresolved_reloc = false;
3586
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3587
0
    break;
3588
3589
0
  case R_SPARC_TLS_LDM_HI22:
3590
0
  case R_SPARC_TLS_LDM_LO10:
3591
    /* LD -> LE */
3592
0
    if (bfd_link_executable (info))
3593
0
      {
3594
0
        bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3595
0
        continue;
3596
0
      }
3597
0
    off = htab->tls_ldm_got.offset;
3598
0
    htab->tls_ldm_got.offset |= 1;
3599
0
    goto r_sparc_tlsldm;
3600
3601
0
  case R_SPARC_TLS_LDO_HIX22:
3602
0
  case R_SPARC_TLS_LDO_LOX10:
3603
    /* LD -> LE */
3604
0
    if (bfd_link_executable (info))
3605
0
      {
3606
0
        if (r_type == R_SPARC_TLS_LDO_HIX22)
3607
0
    r_type = R_SPARC_TLS_LE_HIX22;
3608
0
        else
3609
0
    r_type = R_SPARC_TLS_LE_LOX10;
3610
0
      }
3611
0
    else
3612
0
      {
3613
0
        relocation -= dtpoff_base (info);
3614
0
        break;
3615
0
      }
3616
    /* Fall through.  */
3617
3618
0
  case R_SPARC_TLS_LE_HIX22:
3619
0
  case R_SPARC_TLS_LE_LOX10:
3620
0
    if (!bfd_link_executable (info))
3621
0
      {
3622
0
        Elf_Internal_Rela outrel;
3623
0
        bfd_vma offset
3624
0
    = _bfd_elf_section_offset (output_bfd, info, input_section,
3625
0
             rel->r_offset);
3626
0
        if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2)
3627
0
    memset (&outrel, 0, sizeof outrel);
3628
0
        else
3629
0
    {
3630
0
      outrel.r_offset = offset
3631
0
            + input_section->output_section->vma
3632
0
            + input_section->output_offset;
3633
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3634
0
      outrel.r_addend
3635
0
        = relocation - dtpoff_base (info) + rel->r_addend;
3636
0
    }
3637
3638
0
        BFD_ASSERT (sreloc != NULL);
3639
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3640
0
        continue;
3641
0
      }
3642
0
    relocation = tpoff (info, relocation);
3643
0
    break;
3644
3645
0
  case R_SPARC_TLS_LDM_CALL:
3646
    /* LD -> LE */
3647
0
    if (bfd_link_executable (info))
3648
0
      {
3649
        /* mov %g0, %o0 */
3650
0
        bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3651
0
        continue;
3652
0
      }
3653
    /* Fall through */
3654
3655
0
  case R_SPARC_TLS_GD_CALL:
3656
0
    if (h != NULL)
3657
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3658
0
    else if (local_got_offsets)
3659
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3660
0
    else
3661
0
      tls_type = GOT_UNKNOWN;
3662
    /* GD -> IE or LE */
3663
0
    if (bfd_link_executable (info)
3664
0
        || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3665
0
      {
3666
0
        Elf_Internal_Rela *rel2;
3667
0
        bfd_vma insn;
3668
3669
        /* GD -> LE */
3670
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3671
0
    {
3672
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3673
0
      continue;
3674
0
    }
3675
3676
        /* GD -> IE */
3677
0
        if (rel + 1 < relend
3678
0
      && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3679
0
      && rel[1].r_offset == rel->r_offset + 4
3680
0
      && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3681
0
      && (((insn = bfd_get_32 (input_bfd,
3682
0
             contents + rel[1].r_offset))
3683
0
           >> 25) & 0x1f) == 8)
3684
0
    {
3685
      /* We have
3686
         call __tls_get_addr, %tgd_call(foo)
3687
          add %reg1, %reg2, %o0, %tgd_add(foo)
3688
         and change it into IE:
3689
         {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3690
         add %g7, %o0, %o0, %tie_add(foo).
3691
         add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3692
         ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3693
         ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
3694
0
      bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3695
0
            contents + rel->r_offset);
3696
0
      bfd_put_32 (output_bfd, 0x9001c008,
3697
0
            contents + rel->r_offset + 4);
3698
0
      rel++;
3699
0
      continue;
3700
0
    }
3701
3702
        /* We cannot just overwrite the delay slot instruction,
3703
     as it might be what puts the %o0 argument to
3704
     __tls_get_addr into place.  So we have to transpose
3705
     the delay slot with the add we patch in.  */
3706
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3707
0
        bfd_put_32 (output_bfd, insn,
3708
0
        contents + rel->r_offset);
3709
0
        bfd_put_32 (output_bfd, 0x9001c008,
3710
0
        contents + rel->r_offset + 4);
3711
3712
0
        rel2 = rel;
3713
0
        while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
3714
0
                rel->r_offset + 4))
3715
0
         != NULL)
3716
0
    {
3717
      /* If the instruction we moved has a relocation attached to
3718
         it, adjust the offset so that it will apply to the correct
3719
         instruction.  */
3720
0
      rel2->r_offset -= 4;
3721
0
    }
3722
0
        continue;
3723
0
      }
3724
3725
0
    h = (struct elf_link_hash_entry *)
3726
0
        bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
3727
0
            false, true);
3728
0
    BFD_ASSERT (h != NULL);
3729
0
    r_type = R_SPARC_WPLT30;
3730
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3731
0
    goto r_sparc_wplt30;
3732
3733
0
  case R_SPARC_TLS_GD_ADD:
3734
0
    if (h != NULL)
3735
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3736
0
    else if (local_got_offsets)
3737
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3738
0
    else
3739
0
      tls_type = GOT_UNKNOWN;
3740
    /* GD -> IE or LE */
3741
0
    if (bfd_link_executable (info) || tls_type == GOT_TLS_IE)
3742
0
      {
3743
        /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3744
     changed into IE:
3745
     {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3746
     or LE:
3747
     add %g7, %reg2, %reg3.  */
3748
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3749
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3750
0
    relocation = (insn & ~0x7c000) | 0x1c000;
3751
0
        else
3752
0
    relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3753
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3754
0
      }
3755
0
    continue;
3756
3757
0
  case R_SPARC_TLS_LDM_ADD:
3758
    /* LD -> LE */
3759
0
    if (bfd_link_executable (info))
3760
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3761
0
    continue;
3762
3763
0
  case R_SPARC_TLS_LDO_ADD:
3764
    /* LD -> LE */
3765
0
    if (bfd_link_executable (info))
3766
0
      {
3767
        /* Change rs1 into %g7.  */
3768
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3769
0
        insn = (insn & ~0x7c000) | 0x1c000;
3770
0
        bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3771
0
      }
3772
0
    continue;
3773
3774
0
  case R_SPARC_TLS_IE_LD:
3775
0
  case R_SPARC_TLS_IE_LDX:
3776
    /* IE -> LE */
3777
0
    if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3778
0
      {
3779
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3780
0
        int rs2 = insn & 0x1f;
3781
0
        int rd = (insn >> 25) & 0x1f;
3782
3783
0
        if (rs2 == rd)
3784
0
    relocation = SPARC_NOP;
3785
0
        else
3786
0
    relocation = 0x80100000 | (insn & 0x3e00001f);
3787
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3788
0
      }
3789
0
    continue;
3790
3791
0
  case R_SPARC_TLS_IE_ADD:
3792
    /* Totally useless relocation.  */
3793
0
    continue;
3794
3795
0
  case R_SPARC_TLS_DTPOFF32:
3796
0
  case R_SPARC_TLS_DTPOFF64:
3797
0
    relocation -= dtpoff_base (info);
3798
0
    break;
3799
3800
0
  default:
3801
0
    break;
3802
0
  }
3803
3804
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3805
   because such sections are not SEC_ALLOC and thus ld.so will
3806
   not process them.  */
3807
0
      if (unresolved_reloc
3808
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
3809
0
         && h->def_dynamic)
3810
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
3811
0
              rel->r_offset) != (bfd_vma) -1)
3812
0
  _bfd_error_handler
3813
    /* xgettext:c-format */
3814
0
    (_("%pB(%pA+%#" PRIx64 "): "
3815
0
       "unresolvable %s relocation against symbol `%s'"),
3816
0
     input_bfd,
3817
0
     input_section,
3818
0
     (uint64_t) rel->r_offset,
3819
0
     howto->name,
3820
0
     h->root.root.string);
3821
3822
0
      r = bfd_reloc_continue;
3823
0
      if (r_type == R_SPARC_OLO10)
3824
0
  {
3825
0
      bfd_vma x;
3826
3827
0
      if (! ABI_64_P (output_bfd))
3828
0
        abort ();
3829
3830
0
      relocation += rel->r_addend;
3831
0
      relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3832
3833
0
      x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3834
0
      x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3835
0
      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3836
3837
0
      r = bfd_check_overflow (howto->complain_on_overflow,
3838
0
            howto->bitsize, howto->rightshift,
3839
0
            bfd_arch_bits_per_address (input_bfd),
3840
0
            relocation);
3841
0
  }
3842
0
      else if (r_type == R_SPARC_WDISP16)
3843
0
  {
3844
0
    bfd_vma x;
3845
3846
0
    relocation += rel->r_addend;
3847
0
    relocation -= (input_section->output_section->vma
3848
0
       + input_section->output_offset);
3849
0
    relocation -= rel->r_offset;
3850
3851
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3852
0
    x |= ((((relocation >> 2) & 0xc000) << 6)
3853
0
    | ((relocation >> 2) & 0x3fff));
3854
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3855
3856
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3857
0
          howto->bitsize, howto->rightshift,
3858
0
          bfd_arch_bits_per_address (input_bfd),
3859
0
          relocation);
3860
0
  }
3861
0
      else if (r_type == R_SPARC_WDISP10)
3862
0
  {
3863
0
    bfd_vma x;
3864
3865
0
    relocation += rel->r_addend;
3866
0
    relocation -= (input_section->output_section->vma
3867
0
       + input_section->output_offset);
3868
0
    relocation -= rel->r_offset;
3869
3870
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3871
0
    x |= ((((relocation >> 2) & 0x300) << 11)
3872
0
    | (((relocation >> 2) & 0xff) << 5));
3873
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3874
3875
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3876
0
          howto->bitsize, howto->rightshift,
3877
0
          bfd_arch_bits_per_address (input_bfd),
3878
0
          relocation);
3879
0
  }
3880
0
      else if (r_type == R_SPARC_REV32)
3881
0
  {
3882
0
    bfd_vma x;
3883
3884
0
    relocation = relocation + rel->r_addend;
3885
3886
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3887
0
    x = x + relocation;
3888
0
    bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3889
0
    r = bfd_reloc_ok;
3890
0
  }
3891
0
      else if (r_type == R_SPARC_TLS_LDO_HIX22
3892
0
         || r_type == R_SPARC_TLS_LE_HIX22)
3893
0
  {
3894
0
    bfd_vma x;
3895
3896
0
    relocation += rel->r_addend;
3897
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3898
0
      relocation ^= MINUS_ONE;
3899
3900
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3901
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3902
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3903
0
    r = bfd_reloc_ok;
3904
0
  }
3905
0
      else if (r_type == R_SPARC_TLS_LDO_LOX10
3906
0
         || r_type == R_SPARC_TLS_LE_LOX10)
3907
0
  {
3908
0
    bfd_vma x;
3909
3910
0
    relocation += rel->r_addend;
3911
0
    relocation &= 0x3ff;
3912
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3913
0
      relocation |= 0x1c00;
3914
3915
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3916
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3917
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3918
3919
0
    r = bfd_reloc_ok;
3920
0
  }
3921
0
      else if (r_type == R_SPARC_HIX22
3922
0
         || r_type == R_SPARC_GOTDATA_HIX22
3923
0
         || r_type == R_SPARC_GOTDATA_OP_HIX22)
3924
0
  {
3925
0
    bfd_vma x;
3926
3927
0
    relocation += rel->r_addend;
3928
0
    if (r_type == R_SPARC_HIX22
3929
0
        || (bfd_signed_vma) relocation < 0)
3930
0
      relocation = relocation ^ MINUS_ONE;
3931
3932
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3933
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3934
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3935
3936
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3937
0
          howto->bitsize, howto->rightshift,
3938
0
          bfd_arch_bits_per_address (input_bfd),
3939
0
          relocation);
3940
0
  }
3941
0
      else if (r_type == R_SPARC_LOX10
3942
0
         || r_type == R_SPARC_GOTDATA_LOX10
3943
0
         || r_type == R_SPARC_GOTDATA_OP_LOX10)
3944
0
  {
3945
0
    bfd_vma x;
3946
3947
0
    relocation += rel->r_addend;
3948
0
    if (r_type == R_SPARC_LOX10
3949
0
        || (bfd_signed_vma) relocation < 0)
3950
0
      relocation = (relocation & 0x3ff) | 0x1c00;
3951
0
    else
3952
0
      relocation = (relocation & 0x3ff);
3953
3954
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3955
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3956
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3957
3958
0
    r = bfd_reloc_ok;
3959
0
  }
3960
0
      else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3961
0
         && sec_do_relax (input_section)
3962
0
         && rel->r_offset + 4 < input_section->size)
3963
0
  {
3964
0
#define G0    0
3965
0
#define O7    15
3966
0
#define XCC   (2 << 20)
3967
0
#define COND(x)   (((x)&0xf)<<25)
3968
0
#define CONDA   COND(0x8)
3969
0
#define INSN_BPA  (F2(0,1) | CONDA | BPRED | XCC)
3970
0
#define INSN_BA   (F2(0,2) | CONDA)
3971
0
#define INSN_OR   F3(2, 0x2, 0)
3972
0
#define INSN_NOP  F2(0,4)
3973
3974
0
    bfd_vma x, y;
3975
3976
    /* If the instruction is a call with either:
3977
       restore
3978
       arithmetic instruction with rd == %o7
3979
       where rs1 != %o7 and rs2 if it is register != %o7
3980
       then we can optimize if the call destination is near
3981
       by changing the call into a branch always.  */
3982
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3983
0
    y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3984
0
    if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3985
0
      {
3986
        if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3987
0
       || ((y & OP3(0x28)) == 0 /* arithmetic */
3988
0
           && (y & RD(~0)) == RD(O7)))
3989
0
      && (y & RS1(~0)) != RS1(O7)
3990
0
      && ((y & F3I(~0))
3991
0
          || (y & RS2(~0)) != RS2(O7)))
3992
0
    {
3993
0
      bfd_vma reloc;
3994
3995
0
      reloc = relocation + rel->r_addend - rel->r_offset;
3996
0
      reloc -= (input_section->output_section->vma
3997
0
          + input_section->output_offset);
3998
3999
      /* Ensure the branch fits into simm22.  */
4000
0
      if ((reloc & 3) == 0
4001
0
          && ((reloc & ~(bfd_vma)0x7fffff) == 0
4002
0
        || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
4003
0
        {
4004
0
          reloc >>= 2;
4005
4006
          /* Check whether it fits into simm19.  */
4007
0
          if (((reloc & 0x3c0000) == 0
4008
0
         || (reloc & 0x3c0000) == 0x3c0000)
4009
0
        && (ABI_64_P (output_bfd)
4010
0
            || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
4011
0
      x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
4012
0
          else
4013
0
      x = INSN_BA | (reloc & 0x3fffff); /* ba */
4014
0
          bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4015
0
          r = bfd_reloc_ok;
4016
0
          if (rel->r_offset >= 4
4017
0
        && (y & (0xffffffff ^ RS1(~0)))
4018
0
           == (INSN_OR | RD(O7) | RS2(G0)))
4019
0
      {
4020
0
        bfd_vma z;
4021
0
        unsigned int reg;
4022
4023
0
        z = bfd_get_32 (input_bfd,
4024
0
            contents + rel->r_offset - 4);
4025
0
        if ((z & (0xffffffff ^ RD(~0)))
4026
0
            != (INSN_OR | RS1(O7) | RS2(G0)))
4027
0
          continue;
4028
4029
        /* The sequence was
4030
           or %o7, %g0, %rN
4031
           call foo
4032
           or %rN, %g0, %o7
4033
4034
           If call foo was replaced with ba, replace
4035
           or %rN, %g0, %o7 with nop.  */
4036
4037
0
        reg = (y & RS1(~0)) >> 14;
4038
0
        if (reg != ((z & RD(~0)) >> 25)
4039
0
            || reg == G0 || reg == O7)
4040
0
          continue;
4041
4042
0
        bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4043
0
              contents + rel->r_offset + 4);
4044
0
      }
4045
4046
0
        }
4047
0
    }
4048
0
      }
4049
0
  }
4050
4051
0
      if (r == bfd_reloc_continue)
4052
0
  {
4053
0
  do_relocation:
4054
0
    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4055
0
          contents, rel->r_offset,
4056
0
          relocation, rel->r_addend);
4057
0
  }
4058
0
      if (r != bfd_reloc_ok)
4059
0
  {
4060
0
    switch (r)
4061
0
      {
4062
0
      default:
4063
0
      case bfd_reloc_outofrange:
4064
0
        abort ();
4065
0
      case bfd_reloc_overflow:
4066
0
        {
4067
0
    const char *name;
4068
4069
    /* The Solaris native linker silently disregards overflows.
4070
       We don't, but this breaks stabs debugging info, whose
4071
       relocations are only 32-bits wide.  Ignore overflows in
4072
       this case and also for discarded entries.  */
4073
0
    if ((r_type == R_SPARC_32
4074
0
         || r_type == R_SPARC_UA32
4075
0
         || r_type == R_SPARC_DISP32)
4076
0
        && (((input_section->flags & SEC_DEBUGGING) != 0
4077
0
       && strcmp (bfd_section_name (input_section),
4078
0
            ".stab") == 0)
4079
0
      || _bfd_elf_section_offset (output_bfd, info,
4080
0
                input_section,
4081
0
                rel->r_offset)
4082
0
           == (bfd_vma)-1))
4083
0
      break;
4084
4085
0
    if (h != NULL)
4086
0
      {
4087
        /* Assume this is a call protected by other code that
4088
           detect the symbol is undefined.  If this is the case,
4089
           we can safely ignore the overflow.  If not, the
4090
           program is hosed anyway, and a little warning isn't
4091
           going to help.  */
4092
0
        if (h->root.type == bfd_link_hash_undefweak
4093
0
      && howto->pc_relative)
4094
0
          break;
4095
4096
0
        name = NULL;
4097
0
      }
4098
0
    else
4099
0
      {
4100
0
        name = bfd_elf_string_from_elf_section (input_bfd,
4101
0
                  symtab_hdr->sh_link,
4102
0
                  sym->st_name);
4103
0
        if (name == NULL)
4104
0
          return false;
4105
0
        if (*name == '\0')
4106
0
          name = bfd_section_name (sec);
4107
0
      }
4108
0
    (*info->callbacks->reloc_overflow)
4109
0
      (info, (h ? &h->root : NULL), name, howto->name,
4110
0
       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4111
0
        }
4112
0
        break;
4113
0
      }
4114
0
  }
4115
0
    }
4116
4117
0
  return true;
4118
0
}
4119
4120
/* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
4121
   and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
4122
   is the offset of the associated .got.plt entry from
4123
   _GLOBAL_OFFSET_TABLE_.  */
4124
4125
static void
4126
sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4127
             bfd_vma plt_offset, bfd_vma plt_index,
4128
             bfd_vma got_offset)
4129
0
{
4130
0
  bfd_vma got_base;
4131
0
  const bfd_vma *plt_entry;
4132
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4133
0
  bfd_byte *loc;
4134
0
  Elf_Internal_Rela rela;
4135
4136
0
  htab = _bfd_sparc_elf_hash_table (info);
4137
0
  BFD_ASSERT (htab != NULL);
4138
4139
0
  if (bfd_link_pic (info))
4140
0
    {
4141
0
      plt_entry = sparc_vxworks_shared_plt_entry;
4142
0
      got_base = 0;
4143
0
    }
4144
0
  else
4145
0
    {
4146
0
      plt_entry = sparc_vxworks_exec_plt_entry;
4147
0
      got_base = (htab->elf.hgot->root.u.def.value
4148
0
      + htab->elf.hgot->root.u.def.section->output_offset
4149
0
      + htab->elf.hgot->root.u.def.section->output_section->vma);
4150
0
    }
4151
4152
  /* Fill in the entry in the procedure linkage table.  */
4153
0
  bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4154
0
        htab->elf.splt->contents + plt_offset);
4155
0
  bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4156
0
        htab->elf.splt->contents + plt_offset + 4);
4157
0
  bfd_put_32 (output_bfd, plt_entry[2],
4158
0
        htab->elf.splt->contents + plt_offset + 8);
4159
0
  bfd_put_32 (output_bfd, plt_entry[3],
4160
0
        htab->elf.splt->contents + plt_offset + 12);
4161
0
  bfd_put_32 (output_bfd, plt_entry[4],
4162
0
        htab->elf.splt->contents + plt_offset + 16);
4163
0
  bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4164
0
        htab->elf.splt->contents + plt_offset + 20);
4165
  /* PC-relative displacement for a branch to the start of
4166
     the PLT section.  */
4167
0
  bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4168
0
            & 0x003fffff),
4169
0
        htab->elf.splt->contents + plt_offset + 24);
4170
0
  bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4171
0
        htab->elf.splt->contents + plt_offset + 28);
4172
4173
  /* Fill in the .got.plt entry, pointing initially at the
4174
     second half of the PLT entry.  */
4175
0
  BFD_ASSERT (htab->elf.sgotplt != NULL);
4176
0
  bfd_put_32 (output_bfd,
4177
0
        htab->elf.splt->output_section->vma
4178
0
        + htab->elf.splt->output_offset
4179
0
        + plt_offset + 20,
4180
0
        htab->elf.sgotplt->contents + got_offset);
4181
4182
  /* Add relocations to .rela.plt.unloaded.  */
4183
0
  if (!bfd_link_pic (info))
4184
0
    {
4185
0
      loc = (htab->srelplt2->contents
4186
0
       + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4187
4188
      /* Relocate the initial sethi.  */
4189
0
      rela.r_offset = (htab->elf.splt->output_section->vma
4190
0
           + htab->elf.splt->output_offset
4191
0
           + plt_offset);
4192
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4193
0
      rela.r_addend = got_offset;
4194
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4195
0
      loc += sizeof (Elf32_External_Rela);
4196
4197
      /* Likewise the following or.  */
4198
0
      rela.r_offset += 4;
4199
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4200
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4201
0
      loc += sizeof (Elf32_External_Rela);
4202
4203
      /* Relocate the .got.plt entry.  */
4204
0
      rela.r_offset = (htab->elf.sgotplt->output_section->vma
4205
0
           + htab->elf.sgotplt->output_offset
4206
0
           + got_offset);
4207
0
      rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4208
0
      rela.r_addend = plt_offset + 20;
4209
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4210
0
    }
4211
0
}
4212
4213
/* Finish up dynamic symbol handling.  We set the contents of various
4214
   dynamic sections here.  */
4215
4216
bool
4217
_bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4218
              struct bfd_link_info *info,
4219
              struct elf_link_hash_entry *h,
4220
              Elf_Internal_Sym *sym)
4221
0
{
4222
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4223
0
  const struct elf_backend_data *bed;
4224
0
  struct _bfd_sparc_elf_link_hash_entry  *eh;
4225
0
  bool resolved_to_zero;
4226
4227
0
  htab = _bfd_sparc_elf_hash_table (info);
4228
0
  BFD_ASSERT (htab != NULL);
4229
0
  bed = get_elf_backend_data (output_bfd);
4230
4231
0
  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
4232
4233
  /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4234
     resolved undefined weak symbols in executable so that their
4235
     references have value 0 at run-time.  */
4236
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4237
4238
0
  if (h->plt.offset != (bfd_vma) -1)
4239
0
    {
4240
0
      asection *splt;
4241
0
      asection *srela;
4242
0
      Elf_Internal_Rela rela;
4243
0
      bfd_byte *loc;
4244
0
      bfd_vma r_offset, got_offset;
4245
0
      int rela_index;
4246
4247
      /* When building a static executable, use .iplt and
4248
   .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4249
0
      if (htab->elf.splt != NULL)
4250
0
  {
4251
0
    splt = htab->elf.splt;
4252
0
    srela = htab->elf.srelplt;
4253
0
  }
4254
0
      else
4255
0
  {
4256
0
    splt = htab->elf.iplt;
4257
0
    srela = htab->elf.irelplt;
4258
0
  }
4259
4260
0
      if (splt == NULL || srela == NULL)
4261
0
  abort ();
4262
4263
      /* Fill in the entry in the .rela.plt section.  */
4264
0
      if (htab->elf.target_os == is_vxworks)
4265
0
  {
4266
    /* Work out the index of this PLT entry.  */
4267
0
    rela_index = ((h->plt.offset - htab->plt_header_size)
4268
0
      / htab->plt_entry_size);
4269
4270
    /* Calculate the offset of the associated .got.plt entry.
4271
       The first three entries are reserved.  */
4272
0
    got_offset = (rela_index + 3) * 4;
4273
4274
0
    sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4275
0
           rela_index, got_offset);
4276
4277
4278
    /* On VxWorks, the relocation points to the .got.plt entry,
4279
       not the .plt entry.  */
4280
0
    rela.r_offset = (htab->elf.sgotplt->output_section->vma
4281
0
         + htab->elf.sgotplt->output_offset
4282
0
         + got_offset);
4283
0
    rela.r_addend = 0;
4284
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4285
0
            R_SPARC_JMP_SLOT);
4286
0
  }
4287
0
      else
4288
0
  {
4289
0
    bool ifunc = false;
4290
4291
    /* Fill in the entry in the procedure linkage table.  */
4292
0
    rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4293
0
              h->plt.offset, splt->size,
4294
0
              &r_offset);
4295
4296
0
    if (h == NULL
4297
0
        || h->dynindx == -1
4298
0
        || ((bfd_link_executable (info)
4299
0
       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4300
0
      && h->def_regular
4301
0
      && h->type == STT_GNU_IFUNC))
4302
0
      {
4303
0
        ifunc = true;
4304
0
        BFD_ASSERT (h == NULL
4305
0
        || (h->type == STT_GNU_IFUNC
4306
0
            && h->def_regular
4307
0
            && (h->root.type == bfd_link_hash_defined
4308
0
          || h->root.type == bfd_link_hash_defweak)));
4309
0
      }
4310
4311
0
    rela.r_offset = r_offset
4312
0
      + (splt->output_section->vma + splt->output_offset);
4313
0
    if (ABI_64_P (output_bfd)
4314
0
        && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4315
0
      {
4316
0
        if (ifunc)
4317
0
    {
4318
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4319
0
           + h->root.u.def.section->output_offset
4320
0
           + h->root.u.def.value);
4321
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4322
0
              R_SPARC_IRELATIVE);
4323
0
    }
4324
0
        else
4325
0
    {
4326
0
      rela.r_addend = (-(h->plt.offset + 4)
4327
0
           - splt->output_section->vma
4328
0
           - splt->output_offset);
4329
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4330
0
              R_SPARC_JMP_SLOT);
4331
0
    }
4332
0
      }
4333
0
    else
4334
0
      {
4335
0
        if (ifunc)
4336
0
    {
4337
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4338
0
           + h->root.u.def.section->output_offset
4339
0
           + h->root.u.def.value);
4340
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4341
0
              R_SPARC_JMP_IREL);
4342
0
    }
4343
0
        else
4344
0
    {
4345
0
      rela.r_addend = 0;
4346
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4347
0
              R_SPARC_JMP_SLOT);
4348
0
    }
4349
0
      }
4350
0
  }
4351
4352
      /* Adjust for the first 4 reserved elements in the .plt section
4353
   when setting the offset in the .rela.plt section.
4354
   Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4355
   thus .plt[4] has corresponding .rela.plt[0] and so on.  */
4356
4357
0
      loc = srela->contents;
4358
0
      loc += rela_index * bed->s->sizeof_rela;
4359
0
      bed->s->swap_reloca_out (output_bfd, &rela, loc);
4360
4361
0
      if (!resolved_to_zero && !h->def_regular)
4362
0
  {
4363
    /* Mark the symbol as undefined, rather than as defined in
4364
       the .plt section.  Leave the value alone.  */
4365
0
    sym->st_shndx = SHN_UNDEF;
4366
    /* If the symbol is weak, we do need to clear the value.
4367
       Otherwise, the PLT entry would provide a definition for
4368
       the symbol even if the symbol wasn't defined anywhere,
4369
       and so the symbol would never be NULL.  */
4370
0
    if (!h->ref_regular_nonweak)
4371
0
      sym->st_value = 0;
4372
0
  }
4373
0
    }
4374
4375
  /* Don't generate dynamic GOT relocation against resolved undefined weak
4376
     symbols in an executable.  */
4377
0
  if (h->got.offset != (bfd_vma) -1
4378
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4379
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
4380
0
      && !(h->root.type == bfd_link_hash_undefweak
4381
0
     && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4382
0
         || resolved_to_zero)))
4383
0
    {
4384
0
      asection *sgot;
4385
0
      asection *srela;
4386
0
      Elf_Internal_Rela rela;
4387
4388
      /* This symbol has an entry in the GOT.  Set it up.  */
4389
4390
0
      sgot = htab->elf.sgot;
4391
0
      srela = htab->elf.srelgot;
4392
0
      BFD_ASSERT (sgot != NULL && srela != NULL);
4393
4394
0
      rela.r_offset = (sgot->output_section->vma
4395
0
           + sgot->output_offset
4396
0
           + (h->got.offset &~ (bfd_vma) 1));
4397
4398
      /* If this is a -Bsymbolic link, and the symbol is defined
4399
   locally, we just want to emit a RELATIVE reloc.  Likewise if
4400
   the symbol was forced to be local because of a version file.
4401
   The entry in the global offset table will already have been
4402
   initialized in the relocate_section function.  */
4403
0
      if (! bfd_link_pic (info)
4404
0
    && h->type == STT_GNU_IFUNC
4405
0
    && h->def_regular)
4406
0
  {
4407
0
    asection *plt;
4408
4409
    /* We load the GOT entry with the PLT entry.  */
4410
0
    plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4411
0
    SPARC_ELF_PUT_WORD (htab, output_bfd,
4412
0
            (plt->output_section->vma
4413
0
             + plt->output_offset + h->plt.offset),
4414
0
            htab->elf.sgot->contents
4415
0
            + (h->got.offset & ~(bfd_vma) 1));
4416
0
    return true;
4417
0
  }
4418
4419
0
      if (bfd_link_pic (info)
4420
0
    && (h->root.type == bfd_link_hash_defined
4421
0
        || h->root.type == bfd_link_hash_defweak)
4422
0
    && SYMBOL_REFERENCES_LOCAL (info, h))
4423
0
  {
4424
0
    asection *sec = h->root.u.def.section;
4425
0
    if (h->type == STT_GNU_IFUNC)
4426
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4427
0
    else
4428
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4429
0
    rela.r_addend = (h->root.u.def.value
4430
0
         + sec->output_section->vma
4431
0
         + sec->output_offset);
4432
0
  }
4433
0
      else
4434
0
  {
4435
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4436
0
    rela.r_addend = 0;
4437
0
  }
4438
4439
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4440
0
        sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4441
0
      sparc_elf_append_rela (output_bfd, srela, &rela);
4442
0
    }
4443
4444
0
  if (h->needs_copy)
4445
0
    {
4446
0
      asection *s;
4447
0
      Elf_Internal_Rela rela;
4448
4449
      /* This symbols needs a copy reloc.  Set it up.  */
4450
0
      BFD_ASSERT (h->dynindx != -1);
4451
4452
0
      rela.r_offset = (h->root.u.def.value
4453
0
           + h->root.u.def.section->output_section->vma
4454
0
           + h->root.u.def.section->output_offset);
4455
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4456
0
      rela.r_addend = 0;
4457
0
      if (h->root.u.def.section == htab->elf.sdynrelro)
4458
0
  s = htab->elf.sreldynrelro;
4459
0
      else
4460
0
  s = htab->elf.srelbss;
4461
0
      sparc_elf_append_rela (output_bfd, s, &rela);
4462
0
    }
4463
4464
  /* Mark some specially defined symbols as absolute.  On VxWorks,
4465
     _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4466
     ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
4467
0
  if (sym != NULL
4468
0
      && (h == htab->elf.hdynamic
4469
0
    || (htab->elf.target_os != is_vxworks
4470
0
        && (h == htab->elf.hgot || h == htab->elf.hplt))))
4471
0
    sym->st_shndx = SHN_ABS;
4472
4473
0
  return true;
4474
0
}
4475
4476
/* Finish up the dynamic sections.  */
4477
4478
static bool
4479
sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4480
      bfd *dynobj, asection *sdyn,
4481
      asection *splt ATTRIBUTE_UNUSED)
4482
0
{
4483
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4484
0
  const struct elf_backend_data *bed;
4485
0
  bfd_byte *dyncon, *dynconend;
4486
0
  size_t dynsize;
4487
0
  int stt_regidx = -1;
4488
0
  bool abi_64_p;
4489
4490
0
  htab = _bfd_sparc_elf_hash_table (info);
4491
0
  BFD_ASSERT (htab != NULL);
4492
0
  bed = get_elf_backend_data (output_bfd);
4493
0
  dynsize = bed->s->sizeof_dyn;
4494
0
  dynconend = sdyn->contents + sdyn->size;
4495
0
  abi_64_p = ABI_64_P (output_bfd);
4496
0
  for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4497
0
    {
4498
0
      Elf_Internal_Dyn dyn;
4499
0
      bool size;
4500
4501
0
      bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4502
4503
0
      if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
4504
0
  {
4505
    /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4506
       not to the start of the PLT.  */
4507
0
    if (htab->elf.sgotplt)
4508
0
      {
4509
0
        dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4510
0
        + htab->elf.sgotplt->output_offset);
4511
0
        bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4512
0
      }
4513
0
  }
4514
0
      else if (htab->elf.target_os == is_vxworks
4515
0
         && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4516
0
  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4517
0
      else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4518
0
  {
4519
0
    if (stt_regidx == -1)
4520
0
      {
4521
0
        stt_regidx =
4522
0
    _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4523
0
        if (stt_regidx == -1)
4524
0
    return false;
4525
0
      }
4526
0
    dyn.d_un.d_val = stt_regidx++;
4527
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4528
0
  }
4529
0
      else
4530
0
  {
4531
0
    asection *s;
4532
4533
0
    switch (dyn.d_tag)
4534
0
      {
4535
0
      case DT_PLTGOT:
4536
0
        s = htab->elf.splt;
4537
0
        size = false;
4538
0
        break;
4539
0
      case DT_PLTRELSZ:
4540
0
        s = htab->elf.srelplt;
4541
0
        size = true;
4542
0
        break;
4543
0
      case DT_JMPREL:
4544
0
        s = htab->elf.srelplt;
4545
0
        size = false;
4546
0
        break;
4547
0
      default:
4548
0
        continue;
4549
0
      }
4550
4551
0
    if (s == NULL)
4552
0
      dyn.d_un.d_val = 0;
4553
0
    else
4554
0
      {
4555
0
        if (!size)
4556
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4557
0
        else
4558
0
    dyn.d_un.d_val = s->size;
4559
0
      }
4560
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4561
0
  }
4562
0
    }
4563
0
  return true;
4564
0
}
4565
4566
/* Install the first PLT entry in a VxWorks executable and make sure that
4567
   .rela.plt.unloaded relocations have the correct symbol indexes.  */
4568
4569
static void
4570
sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4571
0
{
4572
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4573
0
  Elf_Internal_Rela rela;
4574
0
  bfd_vma got_base;
4575
0
  bfd_byte *loc;
4576
4577
0
  htab = _bfd_sparc_elf_hash_table (info);
4578
0
  BFD_ASSERT (htab != NULL);
4579
4580
  /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
4581
0
  got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4582
0
        + htab->elf.hgot->root.u.def.section->output_offset
4583
0
        + htab->elf.hgot->root.u.def.value);
4584
4585
  /* Install the initial PLT entry.  */
4586
0
  bfd_put_32 (output_bfd,
4587
0
        sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4588
0
        htab->elf.splt->contents);
4589
0
  bfd_put_32 (output_bfd,
4590
0
        sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4591
0
        htab->elf.splt->contents + 4);
4592
0
  bfd_put_32 (output_bfd,
4593
0
        sparc_vxworks_exec_plt0_entry[2],
4594
0
        htab->elf.splt->contents + 8);
4595
0
  bfd_put_32 (output_bfd,
4596
0
        sparc_vxworks_exec_plt0_entry[3],
4597
0
        htab->elf.splt->contents + 12);
4598
0
  bfd_put_32 (output_bfd,
4599
0
        sparc_vxworks_exec_plt0_entry[4],
4600
0
        htab->elf.splt->contents + 16);
4601
4602
0
  loc = htab->srelplt2->contents;
4603
4604
  /* Add an unloaded relocation for the initial entry's "sethi".  */
4605
0
  rela.r_offset = (htab->elf.splt->output_section->vma
4606
0
       + htab->elf.splt->output_offset);
4607
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4608
0
  rela.r_addend = 8;
4609
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4610
0
  loc += sizeof (Elf32_External_Rela);
4611
4612
  /* Likewise the following "or".  */
4613
0
  rela.r_offset += 4;
4614
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4615
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4616
0
  loc += sizeof (Elf32_External_Rela);
4617
4618
  /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
4619
     the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4620
     in which symbols were output.  */
4621
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4622
0
    {
4623
0
      Elf_Internal_Rela rel;
4624
4625
      /* The entry's initial "sethi" (against _G_O_T_).  */
4626
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4627
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4628
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4629
0
      loc += sizeof (Elf32_External_Rela);
4630
4631
      /* The following "or" (also against _G_O_T_).  */
4632
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4633
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4634
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4635
0
      loc += sizeof (Elf32_External_Rela);
4636
4637
      /* The .got.plt entry (against _P_L_T_).  */
4638
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4639
0
      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4640
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4641
0
      loc += sizeof (Elf32_External_Rela);
4642
0
    }
4643
0
}
4644
4645
/* Install the first PLT entry in a VxWorks shared object.  */
4646
4647
static void
4648
sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4649
0
{
4650
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4651
0
  unsigned int i;
4652
4653
0
  htab = _bfd_sparc_elf_hash_table (info);
4654
0
  BFD_ASSERT (htab != NULL);
4655
4656
0
  for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4657
0
    bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4658
0
    htab->elf.splt->contents + i * 4);
4659
0
}
4660
4661
/* Finish up local dynamic symbol handling.  We set the contents of
4662
   various dynamic sections here.  */
4663
4664
static int
4665
finish_local_dynamic_symbol (void **slot, void *inf)
4666
0
{
4667
0
  struct elf_link_hash_entry *h
4668
0
    = (struct elf_link_hash_entry *) *slot;
4669
0
  struct bfd_link_info *info
4670
0
    = (struct bfd_link_info *) inf;
4671
4672
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4673
0
                 h, NULL);
4674
0
}
4675
4676
/* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4677
   here since undefined weak symbol may not be dynamic and may not be
4678
   called for _bfd_sparc_elf_finish_dynamic_symbol.  */
4679
4680
static bool
4681
pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4682
           void *inf)
4683
0
{
4684
0
  struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4685
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
4686
4687
0
  if (h->root.type != bfd_link_hash_undefweak
4688
0
      || h->dynindx != -1)
4689
0
    return true;
4690
4691
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4692
0
                 h, NULL);
4693
0
}
4694
4695
bool
4696
_bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4697
0
{
4698
0
  bfd *dynobj;
4699
0
  asection *sdyn;
4700
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4701
4702
0
  htab = _bfd_sparc_elf_hash_table (info);
4703
0
  BFD_ASSERT (htab != NULL);
4704
0
  dynobj = htab->elf.dynobj;
4705
4706
  /* We arranged in size_dynamic_sections to put the STT_REGISTER
4707
     entries at the end of the dynlocal list, so they came at the end
4708
     of the local symbols in the symtab.  Except that they aren't
4709
     STB_LOCAL, so we need to back up symtab->sh_info.  */
4710
0
  if (ABI_64_P (output_bfd)
4711
0
      && elf_hash_table (info)->dynlocal)
4712
0
    {
4713
0
      asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
4714
0
      struct elf_link_local_dynamic_entry *e;
4715
4716
0
      for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
4717
0
  if (e->input_indx == -1)
4718
0
    break;
4719
0
      if (e)
4720
0
  elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
4721
0
    = e->dynindx;
4722
0
    }
4723
4724
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4725
4726
0
  if (elf_hash_table (info)->dynamic_sections_created)
4727
0
    {
4728
0
      asection *splt;
4729
4730
0
      splt = htab->elf.splt;
4731
0
      BFD_ASSERT (splt != NULL && sdyn != NULL);
4732
4733
0
      if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4734
0
  return false;
4735
4736
      /* Initialize the contents of the .plt section.  */
4737
0
      if (splt->size > 0)
4738
0
  {
4739
0
    if (htab->elf.target_os == is_vxworks)
4740
0
      {
4741
0
        if (bfd_link_pic (info))
4742
0
    sparc_vxworks_finish_shared_plt (output_bfd, info);
4743
0
        else
4744
0
    sparc_vxworks_finish_exec_plt (output_bfd, info);
4745
0
      }
4746
0
    else
4747
0
      {
4748
0
        memset (splt->contents, 0, htab->plt_header_size);
4749
0
        if (!ABI_64_P (output_bfd))
4750
0
    bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4751
0
          splt->contents + splt->size - 4);
4752
0
      }
4753
0
  }
4754
4755
0
      if (elf_section_data (splt->output_section) != NULL)
4756
0
  elf_section_data (splt->output_section)->this_hdr.sh_entsize
4757
0
    = ((htab->elf.target_os == is_vxworks
4758
0
        || !ABI_64_P (output_bfd))
4759
0
       ? 0 : htab->plt_entry_size);
4760
0
    }
4761
4762
  /* Set the first entry in the global offset table to the address of
4763
     the dynamic section.  */
4764
0
  if (htab->elf.sgot && htab->elf.sgot->size > 0)
4765
0
    {
4766
0
      bfd_vma val = (sdyn ?
4767
0
         sdyn->output_section->vma + sdyn->output_offset :
4768
0
         0);
4769
4770
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
4771
0
    }
4772
4773
0
  if (htab->elf.sgot)
4774
0
    elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4775
0
      SPARC_ELF_WORD_BYTES (htab);
4776
4777
  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4778
0
  htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
4779
4780
  /* Fill PLT entries for undefined weak symbols in PIE.  */
4781
0
  if (bfd_link_pie (info))
4782
0
    bfd_hash_traverse (&info->hash->table,
4783
0
           pie_finish_undefweak_symbol,
4784
0
           info);
4785
0
  return true;
4786
0
}
4787
4788

4789
/* Set the right machine number for a SPARC ELF file.  */
4790
4791
bool
4792
_bfd_sparc_elf_object_p (bfd *abfd)
4793
8
{
4794
8
  obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
4795
8
  obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
4796
8
  obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
4797
4798
8
  unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
4799
8
  unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
4800
8
          | ELF_SPARC_HWCAP_VIS3
4801
8
          | ELF_SPARC_HWCAP_HPC);
4802
8
  unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
4803
8
          | ELF_SPARC_HWCAP_DES
4804
8
          | ELF_SPARC_HWCAP_KASUMI
4805
8
          | ELF_SPARC_HWCAP_CAMELLIA
4806
8
          | ELF_SPARC_HWCAP_MD5
4807
8
          | ELF_SPARC_HWCAP_SHA1
4808
8
          | ELF_SPARC_HWCAP_SHA256
4809
8
          | ELF_SPARC_HWCAP_SHA512
4810
8
          | ELF_SPARC_HWCAP_MPMUL
4811
8
          | ELF_SPARC_HWCAP_MONT
4812
8
          | ELF_SPARC_HWCAP_CRC32C
4813
8
          | ELF_SPARC_HWCAP_CBCOND
4814
8
          | ELF_SPARC_HWCAP_PAUSE);
4815
8
  unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
4816
8
         | ELF_SPARC_HWCAP_IMA);
4817
8
  unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
4818
8
           | ELF_SPARC_HWCAP2_MWAIT
4819
8
           | ELF_SPARC_HWCAP2_XMPMUL
4820
8
           | ELF_SPARC_HWCAP2_XMONT);
4821
8
  unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6
4822
8
          | ELF_SPARC_HWCAP2_ONADDSUB
4823
8
          | ELF_SPARC_HWCAP2_ONMUL
4824
8
          | ELF_SPARC_HWCAP2_ONDIV
4825
8
          | ELF_SPARC_HWCAP2_DICTUNP
4826
8
          | ELF_SPARC_HWCAP2_FPCMPSHL
4827
8
          | ELF_SPARC_HWCAP2_RLE
4828
8
          | ELF_SPARC_HWCAP2_SHA3);
4829
4830
8
  if (ABI_64_P (abfd))
4831
0
    {
4832
0
      unsigned long mach = bfd_mach_sparc_v9;
4833
4834
0
      if (hwcaps2->i & m8_hwcaps2_mask)
4835
0
  mach = bfd_mach_sparc_v9m8;
4836
0
      else if (hwcaps2->i & v9m_hwcaps2_mask)
4837
0
  mach = bfd_mach_sparc_v9m;
4838
0
      else if (hwcaps->i & v9v_hwcaps_mask)
4839
0
  mach = bfd_mach_sparc_v9v;
4840
0
      else if (hwcaps->i & v9e_hwcaps_mask)
4841
0
  mach = bfd_mach_sparc_v9e;
4842
0
      else if (hwcaps->i & v9d_hwcaps_mask)
4843
0
  mach = bfd_mach_sparc_v9d;
4844
0
      else if (hwcaps->i & v9c_hwcaps_mask)
4845
0
  mach = bfd_mach_sparc_v9c;
4846
0
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4847
0
  mach = bfd_mach_sparc_v9b;
4848
0
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4849
0
  mach = bfd_mach_sparc_v9a;
4850
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
4851
0
    }
4852
8
  else
4853
8
    {
4854
8
      if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
4855
4
  {
4856
4
    if (hwcaps2->i & m8_hwcaps2_mask)
4857
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4858
0
                bfd_mach_sparc_v8plusm8);
4859
4
    else if (hwcaps2->i & v9m_hwcaps2_mask)
4860
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4861
0
                bfd_mach_sparc_v8plusm);
4862
4
    else if (hwcaps->i & v9v_hwcaps_mask)
4863
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4864
0
                bfd_mach_sparc_v8plusv);
4865
4
    else if (hwcaps->i & v9e_hwcaps_mask)
4866
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4867
0
                bfd_mach_sparc_v8pluse);
4868
4
    else if (hwcaps->i & v9d_hwcaps_mask)
4869
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4870
0
                bfd_mach_sparc_v8plusd);
4871
4
    else if (hwcaps->i & v9c_hwcaps_mask)
4872
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4873
0
                bfd_mach_sparc_v8plusc);
4874
4
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4875
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4876
0
                bfd_mach_sparc_v8plusb);
4877
4
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4878
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4879
0
                bfd_mach_sparc_v8plusa);
4880
4
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
4881
4
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4882
4
                bfd_mach_sparc_v8plus);
4883
0
    else
4884
0
      return false;
4885
4
  }
4886
4
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
4887
0
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4888
0
            bfd_mach_sparc_sparclite_le);
4889
4
      else
4890
4
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
4891
8
    }
4892
8
}
4893
4894
/* Return address for Ith PLT stub in section PLT, for relocation REL
4895
   or (bfd_vma) -1 if it should not be included.  */
4896
4897
bfd_vma
4898
_bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
4899
0
{
4900
0
  if (ABI_64_P (plt->owner))
4901
0
    {
4902
0
      bfd_vma j;
4903
4904
0
      i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
4905
0
      if (i < PLT64_LARGE_THRESHOLD)
4906
0
  return plt->vma + i * PLT64_ENTRY_SIZE;
4907
4908
0
      j = (i - PLT64_LARGE_THRESHOLD) % 160;
4909
0
      i -= j;
4910
0
      return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
4911
0
    }
4912
0
  else
4913
0
    return rel->address;
4914
0
}
4915
4916
/* Merge backend specific data from an object file to the output
4917
   object file when linking.  */
4918
4919
bool
4920
_bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4921
0
{
4922
0
  bfd *obfd = info->output_bfd;
4923
0
  obj_attribute *in_attr, *in_attrs;
4924
0
  obj_attribute *out_attr, *out_attrs;
4925
4926
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
4927
0
    {
4928
      /* This is the first object.  Copy the attributes.  */
4929
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
4930
4931
      /* Use the Tag_null value to indicate the attributes have been
4932
   initialized.  */
4933
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
4934
4935
0
      return true;
4936
0
    }
4937
4938
0
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4939
0
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4940
4941
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
4942
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
4943
4944
0
  out_attr->i |= in_attr->i;
4945
0
  out_attr->type = 1;
4946
4947
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
4948
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
4949
4950
0
  out_attr->i |= in_attr->i;
4951
0
  out_attr->type = 1;
4952
4953
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
4954
0
  _bfd_elf_merge_object_attributes (ibfd, info);
4955
4956
0
  return true;
4957
0
}