OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [bfd/] [elfxx-sparc.c] - Blame information for rev 330

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.