elfxx-sparc.c revision 1.5 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.5 christos
3396 1.5 christos if (skip)
3397 1.5 christos memset (&outrel, 0, sizeof outrel);
3398 1.5 christos /* h->dynindx may be -1 if the symbol was marked to
3399 1.1 skrll become local. */
3400 1.1 skrll else if (h != NULL && h->dynindx != -1 && ! is_plt
3401 1.1 skrll && (!info->shared
3402 1.1 skrll || !SYMBOLIC_BIND (info, h)
3403 1.1 skrll || !h->def_regular))
3404 1.1 skrll {
3405 1.1 skrll BFD_ASSERT (h->dynindx != -1);
3406 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3407 1.1 skrll outrel.r_addend = rel->r_addend;
3408 1.1 skrll }
3409 1.1 skrll else
3410 1.1 skrll {
3411 1.1 skrll if (r_type == R_SPARC_32 || r_type == R_SPARC_64)
3412 1.1 skrll {
3413 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3414 1.1 skrll 0, R_SPARC_RELATIVE);
3415 1.1 skrll outrel.r_addend = relocation + rel->r_addend;
3416 1.1 skrll }
3417 1.1 skrll else
3418 1.1 skrll {
3419 1.3 christos long indx;
3420 1.1 skrll
3421 1.1 skrll outrel.r_addend = relocation + rel->r_addend;
3422 1.1 skrll
3423 1.1 skrll if (is_plt)
3424 1.1 skrll sec = htab->elf.splt;
3425 1.1 skrll
3426 1.1 skrll if (bfd_is_abs_section (sec))
3427 1.1 skrll indx = 0;
3428 1.1 skrll else if (sec == NULL || sec->owner == NULL)
3429 1.1 skrll {
3430 1.1 skrll bfd_set_error (bfd_error_bad_value);
3431 1.1 skrll return FALSE;
3432 1.1 skrll }
3433 1.1 skrll else
3434 1.1 skrll {
3435 1.1 skrll asection *osec;
3436 1.1 skrll
3437 1.1 skrll /* We are turning this relocation into one
3438 1.1 skrll against a section symbol. It would be
3439 1.1 skrll proper to subtract the symbol's value,
3440 1.1 skrll osec->vma, from the emitted reloc addend,
3441 1.1 skrll but ld.so expects buggy relocs. */
3442 1.1 skrll osec = sec->output_section;
3443 1.1 skrll indx = elf_section_data (osec)->dynindx;
3444 1.1 skrll
3445 1.1 skrll if (indx == 0)
3446 1.1 skrll {
3447 1.1 skrll osec = htab->elf.text_index_section;
3448 1.1 skrll indx = elf_section_data (osec)->dynindx;
3449 1.1 skrll }
3450 1.1 skrll
3451 1.1 skrll /* FIXME: we really should be able to link non-pic
3452 1.1 skrll shared libraries. */
3453 1.1 skrll if (indx == 0)
3454 1.1 skrll {
3455 1.1 skrll BFD_FAIL ();
3456 1.1 skrll (*_bfd_error_handler)
3457 1.1 skrll (_("%B: probably compiled without -fPIC?"),
3458 1.1 skrll input_bfd);
3459 1.1 skrll bfd_set_error (bfd_error_bad_value);
3460 1.1 skrll return FALSE;
3461 1.1 skrll }
3462 1.1 skrll }
3463 1.1 skrll
3464 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3465 1.1 skrll r_type);
3466 1.1 skrll }
3467 1.1 skrll }
3468 1.1 skrll
3469 1.1 skrll sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3470 1.1 skrll
3471 1.1 skrll /* This reloc will be computed at runtime, so there's no
3472 1.1 skrll need to do anything now. */
3473 1.1 skrll if (! relocate)
3474 1.1 skrll continue;
3475 1.1 skrll }
3476 1.1 skrll break;
3477 1.1 skrll
3478 1.1 skrll case R_SPARC_TLS_GD_HI22:
3479 1.1 skrll if (! ABI_64_P (input_bfd)
3480 1.1 skrll && ! _bfd_sparc_elf_tdata (input_bfd)->has_tlsgd)
3481 1.1 skrll {
3482 1.1 skrll /* R_SPARC_REV32 used the same reloc number as
3483 1.1 skrll R_SPARC_TLS_GD_HI22. */
3484 1.1 skrll r_type = R_SPARC_REV32;
3485 1.1 skrll break;
3486 1.1 skrll }
3487 1.1 skrll /* Fall through */
3488 1.1 skrll
3489 1.1 skrll case R_SPARC_TLS_GD_LO10:
3490 1.1 skrll case R_SPARC_TLS_IE_HI22:
3491 1.1 skrll case R_SPARC_TLS_IE_LO10:
3492 1.1 skrll r_type = sparc_elf_tls_transition (info, input_bfd, r_type, h == NULL);
3493 1.1 skrll tls_type = GOT_UNKNOWN;
3494 1.1 skrll if (h == NULL && local_got_offsets)
3495 1.1 skrll tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3496 1.1 skrll else if (h != NULL)
3497 1.1 skrll {
3498 1.1 skrll tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3499 1.1 skrll if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
3500 1.1 skrll switch (SPARC_ELF_R_TYPE (rel->r_info))
3501 1.1 skrll {
3502 1.1 skrll case R_SPARC_TLS_GD_HI22:
3503 1.1 skrll case R_SPARC_TLS_IE_HI22:
3504 1.1 skrll r_type = R_SPARC_TLS_LE_HIX22;
3505 1.1 skrll break;
3506 1.1 skrll default:
3507 1.1 skrll r_type = R_SPARC_TLS_LE_LOX10;
3508 1.1 skrll break;
3509 1.1 skrll }
3510 1.1 skrll }
3511 1.1 skrll if (tls_type == GOT_TLS_IE)
3512 1.1 skrll switch (r_type)
3513 1.1 skrll {
3514 1.1 skrll case R_SPARC_TLS_GD_HI22:
3515 1.1 skrll r_type = R_SPARC_TLS_IE_HI22;
3516 1.1 skrll break;
3517 1.1 skrll case R_SPARC_TLS_GD_LO10:
3518 1.1 skrll r_type = R_SPARC_TLS_IE_LO10;
3519 1.1 skrll break;
3520 1.1 skrll }
3521 1.1 skrll
3522 1.1 skrll if (r_type == R_SPARC_TLS_LE_HIX22)
3523 1.1 skrll {
3524 1.1 skrll relocation = tpoff (info, relocation);
3525 1.1 skrll break;
3526 1.1 skrll }
3527 1.1 skrll if (r_type == R_SPARC_TLS_LE_LOX10)
3528 1.1 skrll {
3529 1.1 skrll /* Change add into xor. */
3530 1.1 skrll relocation = tpoff (info, relocation);
3531 1.1 skrll bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3532 1.1 skrll contents + rel->r_offset)
3533 1.1 skrll | 0x80182000), contents + rel->r_offset);
3534 1.1 skrll break;
3535 1.1 skrll }
3536 1.1 skrll
3537 1.1 skrll if (h != NULL)
3538 1.1 skrll {
3539 1.1 skrll off = h->got.offset;
3540 1.1 skrll h->got.offset |= 1;
3541 1.1 skrll }
3542 1.1 skrll else
3543 1.1 skrll {
3544 1.1 skrll BFD_ASSERT (local_got_offsets != NULL);
3545 1.3 christos off = local_got_offsets[r_symndx];
3546 1.1 skrll local_got_offsets[r_symndx] |= 1;
3547 1.1 skrll }
3548 1.1 skrll
3549 1.1 skrll r_sparc_tlsldm:
3550 1.1 skrll if (htab->elf.sgot == NULL)
3551 1.1 skrll abort ();
3552 1.1 skrll
3553 1.1 skrll if ((off & 1) != 0)
3554 1.1 skrll off &= ~1;
3555 1.3 christos else
3556 1.1 skrll {
3557 1.1 skrll Elf_Internal_Rela outrel;
3558 1.3 christos int dr_type, indx;
3559 1.3 christos
3560 1.3 christos if (htab->elf.srelgot == NULL)
3561 1.3 christos abort ();
3562 1.1 skrll
3563 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3564 1.1 skrll htab->elf.sgot->contents + off);
3565 1.1 skrll outrel.r_offset = (htab->elf.sgot->output_section->vma
3566 1.1 skrll + htab->elf.sgot->output_offset + off);
3567 1.1 skrll indx = h && h->dynindx != -1 ? h->dynindx : 0;
3568 1.1 skrll if (r_type == R_SPARC_TLS_IE_HI22
3569 1.1 skrll || r_type == R_SPARC_TLS_IE_LO10)
3570 1.1 skrll dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3571 1.1 skrll else
3572 1.1 skrll dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3573 1.3 christos if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3574 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info);
3575 1.1 skrll else
3576 1.1 skrll outrel.r_addend = 0;
3577 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3578 1.1 skrll sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3579 1.1 skrll
3580 1.1 skrll if (r_type == R_SPARC_TLS_GD_HI22
3581 1.1 skrll || r_type == R_SPARC_TLS_GD_LO10)
3582 1.1 skrll {
3583 1.3 christos if (indx == 0)
3584 1.1 skrll {
3585 1.1 skrll BFD_ASSERT (! unresolved_reloc);
3586 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd,
3587 1.1 skrll relocation - dtpoff_base (info),
3588 1.1 skrll (htab->elf.sgot->contents + off
3589 1.3 christos + SPARC_ELF_WORD_BYTES (htab)));
3590 1.1 skrll }
3591 1.1 skrll else
3592 1.1 skrll {
3593 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3594 1.3 christos (htab->elf.sgot->contents + off
3595 1.1 skrll + SPARC_ELF_WORD_BYTES (htab)));
3596 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3597 1.1 skrll SPARC_ELF_DTPOFF_RELOC (htab));
3598 1.1 skrll outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3599 1.1 skrll sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3600 1.1 skrll &outrel);
3601 1.3 christos }
3602 1.1 skrll }
3603 1.1 skrll else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3604 1.1 skrll {
3605 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3606 1.1 skrll (htab->elf.sgot->contents + off
3607 1.1 skrll + SPARC_ELF_WORD_BYTES (htab)));
3608 1.1 skrll }
3609 1.3 christos }
3610 1.1 skrll
3611 1.1 skrll if (off >= (bfd_vma) -2)
3612 1.1 skrll abort ();
3613 1.1 skrll
3614 1.1 skrll relocation = htab->elf.sgot->output_offset + off - got_base;
3615 1.1 skrll unresolved_reloc = FALSE;
3616 1.1 skrll howto = _bfd_sparc_elf_howto_table + r_type;
3617 1.1 skrll break;
3618 1.1 skrll
3619 1.1 skrll case R_SPARC_TLS_LDM_HI22:
3620 1.1 skrll case R_SPARC_TLS_LDM_LO10:
3621 1.1 skrll if (! info->shared)
3622 1.1 skrll {
3623 1.1 skrll bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3624 1.1 skrll continue;
3625 1.1 skrll }
3626 1.1 skrll off = htab->tls_ldm_got.offset;
3627 1.1 skrll htab->tls_ldm_got.offset |= 1;
3628 1.1 skrll goto r_sparc_tlsldm;
3629 1.1 skrll
3630 1.1 skrll case R_SPARC_TLS_LDO_HIX22:
3631 1.1 skrll case R_SPARC_TLS_LDO_LOX10:
3632 1.1 skrll if (info->shared)
3633 1.1 skrll {
3634 1.1 skrll relocation -= dtpoff_base (info);
3635 1.1 skrll break;
3636 1.1 skrll }
3637 1.1 skrll
3638 1.1 skrll r_type = (r_type == R_SPARC_TLS_LDO_HIX22
3639 1.1 skrll ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_LE_LOX10);
3640 1.1 skrll /* Fall through. */
3641 1.1 skrll
3642 1.3 christos case R_SPARC_TLS_LE_HIX22:
3643 1.1 skrll case R_SPARC_TLS_LE_LOX10:
3644 1.1 skrll if (info->shared)
3645 1.1 skrll {
3646 1.1 skrll Elf_Internal_Rela outrel;
3647 1.1 skrll bfd_boolean skip;
3648 1.1 skrll
3649 1.1 skrll BFD_ASSERT (sreloc != NULL);
3650 1.1 skrll skip = FALSE;
3651 1.1 skrll outrel.r_offset =
3652 1.3 christos _bfd_elf_section_offset (output_bfd, info, input_section,
3653 1.1 skrll rel->r_offset);
3654 1.1 skrll if (outrel.r_offset == (bfd_vma) -1)
3655 1.1 skrll skip = TRUE;
3656 1.1 skrll else if (outrel.r_offset == (bfd_vma) -2)
3657 1.1 skrll skip = TRUE;
3658 1.1 skrll outrel.r_offset += (input_section->output_section->vma
3659 1.1 skrll + input_section->output_offset);
3660 1.1 skrll if (skip)
3661 1.1 skrll memset (&outrel, 0, sizeof outrel);
3662 1.1 skrll else
3663 1.1 skrll {
3664 1.1 skrll outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3665 1.1 skrll outrel.r_addend = relocation - dtpoff_base (info)
3666 1.1 skrll + rel->r_addend;
3667 1.1 skrll }
3668 1.1 skrll
3669 1.1 skrll sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3670 1.1 skrll continue;
3671 1.1 skrll }
3672 1.1 skrll relocation = tpoff (info, relocation);
3673 1.1 skrll break;
3674 1.1 skrll
3675 1.1 skrll case R_SPARC_TLS_LDM_CALL:
3676 1.1 skrll if (! info->shared)
3677 1.1 skrll {
3678 1.1 skrll /* mov %g0, %o0 */
3679 1.1 skrll bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3680 1.1 skrll continue;
3681 1.1 skrll }
3682 1.1 skrll /* Fall through */
3683 1.1 skrll
3684 1.1 skrll case R_SPARC_TLS_GD_CALL:
3685 1.1 skrll tls_type = GOT_UNKNOWN;
3686 1.1 skrll if (h == NULL && local_got_offsets)
3687 1.1 skrll tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3688 1.1 skrll else if (h != NULL)
3689 1.1 skrll tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3690 1.1 skrll if (! info->shared
3691 1.1 skrll || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3692 1.1 skrll {
3693 1.1 skrll bfd_vma insn;
3694 1.1 skrll
3695 1.1 skrll if (!info->shared && (h == NULL || h->dynindx == -1))
3696 1.1 skrll {
3697 1.1 skrll /* GD -> LE */
3698 1.1 skrll bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3699 1.1 skrll continue;
3700 1.1 skrll }
3701 1.1 skrll
3702 1.1 skrll /* GD -> IE */
3703 1.1 skrll if (rel + 1 < relend
3704 1.1 skrll && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3705 1.1 skrll && rel[1].r_offset == rel->r_offset + 4
3706 1.1 skrll && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3707 1.1 skrll && (((insn = bfd_get_32 (input_bfd,
3708 1.1 skrll contents + rel[1].r_offset))
3709 1.1 skrll >> 25) & 0x1f) == 8)
3710 1.1 skrll {
3711 1.1 skrll /* We have
3712 1.1 skrll call __tls_get_addr, %tgd_call(foo)
3713 1.1 skrll add %reg1, %reg2, %o0, %tgd_add(foo)
3714 1.1 skrll and change it into IE:
3715 1.1 skrll {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3716 1.1 skrll add %g7, %o0, %o0, %tie_add(foo).
3717 1.1 skrll add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3718 1.1 skrll ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3719 1.1 skrll ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2. */
3720 1.1 skrll bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3721 1.1 skrll contents + rel->r_offset);
3722 1.1 skrll bfd_put_32 (output_bfd, 0x9001c008,
3723 1.1 skrll contents + rel->r_offset + 4);
3724 1.1 skrll rel++;
3725 1.1 skrll continue;
3726 1.1 skrll }
3727 1.1 skrll
3728 1.1 skrll bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
3729 1.1 skrll continue;
3730 1.1 skrll }
3731 1.1 skrll
3732 1.1 skrll h = (struct elf_link_hash_entry *)
3733 1.1 skrll bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
3734 1.1 skrll FALSE, TRUE);
3735 1.1 skrll BFD_ASSERT (h != NULL);
3736 1.1 skrll r_type = R_SPARC_WPLT30;
3737 1.1 skrll howto = _bfd_sparc_elf_howto_table + r_type;
3738 1.1 skrll goto r_sparc_wplt30;
3739 1.1 skrll
3740 1.1 skrll case R_SPARC_TLS_GD_ADD:
3741 1.1 skrll tls_type = GOT_UNKNOWN;
3742 1.1 skrll if (h == NULL && local_got_offsets)
3743 1.1 skrll tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3744 1.1 skrll else if (h != NULL)
3745 1.1 skrll tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3746 1.1 skrll if (! info->shared || tls_type == GOT_TLS_IE)
3747 1.1 skrll {
3748 1.1 skrll /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3749 1.1 skrll changed into IE:
3750 1.1 skrll {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3751 1.1 skrll or LE:
3752 1.1 skrll add %g7, %reg2, %reg3. */
3753 1.1 skrll bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3754 1.1 skrll if ((h != NULL && h->dynindx != -1) || info->shared)
3755 1.1 skrll relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3756 1.1 skrll else
3757 1.1 skrll relocation = (insn & ~0x7c000) | 0x1c000;
3758 1.1 skrll bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3759 1.1 skrll }
3760 1.1 skrll continue;
3761 1.1 skrll
3762 1.1 skrll case R_SPARC_TLS_LDM_ADD:
3763 1.1 skrll if (! info->shared)
3764 1.1 skrll bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3765 1.1 skrll continue;
3766 1.1 skrll
3767 1.1 skrll case R_SPARC_TLS_LDO_ADD:
3768 1.1 skrll if (! info->shared)
3769 1.1 skrll {
3770 1.1 skrll /* Change rs1 into %g7. */
3771 1.1 skrll bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3772 1.1 skrll insn = (insn & ~0x7c000) | 0x1c000;
3773 1.1 skrll bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3774 1.1 skrll }
3775 1.1 skrll continue;
3776 1.1 skrll
3777 1.1 skrll case R_SPARC_TLS_IE_LD:
3778 1.1 skrll case R_SPARC_TLS_IE_LDX:
3779 1.1 skrll if (! info->shared && (h == NULL || h->dynindx == -1))
3780 1.1 skrll {
3781 1.1 skrll bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3782 1.1 skrll int rs2 = insn & 0x1f;
3783 1.1 skrll int rd = (insn >> 25) & 0x1f;
3784 1.1 skrll
3785 1.1 skrll if (rs2 == rd)
3786 1.1 skrll relocation = SPARC_NOP;
3787 1.1 skrll else
3788 1.1 skrll relocation = 0x80100000 | (insn & 0x3e00001f);
3789 1.1 skrll bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3790 1.1 skrll }
3791 1.1 skrll continue;
3792 1.1 skrll
3793 1.1 skrll case R_SPARC_TLS_IE_ADD:
3794 1.1 skrll /* Totally useless relocation. */
3795 1.1 skrll continue;
3796 1.1 skrll
3797 1.1 skrll case R_SPARC_TLS_DTPOFF32:
3798 1.1 skrll case R_SPARC_TLS_DTPOFF64:
3799 1.1 skrll relocation -= dtpoff_base (info);
3800 1.1 skrll break;
3801 1.1 skrll
3802 1.1 skrll default:
3803 1.1 skrll break;
3804 1.1 skrll }
3805 1.1 skrll
3806 1.1 skrll /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3807 1.1 skrll because such sections are not SEC_ALLOC and thus ld.so will
3808 1.1 skrll not process them. */
3809 1.1 skrll if (unresolved_reloc
3810 1.1 skrll && !((input_section->flags & SEC_DEBUGGING) != 0
3811 1.1 skrll && h->def_dynamic))
3812 1.1 skrll (*_bfd_error_handler)
3813 1.1 skrll (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3814 1.1 skrll input_bfd,
3815 1.1 skrll input_section,
3816 1.1 skrll (long) rel->r_offset,
3817 1.1 skrll howto->name,
3818 1.1 skrll h->root.root.string);
3819 1.1 skrll
3820 1.1 skrll r = bfd_reloc_continue;
3821 1.1 skrll if (r_type == R_SPARC_OLO10)
3822 1.1 skrll {
3823 1.1 skrll bfd_vma x;
3824 1.1 skrll
3825 1.1 skrll if (! ABI_64_P (output_bfd))
3826 1.1 skrll abort ();
3827 1.1 skrll
3828 1.1 skrll relocation += rel->r_addend;
3829 1.1 skrll relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3830 1.1 skrll
3831 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3832 1.1 skrll x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3833 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3834 1.1 skrll
3835 1.1 skrll r = bfd_check_overflow (howto->complain_on_overflow,
3836 1.1 skrll howto->bitsize, howto->rightshift,
3837 1.1 skrll bfd_arch_bits_per_address (input_bfd),
3838 1.1 skrll relocation);
3839 1.1 skrll }
3840 1.1 skrll else if (r_type == R_SPARC_WDISP16)
3841 1.1 skrll {
3842 1.1 skrll bfd_vma x;
3843 1.1 skrll
3844 1.1 skrll relocation += rel->r_addend;
3845 1.1 skrll relocation -= (input_section->output_section->vma
3846 1.1 skrll + input_section->output_offset);
3847 1.1 skrll relocation -= rel->r_offset;
3848 1.1 skrll
3849 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3850 1.1 skrll x |= ((((relocation >> 2) & 0xc000) << 6)
3851 1.1 skrll | ((relocation >> 2) & 0x3fff));
3852 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3853 1.1 skrll
3854 1.1 skrll r = bfd_check_overflow (howto->complain_on_overflow,
3855 1.1 skrll howto->bitsize, howto->rightshift,
3856 1.1 skrll bfd_arch_bits_per_address (input_bfd),
3857 1.1 skrll relocation);
3858 1.1 skrll }
3859 1.1 skrll else if (r_type == R_SPARC_REV32)
3860 1.1 skrll {
3861 1.1 skrll bfd_vma x;
3862 1.1 skrll
3863 1.1 skrll relocation = relocation + rel->r_addend;
3864 1.1 skrll
3865 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3866 1.1 skrll x = x + relocation;
3867 1.1 skrll bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3868 1.1 skrll r = bfd_reloc_ok;
3869 1.1 skrll }
3870 1.1 skrll else if (r_type == R_SPARC_TLS_LDO_HIX22
3871 1.1 skrll || r_type == R_SPARC_TLS_LE_HIX22)
3872 1.1 skrll {
3873 1.1 skrll bfd_vma x;
3874 1.1 skrll
3875 1.1 skrll relocation += rel->r_addend;
3876 1.1 skrll if (r_type == R_SPARC_TLS_LE_HIX22)
3877 1.1 skrll relocation ^= MINUS_ONE;
3878 1.1 skrll
3879 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3880 1.1 skrll x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3881 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3882 1.1 skrll r = bfd_reloc_ok;
3883 1.1 skrll }
3884 1.1 skrll else if (r_type == R_SPARC_TLS_LDO_LOX10
3885 1.1 skrll || r_type == R_SPARC_TLS_LE_LOX10)
3886 1.1 skrll {
3887 1.1 skrll bfd_vma x;
3888 1.1 skrll
3889 1.1 skrll relocation += rel->r_addend;
3890 1.1 skrll relocation &= 0x3ff;
3891 1.1 skrll if (r_type == R_SPARC_TLS_LE_LOX10)
3892 1.1 skrll relocation |= 0x1c00;
3893 1.1 skrll
3894 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3895 1.3 christos x = (x & ~(bfd_vma) 0x1fff) | relocation;
3896 1.3 christos bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3897 1.1 skrll
3898 1.1 skrll r = bfd_reloc_ok;
3899 1.1 skrll }
3900 1.1 skrll else if (r_type == R_SPARC_HIX22
3901 1.3 christos || r_type == R_SPARC_GOTDATA_HIX22)
3902 1.3 christos {
3903 1.3 christos bfd_vma x;
3904 1.1 skrll
3905 1.1 skrll relocation += rel->r_addend;
3906 1.1 skrll if (r_type == R_SPARC_HIX22
3907 1.1 skrll || (bfd_signed_vma) relocation < 0)
3908 1.1 skrll relocation = relocation ^ MINUS_ONE;
3909 1.1 skrll
3910 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3911 1.1 skrll x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3912 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3913 1.1 skrll
3914 1.3 christos r = bfd_check_overflow (howto->complain_on_overflow,
3915 1.3 christos howto->bitsize, howto->rightshift,
3916 1.1 skrll bfd_arch_bits_per_address (input_bfd),
3917 1.1 skrll relocation);
3918 1.1 skrll }
3919 1.1 skrll else if (r_type == R_SPARC_LOX10
3920 1.3 christos || r_type == R_SPARC_GOTDATA_LOX10)
3921 1.3 christos {
3922 1.3 christos bfd_vma x;
3923 1.3 christos
3924 1.3 christos relocation += rel->r_addend;
3925 1.1 skrll if (r_type == R_SPARC_LOX10
3926 1.1 skrll || (bfd_signed_vma) relocation < 0)
3927 1.1 skrll relocation = (relocation & 0x3ff) | 0x1c00;
3928 1.1 skrll else
3929 1.1 skrll relocation = (relocation & 0x3ff);
3930 1.1 skrll
3931 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3932 1.1 skrll x = (x & ~(bfd_vma) 0x1fff) | relocation;
3933 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3934 1.1 skrll
3935 1.1 skrll r = bfd_reloc_ok;
3936 1.1 skrll }
3937 1.1 skrll else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3938 1.1 skrll && sec_do_relax (input_section)
3939 1.1 skrll && rel->r_offset + 4 < input_section->size)
3940 1.1 skrll {
3941 1.1 skrll #define G0 0
3942 1.1 skrll #define O7 15
3943 1.1 skrll #define XCC (2 << 20)
3944 1.1 skrll #define COND(x) (((x)&0xf)<<25)
3945 1.1 skrll #define CONDA COND(0x8)
3946 1.1 skrll #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
3947 1.1 skrll #define INSN_BA (F2(0,2) | CONDA)
3948 1.1 skrll #define INSN_OR F3(2, 0x2, 0)
3949 1.1 skrll #define INSN_NOP F2(0,4)
3950 1.1 skrll
3951 1.1 skrll bfd_vma x, y;
3952 1.1 skrll
3953 1.1 skrll /* If the instruction is a call with either:
3954 1.1 skrll restore
3955 1.1 skrll arithmetic instruction with rd == %o7
3956 1.1 skrll where rs1 != %o7 and rs2 if it is register != %o7
3957 1.1 skrll then we can optimize if the call destination is near
3958 1.1 skrll by changing the call into a branch always. */
3959 1.1 skrll x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3960 1.1 skrll y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3961 1.1 skrll if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3962 1.1 skrll {
3963 1.1 skrll if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3964 1.1 skrll || ((y & OP3(0x28)) == 0 /* arithmetic */
3965 1.1 skrll && (y & RD(~0)) == RD(O7)))
3966 1.1 skrll && (y & RS1(~0)) != RS1(O7)
3967 1.1 skrll && ((y & F3I(~0))
3968 1.1 skrll || (y & RS2(~0)) != RS2(O7)))
3969 1.1 skrll {
3970 1.1 skrll bfd_vma reloc;
3971 1.1 skrll
3972 1.1 skrll reloc = relocation + rel->r_addend - rel->r_offset;
3973 1.1 skrll reloc -= (input_section->output_section->vma
3974 1.1 skrll + input_section->output_offset);
3975 1.1 skrll
3976 1.1 skrll /* Ensure the branch fits into simm22. */
3977 1.1 skrll if ((reloc & 3) == 0
3978 1.1 skrll && ((reloc & ~(bfd_vma)0x7fffff) == 0
3979 1.1 skrll || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
3980 1.1 skrll {
3981 1.1 skrll reloc >>= 2;
3982 1.1 skrll
3983 1.1 skrll /* Check whether it fits into simm19. */
3984 1.1 skrll if (((reloc & 0x3c0000) == 0
3985 1.1 skrll || (reloc & 0x3c0000) == 0x3c0000)
3986 1.1 skrll && (ABI_64_P (output_bfd)
3987 1.1 skrll || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
3988 1.1 skrll x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
3989 1.1 skrll else
3990 1.1 skrll x = INSN_BA | (reloc & 0x3fffff); /* ba */
3991 1.1 skrll bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3992 1.1 skrll r = bfd_reloc_ok;
3993 1.1 skrll if (rel->r_offset >= 4
3994 1.1 skrll && (y & (0xffffffff ^ RS1(~0)))
3995 1.1 skrll == (INSN_OR | RD(O7) | RS2(G0)))
3996 1.1 skrll {
3997 1.1 skrll bfd_vma z;
3998 1.1 skrll unsigned int reg;
3999 1.1 skrll
4000 1.1 skrll z = bfd_get_32 (input_bfd,
4001 1.1 skrll contents + rel->r_offset - 4);
4002 1.1 skrll if ((z & (0xffffffff ^ RD(~0)))
4003 1.1 skrll != (INSN_OR | RS1(O7) | RS2(G0)))
4004 1.1 skrll break;
4005 1.1 skrll
4006 1.1 skrll /* The sequence was
4007 1.1 skrll or %o7, %g0, %rN
4008 1.1 skrll call foo
4009 1.1 skrll or %rN, %g0, %o7
4010 1.1 skrll
4011 1.1 skrll If call foo was replaced with ba, replace
4012 1.1 skrll or %rN, %g0, %o7 with nop. */
4013 1.1 skrll
4014 1.1 skrll reg = (y & RS1(~0)) >> 14;
4015 1.1 skrll if (reg != ((z & RD(~0)) >> 25)
4016 1.1 skrll || reg == G0 || reg == O7)
4017 1.1 skrll break;
4018 1.1 skrll
4019 1.1 skrll bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4020 1.1 skrll contents + rel->r_offset + 4);
4021 1.1 skrll }
4022 1.1 skrll
4023 1.1 skrll }
4024 1.3 christos }
4025 1.3 christos }
4026 1.3 christos }
4027 1.3 christos
4028 1.3 christos if (r == bfd_reloc_continue)
4029 1.3 christos {
4030 1.1 skrll do_relocation:
4031 1.1 skrll r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4032 1.1 skrll contents, rel->r_offset,
4033 1.1 skrll relocation, rel->r_addend);
4034 1.1 skrll }
4035 1.1 skrll if (r != bfd_reloc_ok)
4036 1.1 skrll {
4037 1.1 skrll switch (r)
4038 1.1 skrll {
4039 1.1 skrll default:
4040 1.1 skrll case bfd_reloc_outofrange:
4041 1.1 skrll abort ();
4042 1.1 skrll case bfd_reloc_overflow:
4043 1.1 skrll {
4044 1.1 skrll const char *name;
4045 1.1 skrll
4046 1.1 skrll /* The Solaris native linker silently disregards overflows.
4047 1.1 skrll We don't, but this breaks stabs debugging info, whose
4048 1.1 skrll relocations are only 32-bits wide. Ignore overflows in
4049 1.1 skrll this case and also for discarded entries. */
4050 1.1 skrll if ((r_type == R_SPARC_32 || r_type == R_SPARC_DISP32)
4051 1.1 skrll && (((input_section->flags & SEC_DEBUGGING) != 0
4052 1.1 skrll && strcmp (bfd_section_name (input_bfd,
4053 1.1 skrll input_section),
4054 1.1 skrll ".stab") == 0)
4055 1.1 skrll || _bfd_elf_section_offset (output_bfd, info,
4056 1.1 skrll input_section,
4057 1.1 skrll rel->r_offset)
4058 1.1 skrll == (bfd_vma)-1))
4059 1.1 skrll break;
4060 1.1 skrll
4061 1.1 skrll if (h != NULL)
4062 1.1 skrll {
4063 1.1 skrll /* Assume this is a call protected by other code that
4064 1.1 skrll detect the symbol is undefined. If this is the case,
4065 1.1 skrll we can safely ignore the overflow. If not, the
4066 1.1 skrll program is hosed anyway, and a little warning isn't
4067 1.1 skrll going to help. */
4068 1.1 skrll if (h->root.type == bfd_link_hash_undefweak
4069 1.1 skrll && howto->pc_relative)
4070 1.1 skrll break;
4071 1.1 skrll
4072 1.1 skrll name = NULL;
4073 1.1 skrll }
4074 1.1 skrll else
4075 1.1 skrll {
4076 1.1 skrll name = bfd_elf_string_from_elf_section (input_bfd,
4077 1.1 skrll symtab_hdr->sh_link,
4078 1.1 skrll sym->st_name);
4079 1.1 skrll if (name == NULL)
4080 1.1 skrll return FALSE;
4081 1.1 skrll if (*name == '\0')
4082 1.1 skrll name = bfd_section_name (input_bfd, sec);
4083 1.1 skrll }
4084 1.1 skrll if (! ((*info->callbacks->reloc_overflow)
4085 1.1 skrll (info, (h ? &h->root : NULL), name, howto->name,
4086 1.1 skrll (bfd_vma) 0, input_bfd, input_section,
4087 1.1 skrll rel->r_offset)))
4088 1.1 skrll return FALSE;
4089 1.1 skrll }
4090 1.1 skrll break;
4091 1.1 skrll }
4092 1.1 skrll }
4093 1.1 skrll }
4094 1.1 skrll
4095 1.1 skrll return TRUE;
4096 1.1 skrll }
4097 1.1 skrll
4098 1.1 skrll /* Build a VxWorks PLT entry. PLT_INDEX is the index of the PLT entry
4099 1.1 skrll and PLT_OFFSET is the byte offset from the start of .plt. GOT_OFFSET
4100 1.1 skrll is the offset of the associated .got.plt entry from
4101 1.1 skrll _GLOBAL_OFFSET_TABLE_. */
4102 1.1 skrll
4103 1.1 skrll static void
4104 1.1 skrll sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4105 1.1 skrll bfd_vma plt_offset, bfd_vma plt_index,
4106 1.1 skrll bfd_vma got_offset)
4107 1.1 skrll {
4108 1.1 skrll bfd_vma got_base;
4109 1.1 skrll const bfd_vma *plt_entry;
4110 1.3 christos struct _bfd_sparc_elf_link_hash_table *htab;
4111 1.3 christos bfd_byte *loc;
4112 1.1 skrll Elf_Internal_Rela rela;
4113 1.1 skrll
4114 1.1 skrll htab = _bfd_sparc_elf_hash_table (info);
4115 1.1 skrll BFD_ASSERT (htab != NULL);
4116 1.1 skrll
4117 1.1 skrll if (info->shared)
4118 1.1 skrll {
4119 1.1 skrll plt_entry = sparc_vxworks_shared_plt_entry;
4120 1.1 skrll got_base = 0;
4121 1.1 skrll }
4122 1.1 skrll else
4123 1.1 skrll {
4124 1.1 skrll plt_entry = sparc_vxworks_exec_plt_entry;
4125 1.1 skrll got_base = (htab->elf.hgot->root.u.def.value
4126 1.1 skrll + htab->elf.hgot->root.u.def.section->output_offset
4127 1.3 christos + htab->elf.hgot->root.u.def.section->output_section->vma);
4128 1.1 skrll }
4129 1.3 christos
4130 1.1 skrll /* Fill in the entry in the procedure linkage table. */
4131 1.3 christos bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4132 1.1 skrll htab->elf.splt->contents + plt_offset);
4133 1.3 christos bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4134 1.1 skrll htab->elf.splt->contents + plt_offset + 4);
4135 1.3 christos bfd_put_32 (output_bfd, plt_entry[2],
4136 1.1 skrll htab->elf.splt->contents + plt_offset + 8);
4137 1.3 christos bfd_put_32 (output_bfd, plt_entry[3],
4138 1.1 skrll htab->elf.splt->contents + plt_offset + 12);
4139 1.1 skrll bfd_put_32 (output_bfd, plt_entry[4],
4140 1.1 skrll htab->elf.splt->contents + plt_offset + 16);
4141 1.1 skrll bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4142 1.3 christos htab->elf.splt->contents + plt_offset + 20);
4143 1.1 skrll /* PC-relative displacement for a branch to the start of
4144 1.3 christos the PLT section. */
4145 1.1 skrll bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4146 1.1 skrll & 0x003fffff),
4147 1.1 skrll htab->elf.splt->contents + plt_offset + 24);
4148 1.3 christos bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4149 1.1 skrll htab->elf.splt->contents + plt_offset + 28);
4150 1.3 christos
4151 1.3 christos /* Fill in the .got.plt entry, pointing initially at the
4152 1.1 skrll second half of the PLT entry. */
4153 1.3 christos BFD_ASSERT (htab->elf.sgotplt != NULL);
4154 1.1 skrll bfd_put_32 (output_bfd,
4155 1.1 skrll htab->elf.splt->output_section->vma
4156 1.1 skrll + htab->elf.splt->output_offset
4157 1.1 skrll + plt_offset + 20,
4158 1.1 skrll htab->elf.sgotplt->contents + got_offset);
4159 1.1 skrll
4160 1.1 skrll /* Add relocations to .rela.plt.unloaded. */
4161 1.1 skrll if (!info->shared)
4162 1.3 christos {
4163 1.3 christos loc = (htab->srelplt2->contents
4164 1.1 skrll + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4165 1.1 skrll
4166 1.1 skrll /* Relocate the initial sethi. */
4167 1.1 skrll rela.r_offset = (htab->elf.splt->output_section->vma
4168 1.1 skrll + htab->elf.splt->output_offset
4169 1.1 skrll + plt_offset);
4170 1.1 skrll rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4171 1.1 skrll rela.r_addend = got_offset;
4172 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4173 1.1 skrll loc += sizeof (Elf32_External_Rela);
4174 1.1 skrll
4175 1.1 skrll /* Likewise the following or. */
4176 1.1 skrll rela.r_offset += 4;
4177 1.3 christos rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4178 1.3 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4179 1.1 skrll loc += sizeof (Elf32_External_Rela);
4180 1.1 skrll
4181 1.1 skrll /* Relocate the .got.plt entry. */
4182 1.1 skrll rela.r_offset = (htab->elf.sgotplt->output_section->vma
4183 1.1 skrll + htab->elf.sgotplt->output_offset
4184 1.1 skrll + got_offset);
4185 1.1 skrll rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4186 1.1 skrll rela.r_addend = plt_offset + 20;
4187 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4188 1.1 skrll }
4189 1.1 skrll }
4190 1.1 skrll
4191 1.1 skrll /* Finish up dynamic symbol handling. We set the contents of various
4192 1.1 skrll dynamic sections here. */
4193 1.1 skrll
4194 1.1 skrll bfd_boolean
4195 1.1 skrll _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4196 1.1 skrll struct bfd_link_info *info,
4197 1.1 skrll struct elf_link_hash_entry *h,
4198 1.1 skrll Elf_Internal_Sym *sym)
4199 1.3 christos {
4200 1.1 skrll struct _bfd_sparc_elf_link_hash_table *htab;
4201 1.1 skrll const struct elf_backend_data *bed;
4202 1.1 skrll
4203 1.1 skrll htab = _bfd_sparc_elf_hash_table (info);
4204 1.1 skrll BFD_ASSERT (htab != NULL);
4205 1.1 skrll bed = get_elf_backend_data (output_bfd);
4206 1.1 skrll
4207 1.1 skrll if (h->plt.offset != (bfd_vma) -1)
4208 1.1 skrll {
4209 1.1 skrll asection *splt;
4210 1.1 skrll asection *srela;
4211 1.3 christos Elf_Internal_Rela rela;
4212 1.3 christos bfd_byte *loc;
4213 1.3 christos bfd_vma r_offset, got_offset;
4214 1.3 christos int rela_index;
4215 1.3 christos
4216 1.3 christos /* When building a static executable, use .iplt and
4217 1.3 christos .rela.iplt sections for STT_GNU_IFUNC symbols. */
4218 1.3 christos if (htab->elf.splt != NULL)
4219 1.3 christos {
4220 1.3 christos splt = htab->elf.splt;
4221 1.3 christos srela = htab->elf.srelplt;
4222 1.3 christos }
4223 1.1 skrll else
4224 1.3 christos {
4225 1.3 christos splt = htab->elf.iplt;
4226 1.1 skrll srela = htab->elf.irelplt;
4227 1.1 skrll }
4228 1.1 skrll
4229 1.1 skrll if (splt == NULL || srela == NULL)
4230 1.1 skrll abort ();
4231 1.1 skrll
4232 1.1 skrll /* Fill in the entry in the .rela.plt section. */
4233 1.1 skrll if (htab->is_vxworks)
4234 1.1 skrll {
4235 1.1 skrll /* Work out the index of this PLT entry. */
4236 1.1 skrll rela_index = ((h->plt.offset - htab->plt_header_size)
4237 1.1 skrll / htab->plt_entry_size);
4238 1.1 skrll
4239 1.1 skrll /* Calculate the offset of the associated .got.plt entry.
4240 1.1 skrll The first three entries are reserved. */
4241 1.1 skrll got_offset = (rela_index + 3) * 4;
4242 1.1 skrll
4243 1.1 skrll sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4244 1.3 christos rela_index, got_offset);
4245 1.3 christos
4246 1.1 skrll
4247 1.1 skrll /* On VxWorks, the relocation points to the .got.plt entry,
4248 1.3 christos not the .plt entry. */
4249 1.3 christos rela.r_offset = (htab->elf.sgotplt->output_section->vma
4250 1.1 skrll + htab->elf.sgotplt->output_offset
4251 1.1 skrll + got_offset);
4252 1.1 skrll rela.r_addend = 0;
4253 1.3 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4254 1.3 christos R_SPARC_JMP_SLOT);
4255 1.1 skrll }
4256 1.1 skrll else
4257 1.1 skrll {
4258 1.1 skrll bfd_boolean ifunc = FALSE;
4259 1.1 skrll
4260 1.3 christos /* Fill in the entry in the procedure linkage table. */
4261 1.3 christos rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4262 1.3 christos h->plt.offset, splt->size,
4263 1.3 christos &r_offset);
4264 1.3 christos
4265 1.3 christos if (h == NULL
4266 1.3 christos || h->dynindx == -1
4267 1.3 christos || ((info->executable
4268 1.3 christos || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4269 1.3 christos && h->def_regular
4270 1.3 christos && h->type == STT_GNU_IFUNC))
4271 1.3 christos {
4272 1.3 christos ifunc = TRUE;
4273 1.3 christos BFD_ASSERT (h == NULL
4274 1.3 christos || (h->type == STT_GNU_IFUNC
4275 1.1 skrll && h->def_regular
4276 1.1 skrll && (h->root.type == bfd_link_hash_defined
4277 1.3 christos || h->root.type == bfd_link_hash_defweak)));
4278 1.3 christos }
4279 1.1 skrll
4280 1.3 christos rela.r_offset = r_offset
4281 1.3 christos + (splt->output_section->vma + splt->output_offset);
4282 1.3 christos if (ABI_64_P (output_bfd)
4283 1.3 christos && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4284 1.3 christos {
4285 1.3 christos if (ifunc)
4286 1.3 christos {
4287 1.3 christos rela.r_addend = (h->root.u.def.section->output_section->vma
4288 1.3 christos + h->root.u.def.section->output_offset
4289 1.3 christos + h->root.u.def.value);
4290 1.3 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4291 1.3 christos R_SPARC_IRELATIVE);
4292 1.3 christos }
4293 1.3 christos else
4294 1.3 christos {
4295 1.3 christos rela.r_addend = (-(h->plt.offset + 4)
4296 1.1 skrll - splt->output_section->vma
4297 1.1 skrll - splt->output_offset);
4298 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4299 1.3 christos R_SPARC_JMP_SLOT);
4300 1.3 christos }
4301 1.3 christos }
4302 1.3 christos else
4303 1.3 christos {
4304 1.3 christos if (ifunc)
4305 1.3 christos {
4306 1.3 christos rela.r_addend = (h->root.u.def.section->output_section->vma
4307 1.3 christos + h->root.u.def.section->output_offset
4308 1.3 christos + h->root.u.def.value);
4309 1.3 christos rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4310 1.3 christos R_SPARC_JMP_IREL);
4311 1.3 christos }
4312 1.3 christos else
4313 1.1 skrll {
4314 1.1 skrll rela.r_addend = 0;
4315 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4316 1.1 skrll R_SPARC_JMP_SLOT);
4317 1.1 skrll }
4318 1.1 skrll }
4319 1.1 skrll }
4320 1.1 skrll
4321 1.1 skrll /* Adjust for the first 4 reserved elements in the .plt section
4322 1.1 skrll when setting the offset in the .rela.plt section.
4323 1.1 skrll Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4324 1.1 skrll thus .plt[4] has corresponding .rela.plt[0] and so on. */
4325 1.1 skrll
4326 1.1 skrll loc = srela->contents;
4327 1.1 skrll loc += rela_index * bed->s->sizeof_rela;
4328 1.1 skrll bed->s->swap_reloca_out (output_bfd, &rela, loc);
4329 1.1 skrll
4330 1.1 skrll if (!h->def_regular)
4331 1.1 skrll {
4332 1.1 skrll /* Mark the symbol as undefined, rather than as defined in
4333 1.1 skrll the .plt section. Leave the value alone. */
4334 1.1 skrll sym->st_shndx = SHN_UNDEF;
4335 1.1 skrll /* If the symbol is weak, we do need to clear the value.
4336 1.1 skrll Otherwise, the PLT entry would provide a definition for
4337 1.1 skrll the symbol even if the symbol wasn't defined anywhere,
4338 1.1 skrll and so the symbol would never be NULL. */
4339 1.1 skrll if (!h->ref_regular_nonweak)
4340 1.1 skrll sym->st_value = 0;
4341 1.1 skrll }
4342 1.1 skrll }
4343 1.1 skrll
4344 1.1 skrll if (h->got.offset != (bfd_vma) -1
4345 1.1 skrll && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4346 1.1 skrll && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
4347 1.1 skrll {
4348 1.1 skrll asection *sgot;
4349 1.3 christos asection *srela;
4350 1.3 christos Elf_Internal_Rela rela;
4351 1.1 skrll
4352 1.1 skrll /* This symbol has an entry in the GOT. Set it up. */
4353 1.1 skrll
4354 1.1 skrll sgot = htab->elf.sgot;
4355 1.1 skrll srela = htab->elf.srelgot;
4356 1.1 skrll BFD_ASSERT (sgot != NULL && srela != NULL);
4357 1.1 skrll
4358 1.1 skrll rela.r_offset = (sgot->output_section->vma
4359 1.1 skrll + sgot->output_offset
4360 1.1 skrll + (h->got.offset &~ (bfd_vma) 1));
4361 1.1 skrll
4362 1.3 christos /* If this is a -Bsymbolic link, and the symbol is defined
4363 1.3 christos locally, we just want to emit a RELATIVE reloc. Likewise if
4364 1.1 skrll the symbol was forced to be local because of a version file.
4365 1.1 skrll The entry in the global offset table will already have been
4366 1.3 christos initialized in the relocate_section function. */
4367 1.3 christos if (! info->shared
4368 1.3 christos && h->type == STT_GNU_IFUNC
4369 1.3 christos && h->def_regular)
4370 1.3 christos {
4371 1.3 christos asection *plt;
4372 1.3 christos
4373 1.3 christos /* We load the GOT entry with the PLT entry. */
4374 1.3 christos plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4375 1.3 christos SPARC_ELF_PUT_WORD (htab, output_bfd,
4376 1.3 christos (plt->output_section->vma
4377 1.3 christos + plt->output_offset + h->plt.offset),
4378 1.3 christos htab->elf.sgot->contents
4379 1.3 christos + (h->got.offset & ~(bfd_vma) 1));
4380 1.1 skrll return TRUE;
4381 1.3 christos }
4382 1.3 christos else if (info->shared
4383 1.3 christos && SYMBOL_REFERENCES_LOCAL (info, h))
4384 1.3 christos {
4385 1.1 skrll asection *sec = h->root.u.def.section;
4386 1.1 skrll if (h->type == STT_GNU_IFUNC)
4387 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4388 1.1 skrll else
4389 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4390 1.1 skrll rela.r_addend = (h->root.u.def.value
4391 1.1 skrll + sec->output_section->vma
4392 1.1 skrll + sec->output_offset);
4393 1.1 skrll }
4394 1.1 skrll else
4395 1.1 skrll {
4396 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4397 1.1 skrll rela.r_addend = 0;
4398 1.1 skrll }
4399 1.1 skrll
4400 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4401 1.1 skrll sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4402 1.1 skrll sparc_elf_append_rela (output_bfd, srela, &rela);
4403 1.1 skrll }
4404 1.1 skrll
4405 1.1 skrll if (h->needs_copy)
4406 1.1 skrll {
4407 1.1 skrll asection *s;
4408 1.1 skrll Elf_Internal_Rela rela;
4409 1.1 skrll
4410 1.1 skrll /* This symbols needs a copy reloc. Set it up. */
4411 1.1 skrll BFD_ASSERT (h->dynindx != -1);
4412 1.1 skrll
4413 1.1 skrll s = bfd_get_section_by_name (h->root.u.def.section->owner,
4414 1.1 skrll ".rela.bss");
4415 1.1 skrll BFD_ASSERT (s != NULL);
4416 1.1 skrll
4417 1.1 skrll rela.r_offset = (h->root.u.def.value
4418 1.1 skrll + h->root.u.def.section->output_section->vma
4419 1.1 skrll + h->root.u.def.section->output_offset);
4420 1.1 skrll rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4421 1.1 skrll rela.r_addend = 0;
4422 1.1 skrll sparc_elf_append_rela (output_bfd, s, &rela);
4423 1.3 christos }
4424 1.3 christos
4425 1.3 christos /* Mark some specially defined symbols as absolute. On VxWorks,
4426 1.3 christos _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4427 1.1 skrll ".got" section. Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt". */
4428 1.1 skrll if (sym != NULL
4429 1.1 skrll && (strcmp (h->root.root.string, "_DYNAMIC") == 0
4430 1.1 skrll || (!htab->is_vxworks
4431 1.1 skrll && (h == htab->elf.hgot || h == htab->elf.hplt))))
4432 1.1 skrll sym->st_shndx = SHN_ABS;
4433 1.1 skrll
4434 1.1 skrll return TRUE;
4435 1.1 skrll }
4436 1.1 skrll
4437 1.1 skrll /* Finish up the dynamic sections. */
4438 1.1 skrll
4439 1.1 skrll static bfd_boolean
4440 1.1 skrll sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4441 1.1 skrll bfd *dynobj, asection *sdyn,
4442 1.1 skrll asection *splt ATTRIBUTE_UNUSED)
4443 1.1 skrll {
4444 1.1 skrll struct _bfd_sparc_elf_link_hash_table *htab;
4445 1.1 skrll const struct elf_backend_data *bed;
4446 1.1 skrll bfd_byte *dyncon, *dynconend;
4447 1.3 christos size_t dynsize;
4448 1.1 skrll int stt_regidx = -1;
4449 1.1 skrll bfd_boolean abi_64_p;
4450 1.1 skrll
4451 1.1 skrll htab = _bfd_sparc_elf_hash_table (info);
4452 1.1 skrll BFD_ASSERT (htab != NULL);
4453 1.1 skrll bed = get_elf_backend_data (output_bfd);
4454 1.1 skrll dynsize = bed->s->sizeof_dyn;
4455 1.1 skrll dynconend = sdyn->contents + sdyn->size;
4456 1.1 skrll abi_64_p = ABI_64_P (output_bfd);
4457 1.1 skrll for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4458 1.1 skrll {
4459 1.1 skrll Elf_Internal_Dyn dyn;
4460 1.1 skrll const char *name;
4461 1.1 skrll bfd_boolean size;
4462 1.1 skrll
4463 1.1 skrll bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4464 1.3 christos
4465 1.1 skrll if (htab->is_vxworks && dyn.d_tag == DT_RELASZ)
4466 1.3 christos {
4467 1.1 skrll /* On VxWorks, DT_RELASZ should not include the relocations
4468 1.1 skrll in .rela.plt. */
4469 1.1 skrll if (htab->elf.srelplt)
4470 1.1 skrll {
4471 1.1 skrll dyn.d_un.d_val -= htab->elf.srelplt->size;
4472 1.1 skrll bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4473 1.1 skrll }
4474 1.3 christos }
4475 1.1 skrll else if (htab->is_vxworks && dyn.d_tag == DT_PLTGOT)
4476 1.3 christos {
4477 1.3 christos /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4478 1.1 skrll not to the start of the PLT. */
4479 1.1 skrll if (htab->elf.sgotplt)
4480 1.1 skrll {
4481 1.1 skrll dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4482 1.1 skrll + htab->elf.sgotplt->output_offset);
4483 1.1 skrll bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4484 1.1 skrll }
4485 1.1 skrll }
4486 1.1 skrll else if (htab->is_vxworks
4487 1.1 skrll && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4488 1.1 skrll bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4489 1.1 skrll else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4490 1.1 skrll {
4491 1.1 skrll if (stt_regidx == -1)
4492 1.1 skrll {
4493 1.1 skrll stt_regidx =
4494 1.1 skrll _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4495 1.1 skrll if (stt_regidx == -1)
4496 1.1 skrll return FALSE;
4497 1.1 skrll }
4498 1.1 skrll dyn.d_un.d_val = stt_regidx++;
4499 1.1 skrll bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4500 1.1 skrll }
4501 1.1 skrll else
4502 1.1 skrll {
4503 1.1 skrll switch (dyn.d_tag)
4504 1.1 skrll {
4505 1.1 skrll case DT_PLTGOT: name = ".plt"; size = FALSE; break;
4506 1.1 skrll case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
4507 1.1 skrll case DT_JMPREL: name = ".rela.plt"; size = FALSE; break;
4508 1.1 skrll default: name = NULL; size = FALSE; break;
4509 1.1 skrll }
4510 1.1 skrll
4511 1.1 skrll if (name != NULL)
4512 1.1 skrll {
4513 1.1 skrll asection *s;
4514 1.1 skrll
4515 1.1 skrll s = bfd_get_section_by_name (output_bfd, name);
4516 1.1 skrll if (s == NULL)
4517 1.1 skrll dyn.d_un.d_val = 0;
4518 1.1 skrll else
4519 1.1 skrll {
4520 1.1 skrll if (! size)
4521 1.1 skrll dyn.d_un.d_ptr = s->vma;
4522 1.1 skrll else
4523 1.1 skrll dyn.d_un.d_val = s->size;
4524 1.1 skrll }
4525 1.1 skrll bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4526 1.1 skrll }
4527 1.1 skrll }
4528 1.1 skrll }
4529 1.1 skrll return TRUE;
4530 1.1 skrll }
4531 1.1 skrll
4532 1.1 skrll /* Install the first PLT entry in a VxWorks executable and make sure that
4533 1.1 skrll .rela.plt.unloaded relocations have the correct symbol indexes. */
4534 1.1 skrll
4535 1.1 skrll static void
4536 1.1 skrll sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4537 1.1 skrll {
4538 1.1 skrll struct _bfd_sparc_elf_link_hash_table *htab;
4539 1.3 christos Elf_Internal_Rela rela;
4540 1.1 skrll bfd_vma got_base;
4541 1.1 skrll bfd_byte *loc;
4542 1.1 skrll
4543 1.1 skrll htab = _bfd_sparc_elf_hash_table (info);
4544 1.1 skrll BFD_ASSERT (htab != NULL);
4545 1.1 skrll
4546 1.1 skrll /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_. */
4547 1.1 skrll got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4548 1.1 skrll + htab->elf.hgot->root.u.def.section->output_offset
4549 1.3 christos + htab->elf.hgot->root.u.def.value);
4550 1.1 skrll
4551 1.1 skrll /* Install the initial PLT entry. */
4552 1.3 christos bfd_put_32 (output_bfd,
4553 1.1 skrll sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4554 1.1 skrll htab->elf.splt->contents);
4555 1.3 christos bfd_put_32 (output_bfd,
4556 1.1 skrll sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4557 1.1 skrll htab->elf.splt->contents + 4);
4558 1.3 christos bfd_put_32 (output_bfd,
4559 1.1 skrll sparc_vxworks_exec_plt0_entry[2],
4560 1.1 skrll htab->elf.splt->contents + 8);
4561 1.3 christos bfd_put_32 (output_bfd,
4562 1.1 skrll sparc_vxworks_exec_plt0_entry[3],
4563 1.1 skrll htab->elf.splt->contents + 12);
4564 1.1 skrll bfd_put_32 (output_bfd,
4565 1.1 skrll sparc_vxworks_exec_plt0_entry[4],
4566 1.3 christos htab->elf.splt->contents + 16);
4567 1.3 christos
4568 1.1 skrll loc = htab->srelplt2->contents;
4569 1.1 skrll
4570 1.1 skrll /* Add an unloaded relocation for the initial entry's "sethi". */
4571 1.1 skrll rela.r_offset = (htab->elf.splt->output_section->vma
4572 1.1 skrll + htab->elf.splt->output_offset);
4573 1.1 skrll rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4574 1.1 skrll rela.r_addend = 8;
4575 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4576 1.1 skrll loc += sizeof (Elf32_External_Rela);
4577 1.1 skrll
4578 1.1 skrll /* Likewise the following "or". */
4579 1.1 skrll rela.r_offset += 4;
4580 1.1 skrll rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4581 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4582 1.1 skrll loc += sizeof (Elf32_External_Rela);
4583 1.1 skrll
4584 1.1 skrll /* Fix up the remaining .rela.plt.unloaded relocations. They may have
4585 1.1 skrll the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4586 1.1 skrll in which symbols were output. */
4587 1.1 skrll while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4588 1.1 skrll {
4589 1.1 skrll Elf_Internal_Rela rel;
4590 1.1 skrll
4591 1.1 skrll /* The entry's initial "sethi" (against _G_O_T_). */
4592 1.1 skrll bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4593 1.1 skrll rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4594 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4595 1.1 skrll loc += sizeof (Elf32_External_Rela);
4596 1.1 skrll
4597 1.1 skrll /* The following "or" (also against _G_O_T_). */
4598 1.1 skrll bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4599 1.1 skrll rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4600 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4601 1.1 skrll loc += sizeof (Elf32_External_Rela);
4602 1.1 skrll
4603 1.1 skrll /* The .got.plt entry (against _P_L_T_). */
4604 1.1 skrll bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4605 1.1 skrll rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4606 1.1 skrll bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4607 1.1 skrll loc += sizeof (Elf32_External_Rela);
4608 1.1 skrll }
4609 1.1 skrll }
4610 1.1 skrll
4611 1.1 skrll /* Install the first PLT entry in a VxWorks shared object. */
4612 1.1 skrll
4613 1.1 skrll static void
4614 1.1 skrll sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4615 1.3 christos {
4616 1.3 christos struct _bfd_sparc_elf_link_hash_table *htab;
4617 1.1 skrll unsigned int i;
4618 1.1 skrll
4619 1.3 christos htab = _bfd_sparc_elf_hash_table (info);
4620 1.3 christos BFD_ASSERT (htab != NULL);
4621 1.3 christos
4622 1.3 christos for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4623 1.3 christos bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4624 1.3 christos htab->elf.splt->contents + i * 4);
4625 1.3 christos }
4626 1.3 christos
4627 1.3 christos /* Finish up local dynamic symbol handling. We set the contents of
4628 1.3 christos various dynamic sections here. */
4629 1.3 christos
4630 1.3 christos static bfd_boolean
4631 1.3 christos finish_local_dynamic_symbol (void **slot, void *inf)
4632 1.3 christos {
4633 1.3 christos struct elf_link_hash_entry *h
4634 1.3 christos = (struct elf_link_hash_entry *) *slot;
4635 1.1 skrll struct bfd_link_info *info
4636 1.1 skrll = (struct bfd_link_info *) inf;
4637 1.1 skrll
4638 1.1 skrll return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4639 1.1 skrll h, NULL);
4640 1.1 skrll }
4641 1.1 skrll
4642 1.1 skrll bfd_boolean
4643 1.1 skrll _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4644 1.1 skrll {
4645 1.3 christos bfd *dynobj;
4646 1.1 skrll asection *sdyn;
4647 1.1 skrll struct _bfd_sparc_elf_link_hash_table *htab;
4648 1.1 skrll
4649 1.1 skrll htab = _bfd_sparc_elf_hash_table (info);
4650 1.1 skrll BFD_ASSERT (htab != NULL);
4651 1.1 skrll dynobj = htab->elf.dynobj;
4652 1.1 skrll
4653 1.1 skrll sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4654 1.1 skrll
4655 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created)
4656 1.1 skrll {
4657 1.1 skrll asection *splt;
4658 1.1 skrll
4659 1.1 skrll splt = bfd_get_section_by_name (dynobj, ".plt");
4660 1.1 skrll BFD_ASSERT (splt != NULL && sdyn != NULL);
4661 1.1 skrll
4662 1.1 skrll if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4663 1.1 skrll return FALSE;
4664 1.1 skrll
4665 1.1 skrll /* Initialize the contents of the .plt section. */
4666 1.1 skrll if (splt->size > 0)
4667 1.1 skrll {
4668 1.1 skrll if (htab->is_vxworks)
4669 1.1 skrll {
4670 1.1 skrll if (info->shared)
4671 1.1 skrll sparc_vxworks_finish_shared_plt (output_bfd, info);
4672 1.1 skrll else
4673 1.1 skrll sparc_vxworks_finish_exec_plt (output_bfd, info);
4674 1.1 skrll }
4675 1.1 skrll else
4676 1.1 skrll {
4677 1.1 skrll memset (splt->contents, 0, htab->plt_header_size);
4678 1.1 skrll if (!ABI_64_P (output_bfd))
4679 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4680 1.1 skrll splt->contents + splt->size - 4);
4681 1.1 skrll }
4682 1.1 skrll }
4683 1.1 skrll
4684 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize
4685 1.1 skrll = (htab->is_vxworks || !ABI_64_P (output_bfd))
4686 1.3 christos ? 0 : htab->plt_entry_size;
4687 1.1 skrll }
4688 1.1 skrll
4689 1.1 skrll /* Set the first entry in the global offset table to the address of
4690 1.1 skrll the dynamic section. */
4691 1.1 skrll if (htab->elf.sgot && htab->elf.sgot->size > 0)
4692 1.3 christos {
4693 1.1 skrll bfd_vma val = (sdyn ?
4694 1.1 skrll sdyn->output_section->vma + sdyn->output_offset :
4695 1.3 christos 0);
4696 1.3 christos
4697 1.1 skrll SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
4698 1.1 skrll }
4699 1.3 christos
4700 1.3 christos if (htab->elf.sgot)
4701 1.3 christos elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4702 1.1 skrll SPARC_ELF_WORD_BYTES (htab);
4703 1.1 skrll
4704 1.1 skrll /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols. */
4705 1.1 skrll htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
4706 1.1 skrll
4707 1.1 skrll return TRUE;
4708 1.1 skrll }
4709 1.1 skrll
4710 1.1 skrll
4711 1.1 skrll /* Set the right machine number for a SPARC ELF file. */
4713 1.1 skrll
4714 1.1 skrll bfd_boolean
4715 1.1 skrll _bfd_sparc_elf_object_p (bfd *abfd)
4716 1.1 skrll {
4717 1.1 skrll if (ABI_64_P (abfd))
4718 1.1 skrll {
4719 1.1 skrll unsigned long mach = bfd_mach_sparc_v9;
4720 1.1 skrll
4721 1.1 skrll if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4722 1.1 skrll mach = bfd_mach_sparc_v9b;
4723 1.1 skrll else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4724 1.1 skrll mach = bfd_mach_sparc_v9a;
4725 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
4726 1.1 skrll }
4727 1.1 skrll else
4728 1.1 skrll {
4729 1.1 skrll if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
4730 1.1 skrll {
4731 1.1 skrll if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4732 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4733 1.1 skrll bfd_mach_sparc_v8plusb);
4734 1.1 skrll else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4735 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4736 1.1 skrll bfd_mach_sparc_v8plusa);
4737 1.1 skrll else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
4738 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4739 1.1 skrll bfd_mach_sparc_v8plus);
4740 1.1 skrll else
4741 1.1 skrll return FALSE;
4742 1.1 skrll }
4743 1.1 skrll else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
4744 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4745 1.1 skrll bfd_mach_sparc_sparclite_le);
4746 1.1 skrll else
4747 1.1 skrll return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
4748 1.1 skrll }
4749 1.1 skrll }
4750 1.1 skrll
4751 1.1 skrll /* Return address for Ith PLT stub in section PLT, for relocation REL
4752 1.1 skrll or (bfd_vma) -1 if it should not be included. */
4753 1.1 skrll
4754 1.1 skrll bfd_vma
4755 1.1 skrll _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
4756 1.1 skrll {
4757 1.1 skrll if (ABI_64_P (plt->owner))
4758 1.1 skrll {
4759 1.1 skrll bfd_vma j;
4760 1.1 skrll
4761 1.1 skrll i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
4762 1.1 skrll if (i < PLT64_LARGE_THRESHOLD)
4763 1.1 skrll return plt->vma + i * PLT64_ENTRY_SIZE;
4764 1.1 skrll
4765 1.1 skrll j = (i - PLT64_LARGE_THRESHOLD) % 160;
4766 i -= j;
4767 return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
4768 }
4769 else
4770 return rel->address;
4771 }
4772