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