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