Coverage Report

Created: 2025-06-24 06:45

/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-2025 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
34.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
903
{
619
903
  switch (r_type)
620
903
    {
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
903
    default:
637
903
      if (r_type >= (unsigned int) R_SPARC_max_std)
638
1
  {
639
1
    _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
640
1
            abfd, r_type);
641
1
    bfd_set_error (bfd_error_bad_value);
642
1
    return NULL;
643
1
  }
644
902
      return &_bfd_sparc_elf_howto_table[r_type];
645
903
    }
646
903
}
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
903
  ((r_info) & 0xff)
652
653
bool
654
_bfd_sparc_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
655
            Elf_Internal_Rela *dst)
656
903
{
657
903
  unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
658
659
903
  if ((cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type)) == NULL)
660
1
    {
661
1
      bfd_set_error (bfd_error_bad_value);
662
1
      return false;
663
1
    }
664
902
  return true;
665
903
}
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
215k
{
737
215k
  return bfd_elf_allocate_object (abfd,
738
215k
          sizeof (struct _bfd_sparc_elf_obj_tdata));
739
215k
}
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
    {
1183
0
      free (ret);
1184
0
      return NULL;
1185
0
    }
1186
1187
0
  ret->loc_hash_table = htab_try_create (1024,
1188
0
           elf_sparc_local_htab_hash,
1189
0
           elf_sparc_local_htab_eq,
1190
0
           NULL);
1191
0
  ret->loc_hash_memory = objalloc_create ();
1192
0
  if (!ret->loc_hash_table || !ret->loc_hash_memory)
1193
0
    {
1194
0
      _bfd_sparc_elf_link_hash_table_free (abfd);
1195
0
      return NULL;
1196
0
    }
1197
0
  ret->elf.root.hash_table_free = _bfd_sparc_elf_link_hash_table_free;
1198
1199
0
  return &ret->elf.root;
1200
0
}
1201
1202
/* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
1203
   .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1204
   hash table.  */
1205
1206
bool
1207
_bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
1208
          struct bfd_link_info *info)
1209
0
{
1210
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1211
1212
0
  htab = _bfd_sparc_elf_hash_table (info);
1213
0
  BFD_ASSERT (htab != NULL);
1214
1215
0
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1216
0
    return false;
1217
1218
0
  if (htab->elf.target_os == is_vxworks)
1219
0
    {
1220
0
      if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
1221
0
  return false;
1222
0
      if (bfd_link_pic (info))
1223
0
  {
1224
0
    htab->plt_header_size
1225
0
      = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
1226
0
    htab->plt_entry_size
1227
0
      = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt_entry);
1228
0
  }
1229
0
      else
1230
0
  {
1231
0
    htab->plt_header_size
1232
0
      = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt0_entry);
1233
0
    htab->plt_entry_size
1234
0
      = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt_entry);
1235
0
  }
1236
0
    }
1237
1238
0
  if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
1239
0
      || (!bfd_link_pic (info) && !htab->elf.srelbss))
1240
0
    abort ();
1241
1242
0
  return true;
1243
0
}
1244
1245
static bool
1246
create_ifunc_sections (bfd *abfd, struct bfd_link_info *info)
1247
0
{
1248
0
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1249
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
1250
0
  flagword flags, pltflags;
1251
0
  asection *s;
1252
1253
0
  if (htab->irelifunc != NULL || htab->iplt != NULL)
1254
0
    return true;
1255
1256
0
  flags = bed->dynamic_sec_flags;
1257
0
  pltflags = flags | SEC_ALLOC | SEC_CODE | SEC_LOAD;
1258
1259
0
  s = bfd_make_section_with_flags (abfd, ".iplt", pltflags);
1260
0
  if (s == NULL
1261
0
      || !bfd_set_section_alignment (s, bed->plt_alignment))
1262
0
    return false;
1263
0
  htab->iplt = s;
1264
1265
0
  s = bfd_make_section_with_flags (abfd, ".rela.iplt",
1266
0
           flags | SEC_READONLY);
1267
0
  if (s == NULL
1268
0
      || !bfd_set_section_alignment (s, bed->s->log_file_align))
1269
0
    return false;
1270
0
  htab->irelplt = s;
1271
1272
0
  return true;
1273
0
}
1274
1275
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
1276
1277
void
1278
_bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info,
1279
             struct elf_link_hash_entry *dir,
1280
             struct elf_link_hash_entry *ind)
1281
0
{
1282
0
  struct _bfd_sparc_elf_link_hash_entry *edir, *eind;
1283
1284
0
  edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
1285
0
  eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
1286
1287
0
  if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0)
1288
0
    {
1289
0
      edir->tls_type = eind->tls_type;
1290
0
      eind->tls_type = GOT_UNKNOWN;
1291
0
    }
1292
1293
  /* Copy has_got_reloc and has_non_got_reloc.  */
1294
0
  edir->has_got_reloc |= eind->has_got_reloc;
1295
0
  edir->has_non_got_reloc |= eind->has_non_got_reloc;
1296
1297
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1298
0
}
1299
1300
static int
1301
sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
1302
        int r_type, int is_local)
1303
0
{
1304
0
  if (! ABI_64_P (abfd)
1305
0
      && r_type == R_SPARC_TLS_GD_HI22
1306
0
      && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
1307
0
    return R_SPARC_REV32;
1308
1309
0
  if (!bfd_link_executable (info))
1310
0
    return r_type;
1311
1312
0
  switch (r_type)
1313
0
    {
1314
0
    case R_SPARC_TLS_GD_HI22:
1315
0
      return is_local ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_IE_HI22;
1316
0
    case R_SPARC_TLS_GD_LO10:
1317
0
      return is_local ? R_SPARC_TLS_LE_LOX10 : R_SPARC_TLS_IE_LO10;
1318
0
    case R_SPARC_TLS_LDM_HI22:
1319
0
      return R_SPARC_TLS_LE_HIX22;
1320
0
    case R_SPARC_TLS_LDM_LO10:
1321
0
      return R_SPARC_TLS_LE_LOX10;
1322
0
    case R_SPARC_TLS_IE_HI22:
1323
0
      return is_local ? R_SPARC_TLS_LE_HIX22 : r_type;
1324
0
    case R_SPARC_TLS_IE_LO10:
1325
0
      return is_local ? R_SPARC_TLS_LE_LOX10 : r_type;
1326
0
    }
1327
1328
0
  return r_type;
1329
0
}
1330

1331
/* Look through the relocs for a section during the first phase, and
1332
   allocate space in the global offset table or procedure linkage
1333
   table.  */
1334
1335
bool
1336
_bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1337
           asection *sec, const Elf_Internal_Rela *relocs)
1338
0
{
1339
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1340
0
  Elf_Internal_Shdr *symtab_hdr;
1341
0
  struct elf_link_hash_entry **sym_hashes;
1342
0
  const Elf_Internal_Rela *rel;
1343
0
  const Elf_Internal_Rela *rel_end;
1344
0
  asection *sreloc;
1345
0
  int num_relocs;
1346
0
  bool checked_tlsgd = false;
1347
1348
0
  if (bfd_link_relocatable (info))
1349
0
    return true;
1350
1351
0
  htab = _bfd_sparc_elf_hash_table (info);
1352
0
  BFD_ASSERT (htab != NULL);
1353
0
  symtab_hdr = &elf_symtab_hdr (abfd);
1354
0
  sym_hashes = elf_sym_hashes (abfd);
1355
1356
0
  sreloc = NULL;
1357
1358
0
  if (ABI_64_P (abfd))
1359
0
    num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (sec));
1360
0
  else
1361
0
    num_relocs = sec->reloc_count;
1362
1363
0
  BFD_ASSERT (is_sparc_elf (abfd) || num_relocs == 0);
1364
1365
0
  if (htab->elf.dynobj == NULL)
1366
0
    htab->elf.dynobj = abfd;
1367
0
  if (!create_ifunc_sections (htab->elf.dynobj, info))
1368
0
    return false;
1369
1370
0
  rel_end = relocs + num_relocs;
1371
0
  for (rel = relocs; rel < rel_end; rel++)
1372
0
    {
1373
0
      unsigned int r_type;
1374
0
      unsigned int r_symndx;
1375
0
      struct elf_link_hash_entry *h;
1376
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
1377
0
      Elf_Internal_Sym *isym;
1378
1379
0
      r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1380
0
      r_type = SPARC_ELF_R_TYPE (rel->r_info);
1381
1382
0
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1383
0
  {
1384
    /* xgettext:c-format */
1385
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
1386
0
    return false;
1387
0
  }
1388
1389
0
      isym = NULL;
1390
0
      if (r_symndx < symtab_hdr->sh_info)
1391
0
  {
1392
    /* A local symbol.  */
1393
0
    isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd,
1394
0
          r_symndx);
1395
0
    if (isym == NULL)
1396
0
      return false;
1397
1398
    /* Check relocation against local STT_GNU_IFUNC symbol.  */
1399
0
    if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1400
0
      {
1401
0
        h = elf_sparc_get_local_sym_hash (htab, abfd, rel, true);
1402
0
        if (h == NULL)
1403
0
    return false;
1404
1405
        /* Fake a STT_GNU_IFUNC symbol.  */
1406
0
        h->type = STT_GNU_IFUNC;
1407
0
        h->def_regular = 1;
1408
0
        h->ref_regular = 1;
1409
0
        h->forced_local = 1;
1410
0
        h->root.type = bfd_link_hash_defined;
1411
0
      }
1412
0
    else
1413
0
      h = NULL;
1414
0
  }
1415
0
      else
1416
0
  {
1417
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1418
0
    while (h->root.type == bfd_link_hash_indirect
1419
0
     || h->root.type == bfd_link_hash_warning)
1420
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
1421
0
  }
1422
1423
0
      if (h && h->type == STT_GNU_IFUNC && h->def_regular)
1424
0
  {
1425
0
    h->ref_regular = 1;
1426
0
    h->plt.refcount += 1;
1427
0
  }
1428
1429
      /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.  */
1430
0
      if (h != NULL
1431
0
    && htab->elf.sgot == NULL
1432
0
    && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1433
0
  {
1434
0
    if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1435
0
      return false;
1436
0
    BFD_ASSERT (h == htab->elf.hgot);
1437
0
  }
1438
1439
      /* Compatibility with old R_SPARC_REV32 reloc conflicting
1440
   with R_SPARC_TLS_GD_HI22.  */
1441
0
      if (! ABI_64_P (abfd) && ! checked_tlsgd)
1442
0
  switch (r_type)
1443
0
    {
1444
0
    case R_SPARC_TLS_GD_HI22:
1445
0
      {
1446
0
        const Elf_Internal_Rela *relt;
1447
1448
0
        for (relt = rel + 1; relt < rel_end; relt++)
1449
0
    if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
1450
0
        || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
1451
0
        || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
1452
0
      break;
1453
0
        checked_tlsgd = true;
1454
0
        _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end;
1455
0
      }
1456
0
      break;
1457
0
    case R_SPARC_TLS_GD_LO10:
1458
0
    case R_SPARC_TLS_GD_ADD:
1459
0
    case R_SPARC_TLS_GD_CALL:
1460
0
      checked_tlsgd = true;
1461
0
      _bfd_sparc_elf_tdata (abfd)->has_tlsgd = true;
1462
0
      break;
1463
0
    }
1464
1465
0
      r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
1466
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1467
1468
0
      switch (r_type)
1469
0
  {
1470
0
  case R_SPARC_TLS_LDM_HI22:
1471
0
  case R_SPARC_TLS_LDM_LO10:
1472
0
    htab->tls_ldm_got.refcount += 1;
1473
0
    if (eh != NULL)
1474
0
      eh->has_got_reloc = 1;
1475
0
    break;
1476
1477
0
  case R_SPARC_TLS_LE_HIX22:
1478
0
  case R_SPARC_TLS_LE_LOX10:
1479
0
    if (!bfd_link_executable (info))
1480
0
      goto r_sparc_plt32;
1481
0
    break;
1482
1483
0
  case R_SPARC_TLS_IE_HI22:
1484
0
  case R_SPARC_TLS_IE_LO10:
1485
0
    if (!bfd_link_executable (info))
1486
0
      info->flags |= DF_STATIC_TLS;
1487
    /* Fall through */
1488
1489
0
  case R_SPARC_GOT10:
1490
0
  case R_SPARC_GOT13:
1491
0
  case R_SPARC_GOT22:
1492
0
  case R_SPARC_GOTDATA_HIX22:
1493
0
  case R_SPARC_GOTDATA_LOX10:
1494
0
  case R_SPARC_GOTDATA_OP_HIX22:
1495
0
  case R_SPARC_GOTDATA_OP_LOX10:
1496
0
  case R_SPARC_TLS_GD_HI22:
1497
0
  case R_SPARC_TLS_GD_LO10:
1498
    /* This symbol requires a global offset table entry.  */
1499
0
    {
1500
0
      int tls_type, old_tls_type;
1501
1502
0
      switch (r_type)
1503
0
        {
1504
0
        case R_SPARC_TLS_GD_HI22:
1505
0
        case R_SPARC_TLS_GD_LO10:
1506
0
    tls_type = GOT_TLS_GD;
1507
0
    break;
1508
0
        case R_SPARC_TLS_IE_HI22:
1509
0
        case R_SPARC_TLS_IE_LO10:
1510
0
    tls_type = GOT_TLS_IE;
1511
0
    break;
1512
0
        default:
1513
0
    tls_type = GOT_NORMAL;
1514
0
    break;
1515
0
        }
1516
1517
0
      if (h != NULL)
1518
0
        {
1519
0
    h->got.refcount += 1;
1520
0
    old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
1521
0
        }
1522
0
      else
1523
0
        {
1524
0
    bfd_signed_vma *local_got_refcounts;
1525
1526
    /* This is a global offset table entry for a local symbol.  */
1527
0
    local_got_refcounts = elf_local_got_refcounts (abfd);
1528
0
    if (local_got_refcounts == NULL)
1529
0
      {
1530
0
        bfd_size_type size;
1531
1532
0
        size = symtab_hdr->sh_info;
1533
0
        size *= (sizeof (bfd_signed_vma) + sizeof(char));
1534
0
        local_got_refcounts = ((bfd_signed_vma *)
1535
0
             bfd_zalloc (abfd, size));
1536
0
        if (local_got_refcounts == NULL)
1537
0
          return false;
1538
0
        elf_local_got_refcounts (abfd) = local_got_refcounts;
1539
0
        _bfd_sparc_elf_local_got_tls_type (abfd)
1540
0
          = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1541
0
      }
1542
1543
0
    if (r_type != R_SPARC_GOTDATA_OP_HIX22
1544
0
        && r_type != R_SPARC_GOTDATA_OP_LOX10)
1545
0
      local_got_refcounts[r_symndx] += 1;
1546
1547
0
    old_tls_type
1548
0
      = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx];
1549
0
        }
1550
1551
      /* If a TLS symbol is accessed using IE at least once, there is no
1552
         point in using the dynamic model for it.  */
1553
0
      if (old_tls_type != tls_type)
1554
0
        {
1555
0
    if (old_tls_type == GOT_UNKNOWN)
1556
0
      ;
1557
0
    else if (old_tls_type == GOT_TLS_GD && tls_type == GOT_TLS_IE)
1558
0
      ;
1559
0
    else if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1560
0
      tls_type = old_tls_type;
1561
0
    else
1562
0
      {
1563
0
        _bfd_error_handler
1564
          /* xgettext:c-format */
1565
0
          (_("%pB: `%s' accessed both as normal and thread local symbol"),
1566
0
           abfd, h ? h->root.root.string : "<local>");
1567
0
        return false;
1568
0
      }
1569
1570
0
    if (h != NULL)
1571
0
      _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type;
1572
0
    else
1573
0
      _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1574
0
        }
1575
0
    }
1576
1577
0
    if (!htab->elf.sgot
1578
0
        && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
1579
0
      return false;
1580
1581
0
    if (eh != NULL)
1582
0
      {
1583
0
        eh->has_got_reloc = 1;
1584
0
        if (r_type == R_SPARC_GOT10
1585
0
      || r_type == R_SPARC_GOT13
1586
0
      || r_type == R_SPARC_GOT22)
1587
0
    eh->has_old_style_got_reloc = 1;
1588
0
      }
1589
0
    break;
1590
1591
0
  case R_SPARC_TLS_GD_CALL:
1592
0
  case R_SPARC_TLS_LDM_CALL:
1593
0
    if (bfd_link_executable (info))
1594
0
      break;
1595
1596
    /* Essentially R_SPARC_WPLT30 relocs against __tls_get_addr.  */
1597
0
    h = (struct elf_link_hash_entry *)
1598
0
         bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
1599
0
             false, true);
1600
0
    BFD_ASSERT (h != NULL);
1601
    /* Fall through */
1602
1603
0
  case R_SPARC_WPLT30:
1604
0
  case R_SPARC_PLT32:
1605
0
  case R_SPARC_PLT64:
1606
0
  case R_SPARC_HIPLT22:
1607
0
  case R_SPARC_LOPLT10:
1608
0
  case R_SPARC_PCPLT32:
1609
0
  case R_SPARC_PCPLT22:
1610
0
  case R_SPARC_PCPLT10:
1611
    /* This symbol requires a procedure linkage table entry.
1612
       We actually build the entry in adjust_dynamic_symbol,
1613
       because this might be a case of linking PIC code without
1614
       linking in any dynamic objects, in which case we don't
1615
       need to generate a procedure linkage table after all.  */
1616
1617
0
    if (h == NULL)
1618
0
      {
1619
0
        if (! ABI_64_P (abfd))
1620
0
    {
1621
      /* The Solaris native assembler will generate a WPLT30
1622
         reloc for a local symbol if you assemble a call from
1623
         one section to another when using -K pic.  We treat
1624
         it as WDISP30.  */
1625
0
      if (r_type == R_SPARC_PLT32)
1626
0
        goto r_sparc_plt32;
1627
0
      break;
1628
0
    }
1629
        /* PR 7027: We need similar behaviour for 64-bit binaries.  */
1630
0
        else if (r_type == R_SPARC_WPLT30)
1631
0
    break;
1632
1633
        /* It does not make sense to have a procedure linkage
1634
     table entry for a local symbol.  */
1635
0
        bfd_set_error (bfd_error_bad_value);
1636
0
        return false;
1637
0
      }
1638
1639
0
    h->needs_plt = 1;
1640
1641
0
    if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
1642
0
      goto r_sparc_plt32;
1643
1644
0
    h->plt.refcount += 1;
1645
1646
0
    eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1647
0
    eh->has_got_reloc = 1;
1648
0
    break;
1649
1650
0
  case R_SPARC_PC10:
1651
0
  case R_SPARC_PC22:
1652
0
  case R_SPARC_PC_HH22:
1653
0
  case R_SPARC_PC_HM10:
1654
0
  case R_SPARC_PC_LM22:
1655
0
    if (h != NULL)
1656
0
      h->non_got_ref = 1;
1657
1658
0
    if (h != NULL && h == htab->elf.hgot)
1659
0
      break;
1660
    /* Fall through.  */
1661
1662
0
  case R_SPARC_DISP8:
1663
0
  case R_SPARC_DISP16:
1664
0
  case R_SPARC_DISP32:
1665
0
  case R_SPARC_DISP64:
1666
0
  case R_SPARC_WDISP30:
1667
0
  case R_SPARC_WDISP22:
1668
0
  case R_SPARC_WDISP19:
1669
0
  case R_SPARC_WDISP16:
1670
0
  case R_SPARC_WDISP10:
1671
0
  case R_SPARC_8:
1672
0
  case R_SPARC_16:
1673
0
  case R_SPARC_32:
1674
0
  case R_SPARC_HI22:
1675
0
  case R_SPARC_22:
1676
0
  case R_SPARC_13:
1677
0
  case R_SPARC_LO10:
1678
0
  case R_SPARC_UA16:
1679
0
  case R_SPARC_UA32:
1680
0
  case R_SPARC_10:
1681
0
  case R_SPARC_11:
1682
0
  case R_SPARC_64:
1683
0
  case R_SPARC_OLO10:
1684
0
  case R_SPARC_HH22:
1685
0
  case R_SPARC_HM10:
1686
0
  case R_SPARC_LM22:
1687
0
  case R_SPARC_7:
1688
0
  case R_SPARC_5:
1689
0
  case R_SPARC_6:
1690
0
  case R_SPARC_HIX22:
1691
0
  case R_SPARC_LOX10:
1692
0
  case R_SPARC_H44:
1693
0
  case R_SPARC_M44:
1694
0
  case R_SPARC_L44:
1695
0
  case R_SPARC_H34:
1696
0
  case R_SPARC_UA64:
1697
0
    if (h != NULL)
1698
0
      h->non_got_ref = 1;
1699
1700
0
    if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1701
0
      eh->has_non_got_reloc = 1;
1702
1703
0
  r_sparc_plt32:
1704
0
    if (h != NULL && !bfd_link_pic (info))
1705
0
      {
1706
        /* We may need a .plt entry if the function this reloc
1707
     refers to is in a shared lib.  */
1708
0
        h->plt.refcount += 1;
1709
0
      }
1710
1711
    /* If we are creating a shared library, and this is a reloc
1712
       against a global symbol, or a non PC relative reloc
1713
       against a local symbol, then we need to copy the reloc
1714
       into the shared library.  However, if we are linking with
1715
       -Bsymbolic, we do not need to copy a reloc against a
1716
       global symbol which is defined in an object we are
1717
       including in the link (i.e., DEF_REGULAR is set).  At
1718
       this point we have not seen all the input files, so it is
1719
       possible that DEF_REGULAR is not set now but will be set
1720
       later (it is never cleared).  In case of a weak definition,
1721
       DEF_REGULAR may be cleared later by a strong definition in
1722
       a shared library.  We account for that possibility below by
1723
       storing information in the relocs_copied field of the hash
1724
       table entry.  A similar situation occurs when creating
1725
       shared libraries and symbol visibility changes render the
1726
       symbol local.
1727
1728
       If on the other hand, we are creating an executable, we
1729
       may need to keep relocations for symbols satisfied by a
1730
       dynamic library if we manage to avoid copy relocs for the
1731
       symbol.  */
1732
0
    if ((bfd_link_pic (info)
1733
0
         && (sec->flags & SEC_ALLOC) != 0
1734
0
         && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1735
0
       || (h != NULL
1736
0
           && (! SYMBOLIC_BIND (info, h)
1737
0
         || h->root.type == bfd_link_hash_defweak
1738
0
         || !h->def_regular))))
1739
0
        || (!bfd_link_pic (info)
1740
0
      && (sec->flags & SEC_ALLOC) != 0
1741
0
      && h != NULL
1742
0
      && (h->root.type == bfd_link_hash_defweak
1743
0
          || !h->def_regular))
1744
0
        || (!bfd_link_pic (info)
1745
0
      && h != NULL
1746
0
      && h->type == STT_GNU_IFUNC))
1747
0
      {
1748
0
        struct elf_dyn_relocs *p;
1749
0
        struct elf_dyn_relocs **head;
1750
1751
        /* When creating a shared object, we must copy these
1752
     relocs into the output file.  We create a reloc
1753
     section in dynobj and make room for the reloc.  */
1754
0
        if (sreloc == NULL)
1755
0
    {
1756
0
      sreloc = _bfd_elf_make_dynamic_reloc_section
1757
0
        (sec, htab->elf.dynobj, htab->word_align_power,
1758
0
         abfd, /*rela?*/ true);
1759
1760
0
      if (sreloc == NULL)
1761
0
        return false;
1762
0
    }
1763
1764
        /* If this is a global symbol, we count the number of
1765
     relocations we need for this symbol.  */
1766
0
        if (h != NULL)
1767
0
    head = &h->dyn_relocs;
1768
0
        else
1769
0
    {
1770
      /* Track dynamic relocs needed for local syms too.
1771
         We really need local syms available to do this
1772
         easily.  Oh well.  */
1773
0
      asection *s;
1774
0
      void *vpp;
1775
1776
0
      BFD_ASSERT (isym != NULL);
1777
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1778
0
      if (s == NULL)
1779
0
        s = sec;
1780
1781
0
      vpp = &elf_section_data (s)->local_dynrel;
1782
0
      head = (struct elf_dyn_relocs **) vpp;
1783
0
    }
1784
1785
0
        p = *head;
1786
0
        if (p == NULL || p->sec != sec)
1787
0
    {
1788
0
      size_t amt = sizeof *p;
1789
0
      p = ((struct elf_dyn_relocs *)
1790
0
           bfd_alloc (htab->elf.dynobj, amt));
1791
0
      if (p == NULL)
1792
0
        return false;
1793
0
      p->next = *head;
1794
0
      *head = p;
1795
0
      p->sec = sec;
1796
0
      p->count = 0;
1797
0
      p->pc_count = 0;
1798
0
    }
1799
1800
0
        p->count += 1;
1801
0
        if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1802
0
    p->pc_count += 1;
1803
0
      }
1804
1805
0
    break;
1806
1807
0
  case R_SPARC_GNU_VTINHERIT:
1808
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1809
0
      return false;
1810
0
    break;
1811
1812
0
  case R_SPARC_GNU_VTENTRY:
1813
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1814
0
      return false;
1815
0
    break;
1816
1817
0
  case R_SPARC_REGISTER:
1818
    /* Nothing to do.  */
1819
0
    break;
1820
1821
0
  default:
1822
0
    break;
1823
0
  }
1824
0
    }
1825
1826
0
  return true;
1827
0
}
1828

1829
asection *
1830
_bfd_sparc_elf_gc_mark_hook (asection *sec,
1831
           struct bfd_link_info *info,
1832
           Elf_Internal_Rela *rel,
1833
           struct elf_link_hash_entry *h,
1834
           Elf_Internal_Sym *sym)
1835
0
{
1836
0
  if (h != NULL)
1837
0
    switch (SPARC_ELF_R_TYPE (rel->r_info))
1838
0
      {
1839
0
      case R_SPARC_GNU_VTINHERIT:
1840
0
      case R_SPARC_GNU_VTENTRY:
1841
0
  return NULL;
1842
0
      }
1843
1844
0
  if (!bfd_link_executable (info))
1845
0
    {
1846
0
      switch (SPARC_ELF_R_TYPE (rel->r_info))
1847
0
  {
1848
0
  case R_SPARC_TLS_GD_CALL:
1849
0
  case R_SPARC_TLS_LDM_CALL:
1850
    /* This reloc implicitly references __tls_get_addr.  We know
1851
       another reloc will reference the same symbol as the one
1852
       on this reloc, so the real symbol and section will be
1853
       gc marked when processing the other reloc.  That lets
1854
       us handle __tls_get_addr here.  */
1855
0
    h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
1856
0
            false, false, true);
1857
0
    BFD_ASSERT (h != NULL);
1858
0
    h->mark = 1;
1859
0
    if (h->is_weakalias)
1860
0
      weakdef (h)->mark = 1;
1861
0
    sym = NULL;
1862
0
  }
1863
0
    }
1864
1865
0
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1866
0
}
1867
1868
static Elf_Internal_Rela *
1869
sparc_elf_find_reloc_at_ofs (Elf_Internal_Rela *rel,
1870
           Elf_Internal_Rela *relend,
1871
           bfd_vma offset)
1872
0
{
1873
0
  while (rel < relend)
1874
0
    {
1875
0
      if (rel->r_offset == offset)
1876
0
  return rel;
1877
0
      rel++;
1878
0
    }
1879
0
  return NULL;
1880
0
}
1881
1882
/* Remove undefined weak symbol from the dynamic symbol table if it
1883
   is resolved to 0.   */
1884
1885
bool
1886
_bfd_sparc_elf_fixup_symbol (struct bfd_link_info *info,
1887
           struct elf_link_hash_entry *h)
1888
0
{
1889
0
  if (h->dynindx != -1
1890
0
      && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
1891
0
            _bfd_sparc_elf_hash_entry (h)))
1892
0
    {
1893
0
      h->dynindx = -1;
1894
0
      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1895
0
            h->dynstr_index);
1896
0
    }
1897
0
  return true;
1898
0
}
1899
1900
/* Adjust a symbol defined by a dynamic object and referenced by a
1901
   regular object.  The current definition is in some section of the
1902
   dynamic object, but we're not including those sections.  We have to
1903
   change the definition to something the rest of the link can
1904
   understand.  */
1905
1906
bool
1907
_bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1908
             struct elf_link_hash_entry *h)
1909
0
{
1910
0
  struct _bfd_sparc_elf_link_hash_table *htab;
1911
0
  asection *s, *srel;
1912
1913
0
  htab = _bfd_sparc_elf_hash_table (info);
1914
0
  BFD_ASSERT (htab != NULL);
1915
1916
  /* Make sure we know what is going on here.  */
1917
0
  BFD_ASSERT (htab->elf.dynobj != NULL
1918
0
        && (h->needs_plt
1919
0
      || h->type == STT_GNU_IFUNC
1920
0
      || h->is_weakalias
1921
0
      || (h->def_dynamic
1922
0
          && h->ref_regular
1923
0
          && !h->def_regular)));
1924
1925
  /* If this is a function, put it in the procedure linkage table.  We
1926
     will fill in the contents of the procedure linkage table later
1927
     (although we could actually do it here).  The STT_NOTYPE
1928
     condition is a hack specifically for the Oracle libraries
1929
     delivered for Solaris; for some inexplicable reason, they define
1930
     some of their functions as STT_NOTYPE when they really should be
1931
     STT_FUNC.  */
1932
0
  if (h->type == STT_FUNC
1933
0
      || h->type == STT_GNU_IFUNC
1934
0
      || h->needs_plt
1935
0
      || (h->type == STT_NOTYPE
1936
0
    && (h->root.type == bfd_link_hash_defined
1937
0
        || h->root.type == bfd_link_hash_defweak)
1938
0
    && (h->root.u.def.section->flags & SEC_CODE) != 0))
1939
0
    {
1940
0
      if (h->plt.refcount <= 0
1941
0
    || (h->type != STT_GNU_IFUNC
1942
0
        && (SYMBOL_CALLS_LOCAL (info, h)
1943
0
      || (h->root.type == bfd_link_hash_undefweak
1944
0
          && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT))))
1945
0
  {
1946
    /* This case can occur if we saw a WPLT30 reloc in an input
1947
       file, but the symbol was never referred to by a dynamic
1948
       object, or if all references were garbage collected.  In
1949
       such a case, we don't actually need to build a procedure
1950
       linkage table, and we can just do a WDISP30 reloc instead.  */
1951
0
    h->plt.offset = (bfd_vma) -1;
1952
0
    h->needs_plt = 0;
1953
0
  }
1954
1955
0
      return true;
1956
0
    }
1957
0
  else
1958
0
    h->plt.offset = (bfd_vma) -1;
1959
1960
  /* If this is a weak symbol, and there is a real definition, the
1961
     processor independent code will have arranged for us to see the
1962
     real definition first, and we can just use the same value.  */
1963
0
  if (h->is_weakalias)
1964
0
    {
1965
0
      struct elf_link_hash_entry *def = weakdef (h);
1966
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1967
0
      h->root.u.def.section = def->root.u.def.section;
1968
0
      h->root.u.def.value = def->root.u.def.value;
1969
0
      return true;
1970
0
    }
1971
1972
  /* This is a reference to a symbol defined by a dynamic object which
1973
     is not a function.  */
1974
1975
  /* If we are creating a shared library, we must presume that the
1976
     only references to the symbol are via the global offset table.
1977
     For such cases we need not do anything here; the relocations will
1978
     be handled correctly by relocate_section.  */
1979
0
  if (bfd_link_pic (info))
1980
0
    return true;
1981
1982
  /* If there are no references to this symbol that do not use the
1983
     GOT, we don't need to generate a copy reloc.  */
1984
0
  if (!h->non_got_ref)
1985
0
    return true;
1986
1987
  /* If -z nocopyreloc was given, we won't generate them either.  */
1988
0
  if (info->nocopyreloc)
1989
0
    {
1990
0
      h->non_got_ref = 0;
1991
0
      return true;
1992
0
    }
1993
1994
  /* If we don't find any dynamic relocs in read-only sections, then
1995
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1996
0
  if (!_bfd_elf_readonly_dynrelocs (h))
1997
0
    {
1998
0
      h->non_got_ref = 0;
1999
0
      return true;
2000
0
    }
2001
2002
  /* We must allocate the symbol in our .dynbss section, which will
2003
     become part of the .bss section of the executable.  There will be
2004
     an entry for this symbol in the .dynsym section.  The dynamic
2005
     object will contain position independent code, so all references
2006
     from the dynamic object to this symbol will go through the global
2007
     offset table.  The dynamic linker will use the .dynsym entry to
2008
     determine the address it must put in the global offset table, so
2009
     both the dynamic object and the regular object will refer to the
2010
     same memory location for the variable.  */
2011
2012
  /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
2013
     to copy the initial value out of the dynamic object and into the
2014
     runtime process image.  We need to remember the offset into the
2015
     .rel.bss section we are going to use.  */
2016
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2017
0
    {
2018
0
      s = htab->elf.sdynrelro;
2019
0
      srel = htab->elf.sreldynrelro;
2020
0
    }
2021
0
  else
2022
0
    {
2023
0
      s = htab->elf.sdynbss;
2024
0
      srel = htab->elf.srelbss;
2025
0
    }
2026
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2027
0
    {
2028
0
      srel->size += SPARC_ELF_RELA_BYTES (htab);
2029
0
      h->needs_copy = 1;
2030
0
    }
2031
2032
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
2033
0
}
2034
2035
/* Allocate space in .plt, .got and associated reloc sections for
2036
   dynamic relocs.  */
2037
2038
static bool
2039
allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2040
0
{
2041
0
  struct bfd_link_info *info;
2042
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2043
0
  struct _bfd_sparc_elf_link_hash_entry *eh;
2044
0
  struct elf_dyn_relocs *p;
2045
0
  bool resolved_to_zero;
2046
2047
0
  if (h->root.type == bfd_link_hash_indirect)
2048
0
    return true;
2049
2050
0
  info = (struct bfd_link_info *) inf;
2051
0
  htab = _bfd_sparc_elf_hash_table (info);
2052
0
  BFD_ASSERT (htab != NULL);
2053
2054
0
  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2055
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2056
2057
0
  if ((htab->elf.dynamic_sections_created
2058
0
       && h->plt.refcount > 0)
2059
0
      || (h->type == STT_GNU_IFUNC
2060
0
    && h->def_regular
2061
0
    && h->ref_regular))
2062
0
    {
2063
      /* Undefined weak syms won't yet be marked as dynamic.  */
2064
0
      if (h->root.type == bfd_link_hash_undefweak
2065
0
    && !resolved_to_zero
2066
0
    && h->dynindx == -1
2067
0
    && !h->forced_local)
2068
0
  {
2069
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2070
0
      return false;
2071
0
  }
2072
2073
0
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)
2074
0
    || (h->type == STT_GNU_IFUNC
2075
0
        && h->def_regular))
2076
0
  {
2077
0
    asection *s = htab->elf.splt;
2078
2079
0
    if (s == NULL)
2080
0
      s = htab->elf.iplt;
2081
2082
    /* Allocate room for the header.  */
2083
0
    if (s->size == 0)
2084
0
      {
2085
0
        s->size = htab->plt_header_size;
2086
2087
        /* Allocate space for the .rela.plt.unloaded relocations.  */
2088
0
        if (htab->elf.target_os == is_vxworks
2089
0
      && !bfd_link_pic (info))
2090
0
    htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
2091
0
      }
2092
2093
    /* The procedure linkage table size is bounded by the magnitude
2094
       of the offset we can describe in the entry.  */
2095
0
    if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ?
2096
0
        (((bfd_vma)1 << 31) << 1) : 0x400000))
2097
0
      {
2098
0
        bfd_set_error (bfd_error_bad_value);
2099
0
        return false;
2100
0
      }
2101
2102
0
    if (SPARC_ELF_WORD_BYTES(htab) == 8
2103
0
        && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
2104
0
      {
2105
0
        bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE;
2106
2107
2108
0
        off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE;
2109
2110
0
        h->plt.offset = (s->size - (off * 8));
2111
0
      }
2112
0
    else
2113
0
      h->plt.offset = s->size;
2114
2115
    /* If this symbol is not defined in a regular file, and we are
2116
       not generating a shared library, then set the symbol to this
2117
       location in the .plt.  This is required to make function
2118
       pointers compare as equal between the normal executable and
2119
       the shared library.  */
2120
0
    if (! bfd_link_pic (info)
2121
0
        && !h->def_regular)
2122
0
      {
2123
0
        h->root.u.def.section = s;
2124
0
        h->root.u.def.value = h->plt.offset;
2125
0
      }
2126
2127
    /* Make room for this entry.  */
2128
0
    s->size += htab->plt_entry_size;
2129
2130
    /* There should be no PLT relocations against resolved undefined
2131
       weak symbols in the executable.  */
2132
0
    if (!resolved_to_zero)
2133
0
      {
2134
        /* We also need to make an entry in the .rela.plt section.  */
2135
0
        if (s == htab->elf.splt)
2136
0
    htab->elf.srelplt->size += SPARC_ELF_RELA_BYTES (htab);
2137
0
        else
2138
0
    htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab);
2139
0
      }
2140
2141
0
    if (htab->elf.target_os == is_vxworks)
2142
0
      {
2143
        /* Allocate space for the .got.plt entry.  */
2144
0
        htab->elf.sgotplt->size += 4;
2145
2146
        /* ...and for the .rela.plt.unloaded relocations.  */
2147
0
        if (!bfd_link_pic (info))
2148
0
    htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
2149
0
      }
2150
0
  }
2151
0
      else
2152
0
  {
2153
0
    h->plt.offset = (bfd_vma) -1;
2154
0
    h->needs_plt = 0;
2155
0
  }
2156
0
    }
2157
0
  else
2158
0
    {
2159
0
      h->plt.offset = (bfd_vma) -1;
2160
0
      h->needs_plt = 0;
2161
0
    }
2162
2163
  /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
2164
     make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry.  */
2165
0
  if (h->got.refcount > 0
2166
0
      && bfd_link_executable (info)
2167
0
      && h->dynindx == -1
2168
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
2169
0
    h->got.offset = (bfd_vma) -1;
2170
0
  else if (h->got.refcount > 0)
2171
0
    {
2172
0
      asection *s;
2173
0
      bool dyn;
2174
0
      int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
2175
2176
      /* Undefined weak syms won't yet be marked as dynamic.  */
2177
0
      if (h->root.type == bfd_link_hash_undefweak
2178
0
    && !resolved_to_zero
2179
0
    && h->dynindx == -1
2180
0
    && !h->forced_local)
2181
0
  {
2182
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
2183
0
      return false;
2184
0
  }
2185
2186
0
      s = htab->elf.sgot;
2187
0
      h->got.offset = s->size;
2188
0
      s->size += SPARC_ELF_WORD_BYTES (htab);
2189
      /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots.  */
2190
0
      if (tls_type == GOT_TLS_GD)
2191
0
  s->size += SPARC_ELF_WORD_BYTES (htab);
2192
0
      dyn = htab->elf.dynamic_sections_created;
2193
      /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
2194
   R_SPARC_TLS_GD_{HI22,LO10} needs one if local and two if global.  */
2195
0
      if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
2196
0
    || tls_type == GOT_TLS_IE
2197
0
    || h->type == STT_GNU_IFUNC)
2198
0
  htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2199
0
      else if (tls_type == GOT_TLS_GD)
2200
0
  htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
2201
0
      else if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
2202
    /* Even if the symbol isn't dynamic, we may generate a
2203
       reloc for the dynamic linker in PIC mode.  */
2204
0
    || (h->dynindx == -1
2205
0
        && !h->forced_local
2206
0
        && h->root.type != bfd_link_hash_undefweak
2207
0
        && bfd_link_pic (info)))
2208
         /* No dynamic relocations are needed against resolved
2209
      undefined weak symbols in an executable.  */
2210
0
         && !(h->root.type == bfd_link_hash_undefweak
2211
0
        && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2212
0
      || resolved_to_zero)))
2213
0
  htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2214
0
    }
2215
0
  else
2216
0
    h->got.offset = (bfd_vma) -1;
2217
2218
0
  if (h->dyn_relocs == NULL)
2219
0
    return true;
2220
2221
  /* In the shared -Bsymbolic case, discard space allocated for
2222
     dynamic pc-relative relocs against symbols which turn out to be
2223
     defined in regular objects.  For the normal shared case, discard
2224
     space for pc-relative relocs that have become local due to symbol
2225
     visibility changes.  */
2226
2227
0
  if (bfd_link_pic (info))
2228
0
    {
2229
0
      if (SYMBOL_CALLS_LOCAL (info, h))
2230
0
  {
2231
0
    struct elf_dyn_relocs **pp;
2232
2233
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
2234
0
      {
2235
0
        p->count -= p->pc_count;
2236
0
        p->pc_count = 0;
2237
0
        if (p->count == 0)
2238
0
    *pp = p->next;
2239
0
        else
2240
0
    pp = &p->next;
2241
0
      }
2242
0
  }
2243
2244
0
      if (htab->elf.target_os == is_vxworks)
2245
0
  {
2246
0
    struct elf_dyn_relocs **pp;
2247
2248
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
2249
0
      {
2250
0
        if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2251
0
    *pp = p->next;
2252
0
        else
2253
0
    pp = &p->next;
2254
0
      }
2255
0
  }
2256
2257
      /* Also discard relocs on undefined weak syms with non-default
2258
   visibility or in PIE.  */
2259
0
      if (h->dyn_relocs != NULL
2260
0
    && h->root.type == bfd_link_hash_undefweak)
2261
0
  {
2262
    /* An undefined weak symbol is never
2263
       bound locally in a shared library.  */
2264
2265
0
    if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2266
0
        || resolved_to_zero)
2267
0
      {
2268
0
        if (h->non_got_ref)
2269
0
    {
2270
      /* Keep dynamic non-GOT/non-PLT relocation so that we
2271
         can branch to 0 without PLT.  */
2272
0
      struct elf_dyn_relocs **pp;
2273
2274
0
      for (pp = &h->dyn_relocs; (p = *pp) != NULL;)
2275
0
        if (p->pc_count == 0)
2276
0
          *pp = p->next;
2277
0
        else
2278
0
          {
2279
      /* Remove other relocations.  */
2280
0
      p->count = p->pc_count;
2281
0
      pp = &p->next;
2282
0
          }
2283
2284
0
      if (h->dyn_relocs != NULL)
2285
0
        {
2286
          /* Make sure undefined weak symbols are output
2287
       as dynamic symbols in PIEs for dynamic non-GOT
2288
       non-PLT reloations.  */
2289
0
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
2290
0
      return false;
2291
0
        }
2292
0
    }
2293
0
        else
2294
0
    h->dyn_relocs = NULL;
2295
0
      }
2296
2297
    /* Make sure undefined weak symbols are output as a dynamic
2298
       symbol in PIEs.  */
2299
0
    else if (h->dynindx == -1
2300
0
       && !h->forced_local)
2301
0
      {
2302
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
2303
0
    return false;
2304
0
      }
2305
0
  }
2306
0
    }
2307
0
  else
2308
0
    {
2309
      /* For the non-shared case, discard space for relocs against
2310
   symbols which turn out to need copy relocs or are not
2311
   dynamic.  */
2312
2313
0
      if ((!h->non_got_ref
2314
0
     || (h->root.type == bfd_link_hash_undefweak
2315
0
         && !resolved_to_zero))
2316
0
    && ((h->def_dynamic
2317
0
         && !h->def_regular)
2318
0
        || (htab->elf.dynamic_sections_created
2319
0
      && (h->root.type == bfd_link_hash_undefweak
2320
0
          || h->root.type == bfd_link_hash_undefined))))
2321
0
  {
2322
    /* Undefined weak syms won't yet be marked as dynamic.  */
2323
0
    if (h->root.type == bfd_link_hash_undefweak
2324
0
        && !resolved_to_zero
2325
0
        && h->dynindx == -1
2326
0
        && !h->forced_local)
2327
0
      {
2328
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
2329
0
    return false;
2330
0
      }
2331
2332
    /* If that succeeded, we know we'll be keeping all the
2333
       relocs.  */
2334
0
    if (h->dynindx != -1)
2335
0
      goto keep;
2336
0
  }
2337
2338
0
      h->dyn_relocs = NULL;
2339
2340
0
    keep: ;
2341
0
    }
2342
2343
  /* Finally, allocate space.  */
2344
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
2345
0
    {
2346
0
      asection *sreloc = elf_section_data (p->sec)->sreloc;
2347
0
      sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2348
0
    }
2349
2350
0
  return true;
2351
0
}
2352
2353
/* Allocate space in .plt, .got and associated reloc sections for
2354
   local dynamic relocs.  */
2355
2356
static int
2357
allocate_local_dynrelocs (void **slot, void *inf)
2358
0
{
2359
0
  struct elf_link_hash_entry *h
2360
0
    = (struct elf_link_hash_entry *) *slot;
2361
2362
0
  if (h->type != STT_GNU_IFUNC
2363
0
      || !h->def_regular
2364
0
      || !h->ref_regular
2365
0
      || !h->forced_local
2366
0
      || h->root.type != bfd_link_hash_defined)
2367
0
    abort ();
2368
2369
0
  return allocate_dynrelocs (h, inf);
2370
0
}
2371
2372
/* Return true if the dynamic symbol for a given section should be
2373
   omitted when creating a shared library.  */
2374
2375
bool
2376
_bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
2377
            struct bfd_link_info *info,
2378
            asection *p)
2379
0
{
2380
  /* We keep the .got section symbol so that explicit relocations
2381
     against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2382
     can be turned into relocations against the .got symbol.  */
2383
0
  if (strcmp (p->name, ".got") == 0)
2384
0
    return false;
2385
2386
0
  return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p);
2387
0
}
2388
2389
/* Set the sizes of the dynamic sections.  */
2390
2391
bool
2392
_bfd_sparc_elf_late_size_sections (bfd *output_bfd,
2393
           struct bfd_link_info *info)
2394
0
{
2395
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2396
0
  bfd *dynobj;
2397
0
  asection *s;
2398
0
  bfd *ibfd;
2399
2400
0
  htab = _bfd_sparc_elf_hash_table (info);
2401
0
  BFD_ASSERT (htab != NULL);
2402
0
  dynobj = htab->elf.dynobj;
2403
0
  if (dynobj == NULL)
2404
0
    return true;
2405
2406
0
  if (elf_hash_table (info)->dynamic_sections_created)
2407
0
    {
2408
      /* Set the contents of the .interp section to the interpreter.  */
2409
0
      if (bfd_link_executable (info) && !info->nointerp)
2410
0
  {
2411
0
    s = bfd_get_linker_section (dynobj, ".interp");
2412
0
    BFD_ASSERT (s != NULL);
2413
0
    s->size = htab->dynamic_interpreter_size;
2414
0
    s->contents = (unsigned char *) htab->dynamic_interpreter;
2415
0
    s->alloced = 1;
2416
0
    htab->interp = s;
2417
0
  }
2418
0
    }
2419
2420
  /* Set up .got offsets for local syms, and space for local dynamic
2421
     relocs.  */
2422
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2423
0
    {
2424
0
      bfd_signed_vma *local_got;
2425
0
      bfd_signed_vma *end_local_got;
2426
0
      char *local_tls_type;
2427
0
      bfd_size_type locsymcount;
2428
0
      Elf_Internal_Shdr *symtab_hdr;
2429
0
      asection *srel;
2430
2431
0
      if (! is_sparc_elf (ibfd))
2432
0
  continue;
2433
2434
0
      for (s = ibfd->sections; s != NULL; s = s->next)
2435
0
  {
2436
0
    struct elf_dyn_relocs *p;
2437
2438
0
    for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2439
0
      {
2440
0
        if (!bfd_is_abs_section (p->sec)
2441
0
      && bfd_is_abs_section (p->sec->output_section))
2442
0
    {
2443
      /* Input section has been discarded, either because
2444
         it is a copy of a linkonce section or due to
2445
         linker script /DISCARD/, so we'll be discarding
2446
         the relocs too.  */
2447
0
    }
2448
0
        else if (htab->elf.target_os == is_vxworks
2449
0
           && strcmp (p->sec->output_section->name,
2450
0
          ".tls_vars") == 0)
2451
0
    {
2452
      /* Relocations in vxworks .tls_vars sections are
2453
         handled specially by the loader.  */
2454
0
    }
2455
0
        else if (p->count != 0)
2456
0
    {
2457
0
      srel = elf_section_data (p->sec)->sreloc;
2458
0
      if (!htab->elf.dynamic_sections_created)
2459
0
        srel = htab->elf.irelplt;
2460
0
      srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2461
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2462
0
        {
2463
0
          info->flags |= DF_TEXTREL;
2464
0
          info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
2465
0
                p->sec->owner, p->sec);
2466
0
        }
2467
0
    }
2468
0
      }
2469
0
  }
2470
2471
0
      local_got = elf_local_got_refcounts (ibfd);
2472
0
      if (!local_got)
2473
0
  continue;
2474
2475
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
2476
0
      locsymcount = symtab_hdr->sh_info;
2477
0
      end_local_got = local_got + locsymcount;
2478
0
      local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
2479
0
      s = htab->elf.sgot;
2480
0
      srel = htab->elf.srelgot;
2481
0
      for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2482
0
  {
2483
0
    if (*local_got > 0)
2484
0
      {
2485
0
        *local_got = s->size;
2486
0
        s->size += SPARC_ELF_WORD_BYTES (htab);
2487
0
        if (*local_tls_type == GOT_TLS_GD)
2488
0
    s->size += SPARC_ELF_WORD_BYTES (htab);
2489
0
        if (bfd_link_pic (info)
2490
0
      || *local_tls_type == GOT_TLS_GD
2491
0
      || *local_tls_type == GOT_TLS_IE)
2492
0
    srel->size += SPARC_ELF_RELA_BYTES (htab);
2493
0
      }
2494
0
    else
2495
0
      *local_got = (bfd_vma) -1;
2496
0
  }
2497
0
    }
2498
2499
0
  if (htab->tls_ldm_got.refcount > 0)
2500
0
    {
2501
      /* Allocate 2 got entries and 1 dynamic reloc for
2502
   R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
2503
0
      htab->tls_ldm_got.offset = htab->elf.sgot->size;
2504
0
      htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
2505
0
      htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2506
0
    }
2507
0
  else
2508
0
    htab->tls_ldm_got.offset = -1;
2509
2510
  /* Allocate global sym .plt and .got entries, and space for global
2511
     sym dynamic relocs.  */
2512
0
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2513
2514
  /* Allocate .plt and .got entries, and space for local symbols.  */
2515
0
  htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
2516
2517
0
  if (! ABI_64_P (output_bfd)
2518
0
      && htab->elf.target_os != is_vxworks
2519
0
      && elf_hash_table (info)->dynamic_sections_created)
2520
0
    {
2521
      /* Make space for the trailing nop in .plt.  */
2522
0
      if (htab->elf.splt->size > 0)
2523
0
  htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
2524
2525
      /* If the .got section is more than 0x1000 bytes, we add
2526
   0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
2527
   bit relocations have a greater chance of working.
2528
2529
   FIXME: Make this optimization work for 64-bit too.  */
2530
0
      if (htab->elf.sgot->size >= 0x1000
2531
0
    && elf_hash_table (info)->hgot->root.u.def.value == 0)
2532
0
  elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
2533
0
    }
2534
2535
  /* The check_relocs and adjust_dynamic_symbol entry points have
2536
     determined the sizes of the various dynamic sections.  Allocate
2537
     memory for them.  */
2538
0
  for (s = dynobj->sections; s != NULL; s = s->next)
2539
0
    {
2540
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
2541
0
  continue;
2542
2543
0
      if (s == htab->elf.splt
2544
0
    || s == htab->elf.sgot
2545
0
    || s == htab->elf.sdynbss
2546
0
    || s == htab->elf.sdynrelro
2547
0
    || s == htab->elf.iplt
2548
0
    || s == htab->elf.sgotplt)
2549
0
  {
2550
    /* Strip this section if we don't need it; see the
2551
       comment below.  */
2552
0
  }
2553
0
      else if (startswith (s->name, ".rela"))
2554
0
  {
2555
0
    if (s->size != 0)
2556
0
      {
2557
        /* We use the reloc_count field as a counter if we need
2558
     to copy relocs into the output file.  */
2559
0
        s->reloc_count = 0;
2560
0
      }
2561
0
  }
2562
0
      else
2563
0
  {
2564
    /* It's not one of our sections.  */
2565
0
    continue;
2566
0
  }
2567
2568
0
      if (s->size == 0)
2569
0
  {
2570
    /* If we don't need this section, strip it from the
2571
       output file.  This is mostly to handle .rela.bss and
2572
       .rela.plt.  We must create both sections in
2573
       create_dynamic_sections, because they must be created
2574
       before the linker maps input sections to output
2575
       sections.  The linker does that before
2576
       adjust_dynamic_symbol is called, and it is that
2577
       function which decides whether anything needs to go
2578
       into these sections.  */
2579
0
    s->flags |= SEC_EXCLUDE;
2580
0
    continue;
2581
0
  }
2582
2583
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
2584
0
  continue;
2585
2586
      /* Allocate memory for the section contents.  Zero the memory
2587
   for the benefit of .rela.plt, which has 4 unused entries
2588
   at the beginning, and we don't want garbage.  */
2589
0
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2590
0
      if (s->contents == NULL)
2591
0
  return false;
2592
0
      s->alloced = 1;
2593
0
    }
2594
2595
0
  if (elf_hash_table (info)->dynamic_sections_created)
2596
0
    {
2597
      /* Add some entries to the .dynamic section.  We fill in the
2598
   values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
2599
   must add the entries now so that we get the correct size for
2600
   the .dynamic section.  The DT_DEBUG entry is filled in by the
2601
   dynamic linker and used by the debugger.  */
2602
0
#define add_dynamic_entry(TAG, VAL) \
2603
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2604
2605
0
      if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
2606
0
                true))
2607
0
  return false;
2608
2609
0
      if (ABI_64_P (output_bfd))
2610
0
  {
2611
0
    int reg;
2612
0
    struct _bfd_sparc_elf_app_reg * app_regs;
2613
0
    struct elf_strtab_hash *dynstr;
2614
0
    struct elf_link_hash_table *eht = elf_hash_table (info);
2615
2616
    /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
2617
       entries if needed.  */
2618
0
    app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
2619
0
    dynstr = eht->dynstr;
2620
2621
0
    for (reg = 0; reg < 4; reg++)
2622
0
      if (app_regs [reg].name != NULL)
2623
0
        {
2624
0
    struct elf_link_local_dynamic_entry *entry, *e;
2625
2626
0
    if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
2627
0
      return false;
2628
2629
0
    entry = (struct elf_link_local_dynamic_entry *)
2630
0
      bfd_hash_allocate (&info->hash->table, sizeof (*entry));
2631
0
    if (entry == NULL)
2632
0
      return false;
2633
2634
    /* We cheat here a little bit: the symbol will not be local, so we
2635
       put it at the end of the dynlocal linked list.  We will fix it
2636
       later on, as we have to fix other fields anyway.  */
2637
0
    entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
2638
0
    entry->isym.st_size = 0;
2639
0
    if (*app_regs [reg].name != '\0')
2640
0
      entry->isym.st_name
2641
0
        = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, false);
2642
0
    else
2643
0
      entry->isym.st_name = 0;
2644
0
    entry->isym.st_other = 0;
2645
0
    entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
2646
0
               STT_REGISTER);
2647
0
    entry->isym.st_shndx = app_regs [reg].shndx;
2648
0
    entry->isym.st_target_internal = 0;
2649
0
    entry->next = NULL;
2650
0
    entry->input_bfd = output_bfd;
2651
0
    entry->input_indx = -1;
2652
2653
0
    if (eht->dynlocal == NULL)
2654
0
      eht->dynlocal = entry;
2655
0
    else
2656
0
      {
2657
0
        for (e = eht->dynlocal; e->next; e = e->next)
2658
0
          ;
2659
0
        e->next = entry;
2660
0
      }
2661
0
    eht->dynsymcount++;
2662
0
        }
2663
0
  }
2664
0
    }
2665
0
#undef add_dynamic_entry
2666
2667
0
  return true;
2668
0
}
2669

2670
bool
2671
_bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
2672
43.0k
{
2673
43.0k
  struct _bfd_sparc_elf_section_data *sdata;
2674
2675
43.0k
  sdata = bfd_zalloc (abfd, sizeof (*sdata));
2676
43.0k
  if (sdata == NULL)
2677
0
    return false;
2678
43.0k
  sec->used_by_bfd = sdata;
2679
2680
43.0k
  return _bfd_elf_new_section_hook (abfd, sec);
2681
43.0k
}
2682
2683
bool
2684
_bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
2685
            struct bfd_section *section,
2686
            struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2687
            bool *again)
2688
0
{
2689
0
  if (bfd_link_relocatable (link_info))
2690
0
    link_info->callbacks->fatal
2691
0
      (_("%P: --relax and -r may not be used together\n"));
2692
2693
0
  *again = false;
2694
0
  sec_do_relax (section) = 1;
2695
0
  return true;
2696
0
}
2697

2698
/* Return the base VMA address which should be subtracted from real addresses
2699
   when resolving @dtpoff relocation.
2700
   This is PT_TLS segment p_vaddr.  */
2701
2702
static bfd_vma
2703
dtpoff_base (struct bfd_link_info *info)
2704
0
{
2705
  /* If tls_sec is NULL, we should have signalled an error already.  */
2706
0
  if (elf_hash_table (info)->tls_sec == NULL)
2707
0
    return 0;
2708
0
  return elf_hash_table (info)->tls_sec->vma;
2709
0
}
2710
2711
/* Return the relocation value for @tpoff relocation
2712
   if STT_TLS virtual address is ADDRESS.  */
2713
2714
static bfd_vma
2715
tpoff (struct bfd_link_info *info, bfd_vma address)
2716
0
{
2717
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2718
0
  const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
2719
0
  bfd_vma static_tls_size;
2720
2721
  /* If tls_sec is NULL, we should have signalled an error already.  */
2722
0
  if (htab->tls_sec == NULL)
2723
0
    return 0;
2724
2725
  /* Consider special static TLS alignment requirements.  */
2726
0
  static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
2727
0
  return address - static_tls_size - htab->tls_sec->vma;
2728
0
}
2729
2730
/* Return the relocation value for a %gdop relocation.  */
2731
2732
static bfd_vma
2733
gdopoff (struct bfd_link_info *info, bfd_vma address)
2734
0
{
2735
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
2736
0
  bfd_vma got_base;
2737
2738
0
  got_base = (htab->hgot->root.u.def.value
2739
0
        + htab->hgot->root.u.def.section->output_offset
2740
0
        + htab->hgot->root.u.def.section->output_section->vma);
2741
2742
0
  return address - got_base;
2743
0
}
2744
2745
/* Return whether H is local and its ADDRESS is within 4G of
2746
   _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a
2747
   sethi, xor sequence.  */
2748
2749
static bool
2750
gdop_relative_offset_ok (struct bfd_link_info *info,
2751
       struct elf_link_hash_entry *h,
2752
       bfd_vma address ATTRIBUTE_UNUSED)
2753
0
{
2754
0
  if (!SYMBOL_REFERENCES_LOCAL (info, h))
2755
0
    return false;
2756
  /* If H is undefined, ADDRESS will be zero.  We can't allow a
2757
     relative offset to "zero" when producing PIEs or shared libs.
2758
     Note that to get here with an undefined symbol it must also be
2759
     hidden or internal visibility.  */
2760
0
  if (bfd_link_pic (info)
2761
0
      && h != NULL
2762
0
      && (h->root.type == bfd_link_hash_undefweak
2763
0
    || h->root.type == bfd_link_hash_undefined))
2764
0
    return false;
2765
0
#ifdef BFD64
2766
0
  return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32;
2767
#else
2768
  return true;
2769
#endif
2770
0
}
2771
2772
/* Relocate a SPARC ELF section.  */
2773
2774
int
2775
_bfd_sparc_elf_relocate_section (bfd *output_bfd,
2776
         struct bfd_link_info *info,
2777
         bfd *input_bfd,
2778
         asection *input_section,
2779
         bfd_byte *contents,
2780
         Elf_Internal_Rela *relocs,
2781
         Elf_Internal_Sym *local_syms,
2782
         asection **local_sections)
2783
0
{
2784
0
  struct _bfd_sparc_elf_link_hash_table *htab;
2785
0
  Elf_Internal_Shdr *symtab_hdr;
2786
0
  struct elf_link_hash_entry **sym_hashes;
2787
0
  bfd_vma *local_got_offsets;
2788
0
  bfd_vma got_base;
2789
0
  asection *sreloc;
2790
0
  Elf_Internal_Rela *rel;
2791
0
  Elf_Internal_Rela *relend;
2792
0
  int num_relocs;
2793
0
  bool is_vxworks_tls;
2794
2795
0
  htab = _bfd_sparc_elf_hash_table (info);
2796
0
  BFD_ASSERT (htab != NULL);
2797
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
2798
0
  sym_hashes = elf_sym_hashes (input_bfd);
2799
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
2800
2801
0
  if (elf_hash_table (info)->hgot == NULL)
2802
0
    got_base = 0;
2803
0
  else
2804
0
    got_base = elf_hash_table (info)->hgot->root.u.def.value;
2805
2806
0
  sreloc = elf_section_data (input_section)->sreloc;
2807
  /* We have to handle relocations in vxworks .tls_vars sections
2808
     specially, because the dynamic loader is 'weird'.  */
2809
0
  is_vxworks_tls = (htab->elf.target_os == is_vxworks
2810
0
        && bfd_link_pic (info)
2811
0
        && !strcmp (input_section->output_section->name,
2812
0
        ".tls_vars"));
2813
2814
0
  rel = relocs;
2815
0
  if (ABI_64_P (output_bfd))
2816
0
    num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
2817
0
  else
2818
0
    num_relocs = input_section->reloc_count;
2819
0
  relend = relocs + num_relocs;
2820
0
  for (; rel < relend; rel++)
2821
0
    {
2822
0
      int r_type, tls_type;
2823
0
      reloc_howto_type *howto;
2824
0
      unsigned long r_symndx;
2825
0
      struct elf_link_hash_entry *h;
2826
0
      struct _bfd_sparc_elf_link_hash_entry *eh;
2827
0
      Elf_Internal_Sym *sym;
2828
0
      asection *sec;
2829
0
      bfd_vma relocation, off;
2830
0
      bfd_reloc_status_type r;
2831
0
      bool is_plt = false;
2832
0
      bool unresolved_reloc;
2833
0
      bool resolved_to_zero;
2834
0
      bool relative_reloc;
2835
2836
0
      r_type = SPARC_ELF_R_TYPE (rel->r_info);
2837
0
      if (r_type == R_SPARC_GNU_VTINHERIT
2838
0
    || r_type == R_SPARC_GNU_VTENTRY)
2839
0
  continue;
2840
2841
0
      if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2842
0
  {
2843
0
    bfd_set_error (bfd_error_bad_value);
2844
0
    return false;
2845
0
  }
2846
2847
0
      howto = _bfd_sparc_elf_howto_table + r_type;
2848
0
      r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
2849
0
      h = NULL;
2850
0
      sym = NULL;
2851
0
      sec = NULL;
2852
0
      unresolved_reloc = false;
2853
0
      if (r_symndx < symtab_hdr->sh_info)
2854
0
  {
2855
0
    sym = local_syms + r_symndx;
2856
0
    sec = local_sections[r_symndx];
2857
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2858
2859
0
    if (!bfd_link_relocatable (info)
2860
0
        && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2861
0
      {
2862
        /* Relocate against local STT_GNU_IFUNC symbol.  */
2863
0
        h = elf_sparc_get_local_sym_hash (htab, input_bfd,
2864
0
            rel, false);
2865
0
        if (h == NULL)
2866
0
    abort ();
2867
2868
        /* Set STT_GNU_IFUNC symbol value.  */
2869
0
        h->root.u.def.value = sym->st_value;
2870
0
        h->root.u.def.section = sec;
2871
0
      }
2872
0
  }
2873
0
      else
2874
0
  {
2875
0
    bool warned, ignored;
2876
2877
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2878
0
           r_symndx, symtab_hdr, sym_hashes,
2879
0
           h, sec, relocation,
2880
0
           unresolved_reloc, warned, ignored);
2881
0
    if (warned)
2882
0
      {
2883
        /* To avoid generating warning messages about truncated
2884
     relocations, set the relocation's address to be the same as
2885
     the start of this section.  */
2886
0
        if (input_section->output_section != NULL)
2887
0
    relocation = input_section->output_section->vma;
2888
0
        else
2889
0
    relocation = 0;
2890
0
      }
2891
0
  }
2892
2893
0
      if (sec != NULL && discarded_section (sec))
2894
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2895
0
           rel, 1, relend, howto, 0, contents);
2896
2897
0
      if (bfd_link_relocatable (info))
2898
0
  continue;
2899
2900
0
      if (h != NULL
2901
0
    && h->type == STT_GNU_IFUNC
2902
0
    && h->def_regular)
2903
0
  {
2904
0
    asection *plt_sec;
2905
0
    const char *name;
2906
2907
0
    if ((input_section->flags & SEC_ALLOC) == 0
2908
0
        || h->plt.offset == (bfd_vma) -1)
2909
0
      {
2910
        /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2911
           STT_GNU_IFUNC symbol as STT_FUNC.  */
2912
0
        if (elf_section_type (input_section) == SHT_NOTE)
2913
0
    goto skip_ifunc;
2914
2915
        /* Dynamic relocs are not propagated for SEC_DEBUGGING
2916
     sections because such sections are not SEC_ALLOC and
2917
     thus ld.so will not process them.  */
2918
0
        if ((input_section->flags & SEC_ALLOC) == 0
2919
0
      && (input_section->flags & SEC_DEBUGGING) != 0)
2920
0
    continue;
2921
2922
0
        _bfd_error_handler
2923
    /* xgettext:c-format */
2924
0
    (_("%pB(%pA+%#" PRIx64 "): "
2925
0
       "unresolvable %s relocation against symbol `%s'"),
2926
0
     input_bfd,
2927
0
     input_section,
2928
0
     (uint64_t) rel->r_offset,
2929
0
     howto->name,
2930
0
     h->root.root.string);
2931
0
        bfd_set_error (bfd_error_bad_value);
2932
0
        return false;
2933
0
      }
2934
2935
0
    plt_sec = htab->elf.splt;
2936
0
    if (! plt_sec)
2937
0
      plt_sec =htab->elf.iplt;
2938
2939
0
    switch (r_type)
2940
0
      {
2941
0
      case R_SPARC_GOTDATA_OP:
2942
0
        continue;
2943
2944
0
      case R_SPARC_GOTDATA_OP_HIX22:
2945
0
      case R_SPARC_GOTDATA_OP_LOX10:
2946
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
2947
0
      ? R_SPARC_GOT22
2948
0
      : R_SPARC_GOT10);
2949
0
        howto = _bfd_sparc_elf_howto_table + r_type;
2950
        /* Fall through.  */
2951
2952
0
      case R_SPARC_GOT10:
2953
0
      case R_SPARC_GOT13:
2954
0
      case R_SPARC_GOT22:
2955
0
        if (htab->elf.sgot == NULL)
2956
0
    abort ();
2957
0
        off = h->got.offset;
2958
0
        if (off == (bfd_vma) -1)
2959
0
    abort();
2960
0
        relocation = htab->elf.sgot->output_offset + off - got_base;
2961
0
        goto do_relocation;
2962
2963
0
      case R_SPARC_WPLT30:
2964
0
      case R_SPARC_WDISP30:
2965
0
        relocation = (plt_sec->output_section->vma
2966
0
          + plt_sec->output_offset + h->plt.offset);
2967
0
        goto do_relocation;
2968
2969
0
      case R_SPARC_32:
2970
0
      case R_SPARC_64:
2971
0
        if (bfd_link_pic (info) && h->non_got_ref)
2972
0
    {
2973
0
      Elf_Internal_Rela outrel;
2974
0
      bfd_vma offset;
2975
2976
0
      offset = _bfd_elf_section_offset (output_bfd, info,
2977
0
                input_section,
2978
0
                rel->r_offset);
2979
0
      if (offset == (bfd_vma) -1
2980
0
          || offset == (bfd_vma) -2)
2981
0
        abort();
2982
2983
0
      outrel.r_offset = (input_section->output_section->vma
2984
0
             + input_section->output_offset
2985
0
             + offset);
2986
2987
0
      if (h->dynindx == -1
2988
0
          || h->forced_local
2989
0
          || bfd_link_executable (info))
2990
0
        {
2991
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2992
0
              0, R_SPARC_IRELATIVE);
2993
0
          outrel.r_addend = relocation + rel->r_addend;
2994
0
        }
2995
0
      else
2996
0
        {
2997
0
          if (h->dynindx == -1)
2998
0
      abort();
2999
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3000
0
          outrel.r_addend = rel->r_addend;
3001
0
        }
3002
3003
0
      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3004
0
      continue;
3005
0
    }
3006
3007
0
        relocation = (plt_sec->output_section->vma
3008
0
          + plt_sec->output_offset + h->plt.offset);
3009
0
        goto do_relocation;
3010
3011
0
      case R_SPARC_HI22:
3012
0
      case R_SPARC_LO10:
3013
        /* We should only see such relocs in static links.  */
3014
0
        if (bfd_link_pic (info))
3015
0
    abort();
3016
0
        relocation = (plt_sec->output_section->vma
3017
0
          + plt_sec->output_offset + h->plt.offset);
3018
0
        goto do_relocation;
3019
3020
0
      default:
3021
0
        if (h->root.root.string)
3022
0
    name = h->root.root.string;
3023
0
        else
3024
0
    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3025
0
           NULL);
3026
0
        _bfd_error_handler
3027
    /* xgettext:c-format */
3028
0
    (_("%pB: relocation %s against STT_GNU_IFUNC "
3029
0
       "symbol `%s' isn't handled by %s"), input_bfd,
3030
0
     _bfd_sparc_elf_howto_table[r_type].name,
3031
0
     name, __func__);
3032
0
        bfd_set_error (bfd_error_bad_value);
3033
0
        return false;
3034
0
      }
3035
0
  }
3036
3037
0
    skip_ifunc:
3038
0
      eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
3039
0
      resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
3040
3041
0
      switch (r_type)
3042
0
  {
3043
0
  case R_SPARC_GOTDATA_OP_HIX22:
3044
0
  case R_SPARC_GOTDATA_OP_LOX10:
3045
0
    if (gdop_relative_offset_ok (info, h, relocation))
3046
0
      {
3047
0
        r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3048
0
      ? R_SPARC_GOTDATA_HIX22
3049
0
      : R_SPARC_GOTDATA_LOX10);
3050
0
        howto = _bfd_sparc_elf_howto_table + r_type;
3051
0
      }
3052
0
    break;
3053
3054
0
  case R_SPARC_GOTDATA_OP:
3055
0
    if (gdop_relative_offset_ok (info, h, relocation))
3056
0
      {
3057
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3058
3059
        /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
3060
0
        relocation = 0x80000000 | (insn & 0x3e07c01f);
3061
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3062
3063
        /* If the symbol is global but not dynamic, an .rela.* slot has
3064
     been allocated for it in the GOT so output R_SPARC_NONE here,
3065
     if it isn't also subject to another, old-style GOT relocation.
3066
     See also the handling of these GOT relocations just below.  */
3067
0
        if (h != NULL
3068
0
      && h->dynindx == -1
3069
0
      && !h->forced_local
3070
0
      && h->root.type != bfd_link_hash_undefweak
3071
0
      && !eh->has_old_style_got_reloc
3072
0
      && (h->got.offset & 1) == 0
3073
0
      && bfd_link_pic (info))
3074
0
    {
3075
0
      asection *s = htab->elf.srelgot;
3076
0
      Elf_Internal_Rela outrel;
3077
3078
0
      BFD_ASSERT (s != NULL);
3079
3080
0
      memset (&outrel, 0, sizeof outrel);
3081
0
      sparc_elf_append_rela (output_bfd, s, &outrel);
3082
0
      h->got.offset |= 1;
3083
0
    }
3084
0
      }
3085
0
    continue;
3086
0
  }
3087
3088
0
      switch (r_type)
3089
0
  {
3090
0
  case R_SPARC_GOTDATA_HIX22:
3091
0
  case R_SPARC_GOTDATA_LOX10:
3092
0
    relocation = gdopoff (info, relocation);
3093
0
    break;
3094
3095
0
  case R_SPARC_GOTDATA_OP_HIX22:
3096
0
  case R_SPARC_GOTDATA_OP_LOX10:
3097
0
  case R_SPARC_GOT10:
3098
0
  case R_SPARC_GOT13:
3099
0
  case R_SPARC_GOT22:
3100
    /* Relocation is to the entry for this symbol in the global
3101
       offset table.  */
3102
0
    if (htab->elf.sgot == NULL)
3103
0
      abort ();
3104
3105
0
    relative_reloc = false;
3106
0
    if (h != NULL)
3107
0
      {
3108
0
        bool dyn;
3109
3110
0
        off = h->got.offset;
3111
0
        BFD_ASSERT (off != (bfd_vma) -1);
3112
0
        dyn = elf_hash_table (info)->dynamic_sections_created;
3113
3114
0
        if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3115
0
                 bfd_link_pic (info),
3116
0
                 h)
3117
0
      || (bfd_link_pic (info)
3118
0
          && SYMBOL_REFERENCES_LOCAL (info, h)))
3119
0
    {
3120
      /* This is actually a static link, or it is a
3121
         -Bsymbolic link and the symbol is defined
3122
         locally, or the symbol was forced to be local
3123
         because of a version file.  We must initialize
3124
         this entry in the global offset table.  Since the
3125
         offset must always be a multiple of 8 for 64-bit
3126
         and 4 for 32-bit, we use the least significant bit
3127
         to record whether we have initialized it already.
3128
3129
         When doing a dynamic link, we create a .rela.got
3130
         relocation entry to initialize the value.  This
3131
         is done in the finish_dynamic_symbol routine.  */
3132
0
      if ((off & 1) != 0)
3133
0
        off &= ~1;
3134
0
      else
3135
0
        {
3136
          /* If this symbol isn't dynamic in PIC mode, treat it
3137
       like a local symbol in PIC mode below.  */
3138
0
          if (h->dynindx == -1
3139
0
        && !h->forced_local
3140
0
        && h->root.type != bfd_link_hash_undefweak
3141
0
        && bfd_link_pic (info))
3142
0
      relative_reloc = true;
3143
0
          else
3144
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3145
0
              htab->elf.sgot->contents + off);
3146
0
          h->got.offset |= 1;
3147
0
        }
3148
0
    }
3149
0
        else
3150
0
    unresolved_reloc = false;
3151
0
      }
3152
0
    else
3153
0
      {
3154
0
        BFD_ASSERT (local_got_offsets != NULL
3155
0
        && local_got_offsets[r_symndx] != (bfd_vma) -1);
3156
3157
0
        off = local_got_offsets[r_symndx];
3158
3159
        /* The offset must always be a multiple of 8 on 64-bit and
3160
     4 on 32-bit.  We use the least significant bit to record
3161
     whether we have already processed this entry.  */
3162
0
        if ((off & 1) != 0)
3163
0
    off &= ~1;
3164
0
        else
3165
0
    {
3166
      /* For a local symbol in PIC mode, we need to generate a
3167
         R_SPARC_RELATIVE reloc for the dynamic linker.  */
3168
0
      if (bfd_link_pic (info))
3169
0
        relative_reloc = true;
3170
0
      else
3171
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3172
0
          htab->elf.sgot->contents + off);
3173
0
      local_got_offsets[r_symndx] |= 1;
3174
0
    }
3175
0
      }
3176
3177
0
    if (relative_reloc)
3178
0
      {
3179
0
        asection *s = htab->elf.srelgot;
3180
0
        Elf_Internal_Rela outrel;
3181
3182
0
        BFD_ASSERT (s != NULL);
3183
3184
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3185
0
         + htab->elf.sgot->output_offset
3186
0
         + off);
3187
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3188
0
            0, R_SPARC_RELATIVE);
3189
0
        outrel.r_addend = relocation;
3190
0
        sparc_elf_append_rela (output_bfd, s, &outrel);
3191
        /* Versions of glibc ld.so at least up to 2.26 wrongly
3192
     add the section contents to the value calculated for
3193
     a RELATIVE reloc.  Zero the contents to work around
3194
     this bug.  */
3195
0
        relocation = 0;
3196
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3197
0
          htab->elf.sgot->contents + off);
3198
0
      }
3199
3200
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3201
0
    break;
3202
3203
0
  case R_SPARC_PLT32:
3204
0
  case R_SPARC_PLT64:
3205
0
    if (h == NULL || h->plt.offset == (bfd_vma) -1)
3206
0
      {
3207
0
        r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
3208
0
        goto r_sparc_plt32;
3209
0
      }
3210
    /* Fall through.  */
3211
3212
0
  case R_SPARC_WPLT30:
3213
0
  case R_SPARC_HIPLT22:
3214
0
  case R_SPARC_LOPLT10:
3215
0
  case R_SPARC_PCPLT32:
3216
0
  case R_SPARC_PCPLT22:
3217
0
  case R_SPARC_PCPLT10:
3218
0
  r_sparc_wplt30:
3219
    /* Relocation is to the entry for this symbol in the
3220
       procedure linkage table.  */
3221
3222
0
    if (! ABI_64_P (output_bfd))
3223
0
      {
3224
        /* The Solaris native assembler will generate a WPLT30 reloc
3225
     for a local symbol if you assemble a call from one
3226
     section to another when using -K pic.  We treat it as
3227
     WDISP30.  */
3228
0
        if (h == NULL)
3229
0
    break;
3230
0
      }
3231
    /* PR 7027: We need similar behaviour for 64-bit binaries.  */
3232
0
    else if (r_type == R_SPARC_WPLT30 && h == NULL)
3233
0
      break;
3234
0
    else
3235
0
      {
3236
0
        BFD_ASSERT (h != NULL);
3237
0
      }
3238
3239
0
    if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3240
0
      {
3241
        /* We didn't make a PLT entry for this symbol.  This
3242
     happens when statically linking PIC code, or when
3243
     using -Bsymbolic.  */
3244
0
        break;
3245
0
      }
3246
3247
0
    relocation = (htab->elf.splt->output_section->vma
3248
0
      + htab->elf.splt->output_offset
3249
0
      + h->plt.offset);
3250
0
    unresolved_reloc = false;
3251
0
    if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
3252
0
      {
3253
0
        r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
3254
0
        is_plt = true;
3255
0
        goto r_sparc_plt32;
3256
0
      }
3257
0
    break;
3258
3259
0
  case R_SPARC_PC10:
3260
0
  case R_SPARC_PC22:
3261
0
  case R_SPARC_PC_HH22:
3262
0
  case R_SPARC_PC_HM10:
3263
0
  case R_SPARC_PC_LM22:
3264
0
    if (h != NULL && h == htab->elf.hgot)
3265
0
      break;
3266
    /* Fall through.  */
3267
0
  case R_SPARC_DISP8:
3268
0
  case R_SPARC_DISP16:
3269
0
  case R_SPARC_DISP32:
3270
0
  case R_SPARC_DISP64:
3271
0
  case R_SPARC_WDISP30:
3272
0
  case R_SPARC_WDISP22:
3273
0
  case R_SPARC_WDISP19:
3274
0
  case R_SPARC_WDISP16:
3275
0
  case R_SPARC_WDISP10:
3276
0
  case R_SPARC_8:
3277
0
  case R_SPARC_16:
3278
0
  case R_SPARC_32:
3279
0
  case R_SPARC_HI22:
3280
0
  case R_SPARC_22:
3281
0
  case R_SPARC_13:
3282
0
  case R_SPARC_LO10:
3283
0
  case R_SPARC_UA16:
3284
0
  case R_SPARC_UA32:
3285
0
  case R_SPARC_10:
3286
0
  case R_SPARC_11:
3287
0
  case R_SPARC_64:
3288
0
  case R_SPARC_OLO10:
3289
0
  case R_SPARC_HH22:
3290
0
  case R_SPARC_HM10:
3291
0
  case R_SPARC_LM22:
3292
0
  case R_SPARC_7:
3293
0
  case R_SPARC_5:
3294
0
  case R_SPARC_6:
3295
0
  case R_SPARC_HIX22:
3296
0
  case R_SPARC_LOX10:
3297
0
  case R_SPARC_H44:
3298
0
  case R_SPARC_M44:
3299
0
  case R_SPARC_L44:
3300
0
  case R_SPARC_H34:
3301
0
  case R_SPARC_UA64:
3302
0
  r_sparc_plt32:
3303
0
    if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls)
3304
0
      break;
3305
3306
    /* Copy dynamic function pointer relocations.  Don't generate
3307
       dynamic relocations against resolved undefined weak symbols
3308
       in PIE.  */
3309
0
    if ((bfd_link_pic (info)
3310
0
         && (h == NULL
3311
0
       || !(h->root.type == bfd_link_hash_undefweak
3312
0
      && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3313
0
          || resolved_to_zero)))
3314
0
         && (! howto->pc_relative
3315
0
       || !SYMBOL_CALLS_LOCAL (info, h)))
3316
0
        || (!bfd_link_pic (info)
3317
0
      && h != NULL
3318
0
      && h->dynindx != -1
3319
0
      && !h->non_got_ref
3320
0
      && ((h->def_dynamic
3321
0
           && !h->def_regular)
3322
0
          || (h->root.type == bfd_link_hash_undefweak
3323
0
        && !resolved_to_zero)
3324
0
          || h->root.type == bfd_link_hash_undefined)))
3325
0
      {
3326
0
        Elf_Internal_Rela outrel;
3327
0
        bool skip, relocate = false;
3328
3329
        /* When generating a shared object, these relocations
3330
     are copied into the output file to be resolved at run
3331
     time.  */
3332
3333
0
        BFD_ASSERT (sreloc != NULL);
3334
3335
0
        skip = false;
3336
3337
0
        outrel.r_offset =
3338
0
    _bfd_elf_section_offset (output_bfd, info, input_section,
3339
0
           rel->r_offset);
3340
0
        if (outrel.r_offset == (bfd_vma) -1)
3341
0
    skip = true;
3342
0
        else if (outrel.r_offset == (bfd_vma) -2)
3343
0
    skip = true, relocate = true;
3344
0
        outrel.r_offset += (input_section->output_section->vma
3345
0
          + input_section->output_offset);
3346
3347
        /* Optimize unaligned reloc usage now that we know where
3348
     it finally resides.  */
3349
0
        switch (r_type)
3350
0
    {
3351
0
    case R_SPARC_16:
3352
0
      if (outrel.r_offset & 1)
3353
0
        r_type = R_SPARC_UA16;
3354
0
      break;
3355
0
    case R_SPARC_UA16:
3356
0
      if (!(outrel.r_offset & 1))
3357
0
        r_type = R_SPARC_16;
3358
0
      break;
3359
0
    case R_SPARC_32:
3360
0
      if (outrel.r_offset & 3)
3361
0
        r_type = R_SPARC_UA32;
3362
0
      break;
3363
0
    case R_SPARC_UA32:
3364
0
      if (!(outrel.r_offset & 3))
3365
0
        r_type = R_SPARC_32;
3366
0
      break;
3367
0
    case R_SPARC_64:
3368
0
      if (outrel.r_offset & 7)
3369
0
        r_type = R_SPARC_UA64;
3370
0
      break;
3371
0
    case R_SPARC_UA64:
3372
0
      if (!(outrel.r_offset & 7))
3373
0
        r_type = R_SPARC_64;
3374
0
      break;
3375
0
    case R_SPARC_DISP8:
3376
0
    case R_SPARC_DISP16:
3377
0
    case R_SPARC_DISP32:
3378
0
    case R_SPARC_DISP64:
3379
      /* If the symbol is not dynamic, we should not keep
3380
         a dynamic relocation.  But an .rela.* slot has been
3381
         allocated for it, output R_SPARC_NONE.
3382
         FIXME: Add code tracking needed dynamic relocs as
3383
         e.g. i386 has.  */
3384
0
      if (h->dynindx == -1)
3385
0
        skip = true, relocate = true;
3386
0
      break;
3387
0
    }
3388
3389
0
        if (skip)
3390
0
    memset (&outrel, 0, sizeof outrel);
3391
        /* h->dynindx may be -1 if the symbol was marked to
3392
     become local.  */
3393
0
        else if (h != NULL
3394
0
           && h->dynindx != -1
3395
0
           && (_bfd_sparc_elf_howto_table[r_type].pc_relative
3396
0
         || !bfd_link_pic (info)
3397
0
         || !SYMBOLIC_BIND (info, h)
3398
0
         || !h->def_regular))
3399
0
    {
3400
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3401
0
      outrel.r_addend = rel->r_addend;
3402
0
    }
3403
0
        else
3404
0
    {
3405
0
      if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
3406
0
          || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
3407
0
        {
3408
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3409
0
              0, R_SPARC_RELATIVE);
3410
0
          outrel.r_addend = relocation + rel->r_addend;
3411
0
        }
3412
0
      else
3413
0
        {
3414
0
          long indx;
3415
3416
0
          outrel.r_addend = relocation + rel->r_addend;
3417
3418
0
          if (is_plt)
3419
0
      sec = htab->elf.splt;
3420
3421
0
          if (bfd_is_abs_section (sec))
3422
0
      indx = 0;
3423
0
          else if (sec == NULL || sec->owner == NULL)
3424
0
      {
3425
0
        bfd_set_error (bfd_error_bad_value);
3426
0
        return false;
3427
0
      }
3428
0
          else
3429
0
      {
3430
0
        asection *osec;
3431
3432
        /* We are turning this relocation into one
3433
           against a section symbol.  It would be
3434
           proper to subtract the symbol's value,
3435
           osec->vma, from the emitted reloc addend,
3436
           but ld.so expects buggy relocs.  */
3437
0
        osec = sec->output_section;
3438
0
        indx = elf_section_data (osec)->dynindx;
3439
3440
0
        if (indx == 0)
3441
0
          {
3442
0
            osec = htab->elf.text_index_section;
3443
0
            indx = elf_section_data (osec)->dynindx;
3444
0
          }
3445
3446
        /* FIXME: we really should be able to link non-pic
3447
           shared libraries.  */
3448
0
        if (indx == 0)
3449
0
          {
3450
0
            BFD_FAIL ();
3451
0
            _bfd_error_handler
3452
0
        (_("%pB: probably compiled without -fPIC?"),
3453
0
         input_bfd);
3454
0
            bfd_set_error (bfd_error_bad_value);
3455
0
            return false;
3456
0
          }
3457
0
      }
3458
3459
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3460
0
              r_type);
3461
0
        }
3462
0
    }
3463
3464
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3465
3466
        /* This reloc will be computed at runtime, so there's no
3467
     need to do anything now.  */
3468
0
        if (! relocate)
3469
0
    continue;
3470
0
      }
3471
0
    break;
3472
3473
0
  case R_SPARC_TLS_GD_HI22:
3474
0
  case R_SPARC_TLS_GD_LO10:
3475
0
  case R_SPARC_TLS_IE_HI22:
3476
0
  case R_SPARC_TLS_IE_LO10:
3477
0
    r_type = sparc_elf_tls_transition (info, input_bfd, r_type,
3478
0
               h == NULL || h->dynindx == -1);
3479
0
    if (r_type == R_SPARC_REV32)
3480
0
      break;
3481
0
    if (h != NULL)
3482
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3483
0
    else if (local_got_offsets)
3484
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3485
0
    else
3486
0
      tls_type = GOT_UNKNOWN;
3487
0
    if (tls_type == GOT_TLS_IE)
3488
0
      switch (r_type)
3489
0
        {
3490
0
        case R_SPARC_TLS_GD_HI22:
3491
0
    r_type = R_SPARC_TLS_IE_HI22;
3492
0
    break;
3493
0
        case R_SPARC_TLS_GD_LO10:
3494
0
    r_type = R_SPARC_TLS_IE_LO10;
3495
0
    break;
3496
0
        }
3497
3498
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3499
0
      {
3500
0
        relocation = tpoff (info, relocation);
3501
0
        break;
3502
0
      }
3503
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3504
0
      {
3505
        /* Change add into xor.  */
3506
0
        relocation = tpoff (info, relocation);
3507
0
        bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3508
0
               contents + rel->r_offset)
3509
0
               | 0x80182000), contents + rel->r_offset);
3510
0
        break;
3511
0
      }
3512
3513
0
    if (h != NULL)
3514
0
      {
3515
0
        off = h->got.offset;
3516
0
        h->got.offset |= 1;
3517
0
      }
3518
0
    else
3519
0
      {
3520
0
        BFD_ASSERT (local_got_offsets != NULL);
3521
0
        off = local_got_offsets[r_symndx];
3522
0
        local_got_offsets[r_symndx] |= 1;
3523
0
      }
3524
3525
0
  r_sparc_tlsldm:
3526
0
    if (htab->elf.sgot == NULL)
3527
0
      abort ();
3528
3529
0
    if ((off & 1) != 0)
3530
0
      off &= ~1;
3531
0
    else
3532
0
      {
3533
0
        Elf_Internal_Rela outrel;
3534
0
        int dr_type, indx;
3535
3536
0
        if (htab->elf.srelgot == NULL)
3537
0
    abort ();
3538
3539
0
        SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3540
0
          htab->elf.sgot->contents + off);
3541
0
        outrel.r_offset = (htab->elf.sgot->output_section->vma
3542
0
         + htab->elf.sgot->output_offset + off);
3543
0
        indx = h && h->dynindx != -1 ? h->dynindx : 0;
3544
0
        if (r_type == R_SPARC_TLS_IE_HI22
3545
0
      || r_type == R_SPARC_TLS_IE_LO10)
3546
0
    dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3547
0
        else
3548
0
    dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3549
0
        if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3550
0
    outrel.r_addend = relocation - dtpoff_base (info);
3551
0
        else
3552
0
    outrel.r_addend = 0;
3553
0
        outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3554
0
        sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3555
3556
0
        if (r_type == R_SPARC_TLS_GD_HI22
3557
0
      || r_type == R_SPARC_TLS_GD_LO10)
3558
0
    {
3559
0
      if (indx == 0)
3560
0
        {
3561
0
          BFD_ASSERT (! unresolved_reloc);
3562
0
          SPARC_ELF_PUT_WORD (htab, output_bfd,
3563
0
            relocation - dtpoff_base (info),
3564
0
            (htab->elf.sgot->contents + off
3565
0
             + SPARC_ELF_WORD_BYTES (htab)));
3566
0
        }
3567
0
      else
3568
0
        {
3569
0
          SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3570
0
            (htab->elf.sgot->contents + off
3571
0
             + SPARC_ELF_WORD_BYTES (htab)));
3572
0
          outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3573
0
              SPARC_ELF_DTPOFF_RELOC (htab));
3574
0
          outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3575
0
          sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3576
0
               &outrel);
3577
0
        }
3578
0
    }
3579
0
        else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3580
0
    {
3581
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3582
0
              (htab->elf.sgot->contents + off
3583
0
               + SPARC_ELF_WORD_BYTES (htab)));
3584
0
    }
3585
0
      }
3586
3587
0
    if (off >= (bfd_vma) -2)
3588
0
      abort ();
3589
3590
0
    relocation = htab->elf.sgot->output_offset + off - got_base;
3591
0
    unresolved_reloc = false;
3592
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3593
0
    break;
3594
3595
0
  case R_SPARC_TLS_LDM_HI22:
3596
0
  case R_SPARC_TLS_LDM_LO10:
3597
    /* LD -> LE */
3598
0
    if (bfd_link_executable (info))
3599
0
      {
3600
0
        bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3601
0
        continue;
3602
0
      }
3603
0
    off = htab->tls_ldm_got.offset;
3604
0
    htab->tls_ldm_got.offset |= 1;
3605
0
    goto r_sparc_tlsldm;
3606
3607
0
  case R_SPARC_TLS_LDO_HIX22:
3608
0
  case R_SPARC_TLS_LDO_LOX10:
3609
    /* LD -> LE */
3610
0
    if (bfd_link_executable (info))
3611
0
      {
3612
0
        if (r_type == R_SPARC_TLS_LDO_HIX22)
3613
0
    r_type = R_SPARC_TLS_LE_HIX22;
3614
0
        else
3615
0
    r_type = R_SPARC_TLS_LE_LOX10;
3616
0
      }
3617
0
    else
3618
0
      {
3619
0
        relocation -= dtpoff_base (info);
3620
0
        break;
3621
0
      }
3622
    /* Fall through.  */
3623
3624
0
  case R_SPARC_TLS_LE_HIX22:
3625
0
  case R_SPARC_TLS_LE_LOX10:
3626
0
    if (!bfd_link_executable (info))
3627
0
      {
3628
0
        Elf_Internal_Rela outrel;
3629
0
        bfd_vma offset
3630
0
    = _bfd_elf_section_offset (output_bfd, info, input_section,
3631
0
             rel->r_offset);
3632
0
        if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2)
3633
0
    memset (&outrel, 0, sizeof outrel);
3634
0
        else
3635
0
    {
3636
0
      outrel.r_offset = offset
3637
0
            + input_section->output_section->vma
3638
0
            + input_section->output_offset;
3639
0
      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3640
0
      outrel.r_addend
3641
0
        = relocation - dtpoff_base (info) + rel->r_addend;
3642
0
    }
3643
3644
0
        BFD_ASSERT (sreloc != NULL);
3645
0
        sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3646
0
        continue;
3647
0
      }
3648
0
    relocation = tpoff (info, relocation);
3649
0
    break;
3650
3651
0
  case R_SPARC_TLS_LDM_CALL:
3652
    /* LD -> LE */
3653
0
    if (bfd_link_executable (info))
3654
0
      {
3655
        /* mov %g0, %o0 */
3656
0
        bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3657
0
        continue;
3658
0
      }
3659
    /* Fall through */
3660
3661
0
  case R_SPARC_TLS_GD_CALL:
3662
0
    if (h != NULL)
3663
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3664
0
    else if (local_got_offsets)
3665
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3666
0
    else
3667
0
      tls_type = GOT_UNKNOWN;
3668
    /* GD -> IE or LE */
3669
0
    if (bfd_link_executable (info)
3670
0
        || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3671
0
      {
3672
0
        Elf_Internal_Rela *rel2;
3673
0
        bfd_vma insn;
3674
3675
        /* GD -> LE */
3676
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3677
0
    {
3678
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3679
0
      continue;
3680
0
    }
3681
3682
        /* GD -> IE */
3683
0
        if (rel + 1 < relend
3684
0
      && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3685
0
      && rel[1].r_offset == rel->r_offset + 4
3686
0
      && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3687
0
      && (((insn = bfd_get_32 (input_bfd,
3688
0
             contents + rel[1].r_offset))
3689
0
           >> 25) & 0x1f) == 8)
3690
0
    {
3691
      /* We have
3692
         call __tls_get_addr, %tgd_call(foo)
3693
          add %reg1, %reg2, %o0, %tgd_add(foo)
3694
         and change it into IE:
3695
         {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3696
         add %g7, %o0, %o0, %tie_add(foo).
3697
         add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3698
         ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3699
         ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
3700
0
      bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3701
0
            contents + rel->r_offset);
3702
0
      bfd_put_32 (output_bfd, 0x9001c008,
3703
0
            contents + rel->r_offset + 4);
3704
0
      rel++;
3705
0
      continue;
3706
0
    }
3707
3708
        /* We cannot just overwrite the delay slot instruction,
3709
     as it might be what puts the %o0 argument to
3710
     __tls_get_addr into place.  So we have to transpose
3711
     the delay slot with the add we patch in.  */
3712
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3713
0
        bfd_put_32 (output_bfd, insn,
3714
0
        contents + rel->r_offset);
3715
0
        bfd_put_32 (output_bfd, 0x9001c008,
3716
0
        contents + rel->r_offset + 4);
3717
3718
0
        rel2 = rel;
3719
0
        while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
3720
0
                rel->r_offset + 4))
3721
0
         != NULL)
3722
0
    {
3723
      /* If the instruction we moved has a relocation attached to
3724
         it, adjust the offset so that it will apply to the correct
3725
         instruction.  */
3726
0
      rel2->r_offset -= 4;
3727
0
    }
3728
0
        continue;
3729
0
      }
3730
3731
0
    h = (struct elf_link_hash_entry *)
3732
0
        bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
3733
0
            false, true);
3734
0
    BFD_ASSERT (h != NULL);
3735
0
    r_type = R_SPARC_WPLT30;
3736
0
    howto = _bfd_sparc_elf_howto_table + r_type;
3737
0
    goto r_sparc_wplt30;
3738
3739
0
  case R_SPARC_TLS_GD_ADD:
3740
0
    if (h != NULL)
3741
0
      tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3742
0
    else if (local_got_offsets)
3743
0
      tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3744
0
    else
3745
0
      tls_type = GOT_UNKNOWN;
3746
    /* GD -> IE or LE */
3747
0
    if (bfd_link_executable (info) || tls_type == GOT_TLS_IE)
3748
0
      {
3749
        /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3750
     changed into IE:
3751
     {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3752
     or LE:
3753
     add %g7, %reg2, %reg3.  */
3754
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3755
0
        if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3756
0
    relocation = (insn & ~0x7c000) | 0x1c000;
3757
0
        else
3758
0
    relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3759
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3760
0
      }
3761
0
    continue;
3762
3763
0
  case R_SPARC_TLS_LDM_ADD:
3764
    /* LD -> LE */
3765
0
    if (bfd_link_executable (info))
3766
0
      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3767
0
    continue;
3768
3769
0
  case R_SPARC_TLS_LDO_ADD:
3770
    /* LD -> LE */
3771
0
    if (bfd_link_executable (info))
3772
0
      {
3773
        /* Change rs1 into %g7.  */
3774
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3775
0
        insn = (insn & ~0x7c000) | 0x1c000;
3776
0
        bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3777
0
      }
3778
0
    continue;
3779
3780
0
  case R_SPARC_TLS_IE_LD:
3781
0
  case R_SPARC_TLS_IE_LDX:
3782
    /* IE -> LE */
3783
0
    if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3784
0
      {
3785
0
        bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3786
0
        int rs2 = insn & 0x1f;
3787
0
        int rd = (insn >> 25) & 0x1f;
3788
3789
0
        if (rs2 == rd)
3790
0
    relocation = SPARC_NOP;
3791
0
        else
3792
0
    relocation = 0x80100000 | (insn & 0x3e00001f);
3793
0
        bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3794
0
      }
3795
0
    continue;
3796
3797
0
  case R_SPARC_TLS_IE_ADD:
3798
    /* Totally useless relocation.  */
3799
0
    continue;
3800
3801
0
  case R_SPARC_TLS_DTPOFF32:
3802
0
  case R_SPARC_TLS_DTPOFF64:
3803
0
    relocation -= dtpoff_base (info);
3804
0
    break;
3805
3806
0
  default:
3807
0
    break;
3808
0
  }
3809
3810
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3811
   because such sections are not SEC_ALLOC and thus ld.so will
3812
   not process them.  */
3813
0
      if (unresolved_reloc
3814
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
3815
0
         && h->def_dynamic)
3816
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
3817
0
              rel->r_offset) != (bfd_vma) -1)
3818
0
  _bfd_error_handler
3819
    /* xgettext:c-format */
3820
0
    (_("%pB(%pA+%#" PRIx64 "): "
3821
0
       "unresolvable %s relocation against symbol `%s'"),
3822
0
     input_bfd,
3823
0
     input_section,
3824
0
     (uint64_t) rel->r_offset,
3825
0
     howto->name,
3826
0
     h->root.root.string);
3827
3828
0
      r = bfd_reloc_continue;
3829
0
      if (r_type == R_SPARC_OLO10)
3830
0
  {
3831
0
      bfd_vma x;
3832
3833
0
      if (! ABI_64_P (output_bfd))
3834
0
        abort ();
3835
3836
0
      relocation += rel->r_addend;
3837
0
      relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3838
3839
0
      x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3840
0
      x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3841
0
      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3842
3843
0
      r = bfd_check_overflow (howto->complain_on_overflow,
3844
0
            howto->bitsize, howto->rightshift,
3845
0
            bfd_arch_bits_per_address (input_bfd),
3846
0
            relocation);
3847
0
  }
3848
0
      else if (r_type == R_SPARC_WDISP16)
3849
0
  {
3850
0
    bfd_vma x;
3851
3852
0
    relocation += rel->r_addend;
3853
0
    relocation -= (input_section->output_section->vma
3854
0
       + input_section->output_offset);
3855
0
    relocation -= rel->r_offset;
3856
3857
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3858
0
    x |= ((((relocation >> 2) & 0xc000) << 6)
3859
0
    | ((relocation >> 2) & 0x3fff));
3860
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3861
3862
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3863
0
          howto->bitsize, howto->rightshift,
3864
0
          bfd_arch_bits_per_address (input_bfd),
3865
0
          relocation);
3866
0
  }
3867
0
      else if (r_type == R_SPARC_WDISP10)
3868
0
  {
3869
0
    bfd_vma x;
3870
3871
0
    relocation += rel->r_addend;
3872
0
    relocation -= (input_section->output_section->vma
3873
0
       + input_section->output_offset);
3874
0
    relocation -= rel->r_offset;
3875
3876
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3877
0
    x |= ((((relocation >> 2) & 0x300) << 11)
3878
0
    | (((relocation >> 2) & 0xff) << 5));
3879
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3880
3881
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3882
0
          howto->bitsize, howto->rightshift,
3883
0
          bfd_arch_bits_per_address (input_bfd),
3884
0
          relocation);
3885
0
  }
3886
0
      else if (r_type == R_SPARC_REV32)
3887
0
  {
3888
0
    bfd_vma x;
3889
3890
0
    relocation = relocation + rel->r_addend;
3891
3892
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3893
0
    x = x + relocation;
3894
0
    bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3895
0
    r = bfd_reloc_ok;
3896
0
  }
3897
0
      else if (r_type == R_SPARC_TLS_LDO_HIX22
3898
0
         || r_type == R_SPARC_TLS_LE_HIX22)
3899
0
  {
3900
0
    bfd_vma x;
3901
3902
0
    relocation += rel->r_addend;
3903
0
    if (r_type == R_SPARC_TLS_LE_HIX22)
3904
0
      relocation ^= MINUS_ONE;
3905
3906
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3907
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3908
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3909
0
    r = bfd_reloc_ok;
3910
0
  }
3911
0
      else if (r_type == R_SPARC_TLS_LDO_LOX10
3912
0
         || r_type == R_SPARC_TLS_LE_LOX10)
3913
0
  {
3914
0
    bfd_vma x;
3915
3916
0
    relocation += rel->r_addend;
3917
0
    relocation &= 0x3ff;
3918
0
    if (r_type == R_SPARC_TLS_LE_LOX10)
3919
0
      relocation |= 0x1c00;
3920
3921
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3922
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3923
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3924
3925
0
    r = bfd_reloc_ok;
3926
0
  }
3927
0
      else if (r_type == R_SPARC_HIX22
3928
0
         || r_type == R_SPARC_GOTDATA_HIX22
3929
0
         || r_type == R_SPARC_GOTDATA_OP_HIX22)
3930
0
  {
3931
0
    bfd_vma x;
3932
3933
0
    relocation += rel->r_addend;
3934
0
    if (r_type == R_SPARC_HIX22
3935
0
        || (bfd_signed_vma) relocation < 0)
3936
0
      relocation = relocation ^ MINUS_ONE;
3937
3938
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3939
0
    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3940
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3941
3942
0
    r = bfd_check_overflow (howto->complain_on_overflow,
3943
0
          howto->bitsize, howto->rightshift,
3944
0
          bfd_arch_bits_per_address (input_bfd),
3945
0
          relocation);
3946
0
  }
3947
0
      else if (r_type == R_SPARC_LOX10
3948
0
         || r_type == R_SPARC_GOTDATA_LOX10
3949
0
         || r_type == R_SPARC_GOTDATA_OP_LOX10)
3950
0
  {
3951
0
    bfd_vma x;
3952
3953
0
    relocation += rel->r_addend;
3954
0
    if (r_type == R_SPARC_LOX10
3955
0
        || (bfd_signed_vma) relocation < 0)
3956
0
      relocation = (relocation & 0x3ff) | 0x1c00;
3957
0
    else
3958
0
      relocation = (relocation & 0x3ff);
3959
3960
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3961
0
    x = (x & ~(bfd_vma) 0x1fff) | relocation;
3962
0
    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3963
3964
0
    r = bfd_reloc_ok;
3965
0
  }
3966
0
      else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3967
0
         && sec_do_relax (input_section)
3968
0
         && rel->r_offset + 4 < input_section->size)
3969
0
  {
3970
0
#define G0    0
3971
0
#define O7    15
3972
0
#define XCC   (2 << 20)
3973
0
#define COND(x)   (((x)&0xf)<<25)
3974
0
#define CONDA   COND(0x8)
3975
0
#define INSN_BPA  (F2(0,1) | CONDA | BPRED | XCC)
3976
0
#define INSN_BA   (F2(0,2) | CONDA)
3977
0
#define INSN_OR   F3(2, 0x2, 0)
3978
0
#define INSN_NOP  F2(0,4)
3979
3980
0
    bfd_vma x, y;
3981
3982
    /* If the instruction is a call with either:
3983
       restore
3984
       arithmetic instruction with rd == %o7
3985
       where rs1 != %o7 and rs2 if it is register != %o7
3986
       then we can optimize if the call destination is near
3987
       by changing the call into a branch always.  */
3988
0
    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3989
0
    y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3990
0
    if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3991
0
      {
3992
0
        if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3993
0
       || ((y & OP3(0x28)) == 0 /* arithmetic */
3994
0
           && (y & RD(~0)) == RD(O7)))
3995
0
      && (y & RS1(~0)) != RS1(O7)
3996
0
      && ((y & F3I(~0))
3997
0
          || (y & RS2(~0)) != RS2(O7)))
3998
0
    {
3999
0
      bfd_vma reloc;
4000
4001
0
      reloc = relocation + rel->r_addend - rel->r_offset;
4002
0
      reloc -= (input_section->output_section->vma
4003
0
          + input_section->output_offset);
4004
4005
      /* Ensure the branch fits into simm22.  */
4006
0
      if ((reloc & 3) == 0
4007
0
          && ((reloc & ~(bfd_vma)0x7fffff) == 0
4008
0
        || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
4009
0
        {
4010
0
          reloc >>= 2;
4011
4012
          /* Check whether it fits into simm19.  */
4013
0
          if (((reloc & 0x3c0000) == 0
4014
0
         || (reloc & 0x3c0000) == 0x3c0000)
4015
0
        && (ABI_64_P (output_bfd)
4016
0
            || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
4017
0
      x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
4018
0
          else
4019
0
      x = INSN_BA | (reloc & 0x3fffff); /* ba */
4020
0
          bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4021
0
          r = bfd_reloc_ok;
4022
0
          if (rel->r_offset >= 4
4023
0
        && (y & (0xffffffff ^ RS1(~0)))
4024
0
           == (INSN_OR | RD(O7) | RS2(G0)))
4025
0
      {
4026
0
        bfd_vma z;
4027
0
        unsigned int reg;
4028
4029
0
        z = bfd_get_32 (input_bfd,
4030
0
            contents + rel->r_offset - 4);
4031
0
        if ((z & (0xffffffff ^ RD(~0)))
4032
0
            != (INSN_OR | RS1(O7) | RS2(G0)))
4033
0
          continue;
4034
4035
        /* The sequence was
4036
           or %o7, %g0, %rN
4037
           call foo
4038
           or %rN, %g0, %o7
4039
4040
           If call foo was replaced with ba, replace
4041
           or %rN, %g0, %o7 with nop.  */
4042
4043
0
        reg = (y & RS1(~0)) >> 14;
4044
0
        if (reg != ((z & RD(~0)) >> 25)
4045
0
            || reg == G0 || reg == O7)
4046
0
          continue;
4047
4048
0
        bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4049
0
              contents + rel->r_offset + 4);
4050
0
      }
4051
4052
0
        }
4053
0
    }
4054
0
      }
4055
0
  }
4056
4057
0
      if (r == bfd_reloc_continue)
4058
0
  {
4059
0
  do_relocation:
4060
0
    r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4061
0
          contents, rel->r_offset,
4062
0
          relocation, rel->r_addend);
4063
0
  }
4064
0
      if (r != bfd_reloc_ok)
4065
0
  {
4066
0
    switch (r)
4067
0
      {
4068
0
      default:
4069
0
      case bfd_reloc_outofrange:
4070
0
        abort ();
4071
0
      case bfd_reloc_overflow:
4072
0
        {
4073
0
    const char *name;
4074
4075
    /* The Solaris native linker silently disregards overflows.
4076
       We don't, but this breaks stabs debugging info, whose
4077
       relocations are only 32-bits wide.  Ignore overflows in
4078
       this case and also for discarded entries.  */
4079
0
    if ((r_type == R_SPARC_32
4080
0
         || r_type == R_SPARC_UA32
4081
0
         || r_type == R_SPARC_DISP32)
4082
0
        && (((input_section->flags & SEC_DEBUGGING) != 0
4083
0
       && strcmp (bfd_section_name (input_section),
4084
0
            ".stab") == 0)
4085
0
      || _bfd_elf_section_offset (output_bfd, info,
4086
0
                input_section,
4087
0
                rel->r_offset)
4088
0
           == (bfd_vma)-1))
4089
0
      break;
4090
4091
0
    if (h != NULL)
4092
0
      {
4093
        /* Assume this is a call protected by other code that
4094
           detect the symbol is undefined.  If this is the case,
4095
           we can safely ignore the overflow.  If not, the
4096
           program is hosed anyway, and a little warning isn't
4097
           going to help.  */
4098
0
        if (h->root.type == bfd_link_hash_undefweak
4099
0
      && howto->pc_relative)
4100
0
          break;
4101
4102
0
        name = NULL;
4103
0
      }
4104
0
    else
4105
0
      {
4106
0
        name = bfd_elf_string_from_elf_section (input_bfd,
4107
0
                  symtab_hdr->sh_link,
4108
0
                  sym->st_name);
4109
0
        if (name == NULL)
4110
0
          return false;
4111
0
        if (*name == '\0')
4112
0
          name = bfd_section_name (sec);
4113
0
      }
4114
0
    (*info->callbacks->reloc_overflow)
4115
0
      (info, (h ? &h->root : NULL), name, howto->name,
4116
0
       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4117
0
        }
4118
0
        break;
4119
0
      }
4120
0
  }
4121
0
    }
4122
4123
0
  return true;
4124
0
}
4125
4126
/* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
4127
   and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
4128
   is the offset of the associated .got.plt entry from
4129
   _GLOBAL_OFFSET_TABLE_.  */
4130
4131
static void
4132
sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4133
             bfd_vma plt_offset, bfd_vma plt_index,
4134
             bfd_vma got_offset)
4135
0
{
4136
0
  bfd_vma got_base;
4137
0
  const bfd_vma *plt_entry;
4138
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4139
0
  bfd_byte *loc;
4140
0
  Elf_Internal_Rela rela;
4141
4142
0
  htab = _bfd_sparc_elf_hash_table (info);
4143
0
  BFD_ASSERT (htab != NULL);
4144
4145
0
  if (bfd_link_pic (info))
4146
0
    {
4147
0
      plt_entry = sparc_vxworks_shared_plt_entry;
4148
0
      got_base = 0;
4149
0
    }
4150
0
  else
4151
0
    {
4152
0
      plt_entry = sparc_vxworks_exec_plt_entry;
4153
0
      got_base = (htab->elf.hgot->root.u.def.value
4154
0
      + htab->elf.hgot->root.u.def.section->output_offset
4155
0
      + htab->elf.hgot->root.u.def.section->output_section->vma);
4156
0
    }
4157
4158
  /* Fill in the entry in the procedure linkage table.  */
4159
0
  bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4160
0
        htab->elf.splt->contents + plt_offset);
4161
0
  bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4162
0
        htab->elf.splt->contents + plt_offset + 4);
4163
0
  bfd_put_32 (output_bfd, plt_entry[2],
4164
0
        htab->elf.splt->contents + plt_offset + 8);
4165
0
  bfd_put_32 (output_bfd, plt_entry[3],
4166
0
        htab->elf.splt->contents + plt_offset + 12);
4167
0
  bfd_put_32 (output_bfd, plt_entry[4],
4168
0
        htab->elf.splt->contents + plt_offset + 16);
4169
0
  bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4170
0
        htab->elf.splt->contents + plt_offset + 20);
4171
  /* PC-relative displacement for a branch to the start of
4172
     the PLT section.  */
4173
0
  bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4174
0
            & 0x003fffff),
4175
0
        htab->elf.splt->contents + plt_offset + 24);
4176
0
  bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4177
0
        htab->elf.splt->contents + plt_offset + 28);
4178
4179
  /* Fill in the .got.plt entry, pointing initially at the
4180
     second half of the PLT entry.  */
4181
0
  BFD_ASSERT (htab->elf.sgotplt != NULL);
4182
0
  bfd_put_32 (output_bfd,
4183
0
        htab->elf.splt->output_section->vma
4184
0
        + htab->elf.splt->output_offset
4185
0
        + plt_offset + 20,
4186
0
        htab->elf.sgotplt->contents + got_offset);
4187
4188
  /* Add relocations to .rela.plt.unloaded.  */
4189
0
  if (!bfd_link_pic (info))
4190
0
    {
4191
0
      loc = (htab->srelplt2->contents
4192
0
       + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4193
4194
      /* Relocate the initial sethi.  */
4195
0
      rela.r_offset = (htab->elf.splt->output_section->vma
4196
0
           + htab->elf.splt->output_offset
4197
0
           + plt_offset);
4198
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4199
0
      rela.r_addend = got_offset;
4200
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4201
0
      loc += sizeof (Elf32_External_Rela);
4202
4203
      /* Likewise the following or.  */
4204
0
      rela.r_offset += 4;
4205
0
      rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4206
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4207
0
      loc += sizeof (Elf32_External_Rela);
4208
4209
      /* Relocate the .got.plt entry.  */
4210
0
      rela.r_offset = (htab->elf.sgotplt->output_section->vma
4211
0
           + htab->elf.sgotplt->output_offset
4212
0
           + got_offset);
4213
0
      rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4214
0
      rela.r_addend = plt_offset + 20;
4215
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4216
0
    }
4217
0
}
4218
4219
/* Finish up dynamic symbol handling.  We set the contents of various
4220
   dynamic sections here.  */
4221
4222
bool
4223
_bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4224
              struct bfd_link_info *info,
4225
              struct elf_link_hash_entry *h,
4226
              Elf_Internal_Sym *sym)
4227
0
{
4228
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4229
0
  const struct elf_backend_data *bed;
4230
0
  struct _bfd_sparc_elf_link_hash_entry  *eh;
4231
0
  bool resolved_to_zero;
4232
4233
0
  htab = _bfd_sparc_elf_hash_table (info);
4234
0
  BFD_ASSERT (htab != NULL);
4235
0
  bed = get_elf_backend_data (output_bfd);
4236
4237
0
  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
4238
4239
  /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4240
     resolved undefined weak symbols in executable so that their
4241
     references have value 0 at run-time.  */
4242
0
  resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4243
4244
0
  if (h->plt.offset != (bfd_vma) -1)
4245
0
    {
4246
0
      asection *splt;
4247
0
      asection *srela;
4248
0
      Elf_Internal_Rela rela;
4249
0
      bfd_byte *loc;
4250
0
      bfd_vma r_offset, got_offset;
4251
0
      int rela_index;
4252
4253
      /* When building a static executable, use .iplt and
4254
   .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4255
0
      if (htab->elf.splt != NULL)
4256
0
  {
4257
0
    splt = htab->elf.splt;
4258
0
    srela = htab->elf.srelplt;
4259
0
  }
4260
0
      else
4261
0
  {
4262
0
    splt = htab->elf.iplt;
4263
0
    srela = htab->elf.irelplt;
4264
0
  }
4265
4266
0
      if (splt == NULL || srela == NULL)
4267
0
  abort ();
4268
4269
      /* Fill in the entry in the .rela.plt section.  */
4270
0
      if (htab->elf.target_os == is_vxworks)
4271
0
  {
4272
    /* Work out the index of this PLT entry.  */
4273
0
    rela_index = ((h->plt.offset - htab->plt_header_size)
4274
0
      / htab->plt_entry_size);
4275
4276
    /* Calculate the offset of the associated .got.plt entry.
4277
       The first three entries are reserved.  */
4278
0
    got_offset = (rela_index + 3) * 4;
4279
4280
0
    sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4281
0
           rela_index, got_offset);
4282
4283
4284
    /* On VxWorks, the relocation points to the .got.plt entry,
4285
       not the .plt entry.  */
4286
0
    rela.r_offset = (htab->elf.sgotplt->output_section->vma
4287
0
         + htab->elf.sgotplt->output_offset
4288
0
         + got_offset);
4289
0
    rela.r_addend = 0;
4290
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4291
0
            R_SPARC_JMP_SLOT);
4292
0
  }
4293
0
      else
4294
0
  {
4295
0
    bool ifunc = false;
4296
4297
    /* Fill in the entry in the procedure linkage table.  */
4298
0
    rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4299
0
              h->plt.offset, splt->size,
4300
0
              &r_offset);
4301
4302
0
    if (h == NULL
4303
0
        || h->dynindx == -1
4304
0
        || ((bfd_link_executable (info)
4305
0
       || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4306
0
      && h->def_regular
4307
0
      && h->type == STT_GNU_IFUNC))
4308
0
      {
4309
0
        ifunc = true;
4310
0
        BFD_ASSERT (h == NULL
4311
0
        || (h->type == STT_GNU_IFUNC
4312
0
            && h->def_regular
4313
0
            && (h->root.type == bfd_link_hash_defined
4314
0
          || h->root.type == bfd_link_hash_defweak)));
4315
0
      }
4316
4317
0
    rela.r_offset = r_offset
4318
0
      + (splt->output_section->vma + splt->output_offset);
4319
0
    if (ABI_64_P (output_bfd)
4320
0
        && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4321
0
      {
4322
0
        if (ifunc)
4323
0
    {
4324
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4325
0
           + h->root.u.def.section->output_offset
4326
0
           + h->root.u.def.value);
4327
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4328
0
              R_SPARC_IRELATIVE);
4329
0
    }
4330
0
        else
4331
0
    {
4332
0
      rela.r_addend = (-(h->plt.offset + 4)
4333
0
           - splt->output_section->vma
4334
0
           - splt->output_offset);
4335
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4336
0
              R_SPARC_JMP_SLOT);
4337
0
    }
4338
0
      }
4339
0
    else
4340
0
      {
4341
0
        if (ifunc)
4342
0
    {
4343
0
      rela.r_addend = (h->root.u.def.section->output_section->vma
4344
0
           + h->root.u.def.section->output_offset
4345
0
           + h->root.u.def.value);
4346
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4347
0
              R_SPARC_JMP_IREL);
4348
0
    }
4349
0
        else
4350
0
    {
4351
0
      rela.r_addend = 0;
4352
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4353
0
              R_SPARC_JMP_SLOT);
4354
0
    }
4355
0
      }
4356
0
  }
4357
4358
      /* Adjust for the first 4 reserved elements in the .plt section
4359
   when setting the offset in the .rela.plt section.
4360
   Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4361
   thus .plt[4] has corresponding .rela.plt[0] and so on.  */
4362
4363
0
      loc = srela->contents;
4364
0
      loc += rela_index * bed->s->sizeof_rela;
4365
0
      bed->s->swap_reloca_out (output_bfd, &rela, loc);
4366
4367
0
      if (!resolved_to_zero && !h->def_regular)
4368
0
  {
4369
    /* Mark the symbol as undefined, rather than as defined in
4370
       the .plt section.  Leave the value alone.  */
4371
0
    sym->st_shndx = SHN_UNDEF;
4372
    /* If the symbol is weak, we do need to clear the value.
4373
       Otherwise, the PLT entry would provide a definition for
4374
       the symbol even if the symbol wasn't defined anywhere,
4375
       and so the symbol would never be NULL.  */
4376
0
    if (!h->ref_regular_nonweak)
4377
0
      sym->st_value = 0;
4378
0
  }
4379
0
    }
4380
4381
  /* Don't generate dynamic GOT relocation against resolved undefined weak
4382
     symbols in an executable.  */
4383
0
  if (h->got.offset != (bfd_vma) -1
4384
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4385
0
      && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
4386
0
      && !(h->root.type == bfd_link_hash_undefweak
4387
0
     && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4388
0
         || resolved_to_zero)))
4389
0
    {
4390
0
      asection *sgot;
4391
0
      asection *srela;
4392
0
      Elf_Internal_Rela rela;
4393
4394
      /* This symbol has an entry in the GOT.  Set it up.  */
4395
4396
0
      sgot = htab->elf.sgot;
4397
0
      srela = htab->elf.srelgot;
4398
0
      BFD_ASSERT (sgot != NULL && srela != NULL);
4399
4400
0
      rela.r_offset = (sgot->output_section->vma
4401
0
           + sgot->output_offset
4402
0
           + (h->got.offset &~ (bfd_vma) 1));
4403
4404
      /* If this is a -Bsymbolic link, and the symbol is defined
4405
   locally, we just want to emit a RELATIVE reloc.  Likewise if
4406
   the symbol was forced to be local because of a version file.
4407
   The entry in the global offset table will already have been
4408
   initialized in the relocate_section function.  */
4409
0
      if (! bfd_link_pic (info)
4410
0
    && h->type == STT_GNU_IFUNC
4411
0
    && h->def_regular)
4412
0
  {
4413
0
    asection *plt;
4414
4415
    /* We load the GOT entry with the PLT entry.  */
4416
0
    plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4417
0
    SPARC_ELF_PUT_WORD (htab, output_bfd,
4418
0
            (plt->output_section->vma
4419
0
             + plt->output_offset + h->plt.offset),
4420
0
            htab->elf.sgot->contents
4421
0
            + (h->got.offset & ~(bfd_vma) 1));
4422
0
    return true;
4423
0
  }
4424
4425
0
      if (bfd_link_pic (info)
4426
0
    && (h->root.type == bfd_link_hash_defined
4427
0
        || h->root.type == bfd_link_hash_defweak)
4428
0
    && SYMBOL_REFERENCES_LOCAL (info, h))
4429
0
  {
4430
0
    asection *sec = h->root.u.def.section;
4431
0
    if (h->type == STT_GNU_IFUNC)
4432
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4433
0
    else
4434
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4435
0
    rela.r_addend = (h->root.u.def.value
4436
0
         + sec->output_section->vma
4437
0
         + sec->output_offset);
4438
0
  }
4439
0
      else
4440
0
  {
4441
0
    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4442
0
    rela.r_addend = 0;
4443
0
  }
4444
4445
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4446
0
        sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4447
0
      sparc_elf_append_rela (output_bfd, srela, &rela);
4448
0
    }
4449
4450
0
  if (h->needs_copy)
4451
0
    {
4452
0
      asection *s;
4453
0
      Elf_Internal_Rela rela;
4454
4455
      /* This symbols needs a copy reloc.  Set it up.  */
4456
0
      BFD_ASSERT (h->dynindx != -1);
4457
4458
0
      rela.r_offset = (h->root.u.def.value
4459
0
           + h->root.u.def.section->output_section->vma
4460
0
           + h->root.u.def.section->output_offset);
4461
0
      rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4462
0
      rela.r_addend = 0;
4463
0
      if (h->root.u.def.section == htab->elf.sdynrelro)
4464
0
  s = htab->elf.sreldynrelro;
4465
0
      else
4466
0
  s = htab->elf.srelbss;
4467
0
      sparc_elf_append_rela (output_bfd, s, &rela);
4468
0
    }
4469
4470
  /* Mark some specially defined symbols as absolute.  On VxWorks,
4471
     _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4472
     ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
4473
0
  if (sym != NULL
4474
0
      && (h == htab->elf.hdynamic
4475
0
    || (htab->elf.target_os != is_vxworks
4476
0
        && (h == htab->elf.hgot || h == htab->elf.hplt))))
4477
0
    sym->st_shndx = SHN_ABS;
4478
4479
0
  return true;
4480
0
}
4481
4482
/* Finish up the dynamic sections.  */
4483
4484
static bool
4485
sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4486
      bfd *dynobj, asection *sdyn,
4487
      asection *splt ATTRIBUTE_UNUSED)
4488
0
{
4489
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4490
0
  const struct elf_backend_data *bed;
4491
0
  bfd_byte *dyncon, *dynconend;
4492
0
  size_t dynsize;
4493
0
  int stt_regidx = -1;
4494
0
  bool abi_64_p;
4495
4496
0
  htab = _bfd_sparc_elf_hash_table (info);
4497
0
  BFD_ASSERT (htab != NULL);
4498
0
  bed = get_elf_backend_data (output_bfd);
4499
0
  dynsize = bed->s->sizeof_dyn;
4500
0
  dynconend = sdyn->contents + sdyn->size;
4501
0
  abi_64_p = ABI_64_P (output_bfd);
4502
0
  for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4503
0
    {
4504
0
      Elf_Internal_Dyn dyn;
4505
0
      bool size;
4506
4507
0
      bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4508
4509
0
      if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
4510
0
  {
4511
    /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4512
       not to the start of the PLT.  */
4513
0
    if (htab->elf.sgotplt)
4514
0
      {
4515
0
        dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4516
0
        + htab->elf.sgotplt->output_offset);
4517
0
        bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4518
0
      }
4519
0
  }
4520
0
      else if (htab->elf.target_os == is_vxworks
4521
0
         && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4522
0
  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4523
0
      else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4524
0
  {
4525
0
    if (stt_regidx == -1)
4526
0
      {
4527
0
        stt_regidx =
4528
0
    _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4529
0
        if (stt_regidx == -1)
4530
0
    return false;
4531
0
      }
4532
0
    dyn.d_un.d_val = stt_regidx++;
4533
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4534
0
  }
4535
0
      else
4536
0
  {
4537
0
    asection *s;
4538
4539
0
    switch (dyn.d_tag)
4540
0
      {
4541
0
      case DT_PLTGOT:
4542
0
        s = htab->elf.splt;
4543
0
        size = false;
4544
0
        break;
4545
0
      case DT_PLTRELSZ:
4546
0
        s = htab->elf.srelplt;
4547
0
        size = true;
4548
0
        break;
4549
0
      case DT_JMPREL:
4550
0
        s = htab->elf.srelplt;
4551
0
        size = false;
4552
0
        break;
4553
0
      default:
4554
0
        continue;
4555
0
      }
4556
4557
0
    if (s == NULL)
4558
0
      dyn.d_un.d_val = 0;
4559
0
    else
4560
0
      {
4561
0
        if (!size)
4562
0
    dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4563
0
        else
4564
0
    dyn.d_un.d_val = s->size;
4565
0
      }
4566
0
    bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4567
0
  }
4568
0
    }
4569
0
  return true;
4570
0
}
4571
4572
/* Install the first PLT entry in a VxWorks executable and make sure that
4573
   .rela.plt.unloaded relocations have the correct symbol indexes.  */
4574
4575
static void
4576
sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4577
0
{
4578
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4579
0
  Elf_Internal_Rela rela;
4580
0
  bfd_vma got_base;
4581
0
  bfd_byte *loc;
4582
4583
0
  htab = _bfd_sparc_elf_hash_table (info);
4584
0
  BFD_ASSERT (htab != NULL);
4585
4586
  /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
4587
0
  got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4588
0
        + htab->elf.hgot->root.u.def.section->output_offset
4589
0
        + htab->elf.hgot->root.u.def.value);
4590
4591
  /* Install the initial PLT entry.  */
4592
0
  bfd_put_32 (output_bfd,
4593
0
        sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4594
0
        htab->elf.splt->contents);
4595
0
  bfd_put_32 (output_bfd,
4596
0
        sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4597
0
        htab->elf.splt->contents + 4);
4598
0
  bfd_put_32 (output_bfd,
4599
0
        sparc_vxworks_exec_plt0_entry[2],
4600
0
        htab->elf.splt->contents + 8);
4601
0
  bfd_put_32 (output_bfd,
4602
0
        sparc_vxworks_exec_plt0_entry[3],
4603
0
        htab->elf.splt->contents + 12);
4604
0
  bfd_put_32 (output_bfd,
4605
0
        sparc_vxworks_exec_plt0_entry[4],
4606
0
        htab->elf.splt->contents + 16);
4607
4608
0
  loc = htab->srelplt2->contents;
4609
4610
  /* Add an unloaded relocation for the initial entry's "sethi".  */
4611
0
  rela.r_offset = (htab->elf.splt->output_section->vma
4612
0
       + htab->elf.splt->output_offset);
4613
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4614
0
  rela.r_addend = 8;
4615
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4616
0
  loc += sizeof (Elf32_External_Rela);
4617
4618
  /* Likewise the following "or".  */
4619
0
  rela.r_offset += 4;
4620
0
  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4621
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4622
0
  loc += sizeof (Elf32_External_Rela);
4623
4624
  /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
4625
     the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4626
     in which symbols were output.  */
4627
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4628
0
    {
4629
0
      Elf_Internal_Rela rel;
4630
4631
      /* The entry's initial "sethi" (against _G_O_T_).  */
4632
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4633
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4634
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4635
0
      loc += sizeof (Elf32_External_Rela);
4636
4637
      /* The following "or" (also against _G_O_T_).  */
4638
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4639
0
      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4640
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4641
0
      loc += sizeof (Elf32_External_Rela);
4642
4643
      /* The .got.plt entry (against _P_L_T_).  */
4644
0
      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4645
0
      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4646
0
      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4647
0
      loc += sizeof (Elf32_External_Rela);
4648
0
    }
4649
0
}
4650
4651
/* Install the first PLT entry in a VxWorks shared object.  */
4652
4653
static void
4654
sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4655
0
{
4656
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4657
0
  unsigned int i;
4658
4659
0
  htab = _bfd_sparc_elf_hash_table (info);
4660
0
  BFD_ASSERT (htab != NULL);
4661
4662
0
  for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4663
0
    bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4664
0
    htab->elf.splt->contents + i * 4);
4665
0
}
4666
4667
/* Finish up local dynamic symbol handling.  We set the contents of
4668
   various dynamic sections here.  */
4669
4670
static int
4671
finish_local_dynamic_symbol (void **slot, void *inf)
4672
0
{
4673
0
  struct elf_link_hash_entry *h
4674
0
    = (struct elf_link_hash_entry *) *slot;
4675
0
  struct bfd_link_info *info
4676
0
    = (struct bfd_link_info *) inf;
4677
4678
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4679
0
                 h, NULL);
4680
0
}
4681
4682
/* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4683
   here since undefined weak symbol may not be dynamic and may not be
4684
   called for _bfd_sparc_elf_finish_dynamic_symbol.  */
4685
4686
static bool
4687
pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4688
           void *inf)
4689
0
{
4690
0
  struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4691
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
4692
4693
0
  if (h->root.type != bfd_link_hash_undefweak
4694
0
      || h->dynindx != -1)
4695
0
    return true;
4696
4697
0
  return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4698
0
                 h, NULL);
4699
0
}
4700
4701
bool
4702
_bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4703
0
{
4704
0
  bfd *dynobj;
4705
0
  asection *sdyn;
4706
0
  struct _bfd_sparc_elf_link_hash_table *htab;
4707
4708
0
  htab = _bfd_sparc_elf_hash_table (info);
4709
0
  BFD_ASSERT (htab != NULL);
4710
0
  dynobj = htab->elf.dynobj;
4711
4712
  /* We arranged in size_dynamic_sections to put the STT_REGISTER
4713
     entries at the end of the dynlocal list, so they came at the end
4714
     of the local symbols in the symtab.  Except that they aren't
4715
     STB_LOCAL, so we need to back up symtab->sh_info.  */
4716
0
  if (ABI_64_P (output_bfd)
4717
0
      && elf_hash_table (info)->dynlocal)
4718
0
    {
4719
0
      asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
4720
0
      struct elf_link_local_dynamic_entry *e;
4721
4722
0
      for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
4723
0
  if (e->input_indx == -1)
4724
0
    break;
4725
0
      if (e)
4726
0
  elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
4727
0
    = e->dynindx;
4728
0
    }
4729
4730
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4731
4732
0
  if (elf_hash_table (info)->dynamic_sections_created)
4733
0
    {
4734
0
      asection *splt;
4735
4736
0
      splt = htab->elf.splt;
4737
0
      BFD_ASSERT (splt != NULL && sdyn != NULL);
4738
4739
0
      if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4740
0
  return false;
4741
4742
      /* Initialize the contents of the .plt section.  */
4743
0
      if (splt->size > 0)
4744
0
  {
4745
0
    if (htab->elf.target_os == is_vxworks)
4746
0
      {
4747
0
        if (bfd_link_pic (info))
4748
0
    sparc_vxworks_finish_shared_plt (output_bfd, info);
4749
0
        else
4750
0
    sparc_vxworks_finish_exec_plt (output_bfd, info);
4751
0
      }
4752
0
    else
4753
0
      {
4754
0
        memset (splt->contents, 0, htab->plt_header_size);
4755
0
        if (!ABI_64_P (output_bfd))
4756
0
    bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4757
0
          splt->contents + splt->size - 4);
4758
0
      }
4759
0
  }
4760
4761
0
      if (elf_section_data (splt->output_section) != NULL)
4762
0
  elf_section_data (splt->output_section)->this_hdr.sh_entsize
4763
0
    = ((htab->elf.target_os == is_vxworks
4764
0
        || !ABI_64_P (output_bfd))
4765
0
       ? 0 : htab->plt_entry_size);
4766
0
    }
4767
4768
  /* Set the first entry in the global offset table to the address of
4769
     the dynamic section.  */
4770
0
  if (htab->elf.sgot && htab->elf.sgot->size > 0)
4771
0
    {
4772
0
      bfd_vma val = (sdyn ?
4773
0
         sdyn->output_section->vma + sdyn->output_offset :
4774
0
         0);
4775
4776
0
      SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
4777
0
    }
4778
4779
0
  if (htab->elf.sgot)
4780
0
    elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4781
0
      SPARC_ELF_WORD_BYTES (htab);
4782
4783
  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4784
0
  htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
4785
4786
  /* Fill PLT entries for undefined weak symbols in PIE.  */
4787
0
  if (bfd_link_pie (info))
4788
0
    bfd_hash_traverse (&info->hash->table,
4789
0
           pie_finish_undefweak_symbol,
4790
0
           info);
4791
0
  return true;
4792
0
}
4793
4794

4795
/* Set the right machine number for a SPARC ELF file.  */
4796
4797
bool
4798
_bfd_sparc_elf_object_p (bfd *abfd)
4799
34.1k
{
4800
34.1k
  obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
4801
34.1k
  obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
4802
34.1k
  obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
4803
4804
34.1k
  unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
4805
34.1k
  unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
4806
34.1k
          | ELF_SPARC_HWCAP_VIS3
4807
34.1k
          | ELF_SPARC_HWCAP_HPC);
4808
34.1k
  unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
4809
34.1k
          | ELF_SPARC_HWCAP_DES
4810
34.1k
          | ELF_SPARC_HWCAP_KASUMI
4811
34.1k
          | ELF_SPARC_HWCAP_CAMELLIA
4812
34.1k
          | ELF_SPARC_HWCAP_MD5
4813
34.1k
          | ELF_SPARC_HWCAP_SHA1
4814
34.1k
          | ELF_SPARC_HWCAP_SHA256
4815
34.1k
          | ELF_SPARC_HWCAP_SHA512
4816
34.1k
          | ELF_SPARC_HWCAP_MPMUL
4817
34.1k
          | ELF_SPARC_HWCAP_MONT
4818
34.1k
          | ELF_SPARC_HWCAP_CRC32C
4819
34.1k
          | ELF_SPARC_HWCAP_CBCOND
4820
34.1k
          | ELF_SPARC_HWCAP_PAUSE);
4821
34.1k
  unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
4822
34.1k
         | ELF_SPARC_HWCAP_IMA);
4823
34.1k
  unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
4824
34.1k
           | ELF_SPARC_HWCAP2_MWAIT
4825
34.1k
           | ELF_SPARC_HWCAP2_XMPMUL
4826
34.1k
           | ELF_SPARC_HWCAP2_XMONT);
4827
34.1k
  unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6
4828
34.1k
          | ELF_SPARC_HWCAP2_ONADDSUB
4829
34.1k
          | ELF_SPARC_HWCAP2_ONMUL
4830
34.1k
          | ELF_SPARC_HWCAP2_ONDIV
4831
34.1k
          | ELF_SPARC_HWCAP2_DICTUNP
4832
34.1k
          | ELF_SPARC_HWCAP2_FPCMPSHL
4833
34.1k
          | ELF_SPARC_HWCAP2_RLE
4834
34.1k
          | ELF_SPARC_HWCAP2_SHA3);
4835
4836
34.1k
  if (ABI_64_P (abfd))
4837
15.6k
    {
4838
15.6k
      unsigned long mach = bfd_mach_sparc_v9;
4839
4840
15.6k
      if (hwcaps2->i & m8_hwcaps2_mask)
4841
0
  mach = bfd_mach_sparc_v9m8;
4842
15.6k
      else if (hwcaps2->i & v9m_hwcaps2_mask)
4843
0
  mach = bfd_mach_sparc_v9m;
4844
15.6k
      else if (hwcaps->i & v9v_hwcaps_mask)
4845
0
  mach = bfd_mach_sparc_v9v;
4846
15.6k
      else if (hwcaps->i & v9e_hwcaps_mask)
4847
0
  mach = bfd_mach_sparc_v9e;
4848
15.6k
      else if (hwcaps->i & v9d_hwcaps_mask)
4849
0
  mach = bfd_mach_sparc_v9d;
4850
15.6k
      else if (hwcaps->i & v9c_hwcaps_mask)
4851
0
  mach = bfd_mach_sparc_v9c;
4852
15.6k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4853
6.65k
  mach = bfd_mach_sparc_v9b;
4854
8.97k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4855
2.71k
  mach = bfd_mach_sparc_v9a;
4856
15.6k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
4857
15.6k
    }
4858
18.5k
  else
4859
18.5k
    {
4860
18.5k
      if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
4861
10.8k
  {
4862
10.8k
    if (hwcaps2->i & m8_hwcaps2_mask)
4863
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4864
0
                bfd_mach_sparc_v8plusm8);
4865
10.8k
    else if (hwcaps2->i & v9m_hwcaps2_mask)
4866
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4867
0
                bfd_mach_sparc_v8plusm);
4868
10.8k
    else if (hwcaps->i & v9v_hwcaps_mask)
4869
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4870
0
                bfd_mach_sparc_v8plusv);
4871
10.8k
    else if (hwcaps->i & v9e_hwcaps_mask)
4872
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4873
0
                bfd_mach_sparc_v8pluse);
4874
10.8k
    else if (hwcaps->i & v9d_hwcaps_mask)
4875
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4876
0
                bfd_mach_sparc_v8plusd);
4877
10.8k
    else if (hwcaps->i & v9c_hwcaps_mask)
4878
0
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4879
0
                bfd_mach_sparc_v8plusc);
4880
10.8k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4881
3.05k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4882
3.05k
                bfd_mach_sparc_v8plusb);
4883
7.81k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4884
2.40k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4885
2.40k
                bfd_mach_sparc_v8plusa);
4886
5.40k
    else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
4887
2.69k
      return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4888
2.69k
                bfd_mach_sparc_v8plus);
4889
2.71k
    else
4890
2.71k
      return false;
4891
10.8k
  }
4892
7.64k
      else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
4893
3.42k
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4894
3.42k
            bfd_mach_sparc_sparclite_le);
4895
4.21k
      else
4896
4.21k
  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
4897
18.5k
    }
4898
34.1k
}
4899
4900
/* Return address for Ith PLT stub in section PLT, for relocation REL
4901
   or (bfd_vma) -1 if it should not be included.  */
4902
4903
bfd_vma
4904
_bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
4905
852
{
4906
852
  if (ABI_64_P (plt->owner))
4907
0
    {
4908
0
      bfd_vma j;
4909
4910
0
      i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
4911
0
      if (i < PLT64_LARGE_THRESHOLD)
4912
0
  return plt->vma + i * PLT64_ENTRY_SIZE;
4913
4914
0
      j = (i - PLT64_LARGE_THRESHOLD) % 160;
4915
0
      i -= j;
4916
0
      return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
4917
0
    }
4918
852
  else
4919
852
    return rel->address;
4920
852
}
4921
4922
/* Merge backend specific data from an object file to the output
4923
   object file when linking.  */
4924
4925
bool
4926
_bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4927
0
{
4928
0
  bfd *obfd = info->output_bfd;
4929
0
  obj_attribute *in_attr, *in_attrs;
4930
0
  obj_attribute *out_attr, *out_attrs;
4931
4932
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
4933
0
    {
4934
      /* This is the first object.  Copy the attributes.  */
4935
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
4936
4937
      /* Use the Tag_null value to indicate the attributes have been
4938
   initialized.  */
4939
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
4940
4941
0
      return true;
4942
0
    }
4943
4944
0
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4945
0
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4946
4947
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
4948
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
4949
4950
0
  out_attr->i |= in_attr->i;
4951
0
  out_attr->type = 1;
4952
4953
0
  in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
4954
0
  out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
4955
4956
0
  out_attr->i |= in_attr->i;
4957
0
  out_attr->type = 1;
4958
4959
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
4960
0
  _bfd_elf_merge_object_attributes (ibfd, info);
4961
4962
0
  return true;
4963
0
}