Update the address and phone number of the FSF organization in the GPL notices
[deliverable/binutils-gdb.git] / bfd / elfxx-sparc.c
1 /* SPARC-specific support for ELF
2 Copyright 2005 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
19
20 /* This file handles functionality common to the different SPARC ABI's. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/sparc.h"
28 #include "opcode/sparc.h"
29 #include "elfxx-sparc.h"
30
31 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
32 #define MINUS_ONE (~ (bfd_vma) 0)
33
34 #define ABI_64_P(abfd) \
35 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
36
37 /* The relocation "howto" table. */
38
39 /* Utility for performing the standard initial work of an instruction
40 relocation.
41 *PRELOCATION will contain the relocated item.
42 *PINSN will contain the instruction from the input stream.
43 If the result is `bfd_reloc_other' the caller can continue with
44 performing the relocation. Otherwise it must stop and return the
45 value to its caller. */
46
47 static bfd_reloc_status_type
48 init_insn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
49 PTR data, asection *input_section, bfd *output_bfd,
50 bfd_vma *prelocation, bfd_vma *pinsn)
51 {
52 bfd_vma relocation;
53 reloc_howto_type *howto = reloc_entry->howto;
54
55 if (output_bfd != (bfd *) NULL
56 && (symbol->flags & BSF_SECTION_SYM) == 0
57 && (! howto->partial_inplace
58 || reloc_entry->addend == 0))
59 {
60 reloc_entry->address += input_section->output_offset;
61 return bfd_reloc_ok;
62 }
63
64 /* This works because partial_inplace is FALSE. */
65 if (output_bfd != NULL)
66 return bfd_reloc_continue;
67
68 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
69 return bfd_reloc_outofrange;
70
71 relocation = (symbol->value
72 + symbol->section->output_section->vma
73 + symbol->section->output_offset);
74 relocation += reloc_entry->addend;
75 if (howto->pc_relative)
76 {
77 relocation -= (input_section->output_section->vma
78 + input_section->output_offset);
79 relocation -= reloc_entry->address;
80 }
81
82 *prelocation = relocation;
83 *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
84 return bfd_reloc_other;
85 }
86
87 /* For unsupported relocs. */
88
89 static bfd_reloc_status_type
90 sparc_elf_notsup_reloc (bfd *abfd ATTRIBUTE_UNUSED,
91 arelent *reloc_entry ATTRIBUTE_UNUSED,
92 asymbol *symbol ATTRIBUTE_UNUSED,
93 PTR data ATTRIBUTE_UNUSED,
94 asection *input_section ATTRIBUTE_UNUSED,
95 bfd *output_bfd ATTRIBUTE_UNUSED,
96 char **error_message ATTRIBUTE_UNUSED)
97 {
98 return bfd_reloc_notsupported;
99 }
100
101 /* Handle the WDISP16 reloc. */
102
103 static bfd_reloc_status_type
104 sparc_elf_wdisp16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
105 PTR data, asection *input_section, bfd *output_bfd,
106 char **error_message ATTRIBUTE_UNUSED)
107 {
108 bfd_vma relocation;
109 bfd_vma insn;
110 bfd_reloc_status_type status;
111
112 status = init_insn_reloc (abfd, reloc_entry, symbol, data,
113 input_section, output_bfd, &relocation, &insn);
114 if (status != bfd_reloc_other)
115 return status;
116
117 insn &= ~ (bfd_vma) 0x303fff;
118 insn |= (((relocation >> 2) & 0xc000) << 6) | ((relocation >> 2) & 0x3fff);
119 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
120
121 if ((bfd_signed_vma) relocation < - 0x40000
122 || (bfd_signed_vma) relocation > 0x3ffff)
123 return bfd_reloc_overflow;
124 else
125 return bfd_reloc_ok;
126 }
127
128 /* Handle the HIX22 reloc. */
129
130 static bfd_reloc_status_type
131 sparc_elf_hix22_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
132 PTR data, asection *input_section, bfd *output_bfd,
133 char **error_message ATTRIBUTE_UNUSED)
134 {
135 bfd_vma relocation;
136 bfd_vma insn;
137 bfd_reloc_status_type status;
138
139 status = init_insn_reloc (abfd, reloc_entry, symbol, data,
140 input_section, output_bfd, &relocation, &insn);
141 if (status != bfd_reloc_other)
142 return status;
143
144 relocation ^= MINUS_ONE;
145 insn = (insn &~ (bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
146 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
147
148 if ((relocation & ~ (bfd_vma) 0xffffffff) != 0)
149 return bfd_reloc_overflow;
150 else
151 return bfd_reloc_ok;
152 }
153
154 /* Handle the LOX10 reloc. */
155
156 static bfd_reloc_status_type
157 sparc_elf_lox10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
158 PTR data, asection *input_section, bfd *output_bfd,
159 char **error_message ATTRIBUTE_UNUSED)
160 {
161 bfd_vma relocation;
162 bfd_vma insn;
163 bfd_reloc_status_type status;
164
165 status = init_insn_reloc (abfd, reloc_entry, symbol, data,
166 input_section, output_bfd, &relocation, &insn);
167 if (status != bfd_reloc_other)
168 return status;
169
170 insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
171 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
172
173 return bfd_reloc_ok;
174 }
175
176 static reloc_howto_type _bfd_sparc_elf_howto_table[] =
177 {
178 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
179 HOWTO(R_SPARC_8, 0,0, 8,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", FALSE,0,0x000000ff,TRUE),
180 HOWTO(R_SPARC_16, 0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", FALSE,0,0x0000ffff,TRUE),
181 HOWTO(R_SPARC_32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", FALSE,0,0xffffffff,TRUE),
182 HOWTO(R_SPARC_DISP8, 0,0, 8,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", FALSE,0,0x000000ff,TRUE),
183 HOWTO(R_SPARC_DISP16, 0,1,16,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", FALSE,0,0x0000ffff,TRUE),
184 HOWTO(R_SPARC_DISP32, 0,2,32,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", FALSE,0,0xffffffff,TRUE),
185 HOWTO(R_SPARC_WDISP30, 2,2,30,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", FALSE,0,0x3fffffff,TRUE),
186 HOWTO(R_SPARC_WDISP22, 2,2,22,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", FALSE,0,0x003fffff,TRUE),
187 HOWTO(R_SPARC_HI22, 10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", FALSE,0,0x003fffff,TRUE),
188 HOWTO(R_SPARC_22, 0,2,22,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", FALSE,0,0x003fffff,TRUE),
189 HOWTO(R_SPARC_13, 0,2,13,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", FALSE,0,0x00001fff,TRUE),
190 HOWTO(R_SPARC_LO10, 0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", FALSE,0,0x000003ff,TRUE),
191 HOWTO(R_SPARC_GOT10, 0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", FALSE,0,0x000003ff,TRUE),
192 HOWTO(R_SPARC_GOT13, 0,2,13,FALSE,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", FALSE,0,0x00001fff,TRUE),
193 HOWTO(R_SPARC_GOT22, 10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", FALSE,0,0x003fffff,TRUE),
194 HOWTO(R_SPARC_PC10, 0,2,10,TRUE, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", FALSE,0,0x000003ff,TRUE),
195 HOWTO(R_SPARC_PC22, 10,2,22,TRUE, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", FALSE,0,0x003fffff,TRUE),
196 HOWTO(R_SPARC_WPLT30, 2,2,30,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", FALSE,0,0x3fffffff,TRUE),
197 HOWTO(R_SPARC_COPY, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", FALSE,0,0x00000000,TRUE),
198 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),
199 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),
200 HOWTO(R_SPARC_RELATIVE, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",FALSE,0,0x00000000,TRUE),
201 HOWTO(R_SPARC_UA32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA32", FALSE,0,0xffffffff,TRUE),
202 HOWTO(R_SPARC_PLT32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PLT32", FALSE,0,0xffffffff,TRUE),
203 HOWTO(R_SPARC_HIPLT22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_HIPLT22", FALSE,0,0x00000000,TRUE),
204 HOWTO(R_SPARC_LOPLT10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_LOPLT10", FALSE,0,0x00000000,TRUE),
205 HOWTO(R_SPARC_PCPLT32, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT32", FALSE,0,0x00000000,TRUE),
206 HOWTO(R_SPARC_PCPLT22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT22", FALSE,0,0x00000000,TRUE),
207 HOWTO(R_SPARC_PCPLT10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsup_reloc, "R_SPARC_PCPLT10", FALSE,0,0x00000000,TRUE),
208 HOWTO(R_SPARC_10, 0,2,10,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", FALSE,0,0x000003ff,TRUE),
209 HOWTO(R_SPARC_11, 0,2,11,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", FALSE,0,0x000007ff,TRUE),
210 HOWTO(R_SPARC_64, 0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_64", FALSE,0,MINUS_ONE, TRUE),
211 HOWTO(R_SPARC_OLO10, 0,2,13,FALSE,0,complain_overflow_signed, sparc_elf_notsup_reloc, "R_SPARC_OLO10", FALSE,0,0x00001fff,TRUE),
212 HOWTO(R_SPARC_HH22, 42,2,22,FALSE,0,complain_overflow_unsigned,bfd_elf_generic_reloc, "R_SPARC_HH22", FALSE,0,0x003fffff,TRUE),
213 HOWTO(R_SPARC_HM10, 32,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", FALSE,0,0x000003ff,TRUE),
214 HOWTO(R_SPARC_LM22, 10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", FALSE,0,0x003fffff,TRUE),
215 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),
216 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),
217 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),
218 HOWTO(R_SPARC_WDISP16, 2,2,16,TRUE, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", FALSE,0,0x00000000,TRUE),
219 HOWTO(R_SPARC_WDISP19, 2,2,19,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", FALSE,0,0x0007ffff,TRUE),
220 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),
221 HOWTO(R_SPARC_7, 0,2, 7,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", FALSE,0,0x0000007f,TRUE),
222 HOWTO(R_SPARC_5, 0,2, 5,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", FALSE,0,0x0000001f,TRUE),
223 HOWTO(R_SPARC_6, 0,2, 6,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", FALSE,0,0x0000003f,TRUE),
224 HOWTO(R_SPARC_DISP64, 0,4,64,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP64", FALSE,0,MINUS_ONE, TRUE),
225 HOWTO(R_SPARC_PLT64, 0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PLT64", FALSE,0,MINUS_ONE, TRUE),
226 HOWTO(R_SPARC_HIX22, 0,4, 0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_HIX22", FALSE,0,MINUS_ONE, FALSE),
227 HOWTO(R_SPARC_LOX10, 0,4, 0,FALSE,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_LOX10", FALSE,0,MINUS_ONE, FALSE),
228 HOWTO(R_SPARC_H44, 22,2,22,FALSE,0,complain_overflow_unsigned,bfd_elf_generic_reloc, "R_SPARC_H44", FALSE,0,0x003fffff,FALSE),
229 HOWTO(R_SPARC_M44, 12,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_M44", FALSE,0,0x000003ff,FALSE),
230 HOWTO(R_SPARC_L44, 0,2,13,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_L44", FALSE,0,0x00000fff,FALSE),
231 HOWTO(R_SPARC_REGISTER, 0,4, 0,FALSE,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",FALSE,0,MINUS_ONE, FALSE),
232 HOWTO(R_SPARC_UA64, 0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA64", FALSE,0,MINUS_ONE, TRUE),
233 HOWTO(R_SPARC_UA16, 0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA16", FALSE,0,0x0000ffff,TRUE),
234 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),
235 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),
236 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),
237 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),
238 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),
239 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),
240 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),
241 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),
242 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),
243 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),
244 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),
245 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),
246 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),
247 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),
248 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),
249 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),
250 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),
251 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),
252 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),
253 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),
254 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),
255 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),
256 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),
257 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)
258 };
259 static reloc_howto_type sparc_vtinherit_howto =
260 HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
261 static reloc_howto_type sparc_vtentry_howto =
262 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);
263 static reloc_howto_type sparc_rev32_howto =
264 HOWTO(R_SPARC_REV32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", FALSE,0,0xffffffff,TRUE);
265
266 struct elf_reloc_map {
267 bfd_reloc_code_real_type bfd_reloc_val;
268 unsigned char elf_reloc_val;
269 };
270
271 static const struct elf_reloc_map sparc_reloc_map[] =
272 {
273 { BFD_RELOC_NONE, R_SPARC_NONE, },
274 { BFD_RELOC_16, R_SPARC_16, },
275 { BFD_RELOC_16_PCREL, R_SPARC_DISP16 },
276 { BFD_RELOC_8, R_SPARC_8 },
277 { BFD_RELOC_8_PCREL, R_SPARC_DISP8 },
278 { BFD_RELOC_CTOR, R_SPARC_64 },
279 { BFD_RELOC_32, R_SPARC_32 },
280 { BFD_RELOC_32_PCREL, R_SPARC_DISP32 },
281 { BFD_RELOC_HI22, R_SPARC_HI22 },
282 { BFD_RELOC_LO10, R_SPARC_LO10, },
283 { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 },
284 { BFD_RELOC_64_PCREL, R_SPARC_DISP64 },
285 { BFD_RELOC_SPARC22, R_SPARC_22 },
286 { BFD_RELOC_SPARC13, R_SPARC_13 },
287 { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 },
288 { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 },
289 { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 },
290 { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 },
291 { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 },
292 { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 },
293 { BFD_RELOC_SPARC_COPY, R_SPARC_COPY },
294 { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT },
295 { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT },
296 { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE },
297 { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 },
298 { BFD_RELOC_SPARC_UA16, R_SPARC_UA16 },
299 { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 },
300 { BFD_RELOC_SPARC_UA64, R_SPARC_UA64 },
301 { BFD_RELOC_SPARC_10, R_SPARC_10 },
302 { BFD_RELOC_SPARC_11, R_SPARC_11 },
303 { BFD_RELOC_SPARC_64, R_SPARC_64 },
304 { BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10 },
305 { BFD_RELOC_SPARC_HH22, R_SPARC_HH22 },
306 { BFD_RELOC_SPARC_HM10, R_SPARC_HM10 },
307 { BFD_RELOC_SPARC_LM22, R_SPARC_LM22 },
308 { BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22 },
309 { BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10 },
310 { BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22 },
311 { BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16 },
312 { BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19 },
313 { BFD_RELOC_SPARC_7, R_SPARC_7 },
314 { BFD_RELOC_SPARC_5, R_SPARC_5 },
315 { BFD_RELOC_SPARC_6, R_SPARC_6 },
316 { BFD_RELOC_SPARC_DISP64, R_SPARC_DISP64 },
317 { BFD_RELOC_SPARC_TLS_GD_HI22, R_SPARC_TLS_GD_HI22 },
318 { BFD_RELOC_SPARC_TLS_GD_LO10, R_SPARC_TLS_GD_LO10 },
319 { BFD_RELOC_SPARC_TLS_GD_ADD, R_SPARC_TLS_GD_ADD },
320 { BFD_RELOC_SPARC_TLS_GD_CALL, R_SPARC_TLS_GD_CALL },
321 { BFD_RELOC_SPARC_TLS_LDM_HI22, R_SPARC_TLS_LDM_HI22 },
322 { BFD_RELOC_SPARC_TLS_LDM_LO10, R_SPARC_TLS_LDM_LO10 },
323 { BFD_RELOC_SPARC_TLS_LDM_ADD, R_SPARC_TLS_LDM_ADD },
324 { BFD_RELOC_SPARC_TLS_LDM_CALL, R_SPARC_TLS_LDM_CALL },
325 { BFD_RELOC_SPARC_TLS_LDO_HIX22, R_SPARC_TLS_LDO_HIX22 },
326 { BFD_RELOC_SPARC_TLS_LDO_LOX10, R_SPARC_TLS_LDO_LOX10 },
327 { BFD_RELOC_SPARC_TLS_LDO_ADD, R_SPARC_TLS_LDO_ADD },
328 { BFD_RELOC_SPARC_TLS_IE_HI22, R_SPARC_TLS_IE_HI22 },
329 { BFD_RELOC_SPARC_TLS_IE_LO10, R_SPARC_TLS_IE_LO10 },
330 { BFD_RELOC_SPARC_TLS_IE_LD, R_SPARC_TLS_IE_LD },
331 { BFD_RELOC_SPARC_TLS_IE_LDX, R_SPARC_TLS_IE_LDX },
332 { BFD_RELOC_SPARC_TLS_IE_ADD, R_SPARC_TLS_IE_ADD },
333 { BFD_RELOC_SPARC_TLS_LE_HIX22, R_SPARC_TLS_LE_HIX22 },
334 { BFD_RELOC_SPARC_TLS_LE_LOX10, R_SPARC_TLS_LE_LOX10 },
335 { BFD_RELOC_SPARC_TLS_DTPMOD32, R_SPARC_TLS_DTPMOD32 },
336 { BFD_RELOC_SPARC_TLS_DTPMOD64, R_SPARC_TLS_DTPMOD64 },
337 { BFD_RELOC_SPARC_TLS_DTPOFF32, R_SPARC_TLS_DTPOFF32 },
338 { BFD_RELOC_SPARC_TLS_DTPOFF64, R_SPARC_TLS_DTPOFF64 },
339 { BFD_RELOC_SPARC_TLS_TPOFF32, R_SPARC_TLS_TPOFF32 },
340 { BFD_RELOC_SPARC_TLS_TPOFF64, R_SPARC_TLS_TPOFF64 },
341 { BFD_RELOC_SPARC_PLT32, R_SPARC_PLT32 },
342 { BFD_RELOC_SPARC_PLT64, R_SPARC_PLT64 },
343 { BFD_RELOC_SPARC_HIX22, R_SPARC_HIX22 },
344 { BFD_RELOC_SPARC_LOX10, R_SPARC_LOX10 },
345 { BFD_RELOC_SPARC_H44, R_SPARC_H44 },
346 { BFD_RELOC_SPARC_M44, R_SPARC_M44 },
347 { BFD_RELOC_SPARC_L44, R_SPARC_L44 },
348 { BFD_RELOC_SPARC_REGISTER, R_SPARC_REGISTER },
349 { BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT },
350 { BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY },
351 { BFD_RELOC_SPARC_REV32, R_SPARC_REV32 },
352 };
353
354 reloc_howto_type *
355 _bfd_sparc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
356 bfd_reloc_code_real_type code)
357 {
358 unsigned int i;
359
360 switch (code)
361 {
362 case BFD_RELOC_VTABLE_INHERIT:
363 return &sparc_vtinherit_howto;
364
365 case BFD_RELOC_VTABLE_ENTRY:
366 return &sparc_vtentry_howto;
367
368 case BFD_RELOC_SPARC_REV32:
369 return &sparc_rev32_howto;
370
371 default:
372 for (i = 0;
373 i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map);
374 i++)
375 {
376 if (sparc_reloc_map[i].bfd_reloc_val == code)
377 return (_bfd_sparc_elf_howto_table
378 + (int) sparc_reloc_map[i].elf_reloc_val);
379 }
380 }
381 bfd_set_error (bfd_error_bad_value);
382 return NULL;
383 }
384
385 reloc_howto_type *
386 _bfd_sparc_elf_info_to_howto_ptr (unsigned int r_type)
387 {
388 switch (r_type)
389 {
390 case R_SPARC_GNU_VTINHERIT:
391 return &sparc_vtinherit_howto;
392
393 case R_SPARC_GNU_VTENTRY:
394 return &sparc_vtentry_howto;
395
396 case R_SPARC_REV32:
397 return &sparc_rev32_howto;
398
399 default:
400 BFD_ASSERT (r_type < (unsigned int) R_SPARC_max_std);
401 return &_bfd_sparc_elf_howto_table[r_type];
402 }
403 }
404
405 /* Both 32-bit and 64-bit sparc encode this in an identical manner,
406 so just take advantage of that. */
407 #define SPARC_ELF_R_TYPE(r_info) \
408 ((r_info) & 0xff)
409
410 void
411 _bfd_sparc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
412 Elf_Internal_Rela *dst)
413 {
414 unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
415
416 cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (r_type);
417 }
418 \f
419
420 /* The nop opcode we use. */
421 #define SPARC_NOP 0x01000000
422
423 #define SPARC_INSN_BYTES 4
424
425 /* The SPARC linker needs to keep track of the number of relocs that it
426 decides to copy as dynamic relocs in check_relocs for each symbol.
427 This is so that it can later discard them if they are found to be
428 unnecessary. We store the information in a field extending the
429 regular ELF linker hash table. */
430
431 struct _bfd_sparc_elf_dyn_relocs
432 {
433 struct _bfd_sparc_elf_dyn_relocs *next;
434
435 /* The input section of the reloc. */
436 asection *sec;
437
438 /* Total number of relocs copied for the input section. */
439 bfd_size_type count;
440
441 /* Number of pc-relative relocs copied for the input section. */
442 bfd_size_type pc_count;
443 };
444
445 /* SPARC ELF linker hash entry. */
446
447 struct _bfd_sparc_elf_link_hash_entry
448 {
449 struct elf_link_hash_entry elf;
450
451 /* Track dynamic relocs copied for this symbol. */
452 struct _bfd_sparc_elf_dyn_relocs *dyn_relocs;
453
454 #define GOT_UNKNOWN 0
455 #define GOT_NORMAL 1
456 #define GOT_TLS_GD 2
457 #define GOT_TLS_IE 3
458 unsigned char tls_type;
459 };
460
461 #define _bfd_sparc_elf_hash_entry(ent) ((struct _bfd_sparc_elf_link_hash_entry *)(ent))
462
463 struct _bfd_sparc_elf_obj_tdata
464 {
465 struct elf_obj_tdata root;
466
467 /* tls_type for each local got entry. */
468 char *local_got_tls_type;
469
470 /* TRUE if TLS GD relocs has been seen for this object. */
471 bfd_boolean has_tlsgd;
472 };
473
474 #define _bfd_sparc_elf_tdata(abfd) \
475 ((struct _bfd_sparc_elf_obj_tdata *) (abfd)->tdata.any)
476
477 #define _bfd_sparc_elf_local_got_tls_type(abfd) \
478 (_bfd_sparc_elf_tdata (abfd)->local_got_tls_type)
479
480 bfd_boolean
481 _bfd_sparc_elf_mkobject (bfd *abfd)
482 {
483 bfd_size_type amt = sizeof (struct _bfd_sparc_elf_obj_tdata);
484 abfd->tdata.any = bfd_zalloc (abfd, amt);
485 if (abfd->tdata.any == NULL)
486 return FALSE;
487 return TRUE;
488 }
489
490 static void
491 sparc_put_word_32 (bfd *bfd, bfd_vma val, void *ptr)
492 {
493 bfd_put_32 (bfd, val, ptr);
494 }
495
496 static void
497 sparc_put_word_64 (bfd *bfd, bfd_vma val, void *ptr)
498 {
499 bfd_put_64 (bfd, val, ptr);
500 }
501
502 static void
503 sparc_elf_append_rela_64 (bfd *abfd ATTRIBUTE_UNUSED,
504 asection *s ATTRIBUTE_UNUSED,
505 Elf_Internal_Rela *rel ATTRIBUTE_UNUSED)
506 {
507 #ifdef BFD64
508 Elf64_External_Rela *loc64;
509
510 loc64 = (Elf64_External_Rela *) s->contents;
511 loc64 += s->reloc_count++;
512 bfd_elf64_swap_reloca_out (abfd, rel, (bfd_byte *) loc64);
513 #endif
514 }
515
516 static void
517 sparc_elf_append_rela_32 (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
518 {
519 Elf32_External_Rela *loc32;
520
521 loc32 = (Elf32_External_Rela *) s->contents;
522 loc32 += s->reloc_count++;
523 bfd_elf32_swap_reloca_out (abfd, rel, (bfd_byte *) loc32);
524 }
525
526 static bfd_vma
527 sparc_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
528 bfd_vma index ATTRIBUTE_UNUSED,
529 bfd_vma type ATTRIBUTE_UNUSED)
530 {
531 return ELF64_R_INFO (index,
532 (in_rel ?
533 ELF64_R_TYPE_INFO (ELF64_R_TYPE_DATA (in_rel->r_info),
534 type) : type));
535 }
536
537 static bfd_vma
538 sparc_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
539 bfd_vma index, bfd_vma type)
540 {
541 return ELF32_R_INFO (index, type);
542 }
543
544 static bfd_vma
545 sparc_elf_r_symndx_64 (bfd_vma r_info)
546 {
547 bfd_vma r_symndx = ELF32_R_SYM (r_info);
548 return (r_symndx >> 24);
549 }
550
551 static bfd_vma
552 sparc_elf_r_symndx_32 (bfd_vma r_info)
553 {
554 return ELF32_R_SYM (r_info);
555 }
556
557 /* PLT/GOT stuff */
558
559 #define PLT32_ENTRY_SIZE 12
560 #define PLT32_HEADER_SIZE (4 * PLT32_ENTRY_SIZE)
561
562 /* The first four entries in a 32-bit procedure linkage table are reserved,
563 and the initial contents are unimportant (we zero them out).
564 Subsequent entries look like this. See the SVR4 ABI SPARC
565 supplement to see how this works. */
566
567 /* sethi %hi(.-.plt0),%g1. We fill in the address later. */
568 #define PLT32_ENTRY_WORD0 0x03000000
569 /* b,a .plt0. We fill in the offset later. */
570 #define PLT32_ENTRY_WORD1 0x30800000
571 /* nop. */
572 #define PLT32_ENTRY_WORD2 SPARC_NOP
573
574 static int
575 sparc32_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
576 bfd_vma max ATTRIBUTE_UNUSED,
577 bfd_vma *r_offset)
578 {
579 bfd_put_32 (output_bfd,
580 PLT32_ENTRY_WORD0 + offset,
581 splt->contents + offset);
582 bfd_put_32 (output_bfd,
583 (PLT32_ENTRY_WORD1
584 + (((- (offset + 4)) >> 2) & 0x3fffff)),
585 splt->contents + offset + 4);
586 bfd_put_32 (output_bfd, (bfd_vma) PLT32_ENTRY_WORD2,
587 splt->contents + offset + 8);
588
589 *r_offset = offset;
590
591 return offset / PLT32_ENTRY_SIZE - 4;
592 }
593
594 /* Both the headers and the entries are icache aligned. */
595 #define PLT64_ENTRY_SIZE 32
596 #define PLT64_HEADER_SIZE (4 * PLT64_ENTRY_SIZE)
597 #define PLT64_LARGE_THRESHOLD 32768
598
599 static int
600 sparc64_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
601 bfd_vma max, bfd_vma *r_offset)
602 {
603 unsigned char *entry = splt->contents + offset;
604 const unsigned int nop = SPARC_NOP;
605 int index;
606
607 if (offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
608 {
609 unsigned int sethi, ba;
610
611 *r_offset = offset;
612
613 index = (offset / PLT64_ENTRY_SIZE);
614
615 sethi = 0x03000000 | (index * PLT64_ENTRY_SIZE);
616 ba = 0x30680000
617 | (((splt->contents + PLT64_ENTRY_SIZE) - (entry + 4)) / 4 & 0x7ffff);
618
619 bfd_put_32 (output_bfd, (bfd_vma) sethi, entry);
620 bfd_put_32 (output_bfd, (bfd_vma) ba, entry + 4);
621 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 8);
622 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 12);
623 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 16);
624 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 20);
625 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 24);
626 bfd_put_32 (output_bfd, (bfd_vma) nop, entry + 28);
627 }
628 else
629 {
630 unsigned char *ptr;
631 unsigned int ldx;
632 int block, last_block, ofs, last_ofs, chunks_this_block;
633 const int insn_chunk_size = (6 * 4);
634 const int ptr_chunk_size = (1 * 8);
635 const int entries_per_block = 160;
636 const int block_size = entries_per_block * (insn_chunk_size
637 + ptr_chunk_size);
638
639 /* Entries 32768 and higher are grouped into blocks of 160.
640 The blocks are further subdivided into 160 sequences of
641 6 instructions and 160 pointers. If a block does not require
642 the full 160 entries, let's say it requires N, then there
643 will be N sequences of 6 instructions and N pointers. */
644
645 offset -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
646 max -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
647
648 block = offset / block_size;
649 last_block = max / block_size;
650 if (block != last_block)
651 {
652 chunks_this_block = 160;
653 }
654 else
655 {
656 last_ofs = max % block_size;
657 chunks_this_block = last_ofs / (insn_chunk_size + ptr_chunk_size);
658 }
659
660 ofs = offset % block_size;
661
662 index = (PLT64_LARGE_THRESHOLD +
663 (block * 160) +
664 (ofs / insn_chunk_size));
665
666 ptr = splt->contents
667 + (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
668 + (block * block_size)
669 + (chunks_this_block * insn_chunk_size)
670 + (ofs / insn_chunk_size) * ptr_chunk_size;
671
672 *r_offset = (bfd_vma) (ptr - splt->contents);
673
674 ldx = 0xc25be000 | ((ptr - (entry+4)) & 0x1fff);
675
676 /* mov %o7,%g5
677 call .+8
678 nop
679 ldx [%o7+P],%g1
680 jmpl %o7+%g1,%g1
681 mov %g5,%o7 */
682 bfd_put_32 (output_bfd, (bfd_vma) 0x8a10000f, entry);
683 bfd_put_32 (output_bfd, (bfd_vma) 0x40000002, entry + 4);
684 bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP, entry + 8);
685 bfd_put_32 (output_bfd, (bfd_vma) ldx, entry + 12);
686 bfd_put_32 (output_bfd, (bfd_vma) 0x83c3c001, entry + 16);
687 bfd_put_32 (output_bfd, (bfd_vma) 0x9e100005, entry + 20);
688
689 bfd_put_64 (output_bfd, (bfd_vma) (splt->contents - (entry + 4)), ptr);
690 }
691
692 return index - 4;
693 }
694
695 #define SPARC_ELF_PUT_WORD(htab, bfd, val, ptr) \
696 htab->put_word(bfd, val, ptr)
697
698 #define SPARC_ELF_APPEND_RELA(htab, bfd, sec, rela) \
699 htab->append_rela(bfd, sec, rela)
700
701 #define SPARC_ELF_R_INFO(htab, in_rel, index, type) \
702 htab->r_info(in_rel, index, type)
703
704 #define SPARC_ELF_R_SYMNDX(htab, r_info) \
705 htab->r_symndx(r_info)
706
707 #define SPARC_ELF_WORD_BYTES(htab) \
708 htab->bytes_per_word
709
710 #define SPARC_ELF_RELA_BYTES(htab) \
711 htab->bytes_per_rela
712
713 #define SPARC_ELF_DTPOFF_RELOC(htab) \
714 htab->dtpoff_reloc
715
716 #define SPARC_ELF_DTPMOD_RELOC(htab) \
717 htab->dtpmod_reloc
718
719 #define SPARC_ELF_TPOFF_RELOC(htab) \
720 htab->tpoff_reloc
721
722 #define SPARC_ELF_BUILD_PLT_ENTRY(htab, obfd, splt, off, max, r_off) \
723 htab->build_plt_entry (obfd, splt, off, max, r_off)
724
725 /* Create an entry in an SPARC ELF linker hash table. */
726
727 static struct bfd_hash_entry *
728 link_hash_newfunc (struct bfd_hash_entry *entry,
729 struct bfd_hash_table *table, const char *string)
730 {
731 /* Allocate the structure if it has not already been allocated by a
732 subclass. */
733 if (entry == NULL)
734 {
735 entry = bfd_hash_allocate (table,
736 sizeof (struct _bfd_sparc_elf_link_hash_entry));
737 if (entry == NULL)
738 return entry;
739 }
740
741 /* Call the allocation method of the superclass. */
742 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
743 if (entry != NULL)
744 {
745 struct _bfd_sparc_elf_link_hash_entry *eh;
746
747 eh = (struct _bfd_sparc_elf_link_hash_entry *) entry;
748 eh->dyn_relocs = NULL;
749 eh->tls_type = GOT_UNKNOWN;
750 }
751
752 return entry;
753 }
754
755 /* The name of the dynamic interpreter. This is put in the .interp
756 section. */
757
758 #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
759 #define ELF64_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1"
760
761 /* Create a SPARC ELF linker hash table. */
762
763 struct bfd_link_hash_table *
764 _bfd_sparc_elf_link_hash_table_create (bfd *abfd)
765 {
766 struct _bfd_sparc_elf_link_hash_table *ret;
767 bfd_size_type amt = sizeof (struct _bfd_sparc_elf_link_hash_table);
768
769 ret = (struct _bfd_sparc_elf_link_hash_table *) bfd_zmalloc (amt);
770 if (ret == NULL)
771 return NULL;
772
773 if (ABI_64_P (abfd))
774 {
775 ret->put_word = sparc_put_word_64;
776 ret->append_rela = sparc_elf_append_rela_64;
777 ret->r_info = sparc_elf_r_info_64;
778 ret->r_symndx = sparc_elf_r_symndx_64;
779 ret->build_plt_entry = sparc64_plt_entry_build;
780 ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF64;
781 ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD64;
782 ret->tpoff_reloc = R_SPARC_TLS_TPOFF64;
783 ret->word_align_power = 3;
784 ret->align_power_max = 4;
785 ret->bytes_per_word = 8;
786 ret->bytes_per_rela = sizeof (Elf64_External_Rela);
787 ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
788 ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
789 }
790 else
791 {
792 ret->put_word = sparc_put_word_32;
793 ret->append_rela = sparc_elf_append_rela_32;
794 ret->r_info = sparc_elf_r_info_32;
795 ret->r_symndx = sparc_elf_r_symndx_32;
796 ret->build_plt_entry = sparc32_plt_entry_build;
797 ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF32;
798 ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD32;
799 ret->tpoff_reloc = R_SPARC_TLS_TPOFF32;
800 ret->word_align_power = 2;
801 ret->align_power_max = 3;
802 ret->bytes_per_word = 4;
803 ret->bytes_per_rela = sizeof (Elf32_External_Rela);
804 ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
805 ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
806 }
807
808 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
809 {
810 free (ret);
811 return NULL;
812 }
813
814 return &ret->elf.root;
815 }
816
817 /* Create .got and .rela.got sections in DYNOBJ, and set up
818 shortcuts to them in our hash table. */
819
820 static bfd_boolean
821 create_got_section (bfd *dynobj, struct bfd_link_info *info)
822 {
823 struct _bfd_sparc_elf_link_hash_table *htab;
824
825 if (! _bfd_elf_create_got_section (dynobj, info))
826 return FALSE;
827
828 htab = _bfd_sparc_elf_hash_table (info);
829 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
830 BFD_ASSERT (htab->sgot != NULL);
831
832 htab->srelgot = bfd_make_section (dynobj, ".rela.got");
833 if (htab->srelgot == NULL
834 || ! bfd_set_section_flags (dynobj, htab->srelgot, SEC_ALLOC
835 | SEC_LOAD
836 | SEC_HAS_CONTENTS
837 | SEC_IN_MEMORY
838 | SEC_LINKER_CREATED
839 | SEC_READONLY)
840 || ! bfd_set_section_alignment (dynobj, htab->srelgot,
841 htab->word_align_power))
842 return FALSE;
843 return TRUE;
844 }
845
846 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
847 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
848 hash table. */
849
850 bfd_boolean
851 _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
852 struct bfd_link_info *info)
853 {
854 struct _bfd_sparc_elf_link_hash_table *htab;
855
856 htab = _bfd_sparc_elf_hash_table (info);
857 if (!htab->sgot && !create_got_section (dynobj, info))
858 return FALSE;
859
860 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
861 return FALSE;
862
863 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
864 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
865 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
866 if (!info->shared)
867 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
868
869 if (!htab->splt || !htab->srelplt || !htab->sdynbss
870 || (!info->shared && !htab->srelbss))
871 abort ();
872
873 return TRUE;
874 }
875
876 /* Copy the extra info we tack onto an elf_link_hash_entry. */
877
878 void
879 _bfd_sparc_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
880 struct elf_link_hash_entry *dir,
881 struct elf_link_hash_entry *ind)
882 {
883 struct _bfd_sparc_elf_link_hash_entry *edir, *eind;
884
885 edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
886 eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
887
888 if (eind->dyn_relocs != NULL)
889 {
890 if (edir->dyn_relocs != NULL)
891 {
892 struct _bfd_sparc_elf_dyn_relocs **pp;
893 struct _bfd_sparc_elf_dyn_relocs *p;
894
895 if (ind->root.type == bfd_link_hash_indirect)
896 abort ();
897
898 /* Add reloc counts against the weak sym to the strong sym
899 list. Merge any entries against the same section. */
900 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
901 {
902 struct _bfd_sparc_elf_dyn_relocs *q;
903
904 for (q = edir->dyn_relocs; q != NULL; q = q->next)
905 if (q->sec == p->sec)
906 {
907 q->pc_count += p->pc_count;
908 q->count += p->count;
909 *pp = p->next;
910 break;
911 }
912 if (q == NULL)
913 pp = &p->next;
914 }
915 *pp = edir->dyn_relocs;
916 }
917
918 edir->dyn_relocs = eind->dyn_relocs;
919 eind->dyn_relocs = NULL;
920 }
921
922 if (ind->root.type == bfd_link_hash_indirect
923 && dir->got.refcount <= 0)
924 {
925 edir->tls_type = eind->tls_type;
926 eind->tls_type = GOT_UNKNOWN;
927 }
928 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
929 }
930
931 static int
932 sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
933 int r_type, int is_local)
934 {
935 if (! ABI_64_P (abfd)
936 && r_type == R_SPARC_TLS_GD_HI22
937 && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
938 r_type = R_SPARC_REV32;
939
940 if (info->shared)
941 return r_type;
942
943 switch (r_type)
944 {
945 case R_SPARC_TLS_GD_HI22:
946 if (is_local)
947 return R_SPARC_TLS_LE_HIX22;
948 return R_SPARC_TLS_IE_HI22;
949 case R_SPARC_TLS_GD_LO10:
950 if (is_local)
951 return R_SPARC_TLS_LE_LOX10;
952 return R_SPARC_TLS_IE_LO10;
953 case R_SPARC_TLS_IE_HI22:
954 if (is_local)
955 return R_SPARC_TLS_LE_HIX22;
956 return r_type;
957 case R_SPARC_TLS_IE_LO10:
958 if (is_local)
959 return R_SPARC_TLS_LE_LOX10;
960 return r_type;
961 case R_SPARC_TLS_LDM_HI22:
962 return R_SPARC_TLS_LE_HIX22;
963 case R_SPARC_TLS_LDM_LO10:
964 return R_SPARC_TLS_LE_LOX10;
965 }
966
967 return r_type;
968 }
969 \f
970 /* Look through the relocs for a section during the first phase, and
971 allocate space in the global offset table or procedure linkage
972 table. */
973
974 bfd_boolean
975 _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
976 asection *sec, const Elf_Internal_Rela *relocs)
977 {
978 struct _bfd_sparc_elf_link_hash_table *htab;
979 Elf_Internal_Shdr *symtab_hdr;
980 struct elf_link_hash_entry **sym_hashes;
981 bfd_vma *local_got_offsets;
982 const Elf_Internal_Rela *rel;
983 const Elf_Internal_Rela *rel_end;
984 asection *sreloc;
985 int num_relocs;
986 bfd_boolean checked_tlsgd = FALSE;
987
988 if (info->relocatable)
989 return TRUE;
990
991 htab = _bfd_sparc_elf_hash_table (info);
992 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
993 sym_hashes = elf_sym_hashes (abfd);
994 local_got_offsets = elf_local_got_offsets (abfd);
995
996 sreloc = NULL;
997
998 if (ABI_64_P (abfd))
999 num_relocs = NUM_SHDR_ENTRIES (& elf_section_data (sec)->rel_hdr);
1000 else
1001 num_relocs = sec->reloc_count;
1002 rel_end = relocs + num_relocs;
1003 for (rel = relocs; rel < rel_end; rel++)
1004 {
1005 unsigned int r_type;
1006 unsigned long r_symndx;
1007 struct elf_link_hash_entry *h;
1008
1009 r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1010 r_type = SPARC_ELF_R_TYPE (rel->r_info);
1011
1012 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1013 {
1014 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1015 abfd, r_symndx);
1016 return FALSE;
1017 }
1018
1019 if (r_symndx < symtab_hdr->sh_info)
1020 h = NULL;
1021 else
1022 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1023
1024 /* Compatibility with old R_SPARC_REV32 reloc conflicting
1025 with R_SPARC_TLS_GD_HI22. */
1026 if (! ABI_64_P (abfd) && ! checked_tlsgd)
1027 switch (r_type)
1028 {
1029 case R_SPARC_TLS_GD_HI22:
1030 {
1031 const Elf_Internal_Rela *relt;
1032
1033 for (relt = rel + 1; relt < rel_end; relt++)
1034 if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
1035 || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
1036 || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
1037 break;
1038 checked_tlsgd = TRUE;
1039 _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end;
1040 }
1041 break;
1042 case R_SPARC_TLS_GD_LO10:
1043 case R_SPARC_TLS_GD_ADD:
1044 case R_SPARC_TLS_GD_CALL:
1045 checked_tlsgd = TRUE;
1046 _bfd_sparc_elf_tdata (abfd)->has_tlsgd = TRUE;
1047 break;
1048 }
1049
1050 r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
1051 switch (r_type)
1052 {
1053 case R_SPARC_TLS_LDM_HI22:
1054 case R_SPARC_TLS_LDM_LO10:
1055 htab->tls_ldm_got.refcount += 1;
1056 break;
1057
1058 case R_SPARC_TLS_LE_HIX22:
1059 case R_SPARC_TLS_LE_LOX10:
1060 if (info->shared)
1061 goto r_sparc_plt32;
1062 break;
1063
1064 case R_SPARC_TLS_IE_HI22:
1065 case R_SPARC_TLS_IE_LO10:
1066 if (info->shared)
1067 info->flags |= DF_STATIC_TLS;
1068 /* Fall through */
1069
1070 case R_SPARC_GOT10:
1071 case R_SPARC_GOT13:
1072 case R_SPARC_GOT22:
1073 case R_SPARC_TLS_GD_HI22:
1074 case R_SPARC_TLS_GD_LO10:
1075 /* This symbol requires a global offset table entry. */
1076 {
1077 int tls_type, old_tls_type;
1078
1079 switch (r_type)
1080 {
1081 default:
1082 case R_SPARC_GOT10:
1083 case R_SPARC_GOT13:
1084 case R_SPARC_GOT22:
1085 tls_type = GOT_NORMAL;
1086 break;
1087 case R_SPARC_TLS_GD_HI22:
1088 case R_SPARC_TLS_GD_LO10:
1089 tls_type = GOT_TLS_GD;
1090 break;
1091 case R_SPARC_TLS_IE_HI22:
1092 case R_SPARC_TLS_IE_LO10:
1093 tls_type = GOT_TLS_IE;
1094 break;
1095 }
1096
1097 if (h != NULL)
1098 {
1099 h->got.refcount += 1;
1100 old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
1101 }
1102 else
1103 {
1104 bfd_signed_vma *local_got_refcounts;
1105
1106 /* This is a global offset table entry for a local symbol. */
1107 local_got_refcounts = elf_local_got_refcounts (abfd);
1108 if (local_got_refcounts == NULL)
1109 {
1110 bfd_size_type size;
1111
1112 size = symtab_hdr->sh_info;
1113 size *= (sizeof (bfd_signed_vma) + sizeof(char));
1114 local_got_refcounts = ((bfd_signed_vma *)
1115 bfd_zalloc (abfd, size));
1116 if (local_got_refcounts == NULL)
1117 return FALSE;
1118 elf_local_got_refcounts (abfd) = local_got_refcounts;
1119 _bfd_sparc_elf_local_got_tls_type (abfd)
1120 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1121 }
1122 local_got_refcounts[r_symndx] += 1;
1123 old_tls_type = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx];
1124 }
1125
1126 /* If a TLS symbol is accessed using IE at least once,
1127 there is no point to use dynamic model for it. */
1128 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1129 && (old_tls_type != GOT_TLS_GD
1130 || tls_type != GOT_TLS_IE))
1131 {
1132 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1133 tls_type = old_tls_type;
1134 else
1135 {
1136 (*_bfd_error_handler)
1137 (_("%B: `%s' accessed both as normal and thread local symbol"),
1138 abfd, h ? h->root.root.string : "<local>");
1139 return FALSE;
1140 }
1141 }
1142
1143 if (old_tls_type != tls_type)
1144 {
1145 if (h != NULL)
1146 _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type;
1147 else
1148 _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1149 }
1150 }
1151
1152 if (htab->sgot == NULL)
1153 {
1154 if (htab->elf.dynobj == NULL)
1155 htab->elf.dynobj = abfd;
1156 if (!create_got_section (htab->elf.dynobj, info))
1157 return FALSE;
1158 }
1159 break;
1160
1161 case R_SPARC_TLS_GD_CALL:
1162 case R_SPARC_TLS_LDM_CALL:
1163 if (info->shared)
1164 {
1165 /* These are basically R_SPARC_TLS_WPLT30 relocs against
1166 __tls_get_addr. */
1167 struct bfd_link_hash_entry *bh = NULL;
1168 if (! _bfd_generic_link_add_one_symbol (info, abfd,
1169 "__tls_get_addr", 0,
1170 bfd_und_section_ptr, 0,
1171 NULL, FALSE, FALSE,
1172 &bh))
1173 return FALSE;
1174 h = (struct elf_link_hash_entry *) bh;
1175 }
1176 else
1177 break;
1178 /* Fall through */
1179
1180 case R_SPARC_PLT32:
1181 case R_SPARC_WPLT30:
1182 case R_SPARC_HIPLT22:
1183 case R_SPARC_LOPLT10:
1184 case R_SPARC_PCPLT32:
1185 case R_SPARC_PCPLT22:
1186 case R_SPARC_PCPLT10:
1187 case R_SPARC_PLT64:
1188 /* This symbol requires a procedure linkage table entry. We
1189 actually build the entry in adjust_dynamic_symbol,
1190 because this might be a case of linking PIC code without
1191 linking in any dynamic objects, in which case we don't
1192 need to generate a procedure linkage table after all. */
1193
1194 if (h == NULL)
1195 {
1196 if (! ABI_64_P (abfd))
1197 {
1198 /* The Solaris native assembler will generate a WPLT30
1199 reloc for a local symbol if you assemble a call from
1200 one section to another when using -K pic. We treat
1201 it as WDISP30. */
1202 if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1203 goto r_sparc_plt32;
1204 break;
1205 }
1206
1207 /* It does not make sense to have a procedure linkage
1208 table entry for a local symbol. */
1209 bfd_set_error (bfd_error_bad_value);
1210 return FALSE;
1211 }
1212
1213 h->needs_plt = 1;
1214
1215 {
1216 int this_r_type;
1217
1218 this_r_type = SPARC_ELF_R_TYPE (rel->r_info);
1219 if (this_r_type == R_SPARC_PLT32
1220 || this_r_type == R_SPARC_PLT64)
1221 goto r_sparc_plt32;
1222 }
1223 h->plt.refcount += 1;
1224 break;
1225
1226 case R_SPARC_PC10:
1227 case R_SPARC_PC22:
1228 case R_SPARC_PC_HH22:
1229 case R_SPARC_PC_HM10:
1230 case R_SPARC_PC_LM22:
1231 if (h != NULL)
1232 h->non_got_ref = 1;
1233
1234 if (h != NULL
1235 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1236 break;
1237 /* Fall through. */
1238
1239 case R_SPARC_DISP8:
1240 case R_SPARC_DISP16:
1241 case R_SPARC_DISP32:
1242 case R_SPARC_DISP64:
1243 case R_SPARC_WDISP30:
1244 case R_SPARC_WDISP22:
1245 case R_SPARC_WDISP19:
1246 case R_SPARC_WDISP16:
1247 case R_SPARC_8:
1248 case R_SPARC_16:
1249 case R_SPARC_32:
1250 case R_SPARC_HI22:
1251 case R_SPARC_22:
1252 case R_SPARC_13:
1253 case R_SPARC_LO10:
1254 case R_SPARC_UA16:
1255 case R_SPARC_UA32:
1256 case R_SPARC_10:
1257 case R_SPARC_11:
1258 case R_SPARC_64:
1259 case R_SPARC_OLO10:
1260 case R_SPARC_HH22:
1261 case R_SPARC_HM10:
1262 case R_SPARC_LM22:
1263 case R_SPARC_7:
1264 case R_SPARC_5:
1265 case R_SPARC_6:
1266 case R_SPARC_HIX22:
1267 case R_SPARC_LOX10:
1268 case R_SPARC_H44:
1269 case R_SPARC_M44:
1270 case R_SPARC_L44:
1271 case R_SPARC_UA64:
1272 if (h != NULL)
1273 h->non_got_ref = 1;
1274
1275 r_sparc_plt32:
1276 if (h != NULL && !info->shared)
1277 {
1278 /* We may need a .plt entry if the function this reloc
1279 refers to is in a shared lib. */
1280 h->plt.refcount += 1;
1281 }
1282
1283 /* If we are creating a shared library, and this is a reloc
1284 against a global symbol, or a non PC relative reloc
1285 against a local symbol, then we need to copy the reloc
1286 into the shared library. However, if we are linking with
1287 -Bsymbolic, we do not need to copy a reloc against a
1288 global symbol which is defined in an object we are
1289 including in the link (i.e., DEF_REGULAR is set). At
1290 this point we have not seen all the input files, so it is
1291 possible that DEF_REGULAR is not set now but will be set
1292 later (it is never cleared). In case of a weak definition,
1293 DEF_REGULAR may be cleared later by a strong definition in
1294 a shared library. We account for that possibility below by
1295 storing information in the relocs_copied field of the hash
1296 table entry. A similar situation occurs when creating
1297 shared libraries and symbol visibility changes render the
1298 symbol local.
1299
1300 If on the other hand, we are creating an executable, we
1301 may need to keep relocations for symbols satisfied by a
1302 dynamic library if we manage to avoid copy relocs for the
1303 symbol. */
1304 if ((info->shared
1305 && (sec->flags & SEC_ALLOC) != 0
1306 && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1307 || (h != NULL
1308 && (! info->symbolic
1309 || h->root.type == bfd_link_hash_defweak
1310 || !h->def_regular))))
1311 || (!info->shared
1312 && (sec->flags & SEC_ALLOC) != 0
1313 && h != NULL
1314 && (h->root.type == bfd_link_hash_defweak
1315 || !h->def_regular)))
1316 {
1317 struct _bfd_sparc_elf_dyn_relocs *p;
1318 struct _bfd_sparc_elf_dyn_relocs **head;
1319
1320 /* When creating a shared object, we must copy these
1321 relocs into the output file. We create a reloc
1322 section in dynobj and make room for the reloc. */
1323 if (sreloc == NULL)
1324 {
1325 const char *name;
1326 bfd *dynobj;
1327
1328 name = (bfd_elf_string_from_elf_section
1329 (abfd,
1330 elf_elfheader (abfd)->e_shstrndx,
1331 elf_section_data (sec)->rel_hdr.sh_name));
1332 if (name == NULL)
1333 return FALSE;
1334
1335 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1336 && strcmp (bfd_get_section_name (abfd, sec),
1337 name + 5) == 0);
1338
1339 if (htab->elf.dynobj == NULL)
1340 htab->elf.dynobj = abfd;
1341 dynobj = htab->elf.dynobj;
1342
1343 sreloc = bfd_get_section_by_name (dynobj, name);
1344 if (sreloc == NULL)
1345 {
1346 flagword flags;
1347
1348 sreloc = bfd_make_section (dynobj, name);
1349 flags = (SEC_HAS_CONTENTS | SEC_READONLY
1350 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1351 if ((sec->flags & SEC_ALLOC) != 0)
1352 flags |= SEC_ALLOC | SEC_LOAD;
1353 if (sreloc == NULL
1354 || ! bfd_set_section_flags (dynobj, sreloc, flags)
1355 || ! bfd_set_section_alignment (dynobj, sreloc,
1356 htab->word_align_power))
1357 return FALSE;
1358 }
1359 elf_section_data (sec)->sreloc = sreloc;
1360 }
1361
1362 /* If this is a global symbol, we count the number of
1363 relocations we need for this symbol. */
1364 if (h != NULL)
1365 head = &((struct _bfd_sparc_elf_link_hash_entry *) h)->dyn_relocs;
1366 else
1367 {
1368 /* Track dynamic relocs needed for local syms too.
1369 We really need local syms available to do this
1370 easily. Oh well. */
1371
1372 asection *s;
1373 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1374 sec, r_symndx);
1375 if (s == NULL)
1376 return FALSE;
1377
1378 head = ((struct _bfd_sparc_elf_dyn_relocs **)
1379 &elf_section_data (s)->local_dynrel);
1380 }
1381
1382 p = *head;
1383 if (p == NULL || p->sec != sec)
1384 {
1385 bfd_size_type amt = sizeof *p;
1386 p = ((struct _bfd_sparc_elf_dyn_relocs *)
1387 bfd_alloc (htab->elf.dynobj, amt));
1388 if (p == NULL)
1389 return FALSE;
1390 p->next = *head;
1391 *head = p;
1392 p->sec = sec;
1393 p->count = 0;
1394 p->pc_count = 0;
1395 }
1396
1397 p->count += 1;
1398 if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1399 p->pc_count += 1;
1400 }
1401
1402 break;
1403
1404 case R_SPARC_GNU_VTINHERIT:
1405 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1406 return FALSE;
1407 break;
1408
1409 case R_SPARC_GNU_VTENTRY:
1410 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1411 return FALSE;
1412 break;
1413
1414 case R_SPARC_REGISTER:
1415 /* Nothing to do. */
1416 break;
1417
1418 default:
1419 break;
1420 }
1421 }
1422
1423 return TRUE;
1424 }
1425 \f
1426 asection *
1427 _bfd_sparc_elf_gc_mark_hook (asection *sec,
1428 struct bfd_link_info *info,
1429 Elf_Internal_Rela *rel,
1430 struct elf_link_hash_entry *h,
1431 Elf_Internal_Sym *sym)
1432 {
1433 if (h != NULL)
1434 {
1435 struct _bfd_sparc_elf_link_hash_table *htab;
1436
1437 htab = _bfd_sparc_elf_hash_table (info);
1438 switch (SPARC_ELF_R_TYPE (rel->r_info))
1439 {
1440 case R_SPARC_GNU_VTINHERIT:
1441 case R_SPARC_GNU_VTENTRY:
1442 break;
1443
1444 default:
1445 switch (h->root.type)
1446 {
1447 case bfd_link_hash_defined:
1448 case bfd_link_hash_defweak:
1449 return h->root.u.def.section;
1450
1451 case bfd_link_hash_common:
1452 return h->root.u.c.p->section;
1453
1454 default:
1455 break;
1456 }
1457 }
1458 }
1459 else
1460 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1461
1462 return NULL;
1463 }
1464
1465 /* Update the got entry reference counts for the section being removed. */
1466 bfd_boolean
1467 _bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1468 asection *sec, const Elf_Internal_Rela *relocs)
1469 {
1470 struct _bfd_sparc_elf_link_hash_table *htab;
1471 Elf_Internal_Shdr *symtab_hdr;
1472 struct elf_link_hash_entry **sym_hashes;
1473 bfd_signed_vma *local_got_refcounts;
1474 const Elf_Internal_Rela *rel, *relend;
1475
1476 elf_section_data (sec)->local_dynrel = NULL;
1477
1478 htab = _bfd_sparc_elf_hash_table (info);
1479 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1480 sym_hashes = elf_sym_hashes (abfd);
1481 local_got_refcounts = elf_local_got_refcounts (abfd);
1482
1483 relend = relocs + sec->reloc_count;
1484 for (rel = relocs; rel < relend; rel++)
1485 {
1486 unsigned long r_symndx;
1487 unsigned int r_type;
1488 struct elf_link_hash_entry *h = NULL;
1489
1490 r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1491 if (r_symndx >= symtab_hdr->sh_info)
1492 {
1493 struct _bfd_sparc_elf_link_hash_entry *eh;
1494 struct _bfd_sparc_elf_dyn_relocs **pp;
1495 struct _bfd_sparc_elf_dyn_relocs *p;
1496
1497 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1498 while (h->root.type == bfd_link_hash_indirect
1499 || h->root.type == bfd_link_hash_warning)
1500 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1501 eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1502 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1503 if (p->sec == sec)
1504 {
1505 /* Everything must go for SEC. */
1506 *pp = p->next;
1507 break;
1508 }
1509 }
1510
1511 r_type = SPARC_ELF_R_TYPE (rel->r_info);
1512 r_type = sparc_elf_tls_transition (info, abfd, r_type, h != NULL);
1513 switch (r_type)
1514 {
1515 case R_SPARC_TLS_LDM_HI22:
1516 case R_SPARC_TLS_LDM_LO10:
1517 if (_bfd_sparc_elf_hash_table (info)->tls_ldm_got.refcount > 0)
1518 _bfd_sparc_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
1519 break;
1520
1521 case R_SPARC_TLS_GD_HI22:
1522 case R_SPARC_TLS_GD_LO10:
1523 case R_SPARC_TLS_IE_HI22:
1524 case R_SPARC_TLS_IE_LO10:
1525 case R_SPARC_GOT10:
1526 case R_SPARC_GOT13:
1527 case R_SPARC_GOT22:
1528 if (h != NULL)
1529 {
1530 if (h->got.refcount > 0)
1531 h->got.refcount--;
1532 }
1533 else
1534 {
1535 if (local_got_refcounts[r_symndx] > 0)
1536 local_got_refcounts[r_symndx]--;
1537 }
1538 break;
1539
1540 case R_SPARC_PC10:
1541 case R_SPARC_PC22:
1542 case R_SPARC_PC_HH22:
1543 case R_SPARC_PC_HM10:
1544 case R_SPARC_PC_LM22:
1545 if (h != NULL
1546 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1547 break;
1548 /* Fall through. */
1549
1550 case R_SPARC_DISP8:
1551 case R_SPARC_DISP16:
1552 case R_SPARC_DISP32:
1553 case R_SPARC_DISP64:
1554 case R_SPARC_WDISP30:
1555 case R_SPARC_WDISP22:
1556 case R_SPARC_WDISP19:
1557 case R_SPARC_WDISP16:
1558 case R_SPARC_8:
1559 case R_SPARC_16:
1560 case R_SPARC_32:
1561 case R_SPARC_HI22:
1562 case R_SPARC_22:
1563 case R_SPARC_13:
1564 case R_SPARC_LO10:
1565 case R_SPARC_UA16:
1566 case R_SPARC_UA32:
1567 case R_SPARC_PLT32:
1568 case R_SPARC_10:
1569 case R_SPARC_11:
1570 case R_SPARC_64:
1571 case R_SPARC_OLO10:
1572 case R_SPARC_HH22:
1573 case R_SPARC_HM10:
1574 case R_SPARC_LM22:
1575 case R_SPARC_7:
1576 case R_SPARC_5:
1577 case R_SPARC_6:
1578 case R_SPARC_HIX22:
1579 case R_SPARC_LOX10:
1580 case R_SPARC_H44:
1581 case R_SPARC_M44:
1582 case R_SPARC_L44:
1583 case R_SPARC_UA64:
1584 if (info->shared)
1585 break;
1586 /* Fall through. */
1587
1588 case R_SPARC_WPLT30:
1589 if (h != NULL)
1590 {
1591 if (h->plt.refcount > 0)
1592 h->plt.refcount--;
1593 }
1594 break;
1595
1596 default:
1597 break;
1598 }
1599 }
1600
1601 return TRUE;
1602 }
1603
1604 /* Adjust a symbol defined by a dynamic object and referenced by a
1605 regular object. The current definition is in some section of the
1606 dynamic object, but we're not including those sections. We have to
1607 change the definition to something the rest of the link can
1608 understand. */
1609
1610 bfd_boolean
1611 _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1612 struct elf_link_hash_entry *h)
1613 {
1614 struct _bfd_sparc_elf_link_hash_table *htab;
1615 struct _bfd_sparc_elf_link_hash_entry * eh;
1616 struct _bfd_sparc_elf_dyn_relocs *p;
1617 asection *s;
1618 unsigned int power_of_two;
1619
1620 htab = _bfd_sparc_elf_hash_table (info);
1621
1622 /* Make sure we know what is going on here. */
1623 BFD_ASSERT (htab->elf.dynobj != NULL
1624 && (h->needs_plt
1625 || h->u.weakdef != NULL
1626 || (h->def_dynamic
1627 && h->ref_regular
1628 && !h->def_regular)));
1629
1630 /* If this is a function, put it in the procedure linkage table. We
1631 will fill in the contents of the procedure linkage table later
1632 (although we could actually do it here). The STT_NOTYPE
1633 condition is a hack specifically for the Oracle libraries
1634 delivered for Solaris; for some inexplicable reason, they define
1635 some of their functions as STT_NOTYPE when they really should be
1636 STT_FUNC. */
1637 if (h->type == STT_FUNC
1638 || h->needs_plt
1639 || (h->type == STT_NOTYPE
1640 && (h->root.type == bfd_link_hash_defined
1641 || h->root.type == bfd_link_hash_defweak)
1642 && (h->root.u.def.section->flags & SEC_CODE) != 0))
1643 {
1644 if (h->plt.refcount <= 0
1645 || (! info->shared
1646 && !h->def_dynamic
1647 && !h->ref_dynamic
1648 && h->root.type != bfd_link_hash_undefweak
1649 && h->root.type != bfd_link_hash_undefined))
1650 {
1651 /* This case can occur if we saw a WPLT30 reloc in an input
1652 file, but the symbol was never referred to by a dynamic
1653 object, or if all references were garbage collected. In
1654 such a case, we don't actually need to build a procedure
1655 linkage table, and we can just do a WDISP30 reloc instead. */
1656 h->plt.offset = (bfd_vma) -1;
1657 h->needs_plt = 0;
1658 }
1659
1660 return TRUE;
1661 }
1662 else
1663 h->plt.offset = (bfd_vma) -1;
1664
1665 /* If this is a weak symbol, and there is a real definition, the
1666 processor independent code will have arranged for us to see the
1667 real definition first, and we can just use the same value. */
1668 if (h->u.weakdef != NULL)
1669 {
1670 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1671 || h->u.weakdef->root.type == bfd_link_hash_defweak);
1672 h->root.u.def.section = h->u.weakdef->root.u.def.section;
1673 h->root.u.def.value = h->u.weakdef->root.u.def.value;
1674 return TRUE;
1675 }
1676
1677 /* This is a reference to a symbol defined by a dynamic object which
1678 is not a function. */
1679
1680 /* If we are creating a shared library, we must presume that the
1681 only references to the symbol are via the global offset table.
1682 For such cases we need not do anything here; the relocations will
1683 be handled correctly by relocate_section. */
1684 if (info->shared)
1685 return TRUE;
1686
1687 /* If there are no references to this symbol that do not use the
1688 GOT, we don't need to generate a copy reloc. */
1689 if (!h->non_got_ref)
1690 return TRUE;
1691
1692 eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1693 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1694 {
1695 s = p->sec->output_section;
1696 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1697 break;
1698 }
1699
1700 /* If we didn't find any dynamic relocs in read-only sections, then
1701 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1702 if (p == NULL)
1703 {
1704 h->non_got_ref = 0;
1705 return TRUE;
1706 }
1707
1708 /* We must allocate the symbol in our .dynbss section, which will
1709 become part of the .bss section of the executable. There will be
1710 an entry for this symbol in the .dynsym section. The dynamic
1711 object will contain position independent code, so all references
1712 from the dynamic object to this symbol will go through the global
1713 offset table. The dynamic linker will use the .dynsym entry to
1714 determine the address it must put in the global offset table, so
1715 both the dynamic object and the regular object will refer to the
1716 same memory location for the variable. */
1717
1718 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1719 to copy the initial value out of the dynamic object and into the
1720 runtime process image. We need to remember the offset into the
1721 .rel.bss section we are going to use. */
1722 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1723 {
1724 htab->srelbss->size += SPARC_ELF_RELA_BYTES (htab);
1725 h->needs_copy = 1;
1726 }
1727
1728 /* We need to figure out the alignment required for this symbol. I
1729 have no idea how ELF linkers handle this. */
1730 power_of_two = bfd_log2 (h->size);
1731 if (power_of_two > htab->align_power_max)
1732 power_of_two = htab->align_power_max;
1733
1734 /* Apply the required alignment. */
1735 s = htab->sdynbss;
1736 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1737 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1738 {
1739 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1740 return FALSE;
1741 }
1742
1743 /* Define the symbol as being at this point in the section. */
1744 h->root.u.def.section = s;
1745 h->root.u.def.value = s->size;
1746
1747 /* Increment the section size to make room for the symbol. */
1748 s->size += h->size;
1749
1750 return TRUE;
1751 }
1752
1753 /* Allocate space in .plt, .got and associated reloc sections for
1754 dynamic relocs. */
1755
1756 static bfd_boolean
1757 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
1758 {
1759 struct bfd_link_info *info;
1760 struct _bfd_sparc_elf_link_hash_table *htab;
1761 struct _bfd_sparc_elf_link_hash_entry *eh;
1762 struct _bfd_sparc_elf_dyn_relocs *p;
1763
1764 if (h->root.type == bfd_link_hash_indirect)
1765 return TRUE;
1766
1767 if (h->root.type == bfd_link_hash_warning)
1768 /* When warning symbols are created, they **replace** the "real"
1769 entry in the hash table, thus we never get to see the real
1770 symbol in a hash traversal. So look at it now. */
1771 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1772
1773 info = (struct bfd_link_info *) inf;
1774 htab = _bfd_sparc_elf_hash_table (info);
1775
1776 if (htab->elf.dynamic_sections_created
1777 && h->plt.refcount > 0)
1778 {
1779 /* Make sure this symbol is output as a dynamic symbol.
1780 Undefined weak syms won't yet be marked as dynamic. */
1781 if (h->dynindx == -1
1782 && !h->forced_local)
1783 {
1784 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1785 return FALSE;
1786 }
1787
1788 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
1789 {
1790 asection *s = htab->splt;
1791
1792 /* The first four entries in .plt is reserved. */
1793 if (s->size == 0)
1794 s->size = (SPARC_ELF_WORD_BYTES(htab) == 8 ?
1795 PLT64_HEADER_SIZE : PLT32_HEADER_SIZE);
1796
1797 /* The procedure linkage table size is bounded by the magnitude
1798 of the offset we can describe in the entry. */
1799 if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ?
1800 (((bfd_vma)1 << 31) << 1) : 0x400000))
1801 {
1802 bfd_set_error (bfd_error_bad_value);
1803 return FALSE;
1804 }
1805
1806 if (SPARC_ELF_WORD_BYTES(htab) == 8
1807 && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
1808 {
1809 bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE;
1810
1811
1812 off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE;
1813
1814 h->plt.offset = (s->size - (off * 8));
1815 }
1816 else
1817 h->plt.offset = s->size;
1818
1819 /* If this symbol is not defined in a regular file, and we are
1820 not generating a shared library, then set the symbol to this
1821 location in the .plt. This is required to make function
1822 pointers compare as equal between the normal executable and
1823 the shared library. */
1824 if (! info->shared
1825 && !h->def_regular)
1826 {
1827 h->root.u.def.section = s;
1828 h->root.u.def.value = h->plt.offset;
1829 }
1830
1831 /* Make room for this entry. */
1832 s->size += (SPARC_ELF_WORD_BYTES(htab) == 8 ?
1833 PLT64_ENTRY_SIZE : PLT32_ENTRY_SIZE);
1834
1835 /* We also need to make an entry in the .rela.plt section. */
1836 htab->srelplt->size += SPARC_ELF_RELA_BYTES (htab);
1837 }
1838 else
1839 {
1840 h->plt.offset = (bfd_vma) -1;
1841 h->needs_plt = 0;
1842 }
1843 }
1844 else
1845 {
1846 h->plt.offset = (bfd_vma) -1;
1847 h->needs_plt = 0;
1848 }
1849
1850 /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
1851 make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */
1852 if (h->got.refcount > 0
1853 && !info->shared
1854 && h->dynindx == -1
1855 && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
1856 h->got.offset = (bfd_vma) -1;
1857 else if (h->got.refcount > 0)
1858 {
1859 asection *s;
1860 bfd_boolean dyn;
1861 int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
1862
1863 /* Make sure this symbol is output as a dynamic symbol.
1864 Undefined weak syms won't yet be marked as dynamic. */
1865 if (h->dynindx == -1
1866 && !h->forced_local)
1867 {
1868 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1869 return FALSE;
1870 }
1871
1872 s = htab->sgot;
1873 h->got.offset = s->size;
1874 s->size += SPARC_ELF_WORD_BYTES (htab);
1875 /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots. */
1876 if (tls_type == GOT_TLS_GD)
1877 s->size += SPARC_ELF_WORD_BYTES (htab);
1878 dyn = htab->elf.dynamic_sections_created;
1879 /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
1880 R_SPARC_TLS_GD_{HI22,LO10} needs one if local symbol and two if
1881 global. */
1882 if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1883 || tls_type == GOT_TLS_IE)
1884 htab->srelgot->size += SPARC_ELF_RELA_BYTES (htab);
1885 else if (tls_type == GOT_TLS_GD)
1886 htab->srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
1887 else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
1888 htab->srelgot->size += SPARC_ELF_RELA_BYTES (htab);
1889 }
1890 else
1891 h->got.offset = (bfd_vma) -1;
1892
1893 eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1894 if (eh->dyn_relocs == NULL)
1895 return TRUE;
1896
1897 /* In the shared -Bsymbolic case, discard space allocated for
1898 dynamic pc-relative relocs against symbols which turn out to be
1899 defined in regular objects. For the normal shared case, discard
1900 space for pc-relative relocs that have become local due to symbol
1901 visibility changes. */
1902
1903 if (info->shared)
1904 {
1905 if (h->def_regular
1906 && (h->forced_local
1907 || info->symbolic))
1908 {
1909 struct _bfd_sparc_elf_dyn_relocs **pp;
1910
1911 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1912 {
1913 p->count -= p->pc_count;
1914 p->pc_count = 0;
1915 if (p->count == 0)
1916 *pp = p->next;
1917 else
1918 pp = &p->next;
1919 }
1920 }
1921 }
1922 else
1923 {
1924 /* For the non-shared case, discard space for relocs against
1925 symbols which turn out to need copy relocs or are not
1926 dynamic. */
1927
1928 if (!h->non_got_ref
1929 && ((h->def_dynamic
1930 && !h->def_regular)
1931 || (htab->elf.dynamic_sections_created
1932 && (h->root.type == bfd_link_hash_undefweak
1933 || h->root.type == bfd_link_hash_undefined))))
1934 {
1935 /* Make sure this symbol is output as a dynamic symbol.
1936 Undefined weak syms won't yet be marked as dynamic. */
1937 if (h->dynindx == -1
1938 && !h->forced_local)
1939 {
1940 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1941 return FALSE;
1942 }
1943
1944 /* If that succeeded, we know we'll be keeping all the
1945 relocs. */
1946 if (h->dynindx != -1)
1947 goto keep;
1948 }
1949
1950 eh->dyn_relocs = NULL;
1951
1952 keep: ;
1953 }
1954
1955 /* Finally, allocate space. */
1956 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1957 {
1958 asection *sreloc = elf_section_data (p->sec)->sreloc;
1959 sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab);
1960 }
1961
1962 return TRUE;
1963 }
1964
1965 /* Find any dynamic relocs that apply to read-only sections. */
1966
1967 static bfd_boolean
1968 readonly_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
1969 {
1970 struct _bfd_sparc_elf_link_hash_entry *eh;
1971 struct _bfd_sparc_elf_dyn_relocs *p;
1972
1973 if (h->root.type == bfd_link_hash_warning)
1974 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1975
1976 eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1977 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1978 {
1979 asection *s = p->sec->output_section;
1980
1981 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1982 {
1983 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1984
1985 info->flags |= DF_TEXTREL;
1986
1987 /* Not an error, just cut short the traversal. */
1988 return FALSE;
1989 }
1990 }
1991 return TRUE;
1992 }
1993
1994 /* Return true if the dynamic symbol for a given section should be
1995 omitted when creating a shared library. */
1996
1997 bfd_boolean
1998 _bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
1999 struct bfd_link_info *info,
2000 asection *p)
2001 {
2002 /* We keep the .got section symbol so that explicit relocations
2003 against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2004 can be turned into relocations against the .got symbol. */
2005 if (strcmp (p->name, ".got") == 0)
2006 return FALSE;
2007
2008 return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
2009 }
2010
2011 /* Set the sizes of the dynamic sections. */
2012
2013 bfd_boolean
2014 _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
2015 struct bfd_link_info *info)
2016 {
2017 struct _bfd_sparc_elf_link_hash_table *htab;
2018 bfd *dynobj;
2019 asection *s;
2020 bfd *ibfd;
2021
2022 htab = _bfd_sparc_elf_hash_table (info);
2023 dynobj = htab->elf.dynobj;
2024 BFD_ASSERT (dynobj != NULL);
2025
2026 if (elf_hash_table (info)->dynamic_sections_created)
2027 {
2028 /* Set the contents of the .interp section to the interpreter. */
2029 if (info->executable)
2030 {
2031 s = bfd_get_section_by_name (dynobj, ".interp");
2032 BFD_ASSERT (s != NULL);
2033 s->size = htab->dynamic_interpreter_size;
2034 s->contents = (unsigned char *) htab->dynamic_interpreter;
2035 }
2036 }
2037
2038 /* Set up .got offsets for local syms, and space for local dynamic
2039 relocs. */
2040 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2041 {
2042 bfd_signed_vma *local_got;
2043 bfd_signed_vma *end_local_got;
2044 char *local_tls_type;
2045 bfd_size_type locsymcount;
2046 Elf_Internal_Shdr *symtab_hdr;
2047 asection *srel;
2048
2049 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2050 continue;
2051
2052 for (s = ibfd->sections; s != NULL; s = s->next)
2053 {
2054 struct _bfd_sparc_elf_dyn_relocs *p;
2055
2056 for (p = *((struct _bfd_sparc_elf_dyn_relocs **)
2057 &elf_section_data (s)->local_dynrel);
2058 p != NULL;
2059 p = p->next)
2060 {
2061 if (!bfd_is_abs_section (p->sec)
2062 && bfd_is_abs_section (p->sec->output_section))
2063 {
2064 /* Input section has been discarded, either because
2065 it is a copy of a linkonce section or due to
2066 linker script /DISCARD/, so we'll be discarding
2067 the relocs too. */
2068 }
2069 else if (p->count != 0)
2070 {
2071 srel = elf_section_data (p->sec)->sreloc;
2072 srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2073 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2074 info->flags |= DF_TEXTREL;
2075 }
2076 }
2077 }
2078
2079 local_got = elf_local_got_refcounts (ibfd);
2080 if (!local_got)
2081 continue;
2082
2083 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2084 locsymcount = symtab_hdr->sh_info;
2085 end_local_got = local_got + locsymcount;
2086 local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
2087 s = htab->sgot;
2088 srel = htab->srelgot;
2089 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2090 {
2091 if (*local_got > 0)
2092 {
2093 *local_got = s->size;
2094 s->size += SPARC_ELF_WORD_BYTES (htab);
2095 if (*local_tls_type == GOT_TLS_GD)
2096 s->size += SPARC_ELF_WORD_BYTES (htab);
2097 if (info->shared
2098 || *local_tls_type == GOT_TLS_GD
2099 || *local_tls_type == GOT_TLS_IE)
2100 srel->size += SPARC_ELF_RELA_BYTES (htab);
2101 }
2102 else
2103 *local_got = (bfd_vma) -1;
2104 }
2105 }
2106
2107 if (htab->tls_ldm_got.refcount > 0)
2108 {
2109 /* Allocate 2 got entries and 1 dynamic reloc for
2110 R_SPARC_TLS_LDM_{HI22,LO10} relocs. */
2111 htab->tls_ldm_got.offset = htab->sgot->size;
2112 htab->sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
2113 htab->srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2114 }
2115 else
2116 htab->tls_ldm_got.offset = -1;
2117
2118 /* Allocate global sym .plt and .got entries, and space for global
2119 sym dynamic relocs. */
2120 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
2121
2122 if (! ABI_64_P (output_bfd)
2123 && elf_hash_table (info)->dynamic_sections_created)
2124 {
2125 /* Make space for the trailing nop in .plt. */
2126 if (htab->splt->size > 0)
2127 htab->splt->size += 1 * SPARC_INSN_BYTES;
2128
2129 /* If the .got section is more than 0x1000 bytes, we add
2130 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
2131 bit relocations have a greater chance of working.
2132
2133 FIXME: Make this optimization work for 64-bit too. */
2134 if (htab->sgot->size >= 0x1000
2135 && elf_hash_table (info)->hgot->root.u.def.value == 0)
2136 elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
2137 }
2138
2139 /* The check_relocs and adjust_dynamic_symbol entry points have
2140 determined the sizes of the various dynamic sections. Allocate
2141 memory for them. */
2142 for (s = dynobj->sections; s != NULL; s = s->next)
2143 {
2144 const char *name;
2145 bfd_boolean strip = FALSE;
2146
2147 if ((s->flags & SEC_LINKER_CREATED) == 0)
2148 continue;
2149
2150 /* It's OK to base decisions on the section name, because none
2151 of the dynobj section names depend upon the input files. */
2152 name = bfd_get_section_name (dynobj, s);
2153
2154 if (strncmp (name, ".rela", 5) == 0)
2155 {
2156 if (s->size == 0)
2157 {
2158 /* If we don't need this section, strip it from the
2159 output file. This is to handle .rela.bss and
2160 .rel.plt. We must create it in
2161 create_dynamic_sections, because it must be created
2162 before the linker maps input sections to output
2163 sections. The linker does that before
2164 adjust_dynamic_symbol is called, and it is that
2165 function which decides whether anything needs to go
2166 into these sections. */
2167 strip = TRUE;
2168 }
2169 else
2170 {
2171 /* We use the reloc_count field as a counter if we need
2172 to copy relocs into the output file. */
2173 s->reloc_count = 0;
2174 }
2175 }
2176 else if (s != htab->splt && s != htab->sgot)
2177 {
2178 /* It's not one of our sections, so don't allocate space. */
2179 continue;
2180 }
2181
2182 if (strip)
2183 {
2184 s->flags |= SEC_EXCLUDE;
2185 continue;
2186 }
2187
2188 /* Allocate memory for the section contents. Zero the memory
2189 for the benefit of .rela.plt, which has 4 unused entries
2190 at the beginning, and we don't want garbage. */
2191 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2192 if (s->contents == NULL && s->size != 0)
2193 return FALSE;
2194 }
2195
2196 if (elf_hash_table (info)->dynamic_sections_created)
2197 {
2198 /* Add some entries to the .dynamic section. We fill in the
2199 values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
2200 must add the entries now so that we get the correct size for
2201 the .dynamic section. The DT_DEBUG entry is filled in by the
2202 dynamic linker and used by the debugger. */
2203 #define add_dynamic_entry(TAG, VAL) \
2204 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2205
2206 if (info->executable)
2207 {
2208 if (!add_dynamic_entry (DT_DEBUG, 0))
2209 return FALSE;
2210 }
2211
2212 if (htab->srelplt->size != 0)
2213 {
2214 if (!add_dynamic_entry (DT_PLTGOT, 0)
2215 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2216 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2217 || !add_dynamic_entry (DT_JMPREL, 0))
2218 return FALSE;
2219 }
2220
2221 if (!add_dynamic_entry (DT_RELA, 0)
2222 || !add_dynamic_entry (DT_RELASZ, 0)
2223 || !add_dynamic_entry (DT_RELAENT,
2224 SPARC_ELF_RELA_BYTES (htab)))
2225 return FALSE;
2226
2227 /* If any dynamic relocs apply to a read-only section,
2228 then we need a DT_TEXTREL entry. */
2229 if ((info->flags & DF_TEXTREL) == 0)
2230 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2231 (PTR) info);
2232
2233 if (info->flags & DF_TEXTREL)
2234 {
2235 if (!add_dynamic_entry (DT_TEXTREL, 0))
2236 return FALSE;
2237 }
2238
2239 if (ABI_64_P (output_bfd))
2240 {
2241 int reg;
2242 struct _bfd_sparc_elf_app_reg * app_regs;
2243 struct elf_strtab_hash *dynstr;
2244 struct elf_link_hash_table *eht = elf_hash_table (info);
2245
2246 /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
2247 entries if needed. */
2248 app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
2249 dynstr = eht->dynstr;
2250
2251 for (reg = 0; reg < 4; reg++)
2252 if (app_regs [reg].name != NULL)
2253 {
2254 struct elf_link_local_dynamic_entry *entry, *e;
2255
2256 if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
2257 return FALSE;
2258
2259 entry = (struct elf_link_local_dynamic_entry *)
2260 bfd_hash_allocate (&info->hash->table, sizeof (*entry));
2261 if (entry == NULL)
2262 return FALSE;
2263
2264 /* We cheat here a little bit: the symbol will not be local, so we
2265 put it at the end of the dynlocal linked list. We will fix it
2266 later on, as we have to fix other fields anyway. */
2267 entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
2268 entry->isym.st_size = 0;
2269 if (*app_regs [reg].name != '\0')
2270 entry->isym.st_name
2271 = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, FALSE);
2272 else
2273 entry->isym.st_name = 0;
2274 entry->isym.st_other = 0;
2275 entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
2276 STT_REGISTER);
2277 entry->isym.st_shndx = app_regs [reg].shndx;
2278 entry->next = NULL;
2279 entry->input_bfd = output_bfd;
2280 entry->input_indx = -1;
2281
2282 if (eht->dynlocal == NULL)
2283 eht->dynlocal = entry;
2284 else
2285 {
2286 for (e = eht->dynlocal; e->next; e = e->next)
2287 ;
2288 e->next = entry;
2289 }
2290 eht->dynsymcount++;
2291 }
2292 }
2293 }
2294 #undef add_dynamic_entry
2295
2296 return TRUE;
2297 }
2298 \f
2299 bfd_boolean
2300 _bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
2301 {
2302 struct _bfd_sparc_elf_section_data *sdata;
2303 bfd_size_type amt = sizeof (*sdata);
2304
2305 sdata = (struct _bfd_sparc_elf_section_data *) bfd_zalloc (abfd, amt);
2306 if (sdata == NULL)
2307 return FALSE;
2308 sec->used_by_bfd = (PTR) sdata;
2309
2310 return _bfd_elf_new_section_hook (abfd, sec);
2311 }
2312
2313 bfd_boolean
2314 _bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
2315 struct bfd_section *section,
2316 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2317 bfd_boolean *again)
2318 {
2319 *again = FALSE;
2320 sec_do_relax (section) = 1;
2321 return TRUE;
2322 }
2323 \f
2324 /* Return the base VMA address which should be subtracted from real addresses
2325 when resolving @dtpoff relocation.
2326 This is PT_TLS segment p_vaddr. */
2327
2328 static bfd_vma
2329 dtpoff_base (struct bfd_link_info *info)
2330 {
2331 /* If tls_sec is NULL, we should have signalled an error already. */
2332 if (elf_hash_table (info)->tls_sec == NULL)
2333 return 0;
2334 return elf_hash_table (info)->tls_sec->vma;
2335 }
2336
2337 /* Return the relocation value for @tpoff relocation
2338 if STT_TLS virtual address is ADDRESS. */
2339
2340 static bfd_vma
2341 tpoff (struct bfd_link_info *info, bfd_vma address)
2342 {
2343 struct elf_link_hash_table *htab = elf_hash_table (info);
2344
2345 /* If tls_sec is NULL, we should have signalled an error already. */
2346 if (htab->tls_sec == NULL)
2347 return 0;
2348 return address - htab->tls_size - htab->tls_sec->vma;
2349 }
2350
2351 /* Relocate a SPARC ELF section. */
2352
2353 bfd_boolean
2354 _bfd_sparc_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2355 bfd *input_bfd, asection *input_section,
2356 bfd_byte *contents, Elf_Internal_Rela *relocs,
2357 Elf_Internal_Sym *local_syms, asection **local_sections)
2358 {
2359 struct _bfd_sparc_elf_link_hash_table *htab;
2360 Elf_Internal_Shdr *symtab_hdr;
2361 struct elf_link_hash_entry **sym_hashes;
2362 bfd_vma *local_got_offsets;
2363 bfd_vma got_base;
2364 asection *sreloc;
2365 Elf_Internal_Rela *rel;
2366 Elf_Internal_Rela *relend;
2367 int num_relocs;
2368
2369 if (info->relocatable)
2370 return TRUE;
2371
2372 htab = _bfd_sparc_elf_hash_table (info);
2373 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2374 sym_hashes = elf_sym_hashes (input_bfd);
2375 local_got_offsets = elf_local_got_offsets (input_bfd);
2376
2377 if (elf_hash_table (info)->hgot == NULL)
2378 got_base = 0;
2379 else
2380 got_base = elf_hash_table (info)->hgot->root.u.def.value;
2381
2382 sreloc = elf_section_data (input_section)->sreloc;
2383
2384 rel = relocs;
2385 if (ABI_64_P (output_bfd))
2386 num_relocs = NUM_SHDR_ENTRIES (& elf_section_data (input_section)->rel_hdr);
2387 else
2388 num_relocs = input_section->reloc_count;
2389 relend = relocs + num_relocs;
2390 for (; rel < relend; rel++)
2391 {
2392 int r_type, tls_type;
2393 reloc_howto_type *howto;
2394 unsigned long r_symndx;
2395 struct elf_link_hash_entry *h;
2396 Elf_Internal_Sym *sym;
2397 asection *sec;
2398 bfd_vma relocation, off;
2399 bfd_reloc_status_type r;
2400 bfd_boolean is_plt = FALSE;
2401 bfd_boolean unresolved_reloc;
2402
2403 r_type = SPARC_ELF_R_TYPE (rel->r_info);
2404 if (r_type == R_SPARC_GNU_VTINHERIT
2405 || r_type == R_SPARC_GNU_VTENTRY)
2406 continue;
2407
2408 if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2409 {
2410 bfd_set_error (bfd_error_bad_value);
2411 return FALSE;
2412 }
2413 howto = _bfd_sparc_elf_howto_table + r_type;
2414
2415 /* This is a final link. */
2416 r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
2417 h = NULL;
2418 sym = NULL;
2419 sec = NULL;
2420 unresolved_reloc = FALSE;
2421 if (r_symndx < symtab_hdr->sh_info)
2422 {
2423 sym = local_syms + r_symndx;
2424 sec = local_sections[r_symndx];
2425 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2426 }
2427 else
2428 {
2429 bfd_boolean warned;
2430
2431 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2432 r_symndx, symtab_hdr, sym_hashes,
2433 h, sec, relocation,
2434 unresolved_reloc, warned);
2435 if (warned)
2436 {
2437 /* To avoid generating warning messages about truncated
2438 relocations, set the relocation's address to be the same as
2439 the start of this section. */
2440 if (input_section->output_section != NULL)
2441 relocation = input_section->output_section->vma;
2442 else
2443 relocation = 0;
2444 }
2445 }
2446
2447 switch (r_type)
2448 {
2449 case R_SPARC_GOT10:
2450 case R_SPARC_GOT13:
2451 case R_SPARC_GOT22:
2452 /* Relocation is to the entry for this symbol in the global
2453 offset table. */
2454 if (htab->sgot == NULL)
2455 abort ();
2456
2457 if (h != NULL)
2458 {
2459 bfd_boolean dyn;
2460
2461 off = h->got.offset;
2462 BFD_ASSERT (off != (bfd_vma) -1);
2463 dyn = elf_hash_table (info)->dynamic_sections_created;
2464
2465 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2466 || (info->shared
2467 && (info->symbolic
2468 || h->dynindx == -1
2469 || h->forced_local)
2470 && h->def_regular))
2471 {
2472 /* This is actually a static link, or it is a
2473 -Bsymbolic link and the symbol is defined
2474 locally, or the symbol was forced to be local
2475 because of a version file. We must initialize
2476 this entry in the global offset table. Since the
2477 offset must always be a multiple of 8 for 64-bit
2478 and 4 for 32-bit, we use the least significant bit
2479 to record whether we have initialized it already.
2480
2481 When doing a dynamic link, we create a .rela.got
2482 relocation entry to initialize the value. This
2483 is done in the finish_dynamic_symbol routine. */
2484 if ((off & 1) != 0)
2485 off &= ~1;
2486 else
2487 {
2488 SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
2489 htab->sgot->contents + off);
2490 h->got.offset |= 1;
2491 }
2492 }
2493 else
2494 unresolved_reloc = FALSE;
2495 }
2496 else
2497 {
2498 BFD_ASSERT (local_got_offsets != NULL
2499 && local_got_offsets[r_symndx] != (bfd_vma) -1);
2500
2501 off = local_got_offsets[r_symndx];
2502
2503 /* The offset must always be a multiple of 8 on 64-bit and
2504 4 on 32-bit. We use the least significant bit to record
2505 whether we have already processed this entry. */
2506 if ((off & 1) != 0)
2507 off &= ~1;
2508 else
2509 {
2510
2511 if (info->shared)
2512 {
2513 asection *s;
2514 Elf_Internal_Rela outrel;
2515
2516 /* We need to generate a R_SPARC_RELATIVE reloc
2517 for the dynamic linker. */
2518 s = htab->srelgot;
2519 BFD_ASSERT (s != NULL);
2520
2521 outrel.r_offset = (htab->sgot->output_section->vma
2522 + htab->sgot->output_offset
2523 + off);
2524 outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2525 0, R_SPARC_RELATIVE);
2526 outrel.r_addend = relocation;
2527 relocation = 0;
2528 SPARC_ELF_APPEND_RELA (htab, output_bfd, s, &outrel);
2529 }
2530
2531 SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
2532 htab->sgot->contents + off);
2533 local_got_offsets[r_symndx] |= 1;
2534 }
2535 }
2536 relocation = htab->sgot->output_offset + off - got_base;
2537 break;
2538
2539 case R_SPARC_PLT32:
2540 case R_SPARC_PLT64:
2541 if (h == NULL || h->plt.offset == (bfd_vma) -1)
2542 {
2543 r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
2544 goto r_sparc_plt32;
2545 }
2546 /* Fall through. */
2547
2548 case R_SPARC_WPLT30:
2549 case R_SPARC_HIPLT22:
2550 case R_SPARC_LOPLT10:
2551 case R_SPARC_PCPLT32:
2552 case R_SPARC_PCPLT22:
2553 case R_SPARC_PCPLT10:
2554 r_sparc_wplt30:
2555 /* Relocation is to the entry for this symbol in the
2556 procedure linkage table. */
2557
2558 if (! ABI_64_P (output_bfd))
2559 {
2560 /* The Solaris native assembler will generate a WPLT30 reloc
2561 for a local symbol if you assemble a call from one
2562 section to another when using -K pic. We treat it as
2563 WDISP30. */
2564 if (h == NULL)
2565 break;
2566 }
2567 else
2568 {
2569 BFD_ASSERT (h != NULL);
2570 }
2571
2572 if (h->plt.offset == (bfd_vma) -1 || htab->splt == NULL)
2573 {
2574 /* We didn't make a PLT entry for this symbol. This
2575 happens when statically linking PIC code, or when
2576 using -Bsymbolic. */
2577 break;
2578 }
2579
2580 relocation = (htab->splt->output_section->vma
2581 + htab->splt->output_offset
2582 + h->plt.offset);
2583 unresolved_reloc = FALSE;
2584 if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
2585 {
2586 r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
2587 is_plt = TRUE;
2588 goto r_sparc_plt32;
2589 }
2590 break;
2591
2592 case R_SPARC_PC10:
2593 case R_SPARC_PC22:
2594 case R_SPARC_PC_HH22:
2595 case R_SPARC_PC_HM10:
2596 case R_SPARC_PC_LM22:
2597 if (h != NULL
2598 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2599 break;
2600 /* Fall through. */
2601 case R_SPARC_DISP8:
2602 case R_SPARC_DISP16:
2603 case R_SPARC_DISP32:
2604 case R_SPARC_DISP64:
2605 case R_SPARC_WDISP30:
2606 case R_SPARC_WDISP22:
2607 case R_SPARC_WDISP19:
2608 case R_SPARC_WDISP16:
2609 case R_SPARC_8:
2610 case R_SPARC_16:
2611 case R_SPARC_32:
2612 case R_SPARC_HI22:
2613 case R_SPARC_22:
2614 case R_SPARC_13:
2615 case R_SPARC_LO10:
2616 case R_SPARC_UA16:
2617 case R_SPARC_UA32:
2618 case R_SPARC_10:
2619 case R_SPARC_11:
2620 case R_SPARC_64:
2621 case R_SPARC_OLO10:
2622 case R_SPARC_HH22:
2623 case R_SPARC_HM10:
2624 case R_SPARC_LM22:
2625 case R_SPARC_7:
2626 case R_SPARC_5:
2627 case R_SPARC_6:
2628 case R_SPARC_HIX22:
2629 case R_SPARC_LOX10:
2630 case R_SPARC_H44:
2631 case R_SPARC_M44:
2632 case R_SPARC_L44:
2633 case R_SPARC_UA64:
2634 r_sparc_plt32:
2635 /* r_symndx will be zero only for relocs against symbols
2636 from removed linkonce sections, or sections discarded by
2637 a linker script. */
2638 if (r_symndx == 0
2639 || (input_section->flags & SEC_ALLOC) == 0)
2640 break;
2641
2642 if ((info->shared
2643 && (h == NULL
2644 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2645 || h->root.type != bfd_link_hash_undefweak)
2646 && (! howto->pc_relative
2647 || (h != NULL
2648 && h->dynindx != -1
2649 && (! info->symbolic
2650 || !h->def_regular))))
2651 || (!info->shared
2652 && h != NULL
2653 && h->dynindx != -1
2654 && !h->non_got_ref
2655 && ((h->def_dynamic
2656 && !h->def_regular)
2657 || h->root.type == bfd_link_hash_undefweak
2658 || h->root.type == bfd_link_hash_undefined)))
2659 {
2660 Elf_Internal_Rela outrel;
2661 bfd_boolean skip, relocate = FALSE;
2662
2663 /* When generating a shared object, these relocations
2664 are copied into the output file to be resolved at run
2665 time. */
2666
2667 BFD_ASSERT (sreloc != NULL);
2668
2669 skip = FALSE;
2670
2671 outrel.r_offset =
2672 _bfd_elf_section_offset (output_bfd, info, input_section,
2673 rel->r_offset);
2674 if (outrel.r_offset == (bfd_vma) -1)
2675 skip = TRUE;
2676 else if (outrel.r_offset == (bfd_vma) -2)
2677 skip = TRUE, relocate = TRUE;
2678 outrel.r_offset += (input_section->output_section->vma
2679 + input_section->output_offset);
2680
2681 /* Optimize unaligned reloc usage now that we know where
2682 it finally resides. */
2683 switch (r_type)
2684 {
2685 case R_SPARC_16:
2686 if (outrel.r_offset & 1)
2687 r_type = R_SPARC_UA16;
2688 break;
2689 case R_SPARC_UA16:
2690 if (!(outrel.r_offset & 1))
2691 r_type = R_SPARC_16;
2692 break;
2693 case R_SPARC_32:
2694 if (outrel.r_offset & 3)
2695 r_type = R_SPARC_UA32;
2696 break;
2697 case R_SPARC_UA32:
2698 if (!(outrel.r_offset & 3))
2699 r_type = R_SPARC_32;
2700 break;
2701 case R_SPARC_64:
2702 if (outrel.r_offset & 7)
2703 r_type = R_SPARC_UA64;
2704 break;
2705 case R_SPARC_UA64:
2706 if (!(outrel.r_offset & 7))
2707 r_type = R_SPARC_64;
2708 break;
2709 case R_SPARC_DISP8:
2710 case R_SPARC_DISP16:
2711 case R_SPARC_DISP32:
2712 case R_SPARC_DISP64:
2713 /* If the symbol is not dynamic, we should not keep
2714 a dynamic relocation. But an .rela.* slot has been
2715 allocated for it, output R_SPARC_NONE.
2716 FIXME: Add code tracking needed dynamic relocs as
2717 e.g. i386 has. */
2718 if (h->dynindx == -1)
2719 skip = TRUE, relocate = TRUE;
2720 break;
2721 }
2722
2723 if (skip)
2724 memset (&outrel, 0, sizeof outrel);
2725 /* h->dynindx may be -1 if the symbol was marked to
2726 become local. */
2727 else if (h != NULL && ! is_plt
2728 && ((! info->symbolic && h->dynindx != -1)
2729 || !h->def_regular))
2730 {
2731 BFD_ASSERT (h->dynindx != -1);
2732 outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
2733 outrel.r_addend = rel->r_addend;
2734 }
2735 else
2736 {
2737 if (r_type == R_SPARC_32 || r_type == R_SPARC_64)
2738 {
2739 outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2740 0, R_SPARC_RELATIVE);
2741 outrel.r_addend = relocation + rel->r_addend;
2742 }
2743 else
2744 {
2745 long indx;
2746
2747 if (is_plt)
2748 sec = htab->splt;
2749
2750 if (bfd_is_abs_section (sec))
2751 indx = 0;
2752 else if (sec == NULL || sec->owner == NULL)
2753 {
2754 bfd_set_error (bfd_error_bad_value);
2755 return FALSE;
2756 }
2757 else
2758 {
2759 asection *osec;
2760
2761 osec = sec->output_section;
2762 indx = elf_section_data (osec)->dynindx;
2763
2764 /* FIXME: we really should be able to link non-pic
2765 shared libraries. */
2766 if (indx == 0)
2767 {
2768 BFD_FAIL ();
2769 (*_bfd_error_handler)
2770 (_("%B: probably compiled without -fPIC?"),
2771 input_bfd);
2772 bfd_set_error (bfd_error_bad_value);
2773 return FALSE;
2774 }
2775 }
2776
2777 outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx, r_type);
2778 outrel.r_addend = relocation + rel->r_addend;
2779 }
2780 }
2781
2782 SPARC_ELF_APPEND_RELA (htab, output_bfd, sreloc, &outrel);
2783
2784 /* This reloc will be computed at runtime, so there's no
2785 need to do anything now. */
2786 if (! relocate)
2787 continue;
2788 }
2789 break;
2790
2791 case R_SPARC_TLS_GD_HI22:
2792 if (! ABI_64_P (input_bfd)
2793 && ! _bfd_sparc_elf_tdata (input_bfd)->has_tlsgd)
2794 {
2795 /* R_SPARC_REV32 used the same reloc number as
2796 R_SPARC_TLS_GD_HI22. */
2797 r_type = R_SPARC_REV32;
2798 break;
2799 }
2800 /* Fall through */
2801
2802 case R_SPARC_TLS_GD_LO10:
2803 case R_SPARC_TLS_IE_HI22:
2804 case R_SPARC_TLS_IE_LO10:
2805 r_type = sparc_elf_tls_transition (info, input_bfd, r_type, h == NULL);
2806 tls_type = GOT_UNKNOWN;
2807 if (h == NULL && local_got_offsets)
2808 tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
2809 else if (h != NULL)
2810 {
2811 tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
2812 if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2813 switch (SPARC_ELF_R_TYPE (rel->r_info))
2814 {
2815 case R_SPARC_TLS_GD_HI22:
2816 case R_SPARC_TLS_IE_HI22:
2817 r_type = R_SPARC_TLS_LE_HIX22;
2818 break;
2819 default:
2820 r_type = R_SPARC_TLS_LE_LOX10;
2821 break;
2822 }
2823 }
2824 if (tls_type == GOT_TLS_IE)
2825 switch (r_type)
2826 {
2827 case R_SPARC_TLS_GD_HI22:
2828 r_type = R_SPARC_TLS_IE_HI22;
2829 break;
2830 case R_SPARC_TLS_GD_LO10:
2831 r_type = R_SPARC_TLS_IE_LO10;
2832 break;
2833 }
2834
2835 if (r_type == R_SPARC_TLS_LE_HIX22)
2836 {
2837 relocation = tpoff (info, relocation);
2838 break;
2839 }
2840 if (r_type == R_SPARC_TLS_LE_LOX10)
2841 {
2842 /* Change add into xor. */
2843 relocation = tpoff (info, relocation);
2844 bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
2845 contents + rel->r_offset)
2846 | 0x80182000), contents + rel->r_offset);
2847 break;
2848 }
2849
2850 if (h != NULL)
2851 {
2852 off = h->got.offset;
2853 h->got.offset |= 1;
2854 }
2855 else
2856 {
2857 BFD_ASSERT (local_got_offsets != NULL);
2858 off = local_got_offsets[r_symndx];
2859 local_got_offsets[r_symndx] |= 1;
2860 }
2861
2862 r_sparc_tlsldm:
2863 if (htab->sgot == NULL)
2864 abort ();
2865
2866 if ((off & 1) != 0)
2867 off &= ~1;
2868 else
2869 {
2870 Elf_Internal_Rela outrel;
2871 int dr_type, indx;
2872
2873 if (htab->srelgot == NULL)
2874 abort ();
2875
2876 SPARC_ELF_PUT_WORD (htab, output_bfd, 0, htab->sgot->contents + off);
2877 outrel.r_offset = (htab->sgot->output_section->vma
2878 + htab->sgot->output_offset + off);
2879 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2880 if (r_type == R_SPARC_TLS_IE_HI22
2881 || r_type == R_SPARC_TLS_IE_LO10)
2882 dr_type = SPARC_ELF_TPOFF_RELOC (htab);
2883 else
2884 dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
2885 if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
2886 outrel.r_addend = relocation - dtpoff_base (info);
2887 else
2888 outrel.r_addend = 0;
2889 outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
2890 SPARC_ELF_APPEND_RELA (htab, output_bfd, htab->srelgot, &outrel);
2891
2892 if (r_type == R_SPARC_TLS_GD_HI22
2893 || r_type == R_SPARC_TLS_GD_LO10)
2894 {
2895 if (indx == 0)
2896 {
2897 BFD_ASSERT (! unresolved_reloc);
2898 SPARC_ELF_PUT_WORD (htab, output_bfd,
2899 relocation - dtpoff_base (info),
2900 (htab->sgot->contents + off
2901 + SPARC_ELF_WORD_BYTES (htab)));
2902 }
2903 else
2904 {
2905 SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
2906 (htab->sgot->contents + off
2907 + SPARC_ELF_WORD_BYTES (htab)));
2908 outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
2909 SPARC_ELF_DTPOFF_RELOC (htab));
2910 outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
2911 SPARC_ELF_APPEND_RELA (htab, output_bfd, htab->srelgot, &outrel);
2912 }
2913 }
2914 else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
2915 {
2916 SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
2917 (htab->sgot->contents + off
2918 + SPARC_ELF_WORD_BYTES (htab)));
2919 }
2920 }
2921
2922 if (off >= (bfd_vma) -2)
2923 abort ();
2924
2925 relocation = htab->sgot->output_offset + off - got_base;
2926 unresolved_reloc = FALSE;
2927 howto = _bfd_sparc_elf_howto_table + r_type;
2928 break;
2929
2930 case R_SPARC_TLS_LDM_HI22:
2931 case R_SPARC_TLS_LDM_LO10:
2932 if (! info->shared)
2933 {
2934 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2935 continue;
2936 }
2937 off = htab->tls_ldm_got.offset;
2938 htab->tls_ldm_got.offset |= 1;
2939 goto r_sparc_tlsldm;
2940
2941 case R_SPARC_TLS_LDO_HIX22:
2942 case R_SPARC_TLS_LDO_LOX10:
2943 if (info->shared)
2944 {
2945 relocation -= dtpoff_base (info);
2946 break;
2947 }
2948
2949 r_type = (r_type == R_SPARC_TLS_LDO_HIX22
2950 ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_LE_LOX10);
2951 /* Fall through. */
2952
2953 case R_SPARC_TLS_LE_HIX22:
2954 case R_SPARC_TLS_LE_LOX10:
2955 if (info->shared)
2956 {
2957 Elf_Internal_Rela outrel;
2958 bfd_boolean skip, relocate = FALSE;
2959
2960 BFD_ASSERT (sreloc != NULL);
2961 skip = FALSE;
2962 outrel.r_offset =
2963 _bfd_elf_section_offset (output_bfd, info, input_section,
2964 rel->r_offset);
2965 if (outrel.r_offset == (bfd_vma) -1)
2966 skip = TRUE;
2967 else if (outrel.r_offset == (bfd_vma) -2)
2968 skip = TRUE, relocate = TRUE;
2969 outrel.r_offset += (input_section->output_section->vma
2970 + input_section->output_offset);
2971 if (skip)
2972 memset (&outrel, 0, sizeof outrel);
2973 else
2974 {
2975 outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
2976 outrel.r_addend = relocation - dtpoff_base (info)
2977 + rel->r_addend;
2978 }
2979
2980 SPARC_ELF_APPEND_RELA (htab, output_bfd, sreloc, &outrel);
2981 continue;
2982 }
2983 relocation = tpoff (info, relocation);
2984 break;
2985
2986 case R_SPARC_TLS_LDM_CALL:
2987 if (! info->shared)
2988 {
2989 /* mov %g0, %o0 */
2990 bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
2991 continue;
2992 }
2993 /* Fall through */
2994
2995 case R_SPARC_TLS_GD_CALL:
2996 tls_type = GOT_UNKNOWN;
2997 if (h == NULL && local_got_offsets)
2998 tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
2999 else if (h != NULL)
3000 tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3001 if (! info->shared
3002 || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3003 {
3004 bfd_vma insn;
3005
3006 if (!info->shared && (h == NULL || h->dynindx == -1))
3007 {
3008 /* GD -> LE */
3009 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3010 continue;
3011 }
3012
3013 /* GD -> IE */
3014 if (rel + 1 < relend
3015 && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3016 && rel[1].r_offset == rel->r_offset + 4
3017 && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3018 && (((insn = bfd_get_32 (input_bfd,
3019 contents + rel[1].r_offset))
3020 >> 25) & 0x1f) == 8)
3021 {
3022 /* We have
3023 call __tls_get_addr, %tgd_call(foo)
3024 add %reg1, %reg2, %o0, %tgd_add(foo)
3025 and change it into IE:
3026 {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3027 add %g7, %o0, %o0, %tie_add(foo).
3028 add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3029 ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3030 ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2. */
3031 bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3032 contents + rel->r_offset);
3033 bfd_put_32 (output_bfd, 0x9001c008,
3034 contents + rel->r_offset + 4);
3035 rel++;
3036 continue;
3037 }
3038
3039 bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
3040 continue;
3041 }
3042
3043 h = (struct elf_link_hash_entry *)
3044 bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
3045 FALSE, TRUE);
3046 BFD_ASSERT (h != NULL);
3047 r_type = R_SPARC_WPLT30;
3048 howto = _bfd_sparc_elf_howto_table + r_type;
3049 goto r_sparc_wplt30;
3050
3051 case R_SPARC_TLS_GD_ADD:
3052 tls_type = GOT_UNKNOWN;
3053 if (h == NULL && local_got_offsets)
3054 tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3055 else if (h != NULL)
3056 tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3057 if (! info->shared || tls_type == GOT_TLS_IE)
3058 {
3059 /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3060 changed into IE:
3061 {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3062 or LE:
3063 add %g7, %reg2, %reg3. */
3064 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3065 if ((h != NULL && h->dynindx != -1) || info->shared)
3066 relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3067 else
3068 relocation = (insn & ~0x7c000) | 0x1c000;
3069 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3070 }
3071 continue;
3072
3073 case R_SPARC_TLS_LDM_ADD:
3074 if (! info->shared)
3075 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3076 continue;
3077
3078 case R_SPARC_TLS_LDO_ADD:
3079 if (! info->shared)
3080 {
3081 /* Change rs1 into %g7. */
3082 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3083 insn = (insn & ~0x7c000) | 0x1c000;
3084 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3085 }
3086 continue;
3087
3088 case R_SPARC_TLS_IE_LD:
3089 case R_SPARC_TLS_IE_LDX:
3090 if (! info->shared && (h == NULL || h->dynindx == -1))
3091 {
3092 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3093 int rs2 = insn & 0x1f;
3094 int rd = (insn >> 25) & 0x1f;
3095
3096 if (rs2 == rd)
3097 relocation = SPARC_NOP;
3098 else
3099 relocation = 0x80100000 | (insn & 0x3e00001f);
3100 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3101 }
3102 continue;
3103
3104 case R_SPARC_TLS_IE_ADD:
3105 /* Totally useless relocation. */
3106 continue;
3107
3108 case R_SPARC_TLS_DTPOFF32:
3109 case R_SPARC_TLS_DTPOFF64:
3110 relocation -= dtpoff_base (info);
3111 break;
3112
3113 default:
3114 break;
3115 }
3116
3117 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3118 because such sections are not SEC_ALLOC and thus ld.so will
3119 not process them. */
3120 if (unresolved_reloc
3121 && !((input_section->flags & SEC_DEBUGGING) != 0
3122 && h->def_dynamic))
3123 (*_bfd_error_handler)
3124 (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
3125 input_bfd,
3126 input_section,
3127 (long) rel->r_offset,
3128 h->root.root.string);
3129
3130 r = bfd_reloc_continue;
3131 if (r_type == R_SPARC_OLO10)
3132 {
3133 bfd_vma x;
3134
3135 if (! ABI_64_P (output_bfd))
3136 abort ();
3137
3138 relocation += rel->r_addend;
3139 relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3140
3141 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3142 x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3143 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3144
3145 r = bfd_check_overflow (howto->complain_on_overflow,
3146 howto->bitsize, howto->rightshift,
3147 bfd_arch_bits_per_address (input_bfd),
3148 relocation);
3149 }
3150 else if (r_type == R_SPARC_WDISP16)
3151 {
3152 bfd_vma x;
3153
3154 relocation += rel->r_addend;
3155 relocation -= (input_section->output_section->vma
3156 + input_section->output_offset);
3157 relocation -= rel->r_offset;
3158
3159 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3160 x |= ((((relocation >> 2) & 0xc000) << 6)
3161 | ((relocation >> 2) & 0x3fff));
3162 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3163
3164 r = bfd_check_overflow (howto->complain_on_overflow,
3165 howto->bitsize, howto->rightshift,
3166 bfd_arch_bits_per_address (input_bfd),
3167 relocation);
3168 }
3169 else if (r_type == R_SPARC_REV32)
3170 {
3171 bfd_vma x;
3172
3173 relocation = relocation + rel->r_addend;
3174
3175 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3176 x = x + relocation;
3177 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3178 r = bfd_reloc_ok;
3179 }
3180 else if (r_type == R_SPARC_TLS_LDO_HIX22
3181 || r_type == R_SPARC_TLS_LE_HIX22)
3182 {
3183 bfd_vma x;
3184
3185 relocation += rel->r_addend;
3186 if (r_type == R_SPARC_TLS_LE_HIX22)
3187 relocation ^= MINUS_ONE;
3188
3189 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3190 x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3191 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3192 r = bfd_reloc_ok;
3193 }
3194 else if (r_type == R_SPARC_TLS_LDO_LOX10
3195 || r_type == R_SPARC_TLS_LE_LOX10)
3196 {
3197 bfd_vma x;
3198
3199 relocation += rel->r_addend;
3200 relocation &= 0x3ff;
3201 if (r_type == R_SPARC_TLS_LE_LOX10)
3202 relocation |= 0x1c00;
3203
3204 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3205 x = (x & ~(bfd_vma) 0x1fff) | relocation;
3206 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3207
3208 r = bfd_reloc_ok;
3209 }
3210 else if (r_type == R_SPARC_HIX22)
3211 {
3212 bfd_vma x;
3213
3214 relocation += rel->r_addend;
3215 relocation = relocation ^ MINUS_ONE;
3216
3217 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3218 x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3219 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3220
3221 r = bfd_check_overflow (howto->complain_on_overflow,
3222 howto->bitsize, howto->rightshift,
3223 bfd_arch_bits_per_address (input_bfd),
3224 relocation);
3225 }
3226 else if (r_type == R_SPARC_LOX10)
3227 {
3228 bfd_vma x;
3229
3230 relocation += rel->r_addend;
3231 relocation = (relocation & 0x3ff) | 0x1c00;
3232
3233 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3234 x = (x & ~(bfd_vma) 0x1fff) | relocation;
3235 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3236
3237 r = bfd_reloc_ok;
3238 }
3239 else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3240 && sec_do_relax (input_section)
3241 && rel->r_offset + 4 < input_section->size)
3242 {
3243 #define G0 0
3244 #define O7 15
3245 #define XCC (2 << 20)
3246 #define COND(x) (((x)&0xf)<<25)
3247 #define CONDA COND(0x8)
3248 #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
3249 #define INSN_BA (F2(0,2) | CONDA)
3250 #define INSN_OR F3(2, 0x2, 0)
3251 #define INSN_NOP F2(0,4)
3252
3253 bfd_vma x, y;
3254
3255 /* If the instruction is a call with either:
3256 restore
3257 arithmetic instruction with rd == %o7
3258 where rs1 != %o7 and rs2 if it is register != %o7
3259 then we can optimize if the call destination is near
3260 by changing the call into a branch always. */
3261 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3262 y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3263 if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3264 {
3265 if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3266 || ((y & OP3(0x28)) == 0 /* arithmetic */
3267 && (y & RD(~0)) == RD(O7)))
3268 && (y & RS1(~0)) != RS1(O7)
3269 && ((y & F3I(~0))
3270 || (y & RS2(~0)) != RS2(O7)))
3271 {
3272 bfd_vma reloc;
3273
3274 reloc = relocation + rel->r_addend - rel->r_offset;
3275 reloc -= (input_section->output_section->vma
3276 + input_section->output_offset);
3277
3278 /* Ensure the branch fits into simm22. */
3279 if ((reloc & 3) == 0
3280 && ((reloc & ~(bfd_vma)0x7fffff) == 0
3281 || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
3282 {
3283 reloc >>= 2;
3284
3285 /* Check whether it fits into simm19. */
3286 if (((reloc & 0x3c0000) == 0
3287 || (reloc & 0x3c0000) == 0x3c0000)
3288 && (ABI_64_P (output_bfd)
3289 || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
3290 x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
3291 else
3292 x = INSN_BA | (reloc & 0x3fffff); /* ba */
3293 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3294 r = bfd_reloc_ok;
3295 if (rel->r_offset >= 4
3296 && (y & (0xffffffff ^ RS1(~0)))
3297 == (INSN_OR | RD(O7) | RS2(G0)))
3298 {
3299 bfd_vma z;
3300 unsigned int reg;
3301
3302 z = bfd_get_32 (input_bfd,
3303 contents + rel->r_offset - 4);
3304 if ((z & (0xffffffff ^ RD(~0)))
3305 != (INSN_OR | RS1(O7) | RS2(G0)))
3306 break;
3307
3308 /* The sequence was
3309 or %o7, %g0, %rN
3310 call foo
3311 or %rN, %g0, %o7
3312
3313 If call foo was replaced with ba, replace
3314 or %rN, %g0, %o7 with nop. */
3315
3316 reg = (y & RS1(~0)) >> 14;
3317 if (reg != ((z & RD(~0)) >> 25)
3318 || reg == G0 || reg == O7)
3319 break;
3320
3321 bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
3322 contents + rel->r_offset + 4);
3323 }
3324
3325 }
3326 }
3327 }
3328 }
3329
3330 if (r == bfd_reloc_continue)
3331 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3332 contents, rel->r_offset,
3333 relocation, rel->r_addend);
3334
3335 if (r != bfd_reloc_ok)
3336 {
3337 switch (r)
3338 {
3339 default:
3340 case bfd_reloc_outofrange:
3341 abort ();
3342 case bfd_reloc_overflow:
3343 {
3344 const char *name;
3345
3346 if (h != NULL)
3347 name = NULL;
3348 else
3349 {
3350 name = bfd_elf_string_from_elf_section (input_bfd,
3351 symtab_hdr->sh_link,
3352 sym->st_name);
3353 if (name == NULL)
3354 return FALSE;
3355 if (*name == '\0')
3356 name = bfd_section_name (input_bfd, sec);
3357 }
3358 if (! ((*info->callbacks->reloc_overflow)
3359 (info, (h ? &h->root : NULL), name, howto->name,
3360 (bfd_vma) 0, input_bfd, input_section,
3361 rel->r_offset)))
3362 return FALSE;
3363 }
3364 break;
3365 }
3366 }
3367 }
3368
3369 return TRUE;
3370 }
3371
3372 /* Finish up dynamic symbol handling. We set the contents of various
3373 dynamic sections here. */
3374
3375 bfd_boolean
3376 _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
3377 struct bfd_link_info *info,
3378 struct elf_link_hash_entry *h,
3379 Elf_Internal_Sym *sym)
3380 {
3381 bfd *dynobj;
3382 struct _bfd_sparc_elf_link_hash_table *htab;
3383
3384 htab = _bfd_sparc_elf_hash_table (info);
3385 dynobj = htab->elf.dynobj;
3386
3387 if (h->plt.offset != (bfd_vma) -1)
3388 {
3389 asection *splt;
3390 asection *srela;
3391 Elf_Internal_Rela rela;
3392 bfd_byte *loc;
3393 bfd_vma r_offset;
3394 int rela_index;
3395
3396 /* This symbol has an entry in the PLT. Set it up. */
3397
3398 BFD_ASSERT (h->dynindx != -1);
3399
3400 splt = htab->splt;
3401 srela = htab->srelplt;
3402 BFD_ASSERT (splt != NULL && srela != NULL);
3403
3404 /* Fill in the entry in the procedure linkage table. */
3405 rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
3406 h->plt.offset, splt->size,
3407 &r_offset);
3408
3409 /* Fill in the entry in the .rela.plt section. */
3410 rela.r_offset = r_offset
3411 + (splt->output_section->vma + splt->output_offset);
3412 if (! ABI_64_P (output_bfd)
3413 || h->plt.offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
3414 {
3415 rela.r_addend = 0;
3416 }
3417 else
3418 {
3419 rela.r_addend = -(h->plt.offset + 4)
3420 -(splt->output_section->vma + splt->output_offset);
3421 }
3422 rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_JMP_SLOT);
3423
3424 /* Adjust for the first 4 reserved elements in the .plt section
3425 when setting the offset in the .rela.plt section.
3426 Sun forgot to read their own ABI and copied elf32-sparc behaviour,
3427 thus .plt[4] has corresponding .rela.plt[0] and so on. */
3428
3429 loc = srela->contents;
3430 #ifdef BFD64
3431 if (ABI_64_P (output_bfd))
3432 {
3433 loc += rela_index * sizeof (Elf64_External_Rela);
3434 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
3435 }
3436 else
3437 #endif
3438 {
3439 loc += rela_index * sizeof (Elf32_External_Rela);
3440 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3441 }
3442
3443 if (!h->def_regular)
3444 {
3445 /* Mark the symbol as undefined, rather than as defined in
3446 the .plt section. Leave the value alone. */
3447 sym->st_shndx = SHN_UNDEF;
3448 /* If the symbol is weak, we do need to clear the value.
3449 Otherwise, the PLT entry would provide a definition for
3450 the symbol even if the symbol wasn't defined anywhere,
3451 and so the symbol would never be NULL. */
3452 if (!h->ref_regular_nonweak)
3453 sym->st_value = 0;
3454 }
3455 }
3456
3457 if (h->got.offset != (bfd_vma) -1
3458 && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
3459 && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
3460 {
3461 asection *sgot;
3462 asection *srela;
3463 Elf_Internal_Rela rela;
3464
3465 /* This symbol has an entry in the GOT. Set it up. */
3466
3467 sgot = htab->sgot;
3468 srela = htab->srelgot;
3469 BFD_ASSERT (sgot != NULL && srela != NULL);
3470
3471 rela.r_offset = (sgot->output_section->vma
3472 + sgot->output_offset
3473 + (h->got.offset &~ (bfd_vma) 1));
3474
3475 /* If this is a -Bsymbolic link, and the symbol is defined
3476 locally, we just want to emit a RELATIVE reloc. Likewise if
3477 the symbol was forced to be local because of a version file.
3478 The entry in the global offset table will already have been
3479 initialized in the relocate_section function. */
3480 if (info->shared
3481 && (info->symbolic || h->dynindx == -1)
3482 && h->def_regular)
3483 {
3484 asection *sec = h->root.u.def.section;
3485 rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
3486 rela.r_addend = (h->root.u.def.value
3487 + sec->output_section->vma
3488 + sec->output_offset);
3489 }
3490 else
3491 {
3492 rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
3493 rela.r_addend = 0;
3494 }
3495
3496 SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3497 sgot->contents + (h->got.offset & ~(bfd_vma) 1));
3498 SPARC_ELF_APPEND_RELA (htab, output_bfd, srela, &rela);
3499 }
3500
3501 if (h->needs_copy)
3502 {
3503 asection *s;
3504 Elf_Internal_Rela rela;
3505
3506 /* This symbols needs a copy reloc. Set it up. */
3507 BFD_ASSERT (h->dynindx != -1);
3508
3509 s = bfd_get_section_by_name (h->root.u.def.section->owner,
3510 ".rela.bss");
3511 BFD_ASSERT (s != NULL);
3512
3513 rela.r_offset = (h->root.u.def.value
3514 + h->root.u.def.section->output_section->vma
3515 + h->root.u.def.section->output_offset);
3516 rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
3517 rela.r_addend = 0;
3518 SPARC_ELF_APPEND_RELA (htab, output_bfd, s, &rela);
3519 }
3520
3521 /* Mark some specially defined symbols as absolute. */
3522 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3523 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3524 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3525 sym->st_shndx = SHN_ABS;
3526
3527 return TRUE;
3528 }
3529
3530 /* Finish up the dynamic sections. */
3531
3532 #ifdef BFD64
3533 static bfd_boolean
3534 sparc64_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
3535 bfd *dynobj, asection *sdyn,
3536 asection *splt ATTRIBUTE_UNUSED)
3537 {
3538 Elf64_External_Dyn *dyncon, *dynconend;
3539 int stt_regidx = -1;
3540
3541 dyncon = (Elf64_External_Dyn *) sdyn->contents;
3542 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
3543 for (; dyncon < dynconend; dyncon++)
3544 {
3545 Elf_Internal_Dyn dyn;
3546 const char *name;
3547 bfd_boolean size;
3548
3549 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3550
3551 switch (dyn.d_tag)
3552 {
3553 case DT_PLTGOT: name = ".plt"; size = FALSE; break;
3554 case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
3555 case DT_JMPREL: name = ".rela.plt"; size = FALSE; break;
3556 case DT_SPARC_REGISTER:
3557 if (stt_regidx == -1)
3558 {
3559 stt_regidx =
3560 _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
3561 if (stt_regidx == -1)
3562 return FALSE;
3563 }
3564 dyn.d_un.d_val = stt_regidx++;
3565 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3566 /* fallthrough */
3567 default: name = NULL; size = FALSE; break;
3568 }
3569
3570 if (name != NULL)
3571 {
3572 asection *s;
3573
3574 s = bfd_get_section_by_name (output_bfd, name);
3575 if (s == NULL)
3576 dyn.d_un.d_val = 0;
3577 else
3578 {
3579 if (! size)
3580 dyn.d_un.d_ptr = s->vma;
3581 else
3582 dyn.d_un.d_val = s->size;
3583 }
3584 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3585 }
3586 }
3587 return TRUE;
3588 }
3589 #endif
3590
3591 static bfd_boolean
3592 sparc32_finish_dyn (bfd *output_bfd,
3593 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3594 bfd *dynobj, asection *sdyn,
3595 asection *splt ATTRIBUTE_UNUSED)
3596 {
3597 Elf32_External_Dyn *dyncon, *dynconend;
3598
3599 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3600 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3601 for (; dyncon < dynconend; dyncon++)
3602 {
3603 Elf_Internal_Dyn dyn;
3604 const char *name;
3605 bfd_boolean size;
3606
3607 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3608
3609 switch (dyn.d_tag)
3610 {
3611 case DT_PLTGOT: name = ".plt"; size = FALSE; break;
3612 case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
3613 case DT_JMPREL: name = ".rela.plt"; size = FALSE; break;
3614 default: name = NULL; size = FALSE; break;
3615 }
3616
3617 if (name != NULL)
3618 {
3619 asection *s;
3620
3621 s = bfd_get_section_by_name (output_bfd, name);
3622 if (s == NULL)
3623 dyn.d_un.d_val = 0;
3624 else
3625 {
3626 if (! size)
3627 dyn.d_un.d_ptr = s->vma;
3628 else
3629 dyn.d_un.d_val = s->size;
3630 }
3631 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3632 }
3633 }
3634 return TRUE;
3635 }
3636
3637 bfd_boolean
3638 _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3639 {
3640 bfd *dynobj;
3641 asection *sdyn;
3642 struct _bfd_sparc_elf_link_hash_table *htab;
3643
3644 htab = _bfd_sparc_elf_hash_table (info);
3645 dynobj = htab->elf.dynobj;
3646
3647 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3648
3649 if (elf_hash_table (info)->dynamic_sections_created)
3650 {
3651 asection *splt;
3652 bfd_boolean ret;
3653
3654 splt = bfd_get_section_by_name (dynobj, ".plt");
3655 BFD_ASSERT (splt != NULL && sdyn != NULL);
3656
3657 #ifdef BFD64
3658 if (ABI_64_P (output_bfd))
3659 ret = sparc64_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
3660 else
3661 #endif
3662 ret = sparc32_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
3663
3664 if (ret != TRUE)
3665 return ret;
3666
3667 /* Initialize the contents of the .plt section. */
3668 if (splt->size > 0)
3669 {
3670 if (ABI_64_P (output_bfd))
3671 memset (splt->contents, 0, 4 * PLT64_ENTRY_SIZE);
3672 else
3673 {
3674 memset (splt->contents, 0, 4 * PLT32_ENTRY_SIZE);
3675 bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
3676 splt->contents + splt->size - 4);
3677 }
3678 }
3679
3680 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3681 (ABI_64_P (output_bfd) ? PLT64_ENTRY_SIZE : PLT32_ENTRY_SIZE);
3682 }
3683
3684 /* Set the first entry in the global offset table to the address of
3685 the dynamic section. */
3686 if (htab->sgot && htab->sgot->size > 0)
3687 {
3688 bfd_vma val = (sdyn ?
3689 sdyn->output_section->vma + sdyn->output_offset :
3690 0);
3691
3692 SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->sgot->contents);
3693 }
3694
3695 if (htab->sgot)
3696 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize =
3697 SPARC_ELF_WORD_BYTES (htab);
3698
3699 return TRUE;
3700 }
3701
3702 \f
3703 /* Set the right machine number for a SPARC ELF file. */
3704
3705 bfd_boolean
3706 _bfd_sparc_elf_object_p (bfd *abfd)
3707 {
3708 if (ABI_64_P (abfd))
3709 {
3710 unsigned long mach = bfd_mach_sparc_v9;
3711
3712 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3713 mach = bfd_mach_sparc_v9b;
3714 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3715 mach = bfd_mach_sparc_v9a;
3716 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
3717 }
3718 else
3719 {
3720 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
3721 {
3722 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3723 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3724 bfd_mach_sparc_v8plusb);
3725 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3726 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3727 bfd_mach_sparc_v8plusa);
3728 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
3729 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3730 bfd_mach_sparc_v8plus);
3731 else
3732 return FALSE;
3733 }
3734 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
3735 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3736 bfd_mach_sparc_sparclite_le);
3737 else
3738 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
3739 }
3740 }
3741
3742 /* Return address for Ith PLT stub in section PLT, for relocation REL
3743 or (bfd_vma) -1 if it should not be included. */
3744
3745 bfd_vma
3746 _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
3747 {
3748 if (ABI_64_P (plt->owner))
3749 {
3750 bfd_vma j;
3751
3752 i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
3753 if (i < PLT64_LARGE_THRESHOLD)
3754 return plt->vma + i * PLT64_ENTRY_SIZE;
3755
3756 j = (i - PLT64_LARGE_THRESHOLD) % 160;
3757 i -= j;
3758 return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
3759 }
3760 else
3761 return rel->address;
3762 }
This page took 0.112153 seconds and 5 git commands to generate.