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