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