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