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