Coverage Report

Created: 2026-09-14 08:07

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