Coverage Report

Created: 2026-04-04 08:16

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