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