2001-06-02 H.J. Lu <hjl@gnu.org>
[platform/upstream/binutils.git] / bfd / elf32-sparc.c
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 \f
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 \f
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 \f
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 \f
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 \f
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 \f
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"