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