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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elfxx-sparc.c] - Blame information for rev 287

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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