Coverage Report

Created: 2026-03-10 08:46

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