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