Coverage Report

Created: 2024-05-21 06:29

/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-2024 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
18.9k
  (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
3.10k
{
619
3.10k
  switch (r_type)
620
3.10k
    {
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
3.10k
    default:
637
3.10k
      if (r_type >= (unsigned int) R_SPARC_max_std)
638
7
  {
639
7
    _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
640
7
            abfd, r_type);
641
7
    bfd_set_error (bfd_error_bad_value);
642
7
    return NULL;
643
7
  }
644
3.10k
      return &_bfd_sparc_elf_howto_table[r_type];
645
3.10k
    }
646
3.10k
}
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
3.10k
  ((r_info) & 0xff)
652
653
bool
654
_bfd_sparc_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
655
            Elf_Internal_Rela *dst)
656
3.10k
{
657
3.10k
  unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
658
659
3.10k
  if ((cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type)) == NULL)
660
7
    {
661
7
      bfd_set_error (bfd_error_bad_value);
662
7
      return false;
663
7
    }
664
3.10k
  return true;
665
3.10k
}
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
117k
{
737
117k
  return bfd_elf_allocate_object (abfd, sizeof (struct _bfd_sparc_elf_obj_tdata),
738
117k
          SPARC_ELF_DATA);
739
117k
}
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_late_size_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
  if (dynobj == NULL)
2396
0
    return true;
2397
2398
0
  if (elf_hash_table (info)->dynamic_sections_created)
2399
0
    {
2400
      /* Set the contents of the .interp section to the interpreter.  */
2401
0
      if (bfd_link_executable (info) && !info->nointerp)
2402
0
  {
2403
0
    s = bfd_get_linker_section (dynobj, ".interp");
2404
0
    BFD_ASSERT (s != NULL);
2405
0
    s->size = htab->dynamic_interpreter_size;
2406
0
    s->contents = (unsigned char *) htab->dynamic_interpreter;
2407
0
    htab->interp = s;
2408
0
  }
2409
0
    }
2410
2411
  /* Set up .got offsets for local syms, and space for local dynamic
2412
     relocs.  */
2413
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2414
0
    {
2415
0
      bfd_signed_vma *local_got;
2416
0
      bfd_signed_vma *end_local_got;
2417
0
      char *local_tls_type;
2418
0
      bfd_size_type locsymcount;
2419
0
      Elf_Internal_Shdr *symtab_hdr;
2420
0
      asection *srel;
2421
2422
0
      if (! is_sparc_elf (ibfd))
2423
0
  continue;
2424
2425
0
      for (s = ibfd->sections; s != NULL; s = s->next)
2426
0
  {
2427
0
    struct elf_dyn_relocs *p;
2428
2429
0
    for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2430
0
      {
2431
0
        if (!bfd_is_abs_section (p->sec)
2432
0
      && bfd_is_abs_section (p->sec->output_section))
2433
0
    {
2434
      /* Input section has been discarded, either because
2435
         it is a copy of a linkonce section or due to
2436
         linker script /DISCARD/, so we'll be discarding
2437
         the relocs too.  */
2438
0
    }
2439
0
        else if (htab->elf.target_os == is_vxworks
2440
0
           && strcmp (p->sec->output_section->name,
2441
0
          ".tls_vars") == 0)
2442
0
    {
2443
      /* Relocations in vxworks .tls_vars sections are
2444
         handled specially by the loader.  */
2445
0
    }
2446
0
        else if (p->count != 0)
2447
0
    {
2448
0
      srel = elf_section_data (p->sec)->sreloc;
2449
0
      if (!htab->elf.dynamic_sections_created)
2450
0
        srel = htab->elf.irelplt;
2451
0
      srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2452
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2453
0
        {
2454
0
          info->flags |= DF_TEXTREL;
2455
0
          info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
2456
0
                p->sec->owner, p->sec);
2457
0
        }
2458
0
    }
2459
0
      }
2460
0
  }
2461
2462
0
      local_got = elf_local_got_refcounts (ibfd);
2463
0
      if (!local_got)
2464
0
  continue;
2465
2466
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
2467
0
      locsymcount = symtab_hdr->sh_info;
2468
0
      end_local_got = local_got + locsymcount;
2469
0
      local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
2470
0
      s = htab->elf.sgot;
2471
0
      srel = htab->elf.srelgot;
2472
0
      for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2473
0
  {
2474
0
    if (*local_got > 0)
2475
0
      {
2476
0
        *local_got = s->size;
2477
0
        s->size += SPARC_ELF_WORD_BYTES (htab);
2478
0
        if (*local_tls_type == GOT_TLS_GD)
2479
0
    s->size += SPARC_ELF_WORD_BYTES (htab);
2480
0
        if (bfd_link_pic (info)
2481
0
      || *local_tls_type == GOT_TLS_GD
2482
0
      || *local_tls_type == GOT_TLS_IE)
2483
0
    srel->size += SPARC_ELF_RELA_BYTES (htab);
2484
0
      }
2485
0
    else
2486
0
      *local_got = (bfd_vma) -1;
2487
0
  }
2488
0
    }
2489
2490
0
  if (htab->tls_ldm_got.refcount > 0)
2491
0
    {
2492
      /* Allocate 2 got entries and 1 dynamic reloc for
2493
   R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
2494
0
      htab->tls_ldm_got.offset = htab->elf.sgot->size;
2495
0
      htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
2496
0
      htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2497
0
    }
2498
0
  else
2499
0
    htab->tls_ldm_got.offset = -1;
2500
2501
  /* Allocate global sym .plt and .got entries, and space for global
2502
     sym dynamic relocs.  */
2503
0
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2504
2505
  /* Allocate .plt and .got entries, and space for local symbols.  */
2506
0
  htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
2507
2508
0
  if (! ABI_64_P (output_bfd)
2509
0
      && htab->elf.target_os != is_vxworks
2510
0
      && elf_hash_table (info)->dynamic_sections_created)
2511
0
    {
2512
      /* Make space for the trailing nop in .plt.  */
2513
0
      if (htab->elf.splt->size > 0)
2514
0
  htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
2515
2516
      /* If the .got section is more than 0x1000 bytes, we add
2517
   0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
2518
   bit relocations have a greater chance of working.
2519
2520
   FIXME: Make this optimization work for 64-bit too.  */
2521
0
      if (htab->elf.sgot->size >= 0x1000
2522
0
    && elf_hash_table (info)->hgot->root.u.def.value == 0)
2523
0
  elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
2524
0
    }
2525
2526
  /* The check_relocs and adjust_dynamic_symbol entry points have
2527
     determined the sizes of the various dynamic sections.  Allocate
2528
     memory for them.  */
2529
0
  for (s = dynobj->sections; s != NULL; s = s->next)
2530
0
    {
2531
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2532
0
  continue;
2533
2534
0
      if (s == htab->elf.splt
2535
0
    || s == htab->elf.sgot
2536
0
    || s == htab->elf.sdynbss
2537
0
    || s == htab->elf.sdynrelro
2538
0
    || s == htab->elf.iplt
2539
0
    || s == htab->elf.sgotplt)
2540
0
  {
2541
    /* Strip this section if we don't need it; see the
2542
       comment below.  */
2543
0
  }
2544
0
      else if (startswith (s->name, ".rela"))
2545
0
  {
2546
0
    if (s->size != 0)
2547
0
      {
2548
        /* We use the reloc_count field as a counter if we need
2549
     to copy relocs into the output file.  */
2550
0
        s->reloc_count = 0;
2551
0
      }
2552
0
  }
2553
0
      else
2554
0
  {
2555
    /* It's not one of our sections.  */
2556
0
    continue;
2557
0
  }
2558
2559
0
      if (s->size == 0)
2560
0
  {
2561
    /* If we don't need this section, strip it from the
2562
       output file.  This is mostly to handle .rela.bss and
2563
       .rela.plt.  We must create both sections in
2564
       create_dynamic_sections, because they must be created
2565
       before the linker maps input sections to output
2566
       sections.  The linker does that before
2567
       adjust_dynamic_symbol is called, and it is that
2568
       function which decides whether anything needs to go
2569
       into these sections.  */
2570
0
    s->flags |= SEC_EXCLUDE;
2571
0
    continue;
2572
0
  }
2573
2574
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2575
0
  continue;
2576
2577
      /* Allocate memory for the section contents.  Zero the memory
2578
   for the benefit of .rela.plt, which has 4 unused entries
2579
   at the beginning, and we don't want garbage.  */
2580
0
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2581
0
      if (s->contents == NULL)
2582
0
  return false;
2583
0
    }
2584
2585
0
  if (elf_hash_table (info)->dynamic_sections_created)
2586
0
    {
2587
      /* Add some entries to the .dynamic section.  We fill in the
2588
   values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
2589
   must add the entries now so that we get the correct size for
2590
   the .dynamic section.  The DT_DEBUG entry is filled in by the
2591
   dynamic linker and used by the debugger.  */
2592
0
#define add_dynamic_entry(TAG, VAL) \
2593
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2594
2595
0
      if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
2596
0
                true))
2597
0
  return false;
2598
2599
0
      if (ABI_64_P (output_bfd))
2600
0
  {
2601
0
    int reg;
2602
0
    struct _bfd_sparc_elf_app_reg * app_regs;
2603
0
    struct elf_strtab_hash *dynstr;
2604
0
    struct elf_link_hash_table *eht = elf_hash_table (info);
2605
2606
    /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
2607
       entries if needed.  */
2608
0
    app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
2609
0
    dynstr = eht->dynstr;
2610
2611
0
    for (reg = 0; reg < 4; reg++)
2612
0
      if (app_regs [reg].name != NULL)
2613
0
        {
2614
0
    struct elf_link_local_dynamic_entry *entry, *e;
2615
2616
0
    if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
2617
0
      return false;
2618
2619
0
    entry = (struct elf_link_local_dynamic_entry *)
2620
0
      bfd_hash_allocate (&info->hash->table, sizeof (*entry));
2621
0
    if (entry == NULL)
2622
0
      return false;
2623
2624
    /* We cheat here a little bit: the symbol will not be local, so we
2625
       put it at the end of the dynlocal linked list.  We will fix it
2626
       later on, as we have to fix other fields anyway.  */
2627
0
    entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
2628
0
    entry->isym.st_size = 0;
2629
0
    if (*app_regs [reg].name != '\0')
2630
0
      entry->isym.st_name
2631
0
        = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, false);
2632
0
    else
2633
0
      entry->isym.st_name = 0;
2634
0
    entry->isym.st_other = 0;
2635
0
    entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
2636
0
               STT_REGISTER);
2637
0
    entry->isym.st_shndx = app_regs [reg].shndx;
2638
0
    entry->isym.st_target_internal = 0;
2639
0
    entry->next = NULL;
2640
0
    entry->input_bfd = output_bfd;
2641
0
    entry->input_indx = -1;
2642
2643
0
    if (eht->dynlocal == NULL)
2644
0
      eht->dynlocal = entry;
2645
0
    else
2646
0
      {
2647
0
        for (e = eht->dynlocal; e->next; e = e->next)
2648
0
          ;
2649
0
        e->next = entry;
2650
0
      }
2651
0
    eht->dynsymcount++;
2652
0
        }
2653
0
  }
2654
0
    }
2655
0
#undef add_dynamic_entry
2656
2657
0
  return true;
2658
0
}
2659

2660
bool
2661
_bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
2662
11.3k
{
2663
11.3k
  if (!sec->used_by_bfd)
2664
11.3k
    {
2665
11.3k
      struct _bfd_sparc_elf_section_data *sdata;
2666
11.3k
      size_t amt = sizeof (*sdata);
2667
2668
11.3k
      sdata = bfd_zalloc (abfd, amt);
2669
11.3k
      if (sdata == NULL)
2670
0
  return false;
2671
11.3k
      sec->used_by_bfd = sdata;
2672
11.3k
    }
2673
2674
11.3k
  return _bfd_elf_new_section_hook (abfd, sec);
2675
11.3k
}
2676
2677
bool
2678
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
2679
            struct bfd_section *section,
2680
            struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2681
            bool *again)
2682
0
{
2683
0
  if (bfd_link_relocatable (link_info))
2684
0
    (*link_info->callbacks->einfo)
2685
0
      (_("%P%F: --relax and -r may not be used together\n"));
2686
2687
0
  *again = false;
2688
0
  sec_do_relax (section) = 1;
2689
0
  return true;
2690
0
}
2691

2692
/* Return the base VMA address which should be subtracted from real addresses
2693
   when resolving @dtpoff relocation.
2694
   This is PT_TLS segment p_vaddr.  */
2695
2696
static bfd_vma
2697
dtpoff_base (struct bfd_link_info *info)
2698
0
{
2699
  /* If tls_sec is NULL, we should have signalled an error already.  */
2700
0
  if (elf_hash_table (info)->tls_sec == NULL)
2701
0
    return 0;
2702
0
  return elf_hash_table (info)->tls_sec->vma;
2703
0
}
2704
2705
/* Return the relocation value for @tpoff relocation
2706
   if STT_TLS virtual address is ADDRESS.  */
2707
2708
static bfd_vma
2709
tpoff (struct bfd_link_info *info, bfd_vma address)
2710
0
{
2711
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2712
0
  const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
2713
0
  bfd_vma static_tls_size;
2714
2715
  /* If tls_sec is NULL, we should have signalled an error already.  */
2716
0
  if (htab->tls_sec == NULL)
2717
0
    return 0;
2718
2719
  /* Consider special static TLS alignment requirements.  */
2720
0
  static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
2721
0
  return address - static_tls_size - htab->tls_sec->vma;
2722
0
}
2723
2724
/* Return the relocation value for a %gdop relocation.  */
2725
2726
static bfd_vma
2727
gdopoff (struct bfd_link_info *info, bfd_vma address)
2728
0
{
2729
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2730
0
  bfd_vma got_base;
2731
2732
0
  got_base = (htab->hgot->root.u.def.value
2733
0
        + htab->hgot->root.u.def.section->output_offset
2734
0
        + htab->hgot->root.u.def.section->output_section->vma);
2735
2736
0
  return address - got_base;
2737
0
}
2738
2739
/* Return whether H is local and its ADDRESS is within 4G of
2740
   _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a
2741
   sethi, xor sequence.  */
2742
2743
static bool
2744
gdop_relative_offset_ok (struct bfd_link_info *info,
2745
       struct elf_link_hash_entry *h,
2746
       bfd_vma address ATTRIBUTE_UNUSED)
2747
0
{
2748
0
  if (!SYMBOL_REFERENCES_LOCAL (info, h))
2749
0
    return false;
2750
  /* If H is undefined, ADDRESS will be zero.  We can't allow a
2751
     relative offset to "zero" when producing PIEs or shared libs.
2752
     Note that to get here with an undefined symbol it must also be
2753
     hidden or internal visibility.  */
2754
0
  if (bfd_link_pic (info)
2755
0
      && h != NULL
2756
0
      && (h->root.type == bfd_link_hash_undefweak
2757
0
    || h->root.type == bfd_link_hash_undefined))
2758
0
    return false;
2759
0
#ifdef BFD64
2760
0
  return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32;
2761
#else
2762
  return true;
2763
#endif
2764
0
}
2765
2766
/* Relocate a SPARC ELF section.  */
2767
2768
int
2769
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
2770
         struct bfd_link_info *info,
2771
         bfd *input_bfd,
2772
         asection *input_section,
2773
         bfd_byte *contents,
2774
         Elf_Internal_Rela *relocs,
2775
         Elf_Internal_Sym *local_syms,
2776
         asection **local_sections)
2777
0
{
2778
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2779
0
  Elf_Internal_Shdr *symtab_hdr;
2780
0
  struct elf_link_hash_entry **sym_hashes;
2781
0
  bfd_vma *local_got_offsets;
2782
0
  bfd_vma got_base;
2783
0
  asection *sreloc;
2784
0
  Elf_Internal_Rela *rel;
2785
0
  Elf_Internal_Rela *relend;
2786
0
  int num_relocs;
2787
0
  bool is_vxworks_tls;
2788
2789
0
  htab = _bfd_sparc_elf_hash_table (info);
2790
0
  BFD_ASSERT (htab != NULL);
2791
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
2792
0
  sym_hashes = elf_sym_hashes (input_bfd);
2793
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
2794
2795
0
  if (elf_hash_table (info)->hgot == NULL)
2796
0
    got_base = 0;
2797
0
  else
2798
0
    got_base = elf_hash_table (info)->hgot->root.u.def.value;
2799
2800
0
  sreloc = elf_section_data (input_section)->sreloc;
2801
  /* We have to handle relocations in vxworks .tls_vars sections
2802
     specially, because the dynamic loader is 'weird'.  */
2803
0
  is_vxworks_tls = (htab->elf.target_os == is_vxworks
2804
0
        && bfd_link_pic (info)
2805
0
        && !strcmp (input_section->output_section->name,
2806
0
        ".tls_vars"));
2807
2808
0
  rel = relocs;
2809
0
  if (ABI_64_P (output_bfd))
2810
0
    num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
2811
0
  else
2812
0
    num_relocs = input_section->reloc_count;
2813
0
  relend = relocs + num_relocs;
2814
0
  for (; rel < relend; rel++)
2815
0
    {
2816
0
      int r_type, tls_type;
2817
0
      reloc_howto_type *howto;
2818
0
      unsigned long r_symndx;
2819
0
      struct elf_link_hash_entry *h;
2820
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
2821
0
      Elf_Internal_Sym *sym;
2822
0
      asection *sec;
2823
0
      bfd_vma relocation, off;
2824
0
      bfd_reloc_status_type r;
2825
0
      bool is_plt = false;
2826
0
      bool unresolved_reloc;
2827
0
      bool resolved_to_zero;
2828
0
      bool relative_reloc;
2829
2830
0
      r_type = SPARC_ELF_R_TYPE (rel->r_info);
2831
0
      if (r_type == R_SPARC_GNU_VTINHERIT
2832
0
    || r_type == R_SPARC_GNU_VTENTRY)
2833
0
  continue;
2834
2835
0
      if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2836
0
  {
2837
0
    bfd_set_error (bfd_error_bad_value);
2838
0
    return false;
2839
0
  }
2840
2841
0
      howto = _bfd_sparc_elf_howto_table + r_type;
2842
0
      r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
2843
0
      h = NULL;
2844
0
      sym = NULL;
2845
0
      sec = NULL;
2846
0
      unresolved_reloc = false;
2847
0
      if (r_symndx < symtab_hdr->sh_info)
2848
0
  {
2849
0
    sym = local_syms + r_symndx;
2850
0
    sec = local_sections[r_symndx];
2851
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2852
2853
0
    if (!bfd_link_relocatable (info)
2854
0
        && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2855
0
      {
2856
        /* Relocate against local STT_GNU_IFUNC symbol.  */
2857
0
        h = elf_sparc_get_local_sym_hash (htab, input_bfd,
2858
0
            rel, false);
2859
0
        if (h == NULL)
2860
0
    abort ();
2861
2862
        /* Set STT_GNU_IFUNC symbol value.  */
2863
0
        h->root.u.def.value = sym->st_value;
2864
0
        h->root.u.def.section = sec;
2865
0
      }
2866
0
  }
2867
0
      else
2868
0
  {
2869
0
    bool warned, ignored;
2870
2871
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2872
0
           r_symndx, symtab_hdr, sym_hashes,
2873
0
           h, sec, relocation,
2874
0
           unresolved_reloc, warned, ignored);
2875
0
    if (warned)
2876
0
      {
2877
        /* To avoid generating warning messages about truncated
2878
     relocations, set the relocation's address to be the same as
2879
     the start of this section.  */
2880
0
        if (input_section->output_section != NULL)
2881
0
    relocation = input_section->output_section->vma;
2882
0
        else
2883
0
    relocation = 0;
2884
0
      }
2885
0
  }
2886
2887
0
      if (sec != NULL && discarded_section (sec))
2888
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2889
0
           rel, 1, relend, howto, 0, contents);
2890
2891
0
      if (bfd_link_relocatable (info))
2892
0
  continue;
2893
2894
0
      if (h != NULL
2895
0
    && h->type == STT_GNU_IFUNC
2896
0
    && h->def_regular)
2897
0
  {
2898
0
    asection *plt_sec;
2899
0
    const char *name;
2900
2901
0
    if ((input_section->flags & SEC_ALLOC) == 0
2902
0
        || h->plt.offset == (bfd_vma) -1)
2903
0
      {
2904
        /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2905
           STT_GNU_IFUNC symbol as STT_FUNC.  */
2906
0
        if (elf_section_type (input_section) == SHT_NOTE)
2907
0
    goto skip_ifunc;
2908
2909
        /* Dynamic relocs are not propagated for SEC_DEBUGGING
2910
     sections because such sections are not SEC_ALLOC and
2911
     thus ld.so will not process them.  */
2912
0
        if ((input_section->flags & SEC_ALLOC) == 0
2913
0
      && (input_section->flags & SEC_DEBUGGING) != 0)
2914
0
    continue;
2915
2916
0
        _bfd_error_handler
2917
    /* xgettext:c-format */
2918
0
    (_("%pB(%pA+%#" PRIx64 "): "
2919
0
       "unresolvable %s relocation against symbol `%s'"),
2920
0
     input_bfd,
2921
0
     input_section,
2922
0
     (uint64_t) rel->r_offset,
2923
0
     howto->name,
2924
0
     h->root.root.string);
2925
0
        bfd_set_error (bfd_error_bad_value);
2926
0
        return false;
2927
0
      }
2928
2929
0
    plt_sec = htab->elf.splt;
2930
0
    if (! plt_sec)
2931
0
      plt_sec =htab->elf.iplt;
2932
2933
0
    switch (r_type)
2934
0
      {
2935
0
      case R_SPARC_GOTDATA_OP:
2936
0
        continue;
2937
2938
0
      case R_SPARC_GOTDATA_OP_HIX22:
2939
0
      case R_SPARC_GOTDATA_OP_LOX10:
2940
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
2941
0
      ? R_SPARC_GOT22
2942
0
      : R_SPARC_GOT10);
2943
0
        howto = _bfd_sparc_elf_howto_table + r_type;
2944
        /* Fall through.  */
2945
2946
0
      case R_SPARC_GOT10:
2947
0
      case R_SPARC_GOT13:
2948
0
      case R_SPARC_GOT22:
2949
0
        if (htab->elf.sgot == NULL)
2950
0
    abort ();
2951
0
        off = h->got.offset;
2952
0
        if (off == (bfd_vma) -1)
2953
0
    abort();
2954
0
        relocation = htab->elf.sgot->output_offset + off - got_base;
2955
0
        goto do_relocation;
2956
2957
0
      case R_SPARC_WPLT30:
2958
0
      case R_SPARC_WDISP30:
2959
0
        relocation = (plt_sec->output_section->vma
2960
0
          + plt_sec->output_offset + h->plt.offset);
2961
0
        goto do_relocation;
2962
2963
0
      case R_SPARC_32:
2964
0
      case R_SPARC_64:
2965
0
        if (bfd_link_pic (info) && h->non_got_ref)
2966
0
    {
2967
0
      Elf_Internal_Rela outrel;
2968
0
      bfd_vma offset;
2969
2970
0
      offset = _bfd_elf_section_offset (output_bfd, info,
2971
0
                input_section,
2972
0
                rel->r_offset);
2973
0
      if (offset == (bfd_vma) -1
2974
0
          || offset == (bfd_vma) -2)
2975
0
        abort();
2976
2977
0
      outrel.r_offset = (input_section->output_section->vma
2978
0
             + input_section->output_offset
2979
0
             + offset);
2980
2981
0
      if (h->dynindx == -1
2982
0
          || h->forced_local
2983
0
          || bfd_link_executable (info))
2984
0
        {
2985
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2986
0
              0, R_SPARC_IRELATIVE);
2987
0
          outrel.r_addend = relocation + rel->r_addend;
2988
0
        }
2989
0
      else
2990
0
        {
2991
0
          if (h->dynindx == -1)
2992
0
      abort();
2993
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
2994
0
          outrel.r_addend = rel->r_addend;
2995
0
        }
2996
2997
0
      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
2998
0
      continue;
2999
0
    }
3000
3001
0
        relocation = (plt_sec->output_section->vma
3002
0
          + plt_sec->output_offset + h->plt.offset);
3003
0
        goto do_relocation;
3004
3005
0
      case R_SPARC_HI22:
3006
0
      case R_SPARC_LO10:
3007
        /* We should only see such relocs in static links.  */
3008
0
        if (bfd_link_pic (info))
3009
0
    abort();
3010
0
        relocation = (plt_sec->output_section->vma
3011
0
          + plt_sec->output_offset + h->plt.offset);
3012
0
        goto do_relocation;
3013
3014
0
      default:
3015
0
        if (h->root.root.string)
3016
0
    name = h->root.root.string;
3017
0
        else
3018
0
    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3019
0
           NULL);
3020
0
        _bfd_error_handler
3021
    /* xgettext:c-format */
3022
0
    (_("%pB: relocation %s against STT_GNU_IFUNC "
3023
0
       "symbol `%s' isn't handled by %s"), input_bfd,
3024
0
     _bfd_sparc_elf_howto_table[r_type].name,
3025
0
     name, __func__);
3026
0
        bfd_set_error (bfd_error_bad_value);
3027
0
        return false;
3028
0
      }
3029
0
  }
3030
3031
0
    skip_ifunc:
3032
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
3033
0
      resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
3034
3035
0
      switch (r_type)
3036
0
  {
3037
0
  case R_SPARC_GOTDATA_OP_HIX22:
3038
0
  case R_SPARC_GOTDATA_OP_LOX10:
3039
0
    if (gdop_relative_offset_ok (info, h, relocation))
3040
0
      {
3041
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3042
0
      ? R_SPARC_GOTDATA_HIX22
3043
0
      : R_SPARC_GOTDATA_LOX10);
3044
0
        howto = _bfd_sparc_elf_howto_table + r_type;
3045
0
      }
3046
0
    break;
3047
3048
0
  case R_SPARC_GOTDATA_OP:
3049
0
    if (gdop_relative_offset_ok (info, h, relocation))
3050
0
      {
3051
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3052
3053
        /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
3054
0
        relocation = 0x80000000 | (insn & 0x3e07c01f);
3055
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3056
3057
        /* If the symbol is global but not dynamic, an .rela.* slot has
3058
     been allocated for it in the GOT so output R_SPARC_NONE here,
3059
     if it isn't also subject to another, old-style GOT relocation.
3060
     See also the handling of these GOT relocations just below.  */
3061
0
        if (h != NULL
3062
0
      && h->dynindx == -1
3063
0
      && !h->forced_local
3064
0
      && h->root.type != bfd_link_hash_undefweak
3065
0
      && !eh->has_old_style_got_reloc
3066
0
      && (h->got.offset & 1) == 0
3067
0
      && bfd_link_pic (info))
3068
0
    {
3069
0
      asection *s = htab->elf.srelgot;
3070
0
      Elf_Internal_Rela outrel;
3071
3072
0
      BFD_ASSERT (s != NULL);
3073
3074
0
      memset (&outrel, 0, sizeof outrel);
3075
0
      sparc_elf_append_rela (output_bfd, s, &outrel);
3076
0
      h->got.offset |= 1;
3077
0
    }
3078
0
      }
3079
0
    continue;
3080
0
  }
3081
3082
0
      switch (r_type)
3083
0
  {
3084
0
  case R_SPARC_GOTDATA_HIX22:
3085
0
  case R_SPARC_GOTDATA_LOX10:
3086
0
    relocation = gdopoff (info, relocation);
3087
0
    break;
3088
3089
0
  case R_SPARC_GOTDATA_OP_HIX22:
3090
0
  case R_SPARC_GOTDATA_OP_LOX10:
3091
0
  case R_SPARC_GOT10:
3092
0
  case R_SPARC_GOT13:
3093
0
  case R_SPARC_GOT22:
3094
    /* Relocation is to the entry for this symbol in the global
3095
       offset table.  */
3096
0
    if (htab->elf.sgot == NULL)
3097
0
      abort ();
3098
3099
0
    relative_reloc = false;
3100
0
    if (h != NULL)
3101
0
      {
3102
0
        bool dyn;
3103
3104
0
        off = h->got.offset;
3105
0
        BFD_ASSERT (off != (bfd_vma) -1);
3106
0
        dyn = elf_hash_table (info)->dynamic_sections_created;
3107
3108
0
        if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3109
0
                 bfd_link_pic (info),
3110
0
                 h)
3111
0
      || (bfd_link_pic (info)
3112
0
          && SYMBOL_REFERENCES_LOCAL (info, h)))
3113
0
    {
3114
      /* This is actually a static link, or it is a
3115
         -Bsymbolic link and the symbol is defined
3116
         locally, or the symbol was forced to be local
3117
         because of a version file.  We must initialize
3118
         this entry in the global offset table.  Since the
3119
         offset must always be a multiple of 8 for 64-bit
3120
         and 4 for 32-bit, we use the least significant bit
3121
         to record whether we have initialized it already.
3122
3123
         When doing a dynamic link, we create a .rela.got
3124
         relocation entry to initialize the value.  This
3125
         is done in the finish_dynamic_symbol routine.  */
3126
0
      if ((off & 1) != 0)
3127
0
        off &= ~1;
3128
0
      else
3129
0
        {
3130
          /* If this symbol isn't dynamic in PIC mode, treat it
3131
       like a local symbol in PIC mode below.  */
3132
0
          if (h->dynindx == -1
3133
0
        && !h->forced_local
3134
0
        && h->root.type != bfd_link_hash_undefweak
3135
0
        && bfd_link_pic (info))
3136
0
      relative_reloc = true;
3137
0
          else
3138
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3139
0
              htab->elf.sgot->contents + off);
3140
0
          h->got.offset |= 1;
3141
0
        }
3142
0
    }
3143
0
        else
3144
0
    unresolved_reloc = false;
3145
0
      }
3146
0
    else
3147
0
      {
3148
0
        BFD_ASSERT (local_got_offsets != NULL
3149
0
        && local_got_offsets[r_symndx] != (bfd_vma) -1);
3150
3151
0
        off = local_got_offsets[r_symndx];
3152
3153
        /* The offset must always be a multiple of 8 on 64-bit and
3154
     4 on 32-bit.  We use the least significant bit to record
3155
     whether we have already processed this entry.  */
3156
0
        if ((off & 1) != 0)
3157
0
    off &= ~1;
3158
0
        else
3159
0
    {
3160
      /* For a local symbol in PIC mode, we need to generate a
3161
         R_SPARC_RELATIVE reloc for the dynamic linker.  */
3162
0
      if (bfd_link_pic (info))
3163
0
        relative_reloc = true;
3164
0
      else
3165
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3166
0
          htab->elf.sgot->contents + off);
3167
0
      local_got_offsets[r_symndx] |= 1;
3168
0
    }
3169
0
      }
3170
3171
0
    if (relative_reloc)
3172
0
      {
3173
0
        asection *s = htab->elf.srelgot;
3174
0
        Elf_Internal_Rela outrel;
3175
3176
0
        BFD_ASSERT (s != NULL);
3177
3178
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3179
0
         + htab->elf.sgot->output_offset
3180
0
         + off);
3181
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3182
0
            0, R_SPARC_RELATIVE);
3183
0
        outrel.r_addend = relocation;
3184
0
        sparc_elf_append_rela (output_bfd, s, &outrel);
3185
        /* Versions of glibc ld.so at least up to 2.26 wrongly
3186
     add the section contents to the value calculated for
3187
     a RELATIVE reloc.  Zero the contents to work around
3188
     this bug.  */
3189
0
        relocation = 0;
3190
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3191
0
          htab->elf.sgot->contents + off);
3192
0
      }
3193
3194
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3195
0
    break;
3196
3197
0
  case R_SPARC_PLT32:
3198
0
  case R_SPARC_PLT64:
3199
0
    if (h == NULL || h->plt.offset == (bfd_vma) -1)
3200
0
      {
3201
0
        r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
3202
0
        goto r_sparc_plt32;
3203
0
      }
3204
    /* Fall through.  */
3205
3206
0
  case R_SPARC_WPLT30:
3207
0
  case R_SPARC_HIPLT22:
3208
0
  case R_SPARC_LOPLT10:
3209
0
  case R_SPARC_PCPLT32:
3210
0
  case R_SPARC_PCPLT22:
3211
0
  case R_SPARC_PCPLT10:
3212
0
  r_sparc_wplt30:
3213
    /* Relocation is to the entry for this symbol in the
3214
       procedure linkage table.  */
3215
3216
0
    if (! ABI_64_P (output_bfd))
3217
0
      {
3218
        /* The Solaris native assembler will generate a WPLT30 reloc
3219
     for a local symbol if you assemble a call from one
3220
     section to another when using -K pic.  We treat it as
3221
     WDISP30.  */
3222
0
        if (h == NULL)
3223
0
    break;
3224
0
      }
3225
    /* PR 7027: We need similar behaviour for 64-bit binaries.  */
3226
0
    else if (r_type == R_SPARC_WPLT30 && h == NULL)
3227
0
      break;
3228
0
    else
3229
0
      {
3230
0
        BFD_ASSERT (h != NULL);
3231
0
      }
3232
3233
0
    if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3234
0
      {
3235
        /* We didn't make a PLT entry for this symbol.  This
3236
     happens when statically linking PIC code, or when
3237
     using -Bsymbolic.  */
3238
0
        break;
3239
0
      }
3240
3241
0
    relocation = (htab->elf.splt->output_section->vma
3242
0
      + htab->elf.splt->output_offset
3243
0
      + h->plt.offset);
3244
0
    unresolved_reloc = false;
3245
0
    if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
3246
0
      {
3247
0
        r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
3248
0
        is_plt = true;
3249
0
        goto r_sparc_plt32;
3250
0
      }
3251
0
    break;
3252
3253
0
  case R_SPARC_PC10:
3254
0
  case R_SPARC_PC22:
3255
0
  case R_SPARC_PC_HH22:
3256
0
  case R_SPARC_PC_HM10:
3257
0
  case R_SPARC_PC_LM22:
3258
0
    if (h != NULL
3259
0
        && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3260
0
      break;
3261
    /* Fall through.  */
3262
0
  case R_SPARC_DISP8:
3263
0
  case R_SPARC_DISP16:
3264
0
  case R_SPARC_DISP32:
3265
0
  case R_SPARC_DISP64:
3266
0
  case R_SPARC_WDISP30:
3267
0
  case R_SPARC_WDISP22:
3268
0
  case R_SPARC_WDISP19:
3269
0
  case R_SPARC_WDISP16:
3270
0
  case R_SPARC_WDISP10:
3271
0
  case R_SPARC_8:
3272
0
  case R_SPARC_16:
3273
0
  case R_SPARC_32:
3274
0
  case R_SPARC_HI22:
3275
0
  case R_SPARC_22:
3276
0
  case R_SPARC_13:
3277
0
  case R_SPARC_LO10:
3278
0
  case R_SPARC_UA16:
3279
0
  case R_SPARC_UA32:
3280
0
  case R_SPARC_10:
3281
0
  case R_SPARC_11:
3282
0
  case R_SPARC_64:
3283
0
  case R_SPARC_OLO10:
3284
0
  case R_SPARC_HH22:
3285
0
  case R_SPARC_HM10:
3286
0
  case R_SPARC_LM22:
3287
0
  case R_SPARC_7:
3288
0
  case R_SPARC_5:
3289
0
  case R_SPARC_6:
3290
0
  case R_SPARC_HIX22:
3291
0
  case R_SPARC_LOX10:
3292
0
  case R_SPARC_H44:
3293
0
  case R_SPARC_M44:
3294
0
  case R_SPARC_L44:
3295
0
  case R_SPARC_H34:
3296
0
  case R_SPARC_UA64:
3297
0
  r_sparc_plt32:
3298
0
    if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls)
3299
0
      break;
3300
3301
    /* Copy dynamic function pointer relocations.  Don't generate
3302
       dynamic relocations against resolved undefined weak symbols
3303
       in PIE.  */
3304
0
    if ((bfd_link_pic (info)
3305
0
         && (h == NULL
3306
0
       || !(h->root.type == bfd_link_hash_undefweak
3307
0
      && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3308
0
          || resolved_to_zero)))
3309
0
         && (! howto->pc_relative
3310
0
       || !SYMBOL_CALLS_LOCAL (info, h)))
3311
0
        || (!bfd_link_pic (info)
3312
0
      && h != NULL
3313
0
      && h->dynindx != -1
3314
0
      && !h->non_got_ref
3315
0
      && ((h->def_dynamic
3316
0
           && !h->def_regular)
3317
0
          || (h->root.type == bfd_link_hash_undefweak
3318
0
        && !resolved_to_zero)
3319
0
          || h->root.type == bfd_link_hash_undefined)))
3320
0
      {
3321
0
        Elf_Internal_Rela outrel;
3322
0
        bool skip, relocate = false;
3323
3324
        /* When generating a shared object, these relocations
3325
     are copied into the output file to be resolved at run
3326
     time.  */
3327
3328
0
        BFD_ASSERT (sreloc != NULL);
3329
3330
0
        skip = false;
3331
3332
0
        outrel.r_offset =
3333
0
    _bfd_elf_section_offset (output_bfd, info, input_section,
3334
0
           rel->r_offset);
3335
0
        if (outrel.r_offset == (bfd_vma) -1)
3336
0
    skip = true;
3337
0
        else if (outrel.r_offset == (bfd_vma) -2)
3338
0
    skip = true, relocate = true;
3339
0
        outrel.r_offset += (input_section->output_section->vma
3340
0
          + input_section->output_offset);
3341
3342
        /* Optimize unaligned reloc usage now that we know where
3343
     it finally resides.  */
3344
0
        switch (r_type)
3345
0
    {
3346
0
    case R_SPARC_16:
3347
0
      if (outrel.r_offset & 1)
3348
0
        r_type = R_SPARC_UA16;
3349
0
      break;
3350
0
    case R_SPARC_UA16:
3351
0
      if (!(outrel.r_offset & 1))
3352
0
        r_type = R_SPARC_16;
3353
0
      break;
3354
0
    case R_SPARC_32:
3355
0
      if (outrel.r_offset & 3)
3356
0
        r_type = R_SPARC_UA32;
3357
0
      break;
3358
0
    case R_SPARC_UA32:
3359
0
      if (!(outrel.r_offset & 3))
3360
0
        r_type = R_SPARC_32;
3361
0
      break;
3362
0
    case R_SPARC_64:
3363
0
      if (outrel.r_offset & 7)
3364
0
        r_type = R_SPARC_UA64;
3365
0
      break;
3366
0
    case R_SPARC_UA64:
3367
0
      if (!(outrel.r_offset & 7))
3368
0
        r_type = R_SPARC_64;
3369
0
      break;
3370
0
    case R_SPARC_DISP8:
3371
0
    case R_SPARC_DISP16:
3372
0
    case R_SPARC_DISP32:
3373
0
    case R_SPARC_DISP64:
3374
      /* If the symbol is not dynamic, we should not keep
3375
         a dynamic relocation.  But an .rela.* slot has been
3376
         allocated for it, output R_SPARC_NONE.
3377
         FIXME: Add code tracking needed dynamic relocs as
3378
         e.g. i386 has.  */
3379
0
      if (h->dynindx == -1)
3380
0
        skip = true, relocate = true;
3381
0
      break;
3382
0
    }
3383
3384
0
        if (skip)
3385
0
    memset (&outrel, 0, sizeof outrel);
3386
        /* h->dynindx may be -1 if the symbol was marked to
3387
     become local.  */
3388
0
        else if (h != NULL
3389
0
           && h->dynindx != -1
3390
0
           && (_bfd_sparc_elf_howto_table[r_type].pc_relative
3391
0
         || !bfd_link_pic (info)
3392
0
         || !SYMBOLIC_BIND (info, h)
3393
0
         || !h->def_regular))
3394
0
    {
3395
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3396
0
      outrel.r_addend = rel->r_addend;
3397
0
    }
3398
0
        else
3399
0
    {
3400
0
      if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
3401
0
          || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
3402
0
        {
3403
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3404
0
              0, R_SPARC_RELATIVE);
3405
0
          outrel.r_addend = relocation + rel->r_addend;
3406
0
        }
3407
0
      else
3408
0
        {
3409
0
          long indx;
3410
3411
0
          outrel.r_addend = relocation + rel->r_addend;
3412
3413
0
          if (is_plt)
3414
0
      sec = htab->elf.splt;
3415
3416
0
          if (bfd_is_abs_section (sec))
3417
0
      indx = 0;
3418
0
          else if (sec == NULL || sec->owner == NULL)
3419
0
      {
3420
0
        bfd_set_error (bfd_error_bad_value);
3421
0
        return false;
3422
0
      }
3423
0
          else
3424
0
      {
3425
0
        asection *osec;
3426
3427
        /* We are turning this relocation into one
3428
           against a section symbol.  It would be
3429
           proper to subtract the symbol's value,
3430
           osec->vma, from the emitted reloc addend,
3431
           but ld.so expects buggy relocs.  */
3432
0
        osec = sec->output_section;
3433
0
        indx = elf_section_data (osec)->dynindx;
3434
3435
0
        if (indx == 0)
3436
0
          {
3437
0
            osec = htab->elf.text_index_section;
3438
0
            indx = elf_section_data (osec)->dynindx;
3439
0
          }
3440
3441
        /* FIXME: we really should be able to link non-pic
3442
           shared libraries.  */
3443
0
        if (indx == 0)
3444
0
          {
3445
0
            BFD_FAIL ();
3446
0
            _bfd_error_handler
3447
0
        (_("%pB: probably compiled without -fPIC?"),
3448
0
         input_bfd);
3449
0
            bfd_set_error (bfd_error_bad_value);
3450
0
            return false;
3451
0
          }
3452
0
      }
3453
3454
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3455
0
              r_type);
3456
0
        }
3457
0
    }
3458
3459
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3460
3461
        /* This reloc will be computed at runtime, so there's no
3462
     need to do anything now.  */
3463
0
        if (! relocate)
3464
0
    continue;
3465
0
      }
3466
0
    break;
3467
3468
0
  case R_SPARC_TLS_GD_HI22:
3469
0
  case R_SPARC_TLS_GD_LO10:
3470
0
  case R_SPARC_TLS_IE_HI22:
3471
0
  case R_SPARC_TLS_IE_LO10:
3472
0
    r_type = sparc_elf_tls_transition (info, input_bfd, r_type,
3473
0
               h == NULL || h->dynindx == -1);
3474
0
    if (r_type == R_SPARC_REV32)
3475
0
      break;
3476
0
    if (h != NULL)
3477
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3478
0
    else if (local_got_offsets)
3479
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3480
0
    else
3481
0
      tls_type = GOT_UNKNOWN;
3482
0
    if (tls_type == GOT_TLS_IE)
3483
0
      switch (r_type)
3484
0
        {
3485
0
        case R_SPARC_TLS_GD_HI22:
3486
0
    r_type = R_SPARC_TLS_IE_HI22;
3487
0
    break;
3488
0
        case R_SPARC_TLS_GD_LO10:
3489
0
    r_type = R_SPARC_TLS_IE_LO10;
3490
0
    break;
3491
0
        }
3492
3493
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3494
0
      {
3495
0
        relocation = tpoff (info, relocation);
3496
0
        break;
3497
0
      }
3498
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3499
0
      {
3500
        /* Change add into xor.  */
3501
0
        relocation = tpoff (info, relocation);
3502
0
        bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3503
0
               contents + rel->r_offset)
3504
0
               | 0x80182000), contents + rel->r_offset);
3505
0
        break;
3506
0
      }
3507
3508
0
    if (h != NULL)
3509
0
      {
3510
0
        off = h->got.offset;
3511
0
        h->got.offset |= 1;
3512
0
      }
3513
0
    else
3514
0
      {
3515
0
        BFD_ASSERT (local_got_offsets != NULL);
3516
0
        off = local_got_offsets[r_symndx];
3517
0
        local_got_offsets[r_symndx] |= 1;
3518
0
      }
3519
3520
0
  r_sparc_tlsldm:
3521
0
    if (htab->elf.sgot == NULL)
3522
0
      abort ();
3523
3524
0
    if ((off & 1) != 0)
3525
0
      off &= ~1;
3526
0
    else
3527
0
      {
3528
0
        Elf_Internal_Rela outrel;
3529
0
        int dr_type, indx;
3530
3531
0
        if (htab->elf.srelgot == NULL)
3532
0
    abort ();
3533
3534
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3535
0
          htab->elf.sgot->contents + off);
3536
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3537
0
         + htab->elf.sgot->output_offset + off);
3538
0
        indx = h && h->dynindx != -1 ? h->dynindx : 0;
3539
0
        if (r_type == R_SPARC_TLS_IE_HI22
3540
0
      || r_type == R_SPARC_TLS_IE_LO10)
3541
0
    dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3542
0
        else
3543
0
    dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3544
0
        if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3545
0
    outrel.r_addend = relocation - dtpoff_base (info);
3546
0
        else
3547
0
    outrel.r_addend = 0;
3548
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3549
0
        sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3550
3551
0
        if (r_type == R_SPARC_TLS_GD_HI22
3552
0
      || r_type == R_SPARC_TLS_GD_LO10)
3553
0
    {
3554
0
      if (indx == 0)
3555
0
        {
3556
0
          BFD_ASSERT (! unresolved_reloc);
3557
0
          SPARC_ELF_PUT_WORD (htab, output_bfd,
3558
0
            relocation - dtpoff_base (info),
3559
0
            (htab->elf.sgot->contents + off
3560
0
             + SPARC_ELF_WORD_BYTES (htab)));
3561
0
        }
3562
0
      else
3563
0
        {
3564
0
          SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3565
0
            (htab->elf.sgot->contents + off
3566
0
             + SPARC_ELF_WORD_BYTES (htab)));
3567
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3568
0
              SPARC_ELF_DTPOFF_RELOC (htab));
3569
0
          outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3570
0
          sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3571
0
               &outrel);
3572
0
        }
3573
0
    }
3574
0
        else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3575
0
    {
3576
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3577
0
              (htab->elf.sgot->contents + off
3578
0
               + SPARC_ELF_WORD_BYTES (htab)));
3579
0
    }
3580
0
      }
3581
3582
0
    if (off >= (bfd_vma) -2)
3583
0
      abort ();
3584
3585
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3586
0
    unresolved_reloc = false;
3587
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3588
0
    break;
3589
3590
0
  case R_SPARC_TLS_LDM_HI22:
3591
0
  case R_SPARC_TLS_LDM_LO10:
3592
    /* LD -> LE */
3593
0
    if (bfd_link_executable (info))
3594
0
      {
3595
0
        bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3596
0
        continue;
3597
0
      }
3598
0
    off = htab->tls_ldm_got.offset;
3599
0
    htab->tls_ldm_got.offset |= 1;
3600
0
    goto r_sparc_tlsldm;
3601
3602
0
  case R_SPARC_TLS_LDO_HIX22:
3603
0
  case R_SPARC_TLS_LDO_LOX10:
3604
    /* LD -> LE */
3605
0
    if (bfd_link_executable (info))
3606
0
      {
3607
0
        if (r_type == R_SPARC_TLS_LDO_HIX22)
3608
0
    r_type = R_SPARC_TLS_LE_HIX22;
3609
0
        else
3610
0
    r_type = R_SPARC_TLS_LE_LOX10;
3611
0
      }
3612
0
    else
3613
0
      {
3614
0
        relocation -= dtpoff_base (info);
3615
0
        break;
3616
0
      }
3617
    /* Fall through.  */
3618
3619
0
  case R_SPARC_TLS_LE_HIX22:
3620
0
  case R_SPARC_TLS_LE_LOX10:
3621
0
    if (!bfd_link_executable (info))
3622
0
      {
3623
0
        Elf_Internal_Rela outrel;
3624
0
        bfd_vma offset
3625
0
    = _bfd_elf_section_offset (output_bfd, info, input_section,
3626
0
             rel->r_offset);
3627
0
        if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2)
3628
0
    memset (&outrel, 0, sizeof outrel);
3629
0
        else
3630
0
    {
3631
0
      outrel.r_offset = offset
3632
0
            + input_section->output_section->vma
3633
0
            + input_section->output_offset;
3634
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3635
0
      outrel.r_addend
3636
0
        = relocation - dtpoff_base (info) + rel->r_addend;
3637
0
    }
3638
3639
0
        BFD_ASSERT (sreloc != NULL);
3640
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3641
0
        continue;
3642
0
      }
3643
0
    relocation = tpoff (info, relocation);
3644
0
    break;
3645
3646
0
  case R_SPARC_TLS_LDM_CALL:
3647
    /* LD -> LE */
3648
0
    if (bfd_link_executable (info))
3649
0
      {
3650
        /* mov %g0, %o0 */
3651
0
        bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3652
0
        continue;
3653
0
      }
3654
    /* Fall through */
3655
3656
0
  case R_SPARC_TLS_GD_CALL:
3657
0
    if (h != NULL)
3658
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3659
0
    else if (local_got_offsets)
3660
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3661
0
    else
3662
0
      tls_type = GOT_UNKNOWN;
3663
    /* GD -> IE or LE */
3664
0
    if (bfd_link_executable (info)
3665
0
        || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3666
0
      {
3667
0
        Elf_Internal_Rela *rel2;
3668
0
        bfd_vma insn;
3669
3670
        /* GD -> LE */
3671
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3672
0
    {
3673
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3674
0
      continue;
3675
0
    }
3676
3677
        /* GD -> IE */
3678
0
        if (rel + 1 < relend
3679
0
      && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3680
0
      && rel[1].r_offset == rel->r_offset + 4
3681
0
      && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3682
0
      && (((insn = bfd_get_32 (input_bfd,
3683
0
             contents + rel[1].r_offset))
3684
0
           >> 25) & 0x1f) == 8)
3685
0
    {
3686
      /* We have
3687
         call __tls_get_addr, %tgd_call(foo)
3688
          add %reg1, %reg2, %o0, %tgd_add(foo)
3689
         and change it into IE:
3690
         {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3691
         add %g7, %o0, %o0, %tie_add(foo).
3692
         add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3693
         ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3694
         ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
3695
0
      bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3696
0
            contents + rel->r_offset);
3697
0
      bfd_put_32 (output_bfd, 0x9001c008,
3698
0
            contents + rel->r_offset + 4);
3699
0
      rel++;
3700
0
      continue;
3701
0
    }
3702
3703
        /* We cannot just overwrite the delay slot instruction,
3704
     as it might be what puts the %o0 argument to
3705
     __tls_get_addr into place.  So we have to transpose
3706
     the delay slot with the add we patch in.  */
3707
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3708
0
        bfd_put_32 (output_bfd, insn,
3709
0
        contents + rel->r_offset);
3710
0
        bfd_put_32 (output_bfd, 0x9001c008,
3711
0
        contents + rel->r_offset + 4);
3712
3713
0
        rel2 = rel;
3714
0
        while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
3715
0
                rel->r_offset + 4))
3716
0
         != NULL)
3717
0
    {
3718
      /* If the instruction we moved has a relocation attached to
3719
         it, adjust the offset so that it will apply to the correct
3720
         instruction.  */
3721
0
      rel2->r_offset -= 4;
3722
0
    }
3723
0
        continue;
3724
0
      }
3725
3726
0
    h = (struct elf_link_hash_entry *)
3727
0
        bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
3728
0
            false, true);
3729
0
    BFD_ASSERT (h != NULL);
3730
0
    r_type = R_SPARC_WPLT30;
3731
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3732
0
    goto r_sparc_wplt30;
3733
3734
0
  case R_SPARC_TLS_GD_ADD:
3735
0
    if (h != NULL)
3736
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3737
0
    else if (local_got_offsets)
3738
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3739
0
    else
3740
0
      tls_type = GOT_UNKNOWN;
3741
    /* GD -> IE or LE */
3742
0
    if (bfd_link_executable (info) || tls_type == GOT_TLS_IE)
3743
0
      {
3744
        /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3745
     changed into IE:
3746
     {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3747
     or LE:
3748
     add %g7, %reg2, %reg3.  */
3749
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3750
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3751
0
    relocation = (insn & ~0x7c000) | 0x1c000;
3752
0
        else
3753
0
    relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3754
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3755
0
      }
3756
0
    continue;
3757
3758
0
  case R_SPARC_TLS_LDM_ADD:
3759
    /* LD -> LE */
3760
0
    if (bfd_link_executable (info))
3761
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3762
0
    continue;
3763
3764
0
  case R_SPARC_TLS_LDO_ADD:
3765
    /* LD -> LE */
3766
0
    if (bfd_link_executable (info))
3767
0
      {
3768
        /* Change rs1 into %g7.  */
3769
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3770
0
        insn = (insn & ~0x7c000) | 0x1c000;
3771
0
        bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3772
0
      }
3773
0
    continue;
3774
3775
0
  case R_SPARC_TLS_IE_LD:
3776
0
  case R_SPARC_TLS_IE_LDX:
3777
    /* IE -> LE */
3778
0
    if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3779
0
      {
3780
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3781
0
        int rs2 = insn & 0x1f;
3782
0
        int rd = (insn >> 25) & 0x1f;
3783
3784
0
        if (rs2 == rd)
3785
0
    relocation = SPARC_NOP;
3786
0
        else
3787
0
    relocation = 0x80100000 | (insn & 0x3e00001f);
3788
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3789
0
      }
3790
0
    continue;
3791
3792
0
  case R_SPARC_TLS_IE_ADD:
3793
    /* Totally useless relocation.  */
3794
0
    continue;
3795
3796
0
  case R_SPARC_TLS_DTPOFF32:
3797
0
  case R_SPARC_TLS_DTPOFF64:
3798
0
    relocation -= dtpoff_base (info);
3799
0
    break;
3800
3801
0
  default:
3802
0
    break;
3803
0
  }
3804
3805
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3806
   because such sections are not SEC_ALLOC and thus ld.so will
3807
   not process them.  */
3808
0
      if (unresolved_reloc
3809
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
3810
0
         && h->def_dynamic)
3811
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
3812
0
              rel->r_offset) != (bfd_vma) -1)
3813
0
  _bfd_error_handler
3814
    /* xgettext:c-format */
3815
0
    (_("%pB(%pA+%#" PRIx64 "): "
3816
0
       "unresolvable %s relocation against symbol `%s'"),
3817
0
     input_bfd,
3818
0
     input_section,
3819
0
     (uint64_t) rel->r_offset,
3820
0
     howto->name,
3821
0
     h->root.root.string);
3822
3823
0
      r = bfd_reloc_continue;
3824
0
      if (r_type == R_SPARC_OLO10)
3825
0
  {
3826
0
      bfd_vma x;
3827
3828
0
      if (! ABI_64_P (output_bfd))
3829
0
        abort ();
3830
3831
0
      relocation += rel->r_addend;
3832
0
      relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3833
3834
0
      x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3835
0
      x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3836
0
      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3837
3838
0
      r = bfd_check_overflow (howto->complain_on_overflow,
3839
0
            howto->bitsize, howto->rightshift,
3840
0
            bfd_arch_bits_per_address (input_bfd),
3841
0
            relocation);
3842
0
  }
3843
0
      else if (r_type == R_SPARC_WDISP16)
3844
0
  {
3845
0
    bfd_vma x;
3846
3847
0
    relocation += rel->r_addend;
3848
0
    relocation -= (input_section->output_section->vma
3849
0
       + input_section->output_offset);
3850
0
    relocation -= rel->r_offset;
3851
3852
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3853
0
    x |= ((((relocation >> 2) & 0xc000) << 6)
3854
0
    | ((relocation >> 2) & 0x3fff));
3855
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3856
3857
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3858
0
          howto->bitsize, howto->rightshift,
3859
0
          bfd_arch_bits_per_address (input_bfd),
3860
0
          relocation);
3861
0
  }
3862
0
      else if (r_type == R_SPARC_WDISP10)
3863
0
  {
3864
0
    bfd_vma x;
3865
3866
0
    relocation += rel->r_addend;
3867
0
    relocation -= (input_section->output_section->vma
3868
0
       + input_section->output_offset);
3869
0
    relocation -= rel->r_offset;
3870
3871
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3872
0
    x |= ((((relocation >> 2) & 0x300) << 11)
3873
0
    | (((relocation >> 2) & 0xff) << 5));
3874
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3875
3876
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3877
0
          howto->bitsize, howto->rightshift,
3878
0
          bfd_arch_bits_per_address (input_bfd),
3879
0
          relocation);
3880
0
  }
3881
0
      else if (r_type == R_SPARC_REV32)
3882
0
  {
3883
0
    bfd_vma x;
3884
3885
0
    relocation = relocation + rel->r_addend;
3886
3887
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3888
0
    x = x + relocation;
3889
0
    bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3890
0
    r = bfd_reloc_ok;
3891
0
  }
3892
0
      else if (r_type == R_SPARC_TLS_LDO_HIX22
3893
0
         || r_type == R_SPARC_TLS_LE_HIX22)
3894
0
  {
3895
0
    bfd_vma x;
3896
3897
0
    relocation += rel->r_addend;
3898
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3899
0
      relocation ^= MINUS_ONE;
3900
3901
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3902
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3903
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3904
0
    r = bfd_reloc_ok;
3905
0
  }
3906
0
      else if (r_type == R_SPARC_TLS_LDO_LOX10
3907
0
         || r_type == R_SPARC_TLS_LE_LOX10)
3908
0
  {
3909
0
    bfd_vma x;
3910
3911
0
    relocation += rel->r_addend;
3912
0
    relocation &= 0x3ff;
3913
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3914
0
      relocation |= 0x1c00;
3915
3916
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3917
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3918
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3919
3920
0
    r = bfd_reloc_ok;
3921
0
  }
3922
0
      else if (r_type == R_SPARC_HIX22
3923
0
         || r_type == R_SPARC_GOTDATA_HIX22
3924
0
         || r_type == R_SPARC_GOTDATA_OP_HIX22)
3925
0
  {
3926
0
    bfd_vma x;
3927
3928
0
    relocation += rel->r_addend;
3929
0
    if (r_type == R_SPARC_HIX22
3930
0
        || (bfd_signed_vma) relocation < 0)
3931
0
      relocation = relocation ^ MINUS_ONE;
3932
3933
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3934
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3935
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3936
3937
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3938
0
          howto->bitsize, howto->rightshift,
3939
0
          bfd_arch_bits_per_address (input_bfd),
3940
0
          relocation);
3941
0
  }
3942
0
      else if (r_type == R_SPARC_LOX10
3943
0
         || r_type == R_SPARC_GOTDATA_LOX10
3944
0
         || r_type == R_SPARC_GOTDATA_OP_LOX10)
3945
0
  {
3946
0
    bfd_vma x;
3947
3948
0
    relocation += rel->r_addend;
3949
0
    if (r_type == R_SPARC_LOX10
3950
0
        || (bfd_signed_vma) relocation < 0)
3951
0
      relocation = (relocation & 0x3ff) | 0x1c00;
3952
0
    else
3953
0
      relocation = (relocation & 0x3ff);
3954
3955
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3956
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3957
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3958
3959
0
    r = bfd_reloc_ok;
3960
0
  }
3961
0
      else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3962
0
         && sec_do_relax (input_section)
3963
0
         && rel->r_offset + 4 < input_section->size)
3964
0
  {
3965
0
#define G0    0
3966
0
#define O7    15
3967
0
#define XCC   (2 << 20)
3968
0
#define COND(x)   (((x)&0xf)<<25)
3969
0
#define CONDA   COND(0x8)
3970
0
#define INSN_BPA  (F2(0,1) | CONDA | BPRED | XCC)
3971
0
#define INSN_BA   (F2(0,2) | CONDA)
3972
0
#define INSN_OR   F3(2, 0x2, 0)
3973
0
#define INSN_NOP  F2(0,4)
3974
3975
0
    bfd_vma x, y;
3976
3977
    /* If the instruction is a call with either:
3978
       restore
3979
       arithmetic instruction with rd == %o7
3980
       where rs1 != %o7 and rs2 if it is register != %o7
3981
       then we can optimize if the call destination is near
3982
       by changing the call into a branch always.  */
3983
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3984
0
    y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3985
0
    if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3986
0
      {
3987
        if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3988
0
       || ((y & OP3(0x28)) == 0 /* arithmetic */
3989
0
           && (y & RD(~0)) == RD(O7)))
3990
0
      && (y & RS1(~0)) != RS1(O7)
3991
0
      && ((y & F3I(~0))
3992
0
          || (y & RS2(~0)) != RS2(O7)))
3993
0
    {
3994
0
      bfd_vma reloc;
3995
3996
0
      reloc = relocation + rel->r_addend - rel->r_offset;
3997
0
      reloc -= (input_section->output_section->vma
3998
0
          + input_section->output_offset);
3999
4000
      /* Ensure the branch fits into simm22.  */
4001
0
      if ((reloc & 3) == 0
4002
0
          && ((reloc & ~(bfd_vma)0x7fffff) == 0
4003
0
        || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
4004
0
        {
4005
0
          reloc >>= 2;
4006
4007
          /* Check whether it fits into simm19.  */
4008
0
          if (((reloc & 0x3c0000) == 0
4009
0
         || (reloc & 0x3c0000) == 0x3c0000)
4010
0
        && (ABI_64_P (output_bfd)
4011
0
            || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
4012
0
      x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
4013
0
          else
4014
0
      x = INSN_BA | (reloc & 0x3fffff); /* ba */
4015
0
          bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4016
0
          r = bfd_reloc_ok;
4017
0
          if (rel->r_offset >= 4
4018
0
        && (y & (0xffffffff ^ RS1(~0)))
4019
0
           == (INSN_OR | RD(O7) | RS2(G0)))
4020
0
      {
4021
0
        bfd_vma z;
4022
0
        unsigned int reg;
4023
4024
0
        z = bfd_get_32 (input_bfd,
4025
0
            contents + rel->r_offset - 4);
4026
0
        if ((z & (0xffffffff ^ RD(~0)))
4027
0
            != (INSN_OR | RS1(O7) | RS2(G0)))
4028
0
          continue;
4029
4030
        /* The sequence was
4031
           or %o7, %g0, %rN
4032
           call foo
4033
           or %rN, %g0, %o7
4034
4035
           If call foo was replaced with ba, replace
4036
           or %rN, %g0, %o7 with nop.  */
4037
4038
0
        reg = (y & RS1(~0)) >> 14;
4039
0
        if (reg != ((z & RD(~0)) >> 25)
4040
0
            || reg == G0 || reg == O7)
4041
0
          continue;
4042
4043
0
        bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4044
0
              contents + rel->r_offset + 4);
4045
0
      }
4046
4047
0
        }
4048
0
    }
4049
0
      }
4050
0
  }
4051
4052
0
      if (r == bfd_reloc_continue)
4053
0
  {
4054
0
  do_relocation:
4055
0
    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4056
0
          contents, rel->r_offset,
4057
0
          relocation, rel->r_addend);
4058
0
  }
4059
0
      if (r != bfd_reloc_ok)
4060
0
  {
4061
0
    switch (r)
4062
0
      {
4063
0
      default:
4064
0
      case bfd_reloc_outofrange:
4065
0
        abort ();
4066
0
      case bfd_reloc_overflow:
4067
0
        {
4068
0
    const char *name;
4069
4070
    /* The Solaris native linker silently disregards overflows.
4071
       We don't, but this breaks stabs debugging info, whose
4072
       relocations are only 32-bits wide.  Ignore overflows in
4073
       this case and also for discarded entries.  */
4074
0
    if ((r_type == R_SPARC_32
4075
0
         || r_type == R_SPARC_UA32
4076
0
         || r_type == R_SPARC_DISP32)
4077
0
        && (((input_section->flags & SEC_DEBUGGING) != 0
4078
0
       && strcmp (bfd_section_name (input_section),
4079
0
            ".stab") == 0)
4080
0
      || _bfd_elf_section_offset (output_bfd, info,
4081
0
                input_section,
4082
0
                rel->r_offset)
4083
0
           == (bfd_vma)-1))
4084
0
      break;
4085
4086
0
    if (h != NULL)
4087
0
      {
4088
        /* Assume this is a call protected by other code that
4089
           detect the symbol is undefined.  If this is the case,
4090
           we can safely ignore the overflow.  If not, the
4091
           program is hosed anyway, and a little warning isn't
4092
           going to help.  */
4093
0
        if (h->root.type == bfd_link_hash_undefweak
4094
0
      && howto->pc_relative)
4095
0
          break;
4096
4097
0
        name = NULL;
4098
0
      }
4099
0
    else
4100
0
      {
4101
0
        name = bfd_elf_string_from_elf_section (input_bfd,
4102
0
                  symtab_hdr->sh_link,
4103
0
                  sym->st_name);
4104
0
        if (name == NULL)
4105
0
          return false;
4106
0
        if (*name == '\0')
4107
0
          name = bfd_section_name (sec);
4108
0
      }
4109
0
    (*info->callbacks->reloc_overflow)
4110
0
      (info, (h ? &h->root : NULL), name, howto->name,
4111
0
       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4112
0
        }
4113
0
        break;
4114
0
      }
4115
0
  }
4116
0
    }
4117
4118
0
  return true;
4119
0
}
4120
4121
/* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
4122
   and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
4123
   is the offset of the associated .got.plt entry from
4124
   _GLOBAL_OFFSET_TABLE_.  */
4125
4126
static void
4127
sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4128
             bfd_vma plt_offset, bfd_vma plt_index,
4129
             bfd_vma got_offset)
4130
0
{
4131
0
  bfd_vma got_base;
4132
0
  const bfd_vma *plt_entry;
4133
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4134
0
  bfd_byte *loc;
4135
0
  Elf_Internal_Rela rela;
4136
4137
0
  htab = _bfd_sparc_elf_hash_table (info);
4138
0
  BFD_ASSERT (htab != NULL);
4139
4140
0
  if (bfd_link_pic (info))
4141
0
    {
4142
0
      plt_entry = sparc_vxworks_shared_plt_entry;
4143
0
      got_base = 0;
4144
0
    }
4145
0
  else
4146
0
    {
4147
0
      plt_entry = sparc_vxworks_exec_plt_entry;
4148
0
      got_base = (htab->elf.hgot->root.u.def.value
4149
0
      + htab->elf.hgot->root.u.def.section->output_offset
4150
0
      + htab->elf.hgot->root.u.def.section->output_section->vma);
4151
0
    }
4152
4153
  /* Fill in the entry in the procedure linkage table.  */
4154
0
  bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4155
0
        htab->elf.splt->contents + plt_offset);
4156
0
  bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4157
0
        htab->elf.splt->contents + plt_offset + 4);
4158
0
  bfd_put_32 (output_bfd, plt_entry[2],
4159
0
        htab->elf.splt->contents + plt_offset + 8);
4160
0
  bfd_put_32 (output_bfd, plt_entry[3],
4161
0
        htab->elf.splt->contents + plt_offset + 12);
4162
0
  bfd_put_32 (output_bfd, plt_entry[4],
4163
0
        htab->elf.splt->contents + plt_offset + 16);
4164
0
  bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4165
0
        htab->elf.splt->contents + plt_offset + 20);
4166
  /* PC-relative displacement for a branch to the start of
4167
     the PLT section.  */
4168
0
  bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4169
0
            & 0x003fffff),
4170
0
        htab->elf.splt->contents + plt_offset + 24);
4171
0
  bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4172
0
        htab->elf.splt->contents + plt_offset + 28);
4173
4174
  /* Fill in the .got.plt entry, pointing initially at the
4175
     second half of the PLT entry.  */
4176
0
  BFD_ASSERT (htab->elf.sgotplt != NULL);
4177
0
  bfd_put_32 (output_bfd,
4178
0
        htab->elf.splt->output_section->vma
4179
0
        + htab->elf.splt->output_offset
4180
0
        + plt_offset + 20,
4181
0
        htab->elf.sgotplt->contents + got_offset);
4182
4183
  /* Add relocations to .rela.plt.unloaded.  */
4184
0
  if (!bfd_link_pic (info))
4185
0
    {
4186
0
      loc = (htab->srelplt2->contents
4187
0
       + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4188
4189
      /* Relocate the initial sethi.  */
4190
0
      rela.r_offset = (htab->elf.splt->output_section->vma
4191
0
           + htab->elf.splt->output_offset
4192
0
           + plt_offset);
4193
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4194
0
      rela.r_addend = got_offset;
4195
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4196
0
      loc += sizeof (Elf32_External_Rela);
4197
4198
      /* Likewise the following or.  */
4199
0
      rela.r_offset += 4;
4200
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4201
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4202
0
      loc += sizeof (Elf32_External_Rela);
4203
4204
      /* Relocate the .got.plt entry.  */
4205
0
      rela.r_offset = (htab->elf.sgotplt->output_section->vma
4206
0
           + htab->elf.sgotplt->output_offset
4207
0
           + got_offset);
4208
0
      rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4209
0
      rela.r_addend = plt_offset + 20;
4210
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4211
0
    }
4212
0
}
4213
4214
/* Finish up dynamic symbol handling.  We set the contents of various
4215
   dynamic sections here.  */
4216
4217
bool
4218
_bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4219
              struct bfd_link_info *info,
4220
              struct elf_link_hash_entry *h,
4221
              Elf_Internal_Sym *sym)
4222
0
{
4223
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4224
0
  const struct elf_backend_data *bed;
4225
0
  struct _bfd_sparc_elf_link_hash_entry  *eh;
4226
0
  bool resolved_to_zero;
4227
4228
0
  htab = _bfd_sparc_elf_hash_table (info);
4229
0
  BFD_ASSERT (htab != NULL);
4230
0
  bed = get_elf_backend_data (output_bfd);
4231
4232
0
  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
4233
4234
  /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4235
     resolved undefined weak symbols in executable so that their
4236
     references have value 0 at run-time.  */
4237
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4238
4239
0
  if (h->plt.offset != (bfd_vma) -1)
4240
0
    {
4241
0
      asection *splt;
4242
0
      asection *srela;
4243
0
      Elf_Internal_Rela rela;
4244
0
      bfd_byte *loc;
4245
0
      bfd_vma r_offset, got_offset;
4246
0
      int rela_index;
4247
4248
      /* When building a static executable, use .iplt and
4249
   .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4250
0
      if (htab->elf.splt != NULL)
4251
0
  {
4252
0
    splt = htab->elf.splt;
4253
0
    srela = htab->elf.srelplt;
4254
0
  }
4255
0
      else
4256
0
  {
4257
0
    splt = htab->elf.iplt;
4258
0
    srela = htab->elf.irelplt;
4259
0
  }
4260
4261
0
      if (splt == NULL || srela == NULL)
4262
0
  abort ();
4263
4264
      /* Fill in the entry in the .rela.plt section.  */
4265
0
      if (htab->elf.target_os == is_vxworks)
4266
0
  {
4267
    /* Work out the index of this PLT entry.  */
4268
0
    rela_index = ((h->plt.offset - htab->plt_header_size)
4269
0
      / htab->plt_entry_size);
4270
4271
    /* Calculate the offset of the associated .got.plt entry.
4272
       The first three entries are reserved.  */
4273
0
    got_offset = (rela_index + 3) * 4;
4274
4275
0
    sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4276
0
           rela_index, got_offset);
4277
4278
4279
    /* On VxWorks, the relocation points to the .got.plt entry,
4280
       not the .plt entry.  */
4281
0
    rela.r_offset = (htab->elf.sgotplt->output_section->vma
4282
0
         + htab->elf.sgotplt->output_offset
4283
0
         + got_offset);
4284
0
    rela.r_addend = 0;
4285
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4286
0
            R_SPARC_JMP_SLOT);
4287
0
  }
4288
0
      else
4289
0
  {
4290
0
    bool ifunc = false;
4291
4292
    /* Fill in the entry in the procedure linkage table.  */
4293
0
    rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4294
0
              h->plt.offset, splt->size,
4295
0
              &r_offset);
4296
4297
0
    if (h == NULL
4298
0
        || h->dynindx == -1
4299
0
        || ((bfd_link_executable (info)
4300
0
       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4301
0
      && h->def_regular
4302
0
      && h->type == STT_GNU_IFUNC))
4303
0
      {
4304
0
        ifunc = true;
4305
0
        BFD_ASSERT (h == NULL
4306
0
        || (h->type == STT_GNU_IFUNC
4307
0
            && h->def_regular
4308
0
            && (h->root.type == bfd_link_hash_defined
4309
0
          || h->root.type == bfd_link_hash_defweak)));
4310
0
      }
4311
4312
0
    rela.r_offset = r_offset
4313
0
      + (splt->output_section->vma + splt->output_offset);
4314
0
    if (ABI_64_P (output_bfd)
4315
0
        && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4316
0
      {
4317
0
        if (ifunc)
4318
0
    {
4319
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4320
0
           + h->root.u.def.section->output_offset
4321
0
           + h->root.u.def.value);
4322
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4323
0
              R_SPARC_IRELATIVE);
4324
0
    }
4325
0
        else
4326
0
    {
4327
0
      rela.r_addend = (-(h->plt.offset + 4)
4328
0
           - splt->output_section->vma
4329
0
           - splt->output_offset);
4330
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4331
0
              R_SPARC_JMP_SLOT);
4332
0
    }
4333
0
      }
4334
0
    else
4335
0
      {
4336
0
        if (ifunc)
4337
0
    {
4338
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4339
0
           + h->root.u.def.section->output_offset
4340
0
           + h->root.u.def.value);
4341
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4342
0
              R_SPARC_JMP_IREL);
4343
0
    }
4344
0
        else
4345
0
    {
4346
0
      rela.r_addend = 0;
4347
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4348
0
              R_SPARC_JMP_SLOT);
4349
0
    }
4350
0
      }
4351
0
  }
4352
4353
      /* Adjust for the first 4 reserved elements in the .plt section
4354
   when setting the offset in the .rela.plt section.
4355
   Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4356
   thus .plt[4] has corresponding .rela.plt[0] and so on.  */
4357
4358
0
      loc = srela->contents;
4359
0
      loc += rela_index * bed->s->sizeof_rela;
4360
0
      bed->s->swap_reloca_out (output_bfd, &rela, loc);
4361
4362
0
      if (!resolved_to_zero && !h->def_regular)
4363
0
  {
4364
    /* Mark the symbol as undefined, rather than as defined in
4365
       the .plt section.  Leave the value alone.  */
4366
0
    sym->st_shndx = SHN_UNDEF;
4367
    /* If the symbol is weak, we do need to clear the value.
4368
       Otherwise, the PLT entry would provide a definition for
4369
       the symbol even if the symbol wasn't defined anywhere,
4370
       and so the symbol would never be NULL.  */
4371
0
    if (!h->ref_regular_nonweak)
4372
0
      sym->st_value = 0;
4373
0
  }
4374
0
    }
4375
4376
  /* Don't generate dynamic GOT relocation against resolved undefined weak
4377
     symbols in an executable.  */
4378
0
  if (h->got.offset != (bfd_vma) -1
4379
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4380
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
4381
0
      && !(h->root.type == bfd_link_hash_undefweak
4382
0
     && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4383
0
         || resolved_to_zero)))
4384
0
    {
4385
0
      asection *sgot;
4386
0
      asection *srela;
4387
0
      Elf_Internal_Rela rela;
4388
4389
      /* This symbol has an entry in the GOT.  Set it up.  */
4390
4391
0
      sgot = htab->elf.sgot;
4392
0
      srela = htab->elf.srelgot;
4393
0
      BFD_ASSERT (sgot != NULL && srela != NULL);
4394
4395
0
      rela.r_offset = (sgot->output_section->vma
4396
0
           + sgot->output_offset
4397
0
           + (h->got.offset &~ (bfd_vma) 1));
4398
4399
      /* If this is a -Bsymbolic link, and the symbol is defined
4400
   locally, we just want to emit a RELATIVE reloc.  Likewise if
4401
   the symbol was forced to be local because of a version file.
4402
   The entry in the global offset table will already have been
4403
   initialized in the relocate_section function.  */
4404
0
      if (! bfd_link_pic (info)
4405
0
    && h->type == STT_GNU_IFUNC
4406
0
    && h->def_regular)
4407
0
  {
4408
0
    asection *plt;
4409
4410
    /* We load the GOT entry with the PLT entry.  */
4411
0
    plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4412
0
    SPARC_ELF_PUT_WORD (htab, output_bfd,
4413
0
            (plt->output_section->vma
4414
0
             + plt->output_offset + h->plt.offset),
4415
0
            htab->elf.sgot->contents
4416
0
            + (h->got.offset & ~(bfd_vma) 1));
4417
0
    return true;
4418
0
  }
4419
4420
0
      if (bfd_link_pic (info)
4421
0
    && (h->root.type == bfd_link_hash_defined
4422
0
        || h->root.type == bfd_link_hash_defweak)
4423
0
    && SYMBOL_REFERENCES_LOCAL (info, h))
4424
0
  {
4425
0
    asection *sec = h->root.u.def.section;
4426
0
    if (h->type == STT_GNU_IFUNC)
4427
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4428
0
    else
4429
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4430
0
    rela.r_addend = (h->root.u.def.value
4431
0
         + sec->output_section->vma
4432
0
         + sec->output_offset);
4433
0
  }
4434
0
      else
4435
0
  {
4436
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4437
0
    rela.r_addend = 0;
4438
0
  }
4439
4440
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4441
0
        sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4442
0
      sparc_elf_append_rela (output_bfd, srela, &rela);
4443
0
    }
4444
4445
0
  if (h->needs_copy)
4446
0
    {
4447
0
      asection *s;
4448
0
      Elf_Internal_Rela rela;
4449
4450
      /* This symbols needs a copy reloc.  Set it up.  */
4451
0
      BFD_ASSERT (h->dynindx != -1);
4452
4453
0
      rela.r_offset = (h->root.u.def.value
4454
0
           + h->root.u.def.section->output_section->vma
4455
0
           + h->root.u.def.section->output_offset);
4456
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4457
0
      rela.r_addend = 0;
4458
0
      if (h->root.u.def.section == htab->elf.sdynrelro)
4459
0
  s = htab->elf.sreldynrelro;
4460
0
      else
4461
0
  s = htab->elf.srelbss;
4462
0
      sparc_elf_append_rela (output_bfd, s, &rela);
4463
0
    }
4464
4465
  /* Mark some specially defined symbols as absolute.  On VxWorks,
4466
     _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4467
     ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
4468
0
  if (sym != NULL
4469
0
      && (h == htab->elf.hdynamic
4470
0
    || (htab->elf.target_os != is_vxworks
4471
0
        && (h == htab->elf.hgot || h == htab->elf.hplt))))
4472
0
    sym->st_shndx = SHN_ABS;
4473
4474
0
  return true;
4475
0
}
4476
4477
/* Finish up the dynamic sections.  */
4478
4479
static bool
4480
sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4481
      bfd *dynobj, asection *sdyn,
4482
      asection *splt ATTRIBUTE_UNUSED)
4483
0
{
4484
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4485
0
  const struct elf_backend_data *bed;
4486
0
  bfd_byte *dyncon, *dynconend;
4487
0
  size_t dynsize;
4488
0
  int stt_regidx = -1;
4489
0
  bool abi_64_p;
4490
4491
0
  htab = _bfd_sparc_elf_hash_table (info);
4492
0
  BFD_ASSERT (htab != NULL);
4493
0
  bed = get_elf_backend_data (output_bfd);
4494
0
  dynsize = bed->s->sizeof_dyn;
4495
0
  dynconend = sdyn->contents + sdyn->size;
4496
0
  abi_64_p = ABI_64_P (output_bfd);
4497
0
  for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4498
0
    {
4499
0
      Elf_Internal_Dyn dyn;
4500
0
      bool size;
4501
4502
0
      bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4503
4504
0
      if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
4505
0
  {
4506
    /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4507
       not to the start of the PLT.  */
4508
0
    if (htab->elf.sgotplt)
4509
0
      {
4510
0
        dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4511
0
        + htab->elf.sgotplt->output_offset);
4512
0
        bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4513
0
      }
4514
0
  }
4515
0
      else if (htab->elf.target_os == is_vxworks
4516
0
         && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4517
0
  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4518
0
      else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4519
0
  {
4520
0
    if (stt_regidx == -1)
4521
0
      {
4522
0
        stt_regidx =
4523
0
    _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4524
0
        if (stt_regidx == -1)
4525
0
    return false;
4526
0
      }
4527
0
    dyn.d_un.d_val = stt_regidx++;
4528
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4529
0
  }
4530
0
      else
4531
0
  {
4532
0
    asection *s;
4533
4534
0
    switch (dyn.d_tag)
4535
0
      {
4536
0
      case DT_PLTGOT:
4537
0
        s = htab->elf.splt;
4538
0
        size = false;
4539
0
        break;
4540
0
      case DT_PLTRELSZ:
4541
0
        s = htab->elf.srelplt;
4542
0
        size = true;
4543
0
        break;
4544
0
      case DT_JMPREL:
4545
0
        s = htab->elf.srelplt;
4546
0
        size = false;
4547
0
        break;
4548
0
      default:
4549
0
        continue;
4550
0
      }
4551
4552
0
    if (s == NULL)
4553
0
      dyn.d_un.d_val = 0;
4554
0
    else
4555
0
      {
4556
0
        if (!size)
4557
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4558
0
        else
4559
0
    dyn.d_un.d_val = s->size;
4560
0
      }
4561
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4562
0
  }
4563
0
    }
4564
0
  return true;
4565
0
}
4566
4567
/* Install the first PLT entry in a VxWorks executable and make sure that
4568
   .rela.plt.unloaded relocations have the correct symbol indexes.  */
4569
4570
static void
4571
sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4572
0
{
4573
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4574
0
  Elf_Internal_Rela rela;
4575
0
  bfd_vma got_base;
4576
0
  bfd_byte *loc;
4577
4578
0
  htab = _bfd_sparc_elf_hash_table (info);
4579
0
  BFD_ASSERT (htab != NULL);
4580
4581
  /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
4582
0
  got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4583
0
        + htab->elf.hgot->root.u.def.section->output_offset
4584
0
        + htab->elf.hgot->root.u.def.value);
4585
4586
  /* Install the initial PLT entry.  */
4587
0
  bfd_put_32 (output_bfd,
4588
0
        sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4589
0
        htab->elf.splt->contents);
4590
0
  bfd_put_32 (output_bfd,
4591
0
        sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4592
0
        htab->elf.splt->contents + 4);
4593
0
  bfd_put_32 (output_bfd,
4594
0
        sparc_vxworks_exec_plt0_entry[2],
4595
0
        htab->elf.splt->contents + 8);
4596
0
  bfd_put_32 (output_bfd,
4597
0
        sparc_vxworks_exec_plt0_entry[3],
4598
0
        htab->elf.splt->contents + 12);
4599
0
  bfd_put_32 (output_bfd,
4600
0
        sparc_vxworks_exec_plt0_entry[4],
4601
0
        htab->elf.splt->contents + 16);
4602
4603
0
  loc = htab->srelplt2->contents;
4604
4605
  /* Add an unloaded relocation for the initial entry's "sethi".  */
4606
0
  rela.r_offset = (htab->elf.splt->output_section->vma
4607
0
       + htab->elf.splt->output_offset);
4608
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4609
0
  rela.r_addend = 8;
4610
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4611
0
  loc += sizeof (Elf32_External_Rela);
4612
4613
  /* Likewise the following "or".  */
4614
0
  rela.r_offset += 4;
4615
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4616
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4617
0
  loc += sizeof (Elf32_External_Rela);
4618
4619
  /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
4620
     the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4621
     in which symbols were output.  */
4622
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4623
0
    {
4624
0
      Elf_Internal_Rela rel;
4625
4626
      /* The entry's initial "sethi" (against _G_O_T_).  */
4627
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4628
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4629
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4630
0
      loc += sizeof (Elf32_External_Rela);
4631
4632
      /* The following "or" (also against _G_O_T_).  */
4633
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4634
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4635
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4636
0
      loc += sizeof (Elf32_External_Rela);
4637
4638
      /* The .got.plt entry (against _P_L_T_).  */
4639
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4640
0
      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4641
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4642
0
      loc += sizeof (Elf32_External_Rela);
4643
0
    }
4644
0
}
4645
4646
/* Install the first PLT entry in a VxWorks shared object.  */
4647
4648
static void
4649
sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4650
0
{
4651
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4652
0
  unsigned int i;
4653
4654
0
  htab = _bfd_sparc_elf_hash_table (info);
4655
0
  BFD_ASSERT (htab != NULL);
4656
4657
0
  for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4658
0
    bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4659
0
    htab->elf.splt->contents + i * 4);
4660
0
}
4661
4662
/* Finish up local dynamic symbol handling.  We set the contents of
4663
   various dynamic sections here.  */
4664
4665
static int
4666
finish_local_dynamic_symbol (void **slot, void *inf)
4667
0
{
4668
0
  struct elf_link_hash_entry *h
4669
0
    = (struct elf_link_hash_entry *) *slot;
4670
0
  struct bfd_link_info *info
4671
0
    = (struct bfd_link_info *) inf;
4672
4673
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4674
0
                 h, NULL);
4675
0
}
4676
4677
/* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4678
   here since undefined weak symbol may not be dynamic and may not be
4679
   called for _bfd_sparc_elf_finish_dynamic_symbol.  */
4680
4681
static bool
4682
pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4683
           void *inf)
4684
0
{
4685
0
  struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4686
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
4687
4688
0
  if (h->root.type != bfd_link_hash_undefweak
4689
0
      || h->dynindx != -1)
4690
0
    return true;
4691
4692
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4693
0
                 h, NULL);
4694
0
}
4695
4696
bool
4697
_bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4698
0
{
4699
0
  bfd *dynobj;
4700
0
  asection *sdyn;
4701
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4702
4703
0
  htab = _bfd_sparc_elf_hash_table (info);
4704
0
  BFD_ASSERT (htab != NULL);
4705
0
  dynobj = htab->elf.dynobj;
4706
4707
  /* We arranged in size_dynamic_sections to put the STT_REGISTER
4708
     entries at the end of the dynlocal list, so they came at the end
4709
     of the local symbols in the symtab.  Except that they aren't
4710
     STB_LOCAL, so we need to back up symtab->sh_info.  */
4711
0
  if (ABI_64_P (output_bfd)
4712
0
      && elf_hash_table (info)->dynlocal)
4713
0
    {
4714
0
      asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
4715
0
      struct elf_link_local_dynamic_entry *e;
4716
4717
0
      for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
4718
0
  if (e->input_indx == -1)
4719
0
    break;
4720
0
      if (e)
4721
0
  elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
4722
0
    = e->dynindx;
4723
0
    }
4724
4725
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4726
4727
0
  if (elf_hash_table (info)->dynamic_sections_created)
4728
0
    {
4729
0
      asection *splt;
4730
4731
0
      splt = htab->elf.splt;
4732
0
      BFD_ASSERT (splt != NULL && sdyn != NULL);
4733
4734
0
      if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4735
0
  return false;
4736
4737
      /* Initialize the contents of the .plt section.  */
4738
0
      if (splt->size > 0)
4739
0
  {
4740
0
    if (htab->elf.target_os == is_vxworks)
4741
0
      {
4742
0
        if (bfd_link_pic (info))
4743
0
    sparc_vxworks_finish_shared_plt (output_bfd, info);
4744
0
        else
4745
0
    sparc_vxworks_finish_exec_plt (output_bfd, info);
4746
0
      }
4747
0
    else
4748
0
      {
4749
0
        memset (splt->contents, 0, htab->plt_header_size);
4750
0
        if (!ABI_64_P (output_bfd))
4751
0
    bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4752
0
          splt->contents + splt->size - 4);
4753
0
      }
4754
0
  }
4755
4756
0
      if (elf_section_data (splt->output_section) != NULL)
4757
0
  elf_section_data (splt->output_section)->this_hdr.sh_entsize
4758
0
    = ((htab->elf.target_os == is_vxworks
4759
0
        || !ABI_64_P (output_bfd))
4760
0
       ? 0 : htab->plt_entry_size);
4761
0
    }
4762
4763
  /* Set the first entry in the global offset table to the address of
4764
     the dynamic section.  */
4765
0
  if (htab->elf.sgot && htab->elf.sgot->size > 0)
4766
0
    {
4767
0
      bfd_vma val = (sdyn ?
4768
0
         sdyn->output_section->vma + sdyn->output_offset :
4769
0
         0);
4770
4771
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
4772
0
    }
4773
4774
0
  if (htab->elf.sgot)
4775
0
    elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4776
0
      SPARC_ELF_WORD_BYTES (htab);
4777
4778
  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4779
0
  htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
4780
4781
  /* Fill PLT entries for undefined weak symbols in PIE.  */
4782
0
  if (bfd_link_pie (info))
4783
0
    bfd_hash_traverse (&info->hash->table,
4784
0
           pie_finish_undefweak_symbol,
4785
0
           info);
4786
0
  return true;
4787
0
}
4788
4789

4790
/* Set the right machine number for a SPARC ELF file.  */
4791
4792
bool
4793
_bfd_sparc_elf_object_p (bfd *abfd)
4794
16.6k
{
4795
16.6k
  obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
4796
16.6k
  obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
4797
16.6k
  obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
4798
4799
16.6k
  unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
4800
16.6k
  unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
4801
16.6k
          | ELF_SPARC_HWCAP_VIS3
4802
16.6k
          | ELF_SPARC_HWCAP_HPC);
4803
16.6k
  unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
4804
16.6k
          | ELF_SPARC_HWCAP_DES
4805
16.6k
          | ELF_SPARC_HWCAP_KASUMI
4806
16.6k
          | ELF_SPARC_HWCAP_CAMELLIA
4807
16.6k
          | ELF_SPARC_HWCAP_MD5
4808
16.6k
          | ELF_SPARC_HWCAP_SHA1
4809
16.6k
          | ELF_SPARC_HWCAP_SHA256
4810
16.6k
          | ELF_SPARC_HWCAP_SHA512
4811
16.6k
          | ELF_SPARC_HWCAP_MPMUL
4812
16.6k
          | ELF_SPARC_HWCAP_MONT
4813
16.6k
          | ELF_SPARC_HWCAP_CRC32C
4814
16.6k
          | ELF_SPARC_HWCAP_CBCOND
4815
16.6k
          | ELF_SPARC_HWCAP_PAUSE);
4816
16.6k
  unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
4817
16.6k
         | ELF_SPARC_HWCAP_IMA);
4818
16.6k
  unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
4819
16.6k
           | ELF_SPARC_HWCAP2_MWAIT
4820
16.6k
           | ELF_SPARC_HWCAP2_XMPMUL
4821
16.6k
           | ELF_SPARC_HWCAP2_XMONT);
4822
16.6k
  unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6
4823
16.6k
          | ELF_SPARC_HWCAP2_ONADDSUB
4824
16.6k
          | ELF_SPARC_HWCAP2_ONMUL
4825
16.6k
          | ELF_SPARC_HWCAP2_ONDIV
4826
16.6k
          | ELF_SPARC_HWCAP2_DICTUNP
4827
16.6k
          | ELF_SPARC_HWCAP2_FPCMPSHL
4828
16.6k
          | ELF_SPARC_HWCAP2_RLE
4829
16.6k
          | ELF_SPARC_HWCAP2_SHA3);
4830
4831
16.6k
  if (ABI_64_P (abfd))
4832
7.66k
    {
4833
7.66k
      unsigned long mach = bfd_mach_sparc_v9;
4834
4835
7.66k
      if (hwcaps2->i & m8_hwcaps2_mask)
4836
0
  mach = bfd_mach_sparc_v9m8;
4837
7.66k
      else if (hwcaps2->i & v9m_hwcaps2_mask)
4838
0
  mach = bfd_mach_sparc_v9m;
4839
7.66k
      else if (hwcaps->i & v9v_hwcaps_mask)
4840
0
  mach = bfd_mach_sparc_v9v;
4841
7.66k
      else if (hwcaps->i & v9e_hwcaps_mask)
4842
0
  mach = bfd_mach_sparc_v9e;
4843
7.66k
      else if (hwcaps->i & v9d_hwcaps_mask)
4844
0
  mach = bfd_mach_sparc_v9d;
4845
7.66k
      else if (hwcaps->i & v9c_hwcaps_mask)
4846
0
  mach = bfd_mach_sparc_v9c;
4847
7.66k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4848
2.59k
  mach = bfd_mach_sparc_v9b;
4849
5.06k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4850
1.24k
  mach = bfd_mach_sparc_v9a;
4851
7.66k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
4852
7.66k
    }
4853
8.95k
  else
4854
8.95k
    {
4855
8.95k
      if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
4856
7.71k
  {
4857
7.71k
    if (hwcaps2->i & m8_hwcaps2_mask)
4858
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4859
0
                bfd_mach_sparc_v8plusm8);
4860
7.71k
    else if (hwcaps2->i & v9m_hwcaps2_mask)
4861
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4862
0
                bfd_mach_sparc_v8plusm);
4863
7.71k
    else if (hwcaps->i & v9v_hwcaps_mask)
4864
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4865
0
                bfd_mach_sparc_v8plusv);
4866
7.71k
    else if (hwcaps->i & v9e_hwcaps_mask)
4867
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4868
0
                bfd_mach_sparc_v8pluse);
4869
7.71k
    else if (hwcaps->i & v9d_hwcaps_mask)
4870
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4871
0
                bfd_mach_sparc_v8plusd);
4872
7.71k
    else if (hwcaps->i & v9c_hwcaps_mask)
4873
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4874
0
                bfd_mach_sparc_v8plusc);
4875
7.71k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4876
3.38k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4877
3.38k
                bfd_mach_sparc_v8plusb);
4878
4.33k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4879
1.88k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4880
1.88k
                bfd_mach_sparc_v8plusa);
4881
2.44k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
4882
1.01k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4883
1.01k
                bfd_mach_sparc_v8plus);
4884
1.43k
    else
4885
1.43k
      return false;
4886
7.71k
  }
4887
1.23k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
4888
27
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4889
27
            bfd_mach_sparc_sparclite_le);
4890
1.21k
      else
4891
1.21k
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
4892
8.95k
    }
4893
16.6k
}
4894
4895
/* Return address for Ith PLT stub in section PLT, for relocation REL
4896
   or (bfd_vma) -1 if it should not be included.  */
4897
4898
bfd_vma
4899
_bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
4900
2.36k
{
4901
2.36k
  if (ABI_64_P (plt->owner))
4902
0
    {
4903
0
      bfd_vma j;
4904
4905
0
      i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
4906
0
      if (i < PLT64_LARGE_THRESHOLD)
4907
0
  return plt->vma + i * PLT64_ENTRY_SIZE;
4908
4909
0
      j = (i - PLT64_LARGE_THRESHOLD) % 160;
4910
0
      i -= j;
4911
0
      return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
4912
0
    }
4913
2.36k
  else
4914
2.36k
    return rel->address;
4915
2.36k
}
4916
4917
/* Merge backend specific data from an object file to the output
4918
   object file when linking.  */
4919
4920
bool
4921
_bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4922
0
{
4923
0
  bfd *obfd = info->output_bfd;
4924
0
  obj_attribute *in_attr, *in_attrs;
4925
0
  obj_attribute *out_attr, *out_attrs;
4926
4927
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
4928
0
    {
4929
      /* This is the first object.  Copy the attributes.  */
4930
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
4931
4932
      /* Use the Tag_null value to indicate the attributes have been
4933
   initialized.  */
4934
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
4935
4936
0
      return true;
4937
0
    }
4938
4939
0
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4940
0
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4941
4942
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
4943
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
4944
4945
0
  out_attr->i |= in_attr->i;
4946
0
  out_attr->type = 1;
4947
4948
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
4949
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
4950
4951
0
  out_attr->i |= in_attr->i;
4952
0
  out_attr->type = 1;
4953
4954
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
4955
0
  _bfd_elf_merge_object_attributes (ibfd, info);
4956
4957
0
  return true;
4958
0
}