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