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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [bfd/] [elfxx-sparc.c] - Blame information for rev 827

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

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

powered by: WebSVN 2.1.0

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