* config/i386/nbsd.mt (TDEPFILES): Move solib.o from here...
[deliverable/binutils-gdb.git] / bfd / elf32-sparc.c
CommitLineData
252b5132 1/* SPARC-specific support for 32-bit ELF
37fb6db1
ILT
2 Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000
3 Free Software Foundation, Inc.
252b5132
RH
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "bfdlink.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf/sparc.h"
27
28static reloc_howto_type *elf32_sparc_reloc_type_lookup
29 PARAMS ((bfd *, bfd_reloc_code_real_type));
30static void elf32_sparc_info_to_howto
31 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
32static boolean elf32_sparc_check_relocs
33 PARAMS ((bfd *, struct bfd_link_info *, asection *,
34 const Elf_Internal_Rela *));
35static boolean elf32_sparc_adjust_dynamic_symbol
36 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
252b5132
RH
37static boolean elf32_sparc_size_dynamic_sections
38 PARAMS ((bfd *, struct bfd_link_info *));
39static boolean elf32_sparc_relocate_section
40 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
41 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
42static boolean elf32_sparc_finish_dynamic_symbol
43 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
44 Elf_Internal_Sym *));
45static boolean elf32_sparc_finish_dynamic_sections
46 PARAMS ((bfd *, struct bfd_link_info *));
47static boolean elf32_sparc_merge_private_bfd_data PARAMS ((bfd *, bfd *));
48static boolean elf32_sparc_object_p
49 PARAMS ((bfd *));
50static void elf32_sparc_final_write_processing
51 PARAMS ((bfd *, boolean));
52\f
53/* The relocation "howto" table. */
54
55static bfd_reloc_status_type sparc_elf_notsupported_reloc
56 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
57static bfd_reloc_status_type sparc_elf_wdisp16_reloc
58 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
59
60reloc_howto_type _bfd_sparc_elf_howto_table[] =
61{
62 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
63 HOWTO(R_SPARC_8, 0,0, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", false,0,0x000000ff,true),
64 HOWTO(R_SPARC_16, 0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", false,0,0x0000ffff,true),
65 HOWTO(R_SPARC_32, 0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", false,0,0xffffffff,true),
66 HOWTO(R_SPARC_DISP8, 0,0, 8,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", false,0,0x000000ff,true),
67 HOWTO(R_SPARC_DISP16, 0,1,16,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", false,0,0x0000ffff,true),
68 HOWTO(R_SPARC_DISP32, 0,2,32,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", false,0,0x00ffffff,true),
69 HOWTO(R_SPARC_WDISP30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", false,0,0x3fffffff,true),
70 HOWTO(R_SPARC_WDISP22, 2,2,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", false,0,0x003fffff,true),
71 HOWTO(R_SPARC_HI22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", false,0,0x003fffff,true),
72 HOWTO(R_SPARC_22, 0,2,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", false,0,0x003fffff,true),
73 HOWTO(R_SPARC_13, 0,2,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", false,0,0x00001fff,true),
74 HOWTO(R_SPARC_LO10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", false,0,0x000003ff,true),
75 HOWTO(R_SPARC_GOT10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", false,0,0x000003ff,true),
76 HOWTO(R_SPARC_GOT13, 0,2,13,false,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", false,0,0x00001fff,true),
77 HOWTO(R_SPARC_GOT22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", false,0,0x003fffff,true),
78 HOWTO(R_SPARC_PC10, 0,2,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", false,0,0x000003ff,true),
79 HOWTO(R_SPARC_PC22, 10,2,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", false,0,0x003fffff,true),
80 HOWTO(R_SPARC_WPLT30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", false,0,0x3fffffff,true),
81 HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", false,0,0x00000000,true),
82 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),
83 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),
84 HOWTO(R_SPARC_RELATIVE, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",false,0,0x00000000,true),
85 HOWTO(R_SPARC_UA32, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_UA32", false,0,0x00000000,true),
86 HOWTO(R_SPARC_PLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PLT32", false,0,0x00000000,true),
87 HOWTO(R_SPARC_HIPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HIPLT22", false,0,0x00000000,true),
88 HOWTO(R_SPARC_LOPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LOPLT10", false,0,0x00000000,true),
89 HOWTO(R_SPARC_PCPLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT32", false,0,0x00000000,true),
90 HOWTO(R_SPARC_PCPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT22", false,0,0x00000000,true),
91 HOWTO(R_SPARC_PCPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT10", false,0,0x00000000,true),
92 HOWTO(R_SPARC_10, 0,2,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", false,0,0x000003ff,true),
93 HOWTO(R_SPARC_11, 0,2,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", false,0,0x000007ff,true),
94 /* These are for sparc64 in a 64 bit environment.
95 Values need to be here because the table is indexed by reloc number. */
96 HOWTO(R_SPARC_64, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_64", false,0,0x00000000,true),
97 HOWTO(R_SPARC_OLO10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_OLO10", false,0,0x00000000,true),
98 HOWTO(R_SPARC_HH22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HH22", false,0,0x00000000,true),
99 HOWTO(R_SPARC_HM10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HM10", false,0,0x00000000,true),
100 HOWTO(R_SPARC_LM22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LM22", false,0,0x00000000,true),
101 HOWTO(R_SPARC_PC_HH22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HH22", false,0,0x00000000,true),
102 HOWTO(R_SPARC_PC_HM10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HM10", false,0,0x00000000,true),
103 HOWTO(R_SPARC_PC_LM22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_LM22", false,0,0x00000000,true),
104 /* End sparc64 in 64 bit environment values.
105 The following are for sparc64 in a 32 bit environment. */
106 HOWTO(R_SPARC_WDISP16, 2,2,16,true, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true),
107 HOWTO(R_SPARC_WDISP19, 2,2,19,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", false,0,0x0007ffff,true),
108 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),
109 HOWTO(R_SPARC_7, 0,2, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", false,0,0x0000007f,true),
110 HOWTO(R_SPARC_5, 0,2, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", false,0,0x0000001f,true),
111 HOWTO(R_SPARC_6, 0,2, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", false,0,0x0000003f,true),
112 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
113 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
114 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
115 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
116 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
117 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
118 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
119 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
120 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
121 HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true),
122 HOWTO(R_SPARC_REV32, 0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", false,0,0xffffffff,true),
123};
124static reloc_howto_type elf32_sparc_vtinherit_howto =
125 HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,false,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", false,0, 0, false);
126static reloc_howto_type elf32_sparc_vtentry_howto =
127 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);
128
129
130struct elf_reloc_map {
131 bfd_reloc_code_real_type bfd_reloc_val;
132 unsigned char elf_reloc_val;
133};
134
135static CONST struct elf_reloc_map sparc_reloc_map[] =
136{
137 { BFD_RELOC_NONE, R_SPARC_NONE, },
138 { BFD_RELOC_16, R_SPARC_16, },
139 { BFD_RELOC_8, R_SPARC_8 },
140 { BFD_RELOC_8_PCREL, R_SPARC_DISP8 },
141 { BFD_RELOC_CTOR, R_SPARC_32 },
142 { BFD_RELOC_32, R_SPARC_32 },
143 { BFD_RELOC_32_PCREL, R_SPARC_DISP32 },
144 { BFD_RELOC_HI22, R_SPARC_HI22 },
145 { BFD_RELOC_LO10, R_SPARC_LO10, },
146 { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 },
147 { BFD_RELOC_SPARC22, R_SPARC_22 },
148 { BFD_RELOC_SPARC13, R_SPARC_13 },
149 { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 },
150 { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 },
151 { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 },
152 { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 },
153 { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 },
154 { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 },
155 { BFD_RELOC_SPARC_COPY, R_SPARC_COPY },
156 { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT },
157 { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT },
158 { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE },
159 { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 },
160 /* ??? Doesn't dwarf use this? */
161/*{ BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */
162 {BFD_RELOC_SPARC_10, R_SPARC_10},
163 {BFD_RELOC_SPARC_11, R_SPARC_11},
164 {BFD_RELOC_SPARC_64, R_SPARC_64},
165 {BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10},
166 {BFD_RELOC_SPARC_HH22, R_SPARC_HH22},
167 {BFD_RELOC_SPARC_HM10, R_SPARC_HM10},
168 {BFD_RELOC_SPARC_LM22, R_SPARC_LM22},
169 {BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22},
170 {BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10},
171 {BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22},
172 {BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16},
173 {BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19},
174 {BFD_RELOC_SPARC_7, R_SPARC_7},
175 {BFD_RELOC_SPARC_5, R_SPARC_5},
176 {BFD_RELOC_SPARC_6, R_SPARC_6},
177 {BFD_RELOC_SPARC_REV32, R_SPARC_REV32 },
178 {BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT},
179 {BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY},
180};
181
182static reloc_howto_type *
183elf32_sparc_reloc_type_lookup (abfd, code)
5f771d47 184 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
185 bfd_reloc_code_real_type code;
186{
187 unsigned int i;
188
189 switch (code)
190 {
191 case BFD_RELOC_VTABLE_INHERIT:
192 return &elf32_sparc_vtinherit_howto;
193
194 case BFD_RELOC_VTABLE_ENTRY:
195 return &elf32_sparc_vtentry_howto;
196
197 default:
198 for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
199 {
200 if (sparc_reloc_map[i].bfd_reloc_val == code)
201 return &_bfd_sparc_elf_howto_table[(int) sparc_reloc_map[i].elf_reloc_val];
202 }
203 }
204 bfd_set_error (bfd_error_bad_value);
205 return NULL;
206}
207
208/* We need to use ELF32_R_TYPE so we have our own copy of this function,
209 and elf64-sparc.c has its own copy. */
210
211static void
212elf32_sparc_info_to_howto (abfd, cache_ptr, dst)
5f771d47 213 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
214 arelent *cache_ptr;
215 Elf_Internal_Rela *dst;
216{
60dac299
RH
217 switch (ELF32_R_TYPE(dst->r_info))
218 {
219 case R_SPARC_GNU_VTINHERIT:
220 cache_ptr->howto = &elf32_sparc_vtinherit_howto;
221 break;
222
223 case R_SPARC_GNU_VTENTRY:
224 cache_ptr->howto = &elf32_sparc_vtentry_howto;
225 break;
226
227 default:
228 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_SPARC_max_std);
229 cache_ptr->howto = &_bfd_sparc_elf_howto_table[ELF32_R_TYPE(dst->r_info)];
230 }
252b5132
RH
231}
232\f
233/* For unsupported relocs. */
234
235static bfd_reloc_status_type
236sparc_elf_notsupported_reloc (abfd,
237 reloc_entry,
238 symbol,
239 data,
240 input_section,
241 output_bfd,
242 error_message)
5f771d47
ILT
243 bfd *abfd ATTRIBUTE_UNUSED;
244 arelent *reloc_entry ATTRIBUTE_UNUSED;
245 asymbol *symbol ATTRIBUTE_UNUSED;
246 PTR data ATTRIBUTE_UNUSED;
247 asection *input_section ATTRIBUTE_UNUSED;
248 bfd *output_bfd ATTRIBUTE_UNUSED;
249 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
250{
251 return bfd_reloc_notsupported;
252}
253
254/* Handle the WDISP16 reloc. */
255
256static bfd_reloc_status_type
257sparc_elf_wdisp16_reloc (abfd,
258 reloc_entry,
259 symbol,
260 data,
261 input_section,
262 output_bfd,
263 error_message)
264 bfd *abfd;
265 arelent *reloc_entry;
266 asymbol *symbol;
267 PTR data;
268 asection *input_section;
269 bfd *output_bfd;
5f771d47 270 char **error_message ATTRIBUTE_UNUSED;
252b5132
RH
271{
272 bfd_vma relocation;
273 bfd_vma x;
274
275 if (output_bfd != (bfd *) NULL
276 && (symbol->flags & BSF_SECTION_SYM) == 0
277 && (! reloc_entry->howto->partial_inplace
278 || reloc_entry->addend == 0))
279 {
280 reloc_entry->address += input_section->output_offset;
281 return bfd_reloc_ok;
282 }
283
284 if (output_bfd != NULL)
285 return bfd_reloc_continue;
286
287 if (reloc_entry->address > input_section->_cooked_size)
288 return bfd_reloc_outofrange;
289
290 relocation = (symbol->value
291 + symbol->section->output_section->vma
292 + symbol->section->output_offset);
293 relocation += reloc_entry->addend;
294 relocation -= (input_section->output_section->vma
295 + input_section->output_offset);
296 relocation -= reloc_entry->address;
297
298 x = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
299 x |= ((((relocation >> 2) & 0xc000) << 6)
300 | ((relocation >> 2) & 0x3fff));
301 bfd_put_32 (abfd, x, (bfd_byte *) data + reloc_entry->address);
302
303 if ((bfd_signed_vma) relocation < - 0x40000
304 || (bfd_signed_vma) relocation > 0x3ffff)
305 return bfd_reloc_overflow;
306 else
307 return bfd_reloc_ok;
308}
309\f
310/* Functions for the SPARC ELF linker. */
311
312/* The name of the dynamic interpreter. This is put in the .interp
313 section. */
314
315#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
316
317/* The nop opcode we use. */
318
319#define SPARC_NOP 0x01000000
320
321/* The size in bytes of an entry in the procedure linkage table. */
322
323#define PLT_ENTRY_SIZE 12
324
325/* The first four entries in a procedure linkage table are reserved,
326 and the initial contents are unimportant (we zero them out).
327 Subsequent entries look like this. See the SVR4 ABI SPARC
328 supplement to see how this works. */
329
330/* sethi %hi(.-.plt0),%g1. We fill in the address later. */
331#define PLT_ENTRY_WORD0 0x03000000
332/* b,a .plt0. We fill in the offset later. */
333#define PLT_ENTRY_WORD1 0x30800000
334/* nop. */
335#define PLT_ENTRY_WORD2 SPARC_NOP
336
337/* Look through the relocs for a section during the first phase, and
338 allocate space in the global offset table or procedure linkage
339 table. */
340
341static boolean
342elf32_sparc_check_relocs (abfd, info, sec, relocs)
343 bfd *abfd;
344 struct bfd_link_info *info;
345 asection *sec;
346 const Elf_Internal_Rela *relocs;
347{
348 bfd *dynobj;
349 Elf_Internal_Shdr *symtab_hdr;
350 struct elf_link_hash_entry **sym_hashes;
351 bfd_vma *local_got_offsets;
352 const Elf_Internal_Rela *rel;
353 const Elf_Internal_Rela *rel_end;
354 asection *sgot;
355 asection *srelgot;
356 asection *sreloc;
357
358 if (info->relocateable)
359 return true;
360
361 dynobj = elf_hash_table (info)->dynobj;
362 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
363 sym_hashes = elf_sym_hashes (abfd);
364 local_got_offsets = elf_local_got_offsets (abfd);
365
366 sgot = NULL;
367 srelgot = NULL;
368 sreloc = NULL;
369
370 rel_end = relocs + sec->reloc_count;
371 for (rel = relocs; rel < rel_end; rel++)
372 {
373 unsigned long r_symndx;
374 struct elf_link_hash_entry *h;
375
376 r_symndx = ELF32_R_SYM (rel->r_info);
377 if (r_symndx < symtab_hdr->sh_info)
378 h = NULL;
379 else
380 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
381
382 switch (ELF32_R_TYPE (rel->r_info))
383 {
384 case R_SPARC_GOT10:
385 case R_SPARC_GOT13:
386 case R_SPARC_GOT22:
387 /* This symbol requires a global offset table entry. */
388
389 if (dynobj == NULL)
390 {
391 /* Create the .got section. */
392 elf_hash_table (info)->dynobj = dynobj = abfd;
393 if (! _bfd_elf_create_got_section (dynobj, info))
394 return false;
395 }
396
397 if (sgot == NULL)
398 {
399 sgot = bfd_get_section_by_name (dynobj, ".got");
400 BFD_ASSERT (sgot != NULL);
401 }
402
403 if (srelgot == NULL
404 && (h != NULL || info->shared))
405 {
406 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
407 if (srelgot == NULL)
408 {
409 srelgot = bfd_make_section (dynobj, ".rela.got");
410 if (srelgot == NULL
411 || ! bfd_set_section_flags (dynobj, srelgot,
412 (SEC_ALLOC
413 | SEC_LOAD
414 | SEC_HAS_CONTENTS
415 | SEC_IN_MEMORY
416 | SEC_LINKER_CREATED
417 | SEC_READONLY))
418 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
419 return false;
420 }
421 }
422
423 if (h != NULL)
424 {
425 if (h->got.offset != (bfd_vma) -1)
426 {
427 /* We have already allocated space in the .got. */
428 break;
429 }
430 h->got.offset = sgot->_raw_size;
431
432 /* Make sure this symbol is output as a dynamic symbol. */
433 if (h->dynindx == -1)
434 {
435 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
436 return false;
437 }
438
439 srelgot->_raw_size += sizeof (Elf32_External_Rela);
440 }
441 else
442 {
443 /* This is a global offset table entry for a local
444 symbol. */
445 if (local_got_offsets == NULL)
446 {
447 size_t size;
448 register unsigned int i;
449
450 size = symtab_hdr->sh_info * sizeof (bfd_vma);
451 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
452 if (local_got_offsets == NULL)
453 return false;
454 elf_local_got_offsets (abfd) = local_got_offsets;
455 for (i = 0; i < symtab_hdr->sh_info; i++)
456 local_got_offsets[i] = (bfd_vma) -1;
457 }
458 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
459 {
460 /* We have already allocated space in the .got. */
461 break;
462 }
463 local_got_offsets[r_symndx] = sgot->_raw_size;
464
465 if (info->shared)
466 {
467 /* If we are generating a shared object, we need to
468 output a R_SPARC_RELATIVE reloc so that the
469 dynamic linker can adjust this GOT entry. */
470 srelgot->_raw_size += sizeof (Elf32_External_Rela);
471 }
472 }
473
474 sgot->_raw_size += 4;
475
476 /* If the .got section is more than 0x1000 bytes, we add
477 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
478 bit relocations have a greater chance of working. */
479 if (sgot->_raw_size >= 0x1000
480 && elf_hash_table (info)->hgot->root.u.def.value == 0)
481 elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
482
483 break;
484
485 case R_SPARC_WPLT30:
486 /* This symbol requires a procedure linkage table entry. We
487 actually build the entry in adjust_dynamic_symbol,
488 because this might be a case of linking PIC code without
489 linking in any dynamic objects, in which case we don't
490 need to generate a procedure linkage table after all. */
491
492 if (h == NULL)
493 {
494 /* The Solaris native assembler will generate a WPLT30
495 reloc for a local symbol if you assemble a call from
496 one section to another when using -K pic. We treat
497 it as WDISP30. */
498 break;
499 }
500
501 /* Make sure this symbol is output as a dynamic symbol. */
502 if (h->dynindx == -1)
503 {
504 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
505 return false;
506 }
507
508 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
509
510 break;
511
512 case R_SPARC_PC10:
513 case R_SPARC_PC22:
7843f00e
ILT
514 if (h != NULL)
515 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
516
252b5132
RH
517 if (h != NULL
518 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
519 break;
520 /* Fall through. */
521 case R_SPARC_DISP8:
522 case R_SPARC_DISP16:
523 case R_SPARC_DISP32:
524 case R_SPARC_WDISP30:
525 case R_SPARC_WDISP22:
526 case R_SPARC_WDISP19:
527 case R_SPARC_WDISP16:
7843f00e
ILT
528 if (h != NULL)
529 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
530
252b5132
RH
531 /* If we are linking with -Bsymbolic, we do not need to copy
532 a PC relative reloc against a global symbol which is
533 defined in an object we are including in the link (i.e.,
534 DEF_REGULAR is set). FIXME: At this point we have not
535 seen all the input files, so it is possible that
536 DEF_REGULAR is not set now but will be set later (it is
537 never cleared). This needs to be handled as in
538 elf32-i386.c. */
539 if (h == NULL
540 || (info->symbolic
541 && (h->elf_link_hash_flags
542 & ELF_LINK_HASH_DEF_REGULAR) != 0))
543 break;
544 /* Fall through. */
545 case R_SPARC_8:
546 case R_SPARC_16:
547 case R_SPARC_32:
548 case R_SPARC_HI22:
549 case R_SPARC_22:
550 case R_SPARC_13:
551 case R_SPARC_LO10:
552 case R_SPARC_UA32:
7843f00e
ILT
553 if (h != NULL)
554 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
555
252b5132
RH
556 if (info->shared)
557 {
558 /* When creating a shared object, we must copy these
559 relocs into the output file. We create a reloc
560 section in dynobj and make room for the reloc. */
561 if (sreloc == NULL)
562 {
563 const char *name;
564
565 name = (bfd_elf_string_from_elf_section
566 (abfd,
567 elf_elfheader (abfd)->e_shstrndx,
568 elf_section_data (sec)->rel_hdr.sh_name));
569 if (name == NULL)
570 return false;
571
572 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
573 && strcmp (bfd_get_section_name (abfd, sec),
574 name + 5) == 0);
575
576 sreloc = bfd_get_section_by_name (dynobj, name);
577 if (sreloc == NULL)
578 {
579 flagword flags;
580
581 sreloc = bfd_make_section (dynobj, name);
582 flags = (SEC_HAS_CONTENTS | SEC_READONLY
583 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
584 if ((sec->flags & SEC_ALLOC) != 0)
585 flags |= SEC_ALLOC | SEC_LOAD;
586 if (sreloc == NULL
587 || ! bfd_set_section_flags (dynobj, sreloc, flags)
588 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
589 return false;
590 }
591 }
592
593 sreloc->_raw_size += sizeof (Elf32_External_Rela);
594 }
595
596 break;
597
598 case R_SPARC_GNU_VTINHERIT:
599 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
600 return false;
601 break;
602
603 case R_SPARC_GNU_VTENTRY:
604 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
605 return false;
606 break;
607
608 default:
609 break;
610 }
611 }
612
613 return true;
614}
615
616static asection *
617elf32_sparc_gc_mark_hook (abfd, info, rel, h, sym)
618 bfd *abfd;
5f771d47 619 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
620 Elf_Internal_Rela *rel;
621 struct elf_link_hash_entry *h;
622 Elf_Internal_Sym *sym;
623{
624
625 if (h != NULL)
626 {
627 switch (ELF32_R_TYPE (rel->r_info))
628 {
629 case R_SPARC_GNU_VTINHERIT:
630 case R_SPARC_GNU_VTENTRY:
631 break;
632
633 default:
634 switch (h->root.type)
635 {
636 case bfd_link_hash_defined:
637 case bfd_link_hash_defweak:
638 return h->root.u.def.section;
639
640 case bfd_link_hash_common:
641 return h->root.u.c.p->section;
e049a0de
ILT
642
643 default:
644 break;
252b5132
RH
645 }
646 }
647 }
648 else
649 {
650 if (!(elf_bad_symtab (abfd)
651 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
652 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
653 && sym->st_shndx != SHN_COMMON))
654 {
655 return bfd_section_from_elf_index (abfd, sym->st_shndx);
656 }
657 }
658
659 return NULL;
660}
661
662/* Update the got entry reference counts for the section being removed. */
663static boolean
664elf32_sparc_gc_sweep_hook (abfd, info, sec, relocs)
665 bfd *abfd;
5f771d47 666 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
667 asection *sec;
668 const Elf_Internal_Rela *relocs;
669{
670
671 Elf_Internal_Shdr *symtab_hdr;
672 struct elf_link_hash_entry **sym_hashes;
673 bfd_signed_vma *local_got_refcounts;
674 const Elf_Internal_Rela *rel, *relend;
675 unsigned long r_symndx;
676 struct elf_link_hash_entry *h;
677
678 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
679 sym_hashes = elf_sym_hashes (abfd);
680 local_got_refcounts = elf_local_got_refcounts (abfd);
681
682 relend = relocs + sec->reloc_count;
683 for (rel = relocs; rel < relend; rel++)
684 switch (ELF32_R_TYPE (rel->r_info))
685 {
686 case R_SPARC_GOT10:
687 case R_SPARC_GOT13:
688 case R_SPARC_GOT22:
689 r_symndx = ELF32_R_SYM (rel->r_info);
690 if (r_symndx >= symtab_hdr->sh_info)
691 {
692 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
693 if (h->got.refcount > 0)
694 h->got.refcount--;
695 }
696 else
697 {
698 if (local_got_refcounts[r_symndx] > 0)
699 local_got_refcounts[r_symndx]--;
700 }
701 break;
702
703 case R_SPARC_PLT32:
704 case R_SPARC_HIPLT22:
705 case R_SPARC_LOPLT10:
706 case R_SPARC_PCPLT32:
707 case R_SPARC_PCPLT10:
708 r_symndx = ELF32_R_SYM (rel->r_info);
709 if (r_symndx >= symtab_hdr->sh_info)
710 {
711 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
712 if (h->plt.refcount > 0)
713 h->plt.refcount--;
714 }
715 break;
716
717 default:
718 break;
719 }
720
721 return true;
722}
723
724/* Adjust a symbol defined by a dynamic object and referenced by a
725 regular object. The current definition is in some section of the
726 dynamic object, but we're not including those sections. We have to
727 change the definition to something the rest of the link can
728 understand. */
729
730static boolean
731elf32_sparc_adjust_dynamic_symbol (info, h)
732 struct bfd_link_info *info;
733 struct elf_link_hash_entry *h;
734{
735 bfd *dynobj;
736 asection *s;
737 unsigned int power_of_two;
738
739 dynobj = elf_hash_table (info)->dynobj;
740
741 /* Make sure we know what is going on here. */
742 BFD_ASSERT (dynobj != NULL
743 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
744 || h->weakdef != NULL
745 || ((h->elf_link_hash_flags
746 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
747 && (h->elf_link_hash_flags
748 & ELF_LINK_HASH_REF_REGULAR) != 0
749 && (h->elf_link_hash_flags
750 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
751
752 /* If this is a function, put it in the procedure linkage table. We
753 will fill in the contents of the procedure linkage table later
754 (although we could actually do it here). The STT_NOTYPE
755 condition is a hack specifically for the Oracle libraries
756 delivered for Solaris; for some inexplicable reason, they define
757 some of their functions as STT_NOTYPE when they really should be
758 STT_FUNC. */
759 if (h->type == STT_FUNC
760 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
761 || (h->type == STT_NOTYPE
762 && (h->root.type == bfd_link_hash_defined
763 || h->root.type == bfd_link_hash_defweak)
764 && (h->root.u.def.section->flags & SEC_CODE) != 0))
765 {
766 if (! elf_hash_table (info)->dynamic_sections_created
767 || ((!info->shared || info->symbolic || h->dynindx == -1)
768 && (h->elf_link_hash_flags
769 & ELF_LINK_HASH_DEF_REGULAR) != 0))
770 {
771 /* This case can occur if we saw a WPLT30 reloc in an input
772 file, but none of the input files were dynamic objects.
773 Or, when linking the main application or a -Bsymbolic
774 shared library against PIC code. Or when a global symbol
775 has been made private, e.g. via versioning.
776
777 In these cases we know what value the symbol will resolve
778 to, so we don't actually need to build a procedure linkage
779 table, and we can just do a WDISP30 reloc instead. */
780
781 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
782 return true;
783 }
784
785 s = bfd_get_section_by_name (dynobj, ".plt");
786 BFD_ASSERT (s != NULL);
787
788 /* The first four entries in .plt are reserved. */
789 if (s->_raw_size == 0)
790 s->_raw_size = 4 * PLT_ENTRY_SIZE;
791
792 /* The procedure linkage table has a maximum size. */
793 if (s->_raw_size >= 0x400000)
794 {
795 bfd_set_error (bfd_error_bad_value);
796 return false;
797 }
798
799 /* If this symbol is not defined in a regular file, and we are
800 not generating a shared library, then set the symbol to this
801 location in the .plt. This is required to make function
802 pointers compare as equal between the normal executable and
803 the shared library. */
804 if (! info->shared
805 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
806 {
807 h->root.u.def.section = s;
808 h->root.u.def.value = s->_raw_size;
809 }
810
811 h->plt.offset = s->_raw_size;
812
813 /* Make room for this entry. */
814 s->_raw_size += PLT_ENTRY_SIZE;
815
816 /* We also need to make an entry in the .rela.plt section. */
817
818 s = bfd_get_section_by_name (dynobj, ".rela.plt");
819 BFD_ASSERT (s != NULL);
820 s->_raw_size += sizeof (Elf32_External_Rela);
821
822 return true;
823 }
824
825 /* If this is a weak symbol, and there is a real definition, the
826 processor independent code will have arranged for us to see the
827 real definition first, and we can just use the same value. */
828 if (h->weakdef != NULL)
829 {
830 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
831 || h->weakdef->root.type == bfd_link_hash_defweak);
832 h->root.u.def.section = h->weakdef->root.u.def.section;
833 h->root.u.def.value = h->weakdef->root.u.def.value;
834 return true;
835 }
836
837 /* This is a reference to a symbol defined by a dynamic object which
838 is not a function. */
839
840 /* If we are creating a shared library, we must presume that the
841 only references to the symbol are via the global offset table.
842 For such cases we need not do anything here; the relocations will
843 be handled correctly by relocate_section. */
844 if (info->shared)
845 return true;
846
7843f00e
ILT
847 /* If there are no references to this symbol that do not use the
848 GOT, we don't need to generate a copy reloc. */
849 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
850 return true;
851
252b5132
RH
852 /* We must allocate the symbol in our .dynbss section, which will
853 become part of the .bss section of the executable. There will be
854 an entry for this symbol in the .dynsym section. The dynamic
855 object will contain position independent code, so all references
856 from the dynamic object to this symbol will go through the global
857 offset table. The dynamic linker will use the .dynsym entry to
858 determine the address it must put in the global offset table, so
859 both the dynamic object and the regular object will refer to the
860 same memory location for the variable. */
861
862 s = bfd_get_section_by_name (dynobj, ".dynbss");
863 BFD_ASSERT (s != NULL);
864
865 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
866 to copy the initial value out of the dynamic object and into the
867 runtime process image. We need to remember the offset into the
868 .rel.bss section we are going to use. */
869 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
870 {
871 asection *srel;
872
873 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
874 BFD_ASSERT (srel != NULL);
875 srel->_raw_size += sizeof (Elf32_External_Rela);
876 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
877 }
878
879 /* We need to figure out the alignment required for this symbol. I
880 have no idea how ELF linkers handle this. */
881 power_of_two = bfd_log2 (h->size);
882 if (power_of_two > 3)
883 power_of_two = 3;
884
885 /* Apply the required alignment. */
886 s->_raw_size = BFD_ALIGN (s->_raw_size,
887 (bfd_size_type) (1 << power_of_two));
888 if (power_of_two > bfd_get_section_alignment (dynobj, s))
889 {
890 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
891 return false;
892 }
893
894 /* Define the symbol as being at this point in the section. */
895 h->root.u.def.section = s;
896 h->root.u.def.value = s->_raw_size;
897
898 /* Increment the section size to make room for the symbol. */
899 s->_raw_size += h->size;
900
901 return true;
902}
903
904/* Set the sizes of the dynamic sections. */
905
906static boolean
907elf32_sparc_size_dynamic_sections (output_bfd, info)
908 bfd *output_bfd;
909 struct bfd_link_info *info;
910{
911 bfd *dynobj;
912 asection *s;
913 boolean reltext;
914 boolean relplt;
915
916 dynobj = elf_hash_table (info)->dynobj;
917 BFD_ASSERT (dynobj != NULL);
918
919 if (elf_hash_table (info)->dynamic_sections_created)
920 {
921 /* Set the contents of the .interp section to the interpreter. */
922 if (! info->shared)
923 {
924 s = bfd_get_section_by_name (dynobj, ".interp");
925 BFD_ASSERT (s != NULL);
926 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
927 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
928 }
929
930 /* Make space for the trailing nop in .plt. */
931 s = bfd_get_section_by_name (dynobj, ".plt");
932 BFD_ASSERT (s != NULL);
933 if (s->_raw_size > 0)
934 s->_raw_size += 4;
935 }
936 else
937 {
938 /* We may have created entries in the .rela.got section.
939 However, if we are not creating the dynamic sections, we will
940 not actually use these entries. Reset the size of .rela.got,
941 which will cause it to get stripped from the output file
942 below. */
943 s = bfd_get_section_by_name (dynobj, ".rela.got");
944 if (s != NULL)
945 s->_raw_size = 0;
946 }
947
948 /* The check_relocs and adjust_dynamic_symbol entry points have
949 determined the sizes of the various dynamic sections. Allocate
950 memory for them. */
951 reltext = false;
952 relplt = false;
953 for (s = dynobj->sections; s != NULL; s = s->next)
954 {
955 const char *name;
956 boolean strip;
957
958 if ((s->flags & SEC_LINKER_CREATED) == 0)
959 continue;
960
961 /* It's OK to base decisions on the section name, because none
962 of the dynobj section names depend upon the input files. */
963 name = bfd_get_section_name (dynobj, s);
964
965 strip = false;
966
967 if (strncmp (name, ".rela", 5) == 0)
968 {
969 if (s->_raw_size == 0)
970 {
971 /* If we don't need this section, strip it from the
972 output file. This is to handle .rela.bss and
973 .rel.plt. We must create it in
974 create_dynamic_sections, because it must be created
975 before the linker maps input sections to output
976 sections. The linker does that before
977 adjust_dynamic_symbol is called, and it is that
978 function which decides whether anything needs to go
979 into these sections. */
980 strip = true;
981 }
982 else
983 {
984 const char *outname;
985 asection *target;
986
987 /* If this relocation section applies to a read only
988 section, then we probably need a DT_TEXTREL entry. */
989 outname = bfd_get_section_name (output_bfd,
990 s->output_section);
991 target = bfd_get_section_by_name (output_bfd, outname + 5);
992 if (target != NULL
993 && (target->flags & SEC_READONLY) != 0
994 && (target->flags & SEC_ALLOC) != 0)
995 reltext = true;
996
997 if (strcmp (name, ".rela.plt") == 0)
998 relplt = true;
999
1000 /* We use the reloc_count field as a counter if we need
1001 to copy relocs into the output file. */
1002 s->reloc_count = 0;
1003 }
1004 }
1005 else if (strcmp (name, ".plt") != 0
1006 && strcmp (name, ".got") != 0)
1007 {
1008 /* It's not one of our sections, so don't allocate space. */
1009 continue;
1010 }
1011
1012 if (strip)
1013 {
7f8d5fc9 1014 _bfd_strip_section_from_output (info, s);
252b5132
RH
1015 continue;
1016 }
1017
1018 /* Allocate memory for the section contents. */
1019 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1020 if (s->contents == NULL && s->_raw_size != 0)
1021 return false;
1022 }
1023
1024 if (elf_hash_table (info)->dynamic_sections_created)
1025 {
1026 /* Add some entries to the .dynamic section. We fill in the
1027 values later, in elf32_sparc_finish_dynamic_sections, but we
1028 must add the entries now so that we get the correct size for
1029 the .dynamic section. The DT_DEBUG entry is filled in by the
1030 dynamic linker and used by the debugger. */
1031 if (! info->shared)
1032 {
1033 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
1034 return false;
1035 }
1036
1037 if (relplt)
1038 {
1039 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
1040 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1041 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1042 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
1043 return false;
1044 }
1045
1046 if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
1047 || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
1048 || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
1049 sizeof (Elf32_External_Rela)))
1050 return false;
1051
1052 if (reltext)
1053 {
1054 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
1055 return false;
1056 }
1057 }
1058
252b5132
RH
1059 return true;
1060}
1061
1062/* Relocate a SPARC ELF section. */
1063
1064static boolean
1065elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
1066 contents, relocs, local_syms, local_sections)
1067 bfd *output_bfd;
1068 struct bfd_link_info *info;
1069 bfd *input_bfd;
1070 asection *input_section;
1071 bfd_byte *contents;
1072 Elf_Internal_Rela *relocs;
1073 Elf_Internal_Sym *local_syms;
1074 asection **local_sections;
1075{
1076 bfd *dynobj;
1077 Elf_Internal_Shdr *symtab_hdr;
1078 struct elf_link_hash_entry **sym_hashes;
1079 bfd_vma *local_got_offsets;
1080 bfd_vma got_base;
1081 asection *sgot;
1082 asection *splt;
1083 asection *sreloc;
1084 Elf_Internal_Rela *rel;
1085 Elf_Internal_Rela *relend;
1086
1087 dynobj = elf_hash_table (info)->dynobj;
1088 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1089 sym_hashes = elf_sym_hashes (input_bfd);
1090 local_got_offsets = elf_local_got_offsets (input_bfd);
1091
1092 if (elf_hash_table (info)->hgot == NULL)
1093 got_base = 0;
1094 else
1095 got_base = elf_hash_table (info)->hgot->root.u.def.value;
1096
1097 sgot = NULL;
1098 splt = NULL;
1099 sreloc = NULL;
1100
1101 rel = relocs;
1102 relend = relocs + input_section->reloc_count;
1103 for (; rel < relend; rel++)
1104 {
1105 int r_type;
1106 reloc_howto_type *howto;
1107 unsigned long r_symndx;
1108 struct elf_link_hash_entry *h;
1109 Elf_Internal_Sym *sym;
1110 asection *sec;
1111 bfd_vma relocation;
1112 bfd_reloc_status_type r;
1113
1114 r_type = ELF32_R_TYPE (rel->r_info);
1115
1116 if (r_type == R_SPARC_GNU_VTINHERIT
1117 || r_type == R_SPARC_GNU_VTENTRY)
1118 continue;
1119
60dac299 1120 if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
252b5132
RH
1121 {
1122 bfd_set_error (bfd_error_bad_value);
1123 return false;
1124 }
1125 howto = _bfd_sparc_elf_howto_table + r_type;
1126
1127 r_symndx = ELF32_R_SYM (rel->r_info);
1128
1129 if (info->relocateable)
1130 {
1131 /* This is a relocateable link. We don't have to change
1132 anything, unless the reloc is against a section symbol,
1133 in which case we have to adjust according to where the
1134 section symbol winds up in the output section. */
1135 if (r_symndx < symtab_hdr->sh_info)
1136 {
1137 sym = local_syms + r_symndx;
1138 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1139 {
1140 sec = local_sections[r_symndx];
1141 rel->r_addend += sec->output_offset + sym->st_value;
1142 }
1143 }
1144
1145 continue;
1146 }
1147
1148 /* This is a final link. */
1149 h = NULL;
1150 sym = NULL;
1151 sec = NULL;
1152 if (r_symndx < symtab_hdr->sh_info)
1153 {
1154 sym = local_syms + r_symndx;
1155 sec = local_sections[r_symndx];
1156 relocation = (sec->output_section->vma
1157 + sec->output_offset
1158 + sym->st_value);
1159 }
1160 else
1161 {
1162 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1163 while (h->root.type == bfd_link_hash_indirect
1164 || h->root.type == bfd_link_hash_warning)
1165 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1166 if (h->root.type == bfd_link_hash_defined
1167 || h->root.type == bfd_link_hash_defweak)
1168 {
1169 sec = h->root.u.def.section;
1170 if ((r_type == R_SPARC_WPLT30
1171 && h->plt.offset != (bfd_vma) -1)
1172 || ((r_type == R_SPARC_GOT10
1173 || r_type == R_SPARC_GOT13
1174 || r_type == R_SPARC_GOT22)
1175 && elf_hash_table (info)->dynamic_sections_created
1176 && (! info->shared
1177 || (! info->symbolic && h->dynindx != -1)
1178 || (h->elf_link_hash_flags
1179 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1180 || (info->shared
1181 && ((! info->symbolic && h->dynindx != -1)
1182 || (h->elf_link_hash_flags
1183 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1184 && (r_type == R_SPARC_8
1185 || r_type == R_SPARC_16
1186 || r_type == R_SPARC_32
1187 || r_type == R_SPARC_DISP8
1188 || r_type == R_SPARC_DISP16
1189 || r_type == R_SPARC_DISP32
1190 || r_type == R_SPARC_WDISP30
1191 || r_type == R_SPARC_WDISP22
1192 || r_type == R_SPARC_WDISP19
1193 || r_type == R_SPARC_WDISP16
1194 || r_type == R_SPARC_HI22
1195 || r_type == R_SPARC_22
1196 || r_type == R_SPARC_13
1197 || r_type == R_SPARC_LO10
1198 || r_type == R_SPARC_UA32
1199 || ((r_type == R_SPARC_PC10
1200 || r_type == R_SPARC_PC22)
1201 && strcmp (h->root.root.string,
1202 "_GLOBAL_OFFSET_TABLE_") != 0))))
1203 {
1204 /* In these cases, we don't need the relocation
1205 value. We check specially because in some
1206 obscure cases sec->output_section will be NULL. */
1207 relocation = 0;
1208 }
1209 else
1210 relocation = (h->root.u.def.value
1211 + sec->output_section->vma
1212 + sec->output_offset);
1213 }
1214 else if (h->root.type == bfd_link_hash_undefweak)
1215 relocation = 0;
3a27a730
L
1216 else if (info->shared && !info->symbolic
1217 && !info->no_undefined
1218 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
252b5132
RH
1219 relocation = 0;
1220 else
1221 {
1222 if (! ((*info->callbacks->undefined_symbol)
1223 (info, h->root.root.string, input_bfd,
5cc7c785 1224 input_section, rel->r_offset,
3a27a730
L
1225 (!info->shared || info->no_undefined
1226 || ELF_ST_VISIBILITY (h->other)))))
252b5132
RH
1227 return false;
1228 relocation = 0;
1229 }
1230 }
1231
1232 switch (r_type)
1233 {
1234 case R_SPARC_GOT10:
1235 case R_SPARC_GOT13:
1236 case R_SPARC_GOT22:
1237 /* Relocation is to the entry for this symbol in the global
1238 offset table. */
1239 if (sgot == NULL)
1240 {
1241 sgot = bfd_get_section_by_name (dynobj, ".got");
1242 BFD_ASSERT (sgot != NULL);
1243 }
1244
1245 if (h != NULL)
1246 {
1247 bfd_vma off;
1248
1249 off = h->got.offset;
1250 BFD_ASSERT (off != (bfd_vma) -1);
1251
1252 if (! elf_hash_table (info)->dynamic_sections_created
1253 || (info->shared
1254 && (info->symbolic || h->dynindx == -1)
1255 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1256 {
1257 /* This is actually a static link, or it is a
1258 -Bsymbolic link and the symbol is defined
1259 locally, or the symbol was forced to be local
1260 because of a version file. We must initialize
1261 this entry in the global offset table. Since the
1262 offset must always be a multiple of 4, we use the
1263 least significant bit to record whether we have
1264 initialized it already.
1265
1266 When doing a dynamic link, we create a .rela.got
1267 relocation entry to initialize the value. This
1268 is done in the finish_dynamic_symbol routine. */
1269 if ((off & 1) != 0)
1270 off &= ~1;
1271 else
1272 {
1273 bfd_put_32 (output_bfd, relocation,
1274 sgot->contents + off);
1275 h->got.offset |= 1;
1276 }
1277 }
1278
1279 relocation = sgot->output_offset + off - got_base;
1280 }
1281 else
1282 {
1283 bfd_vma off;
1284
1285 BFD_ASSERT (local_got_offsets != NULL
1286 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1287
1288 off = local_got_offsets[r_symndx];
1289
1290 /* The offset must always be a multiple of 4. We use
1291 the least significant bit to record whether we have
1292 already processed this entry. */
1293 if ((off & 1) != 0)
1294 off &= ~1;
1295 else
1296 {
1297 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1298
1299 if (info->shared)
1300 {
1301 asection *srelgot;
1302 Elf_Internal_Rela outrel;
1303
1304 /* We need to generate a R_SPARC_RELATIVE reloc
1305 for the dynamic linker. */
1306 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1307 BFD_ASSERT (srelgot != NULL);
1308
1309 outrel.r_offset = (sgot->output_section->vma
1310 + sgot->output_offset
1311 + off);
1312 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1313 outrel.r_addend = 0;
1314 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1315 (((Elf32_External_Rela *)
1316 srelgot->contents)
1317 + srelgot->reloc_count));
1318 ++srelgot->reloc_count;
1319 }
1320
1321 local_got_offsets[r_symndx] |= 1;
1322 }
1323
1324 relocation = sgot->output_offset + off - got_base;
1325 }
1326
1327 break;
1328
1329 case R_SPARC_WPLT30:
1330 /* Relocation is to the entry for this symbol in the
1331 procedure linkage table. */
1332
1333 /* The Solaris native assembler will generate a WPLT30 reloc
1334 for a local symbol if you assemble a call from one
1335 section to another when using -K pic. We treat it as
1336 WDISP30. */
1337 if (h == NULL)
1338 break;
1339
1340 if (h->plt.offset == (bfd_vma) -1)
1341 {
1342 /* We didn't make a PLT entry for this symbol. This
1343 happens when statically linking PIC code, or when
1344 using -Bsymbolic. */
1345 break;
1346 }
1347
1348 if (splt == NULL)
1349 {
1350 splt = bfd_get_section_by_name (dynobj, ".plt");
1351 BFD_ASSERT (splt != NULL);
1352 }
1353
1354 relocation = (splt->output_section->vma
1355 + splt->output_offset
1356 + h->plt.offset);
1357 break;
1358
1359 case R_SPARC_PC10:
1360 case R_SPARC_PC22:
1361 if (h != NULL
1362 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1363 break;
1364 /* Fall through. */
1365 case R_SPARC_DISP8:
1366 case R_SPARC_DISP16:
1367 case R_SPARC_DISP32:
1368 case R_SPARC_WDISP30:
1369 case R_SPARC_WDISP22:
1370 case R_SPARC_WDISP19:
1371 case R_SPARC_WDISP16:
1372 if (h == NULL
1373 || (info->symbolic
1374 && (h->elf_link_hash_flags
1375 & ELF_LINK_HASH_DEF_REGULAR) != 0))
1376 break;
1377 /* Fall through. */
1378 case R_SPARC_8:
1379 case R_SPARC_16:
1380 case R_SPARC_32:
1381 case R_SPARC_HI22:
1382 case R_SPARC_22:
1383 case R_SPARC_13:
1384 case R_SPARC_LO10:
1385 case R_SPARC_UA32:
1386 if (info->shared)
1387 {
1388 Elf_Internal_Rela outrel;
1389 boolean skip;
1390
1391 /* When generating a shared object, these relocations
1392 are copied into the output file to be resolved at run
1393 time. */
1394
1395 if (sreloc == NULL)
1396 {
1397 const char *name;
1398
1399 name = (bfd_elf_string_from_elf_section
1400 (input_bfd,
1401 elf_elfheader (input_bfd)->e_shstrndx,
1402 elf_section_data (input_section)->rel_hdr.sh_name));
1403 if (name == NULL)
1404 return false;
1405
1406 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1407 && strcmp (bfd_get_section_name (input_bfd,
1408 input_section),
1409 name + 5) == 0);
1410
1411 sreloc = bfd_get_section_by_name (dynobj, name);
1412 BFD_ASSERT (sreloc != NULL);
1413 }
1414
1415 skip = false;
1416
1417 if (elf_section_data (input_section)->stab_info == NULL)
1418 outrel.r_offset = rel->r_offset;
1419 else
1420 {
1421 bfd_vma off;
1422
1423 off = (_bfd_stab_section_offset
1424 (output_bfd, &elf_hash_table (info)->stab_info,
1425 input_section,
1426 &elf_section_data (input_section)->stab_info,
1427 rel->r_offset));
1428 if (off == (bfd_vma) -1)
1429 skip = true;
1430 outrel.r_offset = off;
1431 }
1432
1433 outrel.r_offset += (input_section->output_section->vma
1434 + input_section->output_offset);
1435
1436 if (skip)
1437 memset (&outrel, 0, sizeof outrel);
1438 /* h->dynindx may be -1 if the symbol was marked to
1439 become local. */
1440 else if (h != NULL
1441 && ((! info->symbolic && h->dynindx != -1)
1442 || (h->elf_link_hash_flags
1443 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1444 {
1445 BFD_ASSERT (h->dynindx != -1);
1446 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1447 outrel.r_addend = rel->r_addend;
1448 }
1449 else
1450 {
1451 if (r_type == R_SPARC_32)
1452 {
1453 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1454 outrel.r_addend = relocation + rel->r_addend;
1455 }
1456 else
1457 {
1458 long indx;
1459
1460 if (h == NULL)
1461 sec = local_sections[r_symndx];
1462 else
1463 {
1464 BFD_ASSERT (h->root.type == bfd_link_hash_defined
1465 || (h->root.type
1466 == bfd_link_hash_defweak));
1467 sec = h->root.u.def.section;
1468 }
1469 if (sec != NULL && bfd_is_abs_section (sec))
1470 indx = 0;
1471 else if (sec == NULL || sec->owner == NULL)
1472 {
1473 bfd_set_error (bfd_error_bad_value);
1474 return false;
1475 }
1476 else
1477 {
1478 asection *osec;
1479
1480 osec = sec->output_section;
1481 indx = elf_section_data (osec)->dynindx;
1482
1483 /* FIXME: we really should be able to link non-pic
1484 shared libraries. */
1485 if (indx == 0)
1486 {
1487 BFD_FAIL ();
1488 (*_bfd_error_handler)
1489 (_("%s: probably compiled without -fPIC?"),
1490 bfd_get_filename (input_bfd));
1491 bfd_set_error (bfd_error_bad_value);
1492 return false;
1493 }
1494 }
1495
1496 outrel.r_info = ELF32_R_INFO (indx, r_type);
840a9995 1497 outrel.r_addend = relocation + rel->r_addend;
252b5132
RH
1498 }
1499 }
1500
1501 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1502 (((Elf32_External_Rela *)
1503 sreloc->contents)
1504 + sreloc->reloc_count));
1505 ++sreloc->reloc_count;
1506
1507 /* This reloc will be computed at runtime, so there's no
1508 need to do anything now, unless this is a RELATIVE
1509 reloc in an unallocated section. */
1510 if (skip
1511 || (input_section->flags & SEC_ALLOC) != 0
1512 || ELF32_R_TYPE (outrel.r_info) != R_SPARC_RELATIVE)
1513 continue;
1514 }
1515 break;
1516
1517 default:
1518 break;
1519 }
1520
1521 if (r_type == R_SPARC_WDISP16)
1522 {
1523 bfd_vma x;
1524
1525 relocation += rel->r_addend;
1526 relocation -= (input_section->output_section->vma
1527 + input_section->output_offset);
1528 relocation -= rel->r_offset;
1529
1530 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
1531 x |= ((((relocation >> 2) & 0xc000) << 6)
1532 | ((relocation >> 2) & 0x3fff));
1533 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
1534
1535 if ((bfd_signed_vma) relocation < - 0x40000
1536 || (bfd_signed_vma) relocation > 0x3ffff)
1537 r = bfd_reloc_overflow;
1538 else
1539 r = bfd_reloc_ok;
1540 }
1541 else if (r_type == R_SPARC_REV32)
1542 {
1543 bfd_vma x;
1544
1545 relocation = relocation + rel->r_addend;
1546
1547 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
1548 x = x + relocation;
1549 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
1550 r = bfd_reloc_ok;
1551 }
1552 else
1553 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1554 contents, rel->r_offset,
1555 relocation, rel->r_addend);
1556
1557
1558 if (r != bfd_reloc_ok)
1559 {
1560 switch (r)
1561 {
1562 default:
1563 case bfd_reloc_outofrange:
1564 abort ();
1565 case bfd_reloc_overflow:
1566 {
1567 const char *name;
1568
1569 if (h != NULL)
1570 name = h->root.root.string;
1571 else
1572 {
1573 name = bfd_elf_string_from_elf_section (input_bfd,
1574 symtab_hdr->sh_link,
1575 sym->st_name);
1576 if (name == NULL)
1577 return false;
1578 if (*name == '\0')
1579 name = bfd_section_name (input_bfd, sec);
1580 }
1581 if (! ((*info->callbacks->reloc_overflow)
1582 (info, name, howto->name, (bfd_vma) 0,
1583 input_bfd, input_section, rel->r_offset)))
1584 return false;
1585 }
1586 break;
1587 }
1588 }
1589 }
1590
1591 return true;
1592}
1593
1594/* Finish up dynamic symbol handling. We set the contents of various
1595 dynamic sections here. */
1596
1597static boolean
1598elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
1599 bfd *output_bfd;
1600 struct bfd_link_info *info;
1601 struct elf_link_hash_entry *h;
1602 Elf_Internal_Sym *sym;
1603{
1604 bfd *dynobj;
1605
1606 dynobj = elf_hash_table (info)->dynobj;
1607
1608 if (h->plt.offset != (bfd_vma) -1)
1609 {
1610 asection *splt;
1611 asection *srela;
1612 Elf_Internal_Rela rela;
1613
1614 /* This symbol has an entry in the procedure linkage table. Set
1615 it up. */
1616
1617 BFD_ASSERT (h->dynindx != -1);
1618
1619 splt = bfd_get_section_by_name (dynobj, ".plt");
1620 srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1621 BFD_ASSERT (splt != NULL && srela != NULL);
1622
1623 /* Fill in the entry in the procedure linkage table. */
1624 bfd_put_32 (output_bfd,
1625 PLT_ENTRY_WORD0 + h->plt.offset,
1626 splt->contents + h->plt.offset);
1627 bfd_put_32 (output_bfd,
1628 (PLT_ENTRY_WORD1
1629 + (((- (h->plt.offset + 4)) >> 2) & 0x3fffff)),
1630 splt->contents + h->plt.offset + 4);
1631 bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
1632 splt->contents + h->plt.offset + 8);
1633
1634 /* Fill in the entry in the .rela.plt section. */
1635 rela.r_offset = (splt->output_section->vma
1636 + splt->output_offset
1637 + h->plt.offset);
1638 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
1639 rela.r_addend = 0;
1640 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1641 ((Elf32_External_Rela *) srela->contents
1642 + h->plt.offset / PLT_ENTRY_SIZE - 4));
1643
1644 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1645 {
1646 /* Mark the symbol as undefined, rather than as defined in
1647 the .plt section. Leave the value alone. */
1648 sym->st_shndx = SHN_UNDEF;
1649 }
1650 }
1651
1652 if (h->got.offset != (bfd_vma) -1)
1653 {
1654 asection *sgot;
1655 asection *srela;
1656 Elf_Internal_Rela rela;
1657
1658 /* This symbol has an entry in the global offset table. Set it
1659 up. */
1660
1661 sgot = bfd_get_section_by_name (dynobj, ".got");
1662 srela = bfd_get_section_by_name (dynobj, ".rela.got");
1663 BFD_ASSERT (sgot != NULL && srela != NULL);
1664
1665 rela.r_offset = (sgot->output_section->vma
1666 + sgot->output_offset
1667 + (h->got.offset &~ 1));
1668
1669 /* If this is a -Bsymbolic link, and the symbol is defined
1670 locally, we just want to emit a RELATIVE reloc. Likewise if
1671 the symbol was forced to be local because of a version file.
1672 The entry in the global offset table will already have been
1673 initialized in the relocate_section function. */
1674 if (info->shared
1675 && (info->symbolic || h->dynindx == -1)
1676 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
1677 rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1678 else
1679 {
1680 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1681 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
1682 }
1683
1684 rela.r_addend = 0;
1685 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1686 ((Elf32_External_Rela *) srela->contents
1687 + srela->reloc_count));
1688 ++srela->reloc_count;
1689 }
1690
1691 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1692 {
1693 asection *s;
1694 Elf_Internal_Rela rela;
1695
1696 /* This symbols needs a copy reloc. Set it up. */
1697
1698 BFD_ASSERT (h->dynindx != -1);
1699
1700 s = bfd_get_section_by_name (h->root.u.def.section->owner,
1701 ".rela.bss");
1702 BFD_ASSERT (s != NULL);
1703
1704 rela.r_offset = (h->root.u.def.value
1705 + h->root.u.def.section->output_section->vma
1706 + h->root.u.def.section->output_offset);
1707 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY);
1708 rela.r_addend = 0;
1709 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1710 ((Elf32_External_Rela *) s->contents
1711 + s->reloc_count));
1712 ++s->reloc_count;
1713 }
1714
1715 /* Mark some specially defined symbols as absolute. */
1716 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1717 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
1718 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
1719 sym->st_shndx = SHN_ABS;
1720
1721 return true;
1722}
1723
1724/* Finish up the dynamic sections. */
1725
1726static boolean
1727elf32_sparc_finish_dynamic_sections (output_bfd, info)
1728 bfd *output_bfd;
1729 struct bfd_link_info *info;
1730{
1731 bfd *dynobj;
1732 asection *sdyn;
1733 asection *sgot;
1734
1735 dynobj = elf_hash_table (info)->dynobj;
1736
1737 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1738
1739 if (elf_hash_table (info)->dynamic_sections_created)
1740 {
1741 asection *splt;
1742 Elf32_External_Dyn *dyncon, *dynconend;
1743
1744 splt = bfd_get_section_by_name (dynobj, ".plt");
1745 BFD_ASSERT (splt != NULL && sdyn != NULL);
1746
1747 dyncon = (Elf32_External_Dyn *) sdyn->contents;
1748 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1749 for (; dyncon < dynconend; dyncon++)
1750 {
1751 Elf_Internal_Dyn dyn;
1752 const char *name;
1753 boolean size;
1754
1755 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1756
1757 switch (dyn.d_tag)
1758 {
1759 case DT_PLTGOT: name = ".plt"; size = false; break;
1760 case DT_PLTRELSZ: name = ".rela.plt"; size = true; break;
1761 case DT_JMPREL: name = ".rela.plt"; size = false; break;
1762 default: name = NULL; size = false; break;
1763 }
1764
1765 if (name != NULL)
1766 {
1767 asection *s;
1768
1769 s = bfd_get_section_by_name (output_bfd, name);
1770 if (s == NULL)
1771 dyn.d_un.d_val = 0;
1772 else
1773 {
1774 if (! size)
1775 dyn.d_un.d_ptr = s->vma;
1776 else
1777 {
1778 if (s->_cooked_size != 0)
1779 dyn.d_un.d_val = s->_cooked_size;
1780 else
1781 dyn.d_un.d_val = s->_raw_size;
1782 }
1783 }
1784 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1785 }
1786 }
1787
1788 /* Clear the first four entries in the procedure linkage table,
1789 and put a nop in the last four bytes. */
1790 if (splt->_raw_size > 0)
1791 {
1792 memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE);
1793 bfd_put_32 (output_bfd, SPARC_NOP,
1794 splt->contents + splt->_raw_size - 4);
1795 }
1796
1797 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
1798 PLT_ENTRY_SIZE;
1799 }
1800
1801 /* Set the first entry in the global offset table to the address of
1802 the dynamic section. */
1803 sgot = bfd_get_section_by_name (dynobj, ".got");
1804 BFD_ASSERT (sgot != NULL);
1805 if (sgot->_raw_size > 0)
1806 {
1807 if (sdyn == NULL)
1808 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1809 else
1810 bfd_put_32 (output_bfd,
1811 sdyn->output_section->vma + sdyn->output_offset,
1812 sgot->contents);
1813 }
1814
1815 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1816
252b5132
RH
1817 return true;
1818}
1819\f
1820/* Functions for dealing with the e_flags field.
1821
1822 We don't define set_private_flags or copy_private_bfd_data because
1823 the only currently defined values are based on the bfd mach number,
1824 so we use the latter instead and defer setting e_flags until the
1825 file is written out. */
1826
1827/* Merge backend specific data from an object file to the output
1828 object file when linking. */
1829
1830static boolean
1831elf32_sparc_merge_private_bfd_data (ibfd, obfd)
1832 bfd *ibfd;
1833 bfd *obfd;
1834{
1835 boolean error;
5f771d47
ILT
1836 /* FIXME: This should not be static. */
1837 static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
252b5132
RH
1838
1839 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1840 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1841 return true;
1842
1843 error = false;
1844
1845#if 0
1846 /* ??? The native linker doesn't do this so we can't (otherwise gcc would
1847 have to know which linker is being used). Instead, the native linker
1848 bumps up the architecture level when it has to. However, I still think
1849 warnings like these are good, so it would be nice to have them turned on
1850 by some option. */
1851
1852 /* If the output machine is normal sparc, we can't allow v9 input files. */
1853 if (bfd_get_mach (obfd) == bfd_mach_sparc
1854 && (bfd_get_mach (ibfd) == bfd_mach_sparc_v8plus
1855 || bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa))
1856 {
1857 error = true;
1858 (*_bfd_error_handler)
1859 (_("%s: compiled for a v8plus system and target is v8"),
1860 bfd_get_filename (ibfd));
1861 }
1862 /* If the output machine is v9, we can't allow v9+vis input files. */
1863 if (bfd_get_mach (obfd) == bfd_mach_sparc_v8plus
1864 && bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa)
1865 {
1866 error = true;
1867 (*_bfd_error_handler)
1868 (_("%s: compiled for a v8plusa system and target is v8plus"),
1869 bfd_get_filename (ibfd));
1870 }
1871#else
1872 if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
1873 {
1874 error = true;
1875 (*_bfd_error_handler)
1876 (_("%s: compiled for a 64 bit system and target is 32 bit"),
1877 bfd_get_filename (ibfd));
1878 }
37fb6db1
ILT
1879 else if ((ibfd->flags & DYNAMIC) == 0)
1880 {
1881 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
1882 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
1883 }
252b5132
RH
1884#endif
1885
1886 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
1887 != previous_ibfd_e_flags)
5f771d47 1888 && previous_ibfd_e_flags != (unsigned long) -1)
252b5132
RH
1889 {
1890 (*_bfd_error_handler)
1891 (_("%s: linking little endian files with big endian files"),
1892 bfd_get_filename (ibfd));
1893 error = true;
1894 }
1895 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
1896
1897 if (error)
1898 {
1899 bfd_set_error (bfd_error_bad_value);
1900 return false;
1901 }
1902
1903 return true;
1904}
1905\f
1906/* Set the right machine number. */
1907
1908static boolean
1909elf32_sparc_object_p (abfd)
1910 bfd *abfd;
1911{
1912 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
1913 {
1914 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
1915 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1916 bfd_mach_sparc_v8plusa);
1917 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
1918 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1919 bfd_mach_sparc_v8plus);
1920 else
1921 return false;
1922 }
1923 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
1924 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1925 bfd_mach_sparc_sparclite_le);
1926 else
1927 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
1928}
1929
1930/* The final processing done just before writing out the object file.
1931 We need to set the e_machine field appropriately. */
1932
1933static void
1934elf32_sparc_final_write_processing (abfd, linker)
1935 bfd *abfd;
5f771d47 1936 boolean linker ATTRIBUTE_UNUSED;
252b5132
RH
1937{
1938 switch (bfd_get_mach (abfd))
1939 {
1940 case bfd_mach_sparc :
1941 break; /* nothing to do */
1942 case bfd_mach_sparc_v8plus :
1943 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
1944 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
1945 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
1946 break;
1947 case bfd_mach_sparc_v8plusa :
1948 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
1949 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
1950 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
1951 break;
1952 case bfd_mach_sparc_sparclite_le :
1953 elf_elfheader (abfd)->e_machine = EM_SPARC;
1954 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
1955 break;
1956 default :
1957 abort ();
1958 break;
1959 }
1960}
1961\f
1962#define TARGET_BIG_SYM bfd_elf32_sparc_vec
1963#define TARGET_BIG_NAME "elf32-sparc"
1964#define ELF_ARCH bfd_arch_sparc
1965#define ELF_MACHINE_CODE EM_SPARC
1966#define ELF_MACHINE_ALT1 EM_SPARC32PLUS
1967#define ELF_MAXPAGESIZE 0x10000
1968
1969#define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
1970#define elf_info_to_howto elf32_sparc_info_to_howto
1971#define elf_backend_create_dynamic_sections \
1972 _bfd_elf_create_dynamic_sections
1973#define elf_backend_check_relocs elf32_sparc_check_relocs
1974#define elf_backend_adjust_dynamic_symbol \
1975 elf32_sparc_adjust_dynamic_symbol
1976#define elf_backend_size_dynamic_sections \
1977 elf32_sparc_size_dynamic_sections
1978#define elf_backend_relocate_section elf32_sparc_relocate_section
1979#define elf_backend_finish_dynamic_symbol \
1980 elf32_sparc_finish_dynamic_symbol
1981#define elf_backend_finish_dynamic_sections \
1982 elf32_sparc_finish_dynamic_sections
1983#define bfd_elf32_bfd_merge_private_bfd_data \
1984 elf32_sparc_merge_private_bfd_data
1985#define elf_backend_object_p elf32_sparc_object_p
1986#define elf_backend_final_write_processing \
1987 elf32_sparc_final_write_processing
1988#define elf_backend_gc_mark_hook elf32_sparc_gc_mark_hook
1989#define elf_backend_gc_sweep_hook elf32_sparc_gc_sweep_hook
1990
1991#define elf_backend_can_gc_sections 1
1992#define elf_backend_want_got_plt 0
1993#define elf_backend_plt_readonly 0
1994#define elf_backend_want_plt_sym 1
1995#define elf_backend_got_header_size 4
1996#define elf_backend_plt_header_size (4*PLT_ENTRY_SIZE)
1997
1998#include "elf32-target.h"
This page took 0.124509 seconds and 4 git commands to generate.