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