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