Coverage Report

Created: 2026-07-25 10:20

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