rebuild
[binutils.git] / bfd / elf32-sparc.c
blobec57c8cb35f109b3eb8fe22757be2fe817e69f60
1 /* SPARC-specific support for 32-bit ELF
2 Copyright (C) 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
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"
27 static reloc_howto_type *elf32_sparc_reloc_type_lookup
28 PARAMS ((bfd *, bfd_reloc_code_real_type));
29 static void elf32_sparc_info_to_howto
30 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
31 static boolean elf32_sparc_check_relocs
32 PARAMS ((bfd *, struct bfd_link_info *, asection *,
33 const Elf_Internal_Rela *));
34 static boolean elf32_sparc_adjust_dynamic_symbol
35 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
36 static boolean elf32_sparc_adjust_dynindx
37 PARAMS ((struct elf_link_hash_entry *, PTR));
38 static boolean elf32_sparc_size_dynamic_sections
39 PARAMS ((bfd *, struct bfd_link_info *));
40 static boolean elf32_sparc_relocate_section
41 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
42 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
43 static boolean elf32_sparc_finish_dynamic_symbol
44 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
45 Elf_Internal_Sym *));
46 static boolean elf32_sparc_finish_dynamic_sections
47 PARAMS ((bfd *, struct bfd_link_info *));
48 static boolean elf32_sparc_merge_private_bfd_data PARAMS ((bfd *, bfd *));
49 static boolean elf32_sparc_object_p
50 PARAMS ((bfd *));
51 static void elf32_sparc_final_write_processing
52 PARAMS ((bfd *, boolean));
54 /* The relocation "howto" table. */
56 static bfd_reloc_status_type sparc_elf_notsupported_reloc
57 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
58 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
59 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
61 reloc_howto_type _bfd_sparc_elf_howto_table[] =
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),
125 static 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);
127 static 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);
131 struct elf_reloc_map {
132 bfd_reloc_code_real_type bfd_reloc_val;
133 unsigned char elf_reloc_val;
136 static CONST struct elf_reloc_map sparc_reloc_map[] =
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},
183 static reloc_howto_type *
184 elf32_sparc_reloc_type_lookup (abfd, code)
185 bfd *abfd;
186 bfd_reloc_code_real_type code;
188 unsigned int i;
190 switch (code)
192 case BFD_RELOC_VTABLE_INHERIT:
193 return &elf32_sparc_vtinherit_howto;
195 case BFD_RELOC_VTABLE_ENTRY:
196 return &elf32_sparc_vtentry_howto;
198 default:
199 for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
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];
205 bfd_set_error (bfd_error_bad_value);
206 return NULL;
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. */
212 static void
213 elf32_sparc_info_to_howto (abfd, cache_ptr, dst)
214 bfd *abfd;
215 arelent *cache_ptr;
216 Elf_Internal_Rela *dst;
218 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_SPARC_max);
219 cache_ptr->howto = &_bfd_sparc_elf_howto_table[ELF32_R_TYPE(dst->r_info)];
222 /* For unsupported relocs. */
224 static bfd_reloc_status_type
225 sparc_elf_notsupported_reloc (abfd,
226 reloc_entry,
227 symbol,
228 data,
229 input_section,
230 output_bfd,
231 error_message)
232 bfd *abfd;
233 arelent *reloc_entry;
234 asymbol *symbol;
235 PTR data;
236 asection *input_section;
237 bfd *output_bfd;
238 char **error_message;
240 return bfd_reloc_notsupported;
243 /* Handle the WDISP16 reloc. */
245 static bfd_reloc_status_type
246 sparc_elf_wdisp16_reloc (abfd,
247 reloc_entry,
248 symbol,
249 data,
250 input_section,
251 output_bfd,
252 error_message)
253 bfd *abfd;
254 arelent *reloc_entry;
255 asymbol *symbol;
256 PTR data;
257 asection *input_section;
258 bfd *output_bfd;
259 char **error_message;
261 bfd_vma relocation;
262 bfd_vma x;
264 if (output_bfd != (bfd *) NULL
265 && (symbol->flags & BSF_SECTION_SYM) == 0
266 && (! reloc_entry->howto->partial_inplace
267 || reloc_entry->addend == 0))
269 reloc_entry->address += input_section->output_offset;
270 return bfd_reloc_ok;
273 if (output_bfd != NULL)
274 return bfd_reloc_continue;
276 if (reloc_entry->address > input_section->_cooked_size)
277 return bfd_reloc_outofrange;
279 relocation = (symbol->value
280 + symbol->section->output_section->vma
281 + symbol->section->output_offset);
282 relocation += reloc_entry->addend;
283 relocation -= (input_section->output_section->vma
284 + input_section->output_offset);
285 relocation -= reloc_entry->address;
287 x = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
288 x |= ((((relocation >> 2) & 0xc000) << 6)
289 | ((relocation >> 2) & 0x3fff));
290 bfd_put_32 (abfd, x, (bfd_byte *) data + reloc_entry->address);
292 if ((bfd_signed_vma) relocation < - 0x40000
293 || (bfd_signed_vma) relocation > 0x3ffff)
294 return bfd_reloc_overflow;
295 else
296 return bfd_reloc_ok;
299 /* Functions for the SPARC ELF linker. */
301 /* The name of the dynamic interpreter. This is put in the .interp
302 section. */
304 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
306 /* The nop opcode we use. */
308 #define SPARC_NOP 0x01000000
310 /* The size in bytes of an entry in the procedure linkage table. */
312 #define PLT_ENTRY_SIZE 12
314 /* The first four entries in a procedure linkage table are reserved,
315 and the initial contents are unimportant (we zero them out).
316 Subsequent entries look like this. See the SVR4 ABI SPARC
317 supplement to see how this works. */
319 /* sethi %hi(.-.plt0),%g1. We fill in the address later. */
320 #define PLT_ENTRY_WORD0 0x03000000
321 /* b,a .plt0. We fill in the offset later. */
322 #define PLT_ENTRY_WORD1 0x30800000
323 /* nop. */
324 #define PLT_ENTRY_WORD2 SPARC_NOP
326 /* Look through the relocs for a section during the first phase, and
327 allocate space in the global offset table or procedure linkage
328 table. */
330 static boolean
331 elf32_sparc_check_relocs (abfd, info, sec, relocs)
332 bfd *abfd;
333 struct bfd_link_info *info;
334 asection *sec;
335 const Elf_Internal_Rela *relocs;
337 bfd *dynobj;
338 Elf_Internal_Shdr *symtab_hdr;
339 struct elf_link_hash_entry **sym_hashes;
340 bfd_vma *local_got_offsets;
341 const Elf_Internal_Rela *rel;
342 const Elf_Internal_Rela *rel_end;
343 asection *sgot;
344 asection *srelgot;
345 asection *sreloc;
347 if (info->relocateable)
348 return true;
350 dynobj = elf_hash_table (info)->dynobj;
351 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
352 sym_hashes = elf_sym_hashes (abfd);
353 local_got_offsets = elf_local_got_offsets (abfd);
355 sgot = NULL;
356 srelgot = NULL;
357 sreloc = NULL;
359 rel_end = relocs + sec->reloc_count;
360 for (rel = relocs; rel < rel_end; rel++)
362 unsigned long r_symndx;
363 struct elf_link_hash_entry *h;
365 r_symndx = ELF32_R_SYM (rel->r_info);
366 if (r_symndx < symtab_hdr->sh_info)
367 h = NULL;
368 else
369 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
371 switch (ELF32_R_TYPE (rel->r_info))
373 case R_SPARC_GOT10:
374 case R_SPARC_GOT13:
375 case R_SPARC_GOT22:
376 /* This symbol requires a global offset table entry. */
378 if (dynobj == NULL)
380 /* Create the .got section. */
381 elf_hash_table (info)->dynobj = dynobj = abfd;
382 if (! _bfd_elf_create_got_section (dynobj, info))
383 return false;
386 if (sgot == NULL)
388 sgot = bfd_get_section_by_name (dynobj, ".got");
389 BFD_ASSERT (sgot != NULL);
392 if (srelgot == NULL
393 && (h != NULL || info->shared))
395 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
396 if (srelgot == NULL)
398 srelgot = bfd_make_section (dynobj, ".rela.got");
399 if (srelgot == NULL
400 || ! bfd_set_section_flags (dynobj, srelgot,
401 (SEC_ALLOC
402 | SEC_LOAD
403 | SEC_HAS_CONTENTS
404 | SEC_IN_MEMORY
405 | SEC_LINKER_CREATED
406 | SEC_READONLY))
407 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
408 return false;
412 if (h != NULL)
414 if (h->got.offset != (bfd_vma) -1)
416 /* We have already allocated space in the .got. */
417 break;
419 h->got.offset = sgot->_raw_size;
421 /* Make sure this symbol is output as a dynamic symbol. */
422 if (h->dynindx == -1)
424 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
425 return false;
428 srelgot->_raw_size += sizeof (Elf32_External_Rela);
430 else
432 /* This is a global offset table entry for a local
433 symbol. */
434 if (local_got_offsets == NULL)
436 size_t size;
437 register unsigned int i;
439 size = symtab_hdr->sh_info * sizeof (bfd_vma);
440 local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
441 if (local_got_offsets == NULL)
442 return false;
443 elf_local_got_offsets (abfd) = local_got_offsets;
444 for (i = 0; i < symtab_hdr->sh_info; i++)
445 local_got_offsets[i] = (bfd_vma) -1;
447 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
449 /* We have already allocated space in the .got. */
450 break;
452 local_got_offsets[r_symndx] = sgot->_raw_size;
454 if (info->shared)
456 /* If we are generating a shared object, we need to
457 output a R_SPARC_RELATIVE reloc so that the
458 dynamic linker can adjust this GOT entry. */
459 srelgot->_raw_size += sizeof (Elf32_External_Rela);
463 sgot->_raw_size += 4;
465 /* If the .got section is more than 0x1000 bytes, we add
466 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
467 bit relocations have a greater chance of working. */
468 if (sgot->_raw_size >= 0x1000
469 && elf_hash_table (info)->hgot->root.u.def.value == 0)
470 elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
472 break;
474 case R_SPARC_WPLT30:
475 /* This symbol requires a procedure linkage table entry. We
476 actually build the entry in adjust_dynamic_symbol,
477 because this might be a case of linking PIC code without
478 linking in any dynamic objects, in which case we don't
479 need to generate a procedure linkage table after all. */
481 if (h == NULL)
483 /* The Solaris native assembler will generate a WPLT30
484 reloc for a local symbol if you assemble a call from
485 one section to another when using -K pic. We treat
486 it as WDISP30. */
487 break;
490 /* Make sure this symbol is output as a dynamic symbol. */
491 if (h->dynindx == -1)
493 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
494 return false;
497 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
499 break;
501 case R_SPARC_PC10:
502 case R_SPARC_PC22:
503 if (h != NULL
504 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
505 break;
506 /* Fall through. */
507 case R_SPARC_DISP8:
508 case R_SPARC_DISP16:
509 case R_SPARC_DISP32:
510 case R_SPARC_WDISP30:
511 case R_SPARC_WDISP22:
512 case R_SPARC_WDISP19:
513 case R_SPARC_WDISP16:
514 /* If we are linking with -Bsymbolic, we do not need to copy
515 a PC relative reloc against a global symbol which is
516 defined in an object we are including in the link (i.e.,
517 DEF_REGULAR is set). FIXME: At this point we have not
518 seen all the input files, so it is possible that
519 DEF_REGULAR is not set now but will be set later (it is
520 never cleared). This needs to be handled as in
521 elf32-i386.c. */
522 if (h == NULL
523 || (info->symbolic
524 && (h->elf_link_hash_flags
525 & ELF_LINK_HASH_DEF_REGULAR) != 0))
526 break;
527 /* Fall through. */
528 case R_SPARC_8:
529 case R_SPARC_16:
530 case R_SPARC_32:
531 case R_SPARC_HI22:
532 case R_SPARC_22:
533 case R_SPARC_13:
534 case R_SPARC_LO10:
535 case R_SPARC_UA32:
536 if (info->shared)
538 /* When creating a shared object, we must copy these
539 relocs into the output file. We create a reloc
540 section in dynobj and make room for the reloc. */
541 if (sreloc == NULL)
543 const char *name;
545 name = (bfd_elf_string_from_elf_section
546 (abfd,
547 elf_elfheader (abfd)->e_shstrndx,
548 elf_section_data (sec)->rel_hdr.sh_name));
549 if (name == NULL)
550 return false;
552 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
553 && strcmp (bfd_get_section_name (abfd, sec),
554 name + 5) == 0);
556 sreloc = bfd_get_section_by_name (dynobj, name);
557 if (sreloc == NULL)
559 flagword flags;
561 sreloc = bfd_make_section (dynobj, name);
562 flags = (SEC_HAS_CONTENTS | SEC_READONLY
563 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
564 if ((sec->flags & SEC_ALLOC) != 0)
565 flags |= SEC_ALLOC | SEC_LOAD;
566 if (sreloc == NULL
567 || ! bfd_set_section_flags (dynobj, sreloc, flags)
568 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
569 return false;
573 sreloc->_raw_size += sizeof (Elf32_External_Rela);
576 break;
578 case R_SPARC_GNU_VTINHERIT:
579 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
580 return false;
581 break;
583 case R_SPARC_GNU_VTENTRY:
584 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
585 return false;
586 break;
588 default:
589 break;
593 return true;
596 static asection *
597 elf32_sparc_gc_mark_hook (abfd, info, rel, h, sym)
598 bfd *abfd;
599 struct bfd_link_info *info;
600 Elf_Internal_Rela *rel;
601 struct elf_link_hash_entry *h;
602 Elf_Internal_Sym *sym;
605 if (h != NULL)
607 switch (ELF32_R_TYPE (rel->r_info))
609 case R_SPARC_GNU_VTINHERIT:
610 case R_SPARC_GNU_VTENTRY:
611 break;
613 default:
614 switch (h->root.type)
616 case bfd_link_hash_defined:
617 case bfd_link_hash_defweak:
618 return h->root.u.def.section;
620 case bfd_link_hash_common:
621 return h->root.u.c.p->section;
625 else
627 if (!(elf_bad_symtab (abfd)
628 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
629 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
630 && sym->st_shndx != SHN_COMMON))
632 return bfd_section_from_elf_index (abfd, sym->st_shndx);
636 return NULL;
639 /* Update the got entry reference counts for the section being removed. */
640 static boolean
641 elf32_sparc_gc_sweep_hook (abfd, info, sec, relocs)
642 bfd *abfd;
643 struct bfd_link_info *info;
644 asection *sec;
645 const Elf_Internal_Rela *relocs;
648 Elf_Internal_Shdr *symtab_hdr;
649 struct elf_link_hash_entry **sym_hashes;
650 bfd_signed_vma *local_got_refcounts;
651 const Elf_Internal_Rela *rel, *relend;
652 unsigned long r_symndx;
653 struct elf_link_hash_entry *h;
655 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
656 sym_hashes = elf_sym_hashes (abfd);
657 local_got_refcounts = elf_local_got_refcounts (abfd);
659 relend = relocs + sec->reloc_count;
660 for (rel = relocs; rel < relend; rel++)
661 switch (ELF32_R_TYPE (rel->r_info))
663 case R_SPARC_GOT10:
664 case R_SPARC_GOT13:
665 case R_SPARC_GOT22:
666 r_symndx = ELF32_R_SYM (rel->r_info);
667 if (r_symndx >= symtab_hdr->sh_info)
669 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
670 if (h->got.refcount > 0)
671 h->got.refcount--;
673 else
675 if (local_got_refcounts[r_symndx] > 0)
676 local_got_refcounts[r_symndx]--;
678 break;
680 case R_SPARC_PLT32:
681 case R_SPARC_HIPLT22:
682 case R_SPARC_LOPLT10:
683 case R_SPARC_PCPLT32:
684 case R_SPARC_PCPLT10:
685 r_symndx = ELF32_R_SYM (rel->r_info);
686 if (r_symndx >= symtab_hdr->sh_info)
688 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
689 if (h->plt.refcount > 0)
690 h->plt.refcount--;
692 break;
694 default:
695 break;
698 return true;
701 /* Adjust a symbol defined by a dynamic object and referenced by a
702 regular object. The current definition is in some section of the
703 dynamic object, but we're not including those sections. We have to
704 change the definition to something the rest of the link can
705 understand. */
707 static boolean
708 elf32_sparc_adjust_dynamic_symbol (info, h)
709 struct bfd_link_info *info;
710 struct elf_link_hash_entry *h;
712 bfd *dynobj;
713 asection *s;
714 unsigned int power_of_two;
716 dynobj = elf_hash_table (info)->dynobj;
718 /* Make sure we know what is going on here. */
719 BFD_ASSERT (dynobj != NULL
720 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
721 || h->weakdef != NULL
722 || ((h->elf_link_hash_flags
723 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
724 && (h->elf_link_hash_flags
725 & ELF_LINK_HASH_REF_REGULAR) != 0
726 && (h->elf_link_hash_flags
727 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
729 /* If this is a function, put it in the procedure linkage table. We
730 will fill in the contents of the procedure linkage table later
731 (although we could actually do it here). The STT_NOTYPE
732 condition is a hack specifically for the Oracle libraries
733 delivered for Solaris; for some inexplicable reason, they define
734 some of their functions as STT_NOTYPE when they really should be
735 STT_FUNC. */
736 if (h->type == STT_FUNC
737 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
738 || (h->type == STT_NOTYPE
739 && (h->root.type == bfd_link_hash_defined
740 || h->root.type == bfd_link_hash_defweak)
741 && (h->root.u.def.section->flags & SEC_CODE) != 0))
743 if (! elf_hash_table (info)->dynamic_sections_created
744 || ((!info->shared || info->symbolic || h->dynindx == -1)
745 && (h->elf_link_hash_flags
746 & ELF_LINK_HASH_DEF_REGULAR) != 0))
748 /* This case can occur if we saw a WPLT30 reloc in an input
749 file, but none of the input files were dynamic objects.
750 Or, when linking the main application or a -Bsymbolic
751 shared library against PIC code. Or when a global symbol
752 has been made private, e.g. via versioning.
754 In these cases we know what value the symbol will resolve
755 to, so we don't actually need to build a procedure linkage
756 table, and we can just do a WDISP30 reloc instead. */
758 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
759 return true;
762 s = bfd_get_section_by_name (dynobj, ".plt");
763 BFD_ASSERT (s != NULL);
765 /* The first four entries in .plt are reserved. */
766 if (s->_raw_size == 0)
767 s->_raw_size = 4 * PLT_ENTRY_SIZE;
769 /* The procedure linkage table has a maximum size. */
770 if (s->_raw_size >= 0x400000)
772 bfd_set_error (bfd_error_bad_value);
773 return false;
776 /* If this symbol is not defined in a regular file, and we are
777 not generating a shared library, then set the symbol to this
778 location in the .plt. This is required to make function
779 pointers compare as equal between the normal executable and
780 the shared library. */
781 if (! info->shared
782 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
784 h->root.u.def.section = s;
785 h->root.u.def.value = s->_raw_size;
788 h->plt.offset = s->_raw_size;
790 /* Make room for this entry. */
791 s->_raw_size += PLT_ENTRY_SIZE;
793 /* We also need to make an entry in the .rela.plt section. */
795 s = bfd_get_section_by_name (dynobj, ".rela.plt");
796 BFD_ASSERT (s != NULL);
797 s->_raw_size += sizeof (Elf32_External_Rela);
799 return true;
802 /* If this is a weak symbol, and there is a real definition, the
803 processor independent code will have arranged for us to see the
804 real definition first, and we can just use the same value. */
805 if (h->weakdef != NULL)
807 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
808 || h->weakdef->root.type == bfd_link_hash_defweak);
809 h->root.u.def.section = h->weakdef->root.u.def.section;
810 h->root.u.def.value = h->weakdef->root.u.def.value;
811 return true;
814 /* This is a reference to a symbol defined by a dynamic object which
815 is not a function. */
817 /* If we are creating a shared library, we must presume that the
818 only references to the symbol are via the global offset table.
819 For such cases we need not do anything here; the relocations will
820 be handled correctly by relocate_section. */
821 if (info->shared)
822 return true;
824 /* We must allocate the symbol in our .dynbss section, which will
825 become part of the .bss section of the executable. There will be
826 an entry for this symbol in the .dynsym section. The dynamic
827 object will contain position independent code, so all references
828 from the dynamic object to this symbol will go through the global
829 offset table. The dynamic linker will use the .dynsym entry to
830 determine the address it must put in the global offset table, so
831 both the dynamic object and the regular object will refer to the
832 same memory location for the variable. */
834 s = bfd_get_section_by_name (dynobj, ".dynbss");
835 BFD_ASSERT (s != NULL);
837 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
838 to copy the initial value out of the dynamic object and into the
839 runtime process image. We need to remember the offset into the
840 .rel.bss section we are going to use. */
841 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
843 asection *srel;
845 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
846 BFD_ASSERT (srel != NULL);
847 srel->_raw_size += sizeof (Elf32_External_Rela);
848 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
851 /* We need to figure out the alignment required for this symbol. I
852 have no idea how ELF linkers handle this. */
853 power_of_two = bfd_log2 (h->size);
854 if (power_of_two > 3)
855 power_of_two = 3;
857 /* Apply the required alignment. */
858 s->_raw_size = BFD_ALIGN (s->_raw_size,
859 (bfd_size_type) (1 << power_of_two));
860 if (power_of_two > bfd_get_section_alignment (dynobj, s))
862 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
863 return false;
866 /* Define the symbol as being at this point in the section. */
867 h->root.u.def.section = s;
868 h->root.u.def.value = s->_raw_size;
870 /* Increment the section size to make room for the symbol. */
871 s->_raw_size += h->size;
873 return true;
876 /* Set the sizes of the dynamic sections. */
878 static boolean
879 elf32_sparc_size_dynamic_sections (output_bfd, info)
880 bfd *output_bfd;
881 struct bfd_link_info *info;
883 bfd *dynobj;
884 asection *s;
885 boolean reltext;
886 boolean relplt;
888 dynobj = elf_hash_table (info)->dynobj;
889 BFD_ASSERT (dynobj != NULL);
891 if (elf_hash_table (info)->dynamic_sections_created)
893 /* Set the contents of the .interp section to the interpreter. */
894 if (! info->shared)
896 s = bfd_get_section_by_name (dynobj, ".interp");
897 BFD_ASSERT (s != NULL);
898 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
899 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
902 /* Make space for the trailing nop in .plt. */
903 s = bfd_get_section_by_name (dynobj, ".plt");
904 BFD_ASSERT (s != NULL);
905 if (s->_raw_size > 0)
906 s->_raw_size += 4;
908 else
910 /* We may have created entries in the .rela.got section.
911 However, if we are not creating the dynamic sections, we will
912 not actually use these entries. Reset the size of .rela.got,
913 which will cause it to get stripped from the output file
914 below. */
915 s = bfd_get_section_by_name (dynobj, ".rela.got");
916 if (s != NULL)
917 s->_raw_size = 0;
920 /* The check_relocs and adjust_dynamic_symbol entry points have
921 determined the sizes of the various dynamic sections. Allocate
922 memory for them. */
923 reltext = false;
924 relplt = false;
925 for (s = dynobj->sections; s != NULL; s = s->next)
927 const char *name;
928 boolean strip;
930 if ((s->flags & SEC_LINKER_CREATED) == 0)
931 continue;
933 /* It's OK to base decisions on the section name, because none
934 of the dynobj section names depend upon the input files. */
935 name = bfd_get_section_name (dynobj, s);
937 strip = false;
939 if (strncmp (name, ".rela", 5) == 0)
941 if (s->_raw_size == 0)
943 /* If we don't need this section, strip it from the
944 output file. This is to handle .rela.bss and
945 .rel.plt. We must create it in
946 create_dynamic_sections, because it must be created
947 before the linker maps input sections to output
948 sections. The linker does that before
949 adjust_dynamic_symbol is called, and it is that
950 function which decides whether anything needs to go
951 into these sections. */
952 strip = true;
954 else
956 const char *outname;
957 asection *target;
959 /* If this relocation section applies to a read only
960 section, then we probably need a DT_TEXTREL entry. */
961 outname = bfd_get_section_name (output_bfd,
962 s->output_section);
963 target = bfd_get_section_by_name (output_bfd, outname + 5);
964 if (target != NULL
965 && (target->flags & SEC_READONLY) != 0
966 && (target->flags & SEC_ALLOC) != 0)
967 reltext = true;
969 if (strcmp (name, ".rela.plt") == 0)
970 relplt = true;
972 /* We use the reloc_count field as a counter if we need
973 to copy relocs into the output file. */
974 s->reloc_count = 0;
977 else if (strcmp (name, ".plt") != 0
978 && strcmp (name, ".got") != 0)
980 /* It's not one of our sections, so don't allocate space. */
981 continue;
984 if (strip)
986 _bfd_strip_section_from_output (s);
987 continue;
990 /* Allocate memory for the section contents. */
991 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
992 if (s->contents == NULL && s->_raw_size != 0)
993 return false;
996 if (elf_hash_table (info)->dynamic_sections_created)
998 /* Add some entries to the .dynamic section. We fill in the
999 values later, in elf32_sparc_finish_dynamic_sections, but we
1000 must add the entries now so that we get the correct size for
1001 the .dynamic section. The DT_DEBUG entry is filled in by the
1002 dynamic linker and used by the debugger. */
1003 if (! info->shared)
1005 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
1006 return false;
1009 if (relplt)
1011 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
1012 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1013 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1014 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
1015 return false;
1018 if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
1019 || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
1020 || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
1021 sizeof (Elf32_External_Rela)))
1022 return false;
1024 if (reltext)
1026 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
1027 return false;
1031 /* If we are generating a shared library, we generate a section
1032 symbol for each output section for which we might need to copy
1033 relocs. These are local symbols, which means that they must come
1034 first in the dynamic symbol table. That means we must increment
1035 the dynamic symbol index of every other dynamic symbol. */
1036 if (info->shared)
1038 int c;
1040 c = 0;
1041 for (s = output_bfd->sections; s != NULL; s = s->next)
1043 if ((s->flags & SEC_LINKER_CREATED) != 0
1044 || (s->flags & SEC_ALLOC) == 0)
1045 continue;
1047 elf_section_data (s)->dynindx = c + 1;
1049 /* These symbols will have no names, so we don't need to
1050 fiddle with dynstr_index. */
1052 ++c;
1055 elf_link_hash_traverse (elf_hash_table (info),
1056 elf32_sparc_adjust_dynindx,
1057 (PTR) &c);
1058 elf_hash_table (info)->dynsymcount += c;
1061 return true;
1064 /* Increment the index of a dynamic symbol by a given amount. Called
1065 via elf_link_hash_traverse. */
1067 static boolean
1068 elf32_sparc_adjust_dynindx (h, cparg)
1069 struct elf_link_hash_entry *h;
1070 PTR cparg;
1072 int *cp = (int *) cparg;
1074 if (h->dynindx != -1)
1075 h->dynindx += *cp;
1076 return true;
1079 /* Relocate a SPARC ELF section. */
1081 static boolean
1082 elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
1083 contents, relocs, local_syms, local_sections)
1084 bfd *output_bfd;
1085 struct bfd_link_info *info;
1086 bfd *input_bfd;
1087 asection *input_section;
1088 bfd_byte *contents;
1089 Elf_Internal_Rela *relocs;
1090 Elf_Internal_Sym *local_syms;
1091 asection **local_sections;
1093 bfd *dynobj;
1094 Elf_Internal_Shdr *symtab_hdr;
1095 struct elf_link_hash_entry **sym_hashes;
1096 bfd_vma *local_got_offsets;
1097 bfd_vma got_base;
1098 asection *sgot;
1099 asection *splt;
1100 asection *sreloc;
1101 Elf_Internal_Rela *rel;
1102 Elf_Internal_Rela *relend;
1104 dynobj = elf_hash_table (info)->dynobj;
1105 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1106 sym_hashes = elf_sym_hashes (input_bfd);
1107 local_got_offsets = elf_local_got_offsets (input_bfd);
1109 if (elf_hash_table (info)->hgot == NULL)
1110 got_base = 0;
1111 else
1112 got_base = elf_hash_table (info)->hgot->root.u.def.value;
1114 sgot = NULL;
1115 splt = NULL;
1116 sreloc = NULL;
1118 rel = relocs;
1119 relend = relocs + input_section->reloc_count;
1120 for (; rel < relend; rel++)
1122 int r_type;
1123 reloc_howto_type *howto;
1124 unsigned long r_symndx;
1125 struct elf_link_hash_entry *h;
1126 Elf_Internal_Sym *sym;
1127 asection *sec;
1128 bfd_vma relocation;
1129 bfd_reloc_status_type r;
1131 r_type = ELF32_R_TYPE (rel->r_info);
1133 if (r_type == R_SPARC_GNU_VTINHERIT
1134 || r_type == R_SPARC_GNU_VTENTRY)
1135 continue;
1137 if (r_type < 0 || r_type >= (int) R_SPARC_max)
1139 bfd_set_error (bfd_error_bad_value);
1140 return false;
1142 howto = _bfd_sparc_elf_howto_table + r_type;
1144 r_symndx = ELF32_R_SYM (rel->r_info);
1146 if (info->relocateable)
1148 /* This is a relocateable link. We don't have to change
1149 anything, unless the reloc is against a section symbol,
1150 in which case we have to adjust according to where the
1151 section symbol winds up in the output section. */
1152 if (r_symndx < symtab_hdr->sh_info)
1154 sym = local_syms + r_symndx;
1155 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1157 sec = local_sections[r_symndx];
1158 rel->r_addend += sec->output_offset + sym->st_value;
1162 continue;
1165 /* This is a final link. */
1166 h = NULL;
1167 sym = NULL;
1168 sec = NULL;
1169 if (r_symndx < symtab_hdr->sh_info)
1171 sym = local_syms + r_symndx;
1172 sec = local_sections[r_symndx];
1173 relocation = (sec->output_section->vma
1174 + sec->output_offset
1175 + sym->st_value);
1177 else
1179 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1180 while (h->root.type == bfd_link_hash_indirect
1181 || h->root.type == bfd_link_hash_warning)
1182 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1183 if (h->root.type == bfd_link_hash_defined
1184 || h->root.type == bfd_link_hash_defweak)
1186 sec = h->root.u.def.section;
1187 if ((r_type == R_SPARC_WPLT30
1188 && h->plt.offset != (bfd_vma) -1)
1189 || ((r_type == R_SPARC_GOT10
1190 || r_type == R_SPARC_GOT13
1191 || r_type == R_SPARC_GOT22)
1192 && elf_hash_table (info)->dynamic_sections_created
1193 && (! info->shared
1194 || (! info->symbolic && h->dynindx != -1)
1195 || (h->elf_link_hash_flags
1196 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1197 || (info->shared
1198 && ((! info->symbolic && h->dynindx != -1)
1199 || (h->elf_link_hash_flags
1200 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1201 && (r_type == R_SPARC_8
1202 || r_type == R_SPARC_16
1203 || r_type == R_SPARC_32
1204 || r_type == R_SPARC_DISP8
1205 || r_type == R_SPARC_DISP16
1206 || r_type == R_SPARC_DISP32
1207 || r_type == R_SPARC_WDISP30
1208 || r_type == R_SPARC_WDISP22
1209 || r_type == R_SPARC_WDISP19
1210 || r_type == R_SPARC_WDISP16
1211 || r_type == R_SPARC_HI22
1212 || r_type == R_SPARC_22
1213 || r_type == R_SPARC_13
1214 || r_type == R_SPARC_LO10
1215 || r_type == R_SPARC_UA32
1216 || ((r_type == R_SPARC_PC10
1217 || r_type == R_SPARC_PC22)
1218 && strcmp (h->root.root.string,
1219 "_GLOBAL_OFFSET_TABLE_") != 0))))
1221 /* In these cases, we don't need the relocation
1222 value. We check specially because in some
1223 obscure cases sec->output_section will be NULL. */
1224 relocation = 0;
1226 else
1227 relocation = (h->root.u.def.value
1228 + sec->output_section->vma
1229 + sec->output_offset);
1231 else if (h->root.type == bfd_link_hash_undefweak)
1232 relocation = 0;
1233 else if (info->shared && !info->symbolic && !info->no_undefined)
1234 relocation = 0;
1235 else
1237 if (! ((*info->callbacks->undefined_symbol)
1238 (info, h->root.root.string, input_bfd,
1239 input_section, rel->r_offset)))
1240 return false;
1241 relocation = 0;
1245 switch (r_type)
1247 case R_SPARC_GOT10:
1248 case R_SPARC_GOT13:
1249 case R_SPARC_GOT22:
1250 /* Relocation is to the entry for this symbol in the global
1251 offset table. */
1252 if (sgot == NULL)
1254 sgot = bfd_get_section_by_name (dynobj, ".got");
1255 BFD_ASSERT (sgot != NULL);
1258 if (h != NULL)
1260 bfd_vma off;
1262 off = h->got.offset;
1263 BFD_ASSERT (off != (bfd_vma) -1);
1265 if (! elf_hash_table (info)->dynamic_sections_created
1266 || (info->shared
1267 && (info->symbolic || h->dynindx == -1)
1268 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1270 /* This is actually a static link, or it is a
1271 -Bsymbolic link and the symbol is defined
1272 locally, or the symbol was forced to be local
1273 because of a version file. We must initialize
1274 this entry in the global offset table. Since the
1275 offset must always be a multiple of 4, we use the
1276 least significant bit to record whether we have
1277 initialized it already.
1279 When doing a dynamic link, we create a .rela.got
1280 relocation entry to initialize the value. This
1281 is done in the finish_dynamic_symbol routine. */
1282 if ((off & 1) != 0)
1283 off &= ~1;
1284 else
1286 bfd_put_32 (output_bfd, relocation,
1287 sgot->contents + off);
1288 h->got.offset |= 1;
1292 relocation = sgot->output_offset + off - got_base;
1294 else
1296 bfd_vma off;
1298 BFD_ASSERT (local_got_offsets != NULL
1299 && local_got_offsets[r_symndx] != (bfd_vma) -1);
1301 off = local_got_offsets[r_symndx];
1303 /* The offset must always be a multiple of 4. We use
1304 the least significant bit to record whether we have
1305 already processed this entry. */
1306 if ((off & 1) != 0)
1307 off &= ~1;
1308 else
1310 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
1312 if (info->shared)
1314 asection *srelgot;
1315 Elf_Internal_Rela outrel;
1317 /* We need to generate a R_SPARC_RELATIVE reloc
1318 for the dynamic linker. */
1319 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1320 BFD_ASSERT (srelgot != NULL);
1322 outrel.r_offset = (sgot->output_section->vma
1323 + sgot->output_offset
1324 + off);
1325 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1326 outrel.r_addend = 0;
1327 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1328 (((Elf32_External_Rela *)
1329 srelgot->contents)
1330 + srelgot->reloc_count));
1331 ++srelgot->reloc_count;
1334 local_got_offsets[r_symndx] |= 1;
1337 relocation = sgot->output_offset + off - got_base;
1340 break;
1342 case R_SPARC_WPLT30:
1343 /* Relocation is to the entry for this symbol in the
1344 procedure linkage table. */
1346 /* The Solaris native assembler will generate a WPLT30 reloc
1347 for a local symbol if you assemble a call from one
1348 section to another when using -K pic. We treat it as
1349 WDISP30. */
1350 if (h == NULL)
1351 break;
1353 if (h->plt.offset == (bfd_vma) -1)
1355 /* We didn't make a PLT entry for this symbol. This
1356 happens when statically linking PIC code, or when
1357 using -Bsymbolic. */
1358 break;
1361 if (splt == NULL)
1363 splt = bfd_get_section_by_name (dynobj, ".plt");
1364 BFD_ASSERT (splt != NULL);
1367 relocation = (splt->output_section->vma
1368 + splt->output_offset
1369 + h->plt.offset);
1370 break;
1372 case R_SPARC_PC10:
1373 case R_SPARC_PC22:
1374 if (h != NULL
1375 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1376 break;
1377 /* Fall through. */
1378 case R_SPARC_DISP8:
1379 case R_SPARC_DISP16:
1380 case R_SPARC_DISP32:
1381 case R_SPARC_WDISP30:
1382 case R_SPARC_WDISP22:
1383 case R_SPARC_WDISP19:
1384 case R_SPARC_WDISP16:
1385 if (h == NULL
1386 || (info->symbolic
1387 && (h->elf_link_hash_flags
1388 & ELF_LINK_HASH_DEF_REGULAR) != 0))
1389 break;
1390 /* Fall through. */
1391 case R_SPARC_8:
1392 case R_SPARC_16:
1393 case R_SPARC_32:
1394 case R_SPARC_HI22:
1395 case R_SPARC_22:
1396 case R_SPARC_13:
1397 case R_SPARC_LO10:
1398 case R_SPARC_UA32:
1399 if (info->shared)
1401 Elf_Internal_Rela outrel;
1402 boolean skip;
1404 /* When generating a shared object, these relocations
1405 are copied into the output file to be resolved at run
1406 time. */
1408 if (sreloc == NULL)
1410 const char *name;
1412 name = (bfd_elf_string_from_elf_section
1413 (input_bfd,
1414 elf_elfheader (input_bfd)->e_shstrndx,
1415 elf_section_data (input_section)->rel_hdr.sh_name));
1416 if (name == NULL)
1417 return false;
1419 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1420 && strcmp (bfd_get_section_name (input_bfd,
1421 input_section),
1422 name + 5) == 0);
1424 sreloc = bfd_get_section_by_name (dynobj, name);
1425 BFD_ASSERT (sreloc != NULL);
1428 skip = false;
1430 if (elf_section_data (input_section)->stab_info == NULL)
1431 outrel.r_offset = rel->r_offset;
1432 else
1434 bfd_vma off;
1436 off = (_bfd_stab_section_offset
1437 (output_bfd, &elf_hash_table (info)->stab_info,
1438 input_section,
1439 &elf_section_data (input_section)->stab_info,
1440 rel->r_offset));
1441 if (off == (bfd_vma) -1)
1442 skip = true;
1443 outrel.r_offset = off;
1446 outrel.r_offset += (input_section->output_section->vma
1447 + input_section->output_offset);
1449 if (skip)
1450 memset (&outrel, 0, sizeof outrel);
1451 /* h->dynindx may be -1 if the symbol was marked to
1452 become local. */
1453 else if (h != NULL
1454 && ((! info->symbolic && h->dynindx != -1)
1455 || (h->elf_link_hash_flags
1456 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1458 BFD_ASSERT (h->dynindx != -1);
1459 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1460 outrel.r_addend = rel->r_addend;
1462 else
1464 if (r_type == R_SPARC_32)
1466 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1467 outrel.r_addend = relocation + rel->r_addend;
1469 else
1471 long indx;
1473 if (h == NULL)
1474 sec = local_sections[r_symndx];
1475 else
1477 BFD_ASSERT (h->root.type == bfd_link_hash_defined
1478 || (h->root.type
1479 == bfd_link_hash_defweak));
1480 sec = h->root.u.def.section;
1482 if (sec != NULL && bfd_is_abs_section (sec))
1483 indx = 0;
1484 else if (sec == NULL || sec->owner == NULL)
1486 bfd_set_error (bfd_error_bad_value);
1487 return false;
1489 else
1491 asection *osec;
1493 osec = sec->output_section;
1494 indx = elf_section_data (osec)->dynindx;
1496 /* FIXME: we really should be able to link non-pic
1497 shared libraries. */
1498 if (indx == 0)
1500 BFD_FAIL ();
1501 (*_bfd_error_handler)
1502 (_("%s: probably compiled without -fPIC?"),
1503 bfd_get_filename (input_bfd));
1504 bfd_set_error (bfd_error_bad_value);
1505 return false;
1509 outrel.r_info = ELF32_R_INFO (indx, r_type);
1511 /* For non-RELATIVE dynamic relocations, we keep the
1512 same symbol, and so generally the same addend. But
1513 we do need to adjust those relocations referencing
1514 sections. */
1515 outrel.r_addend = rel->r_addend;
1516 if (r_symndx < symtab_hdr->sh_info
1517 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1518 outrel.r_addend += sec->output_offset+sym->st_value;
1522 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1523 (((Elf32_External_Rela *)
1524 sreloc->contents)
1525 + sreloc->reloc_count));
1526 ++sreloc->reloc_count;
1528 /* This reloc will be computed at runtime, so there's no
1529 need to do anything now, unless this is a RELATIVE
1530 reloc in an unallocated section. */
1531 if (skip
1532 || (input_section->flags & SEC_ALLOC) != 0
1533 || ELF32_R_TYPE (outrel.r_info) != R_SPARC_RELATIVE)
1534 continue;
1536 break;
1538 default:
1539 break;
1542 if (r_type == R_SPARC_WDISP16)
1544 bfd_vma x;
1546 relocation += rel->r_addend;
1547 relocation -= (input_section->output_section->vma
1548 + input_section->output_offset);
1549 relocation -= rel->r_offset;
1551 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
1552 x |= ((((relocation >> 2) & 0xc000) << 6)
1553 | ((relocation >> 2) & 0x3fff));
1554 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
1556 if ((bfd_signed_vma) relocation < - 0x40000
1557 || (bfd_signed_vma) relocation > 0x3ffff)
1558 r = bfd_reloc_overflow;
1559 else
1560 r = bfd_reloc_ok;
1562 else if (r_type == R_SPARC_REV32)
1564 bfd_vma x;
1566 relocation = relocation + rel->r_addend;
1568 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
1569 x = x + relocation;
1570 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
1571 r = bfd_reloc_ok;
1573 else
1574 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1575 contents, rel->r_offset,
1576 relocation, rel->r_addend);
1579 if (r != bfd_reloc_ok)
1581 switch (r)
1583 default:
1584 case bfd_reloc_outofrange:
1585 abort ();
1586 case bfd_reloc_overflow:
1588 const char *name;
1590 if (h != NULL)
1591 name = h->root.root.string;
1592 else
1594 name = bfd_elf_string_from_elf_section (input_bfd,
1595 symtab_hdr->sh_link,
1596 sym->st_name);
1597 if (name == NULL)
1598 return false;
1599 if (*name == '\0')
1600 name = bfd_section_name (input_bfd, sec);
1602 if (! ((*info->callbacks->reloc_overflow)
1603 (info, name, howto->name, (bfd_vma) 0,
1604 input_bfd, input_section, rel->r_offset)))
1605 return false;
1607 break;
1612 return true;
1615 /* Finish up dynamic symbol handling. We set the contents of various
1616 dynamic sections here. */
1618 static boolean
1619 elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
1620 bfd *output_bfd;
1621 struct bfd_link_info *info;
1622 struct elf_link_hash_entry *h;
1623 Elf_Internal_Sym *sym;
1625 bfd *dynobj;
1627 dynobj = elf_hash_table (info)->dynobj;
1629 if (h->plt.offset != (bfd_vma) -1)
1631 asection *splt;
1632 asection *srela;
1633 Elf_Internal_Rela rela;
1635 /* This symbol has an entry in the procedure linkage table. Set
1636 it up. */
1638 BFD_ASSERT (h->dynindx != -1);
1640 splt = bfd_get_section_by_name (dynobj, ".plt");
1641 srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1642 BFD_ASSERT (splt != NULL && srela != NULL);
1644 /* Fill in the entry in the procedure linkage table. */
1645 bfd_put_32 (output_bfd,
1646 PLT_ENTRY_WORD0 + h->plt.offset,
1647 splt->contents + h->plt.offset);
1648 bfd_put_32 (output_bfd,
1649 (PLT_ENTRY_WORD1
1650 + (((- (h->plt.offset + 4)) >> 2) & 0x3fffff)),
1651 splt->contents + h->plt.offset + 4);
1652 bfd_put_32 (output_bfd, PLT_ENTRY_WORD2,
1653 splt->contents + h->plt.offset + 8);
1655 /* Fill in the entry in the .rela.plt section. */
1656 rela.r_offset = (splt->output_section->vma
1657 + splt->output_offset
1658 + h->plt.offset);
1659 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
1660 rela.r_addend = 0;
1661 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1662 ((Elf32_External_Rela *) srela->contents
1663 + h->plt.offset / PLT_ENTRY_SIZE - 4));
1665 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1667 /* Mark the symbol as undefined, rather than as defined in
1668 the .plt section. Leave the value alone. */
1669 sym->st_shndx = SHN_UNDEF;
1673 if (h->got.offset != (bfd_vma) -1)
1675 asection *sgot;
1676 asection *srela;
1677 Elf_Internal_Rela rela;
1679 /* This symbol has an entry in the global offset table. Set it
1680 up. */
1682 sgot = bfd_get_section_by_name (dynobj, ".got");
1683 srela = bfd_get_section_by_name (dynobj, ".rela.got");
1684 BFD_ASSERT (sgot != NULL && srela != NULL);
1686 rela.r_offset = (sgot->output_section->vma
1687 + sgot->output_offset
1688 + (h->got.offset &~ 1));
1690 /* If this is a -Bsymbolic link, and the symbol is defined
1691 locally, we just want to emit a RELATIVE reloc. Likewise if
1692 the symbol was forced to be local because of a version file.
1693 The entry in the global offset table will already have been
1694 initialized in the relocate_section function. */
1695 if (info->shared
1696 && (info->symbolic || h->dynindx == -1)
1697 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
1698 rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
1699 else
1701 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
1702 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
1705 rela.r_addend = 0;
1706 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1707 ((Elf32_External_Rela *) srela->contents
1708 + srela->reloc_count));
1709 ++srela->reloc_count;
1712 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
1714 asection *s;
1715 Elf_Internal_Rela rela;
1717 /* This symbols needs a copy reloc. Set it up. */
1719 BFD_ASSERT (h->dynindx != -1);
1721 s = bfd_get_section_by_name (h->root.u.def.section->owner,
1722 ".rela.bss");
1723 BFD_ASSERT (s != NULL);
1725 rela.r_offset = (h->root.u.def.value
1726 + h->root.u.def.section->output_section->vma
1727 + h->root.u.def.section->output_offset);
1728 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY);
1729 rela.r_addend = 0;
1730 bfd_elf32_swap_reloca_out (output_bfd, &rela,
1731 ((Elf32_External_Rela *) s->contents
1732 + s->reloc_count));
1733 ++s->reloc_count;
1736 /* Mark some specially defined symbols as absolute. */
1737 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1738 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
1739 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
1740 sym->st_shndx = SHN_ABS;
1742 return true;
1745 /* Finish up the dynamic sections. */
1747 static boolean
1748 elf32_sparc_finish_dynamic_sections (output_bfd, info)
1749 bfd *output_bfd;
1750 struct bfd_link_info *info;
1752 bfd *dynobj;
1753 asection *sdyn;
1754 asection *sgot;
1756 dynobj = elf_hash_table (info)->dynobj;
1758 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1760 if (elf_hash_table (info)->dynamic_sections_created)
1762 asection *splt;
1763 Elf32_External_Dyn *dyncon, *dynconend;
1765 splt = bfd_get_section_by_name (dynobj, ".plt");
1766 BFD_ASSERT (splt != NULL && sdyn != NULL);
1768 dyncon = (Elf32_External_Dyn *) sdyn->contents;
1769 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1770 for (; dyncon < dynconend; dyncon++)
1772 Elf_Internal_Dyn dyn;
1773 const char *name;
1774 boolean size;
1776 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1778 switch (dyn.d_tag)
1780 case DT_PLTGOT: name = ".plt"; size = false; break;
1781 case DT_PLTRELSZ: name = ".rela.plt"; size = true; break;
1782 case DT_JMPREL: name = ".rela.plt"; size = false; break;
1783 default: name = NULL; size = false; break;
1786 if (name != NULL)
1788 asection *s;
1790 s = bfd_get_section_by_name (output_bfd, name);
1791 if (s == NULL)
1792 dyn.d_un.d_val = 0;
1793 else
1795 if (! size)
1796 dyn.d_un.d_ptr = s->vma;
1797 else
1799 if (s->_cooked_size != 0)
1800 dyn.d_un.d_val = s->_cooked_size;
1801 else
1802 dyn.d_un.d_val = s->_raw_size;
1805 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1809 /* Clear the first four entries in the procedure linkage table,
1810 and put a nop in the last four bytes. */
1811 if (splt->_raw_size > 0)
1813 memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE);
1814 bfd_put_32 (output_bfd, SPARC_NOP,
1815 splt->contents + splt->_raw_size - 4);
1818 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
1819 PLT_ENTRY_SIZE;
1822 /* Set the first entry in the global offset table to the address of
1823 the dynamic section. */
1824 sgot = bfd_get_section_by_name (dynobj, ".got");
1825 BFD_ASSERT (sgot != NULL);
1826 if (sgot->_raw_size > 0)
1828 if (sdyn == NULL)
1829 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
1830 else
1831 bfd_put_32 (output_bfd,
1832 sdyn->output_section->vma + sdyn->output_offset,
1833 sgot->contents);
1836 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1838 if (info->shared)
1840 asection *sdynsym;
1841 asection *s;
1842 Elf_Internal_Sym sym;
1843 int c;
1845 /* Set up the section symbols for the output sections. */
1847 sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
1848 BFD_ASSERT (sdynsym != NULL);
1850 sym.st_size = 0;
1851 sym.st_name = 0;
1852 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
1853 sym.st_other = 0;
1855 c = 0;
1856 for (s = output_bfd->sections; s != NULL; s = s->next)
1858 int indx;
1860 if (elf_section_data (s)->dynindx == 0)
1861 continue;
1863 sym.st_value = s->vma;
1865 indx = elf_section_data (s)->this_idx;
1866 BFD_ASSERT (indx > 0);
1867 sym.st_shndx = indx;
1869 bfd_elf32_swap_symbol_out (output_bfd, &sym,
1870 (PTR) (((Elf32_External_Sym *)
1871 sdynsym->contents)
1872 + elf_section_data (s)->dynindx));
1874 ++c;
1877 /* Set the sh_info field of the output .dynsym section to the
1878 index of the first global symbol. */
1879 elf_section_data (sdynsym->output_section)->this_hdr.sh_info = c + 1;
1882 return true;
1885 /* Functions for dealing with the e_flags field.
1887 We don't define set_private_flags or copy_private_bfd_data because
1888 the only currently defined values are based on the bfd mach number,
1889 so we use the latter instead and defer setting e_flags until the
1890 file is written out. */
1892 /* Merge backend specific data from an object file to the output
1893 object file when linking. */
1895 static boolean
1896 elf32_sparc_merge_private_bfd_data (ibfd, obfd)
1897 bfd *ibfd;
1898 bfd *obfd;
1900 boolean error;
1901 static int previous_ibfd_e_flags = -1;
1903 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1904 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1905 return true;
1907 error = false;
1909 #if 0
1910 /* ??? The native linker doesn't do this so we can't (otherwise gcc would
1911 have to know which linker is being used). Instead, the native linker
1912 bumps up the architecture level when it has to. However, I still think
1913 warnings like these are good, so it would be nice to have them turned on
1914 by some option. */
1916 /* If the output machine is normal sparc, we can't allow v9 input files. */
1917 if (bfd_get_mach (obfd) == bfd_mach_sparc
1918 && (bfd_get_mach (ibfd) == bfd_mach_sparc_v8plus
1919 || bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa))
1921 error = true;
1922 (*_bfd_error_handler)
1923 (_("%s: compiled for a v8plus system and target is v8"),
1924 bfd_get_filename (ibfd));
1926 /* If the output machine is v9, we can't allow v9+vis input files. */
1927 if (bfd_get_mach (obfd) == bfd_mach_sparc_v8plus
1928 && bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa)
1930 error = true;
1931 (*_bfd_error_handler)
1932 (_("%s: compiled for a v8plusa system and target is v8plus"),
1933 bfd_get_filename (ibfd));
1935 #else
1936 if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
1938 error = true;
1939 (*_bfd_error_handler)
1940 (_("%s: compiled for a 64 bit system and target is 32 bit"),
1941 bfd_get_filename (ibfd));
1943 else if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
1944 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
1945 #endif
1947 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
1948 != previous_ibfd_e_flags)
1949 && previous_ibfd_e_flags >= 0)
1951 (*_bfd_error_handler)
1952 (_("%s: linking little endian files with big endian files"),
1953 bfd_get_filename (ibfd));
1954 error = true;
1956 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
1958 if (error)
1960 bfd_set_error (bfd_error_bad_value);
1961 return false;
1964 return true;
1967 /* Set the right machine number. */
1969 static boolean
1970 elf32_sparc_object_p (abfd)
1971 bfd *abfd;
1973 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
1975 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
1976 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1977 bfd_mach_sparc_v8plusa);
1978 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
1979 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1980 bfd_mach_sparc_v8plus);
1981 else
1982 return false;
1984 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
1985 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
1986 bfd_mach_sparc_sparclite_le);
1987 else
1988 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
1991 /* The final processing done just before writing out the object file.
1992 We need to set the e_machine field appropriately. */
1994 static void
1995 elf32_sparc_final_write_processing (abfd, linker)
1996 bfd *abfd;
1997 boolean linker;
1999 switch (bfd_get_mach (abfd))
2001 case bfd_mach_sparc :
2002 break; /* nothing to do */
2003 case bfd_mach_sparc_v8plus :
2004 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
2005 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
2006 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
2007 break;
2008 case bfd_mach_sparc_v8plusa :
2009 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
2010 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
2011 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
2012 break;
2013 case bfd_mach_sparc_sparclite_le :
2014 elf_elfheader (abfd)->e_machine = EM_SPARC;
2015 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
2016 break;
2017 default :
2018 abort ();
2019 break;
2023 #define TARGET_BIG_SYM bfd_elf32_sparc_vec
2024 #define TARGET_BIG_NAME "elf32-sparc"
2025 #define ELF_ARCH bfd_arch_sparc
2026 #define ELF_MACHINE_CODE EM_SPARC
2027 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
2028 #define ELF_MAXPAGESIZE 0x10000
2030 #define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
2031 #define elf_info_to_howto elf32_sparc_info_to_howto
2032 #define elf_backend_create_dynamic_sections \
2033 _bfd_elf_create_dynamic_sections
2034 #define elf_backend_check_relocs elf32_sparc_check_relocs
2035 #define elf_backend_adjust_dynamic_symbol \
2036 elf32_sparc_adjust_dynamic_symbol
2037 #define elf_backend_size_dynamic_sections \
2038 elf32_sparc_size_dynamic_sections
2039 #define elf_backend_relocate_section elf32_sparc_relocate_section
2040 #define elf_backend_finish_dynamic_symbol \
2041 elf32_sparc_finish_dynamic_symbol
2042 #define elf_backend_finish_dynamic_sections \
2043 elf32_sparc_finish_dynamic_sections
2044 #define bfd_elf32_bfd_merge_private_bfd_data \
2045 elf32_sparc_merge_private_bfd_data
2046 #define elf_backend_object_p elf32_sparc_object_p
2047 #define elf_backend_final_write_processing \
2048 elf32_sparc_final_write_processing
2049 #define elf_backend_gc_mark_hook elf32_sparc_gc_mark_hook
2050 #define elf_backend_gc_sweep_hook elf32_sparc_gc_sweep_hook
2052 #define elf_backend_can_gc_sections 1
2053 #define elf_backend_want_got_plt 0
2054 #define elf_backend_plt_readonly 0
2055 #define elf_backend_want_plt_sym 1
2056 #define elf_backend_got_header_size 4
2057 #define elf_backend_plt_header_size (4*PLT_ENTRY_SIZE)
2059 #include "elf32-target.h"