xref: /netbsd-src/external/gpl3/gdb.old/dist/bfd/elfxx-sparc.c (revision 5dd36a3bc8bf2a9dec29ceb6349550414570c447)
1 /* SPARC-specific support for ELF
2    Copyright (C) 2005-2017 Free Software Foundation, Inc.
3 
4    This file is part of BFD, the Binary File Descriptor library.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 
22 /* This file handles functionality common to the different SPARC ABI's.  */
23 
24 #include "sysdep.h"
25 #include "bfd.h"
26 #include "bfdlink.h"
27 #include "libbfd.h"
28 #include "libiberty.h"
29 #include "elf-bfd.h"
30 #include "elf/sparc.h"
31 #include "opcode/sparc.h"
32 #include "elfxx-sparc.h"
33 #include "elf-vxworks.h"
34 #include "objalloc.h"
35 #include "hashtab.h"
36 
37 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
38 #define MINUS_ONE (~ (bfd_vma) 0)
39 
40 #define ABI_64_P(abfd) \
41   (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
42 
43 /* The relocation "howto" table.  */
44 
45 /* Utility for performing the standard initial work of an instruction
46    relocation.
47    *PRELOCATION will contain the relocated item.
48    *PINSN will contain the instruction from the input stream.
49    If the result is `bfd_reloc_other' the caller can continue with
50    performing the relocation.  Otherwise it must stop and return the
51    value to its caller.  */
52 
53 static bfd_reloc_status_type
54 init_insn_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
55 		 void * data, asection *input_section, bfd *output_bfd,
56 		 bfd_vma *prelocation, bfd_vma *pinsn)
57 {
58   bfd_vma relocation;
59   reloc_howto_type *howto = reloc_entry->howto;
60 
61   if (output_bfd != (bfd *) NULL
62       && (symbol->flags & BSF_SECTION_SYM) == 0
63       && (! howto->partial_inplace
64 	  || reloc_entry->addend == 0))
65     {
66       reloc_entry->address += input_section->output_offset;
67       return bfd_reloc_ok;
68     }
69 
70   /* This works because partial_inplace is FALSE.  */
71   if (output_bfd != NULL)
72     return bfd_reloc_continue;
73 
74   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
75     return bfd_reloc_outofrange;
76 
77   relocation = (symbol->value
78 		+ symbol->section->output_section->vma
79 		+ symbol->section->output_offset);
80   relocation += reloc_entry->addend;
81   if (howto->pc_relative)
82     {
83       relocation -= (input_section->output_section->vma
84 		     + input_section->output_offset);
85       relocation -= reloc_entry->address;
86     }
87 
88   *prelocation = relocation;
89   *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
90   return bfd_reloc_other;
91 }
92 
93 /* For unsupported relocs.  */
94 
95 static bfd_reloc_status_type
96 sparc_elf_notsup_reloc (bfd *abfd ATTRIBUTE_UNUSED,
97 			arelent *reloc_entry ATTRIBUTE_UNUSED,
98 			asymbol *symbol ATTRIBUTE_UNUSED,
99 			void * data ATTRIBUTE_UNUSED,
100 			asection *input_section ATTRIBUTE_UNUSED,
101 			bfd *output_bfd ATTRIBUTE_UNUSED,
102 			char **error_message ATTRIBUTE_UNUSED)
103 {
104   return bfd_reloc_notsupported;
105 }
106 
107 /* Handle the WDISP16 reloc.  */
108 
109 static bfd_reloc_status_type
110 sparc_elf_wdisp16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
111 			 void * data, asection *input_section, bfd *output_bfd,
112 			 char **error_message ATTRIBUTE_UNUSED)
113 {
114   bfd_vma relocation;
115   bfd_vma insn;
116   bfd_reloc_status_type status;
117 
118   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
119 			    input_section, output_bfd, &relocation, &insn);
120   if (status != bfd_reloc_other)
121     return status;
122 
123   insn &= ~ (bfd_vma) 0x303fff;
124   insn |= (((relocation >> 2) & 0xc000) << 6) | ((relocation >> 2) & 0x3fff);
125   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
126 
127   if ((bfd_signed_vma) relocation < - 0x40000
128       || (bfd_signed_vma) relocation > 0x3ffff)
129     return bfd_reloc_overflow;
130   else
131     return bfd_reloc_ok;
132 }
133 
134 /* Handle the WDISP10 reloc.  */
135 
136 static bfd_reloc_status_type
137 sparc_elf_wdisp10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
138 			 void * data, asection *input_section, bfd *output_bfd,
139 			 char **error_message ATTRIBUTE_UNUSED)
140 {
141   bfd_vma relocation;
142   bfd_vma insn;
143   bfd_reloc_status_type status;
144 
145   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
146 			    input_section, output_bfd, &relocation, &insn);
147   if (status != bfd_reloc_other)
148     return status;
149 
150   insn &= ~ (bfd_vma) 0x181fe0;
151   insn |= (((relocation >> 2) & 0x300) << 11)
152 	  | (((relocation >> 2) & 0xff) << 5);
153   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
154 
155   if ((bfd_signed_vma) relocation < - 0x1000
156       || (bfd_signed_vma) relocation > 0xfff)
157     return bfd_reloc_overflow;
158   else
159     return bfd_reloc_ok;
160 }
161 
162 /* Handle the HIX22 reloc.  */
163 
164 static bfd_reloc_status_type
165 sparc_elf_hix22_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
166 		       void * data, asection *input_section, bfd *output_bfd,
167 		       char **error_message ATTRIBUTE_UNUSED)
168 {
169   bfd_vma relocation;
170   bfd_vma insn;
171   bfd_reloc_status_type status;
172 
173   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
174 			    input_section, output_bfd, &relocation, &insn);
175   if (status != bfd_reloc_other)
176     return status;
177 
178   relocation ^= MINUS_ONE;
179   insn = (insn &~ (bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
180   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
181 
182   if ((relocation & ~ (bfd_vma) 0xffffffff) != 0)
183     return bfd_reloc_overflow;
184   else
185     return bfd_reloc_ok;
186 }
187 
188 /* Handle the LOX10 reloc.  */
189 
190 static bfd_reloc_status_type
191 sparc_elf_lox10_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
192 		       void * data, asection *input_section, bfd *output_bfd,
193 		       char **error_message ATTRIBUTE_UNUSED)
194 {
195   bfd_vma relocation;
196   bfd_vma insn;
197   bfd_reloc_status_type status;
198 
199   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
200 			    input_section, output_bfd, &relocation, &insn);
201   if (status != bfd_reloc_other)
202     return status;
203 
204   insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
205   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
206 
207   return bfd_reloc_ok;
208 }
209 
210 static reloc_howto_type _bfd_sparc_elf_howto_table[] =
211 {
212   HOWTO(R_SPARC_NONE,      0,3, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
213   HOWTO(R_SPARC_8,         0,0, 8,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_8",       FALSE,0,0x000000ff,TRUE),
214   HOWTO(R_SPARC_16,        0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_16",      FALSE,0,0x0000ffff,TRUE),
215   HOWTO(R_SPARC_32,        0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_32",      FALSE,0,0xffffffff,TRUE),
216   HOWTO(R_SPARC_DISP8,     0,0, 8,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP8",   FALSE,0,0x000000ff,TRUE),
217   HOWTO(R_SPARC_DISP16,    0,1,16,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP16",  FALSE,0,0x0000ffff,TRUE),
218   HOWTO(R_SPARC_DISP32,    0,2,32,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP32",  FALSE,0,0xffffffff,TRUE),
219   HOWTO(R_SPARC_WDISP30,   2,2,30,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP30", FALSE,0,0x3fffffff,TRUE),
220   HOWTO(R_SPARC_WDISP22,   2,2,22,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP22", FALSE,0,0x003fffff,TRUE),
221   HOWTO(R_SPARC_HI22,     10,2,22,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HI22",    FALSE,0,0x003fffff,TRUE),
222   HOWTO(R_SPARC_22,        0,2,22,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_22",      FALSE,0,0x003fffff,TRUE),
223   HOWTO(R_SPARC_13,        0,2,13,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_13",      FALSE,0,0x00001fff,TRUE),
224   HOWTO(R_SPARC_LO10,      0,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LO10",    FALSE,0,0x000003ff,TRUE),
225   HOWTO(R_SPARC_GOT10,     0,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT10",   FALSE,0,0x000003ff,TRUE),
226   HOWTO(R_SPARC_GOT13,     0,2,13,FALSE,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_GOT13",   FALSE,0,0x00001fff,TRUE),
227   HOWTO(R_SPARC_GOT22,    10,2,22,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT22",   FALSE,0,0x003fffff,TRUE),
228   HOWTO(R_SPARC_PC10,      0,2,10,TRUE, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC10",    FALSE,0,0x000003ff,TRUE),
229   HOWTO(R_SPARC_PC22,     10,2,22,TRUE, 0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PC22",    FALSE,0,0x003fffff,TRUE),
230   HOWTO(R_SPARC_WPLT30,    2,2,30,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WPLT30",  FALSE,0,0x3fffffff,TRUE),
231   HOWTO(R_SPARC_COPY,      0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_COPY",    FALSE,0,0x00000000,TRUE),
232   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),
233   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),
234   HOWTO(R_SPARC_RELATIVE,  0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_RELATIVE",FALSE,0,0x00000000,TRUE),
235   HOWTO(R_SPARC_UA32,      0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA32",    FALSE,0,0xffffffff,TRUE),
236   HOWTO(R_SPARC_PLT32,     0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT32",   FALSE,0,0xffffffff,TRUE),
237   HOWTO(R_SPARC_HIPLT22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_HIPLT22",  FALSE,0,0x00000000,TRUE),
238   HOWTO(R_SPARC_LOPLT10,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_LOPLT10",  FALSE,0,0x00000000,TRUE),
239   HOWTO(R_SPARC_PCPLT32,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT32",  FALSE,0,0x00000000,TRUE),
240   HOWTO(R_SPARC_PCPLT22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT22",  FALSE,0,0x00000000,TRUE),
241   HOWTO(R_SPARC_PCPLT10,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT10",  FALSE,0,0x00000000,TRUE),
242   HOWTO(R_SPARC_10,        0,2,10,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_10",      FALSE,0,0x000003ff,TRUE),
243   HOWTO(R_SPARC_11,        0,2,11,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_11",      FALSE,0,0x000007ff,TRUE),
244   HOWTO(R_SPARC_64,        0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_64",      FALSE,0,MINUS_ONE, TRUE),
245   HOWTO(R_SPARC_OLO10,     0,2,13,FALSE,0,complain_overflow_signed,  sparc_elf_notsup_reloc, "R_SPARC_OLO10",   FALSE,0,0x00001fff,TRUE),
246   HOWTO(R_SPARC_HH22,     42,2,22,FALSE,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_HH22",    FALSE,0,0x003fffff,TRUE),
247   HOWTO(R_SPARC_HM10,     32,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HM10",    FALSE,0,0x000003ff,TRUE),
248   HOWTO(R_SPARC_LM22,     10,2,22,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LM22",    FALSE,0,0x003fffff,TRUE),
249   HOWTO(R_SPARC_PC_HH22,  42,2,22,TRUE, 0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_PC_HH22",    FALSE,0,0x003fffff,TRUE),
250   HOWTO(R_SPARC_PC_HM10,  32,2,10,TRUE, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_HM10",    FALSE,0,0x000003ff,TRUE),
251   HOWTO(R_SPARC_PC_LM22,  10,2,22,TRUE, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_LM22",    FALSE,0,0x003fffff,TRUE),
252   HOWTO(R_SPARC_WDISP16,   2,2,16,TRUE, 0,complain_overflow_signed,  sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", FALSE,0,0x00000000,TRUE),
253   HOWTO(R_SPARC_WDISP19,   2,2,19,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP19", FALSE,0,0x0007ffff,TRUE),
254   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),
255   HOWTO(R_SPARC_7,         0,2, 7,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_7",       FALSE,0,0x0000007f,TRUE),
256   HOWTO(R_SPARC_5,         0,2, 5,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_5",       FALSE,0,0x0000001f,TRUE),
257   HOWTO(R_SPARC_6,         0,2, 6,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_6",       FALSE,0,0x0000003f,TRUE),
258   HOWTO(R_SPARC_DISP64,    0,4,64,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP64",  FALSE,0,MINUS_ONE, TRUE),
259   HOWTO(R_SPARC_PLT64,     0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT64",   FALSE,0,MINUS_ONE, TRUE),
260   HOWTO(R_SPARC_HIX22,     0,4, 0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,  "R_SPARC_HIX22",   FALSE,0,MINUS_ONE, FALSE),
261   HOWTO(R_SPARC_LOX10,     0,4, 0,FALSE,0,complain_overflow_dont,    sparc_elf_lox10_reloc,  "R_SPARC_LOX10",   FALSE,0,MINUS_ONE, FALSE),
262   HOWTO(R_SPARC_H44,      22,2,22,FALSE,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_H44",     FALSE,0,0x003fffff,FALSE),
263   HOWTO(R_SPARC_M44,      12,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_M44",     FALSE,0,0x000003ff,FALSE),
264   HOWTO(R_SPARC_L44,       0,2,13,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_L44",     FALSE,0,0x00000fff,FALSE),
265   HOWTO(R_SPARC_REGISTER,  0,4, 0,FALSE,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",FALSE,0,MINUS_ONE, FALSE),
266   HOWTO(R_SPARC_UA64,        0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA64",      FALSE,0,MINUS_ONE, TRUE),
267   HOWTO(R_SPARC_UA16,        0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",      FALSE,0,0x0000ffff,TRUE),
268   HOWTO(R_SPARC_TLS_GD_HI22,10,2,22,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_HI22",FALSE,0,0x003fffff,TRUE),
269   HOWTO(R_SPARC_TLS_GD_LO10,0,2,10,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_LO10",FALSE,0,0x000003ff,TRUE),
270   HOWTO(R_SPARC_TLS_GD_ADD,0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_ADD",FALSE,0,0x00000000,TRUE),
271   HOWTO(R_SPARC_TLS_GD_CALL,2,2,30,TRUE,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_TLS_GD_CALL",FALSE,0,0x3fffffff,TRUE),
272   HOWTO(R_SPARC_TLS_LDM_HI22,10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_HI22",FALSE,0,0x003fffff,TRUE),
273   HOWTO(R_SPARC_TLS_LDM_LO10,0,2,10,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_LO10",FALSE,0,0x000003ff,TRUE),
274   HOWTO(R_SPARC_TLS_LDM_ADD,0,0, 0,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_ADD",FALSE,0,0x00000000,TRUE),
275   HOWTO(R_SPARC_TLS_LDM_CALL,2,2,30,TRUE,0,complain_overflow_signed, bfd_elf_generic_reloc,  "R_SPARC_TLS_LDM_CALL",FALSE,0,0x3fffffff,TRUE),
276   HOWTO(R_SPARC_TLS_LDO_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_TLS_LDO_HIX22",FALSE,0,0x003fffff, FALSE),
277   HOWTO(R_SPARC_TLS_LDO_LOX10,0,2,0,FALSE,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_TLS_LDO_LOX10",FALSE,0,0x000003ff, FALSE),
278   HOWTO(R_SPARC_TLS_LDO_ADD,0,0, 0,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_LDO_ADD",FALSE,0,0x00000000,TRUE),
279   HOWTO(R_SPARC_TLS_IE_HI22,10,2,22,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_HI22",FALSE,0,0x003fffff,TRUE),
280   HOWTO(R_SPARC_TLS_IE_LO10,0,2,10,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LO10",FALSE,0,0x000003ff,TRUE),
281   HOWTO(R_SPARC_TLS_IE_LD,0,0, 0,FALSE,0,complain_overflow_dont,     bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LD",FALSE,0,0x00000000,TRUE),
282   HOWTO(R_SPARC_TLS_IE_LDX,0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_LDX",FALSE,0,0x00000000,TRUE),
283   HOWTO(R_SPARC_TLS_IE_ADD,0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_TLS_IE_ADD",FALSE,0,0x00000000,TRUE),
284   HOWTO(R_SPARC_TLS_LE_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_TLS_LE_HIX22",FALSE,0,0x003fffff, FALSE),
285   HOWTO(R_SPARC_TLS_LE_LOX10,0,2,0,FALSE,0,complain_overflow_dont,   sparc_elf_lox10_reloc,  "R_SPARC_TLS_LE_LOX10",FALSE,0,0x000003ff, FALSE),
286   HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD32",FALSE,0,0x00000000,TRUE),
287   HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPMOD64",FALSE,0,0x00000000,TRUE),
288   HOWTO(R_SPARC_TLS_DTPOFF32,0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",FALSE,0,0xffffffff,TRUE),
289   HOWTO(R_SPARC_TLS_DTPOFF64,0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF64",FALSE,0,MINUS_ONE,TRUE),
290   HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF32",FALSE,0,0x00000000,TRUE),
291   HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_TLS_TPOFF64",FALSE,0,0x00000000,TRUE),
292   HOWTO(R_SPARC_GOTDATA_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_HIX22",FALSE,0,0x003fffff, FALSE),
293   HOWTO(R_SPARC_GOTDATA_LOX10,0,2,0,FALSE,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_GOTDATA_LOX10",FALSE,0,0x000003ff, FALSE),
294   HOWTO(R_SPARC_GOTDATA_OP_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_GOTDATA_OP_HIX22",FALSE,0,0x003fffff, FALSE),
295   HOWTO(R_SPARC_GOTDATA_OP_LOX10,0,2,0,FALSE,0,complain_overflow_dont,  sparc_elf_lox10_reloc,  "R_SPARC_GOTDATA_OP_LOX10",FALSE,0,0x000003ff, FALSE),
296   HOWTO(R_SPARC_GOTDATA_OP,0,0, 0,FALSE,0,complain_overflow_dont,   bfd_elf_generic_reloc,  "R_SPARC_GOTDATA_OP",FALSE,0,0x00000000,TRUE),
297   HOWTO(R_SPARC_H34,12,2,22,FALSE,0,complain_overflow_unsigned,bfd_elf_generic_reloc,"R_SPARC_H34",FALSE,0,0x003fffff,FALSE),
298   HOWTO(R_SPARC_SIZE32,0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE32",FALSE,0,0xffffffff,TRUE),
299   HOWTO(R_SPARC_SIZE64,0,4,64,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_SIZE64",FALSE,0,MINUS_ONE, TRUE),
300   HOWTO(R_SPARC_WDISP10,2,2,10,TRUE, 0,complain_overflow_signed,sparc_elf_wdisp10_reloc,"R_SPARC_WDISP10",FALSE,0,0x00000000,TRUE),
301 };
302 static reloc_howto_type sparc_jmp_irel_howto =
303   HOWTO(R_SPARC_JMP_IREL,  0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_JMP_IREL",FALSE,0,0x00000000,TRUE);
304 static reloc_howto_type sparc_irelative_howto =
305   HOWTO(R_SPARC_IRELATIVE,  0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_IRELATIVE",FALSE,0,0x00000000,TRUE);
306 static reloc_howto_type sparc_vtinherit_howto =
307   HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
308 static reloc_howto_type sparc_vtentry_howto =
309   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);
310 static reloc_howto_type sparc_rev32_howto =
311   HOWTO(R_SPARC_REV32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", FALSE,0,0xffffffff,TRUE);
312 
313 reloc_howto_type *
314 _bfd_sparc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
315 				  bfd_reloc_code_real_type code)
316 {
317   /* We explicitly handle each relocation type in the switch
318      instead of using a lookup table for efficiency.  */
319   switch (code)
320     {
321     case BFD_RELOC_NONE:
322       return &_bfd_sparc_elf_howto_table[R_SPARC_NONE];
323 
324     case BFD_RELOC_8:
325       return &_bfd_sparc_elf_howto_table[R_SPARC_8];
326 
327     case BFD_RELOC_16:
328       return &_bfd_sparc_elf_howto_table[R_SPARC_16];
329 
330     case BFD_RELOC_32:
331       return &_bfd_sparc_elf_howto_table[R_SPARC_32];
332 
333     case BFD_RELOC_8_PCREL:
334       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP8];
335 
336     case BFD_RELOC_16_PCREL:
337       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP16];
338 
339     case BFD_RELOC_32_PCREL:
340       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP32];
341 
342     case BFD_RELOC_32_PCREL_S2:
343       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP30];
344 
345     case BFD_RELOC_SPARC_WDISP22:
346       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP22];
347 
348     case BFD_RELOC_HI22:
349       return &_bfd_sparc_elf_howto_table[R_SPARC_HI22];
350 
351     case BFD_RELOC_SPARC22:
352       return &_bfd_sparc_elf_howto_table[R_SPARC_22];
353 
354     case BFD_RELOC_SPARC13:
355       return &_bfd_sparc_elf_howto_table[R_SPARC_13];
356 
357     case BFD_RELOC_LO10:
358       return &_bfd_sparc_elf_howto_table[R_SPARC_LO10];
359 
360     case BFD_RELOC_SPARC_GOT10:
361       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT10];
362 
363     case BFD_RELOC_SPARC_GOT13:
364       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT13];
365 
366     case BFD_RELOC_SPARC_GOT22:
367       return &_bfd_sparc_elf_howto_table[R_SPARC_GOT22];
368 
369     case BFD_RELOC_SPARC_PC10:
370       return &_bfd_sparc_elf_howto_table[R_SPARC_PC10];
371 
372     case BFD_RELOC_SPARC_PC22:
373       return &_bfd_sparc_elf_howto_table[R_SPARC_PC22];
374 
375     case BFD_RELOC_SPARC_WPLT30:
376       return &_bfd_sparc_elf_howto_table[R_SPARC_WPLT30];
377 
378     case BFD_RELOC_SPARC_COPY:
379       return &_bfd_sparc_elf_howto_table[R_SPARC_COPY];
380 
381     case BFD_RELOC_SPARC_GLOB_DAT:
382       return &_bfd_sparc_elf_howto_table[R_SPARC_GLOB_DAT];
383 
384     case BFD_RELOC_SPARC_JMP_SLOT:
385       return &_bfd_sparc_elf_howto_table[R_SPARC_JMP_SLOT];
386 
387     case BFD_RELOC_SPARC_RELATIVE:
388       return &_bfd_sparc_elf_howto_table[R_SPARC_RELATIVE];
389 
390     case BFD_RELOC_SPARC_UA32:
391       return &_bfd_sparc_elf_howto_table[R_SPARC_UA32];
392 
393     case BFD_RELOC_SPARC_PLT32:
394       return &_bfd_sparc_elf_howto_table[R_SPARC_PLT32];
395 
396     case BFD_RELOC_SPARC_10:
397       return &_bfd_sparc_elf_howto_table[R_SPARC_10];
398 
399     case BFD_RELOC_SPARC_11:
400       return &_bfd_sparc_elf_howto_table[R_SPARC_11];
401 
402     case BFD_RELOC_SPARC_64:
403       return &_bfd_sparc_elf_howto_table[R_SPARC_64];
404 
405     case BFD_RELOC_SPARC_OLO10:
406       return &_bfd_sparc_elf_howto_table[R_SPARC_OLO10];
407 
408     case BFD_RELOC_SPARC_HH22:
409       return &_bfd_sparc_elf_howto_table[R_SPARC_HH22];
410 
411     case BFD_RELOC_SPARC_HM10:
412       return &_bfd_sparc_elf_howto_table[R_SPARC_HM10];
413 
414     case BFD_RELOC_SPARC_LM22:
415       return &_bfd_sparc_elf_howto_table[R_SPARC_LM22];
416 
417     case BFD_RELOC_SPARC_PC_HH22:
418       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HH22];
419 
420     case BFD_RELOC_SPARC_PC_HM10:
421       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_HM10];
422 
423     case BFD_RELOC_SPARC_PC_LM22:
424       return &_bfd_sparc_elf_howto_table[R_SPARC_PC_LM22];
425 
426     case BFD_RELOC_SPARC_WDISP16:
427       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP16];
428 
429     case BFD_RELOC_SPARC_WDISP19:
430       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP19];
431 
432     case BFD_RELOC_SPARC_7:
433       return &_bfd_sparc_elf_howto_table[R_SPARC_7];
434 
435     case BFD_RELOC_SPARC_5:
436       return &_bfd_sparc_elf_howto_table[R_SPARC_5];
437 
438     case BFD_RELOC_SPARC_6:
439       return &_bfd_sparc_elf_howto_table[R_SPARC_6];
440 
441     case BFD_RELOC_SPARC_DISP64:
442       return &_bfd_sparc_elf_howto_table[R_SPARC_DISP64];
443 
444     case BFD_RELOC_SPARC_PLT64:
445       return &_bfd_sparc_elf_howto_table[R_SPARC_PLT64];
446 
447     case BFD_RELOC_SPARC_HIX22:
448       return &_bfd_sparc_elf_howto_table[R_SPARC_HIX22];
449 
450     case BFD_RELOC_SPARC_LOX10:
451       return &_bfd_sparc_elf_howto_table[R_SPARC_LOX10];
452 
453     case BFD_RELOC_SPARC_H44:
454       return &_bfd_sparc_elf_howto_table[R_SPARC_H44];
455 
456     case BFD_RELOC_SPARC_M44:
457       return &_bfd_sparc_elf_howto_table[R_SPARC_M44];
458 
459     case BFD_RELOC_SPARC_L44:
460       return &_bfd_sparc_elf_howto_table[R_SPARC_L44];
461 
462     case BFD_RELOC_SPARC_REGISTER:
463       return &_bfd_sparc_elf_howto_table[R_SPARC_REGISTER];
464 
465     case BFD_RELOC_SPARC_UA64:
466       return &_bfd_sparc_elf_howto_table[R_SPARC_UA64];
467 
468     case BFD_RELOC_SPARC_UA16:
469       return &_bfd_sparc_elf_howto_table[R_SPARC_UA16];
470 
471     case BFD_RELOC_SPARC_TLS_GD_HI22:
472       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_HI22];
473 
474     case BFD_RELOC_SPARC_TLS_GD_LO10:
475       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_LO10];
476 
477     case BFD_RELOC_SPARC_TLS_GD_ADD:
478       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_ADD];
479 
480     case BFD_RELOC_SPARC_TLS_GD_CALL:
481       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_GD_CALL];
482 
483     case BFD_RELOC_SPARC_TLS_LDM_HI22:
484       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_HI22];
485 
486     case BFD_RELOC_SPARC_TLS_LDM_LO10:
487       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_LO10];
488 
489     case BFD_RELOC_SPARC_TLS_LDM_ADD:
490       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_ADD];
491 
492     case BFD_RELOC_SPARC_TLS_LDM_CALL:
493       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDM_CALL];
494 
495     case BFD_RELOC_SPARC_TLS_LDO_HIX22:
496       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_HIX22];
497 
498     case BFD_RELOC_SPARC_TLS_LDO_LOX10:
499       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_LOX10];
500 
501     case BFD_RELOC_SPARC_TLS_LDO_ADD:
502       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LDO_ADD];
503 
504     case BFD_RELOC_SPARC_TLS_IE_HI22:
505       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_HI22];
506 
507     case BFD_RELOC_SPARC_TLS_IE_LO10:
508       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LO10];
509 
510     case BFD_RELOC_SPARC_TLS_IE_LD:
511       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LD];
512 
513     case BFD_RELOC_SPARC_TLS_IE_LDX:
514       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_LDX];
515 
516     case BFD_RELOC_SPARC_TLS_IE_ADD:
517       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_IE_ADD];
518 
519     case BFD_RELOC_SPARC_TLS_LE_HIX22:
520       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_HIX22];
521 
522     case BFD_RELOC_SPARC_TLS_LE_LOX10:
523       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_LE_LOX10];
524 
525     case BFD_RELOC_SPARC_TLS_DTPMOD32:
526       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD32];
527 
528     case BFD_RELOC_SPARC_TLS_DTPMOD64:
529       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPMOD64];
530 
531     case BFD_RELOC_SPARC_TLS_DTPOFF32:
532       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF32];
533 
534     case BFD_RELOC_SPARC_TLS_DTPOFF64:
535       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_DTPOFF64];
536 
537     case BFD_RELOC_SPARC_TLS_TPOFF32:
538       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF32];
539 
540     case BFD_RELOC_SPARC_TLS_TPOFF64:
541       return &_bfd_sparc_elf_howto_table[R_SPARC_TLS_TPOFF64];
542 
543     case BFD_RELOC_SPARC_GOTDATA_HIX22:
544       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_HIX22];
545 
546     case BFD_RELOC_SPARC_GOTDATA_LOX10:
547       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_LOX10];
548 
549     case BFD_RELOC_SPARC_GOTDATA_OP_HIX22:
550       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_HIX22];
551 
552     case BFD_RELOC_SPARC_GOTDATA_OP_LOX10:
553       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP_LOX10];
554 
555     case BFD_RELOC_SPARC_GOTDATA_OP:
556       return &_bfd_sparc_elf_howto_table[R_SPARC_GOTDATA_OP];
557 
558     case BFD_RELOC_SPARC_H34:
559       return &_bfd_sparc_elf_howto_table[R_SPARC_H34];
560 
561     case BFD_RELOC_SPARC_SIZE32:
562       return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE32];
563 
564     case BFD_RELOC_SPARC_SIZE64:
565       return &_bfd_sparc_elf_howto_table[R_SPARC_SIZE64];
566 
567     case BFD_RELOC_SPARC_WDISP10:
568       return &_bfd_sparc_elf_howto_table[R_SPARC_WDISP10];
569 
570     case BFD_RELOC_SPARC_JMP_IREL:
571       return &sparc_jmp_irel_howto;
572 
573     case BFD_RELOC_SPARC_IRELATIVE:
574       return &sparc_irelative_howto;
575 
576     case BFD_RELOC_VTABLE_INHERIT:
577       return &sparc_vtinherit_howto;
578 
579     case BFD_RELOC_VTABLE_ENTRY:
580       return &sparc_vtentry_howto;
581 
582     case BFD_RELOC_SPARC_REV32:
583       return &sparc_rev32_howto;
584 
585     default:
586       break;
587     }
588     bfd_set_error (bfd_error_bad_value);
589     return NULL;
590 }
591 
592 reloc_howto_type *
593 _bfd_sparc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
594 				  const char *r_name)
595 {
596   unsigned int i;
597 
598   for (i = 0;
599        i < (sizeof (_bfd_sparc_elf_howto_table)
600 	    / sizeof (_bfd_sparc_elf_howto_table[0]));
601        i++)
602     if (_bfd_sparc_elf_howto_table[i].name != NULL
603 	&& strcasecmp (_bfd_sparc_elf_howto_table[i].name, r_name) == 0)
604       return &_bfd_sparc_elf_howto_table[i];
605 
606   if (strcasecmp (sparc_vtinherit_howto.name, r_name) == 0)
607     return &sparc_vtinherit_howto;
608   if (strcasecmp (sparc_vtentry_howto.name, r_name) == 0)
609     return &sparc_vtentry_howto;
610   if (strcasecmp (sparc_rev32_howto.name, r_name) == 0)
611     return &sparc_rev32_howto;
612 
613   return NULL;
614 }
615 
616 reloc_howto_type *
617 _bfd_sparc_elf_info_to_howto_ptr (unsigned int r_type)
618 {
619   switch (r_type)
620     {
621     case R_SPARC_JMP_IREL:
622       return &sparc_jmp_irel_howto;
623 
624     case R_SPARC_IRELATIVE:
625       return &sparc_irelative_howto;
626 
627     case R_SPARC_GNU_VTINHERIT:
628       return &sparc_vtinherit_howto;
629 
630     case R_SPARC_GNU_VTENTRY:
631       return &sparc_vtentry_howto;
632 
633     case R_SPARC_REV32:
634       return &sparc_rev32_howto;
635 
636     default:
637       if (r_type >= (unsigned int) R_SPARC_max_std)
638 	{
639 	  _bfd_error_handler (_("invalid relocation type %d"), (int) r_type);
640 	  r_type = R_SPARC_NONE;
641 	}
642       return &_bfd_sparc_elf_howto_table[r_type];
643     }
644 }
645 
646 /* Both 32-bit and 64-bit sparc encode this in an identical manner,
647    so just take advantage of that.  */
648 #define SPARC_ELF_R_TYPE(r_info)	\
649 	((r_info) & 0xff)
650 
651 void
652 _bfd_sparc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
653 			      Elf_Internal_Rela *dst)
654 {
655   unsigned int r_type = SPARC_ELF_R_TYPE (dst->r_info);
656 
657   cache_ptr->howto = _bfd_sparc_elf_info_to_howto_ptr (r_type);
658 }
659 
660 
661 /* The nop opcode we use.  */
662 #define SPARC_NOP 0x01000000
663 
664 #define SPARC_INSN_BYTES	4
665 
666 /* The SPARC linker needs to keep track of the number of relocs that it
667    decides to copy as dynamic relocs in check_relocs for each symbol.
668    This is so that it can later discard them if they are found to be
669    unnecessary.  We store the information in a field extending the
670    regular ELF linker hash table.  */
671 
672 struct _bfd_sparc_elf_dyn_relocs
673 {
674   struct _bfd_sparc_elf_dyn_relocs *next;
675 
676   /* The input section of the reloc.  */
677   asection *sec;
678 
679   /* Total number of relocs copied for the input section.  */
680   bfd_size_type count;
681 
682   /* Number of pc-relative relocs copied for the input section.  */
683   bfd_size_type pc_count;
684 };
685 
686 /* Is an undefined weak symbol resolved to 0 ?
687    Reference to an undefined weak symbol is resolved to 0 when
688    building an executable if it isn't dynamic and
689    1. Has non-GOT/non-PLT relocations in text section.
690    Or
691    2. Has no GOT/PLT relocation.  */
692 #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH)               \
693   ((EH)->elf.root.type == bfd_link_hash_undefweak               \
694    && bfd_link_executable (INFO)                                \
695    && (_bfd_sparc_elf_hash_table (INFO)->interp == NULL         \
696        || !(EH)->has_got_reloc                                  \
697        || (EH)->has_non_got_reloc                               \
698        || !(INFO)->dynamic_undefined_weak))
699 
700 /* SPARC ELF linker hash entry.  */
701 
702 struct _bfd_sparc_elf_link_hash_entry
703 {
704   struct elf_link_hash_entry elf;
705 
706   /* Track dynamic relocs copied for this symbol.  */
707   struct _bfd_sparc_elf_dyn_relocs *dyn_relocs;
708 
709 #define GOT_UNKNOWN     0
710 #define GOT_NORMAL      1
711 #define GOT_TLS_GD      2
712 #define GOT_TLS_IE      3
713   unsigned char tls_type;
714 
715     /* Symbol has GOT or PLT relocations.  */
716   unsigned int has_got_reloc : 1;
717 
718   /* Symbol has non-GOT/non-PLT relocations in text sections.  */
719   unsigned int has_non_got_reloc : 1;
720 
721 };
722 
723 #define _bfd_sparc_elf_hash_entry(ent) ((struct _bfd_sparc_elf_link_hash_entry *)(ent))
724 
725 struct _bfd_sparc_elf_obj_tdata
726 {
727   struct elf_obj_tdata root;
728 
729   /* tls_type for each local got entry.  */
730   char *local_got_tls_type;
731 
732   /* TRUE if TLS GD relocs has been seen for this object.  */
733   bfd_boolean has_tlsgd;
734 };
735 
736 #define _bfd_sparc_elf_tdata(abfd) \
737   ((struct _bfd_sparc_elf_obj_tdata *) (abfd)->tdata.any)
738 
739 #define _bfd_sparc_elf_local_got_tls_type(abfd) \
740   (_bfd_sparc_elf_tdata (abfd)->local_got_tls_type)
741 
742 #define is_sparc_elf(bfd)				\
743   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
744    && elf_tdata (bfd) != NULL				\
745    && elf_object_id (bfd) == SPARC_ELF_DATA)
746 
747 bfd_boolean
748 _bfd_sparc_elf_mkobject (bfd *abfd)
749 {
750   return bfd_elf_allocate_object (abfd, sizeof (struct _bfd_sparc_elf_obj_tdata),
751 				  SPARC_ELF_DATA);
752 }
753 
754 static void
755 sparc_put_word_32 (bfd *abfd, bfd_vma val, void *ptr)
756 {
757   bfd_put_32 (abfd, val, ptr);
758 }
759 
760 static void
761 sparc_put_word_64 (bfd *abfd, bfd_vma val, void *ptr)
762 {
763   bfd_put_64 (abfd, val, ptr);
764 }
765 
766 static void
767 sparc_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
768 {
769   const struct elf_backend_data *bed;
770   bfd_byte *loc;
771 
772   bed = get_elf_backend_data (abfd);
773   loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
774   bed->s->swap_reloca_out (abfd, rel, loc);
775 }
776 
777 static bfd_vma
778 sparc_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
779 		     bfd_vma rel_index ATTRIBUTE_UNUSED,
780 		     bfd_vma type ATTRIBUTE_UNUSED)
781 {
782   return ELF64_R_INFO (rel_index,
783 		       (in_rel ?
784 			ELF64_R_TYPE_INFO (ELF64_R_TYPE_DATA (in_rel->r_info),
785 					   type) : type));
786 }
787 
788 static bfd_vma
789 sparc_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
790 		     bfd_vma rel_index, bfd_vma type)
791 {
792   return ELF32_R_INFO (rel_index, type);
793 }
794 
795 static bfd_vma
796 sparc_elf_r_symndx_64 (bfd_vma r_info)
797 {
798   bfd_vma r_symndx = ELF32_R_SYM (r_info);
799   return (r_symndx >> 24);
800 }
801 
802 static bfd_vma
803 sparc_elf_r_symndx_32 (bfd_vma r_info)
804 {
805   return ELF32_R_SYM (r_info);
806 }
807 
808 /* PLT/GOT stuff */
809 
810 #define PLT32_ENTRY_SIZE 12
811 #define PLT32_HEADER_SIZE	(4 * PLT32_ENTRY_SIZE)
812 
813 /* The first four entries in a 32-bit procedure linkage table are reserved,
814    and the initial contents are unimportant (we zero them out).
815    Subsequent entries look like this.  See the SVR4 ABI SPARC
816    supplement to see how this works.  */
817 
818 /* sethi %hi(.-.plt0),%g1.  We fill in the address later.  */
819 #define PLT32_ENTRY_WORD0 0x03000000
820 /* b,a .plt0.  We fill in the offset later.  */
821 #define PLT32_ENTRY_WORD1 0x30800000
822 /* nop.  */
823 #define PLT32_ENTRY_WORD2 SPARC_NOP
824 
825 static int
826 sparc32_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
827 			 bfd_vma max ATTRIBUTE_UNUSED,
828 			 bfd_vma *r_offset)
829 {
830       bfd_put_32 (output_bfd,
831 		  PLT32_ENTRY_WORD0 + offset,
832 		  splt->contents + offset);
833       bfd_put_32 (output_bfd,
834 		  (PLT32_ENTRY_WORD1
835 		   + (((- (offset + 4)) >> 2) & 0x3fffff)),
836 		  splt->contents + offset + 4);
837       bfd_put_32 (output_bfd, (bfd_vma) PLT32_ENTRY_WORD2,
838 		  splt->contents + offset + 8);
839 
840       *r_offset = offset;
841 
842       return offset / PLT32_ENTRY_SIZE - 4;
843 }
844 
845 /* Both the headers and the entries are icache aligned.  */
846 #define PLT64_ENTRY_SIZE	32
847 #define PLT64_HEADER_SIZE	(4 * PLT64_ENTRY_SIZE)
848 #define PLT64_LARGE_THRESHOLD	32768
849 
850 static int
851 sparc64_plt_entry_build (bfd *output_bfd, asection *splt, bfd_vma offset,
852 			 bfd_vma max, bfd_vma *r_offset)
853 {
854   unsigned char *entry = splt->contents + offset;
855   const unsigned int nop = SPARC_NOP;
856   int plt_index;
857 
858   if (offset < (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
859     {
860       unsigned int sethi, ba;
861 
862       *r_offset = offset;
863 
864       plt_index = (offset / PLT64_ENTRY_SIZE);
865 
866       sethi = 0x03000000 | (plt_index * PLT64_ENTRY_SIZE);
867       ba = 0x30680000
868 	| (((splt->contents + PLT64_ENTRY_SIZE) - (entry + 4)) / 4 & 0x7ffff);
869 
870       bfd_put_32 (output_bfd, (bfd_vma) sethi, entry);
871       bfd_put_32 (output_bfd, (bfd_vma) ba,    entry + 4);
872       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 8);
873       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 12);
874       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 16);
875       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 20);
876       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 24);
877       bfd_put_32 (output_bfd, (bfd_vma) nop,   entry + 28);
878     }
879   else
880     {
881       unsigned char *ptr;
882       unsigned int ldx;
883       int block, last_block, ofs, last_ofs, chunks_this_block;
884       const int insn_chunk_size = (6 * 4);
885       const int ptr_chunk_size = (1 * 8);
886       const int entries_per_block = 160;
887       const int block_size = entries_per_block * (insn_chunk_size
888 						  + ptr_chunk_size);
889 
890       /* Entries 32768 and higher are grouped into blocks of 160.
891 	 The blocks are further subdivided into 160 sequences of
892 	 6 instructions and 160 pointers.  If a block does not require
893 	 the full 160 entries, let's say it requires N, then there
894 	 will be N sequences of 6 instructions and N pointers.  */
895 
896       offset -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
897       max -= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE);
898 
899       block = offset / block_size;
900       last_block = max / block_size;
901       if (block != last_block)
902 	{
903 	  chunks_this_block = 160;
904 	}
905       else
906 	{
907 	  last_ofs = max % block_size;
908 	  chunks_this_block = last_ofs / (insn_chunk_size + ptr_chunk_size);
909 	}
910 
911       ofs = offset % block_size;
912 
913       plt_index = (PLT64_LARGE_THRESHOLD +
914 	       (block * 160) +
915 	       (ofs / insn_chunk_size));
916 
917       ptr = splt->contents
918 	+ (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
919 	+ (block * block_size)
920 	+ (chunks_this_block * insn_chunk_size)
921 	+ (ofs / insn_chunk_size) * ptr_chunk_size;
922 
923       *r_offset = (bfd_vma) (ptr - splt->contents);
924 
925       ldx = 0xc25be000 | ((ptr - (entry+4)) & 0x1fff);
926 
927       /* mov %o7,%g5
928 	 call .+8
929 	 nop
930 	 ldx [%o7+P],%g1
931 	 jmpl %o7+%g1,%g1
932 	 mov %g5,%o7  */
933       bfd_put_32 (output_bfd, (bfd_vma) 0x8a10000f, entry);
934       bfd_put_32 (output_bfd, (bfd_vma) 0x40000002, entry + 4);
935       bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,  entry + 8);
936       bfd_put_32 (output_bfd, (bfd_vma) ldx,        entry + 12);
937       bfd_put_32 (output_bfd, (bfd_vma) 0x83c3c001, entry + 16);
938       bfd_put_32 (output_bfd, (bfd_vma) 0x9e100005, entry + 20);
939 
940       bfd_put_64 (output_bfd, (bfd_vma) (splt->contents - (entry + 4)), ptr);
941     }
942 
943   return plt_index - 4;
944 }
945 
946 /* The format of the first PLT entry in a VxWorks executable.  */
947 static const bfd_vma sparc_vxworks_exec_plt0_entry[] =
948   {
949     0x05000000,	/* sethi  %hi(_GLOBAL_OFFSET_TABLE_+8), %g2 */
950     0x8410a000,	/* or     %g2, %lo(_GLOBAL_OFFSET_TABLE_+8), %g2 */
951     0xc4008000,	/* ld     [ %g2 ], %g2 */
952     0x81c08000,	/* jmp    %g2 */
953     0x01000000	/* nop */
954   };
955 
956 /* The format of subsequent PLT entries.  */
957 static const bfd_vma sparc_vxworks_exec_plt_entry[] =
958   {
959     0x03000000,	/* sethi  %hi(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
960     0x82106000,	/* or     %g1, %lo(_GLOBAL_OFFSET_TABLE_+f@got), %g1 */
961     0xc2004000,	/* ld     [ %g1 ], %g1 */
962     0x81c04000,	/* jmp    %g1 */
963     0x01000000,	/* nop */
964     0x03000000,	/* sethi  %hi(f@pltindex), %g1 */
965     0x10800000,	/* b      _PLT_resolve */
966     0x82106000	/* or     %g1, %lo(f@pltindex), %g1 */
967   };
968 
969 /* The format of the first PLT entry in a VxWorks shared object.  */
970 static const bfd_vma sparc_vxworks_shared_plt0_entry[] =
971   {
972     0xc405e008,	/* ld     [ %l7 + 8 ], %g2 */
973     0x81c08000,	/* jmp    %g2 */
974     0x01000000	/* nop */
975   };
976 
977 /* The format of subsequent PLT entries.  */
978 static const bfd_vma sparc_vxworks_shared_plt_entry[] =
979   {
980     0x03000000,	/* sethi  %hi(f@got), %g1 */
981     0x82106000,	/* or     %g1, %lo(f@got), %g1 */
982     0xc205c001,	/* ld     [ %l7 + %g1 ], %g1 */
983     0x81c04000,	/* jmp    %g1 */
984     0x01000000,	/* nop */
985     0x03000000,	/* sethi  %hi(f@pltindex), %g1 */
986     0x10800000,	/* b      _PLT_resolve */
987     0x82106000	/* or     %g1, %lo(f@pltindex), %g1 */
988   };
989 
990 #define SPARC_ELF_PUT_WORD(htab, bfd, val, ptr)	\
991 	htab->put_word(bfd, val, ptr)
992 
993 #define SPARC_ELF_R_INFO(htab, in_rel, index, type)	\
994 	htab->r_info(in_rel, index, type)
995 
996 #define SPARC_ELF_R_SYMNDX(htab, r_info)	\
997 	htab->r_symndx(r_info)
998 
999 #define SPARC_ELF_WORD_BYTES(htab)	\
1000 	htab->bytes_per_word
1001 
1002 #define SPARC_ELF_RELA_BYTES(htab)	\
1003 	htab->bytes_per_rela
1004 
1005 #define SPARC_ELF_DTPOFF_RELOC(htab)	\
1006 	htab->dtpoff_reloc
1007 
1008 #define SPARC_ELF_DTPMOD_RELOC(htab)	\
1009 	htab->dtpmod_reloc
1010 
1011 #define SPARC_ELF_TPOFF_RELOC(htab)	\
1012 	htab->tpoff_reloc
1013 
1014 #define SPARC_ELF_BUILD_PLT_ENTRY(htab, obfd, splt, off, max, r_off) \
1015 	htab->build_plt_entry (obfd, splt, off, max, r_off)
1016 
1017 /* Create an entry in an SPARC ELF linker hash table.  */
1018 
1019 static struct bfd_hash_entry *
1020 link_hash_newfunc (struct bfd_hash_entry *entry,
1021 		   struct bfd_hash_table *table, const char *string)
1022 {
1023   /* Allocate the structure if it has not already been allocated by a
1024      subclass.  */
1025   if (entry == NULL)
1026     {
1027       entry = bfd_hash_allocate (table,
1028 				 sizeof (struct _bfd_sparc_elf_link_hash_entry));
1029       if (entry == NULL)
1030 	return entry;
1031     }
1032 
1033   /* Call the allocation method of the superclass.  */
1034   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1035   if (entry != NULL)
1036     {
1037       struct _bfd_sparc_elf_link_hash_entry *eh;
1038 
1039       eh = (struct _bfd_sparc_elf_link_hash_entry *) entry;
1040       eh->dyn_relocs = NULL;
1041       eh->tls_type = GOT_UNKNOWN;
1042       eh->has_got_reloc = 0;
1043       eh->has_non_got_reloc = 0;
1044     }
1045 
1046   return entry;
1047 }
1048 
1049 /* The name of the dynamic interpreter.  This is put in the .interp
1050    section.  */
1051 
1052 #define ELF32_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
1053 #define ELF64_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1"
1054 
1055 /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
1056    for local symbol so that we can handle local STT_GNU_IFUNC symbols
1057    as global symbol.  We reuse indx and dynstr_index for local symbol
1058    hash since they aren't used by global symbols in this backend.  */
1059 
1060 static hashval_t
1061 elf_sparc_local_htab_hash (const void *ptr)
1062 {
1063   struct elf_link_hash_entry *h
1064     = (struct elf_link_hash_entry *) ptr;
1065   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
1066 }
1067 
1068 /* Compare local hash entries.  */
1069 
1070 static int
1071 elf_sparc_local_htab_eq (const void *ptr1, const void *ptr2)
1072 {
1073   struct elf_link_hash_entry *h1
1074      = (struct elf_link_hash_entry *) ptr1;
1075   struct elf_link_hash_entry *h2
1076     = (struct elf_link_hash_entry *) ptr2;
1077 
1078   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
1079 }
1080 
1081 /* Find and/or create a hash entry for local symbol.  */
1082 
1083 static struct elf_link_hash_entry *
1084 elf_sparc_get_local_sym_hash (struct _bfd_sparc_elf_link_hash_table *htab,
1085 			      bfd *abfd, const Elf_Internal_Rela *rel,
1086 			      bfd_boolean create)
1087 {
1088   struct _bfd_sparc_elf_link_hash_entry e, *ret;
1089   asection *sec = abfd->sections;
1090   unsigned long r_symndx;
1091   hashval_t h;
1092   void **slot;
1093 
1094   r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1095   h = ELF_LOCAL_SYMBOL_HASH (sec->id, r_symndx);
1096 
1097   e.elf.indx = sec->id;
1098   e.elf.dynstr_index = r_symndx;
1099   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
1100 				   create ? INSERT : NO_INSERT);
1101 
1102   if (!slot)
1103     return NULL;
1104 
1105   if (*slot)
1106     {
1107       ret = (struct _bfd_sparc_elf_link_hash_entry *) *slot;
1108       return &ret->elf;
1109     }
1110 
1111   ret = (struct _bfd_sparc_elf_link_hash_entry *)
1112 	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
1113 			sizeof (struct _bfd_sparc_elf_link_hash_entry));
1114   if (ret)
1115     {
1116       memset (ret, 0, sizeof (*ret));
1117       ret->elf.indx = sec->id;
1118       ret->elf.dynstr_index = r_symndx;
1119       ret->elf.dynindx = -1;
1120       ret->elf.plt.offset = (bfd_vma) -1;
1121       ret->elf.got.offset = (bfd_vma) -1;
1122       *slot = ret;
1123     }
1124   return &ret->elf;
1125 }
1126 
1127 /* Destroy a SPARC ELF linker hash table.  */
1128 
1129 static void
1130 _bfd_sparc_elf_link_hash_table_free (bfd *obfd)
1131 {
1132   struct _bfd_sparc_elf_link_hash_table *htab
1133     = (struct _bfd_sparc_elf_link_hash_table *) obfd->link.hash;
1134 
1135   if (htab->loc_hash_table)
1136     htab_delete (htab->loc_hash_table);
1137   if (htab->loc_hash_memory)
1138     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1139   _bfd_elf_link_hash_table_free (obfd);
1140 }
1141 
1142 /* Create a SPARC ELF linker hash table.  */
1143 
1144 struct bfd_link_hash_table *
1145 _bfd_sparc_elf_link_hash_table_create (bfd *abfd)
1146 {
1147   struct _bfd_sparc_elf_link_hash_table *ret;
1148   bfd_size_type amt = sizeof (struct _bfd_sparc_elf_link_hash_table);
1149 
1150   ret = (struct _bfd_sparc_elf_link_hash_table *) bfd_zmalloc (amt);
1151   if (ret == NULL)
1152     return NULL;
1153 
1154   if (ABI_64_P (abfd))
1155     {
1156       ret->put_word = sparc_put_word_64;
1157       ret->r_info = sparc_elf_r_info_64;
1158       ret->r_symndx = sparc_elf_r_symndx_64;
1159       ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF64;
1160       ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD64;
1161       ret->tpoff_reloc = R_SPARC_TLS_TPOFF64;
1162       ret->word_align_power = 3;
1163       ret->align_power_max = 4;
1164       ret->bytes_per_word = 8;
1165       ret->bytes_per_rela = sizeof (Elf64_External_Rela);
1166       ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
1167       ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
1168 
1169       ret->build_plt_entry = sparc64_plt_entry_build;
1170       ret->plt_header_size = PLT64_HEADER_SIZE;
1171       ret->plt_entry_size = PLT64_ENTRY_SIZE;
1172     }
1173   else
1174     {
1175       ret->put_word = sparc_put_word_32;
1176       ret->r_info = sparc_elf_r_info_32;
1177       ret->r_symndx = sparc_elf_r_symndx_32;
1178       ret->dtpoff_reloc = R_SPARC_TLS_DTPOFF32;
1179       ret->dtpmod_reloc = R_SPARC_TLS_DTPMOD32;
1180       ret->tpoff_reloc = R_SPARC_TLS_TPOFF32;
1181       ret->word_align_power = 2;
1182       ret->align_power_max = 3;
1183       ret->bytes_per_word = 4;
1184       ret->bytes_per_rela = sizeof (Elf32_External_Rela);
1185       ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
1186       ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
1187 
1188       ret->build_plt_entry = sparc32_plt_entry_build;
1189       ret->plt_header_size = PLT32_HEADER_SIZE;
1190       ret->plt_entry_size = PLT32_ENTRY_SIZE;
1191     }
1192 
1193   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
1194 				      sizeof (struct _bfd_sparc_elf_link_hash_entry),
1195 				      SPARC_ELF_DATA))
1196     {
1197       free (ret);
1198       return NULL;
1199     }
1200 
1201   ret->loc_hash_table = htab_try_create (1024,
1202 					 elf_sparc_local_htab_hash,
1203 					 elf_sparc_local_htab_eq,
1204 					 NULL);
1205   ret->loc_hash_memory = objalloc_create ();
1206   if (!ret->loc_hash_table || !ret->loc_hash_memory)
1207     {
1208       _bfd_sparc_elf_link_hash_table_free (abfd);
1209       return NULL;
1210     }
1211   ret->elf.root.hash_table_free = _bfd_sparc_elf_link_hash_table_free;
1212 
1213   return &ret->elf.root;
1214 }
1215 
1216 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
1217    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1218    hash table.  */
1219 
1220 bfd_boolean
1221 _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
1222 					struct bfd_link_info *info)
1223 {
1224   struct _bfd_sparc_elf_link_hash_table *htab;
1225 
1226   htab = _bfd_sparc_elf_hash_table (info);
1227   BFD_ASSERT (htab != NULL);
1228 
1229   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1230     return FALSE;
1231 
1232   if (htab->is_vxworks)
1233     {
1234       if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
1235 	return FALSE;
1236       if (bfd_link_pic (info))
1237 	{
1238 	  htab->plt_header_size
1239 	    = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt0_entry);
1240 	  htab->plt_entry_size
1241 	    = 4 * ARRAY_SIZE (sparc_vxworks_shared_plt_entry);
1242 	}
1243       else
1244 	{
1245 	  htab->plt_header_size
1246 	    = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt0_entry);
1247 	  htab->plt_entry_size
1248 	    = 4 * ARRAY_SIZE (sparc_vxworks_exec_plt_entry);
1249 	}
1250     }
1251 
1252   if (!htab->elf.splt || !htab->elf.srelplt || !htab->elf.sdynbss
1253       || (!bfd_link_pic (info) && !htab->elf.srelbss))
1254     abort ();
1255 
1256   return TRUE;
1257 }
1258 
1259 static bfd_boolean
1260 create_ifunc_sections (bfd *abfd, struct bfd_link_info *info)
1261 {
1262   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1263   struct elf_link_hash_table *htab = elf_hash_table (info);
1264   flagword flags, pltflags;
1265   asection *s;
1266 
1267   if (htab->irelifunc != NULL || htab->iplt != NULL)
1268     return TRUE;
1269 
1270   flags = bed->dynamic_sec_flags;
1271   pltflags = flags | SEC_ALLOC | SEC_CODE | SEC_LOAD;
1272 
1273   s = bfd_make_section_with_flags (abfd, ".iplt", pltflags);
1274   if (s == NULL
1275       || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
1276     return FALSE;
1277   htab->iplt = s;
1278 
1279   s = bfd_make_section_with_flags (abfd, ".rela.iplt",
1280 				   flags | SEC_READONLY);
1281   if (s == NULL
1282       || ! bfd_set_section_alignment (abfd, s,
1283 				      bed->s->log_file_align))
1284     return FALSE;
1285   htab->irelplt = s;
1286 
1287   return TRUE;
1288 }
1289 
1290 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1291 
1292 void
1293 _bfd_sparc_elf_copy_indirect_symbol (struct bfd_link_info *info,
1294 				     struct elf_link_hash_entry *dir,
1295 				     struct elf_link_hash_entry *ind)
1296 {
1297   struct _bfd_sparc_elf_link_hash_entry *edir, *eind;
1298 
1299   edir = (struct _bfd_sparc_elf_link_hash_entry *) dir;
1300   eind = (struct _bfd_sparc_elf_link_hash_entry *) ind;
1301 
1302   if (eind->dyn_relocs != NULL)
1303     {
1304       if (edir->dyn_relocs != NULL)
1305 	{
1306 	  struct _bfd_sparc_elf_dyn_relocs **pp;
1307 	  struct _bfd_sparc_elf_dyn_relocs *p;
1308 
1309 	  /* Add reloc counts against the indirect sym to the direct sym
1310 	     list.  Merge any entries against the same section.  */
1311 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1312 	    {
1313 	      struct _bfd_sparc_elf_dyn_relocs *q;
1314 
1315 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
1316 		if (q->sec == p->sec)
1317 		  {
1318 		    q->pc_count += p->pc_count;
1319 		    q->count += p->count;
1320 		    *pp = p->next;
1321 		    break;
1322 		  }
1323 	      if (q == NULL)
1324 		pp = &p->next;
1325 	    }
1326 	  *pp = edir->dyn_relocs;
1327 	}
1328 
1329       edir->dyn_relocs = eind->dyn_relocs;
1330       eind->dyn_relocs = NULL;
1331     }
1332 
1333   if (ind->root.type == bfd_link_hash_indirect
1334       && dir->got.refcount <= 0)
1335     {
1336       edir->tls_type = eind->tls_type;
1337       eind->tls_type = GOT_UNKNOWN;
1338     }
1339 
1340   /* Copy has_got_reloc and has_non_got_reloc.  */
1341   edir->has_got_reloc |= eind->has_got_reloc;
1342   edir->has_non_got_reloc |= eind->has_non_got_reloc;
1343 
1344   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1345 }
1346 
1347 static int
1348 sparc_elf_tls_transition (struct bfd_link_info *info, bfd *abfd,
1349 			  int r_type, int is_local)
1350 {
1351   if (! ABI_64_P (abfd)
1352       && r_type == R_SPARC_TLS_GD_HI22
1353       && ! _bfd_sparc_elf_tdata (abfd)->has_tlsgd)
1354     r_type = R_SPARC_REV32;
1355 
1356   if (bfd_link_pic (info))
1357     return r_type;
1358 
1359   switch (r_type)
1360     {
1361     case R_SPARC_TLS_GD_HI22:
1362       if (is_local)
1363 	return R_SPARC_TLS_LE_HIX22;
1364       return R_SPARC_TLS_IE_HI22;
1365     case R_SPARC_TLS_GD_LO10:
1366       if (is_local)
1367 	return R_SPARC_TLS_LE_LOX10;
1368       return R_SPARC_TLS_IE_LO10;
1369     case R_SPARC_TLS_IE_HI22:
1370       if (is_local)
1371 	return R_SPARC_TLS_LE_HIX22;
1372       return r_type;
1373     case R_SPARC_TLS_IE_LO10:
1374       if (is_local)
1375 	return R_SPARC_TLS_LE_LOX10;
1376       return r_type;
1377     case R_SPARC_TLS_LDM_HI22:
1378       return R_SPARC_TLS_LE_HIX22;
1379     case R_SPARC_TLS_LDM_LO10:
1380       return R_SPARC_TLS_LE_LOX10;
1381     }
1382 
1383   return r_type;
1384 }
1385 
1386 /* Look through the relocs for a section during the first phase, and
1387    allocate space in the global offset table or procedure linkage
1388    table.  */
1389 
1390 bfd_boolean
1391 _bfd_sparc_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1392 			     asection *sec, const Elf_Internal_Rela *relocs)
1393 {
1394   struct _bfd_sparc_elf_link_hash_table *htab;
1395   Elf_Internal_Shdr *symtab_hdr;
1396   struct elf_link_hash_entry **sym_hashes;
1397   const Elf_Internal_Rela *rel;
1398   const Elf_Internal_Rela *rel_end;
1399   asection *sreloc;
1400   int num_relocs;
1401   bfd_boolean checked_tlsgd = FALSE;
1402 
1403   if (bfd_link_relocatable (info))
1404     return TRUE;
1405 
1406   htab = _bfd_sparc_elf_hash_table (info);
1407   BFD_ASSERT (htab != NULL);
1408   symtab_hdr = &elf_symtab_hdr (abfd);
1409   sym_hashes = elf_sym_hashes (abfd);
1410 
1411   sreloc = NULL;
1412 
1413   if (ABI_64_P (abfd))
1414     num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (sec));
1415   else
1416     num_relocs = sec->reloc_count;
1417 
1418   BFD_ASSERT (is_sparc_elf (abfd) || num_relocs == 0);
1419 
1420   if (htab->elf.dynobj == NULL)
1421     htab->elf.dynobj = abfd;
1422   if (!create_ifunc_sections (htab->elf.dynobj, info))
1423     return FALSE;
1424 
1425   rel_end = relocs + num_relocs;
1426   for (rel = relocs; rel < rel_end; rel++)
1427     {
1428       unsigned int r_type;
1429       unsigned long r_symndx;
1430       struct elf_link_hash_entry *h;
1431       struct _bfd_sparc_elf_link_hash_entry *eh;
1432       Elf_Internal_Sym *isym;
1433 
1434       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1435       r_type = SPARC_ELF_R_TYPE (rel->r_info);
1436 
1437       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1438 	{
1439 	  /* xgettext:c-format */
1440 	  _bfd_error_handler (_("%B: bad symbol index: %d"), abfd, r_symndx);
1441 	  return FALSE;
1442 	}
1443 
1444       isym = NULL;
1445       if (r_symndx < symtab_hdr->sh_info)
1446 	{
1447 	  /* A local symbol.  */
1448 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1449 					abfd, r_symndx);
1450 	  if (isym == NULL)
1451 	    return FALSE;
1452 
1453 	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
1454 	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1455 	    {
1456 	      h = elf_sparc_get_local_sym_hash (htab, abfd, rel,
1457 						TRUE);
1458 	      if (h == NULL)
1459 		return FALSE;
1460 
1461 	      /* Fake a STT_GNU_IFUNC symbol.  */
1462 	      h->type = STT_GNU_IFUNC;
1463 	      h->def_regular = 1;
1464 	      h->ref_regular = 1;
1465 	      h->forced_local = 1;
1466 	      h->root.type = bfd_link_hash_defined;
1467 	    }
1468 	  else
1469 	    h = NULL;
1470 	}
1471       else
1472 	{
1473 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1474 	  while (h->root.type == bfd_link_hash_indirect
1475 		 || h->root.type == bfd_link_hash_warning)
1476 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1477 
1478 	  /* PR15323, ref flags aren't set for references in the same
1479 	     object.  */
1480 	  h->root.non_ir_ref = 1;
1481 	}
1482 
1483       if (h && h->type == STT_GNU_IFUNC)
1484 	{
1485 	  if (h->def_regular)
1486 	    {
1487 	      h->ref_regular = 1;
1488 	      h->plt.refcount += 1;
1489 	    }
1490 	}
1491 
1492       /* Compatibility with old R_SPARC_REV32 reloc conflicting
1493 	 with R_SPARC_TLS_GD_HI22.  */
1494       if (! ABI_64_P (abfd) && ! checked_tlsgd)
1495 	switch (r_type)
1496 	  {
1497 	  case R_SPARC_TLS_GD_HI22:
1498 	    {
1499 	      const Elf_Internal_Rela *relt;
1500 
1501 	      for (relt = rel + 1; relt < rel_end; relt++)
1502 		if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
1503 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
1504 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
1505 		  break;
1506 	      checked_tlsgd = TRUE;
1507 	      _bfd_sparc_elf_tdata (abfd)->has_tlsgd = relt < rel_end;
1508 	    }
1509 	    break;
1510 	  case R_SPARC_TLS_GD_LO10:
1511 	  case R_SPARC_TLS_GD_ADD:
1512 	  case R_SPARC_TLS_GD_CALL:
1513 	    checked_tlsgd = TRUE;
1514 	    _bfd_sparc_elf_tdata (abfd)->has_tlsgd = TRUE;
1515 	    break;
1516 	  }
1517 
1518       r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
1519       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1520 
1521       switch (r_type)
1522 	{
1523 	case R_SPARC_TLS_LDM_HI22:
1524 	case R_SPARC_TLS_LDM_LO10:
1525 	  htab->tls_ldm_got.refcount += 1;
1526           if (eh != NULL)
1527             eh->has_got_reloc = 1;
1528 	  break;
1529 
1530 	case R_SPARC_TLS_LE_HIX22:
1531 	case R_SPARC_TLS_LE_LOX10:
1532 	  if (bfd_link_pic (info))
1533 	    goto r_sparc_plt32;
1534 	  break;
1535 
1536 	case R_SPARC_TLS_IE_HI22:
1537 	case R_SPARC_TLS_IE_LO10:
1538 	  if (bfd_link_pic (info))
1539 	    info->flags |= DF_STATIC_TLS;
1540 	  /* Fall through */
1541 
1542 	case R_SPARC_GOT10:
1543 	case R_SPARC_GOT13:
1544 	case R_SPARC_GOT22:
1545 	case R_SPARC_GOTDATA_HIX22:
1546 	case R_SPARC_GOTDATA_LOX10:
1547 	case R_SPARC_GOTDATA_OP_HIX22:
1548 	case R_SPARC_GOTDATA_OP_LOX10:
1549 	case R_SPARC_TLS_GD_HI22:
1550 	case R_SPARC_TLS_GD_LO10:
1551 	  /* This symbol requires a global offset table entry.  */
1552 	  {
1553 	    int tls_type, old_tls_type;
1554 
1555 	    switch (r_type)
1556 	      {
1557 	      default:
1558 	      case R_SPARC_GOT10:
1559 	      case R_SPARC_GOT13:
1560 	      case R_SPARC_GOT22:
1561 	      case R_SPARC_GOTDATA_OP_HIX22:
1562 	      case R_SPARC_GOTDATA_OP_LOX10:
1563 		tls_type = GOT_NORMAL;
1564 		break;
1565 	      case R_SPARC_TLS_GD_HI22:
1566 	      case R_SPARC_TLS_GD_LO10:
1567 		tls_type = GOT_TLS_GD;
1568 		break;
1569 	      case R_SPARC_TLS_IE_HI22:
1570 	      case R_SPARC_TLS_IE_LO10:
1571 		tls_type = GOT_TLS_IE;
1572 		break;
1573 	      }
1574 
1575 	    if (h != NULL)
1576 	      {
1577 		h->got.refcount += 1;
1578 		old_tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
1579 	      }
1580 	    else
1581 	      {
1582 		bfd_signed_vma *local_got_refcounts;
1583 
1584 		/* This is a global offset table entry for a local symbol.  */
1585 		local_got_refcounts = elf_local_got_refcounts (abfd);
1586 		if (local_got_refcounts == NULL)
1587 		  {
1588 		    bfd_size_type size;
1589 
1590 		    size = symtab_hdr->sh_info;
1591 		    size *= (sizeof (bfd_signed_vma) + sizeof(char));
1592 		    local_got_refcounts = ((bfd_signed_vma *)
1593 					   bfd_zalloc (abfd, size));
1594 		    if (local_got_refcounts == NULL)
1595 		      return FALSE;
1596 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
1597 		    _bfd_sparc_elf_local_got_tls_type (abfd)
1598 		      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1599 		  }
1600 		switch (r_type)
1601 		  {
1602 		  case R_SPARC_GOTDATA_OP_HIX22:
1603 		  case R_SPARC_GOTDATA_OP_LOX10:
1604 		    break;
1605 
1606 		  default:
1607 		    local_got_refcounts[r_symndx] += 1;
1608 		    break;
1609 		  }
1610 		old_tls_type = _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx];
1611 	      }
1612 
1613 	    /* If a TLS symbol is accessed using IE at least once,
1614 	       there is no point to use dynamic model for it.  */
1615 	    if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1616 		&& (old_tls_type != GOT_TLS_GD
1617 		    || tls_type != GOT_TLS_IE))
1618 	      {
1619 		if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1620 		  tls_type = old_tls_type;
1621 		else
1622 		  {
1623 		    _bfd_error_handler
1624 		      /* xgettext:c-format */
1625 		      (_("%B: `%s' accessed both as normal and thread local symbol"),
1626 		       abfd, h ? h->root.root.string : "<local>");
1627 		    return FALSE;
1628 		  }
1629 	      }
1630 
1631 	    if (old_tls_type != tls_type)
1632 	      {
1633 		if (h != NULL)
1634 		  _bfd_sparc_elf_hash_entry (h)->tls_type = tls_type;
1635 		else
1636 		  _bfd_sparc_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1637 	      }
1638 	  }
1639 
1640 	  if (htab->elf.sgot == NULL)
1641 	    {
1642 	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
1643 		return FALSE;
1644 	    }
1645 
1646           if (eh != NULL)
1647             eh->has_got_reloc = 1;
1648 	  break;
1649 
1650 	case R_SPARC_TLS_GD_CALL:
1651 	case R_SPARC_TLS_LDM_CALL:
1652 	  if (bfd_link_pic (info))
1653 	    {
1654 	      /* These are basically R_SPARC_TLS_WPLT30 relocs against
1655 		 __tls_get_addr.  */
1656 	      struct bfd_link_hash_entry *bh = NULL;
1657 	      if (! _bfd_generic_link_add_one_symbol (info, abfd,
1658 						      "__tls_get_addr", 0,
1659 						      bfd_und_section_ptr, 0,
1660 						      NULL, FALSE, FALSE,
1661 						      &bh))
1662 		return FALSE;
1663 	      h = (struct elf_link_hash_entry *) bh;
1664 	    }
1665 	  else
1666 	    break;
1667 	  /* Fall through */
1668 
1669 	case R_SPARC_PLT32:
1670 	case R_SPARC_WPLT30:
1671 	case R_SPARC_HIPLT22:
1672 	case R_SPARC_LOPLT10:
1673 	case R_SPARC_PCPLT32:
1674 	case R_SPARC_PCPLT22:
1675 	case R_SPARC_PCPLT10:
1676 	case R_SPARC_PLT64:
1677 	  /* This symbol requires a procedure linkage table entry.  We
1678 	     actually build the entry in adjust_dynamic_symbol,
1679 	     because this might be a case of linking PIC code without
1680 	     linking in any dynamic objects, in which case we don't
1681 	     need to generate a procedure linkage table after all.  */
1682 
1683 	  if (h == NULL)
1684 	    {
1685 	      if (! ABI_64_P (abfd))
1686 		{
1687 		  /* The Solaris native assembler will generate a WPLT30
1688 		     reloc for a local symbol if you assemble a call from
1689 		     one section to another when using -K pic.  We treat
1690 		     it as WDISP30.  */
1691 		  if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1692 		    goto r_sparc_plt32;
1693 		  break;
1694 		}
1695 	      /* PR 7027: We need similar behaviour for 64-bit binaries.  */
1696 	      else if (r_type == R_SPARC_WPLT30)
1697 		break;
1698 
1699 	      /* It does not make sense to have a procedure linkage
1700                  table entry for a local symbol.  */
1701 	      bfd_set_error (bfd_error_bad_value);
1702 	      return FALSE;
1703 	    }
1704 
1705 	  h->needs_plt = 1;
1706 
1707 	  {
1708 	    int this_r_type;
1709 
1710 	    this_r_type = SPARC_ELF_R_TYPE (rel->r_info);
1711 	    if (this_r_type == R_SPARC_PLT32
1712 		|| this_r_type == R_SPARC_PLT64)
1713 	      goto r_sparc_plt32;
1714 	  }
1715 	  h->plt.refcount += 1;
1716 
1717           eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
1718           eh->has_got_reloc = 1;
1719 	  break;
1720 
1721 	case R_SPARC_PC10:
1722 	case R_SPARC_PC22:
1723 	case R_SPARC_PC_HH22:
1724 	case R_SPARC_PC_HM10:
1725 	case R_SPARC_PC_LM22:
1726 	  if (h != NULL)
1727 	    h->non_got_ref = 1;
1728 
1729 	  if (h != NULL
1730 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1731 	    break;
1732 	  /* Fall through.  */
1733 
1734 	case R_SPARC_DISP8:
1735 	case R_SPARC_DISP16:
1736 	case R_SPARC_DISP32:
1737 	case R_SPARC_DISP64:
1738 	case R_SPARC_WDISP30:
1739 	case R_SPARC_WDISP22:
1740 	case R_SPARC_WDISP19:
1741 	case R_SPARC_WDISP16:
1742 	case R_SPARC_WDISP10:
1743 	case R_SPARC_8:
1744 	case R_SPARC_16:
1745 	case R_SPARC_32:
1746 	case R_SPARC_HI22:
1747 	case R_SPARC_22:
1748 	case R_SPARC_13:
1749 	case R_SPARC_LO10:
1750 	case R_SPARC_UA16:
1751 	case R_SPARC_UA32:
1752 	case R_SPARC_10:
1753 	case R_SPARC_11:
1754 	case R_SPARC_64:
1755 	case R_SPARC_OLO10:
1756 	case R_SPARC_HH22:
1757 	case R_SPARC_HM10:
1758 	case R_SPARC_LM22:
1759 	case R_SPARC_7:
1760 	case R_SPARC_5:
1761 	case R_SPARC_6:
1762 	case R_SPARC_HIX22:
1763 	case R_SPARC_LOX10:
1764 	case R_SPARC_H44:
1765 	case R_SPARC_M44:
1766 	case R_SPARC_L44:
1767 	case R_SPARC_H34:
1768 	case R_SPARC_UA64:
1769 	  if (h != NULL)
1770 	    h->non_got_ref = 1;
1771 
1772           if (eh != NULL && (sec->flags & SEC_CODE) != 0)
1773             eh->has_non_got_reloc = 1;
1774 
1775 	r_sparc_plt32:
1776 	  if (h != NULL && !bfd_link_pic (info))
1777 	    {
1778 	      /* We may need a .plt entry if the function this reloc
1779 		 refers to is in a shared lib.  */
1780 	      h->plt.refcount += 1;
1781 	    }
1782 
1783 	  /* If we are creating a shared library, and this is a reloc
1784 	     against a global symbol, or a non PC relative reloc
1785 	     against a local symbol, then we need to copy the reloc
1786 	     into the shared library.  However, if we are linking with
1787 	     -Bsymbolic, we do not need to copy a reloc against a
1788 	     global symbol which is defined in an object we are
1789 	     including in the link (i.e., DEF_REGULAR is set).  At
1790 	     this point we have not seen all the input files, so it is
1791 	     possible that DEF_REGULAR is not set now but will be set
1792 	     later (it is never cleared).  In case of a weak definition,
1793 	     DEF_REGULAR may be cleared later by a strong definition in
1794 	     a shared library.  We account for that possibility below by
1795 	     storing information in the relocs_copied field of the hash
1796 	     table entry.  A similar situation occurs when creating
1797 	     shared libraries and symbol visibility changes render the
1798 	     symbol local.
1799 
1800 	     If on the other hand, we are creating an executable, we
1801 	     may need to keep relocations for symbols satisfied by a
1802 	     dynamic library if we manage to avoid copy relocs for the
1803 	     symbol.  */
1804 	  if ((bfd_link_pic (info)
1805 	       && (sec->flags & SEC_ALLOC) != 0
1806 	       && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1807 		   || (h != NULL
1808 		       && (! SYMBOLIC_BIND (info, h)
1809 			   || h->root.type == bfd_link_hash_defweak
1810 			   || !h->def_regular))))
1811 	      || (!bfd_link_pic (info)
1812 		  && (sec->flags & SEC_ALLOC) != 0
1813 		  && h != NULL
1814 		  && (h->root.type == bfd_link_hash_defweak
1815 		      || !h->def_regular))
1816 	      || (!bfd_link_pic (info)
1817 		  && h != NULL
1818 		  && h->type == STT_GNU_IFUNC))
1819 	    {
1820 	      struct _bfd_sparc_elf_dyn_relocs *p;
1821 	      struct _bfd_sparc_elf_dyn_relocs **head;
1822 
1823 	      /* When creating a shared object, we must copy these
1824 		 relocs into the output file.  We create a reloc
1825 		 section in dynobj and make room for the reloc.  */
1826 	      if (sreloc == NULL)
1827 		{
1828 		  sreloc = _bfd_elf_make_dynamic_reloc_section
1829 		    (sec, htab->elf.dynobj, htab->word_align_power,
1830 		     abfd, /*rela?*/ TRUE);
1831 
1832 		  if (sreloc == NULL)
1833 		    return FALSE;
1834 		}
1835 
1836 	      /* If this is a global symbol, we count the number of
1837 		 relocations we need for this symbol.  */
1838 	      if (h != NULL)
1839 		head = &((struct _bfd_sparc_elf_link_hash_entry *) h)->dyn_relocs;
1840 	      else
1841 		{
1842 		  /* Track dynamic relocs needed for local syms too.
1843 		     We really need local syms available to do this
1844 		     easily.  Oh well.  */
1845 		  asection *s;
1846 		  void *vpp;
1847 
1848 		  BFD_ASSERT (isym != NULL);
1849 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1850 		  if (s == NULL)
1851 		    s = sec;
1852 
1853 		  vpp = &elf_section_data (s)->local_dynrel;
1854 		  head = (struct _bfd_sparc_elf_dyn_relocs **) vpp;
1855 		}
1856 
1857 	      p = *head;
1858 	      if (p == NULL || p->sec != sec)
1859 		{
1860 		  bfd_size_type amt = sizeof *p;
1861 		  p = ((struct _bfd_sparc_elf_dyn_relocs *)
1862 		       bfd_alloc (htab->elf.dynobj, amt));
1863 		  if (p == NULL)
1864 		    return FALSE;
1865 		  p->next = *head;
1866 		  *head = p;
1867 		  p->sec = sec;
1868 		  p->count = 0;
1869 		  p->pc_count = 0;
1870 		}
1871 
1872 	      p->count += 1;
1873 	      if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1874 		p->pc_count += 1;
1875 	    }
1876 
1877 	  break;
1878 
1879 	case R_SPARC_GNU_VTINHERIT:
1880 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1881 	    return FALSE;
1882 	  break;
1883 
1884 	case R_SPARC_GNU_VTENTRY:
1885 	  BFD_ASSERT (h != NULL);
1886 	  if (h != NULL
1887 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1888 	    return FALSE;
1889 	  break;
1890 
1891 	case R_SPARC_REGISTER:
1892 	  /* Nothing to do.  */
1893 	  break;
1894 
1895 	default:
1896 	  break;
1897 	}
1898     }
1899 
1900   return TRUE;
1901 }
1902 
1903 asection *
1904 _bfd_sparc_elf_gc_mark_hook (asection *sec,
1905 			     struct bfd_link_info *info,
1906 			     Elf_Internal_Rela *rel,
1907 			     struct elf_link_hash_entry *h,
1908 			     Elf_Internal_Sym *sym)
1909 {
1910   if (h != NULL)
1911     switch (SPARC_ELF_R_TYPE (rel->r_info))
1912       {
1913       case R_SPARC_GNU_VTINHERIT:
1914       case R_SPARC_GNU_VTENTRY:
1915 	return NULL;
1916       }
1917 
1918   /* FIXME: The test here, in check_relocs and in relocate_section
1919      dealing with TLS optimization, ought to be !bfd_link_executable (info).  */
1920   if (bfd_link_pic (info))
1921     {
1922       switch (SPARC_ELF_R_TYPE (rel->r_info))
1923 	{
1924 	case R_SPARC_TLS_GD_CALL:
1925 	case R_SPARC_TLS_LDM_CALL:
1926 	  /* This reloc implicitly references __tls_get_addr.  We know
1927 	     another reloc will reference the same symbol as the one
1928 	     on this reloc, so the real symbol and section will be
1929 	     gc marked when processing the other reloc.  That lets
1930 	     us handle __tls_get_addr here.  */
1931 	  h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
1932 				    FALSE, FALSE, TRUE);
1933 	  BFD_ASSERT (h != NULL);
1934 	  h->mark = 1;
1935 	  if (h->u.weakdef != NULL)
1936 	    h->u.weakdef->mark = 1;
1937 	  sym = NULL;
1938 	}
1939     }
1940 
1941   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1942 }
1943 
1944 static Elf_Internal_Rela *
1945 sparc_elf_find_reloc_at_ofs (Elf_Internal_Rela *rel,
1946 			     Elf_Internal_Rela *relend,
1947 			     bfd_vma offset)
1948 {
1949   while (rel < relend)
1950     {
1951       if (rel->r_offset == offset)
1952 	return rel;
1953       rel++;
1954     }
1955   return NULL;
1956 }
1957 
1958 /* Update the got entry reference counts for the section being removed.  */
1959 bfd_boolean
1960 _bfd_sparc_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1961 			      asection *sec, const Elf_Internal_Rela *relocs)
1962 {
1963   struct _bfd_sparc_elf_link_hash_table *htab;
1964   Elf_Internal_Shdr *symtab_hdr;
1965   struct elf_link_hash_entry **sym_hashes;
1966   bfd_signed_vma *local_got_refcounts;
1967   const Elf_Internal_Rela *rel, *relend;
1968 
1969   if (bfd_link_relocatable (info))
1970     return TRUE;
1971 
1972   BFD_ASSERT (is_sparc_elf (abfd) || sec->reloc_count == 0);
1973 
1974   elf_section_data (sec)->local_dynrel = NULL;
1975 
1976   htab = _bfd_sparc_elf_hash_table (info);
1977   BFD_ASSERT (htab != NULL);
1978   symtab_hdr = &elf_symtab_hdr (abfd);
1979   sym_hashes = elf_sym_hashes (abfd);
1980   local_got_refcounts = elf_local_got_refcounts (abfd);
1981 
1982   relend = relocs + sec->reloc_count;
1983   for (rel = relocs; rel < relend; rel++)
1984     {
1985       unsigned long r_symndx;
1986       unsigned int r_type;
1987       struct elf_link_hash_entry *h = NULL;
1988 
1989       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
1990       if (r_symndx >= symtab_hdr->sh_info)
1991 	{
1992 	  struct _bfd_sparc_elf_link_hash_entry *eh;
1993 	  struct _bfd_sparc_elf_dyn_relocs **pp;
1994 	  struct _bfd_sparc_elf_dyn_relocs *p;
1995 
1996 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1997 	  while (h->root.type == bfd_link_hash_indirect
1998 		 || h->root.type == bfd_link_hash_warning)
1999 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
2000 	  eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2001 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2002 	    if (p->sec == sec)
2003 	      {
2004 		/* Everything must go for SEC.  */
2005 		*pp = p->next;
2006 		break;
2007 	      }
2008 	}
2009 
2010       r_type = SPARC_ELF_R_TYPE (rel->r_info);
2011       r_type = sparc_elf_tls_transition (info, abfd, r_type, h == NULL);
2012       switch (r_type)
2013 	{
2014 	case R_SPARC_TLS_LDM_HI22:
2015 	case R_SPARC_TLS_LDM_LO10:
2016 	  if (_bfd_sparc_elf_hash_table (info)->tls_ldm_got.refcount > 0)
2017 	    _bfd_sparc_elf_hash_table (info)->tls_ldm_got.refcount -= 1;
2018 	  break;
2019 
2020 	case R_SPARC_TLS_GD_HI22:
2021 	case R_SPARC_TLS_GD_LO10:
2022 	case R_SPARC_TLS_IE_HI22:
2023 	case R_SPARC_TLS_IE_LO10:
2024 	case R_SPARC_GOT10:
2025 	case R_SPARC_GOT13:
2026 	case R_SPARC_GOT22:
2027 	case R_SPARC_GOTDATA_HIX22:
2028 	case R_SPARC_GOTDATA_LOX10:
2029 	case R_SPARC_GOTDATA_OP_HIX22:
2030 	case R_SPARC_GOTDATA_OP_LOX10:
2031 	  if (h != NULL)
2032 	    {
2033 	      if (h->got.refcount > 0)
2034 		h->got.refcount--;
2035 	    }
2036 	  else
2037 	    {
2038 	      switch (r_type)
2039 		{
2040 		case R_SPARC_GOTDATA_OP_HIX22:
2041 		case R_SPARC_GOTDATA_OP_LOX10:
2042 		  break;
2043 
2044 		default:
2045 		  if (local_got_refcounts[r_symndx] > 0)
2046 		    local_got_refcounts[r_symndx]--;
2047 		  break;
2048 		}
2049 	    }
2050 	  break;
2051 
2052 	case R_SPARC_PC10:
2053 	case R_SPARC_PC22:
2054 	case R_SPARC_PC_HH22:
2055 	case R_SPARC_PC_HM10:
2056 	case R_SPARC_PC_LM22:
2057 	  if (h != NULL
2058 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2059 	    break;
2060 	  /* Fall through.  */
2061 
2062 	case R_SPARC_DISP8:
2063 	case R_SPARC_DISP16:
2064 	case R_SPARC_DISP32:
2065 	case R_SPARC_DISP64:
2066 	case R_SPARC_WDISP30:
2067 	case R_SPARC_WDISP22:
2068 	case R_SPARC_WDISP19:
2069 	case R_SPARC_WDISP16:
2070 	case R_SPARC_WDISP10:
2071 	case R_SPARC_8:
2072 	case R_SPARC_16:
2073 	case R_SPARC_32:
2074 	case R_SPARC_HI22:
2075 	case R_SPARC_22:
2076 	case R_SPARC_13:
2077 	case R_SPARC_LO10:
2078 	case R_SPARC_UA16:
2079 	case R_SPARC_UA32:
2080 	case R_SPARC_PLT32:
2081 	case R_SPARC_10:
2082 	case R_SPARC_11:
2083 	case R_SPARC_64:
2084 	case R_SPARC_OLO10:
2085 	case R_SPARC_HH22:
2086 	case R_SPARC_HM10:
2087 	case R_SPARC_LM22:
2088 	case R_SPARC_7:
2089 	case R_SPARC_5:
2090 	case R_SPARC_6:
2091 	case R_SPARC_HIX22:
2092 	case R_SPARC_LOX10:
2093 	case R_SPARC_H44:
2094 	case R_SPARC_M44:
2095 	case R_SPARC_L44:
2096 	case R_SPARC_H34:
2097 	case R_SPARC_UA64:
2098 	  if (bfd_link_pic (info))
2099 	    break;
2100 	  /* Fall through.  */
2101 
2102 	case R_SPARC_WPLT30:
2103 	  if (h != NULL)
2104 	    {
2105 	      if (h->plt.refcount > 0)
2106 		h->plt.refcount--;
2107 	    }
2108 	  break;
2109 
2110 	default:
2111 	  break;
2112 	}
2113     }
2114 
2115   return TRUE;
2116 }
2117 
2118 /* Remove undefined weak symbol from the dynamic symbol table if it
2119    is resolved to 0.   */
2120 
2121 bfd_boolean
2122 _bfd_sparc_elf_fixup_symbol (struct bfd_link_info *info,
2123                              struct elf_link_hash_entry *h)
2124 {
2125   if (h->dynindx != -1
2126       && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2127                                           _bfd_sparc_elf_hash_entry (h)))
2128     {
2129       h->dynindx = -1;
2130       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2131                               h->dynstr_index);
2132     }
2133   return TRUE;
2134 }
2135 
2136 /* Adjust a symbol defined by a dynamic object and referenced by a
2137    regular object.  The current definition is in some section of the
2138    dynamic object, but we're not including those sections.  We have to
2139    change the definition to something the rest of the link can
2140    understand.  */
2141 
2142 bfd_boolean
2143 _bfd_sparc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2144 				     struct elf_link_hash_entry *h)
2145 {
2146   struct _bfd_sparc_elf_link_hash_table *htab;
2147   struct _bfd_sparc_elf_link_hash_entry * eh;
2148   struct _bfd_sparc_elf_dyn_relocs *p;
2149   asection *s, *srel;
2150 
2151   htab = _bfd_sparc_elf_hash_table (info);
2152   BFD_ASSERT (htab != NULL);
2153 
2154   /* Make sure we know what is going on here.  */
2155   BFD_ASSERT (htab->elf.dynobj != NULL
2156 	      && (h->needs_plt
2157 		  || h->type == STT_GNU_IFUNC
2158 		  || h->u.weakdef != NULL
2159 		  || (h->def_dynamic
2160 		      && h->ref_regular
2161 		      && !h->def_regular)));
2162 
2163   /* If this is a function, put it in the procedure linkage table.  We
2164      will fill in the contents of the procedure linkage table later
2165      (although we could actually do it here).  The STT_NOTYPE
2166      condition is a hack specifically for the Oracle libraries
2167      delivered for Solaris; for some inexplicable reason, they define
2168      some of their functions as STT_NOTYPE when they really should be
2169      STT_FUNC.  */
2170   if (h->type == STT_FUNC
2171       || h->type == STT_GNU_IFUNC
2172       || h->needs_plt
2173       || (h->type == STT_NOTYPE
2174 	  && (h->root.type == bfd_link_hash_defined
2175 	      || h->root.type == bfd_link_hash_defweak)
2176 	  && (h->root.u.def.section->flags & SEC_CODE) != 0))
2177     {
2178       if (h->plt.refcount <= 0
2179 	  || (h->type != STT_GNU_IFUNC
2180 	      && (SYMBOL_CALLS_LOCAL (info, h)
2181 		  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2182 		      && h->root.type == bfd_link_hash_undefweak))))
2183 	{
2184 	  /* This case can occur if we saw a WPLT30 reloc in an input
2185 	     file, but the symbol was never referred to by a dynamic
2186 	     object, or if all references were garbage collected.  In
2187 	     such a case, we don't actually need to build a procedure
2188 	     linkage table, and we can just do a WDISP30 reloc instead.  */
2189 	  h->plt.offset = (bfd_vma) -1;
2190 	  h->needs_plt = 0;
2191 	}
2192 
2193       return TRUE;
2194     }
2195   else
2196     h->plt.offset = (bfd_vma) -1;
2197 
2198   /* If this is a weak symbol, and there is a real definition, the
2199      processor independent code will have arranged for us to see the
2200      real definition first, and we can just use the same value.  */
2201   if (h->u.weakdef != NULL)
2202     {
2203       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2204 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2205       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2206       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2207       return TRUE;
2208     }
2209 
2210   /* This is a reference to a symbol defined by a dynamic object which
2211      is not a function.  */
2212 
2213   /* If we are creating a shared library, we must presume that the
2214      only references to the symbol are via the global offset table.
2215      For such cases we need not do anything here; the relocations will
2216      be handled correctly by relocate_section.  */
2217   if (bfd_link_pic (info))
2218     return TRUE;
2219 
2220   /* If there are no references to this symbol that do not use the
2221      GOT, we don't need to generate a copy reloc.  */
2222   if (!h->non_got_ref)
2223     return TRUE;
2224 
2225   /* If -z nocopyreloc was given, we won't generate them either.  */
2226   if (info->nocopyreloc)
2227     {
2228       h->non_got_ref = 0;
2229       return TRUE;
2230     }
2231 
2232   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2233   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2234     {
2235       s = p->sec->output_section;
2236       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2237 	break;
2238     }
2239 
2240   /* If we didn't find any dynamic relocs in read-only sections, then
2241      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2242   if (p == NULL)
2243     {
2244       h->non_got_ref = 0;
2245       return TRUE;
2246     }
2247 
2248   /* We must allocate the symbol in our .dynbss section, which will
2249      become part of the .bss section of the executable.  There will be
2250      an entry for this symbol in the .dynsym section.  The dynamic
2251      object will contain position independent code, so all references
2252      from the dynamic object to this symbol will go through the global
2253      offset table.  The dynamic linker will use the .dynsym entry to
2254      determine the address it must put in the global offset table, so
2255      both the dynamic object and the regular object will refer to the
2256      same memory location for the variable.  */
2257 
2258   /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
2259      to copy the initial value out of the dynamic object and into the
2260      runtime process image.  We need to remember the offset into the
2261      .rel.bss section we are going to use.  */
2262   if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2263     {
2264       s = htab->elf.sdynrelro;
2265       srel = htab->elf.sreldynrelro;
2266     }
2267   else
2268     {
2269       s = htab->elf.sdynbss;
2270       srel = htab->elf.srelbss;
2271     }
2272   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2273     {
2274       srel->size += SPARC_ELF_RELA_BYTES (htab);
2275       h->needs_copy = 1;
2276     }
2277 
2278   return _bfd_elf_adjust_dynamic_copy (info, h, s);
2279 }
2280 
2281 /* Allocate space in .plt, .got and associated reloc sections for
2282    dynamic relocs.  */
2283 
2284 static bfd_boolean
2285 allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2286 {
2287   struct bfd_link_info *info;
2288   struct _bfd_sparc_elf_link_hash_table *htab;
2289   struct _bfd_sparc_elf_link_hash_entry *eh;
2290   struct _bfd_sparc_elf_dyn_relocs *p;
2291   bfd_boolean resolved_to_zero;
2292 
2293   if (h->root.type == bfd_link_hash_indirect)
2294     return TRUE;
2295 
2296   info = (struct bfd_link_info *) inf;
2297   htab = _bfd_sparc_elf_hash_table (info);
2298   BFD_ASSERT (htab != NULL);
2299 
2300   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2301   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
2302 
2303   if ((htab->elf.dynamic_sections_created
2304        && h->plt.refcount > 0)
2305       || (h->type == STT_GNU_IFUNC
2306 	  && h->def_regular
2307 	  && h->ref_regular))
2308     {
2309       /* Make sure this symbol is output as a dynamic symbol.
2310 	 Undefined weak syms won't yet be marked as dynamic.  */
2311       if (h->dynindx == -1
2312 	  && !h->forced_local
2313           && !resolved_to_zero)
2314 	{
2315 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2316 	    return FALSE;
2317 	}
2318 
2319       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)
2320 	  || (h->type == STT_GNU_IFUNC
2321 	      && h->def_regular))
2322 	{
2323 	  asection *s = htab->elf.splt;
2324 
2325 	  if (s == NULL)
2326 	    s = htab->elf.iplt;
2327 
2328 	  /* Allocate room for the header.  */
2329 	  if (s->size == 0)
2330 	    {
2331 	      s->size = htab->plt_header_size;
2332 
2333 	      /* Allocate space for the .rela.plt.unloaded relocations.  */
2334 	      if (htab->is_vxworks && !bfd_link_pic (info))
2335 		htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
2336 	    }
2337 
2338 	  /* The procedure linkage table size is bounded by the magnitude
2339 	     of the offset we can describe in the entry.  */
2340 	  if (s->size >= (SPARC_ELF_WORD_BYTES(htab) == 8 ?
2341 			  (((bfd_vma)1 << 31) << 1) : 0x400000))
2342 	    {
2343 	      bfd_set_error (bfd_error_bad_value);
2344 	      return FALSE;
2345 	    }
2346 
2347 	  if (SPARC_ELF_WORD_BYTES(htab) == 8
2348 	      && s->size >= PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE)
2349 	    {
2350 	      bfd_vma off = s->size - PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE;
2351 
2352 
2353 	      off = (off % (160 * PLT64_ENTRY_SIZE)) / PLT64_ENTRY_SIZE;
2354 
2355 	      h->plt.offset = (s->size - (off * 8));
2356 	    }
2357 	  else
2358 	    h->plt.offset = s->size;
2359 
2360 	  /* If this symbol is not defined in a regular file, and we are
2361 	     not generating a shared library, then set the symbol to this
2362 	     location in the .plt.  This is required to make function
2363 	     pointers compare as equal between the normal executable and
2364 	     the shared library.  */
2365 	  if (! bfd_link_pic (info)
2366 	      && !h->def_regular)
2367 	    {
2368 	      h->root.u.def.section = s;
2369 	      h->root.u.def.value = h->plt.offset;
2370 	    }
2371 
2372 	  /* Make room for this entry.  */
2373 	  s->size += htab->plt_entry_size;
2374 
2375           /* There should be no PLT relocations against resolved undefined
2376              weak symbols in the executable.  */
2377           if (!resolved_to_zero)
2378             {
2379 	      /* We also need to make an entry in the .rela.plt section.  */
2380 	      if (s == htab->elf.splt)
2381 	        htab->elf.srelplt->size += SPARC_ELF_RELA_BYTES (htab);
2382 	      else
2383 	        htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab);
2384             }
2385 
2386 	  if (htab->is_vxworks)
2387 	    {
2388 	      /* Allocate space for the .got.plt entry.  */
2389 	      htab->elf.sgotplt->size += 4;
2390 
2391 	      /* ...and for the .rela.plt.unloaded relocations.  */
2392 	      if (!bfd_link_pic (info))
2393 		htab->srelplt2->size += sizeof (Elf32_External_Rela) * 3;
2394 	    }
2395 	}
2396       else
2397 	{
2398 	  h->plt.offset = (bfd_vma) -1;
2399 	  h->needs_plt = 0;
2400 	}
2401     }
2402   else
2403     {
2404       h->plt.offset = (bfd_vma) -1;
2405       h->needs_plt = 0;
2406     }
2407 
2408   /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
2409      make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry.  */
2410   if (h->got.refcount > 0
2411       && !bfd_link_pic (info)
2412       && h->dynindx == -1
2413       && _bfd_sparc_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
2414     h->got.offset = (bfd_vma) -1;
2415   else if (h->got.refcount > 0)
2416     {
2417       asection *s;
2418       bfd_boolean dyn;
2419       int tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
2420 
2421       /* Make sure this symbol is output as a dynamic symbol.
2422 	 Undefined weak syms won't yet be marked as dynamic.  */
2423       if (h->dynindx == -1
2424 	  && !h->forced_local
2425           && !resolved_to_zero)
2426 	{
2427 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2428 	    return FALSE;
2429 	}
2430 
2431       s = htab->elf.sgot;
2432       h->got.offset = s->size;
2433       s->size += SPARC_ELF_WORD_BYTES (htab);
2434       /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots.  */
2435       if (tls_type == GOT_TLS_GD)
2436 	s->size += SPARC_ELF_WORD_BYTES (htab);
2437       dyn = htab->elf.dynamic_sections_created;
2438       /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
2439 	 R_SPARC_TLS_GD_{HI22,LO10} needs one if local symbol and two if
2440 	 global.  No dynamic relocations are needed against resolved
2441 	 undefined weak symbols in an executable.  */
2442       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
2443 	  || tls_type == GOT_TLS_IE
2444 	  || h->type == STT_GNU_IFUNC)
2445 	htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2446       else if (tls_type == GOT_TLS_GD)
2447 	htab->elf.srelgot->size += 2 * SPARC_ELF_RELA_BYTES (htab);
2448       else if (((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2449                  && !resolved_to_zero)
2450                 || h->root.type != bfd_link_hash_undefweak)
2451                && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2452 		                                   bfd_link_pic (info),
2453 						   h))
2454 	htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2455     }
2456   else
2457     h->got.offset = (bfd_vma) -1;
2458 
2459   if (eh->dyn_relocs == NULL)
2460     return TRUE;
2461 
2462   /* In the shared -Bsymbolic case, discard space allocated for
2463      dynamic pc-relative relocs against symbols which turn out to be
2464      defined in regular objects.  For the normal shared case, discard
2465      space for pc-relative relocs that have become local due to symbol
2466      visibility changes.  */
2467 
2468   if (bfd_link_pic (info))
2469     {
2470       if (SYMBOL_CALLS_LOCAL (info, h))
2471 	{
2472 	  struct _bfd_sparc_elf_dyn_relocs **pp;
2473 
2474 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2475 	    {
2476 	      p->count -= p->pc_count;
2477 	      p->pc_count = 0;
2478 	      if (p->count == 0)
2479 		*pp = p->next;
2480 	      else
2481 		pp = &p->next;
2482 	    }
2483 	}
2484 
2485       if (htab->is_vxworks)
2486 	{
2487 	  struct _bfd_sparc_elf_dyn_relocs **pp;
2488 
2489 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2490 	    {
2491 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2492 		*pp = p->next;
2493 	      else
2494 		pp = &p->next;
2495 	    }
2496 	}
2497 
2498       /* Also discard relocs on undefined weak syms with non-default
2499 	 visibility or in PIE.  */
2500       if (eh->dyn_relocs != NULL
2501 	  && h->root.type == bfd_link_hash_undefweak)
2502 	{
2503           /* An undefined weak symbol is never
2504 	     bound locally in a shared library.  */
2505 
2506 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2507               || resolved_to_zero)
2508             {
2509               if (h->non_got_ref)
2510                 {
2511                   /* Keep dynamic non-GOT/non-PLT relocation so that we
2512                      can branch to 0 without PLT.  */
2513                   struct _bfd_sparc_elf_dyn_relocs **pp;
2514 
2515                   for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
2516                     if (p->pc_count == 0)
2517                       *pp = p->next;
2518                     else
2519                       {
2520                         /* Remove other relocations.  */
2521                         p->count = p->pc_count;
2522                         pp = &p->next;
2523                       }
2524 
2525                   if (eh->dyn_relocs != NULL)
2526                     {
2527                       /* Make sure undefined weak symbols are output
2528                          as dynamic symbols in PIEs for dynamic non-GOT
2529                          non-PLT reloations.  */
2530                       if (! bfd_elf_link_record_dynamic_symbol (info, h))
2531                         return FALSE;
2532                     }
2533                 }
2534               else
2535 	        eh->dyn_relocs = NULL;
2536             }
2537 
2538 	  /* Make sure undefined weak symbols are output as a dynamic
2539 	     symbol in PIEs.  */
2540 	  else if (h->dynindx == -1
2541 		   && !h->forced_local)
2542 	    {
2543 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2544 		return FALSE;
2545 	    }
2546 	}
2547     }
2548   else
2549     {
2550       /* For the non-shared case, discard space for relocs against
2551 	 symbols which turn out to need copy relocs or are not
2552 	 dynamic.  */
2553 
2554       if ((!h->non_got_ref
2555            || (h->root.type == bfd_link_hash_undefweak
2556                && !resolved_to_zero))
2557 	  && ((h->def_dynamic
2558 	       && !h->def_regular)
2559 	      || (htab->elf.dynamic_sections_created
2560 		  && (h->root.type == bfd_link_hash_undefweak
2561 		      || h->root.type == bfd_link_hash_undefined))))
2562 	{
2563 	  /* Make sure this symbol is output as a dynamic symbol.
2564 	     Undefined weak syms won't yet be marked as dynamic.  */
2565 	  if (h->dynindx == -1
2566 	      && !h->forced_local
2567               && !resolved_to_zero)
2568 	    {
2569 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2570 		return FALSE;
2571 	    }
2572 
2573 	  /* If that succeeded, we know we'll be keeping all the
2574 	     relocs.  */
2575 	  if (h->dynindx != -1)
2576 	    goto keep;
2577 	}
2578 
2579       eh->dyn_relocs = NULL;
2580 
2581     keep: ;
2582     }
2583 
2584   /* Finally, allocate space.  */
2585   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2586     {
2587       asection *sreloc = elf_section_data (p->sec)->sreloc;
2588       sreloc->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2589     }
2590 
2591   return TRUE;
2592 }
2593 
2594 /* Allocate space in .plt, .got and associated reloc sections for
2595    local dynamic relocs.  */
2596 
2597 static bfd_boolean
2598 allocate_local_dynrelocs (void **slot, void *inf)
2599 {
2600   struct elf_link_hash_entry *h
2601     = (struct elf_link_hash_entry *) *slot;
2602 
2603   if (h->type != STT_GNU_IFUNC
2604       || !h->def_regular
2605       || !h->ref_regular
2606       || !h->forced_local
2607       || h->root.type != bfd_link_hash_defined)
2608     abort ();
2609 
2610   return allocate_dynrelocs (h, inf);
2611 }
2612 
2613 /* Find any dynamic relocs that apply to read-only sections.  */
2614 
2615 static bfd_boolean
2616 readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
2617 {
2618   struct _bfd_sparc_elf_link_hash_entry *eh;
2619   struct _bfd_sparc_elf_dyn_relocs *p;
2620 
2621   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
2622   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2623     {
2624       asection *s = p->sec->output_section;
2625 
2626       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2627 	{
2628 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
2629 
2630 	  info->flags |= DF_TEXTREL;
2631 
2632 	  /* Not an error, just cut short the traversal.  */
2633 	  return FALSE;
2634 	}
2635     }
2636   return TRUE;
2637 }
2638 
2639 /* Return true if the dynamic symbol for a given section should be
2640    omitted when creating a shared library.  */
2641 
2642 bfd_boolean
2643 _bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
2644 				    struct bfd_link_info *info,
2645 				    asection *p)
2646 {
2647   /* We keep the .got section symbol so that explicit relocations
2648      against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2649      can be turned into relocations against the .got symbol.  */
2650   if (strcmp (p->name, ".got") == 0)
2651     return FALSE;
2652 
2653   return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
2654 }
2655 
2656 /* Set the sizes of the dynamic sections.  */
2657 
2658 bfd_boolean
2659 _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
2660 				      struct bfd_link_info *info)
2661 {
2662   struct _bfd_sparc_elf_link_hash_table *htab;
2663   bfd *dynobj;
2664   asection *s;
2665   bfd *ibfd;
2666 
2667   htab = _bfd_sparc_elf_hash_table (info);
2668   BFD_ASSERT (htab != NULL);
2669   dynobj = htab->elf.dynobj;
2670   BFD_ASSERT (dynobj != NULL);
2671 
2672   if (elf_hash_table (info)->dynamic_sections_created)
2673     {
2674       /* Set the contents of the .interp section to the interpreter.  */
2675       if (bfd_link_executable (info) && !info->nointerp)
2676         {
2677           s = bfd_get_linker_section (dynobj, ".interp");
2678           BFD_ASSERT (s != NULL);
2679           s->size = htab->dynamic_interpreter_size;
2680           s->contents = (unsigned char *) htab->dynamic_interpreter;
2681           htab->interp = s;
2682         }
2683     }
2684 
2685   /* Set up .got offsets for local syms, and space for local dynamic
2686      relocs.  */
2687   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2688     {
2689       bfd_signed_vma *local_got;
2690       bfd_signed_vma *end_local_got;
2691       char *local_tls_type;
2692       bfd_size_type locsymcount;
2693       Elf_Internal_Shdr *symtab_hdr;
2694       asection *srel;
2695 
2696       if (! is_sparc_elf (ibfd))
2697 	continue;
2698 
2699       for (s = ibfd->sections; s != NULL; s = s->next)
2700 	{
2701 	  struct _bfd_sparc_elf_dyn_relocs *p;
2702 
2703 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2704 	    {
2705 	      if (!bfd_is_abs_section (p->sec)
2706 		  && bfd_is_abs_section (p->sec->output_section))
2707 		{
2708 		  /* Input section has been discarded, either because
2709 		     it is a copy of a linkonce section or due to
2710 		     linker script /DISCARD/, so we'll be discarding
2711 		     the relocs too.  */
2712 		}
2713 	      else if (htab->is_vxworks
2714 		       && strcmp (p->sec->output_section->name,
2715 				  ".tls_vars") == 0)
2716 		{
2717 		  /* Relocations in vxworks .tls_vars sections are
2718 		     handled specially by the loader.  */
2719 		}
2720 	      else if (p->count != 0)
2721 		{
2722 		  srel = elf_section_data (p->sec)->sreloc;
2723 		  if (!htab->elf.dynamic_sections_created)
2724 		    srel = htab->elf.irelplt;
2725 		  srel->size += p->count * SPARC_ELF_RELA_BYTES (htab);
2726 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2727 		    info->flags |= DF_TEXTREL;
2728 		}
2729 	    }
2730 	}
2731 
2732       local_got = elf_local_got_refcounts (ibfd);
2733       if (!local_got)
2734 	continue;
2735 
2736       symtab_hdr = &elf_symtab_hdr (ibfd);
2737       locsymcount = symtab_hdr->sh_info;
2738       end_local_got = local_got + locsymcount;
2739       local_tls_type = _bfd_sparc_elf_local_got_tls_type (ibfd);
2740       s = htab->elf.sgot;
2741       srel = htab->elf.srelgot;
2742       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2743 	{
2744 	  if (*local_got > 0)
2745 	    {
2746 	      *local_got = s->size;
2747 	      s->size += SPARC_ELF_WORD_BYTES (htab);
2748 	      if (*local_tls_type == GOT_TLS_GD)
2749 		s->size += SPARC_ELF_WORD_BYTES (htab);
2750 	      if (bfd_link_pic (info)
2751 		  || *local_tls_type == GOT_TLS_GD
2752 		  || *local_tls_type == GOT_TLS_IE)
2753 		srel->size += SPARC_ELF_RELA_BYTES (htab);
2754 	    }
2755 	  else
2756 	    *local_got = (bfd_vma) -1;
2757 	}
2758     }
2759 
2760   if (htab->tls_ldm_got.refcount > 0)
2761     {
2762       /* Allocate 2 got entries and 1 dynamic reloc for
2763 	 R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
2764       htab->tls_ldm_got.offset = htab->elf.sgot->size;
2765       htab->elf.sgot->size += (2 * SPARC_ELF_WORD_BYTES (htab));
2766       htab->elf.srelgot->size += SPARC_ELF_RELA_BYTES (htab);
2767     }
2768   else
2769     htab->tls_ldm_got.offset = -1;
2770 
2771   /* Allocate global sym .plt and .got entries, and space for global
2772      sym dynamic relocs.  */
2773   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2774 
2775   /* Allocate .plt and .got entries, and space for local symbols.  */
2776   htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
2777 
2778   if (! ABI_64_P (output_bfd)
2779       && !htab->is_vxworks
2780       && elf_hash_table (info)->dynamic_sections_created)
2781     {
2782       /* Make space for the trailing nop in .plt.  */
2783       if (htab->elf.splt->size > 0)
2784 	htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
2785 
2786       /* If the .got section is more than 0x1000 bytes, we add
2787 	 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
2788 	 bit relocations have a greater chance of working.
2789 
2790 	 FIXME: Make this optimization work for 64-bit too.  */
2791       if (htab->elf.sgot->size >= 0x1000
2792 	  && elf_hash_table (info)->hgot->root.u.def.value == 0)
2793 	elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
2794     }
2795 
2796   /* The check_relocs and adjust_dynamic_symbol entry points have
2797      determined the sizes of the various dynamic sections.  Allocate
2798      memory for them.  */
2799   for (s = dynobj->sections; s != NULL; s = s->next)
2800     {
2801       if ((s->flags & SEC_LINKER_CREATED) == 0)
2802 	continue;
2803 
2804       if (s == htab->elf.splt
2805 	  || s == htab->elf.sgot
2806 	  || s == htab->elf.sdynbss
2807 	  || s == htab->elf.sdynrelro
2808 	  || s == htab->elf.iplt
2809 	  || s == htab->elf.sgotplt)
2810 	{
2811 	  /* Strip this section if we don't need it; see the
2812 	     comment below.  */
2813 	}
2814       else if (CONST_STRNEQ (s->name, ".rela"))
2815 	{
2816 	  if (s->size != 0)
2817 	    {
2818 	      /* We use the reloc_count field as a counter if we need
2819 		 to copy relocs into the output file.  */
2820 	      s->reloc_count = 0;
2821 	    }
2822 	}
2823       else
2824 	{
2825 	  /* It's not one of our sections.  */
2826 	  continue;
2827 	}
2828 
2829       if (s->size == 0)
2830 	{
2831 	  /* If we don't need this section, strip it from the
2832 	     output file.  This is mostly to handle .rela.bss and
2833 	     .rela.plt.  We must create both sections in
2834 	     create_dynamic_sections, because they must be created
2835 	     before the linker maps input sections to output
2836 	     sections.  The linker does that before
2837 	     adjust_dynamic_symbol is called, and it is that
2838 	     function which decides whether anything needs to go
2839 	     into these sections.  */
2840 	  s->flags |= SEC_EXCLUDE;
2841 	  continue;
2842 	}
2843 
2844       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2845 	continue;
2846 
2847       /* Allocate memory for the section contents.  Zero the memory
2848 	 for the benefit of .rela.plt, which has 4 unused entries
2849 	 at the beginning, and we don't want garbage.  */
2850       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2851       if (s->contents == NULL)
2852 	return FALSE;
2853     }
2854 
2855   if (elf_hash_table (info)->dynamic_sections_created)
2856     {
2857       /* Add some entries to the .dynamic section.  We fill in the
2858 	 values later, in _bfd_sparc_elf_finish_dynamic_sections, but we
2859 	 must add the entries now so that we get the correct size for
2860 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2861 	 dynamic linker and used by the debugger.  */
2862 #define add_dynamic_entry(TAG, VAL) \
2863   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2864 
2865       if (bfd_link_executable (info))
2866 	{
2867 	  if (!add_dynamic_entry (DT_DEBUG, 0))
2868 	    return FALSE;
2869 	}
2870 
2871       if (htab->elf.srelplt->size != 0)
2872 	{
2873 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
2874 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
2875 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2876 	      || !add_dynamic_entry (DT_JMPREL, 0))
2877 	    return FALSE;
2878 	}
2879 
2880       if (!add_dynamic_entry (DT_RELA, 0)
2881 	  || !add_dynamic_entry (DT_RELASZ, 0)
2882 	  || !add_dynamic_entry (DT_RELAENT,
2883 				 SPARC_ELF_RELA_BYTES (htab)))
2884 	return FALSE;
2885 
2886       /* If any dynamic relocs apply to a read-only section,
2887 	 then we need a DT_TEXTREL entry.  */
2888       if ((info->flags & DF_TEXTREL) == 0)
2889 	elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
2890 
2891       if (info->flags & DF_TEXTREL)
2892 	{
2893 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
2894 	    return FALSE;
2895 	}
2896 
2897       if (ABI_64_P (output_bfd))
2898 	{
2899 	  int reg;
2900 	  struct _bfd_sparc_elf_app_reg * app_regs;
2901 	  struct elf_strtab_hash *dynstr;
2902 	  struct elf_link_hash_table *eht = elf_hash_table (info);
2903 
2904 	  /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
2905 	     entries if needed.  */
2906 	  app_regs = _bfd_sparc_elf_hash_table (info)->app_regs;
2907 	  dynstr = eht->dynstr;
2908 
2909 	  for (reg = 0; reg < 4; reg++)
2910 	    if (app_regs [reg].name != NULL)
2911 	      {
2912 		struct elf_link_local_dynamic_entry *entry, *e;
2913 
2914 		if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
2915 		  return FALSE;
2916 
2917 		entry = (struct elf_link_local_dynamic_entry *)
2918 		  bfd_hash_allocate (&info->hash->table, sizeof (*entry));
2919 		if (entry == NULL)
2920 		  return FALSE;
2921 
2922 		/* We cheat here a little bit: the symbol will not be local, so we
2923 		   put it at the end of the dynlocal linked list.  We will fix it
2924 		   later on, as we have to fix other fields anyway.  */
2925 		entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
2926 		entry->isym.st_size = 0;
2927 		if (*app_regs [reg].name != '\0')
2928 		  entry->isym.st_name
2929 		    = _bfd_elf_strtab_add (dynstr, app_regs[reg].name, FALSE);
2930 		else
2931 		  entry->isym.st_name = 0;
2932 		entry->isym.st_other = 0;
2933 		entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
2934 						   STT_REGISTER);
2935 		entry->isym.st_shndx = app_regs [reg].shndx;
2936 		entry->isym.st_target_internal = 0;
2937 		entry->next = NULL;
2938 		entry->input_bfd = output_bfd;
2939 		entry->input_indx = -1;
2940 
2941 		if (eht->dynlocal == NULL)
2942 		  eht->dynlocal = entry;
2943 		else
2944 		  {
2945 		    for (e = eht->dynlocal; e->next; e = e->next)
2946 		      ;
2947 		    e->next = entry;
2948 		  }
2949 		eht->dynsymcount++;
2950 	      }
2951 	}
2952       if (htab->is_vxworks
2953 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
2954 	return FALSE;
2955     }
2956 #undef add_dynamic_entry
2957 
2958   return TRUE;
2959 }
2960 
2961 bfd_boolean
2962 _bfd_sparc_elf_new_section_hook (bfd *abfd, asection *sec)
2963 {
2964   if (!sec->used_by_bfd)
2965     {
2966       struct _bfd_sparc_elf_section_data *sdata;
2967       bfd_size_type amt = sizeof (*sdata);
2968 
2969       sdata = bfd_zalloc (abfd, amt);
2970       if (sdata == NULL)
2971 	return FALSE;
2972       sec->used_by_bfd = sdata;
2973     }
2974 
2975   return _bfd_elf_new_section_hook (abfd, sec);
2976 }
2977 
2978 bfd_boolean
2979 _bfd_sparc_elf_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
2980 			      struct bfd_section *section,
2981 			      struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2982 			      bfd_boolean *again)
2983 {
2984   if (bfd_link_relocatable (link_info))
2985     (*link_info->callbacks->einfo)
2986       (_("%P%F: --relax and -r may not be used together\n"));
2987 
2988   *again = FALSE;
2989   sec_do_relax (section) = 1;
2990   return TRUE;
2991 }
2992 
2993 /* Return the base VMA address which should be subtracted from real addresses
2994    when resolving @dtpoff relocation.
2995    This is PT_TLS segment p_vaddr.  */
2996 
2997 static bfd_vma
2998 dtpoff_base (struct bfd_link_info *info)
2999 {
3000   /* If tls_sec is NULL, we should have signalled an error already.  */
3001   if (elf_hash_table (info)->tls_sec == NULL)
3002     return 0;
3003   return elf_hash_table (info)->tls_sec->vma;
3004 }
3005 
3006 /* Return the relocation value for @tpoff relocation
3007    if STT_TLS virtual address is ADDRESS.  */
3008 
3009 static bfd_vma
3010 tpoff (struct bfd_link_info *info, bfd_vma address)
3011 {
3012   struct elf_link_hash_table *htab = elf_hash_table (info);
3013   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3014   bfd_vma static_tls_size;
3015 
3016   /* If tls_sec is NULL, we should have signalled an error already.  */
3017   if (htab->tls_sec == NULL)
3018     return 0;
3019 
3020   /* Consider special static TLS alignment requirements.  */
3021   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3022   return address - static_tls_size - htab->tls_sec->vma;
3023 }
3024 
3025 /* Return the relocation value for a %gdop relocation.  */
3026 
3027 static bfd_vma
3028 gdopoff (struct bfd_link_info *info, bfd_vma address)
3029 {
3030   struct elf_link_hash_table *htab = elf_hash_table (info);
3031   bfd_vma got_base;
3032 
3033   got_base = (htab->hgot->root.u.def.value
3034 	      + htab->hgot->root.u.def.section->output_offset
3035 	      + htab->hgot->root.u.def.section->output_section->vma);
3036 
3037   return address - got_base;
3038 }
3039 
3040 /* Return whether H is local and its ADDRESS is within 4G of
3041    _GLOBAL_OFFSET_TABLE_ and thus the offset may be calculated by a
3042    sethi, xor sequence.  */
3043 
3044 static bfd_boolean
3045 gdop_relative_offset_ok (struct bfd_link_info *info,
3046 			 struct elf_link_hash_entry *h,
3047 			 bfd_vma address ATTRIBUTE_UNUSED)
3048 {
3049   if (!SYMBOL_REFERENCES_LOCAL (info, h))
3050     return FALSE;
3051   /* If H is undefined, ADDRESS will be zero.  We can't allow a
3052      relative offset to "zero" when producing PIEs or shared libs.
3053      Note that to get here with an undefined symbol it must also be
3054      hidden or internal visibility.  */
3055   if (bfd_link_pic (info)
3056       && h != NULL
3057       && (h->root.type == bfd_link_hash_undefweak
3058 	  || h->root.type == bfd_link_hash_undefined))
3059     return FALSE;
3060 #ifdef BFD64
3061   return gdopoff (info, address) + ((bfd_vma) 1 << 32) < (bfd_vma) 2 << 32;
3062 #else
3063   return TRUE;
3064 #endif
3065 }
3066 
3067 /* Relocate a SPARC ELF section.  */
3068 
3069 bfd_boolean
3070 _bfd_sparc_elf_relocate_section (bfd *output_bfd,
3071 				 struct bfd_link_info *info,
3072 				 bfd *input_bfd,
3073 				 asection *input_section,
3074 				 bfd_byte *contents,
3075 				 Elf_Internal_Rela *relocs,
3076 				 Elf_Internal_Sym *local_syms,
3077 				 asection **local_sections)
3078 {
3079   struct _bfd_sparc_elf_link_hash_table *htab;
3080   Elf_Internal_Shdr *symtab_hdr;
3081   struct elf_link_hash_entry **sym_hashes;
3082   bfd_vma *local_got_offsets;
3083   bfd_vma got_base;
3084   asection *sreloc;
3085   Elf_Internal_Rela *rel;
3086   Elf_Internal_Rela *relend;
3087   int num_relocs;
3088   bfd_boolean is_vxworks_tls;
3089 
3090   htab = _bfd_sparc_elf_hash_table (info);
3091   BFD_ASSERT (htab != NULL);
3092   symtab_hdr = &elf_symtab_hdr (input_bfd);
3093   sym_hashes = elf_sym_hashes (input_bfd);
3094   local_got_offsets = elf_local_got_offsets (input_bfd);
3095 
3096   if (elf_hash_table (info)->hgot == NULL)
3097     got_base = 0;
3098   else
3099     got_base = elf_hash_table (info)->hgot->root.u.def.value;
3100 
3101   sreloc = elf_section_data (input_section)->sreloc;
3102   /* We have to handle relocations in vxworks .tls_vars sections
3103      specially, because the dynamic loader is 'weird'.  */
3104   is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info)
3105 		    && !strcmp (input_section->output_section->name,
3106 				".tls_vars"));
3107 
3108   rel = relocs;
3109   if (ABI_64_P (output_bfd))
3110     num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
3111   else
3112     num_relocs = input_section->reloc_count;
3113   relend = relocs + num_relocs;
3114   for (; rel < relend; rel++)
3115     {
3116       int r_type, tls_type;
3117       reloc_howto_type *howto;
3118       unsigned long r_symndx;
3119       struct elf_link_hash_entry *h;
3120       struct _bfd_sparc_elf_link_hash_entry *eh;
3121       Elf_Internal_Sym *sym;
3122       asection *sec;
3123       bfd_vma relocation, off;
3124       bfd_reloc_status_type r;
3125       bfd_boolean is_plt = FALSE;
3126       bfd_boolean unresolved_reloc;
3127       bfd_boolean resolved_to_zero;
3128 
3129       r_type = SPARC_ELF_R_TYPE (rel->r_info);
3130       if (r_type == R_SPARC_GNU_VTINHERIT
3131 	  || r_type == R_SPARC_GNU_VTENTRY)
3132 	continue;
3133 
3134       if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
3135 	{
3136 	  bfd_set_error (bfd_error_bad_value);
3137 	  return FALSE;
3138 	}
3139       howto = _bfd_sparc_elf_howto_table + r_type;
3140 
3141       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
3142       h = NULL;
3143       sym = NULL;
3144       sec = NULL;
3145       unresolved_reloc = FALSE;
3146       if (r_symndx < symtab_hdr->sh_info)
3147 	{
3148 	  sym = local_syms + r_symndx;
3149 	  sec = local_sections[r_symndx];
3150 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
3151 
3152 	  if (!bfd_link_relocatable (info)
3153 	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3154 	    {
3155 	      /* Relocate against local STT_GNU_IFUNC symbol.  */
3156 	      h = elf_sparc_get_local_sym_hash (htab, input_bfd,
3157 						rel, FALSE);
3158 	      if (h == NULL)
3159 		abort ();
3160 
3161 	      /* Set STT_GNU_IFUNC symbol value.  */
3162 	      h->root.u.def.value = sym->st_value;
3163 	      h->root.u.def.section = sec;
3164 	    }
3165 	}
3166       else
3167 	{
3168 	  bfd_boolean warned, ignored;
3169 
3170 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3171 				   r_symndx, symtab_hdr, sym_hashes,
3172 				   h, sec, relocation,
3173 				   unresolved_reloc, warned, ignored);
3174 	  if (warned)
3175 	    {
3176 	      /* To avoid generating warning messages about truncated
3177 		 relocations, set the relocation's address to be the same as
3178 		 the start of this section.  */
3179 	      if (input_section->output_section != NULL)
3180 		relocation = input_section->output_section->vma;
3181 	      else
3182 		relocation = 0;
3183 	    }
3184 	}
3185 
3186       if (sec != NULL && discarded_section (sec))
3187 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3188 					 rel, 1, relend, howto, 0, contents);
3189 
3190       if (bfd_link_relocatable (info))
3191 	continue;
3192 
3193       if (h != NULL
3194 	  && h->type == STT_GNU_IFUNC
3195 	  && h->def_regular)
3196 	{
3197 	  asection *plt_sec;
3198 	  const char *name;
3199 
3200 	  if ((input_section->flags & SEC_ALLOC) == 0
3201 	      || h->plt.offset == (bfd_vma) -1)
3202 	    abort ();
3203 
3204 	  plt_sec = htab->elf.splt;
3205 	  if (! plt_sec)
3206 	    plt_sec =htab->elf.iplt;
3207 
3208 	  switch (r_type)
3209 	    {
3210 	    case R_SPARC_GOTDATA_OP:
3211 	      continue;
3212 
3213 	    case R_SPARC_GOTDATA_OP_HIX22:
3214 	    case R_SPARC_GOTDATA_OP_LOX10:
3215 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3216 			? R_SPARC_GOT22
3217 			: R_SPARC_GOT10);
3218 	      howto = _bfd_sparc_elf_howto_table + r_type;
3219 	      /* Fall through.  */
3220 
3221 	    case R_SPARC_GOT10:
3222 	    case R_SPARC_GOT13:
3223 	    case R_SPARC_GOT22:
3224 	      if (htab->elf.sgot == NULL)
3225 		abort ();
3226 	      off = h->got.offset;
3227 	      if (off == (bfd_vma) -1)
3228 		abort();
3229 	      relocation = htab->elf.sgot->output_offset + off - got_base;
3230 	      goto do_relocation;
3231 
3232 	    case R_SPARC_WPLT30:
3233 	    case R_SPARC_WDISP30:
3234 	      relocation = (plt_sec->output_section->vma
3235 			    + plt_sec->output_offset + h->plt.offset);
3236 	      goto do_relocation;
3237 
3238 	    case R_SPARC_32:
3239 	    case R_SPARC_64:
3240 	      if (bfd_link_pic (info) && h->non_got_ref)
3241 		{
3242 		  Elf_Internal_Rela outrel;
3243 		  bfd_vma offset;
3244 
3245 		  offset = _bfd_elf_section_offset (output_bfd, info,
3246 						    input_section,
3247 						    rel->r_offset);
3248 		  if (offset == (bfd_vma) -1
3249 		      || offset == (bfd_vma) -2)
3250 		    abort();
3251 
3252 		  outrel.r_offset = (input_section->output_section->vma
3253 				     + input_section->output_offset
3254 				     + offset);
3255 
3256 		  if (h->dynindx == -1
3257 		      || h->forced_local
3258 		      || bfd_link_executable (info))
3259 		    {
3260 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3261 							0, R_SPARC_IRELATIVE);
3262 		      outrel.r_addend = relocation + rel->r_addend;
3263 		    }
3264 		  else
3265 		    {
3266 		      if (h->dynindx == -1)
3267 			abort();
3268 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3269 		      outrel.r_addend = rel->r_addend;
3270 		    }
3271 
3272 		  sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3273 		  continue;
3274 		}
3275 
3276 	      relocation = (plt_sec->output_section->vma
3277 			    + plt_sec->output_offset + h->plt.offset);
3278 	      goto do_relocation;
3279 
3280 	    case R_SPARC_HI22:
3281 	    case R_SPARC_LO10:
3282 	      /* We should only see such relocs in static links.  */
3283 	      if (bfd_link_pic (info))
3284 		abort();
3285 	      relocation = (plt_sec->output_section->vma
3286 			    + plt_sec->output_offset + h->plt.offset);
3287 	      goto do_relocation;
3288 
3289 	    default:
3290 	      if (h->root.root.string)
3291 		name = h->root.root.string;
3292 	      else
3293 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3294 					 NULL);
3295 	      _bfd_error_handler
3296 		/* xgettext:c-format */
3297 		(_("%B: relocation %s against STT_GNU_IFUNC "
3298 		   "symbol `%s' isn't handled by %s"), input_bfd,
3299 		 _bfd_sparc_elf_howto_table[r_type].name,
3300 		 name, __FUNCTION__);
3301 	      bfd_set_error (bfd_error_bad_value);
3302 	      return FALSE;
3303 	    }
3304 	}
3305 
3306       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
3307       resolved_to_zero = (eh != NULL
3308                           && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
3309 
3310       switch (r_type)
3311 	{
3312 	case R_SPARC_GOTDATA_OP_HIX22:
3313 	case R_SPARC_GOTDATA_OP_LOX10:
3314 	  if (gdop_relative_offset_ok (info, h, relocation))
3315 	    {
3316 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3317 			? R_SPARC_GOTDATA_HIX22
3318 			: R_SPARC_GOTDATA_LOX10);
3319 	      howto = _bfd_sparc_elf_howto_table + r_type;
3320 	    }
3321 	  break;
3322 
3323 	case R_SPARC_GOTDATA_OP:
3324 	  if (gdop_relative_offset_ok (info, h, relocation))
3325 	    {
3326 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3327 
3328 	      /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
3329 	      relocation = 0x80000000 | (insn & 0x3e07c01f);
3330 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3331 	    }
3332 	  continue;
3333 	}
3334 
3335       switch (r_type)
3336 	{
3337 	case R_SPARC_GOTDATA_HIX22:
3338 	case R_SPARC_GOTDATA_LOX10:
3339 	  relocation = gdopoff (info, relocation);
3340 	  break;
3341 
3342 	case R_SPARC_GOTDATA_OP_HIX22:
3343 	case R_SPARC_GOTDATA_OP_LOX10:
3344 	case R_SPARC_GOT10:
3345 	case R_SPARC_GOT13:
3346 	case R_SPARC_GOT22:
3347 	  /* Relocation is to the entry for this symbol in the global
3348 	     offset table.  */
3349 	  if (htab->elf.sgot == NULL)
3350 	    abort ();
3351 
3352 	  if (h != NULL)
3353 	    {
3354 	      bfd_boolean dyn;
3355 
3356 	      off = h->got.offset;
3357 	      BFD_ASSERT (off != (bfd_vma) -1);
3358 	      dyn = elf_hash_table (info)->dynamic_sections_created;
3359 
3360 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3361 						     bfd_link_pic (info),
3362 						     h)
3363 		  || (bfd_link_pic (info)
3364 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
3365 		{
3366 		  /* This is actually a static link, or it is a
3367 		     -Bsymbolic link and the symbol is defined
3368 		     locally, or the symbol was forced to be local
3369 		     because of a version file.  We must initialize
3370 		     this entry in the global offset table.  Since the
3371 		     offset must always be a multiple of 8 for 64-bit
3372 		     and 4 for 32-bit, we use the least significant bit
3373 		     to record whether we have initialized it already.
3374 
3375 		     When doing a dynamic link, we create a .rela.got
3376 		     relocation entry to initialize the value.  This
3377 		     is done in the finish_dynamic_symbol routine.  */
3378 		  if ((off & 1) != 0)
3379 		    off &= ~1;
3380 		  else
3381 		    {
3382 		      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3383 					  htab->elf.sgot->contents + off);
3384 		      h->got.offset |= 1;
3385 		    }
3386 		}
3387 	      else
3388 		unresolved_reloc = FALSE;
3389 	    }
3390 	  else
3391 	    {
3392 	      BFD_ASSERT (local_got_offsets != NULL
3393 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
3394 
3395 	      off = local_got_offsets[r_symndx];
3396 
3397 	      /* The offset must always be a multiple of 8 on 64-bit and
3398 		 4 on 32-bit.  We use the least significant bit to record
3399 		 whether we have already processed this entry.  */
3400 	      if ((off & 1) != 0)
3401 		off &= ~1;
3402 	      else
3403 		{
3404 
3405 		  if (bfd_link_pic (info))
3406 		    {
3407 		      asection *s;
3408 		      Elf_Internal_Rela outrel;
3409 
3410 		      /* We need to generate a R_SPARC_RELATIVE reloc
3411 			 for the dynamic linker.  */
3412 		      s = htab->elf.srelgot;
3413 		      BFD_ASSERT (s != NULL);
3414 
3415 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
3416 					 + htab->elf.sgot->output_offset
3417 					 + off);
3418 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3419 							0, R_SPARC_RELATIVE);
3420 		      outrel.r_addend = relocation;
3421 		      relocation = 0;
3422 		      sparc_elf_append_rela (output_bfd, s, &outrel);
3423 		    }
3424 
3425 		  SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3426 				      htab->elf.sgot->contents + off);
3427 		  local_got_offsets[r_symndx] |= 1;
3428 		}
3429 	    }
3430 	  relocation = htab->elf.sgot->output_offset + off - got_base;
3431 	  break;
3432 
3433 	case R_SPARC_PLT32:
3434 	case R_SPARC_PLT64:
3435 	  if (h == NULL || h->plt.offset == (bfd_vma) -1)
3436 	    {
3437 	      r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
3438 	      goto r_sparc_plt32;
3439 	    }
3440 	  /* Fall through.  */
3441 
3442 	case R_SPARC_WPLT30:
3443 	case R_SPARC_HIPLT22:
3444 	case R_SPARC_LOPLT10:
3445 	case R_SPARC_PCPLT32:
3446 	case R_SPARC_PCPLT22:
3447 	case R_SPARC_PCPLT10:
3448 	r_sparc_wplt30:
3449 	  /* Relocation is to the entry for this symbol in the
3450 	     procedure linkage table.  */
3451 
3452 	  if (! ABI_64_P (output_bfd))
3453 	    {
3454 	      /* The Solaris native assembler will generate a WPLT30 reloc
3455 		 for a local symbol if you assemble a call from one
3456 		 section to another when using -K pic.  We treat it as
3457 		 WDISP30.  */
3458 	      if (h == NULL)
3459 		break;
3460 	    }
3461 	  /* PR 7027: We need similar behaviour for 64-bit binaries.  */
3462 	  else if (r_type == R_SPARC_WPLT30 && h == NULL)
3463 	    break;
3464 	  else
3465 	    {
3466 	      BFD_ASSERT (h != NULL);
3467 	    }
3468 
3469 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3470 	    {
3471 	      /* We didn't make a PLT entry for this symbol.  This
3472 		 happens when statically linking PIC code, or when
3473 		 using -Bsymbolic.  */
3474 	      break;
3475 	    }
3476 
3477 	  relocation = (htab->elf.splt->output_section->vma
3478 			+ htab->elf.splt->output_offset
3479 			+ h->plt.offset);
3480 	  unresolved_reloc = FALSE;
3481 	  if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
3482 	    {
3483 	      r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
3484 	      is_plt = TRUE;
3485 	      goto r_sparc_plt32;
3486 	    }
3487 	  break;
3488 
3489 	case R_SPARC_PC10:
3490 	case R_SPARC_PC22:
3491 	case R_SPARC_PC_HH22:
3492 	case R_SPARC_PC_HM10:
3493 	case R_SPARC_PC_LM22:
3494 	  if (h != NULL
3495 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3496 	    break;
3497 	  /* Fall through.  */
3498 	case R_SPARC_DISP8:
3499 	case R_SPARC_DISP16:
3500 	case R_SPARC_DISP32:
3501 	case R_SPARC_DISP64:
3502 	case R_SPARC_WDISP30:
3503 	case R_SPARC_WDISP22:
3504 	case R_SPARC_WDISP19:
3505 	case R_SPARC_WDISP16:
3506 	case R_SPARC_WDISP10:
3507 	case R_SPARC_8:
3508 	case R_SPARC_16:
3509 	case R_SPARC_32:
3510 	case R_SPARC_HI22:
3511 	case R_SPARC_22:
3512 	case R_SPARC_13:
3513 	case R_SPARC_LO10:
3514 	case R_SPARC_UA16:
3515 	case R_SPARC_UA32:
3516 	case R_SPARC_10:
3517 	case R_SPARC_11:
3518 	case R_SPARC_64:
3519 	case R_SPARC_OLO10:
3520 	case R_SPARC_HH22:
3521 	case R_SPARC_HM10:
3522 	case R_SPARC_LM22:
3523 	case R_SPARC_7:
3524 	case R_SPARC_5:
3525 	case R_SPARC_6:
3526 	case R_SPARC_HIX22:
3527 	case R_SPARC_LOX10:
3528 	case R_SPARC_H44:
3529 	case R_SPARC_M44:
3530 	case R_SPARC_L44:
3531 	case R_SPARC_H34:
3532 	case R_SPARC_UA64:
3533 	r_sparc_plt32:
3534 	  if ((input_section->flags & SEC_ALLOC) == 0
3535 	      || is_vxworks_tls)
3536 	    break;
3537 
3538           /* Copy dynamic function pointer relocations.  Don't generate
3539              dynamic relocations against resolved undefined weak symbols
3540              in PIE.  */
3541 	  if ((bfd_link_pic (info)
3542 	       && (h == NULL
3543 		   || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3544                         && !resolved_to_zero)
3545 		       || h->root.type != bfd_link_hash_undefweak))
3546 	       && (! howto->pc_relative
3547 		   || !SYMBOL_CALLS_LOCAL (info, h)))
3548 	      || (!bfd_link_pic (info)
3549 		  && h != NULL
3550 		  && h->dynindx != -1
3551 		  && !h->non_got_ref
3552 		  && ((h->def_dynamic
3553 		       && !h->def_regular)
3554 		      || (h->root.type == bfd_link_hash_undefweak
3555                           && !resolved_to_zero)
3556 		      || h->root.type == bfd_link_hash_undefined)))
3557 	    {
3558 	      Elf_Internal_Rela outrel;
3559 	      bfd_boolean skip, relocate = FALSE;
3560 
3561 	      /* When generating a shared object, these relocations
3562 		 are copied into the output file to be resolved at run
3563 		 time.  */
3564 
3565 	      BFD_ASSERT (sreloc != NULL);
3566 
3567 	      skip = FALSE;
3568 
3569 	      outrel.r_offset =
3570 		_bfd_elf_section_offset (output_bfd, info, input_section,
3571 					 rel->r_offset);
3572 	      if (outrel.r_offset == (bfd_vma) -1)
3573 		skip = TRUE;
3574 	      else if (outrel.r_offset == (bfd_vma) -2)
3575 		skip = TRUE, relocate = TRUE;
3576 	      outrel.r_offset += (input_section->output_section->vma
3577 				  + input_section->output_offset);
3578 
3579 	      /* Optimize unaligned reloc usage now that we know where
3580 		 it finally resides.  */
3581 	      switch (r_type)
3582 		{
3583 		case R_SPARC_16:
3584 		  if (outrel.r_offset & 1)
3585 		    r_type = R_SPARC_UA16;
3586 		  break;
3587 		case R_SPARC_UA16:
3588 		  if (!(outrel.r_offset & 1))
3589 		    r_type = R_SPARC_16;
3590 		  break;
3591 		case R_SPARC_32:
3592 		  if (outrel.r_offset & 3)
3593 		    r_type = R_SPARC_UA32;
3594 		  break;
3595 		case R_SPARC_UA32:
3596 		  if (!(outrel.r_offset & 3))
3597 		    r_type = R_SPARC_32;
3598 		  break;
3599 		case R_SPARC_64:
3600 		  if (outrel.r_offset & 7)
3601 		    r_type = R_SPARC_UA64;
3602 		  break;
3603 		case R_SPARC_UA64:
3604 		  if (!(outrel.r_offset & 7))
3605 		    r_type = R_SPARC_64;
3606 		  break;
3607 	  	case R_SPARC_DISP8:
3608 		case R_SPARC_DISP16:
3609 	  	case R_SPARC_DISP32:
3610 	  	case R_SPARC_DISP64:
3611 		  /* If the symbol is not dynamic, we should not keep
3612 		     a dynamic relocation.  But an .rela.* slot has been
3613 		     allocated for it, output R_SPARC_NONE.
3614 		     FIXME: Add code tracking needed dynamic relocs as
3615 		     e.g. i386 has.  */
3616 		  if (h->dynindx == -1)
3617 		    skip = TRUE, relocate = TRUE;
3618 		  break;
3619 		}
3620 
3621 	      if (skip)
3622 		memset (&outrel, 0, sizeof outrel);
3623 	      /* h->dynindx may be -1 if the symbol was marked to
3624 		 become local.  */
3625 	      else if (h != NULL
3626 		       && h->dynindx != -1
3627 		       && (_bfd_sparc_elf_howto_table[r_type].pc_relative
3628 			   || !bfd_link_pic (info)
3629 			   || !SYMBOLIC_BIND (info, h)
3630 			   || !h->def_regular))
3631 		{
3632 		  BFD_ASSERT (h->dynindx != -1);
3633 		  outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3634 		  outrel.r_addend = rel->r_addend;
3635 		}
3636 	      else
3637 		{
3638 		  if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
3639 		      || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
3640 		    {
3641 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3642 							0, R_SPARC_RELATIVE);
3643 		      outrel.r_addend = relocation + rel->r_addend;
3644 		    }
3645 		  else
3646 		    {
3647 		      long indx;
3648 
3649 		      outrel.r_addend = relocation + rel->r_addend;
3650 
3651 		      if (is_plt)
3652 			sec = htab->elf.splt;
3653 
3654 		      if (bfd_is_abs_section (sec))
3655 			indx = 0;
3656 		      else if (sec == NULL || sec->owner == NULL)
3657 			{
3658 			  bfd_set_error (bfd_error_bad_value);
3659 			  return FALSE;
3660 			}
3661 		      else
3662 			{
3663 			  asection *osec;
3664 
3665 			  /* We are turning this relocation into one
3666 			     against a section symbol.  It would be
3667 			     proper to subtract the symbol's value,
3668 			     osec->vma, from the emitted reloc addend,
3669 			     but ld.so expects buggy relocs.  */
3670 			  osec = sec->output_section;
3671 			  indx = elf_section_data (osec)->dynindx;
3672 
3673 			  if (indx == 0)
3674 			    {
3675 			      osec = htab->elf.text_index_section;
3676 			      indx = elf_section_data (osec)->dynindx;
3677 			    }
3678 
3679 			  /* FIXME: we really should be able to link non-pic
3680 			     shared libraries.  */
3681 			  if (indx == 0)
3682 			    {
3683 			      BFD_FAIL ();
3684 			      _bfd_error_handler
3685 				(_("%B: probably compiled without -fPIC?"),
3686 				 input_bfd);
3687 			      bfd_set_error (bfd_error_bad_value);
3688 			      return FALSE;
3689 			    }
3690 			}
3691 
3692 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3693 							r_type);
3694 		    }
3695 		}
3696 
3697 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3698 
3699 	      /* This reloc will be computed at runtime, so there's no
3700 		 need to do anything now.  */
3701 	      if (! relocate)
3702 		continue;
3703 	    }
3704 	  break;
3705 
3706 	case R_SPARC_TLS_GD_HI22:
3707 	  if (! ABI_64_P (input_bfd)
3708 	      && ! _bfd_sparc_elf_tdata (input_bfd)->has_tlsgd)
3709 	    {
3710 	      /* R_SPARC_REV32 used the same reloc number as
3711 		 R_SPARC_TLS_GD_HI22.  */
3712 	      r_type = R_SPARC_REV32;
3713 	      break;
3714 	    }
3715 	  /* Fall through */
3716 
3717 	case R_SPARC_TLS_GD_LO10:
3718 	case R_SPARC_TLS_IE_HI22:
3719 	case R_SPARC_TLS_IE_LO10:
3720 	  r_type = sparc_elf_tls_transition (info, input_bfd, r_type, h == NULL);
3721 	  tls_type = GOT_UNKNOWN;
3722 	  if (h == NULL && local_got_offsets)
3723 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3724 	  else if (h != NULL)
3725 	    {
3726 	      tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3727 	      if (!bfd_link_pic (info)
3728 		  && h->dynindx == -1
3729 		  && tls_type == GOT_TLS_IE)
3730 		switch (SPARC_ELF_R_TYPE (rel->r_info))
3731 		  {
3732 		  case R_SPARC_TLS_GD_HI22:
3733 		  case R_SPARC_TLS_IE_HI22:
3734 		    r_type = R_SPARC_TLS_LE_HIX22;
3735 		    break;
3736 		  default:
3737 		    r_type = R_SPARC_TLS_LE_LOX10;
3738 		    break;
3739 		  }
3740 	    }
3741 	  if (tls_type == GOT_TLS_IE)
3742 	    switch (r_type)
3743 	      {
3744 	      case R_SPARC_TLS_GD_HI22:
3745 		r_type = R_SPARC_TLS_IE_HI22;
3746 		break;
3747 	      case R_SPARC_TLS_GD_LO10:
3748 		r_type = R_SPARC_TLS_IE_LO10;
3749 		break;
3750 	      }
3751 
3752 	  if (r_type == R_SPARC_TLS_LE_HIX22)
3753 	    {
3754 	      relocation = tpoff (info, relocation);
3755 	      break;
3756 	    }
3757 	  if (r_type == R_SPARC_TLS_LE_LOX10)
3758 	    {
3759 	      /* Change add into xor.  */
3760 	      relocation = tpoff (info, relocation);
3761 	      bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3762 						   contents + rel->r_offset)
3763 				       | 0x80182000), contents + rel->r_offset);
3764 	      break;
3765 	    }
3766 
3767 	  if (h != NULL)
3768 	    {
3769 	      off = h->got.offset;
3770 	      h->got.offset |= 1;
3771 	    }
3772 	  else
3773 	    {
3774 	      BFD_ASSERT (local_got_offsets != NULL);
3775 	      off = local_got_offsets[r_symndx];
3776 	      local_got_offsets[r_symndx] |= 1;
3777 	    }
3778 
3779 	r_sparc_tlsldm:
3780 	  if (htab->elf.sgot == NULL)
3781 	    abort ();
3782 
3783 	  if ((off & 1) != 0)
3784 	    off &= ~1;
3785 	  else
3786 	    {
3787 	      Elf_Internal_Rela outrel;
3788 	      int dr_type, indx;
3789 
3790 	      if (htab->elf.srelgot == NULL)
3791 		abort ();
3792 
3793 	      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3794 				  htab->elf.sgot->contents + off);
3795 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
3796 				 + htab->elf.sgot->output_offset + off);
3797 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
3798 	      if (r_type == R_SPARC_TLS_IE_HI22
3799 		  || r_type == R_SPARC_TLS_IE_LO10)
3800 		dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3801 	      else
3802 		dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3803 	      if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3804 		outrel.r_addend = relocation - dtpoff_base (info);
3805 	      else
3806 		outrel.r_addend = 0;
3807 	      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3808 	      sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3809 
3810 	      if (r_type == R_SPARC_TLS_GD_HI22
3811 		  || r_type == R_SPARC_TLS_GD_LO10)
3812 		{
3813 		  if (indx == 0)
3814 		    {
3815 	    	      BFD_ASSERT (! unresolved_reloc);
3816 		      SPARC_ELF_PUT_WORD (htab, output_bfd,
3817 					  relocation - dtpoff_base (info),
3818 					  (htab->elf.sgot->contents + off
3819 					   + SPARC_ELF_WORD_BYTES (htab)));
3820 		    }
3821 		  else
3822 		    {
3823 		      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3824 					  (htab->elf.sgot->contents + off
3825 					   + SPARC_ELF_WORD_BYTES (htab)));
3826 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3827 							SPARC_ELF_DTPOFF_RELOC (htab));
3828 		      outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3829 		      sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3830 					     &outrel);
3831 		    }
3832 		}
3833 	      else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3834 		{
3835 		  SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3836 				      (htab->elf.sgot->contents + off
3837 				       + SPARC_ELF_WORD_BYTES (htab)));
3838 		}
3839 	    }
3840 
3841 	  if (off >= (bfd_vma) -2)
3842 	    abort ();
3843 
3844 	  relocation = htab->elf.sgot->output_offset + off - got_base;
3845 	  unresolved_reloc = FALSE;
3846 	  howto = _bfd_sparc_elf_howto_table + r_type;
3847 	  break;
3848 
3849 	case R_SPARC_TLS_LDM_HI22:
3850 	case R_SPARC_TLS_LDM_LO10:
3851 	  if (! bfd_link_pic (info))
3852 	    {
3853 	      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3854 	      continue;
3855 	    }
3856 	  off = htab->tls_ldm_got.offset;
3857 	  htab->tls_ldm_got.offset |= 1;
3858 	  goto r_sparc_tlsldm;
3859 
3860 	case R_SPARC_TLS_LDO_HIX22:
3861 	case R_SPARC_TLS_LDO_LOX10:
3862 	  if (bfd_link_pic (info))
3863 	    {
3864 	      relocation -= dtpoff_base (info);
3865 	      break;
3866 	    }
3867 
3868 	  r_type = (r_type == R_SPARC_TLS_LDO_HIX22
3869 		    ? R_SPARC_TLS_LE_HIX22 : R_SPARC_TLS_LE_LOX10);
3870 	  /* Fall through.  */
3871 
3872 	case R_SPARC_TLS_LE_HIX22:
3873 	case R_SPARC_TLS_LE_LOX10:
3874 	  if (bfd_link_pic (info))
3875 	    {
3876 	      Elf_Internal_Rela outrel;
3877 	      bfd_boolean skip;
3878 
3879 	      BFD_ASSERT (sreloc != NULL);
3880 	      skip = FALSE;
3881 	      outrel.r_offset =
3882 		_bfd_elf_section_offset (output_bfd, info, input_section,
3883 					 rel->r_offset);
3884 	      if (outrel.r_offset == (bfd_vma) -1)
3885 		skip = TRUE;
3886 	      else if (outrel.r_offset == (bfd_vma) -2)
3887 		skip = TRUE;
3888 	      outrel.r_offset += (input_section->output_section->vma
3889 				  + input_section->output_offset);
3890 	      if (skip)
3891 		memset (&outrel, 0, sizeof outrel);
3892 	      else
3893 		{
3894 		  outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3895 		  outrel.r_addend = relocation - dtpoff_base (info)
3896 				    + rel->r_addend;
3897 		}
3898 
3899 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3900 	      continue;
3901 	    }
3902 	  relocation = tpoff (info, relocation);
3903 	  break;
3904 
3905 	case R_SPARC_TLS_LDM_CALL:
3906 	  if (! bfd_link_pic (info))
3907 	    {
3908 	      /* mov %g0, %o0 */
3909 	      bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3910 	      continue;
3911 	    }
3912 	  /* Fall through */
3913 
3914 	case R_SPARC_TLS_GD_CALL:
3915 	  tls_type = GOT_UNKNOWN;
3916 	  if (h == NULL && local_got_offsets)
3917 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3918 	  else if (h != NULL)
3919 	    tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3920 	  if (! bfd_link_pic (info)
3921 	      || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3922 	    {
3923 	      Elf_Internal_Rela *rel2;
3924 	      bfd_vma insn;
3925 
3926 	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
3927 		{
3928 		  /* GD -> LE */
3929 		  bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3930 		  continue;
3931 		}
3932 
3933 	      /* GD -> IE */
3934 	      if (rel + 1 < relend
3935 		  && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3936 		  && rel[1].r_offset == rel->r_offset + 4
3937 		  && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3938 		  && (((insn = bfd_get_32 (input_bfd,
3939 					   contents + rel[1].r_offset))
3940 		       >> 25) & 0x1f) == 8)
3941 		{
3942 		  /* We have
3943 		     call __tls_get_addr, %tgd_call(foo)
3944 		      add %reg1, %reg2, %o0, %tgd_add(foo)
3945 		     and change it into IE:
3946 		     {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3947 		     add %g7, %o0, %o0, %tie_add(foo).
3948 		     add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3949 		     ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3950 		     ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
3951 		  bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3952 			      contents + rel->r_offset);
3953 		  bfd_put_32 (output_bfd, 0x9001c008,
3954 			      contents + rel->r_offset + 4);
3955 		  rel++;
3956 		  continue;
3957 		}
3958 
3959 	      /* We cannot just overwrite the delay slot instruction,
3960 		 as it might be what puts the %o0 argument to
3961 		 __tls_get_addr into place.  So we have to transpose
3962 		 the delay slot with the add we patch in.  */
3963 	      insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3964 	      bfd_put_32 (output_bfd, insn,
3965 			  contents + rel->r_offset);
3966 	      bfd_put_32 (output_bfd, 0x9001c008,
3967 			  contents + rel->r_offset + 4);
3968 
3969 	      rel2 = rel;
3970 	      while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
3971 							  rel->r_offset + 4))
3972 		     != NULL)
3973 		{
3974 		  /* If the instruction we moved has a relocation attached to
3975 		     it, adjust the offset so that it will apply to the correct
3976 		     instruction.  */
3977 		  rel2->r_offset -= 4;
3978 		}
3979 	      continue;
3980 	    }
3981 
3982 	  h = (struct elf_link_hash_entry *)
3983 	      bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
3984 				    FALSE, TRUE);
3985 	  BFD_ASSERT (h != NULL);
3986 	  r_type = R_SPARC_WPLT30;
3987 	  howto = _bfd_sparc_elf_howto_table + r_type;
3988 	  goto r_sparc_wplt30;
3989 
3990 	case R_SPARC_TLS_GD_ADD:
3991 	  tls_type = GOT_UNKNOWN;
3992 	  if (h == NULL && local_got_offsets)
3993 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3994 	  else if (h != NULL)
3995 	    tls_type = _bfd_sparc_elf_hash_entry(h)->tls_type;
3996 	  if (! bfd_link_pic (info) || tls_type == GOT_TLS_IE)
3997 	    {
3998 	      /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3999 		 changed into IE:
4000 		 {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
4001 		 or LE:
4002 		 add %g7, %reg2, %reg3.  */
4003 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
4004 	      if ((h != NULL && h->dynindx != -1) || bfd_link_pic (info))
4005 		relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
4006 	      else
4007 		relocation = (insn & ~0x7c000) | 0x1c000;
4008 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
4009 	    }
4010 	  continue;
4011 
4012 	case R_SPARC_TLS_LDM_ADD:
4013 	  if (! bfd_link_pic (info))
4014 	    bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
4015 	  continue;
4016 
4017 	case R_SPARC_TLS_LDO_ADD:
4018 	  if (! bfd_link_pic (info))
4019 	    {
4020 	      /* Change rs1 into %g7.  */
4021 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
4022 	      insn = (insn & ~0x7c000) | 0x1c000;
4023 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4024 	    }
4025 	  continue;
4026 
4027 	case R_SPARC_TLS_IE_LD:
4028 	case R_SPARC_TLS_IE_LDX:
4029 	  if (! bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
4030 	    {
4031 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
4032 	      int rs2 = insn & 0x1f;
4033 	      int rd = (insn >> 25) & 0x1f;
4034 
4035 	      if (rs2 == rd)
4036 		relocation = SPARC_NOP;
4037 	      else
4038 		relocation = 0x80100000 | (insn & 0x3e00001f);
4039 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
4040 	    }
4041 	  continue;
4042 
4043 	case R_SPARC_TLS_IE_ADD:
4044 	  /* Totally useless relocation.  */
4045 	  continue;
4046 
4047 	case R_SPARC_TLS_DTPOFF32:
4048 	case R_SPARC_TLS_DTPOFF64:
4049 	  relocation -= dtpoff_base (info);
4050 	  break;
4051 
4052 	default:
4053 	  break;
4054 	}
4055 
4056       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
4057 	 because such sections are not SEC_ALLOC and thus ld.so will
4058 	 not process them.  */
4059       if (unresolved_reloc
4060 	  && !((input_section->flags & SEC_DEBUGGING) != 0
4061 	       && h->def_dynamic)
4062 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
4063 				      rel->r_offset) != (bfd_vma) -1)
4064 	_bfd_error_handler
4065 	  /* xgettext:c-format */
4066 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
4067 	   input_bfd,
4068 	   input_section,
4069 	   (long) rel->r_offset,
4070 	   howto->name,
4071 	   h->root.root.string);
4072 
4073       r = bfd_reloc_continue;
4074       if (r_type == R_SPARC_OLO10)
4075 	{
4076 	    bfd_vma x;
4077 
4078 	    if (! ABI_64_P (output_bfd))
4079 	      abort ();
4080 
4081 	    relocation += rel->r_addend;
4082 	    relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
4083 
4084 	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4085 	    x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
4086 	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4087 
4088 	    r = bfd_check_overflow (howto->complain_on_overflow,
4089 				    howto->bitsize, howto->rightshift,
4090 				    bfd_arch_bits_per_address (input_bfd),
4091 				    relocation);
4092 	}
4093       else if (r_type == R_SPARC_WDISP16)
4094 	{
4095 	  bfd_vma x;
4096 
4097 	  relocation += rel->r_addend;
4098 	  relocation -= (input_section->output_section->vma
4099 			 + input_section->output_offset);
4100 	  relocation -= rel->r_offset;
4101 
4102 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4103 	  x |= ((((relocation >> 2) & 0xc000) << 6)
4104 		| ((relocation >> 2) & 0x3fff));
4105 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4106 
4107 	  r = bfd_check_overflow (howto->complain_on_overflow,
4108 				  howto->bitsize, howto->rightshift,
4109 				  bfd_arch_bits_per_address (input_bfd),
4110 				  relocation);
4111 	}
4112       else if (r_type == R_SPARC_WDISP10)
4113 	{
4114 	  bfd_vma x;
4115 
4116 	  relocation += rel->r_addend;
4117 	  relocation -= (input_section->output_section->vma
4118 			 + input_section->output_offset);
4119 	  relocation -= rel->r_offset;
4120 
4121 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4122 	  x |= ((((relocation >> 2) & 0x300) << 11)
4123 		| (((relocation >> 2) & 0xff) << 5));
4124 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4125 
4126 	  r = bfd_check_overflow (howto->complain_on_overflow,
4127 				  howto->bitsize, howto->rightshift,
4128 				  bfd_arch_bits_per_address (input_bfd),
4129 				  relocation);
4130 	}
4131       else if (r_type == R_SPARC_REV32)
4132 	{
4133 	  bfd_vma x;
4134 
4135 	  relocation = relocation + rel->r_addend;
4136 
4137 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4138 	  x = x + relocation;
4139 	  bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
4140 	  r = bfd_reloc_ok;
4141 	}
4142       else if (r_type == R_SPARC_TLS_LDO_HIX22
4143 	       || r_type == R_SPARC_TLS_LE_HIX22)
4144 	{
4145 	  bfd_vma x;
4146 
4147 	  relocation += rel->r_addend;
4148 	  if (r_type == R_SPARC_TLS_LE_HIX22)
4149 	    relocation ^= MINUS_ONE;
4150 
4151 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4152 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
4153 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4154 	  r = bfd_reloc_ok;
4155 	}
4156       else if (r_type == R_SPARC_TLS_LDO_LOX10
4157 	       || r_type == R_SPARC_TLS_LE_LOX10)
4158 	{
4159 	  bfd_vma x;
4160 
4161 	  relocation += rel->r_addend;
4162 	  relocation &= 0x3ff;
4163 	  if (r_type == R_SPARC_TLS_LE_LOX10)
4164 	    relocation |= 0x1c00;
4165 
4166 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4167 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
4168 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4169 
4170 	  r = bfd_reloc_ok;
4171 	}
4172       else if (r_type == R_SPARC_HIX22
4173 	       || r_type == R_SPARC_GOTDATA_HIX22
4174 	       || r_type == R_SPARC_GOTDATA_OP_HIX22)
4175 	{
4176 	  bfd_vma x;
4177 
4178 	  relocation += rel->r_addend;
4179 	  if (r_type == R_SPARC_HIX22
4180 	      || (bfd_signed_vma) relocation < 0)
4181 	    relocation = relocation ^ MINUS_ONE;
4182 
4183 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4184 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
4185 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4186 
4187 	  r = bfd_check_overflow (howto->complain_on_overflow,
4188 				  howto->bitsize, howto->rightshift,
4189 				  bfd_arch_bits_per_address (input_bfd),
4190 				  relocation);
4191 	}
4192       else if (r_type == R_SPARC_LOX10
4193 	       || r_type == R_SPARC_GOTDATA_LOX10
4194 	       || r_type == R_SPARC_GOTDATA_OP_LOX10)
4195 	{
4196 	  bfd_vma x;
4197 
4198 	  relocation += rel->r_addend;
4199 	  if (r_type == R_SPARC_LOX10
4200 	      || (bfd_signed_vma) relocation < 0)
4201 	    relocation = (relocation & 0x3ff) | 0x1c00;
4202 	  else
4203 	    relocation = (relocation & 0x3ff);
4204 
4205 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4206 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
4207 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4208 
4209 	  r = bfd_reloc_ok;
4210 	}
4211       else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
4212 	       && sec_do_relax (input_section)
4213 	       && rel->r_offset + 4 < input_section->size)
4214 	{
4215 #define G0		0
4216 #define O7		15
4217 #define XCC		(2 << 20)
4218 #define COND(x)		(((x)&0xf)<<25)
4219 #define CONDA		COND(0x8)
4220 #define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
4221 #define INSN_BA		(F2(0,2) | CONDA)
4222 #define INSN_OR		F3(2, 0x2, 0)
4223 #define INSN_NOP	F2(0,4)
4224 
4225 	  bfd_vma x, y;
4226 
4227 	  /* If the instruction is a call with either:
4228 	     restore
4229 	     arithmetic instruction with rd == %o7
4230 	     where rs1 != %o7 and rs2 if it is register != %o7
4231 	     then we can optimize if the call destination is near
4232 	     by changing the call into a branch always.  */
4233 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
4234 	  y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
4235 	  if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
4236 	    {
4237 	      if (((y & OP3(~0)) == OP3(0x3d) /* restore */
4238 		   || ((y & OP3(0x28)) == 0 /* arithmetic */
4239 		       && (y & RD(~0)) == RD(O7)))
4240 		  && (y & RS1(~0)) != RS1(O7)
4241 		  && ((y & F3I(~0))
4242 		      || (y & RS2(~0)) != RS2(O7)))
4243 		{
4244 		  bfd_vma reloc;
4245 
4246 		  reloc = relocation + rel->r_addend - rel->r_offset;
4247 		  reloc -= (input_section->output_section->vma
4248 			    + input_section->output_offset);
4249 
4250 		  /* Ensure the branch fits into simm22.  */
4251 		  if ((reloc & 3) == 0
4252 		      && ((reloc & ~(bfd_vma)0x7fffff) == 0
4253 			  || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
4254 		    {
4255 		      reloc >>= 2;
4256 
4257 		      /* Check whether it fits into simm19.  */
4258 		      if (((reloc & 0x3c0000) == 0
4259 			   || (reloc & 0x3c0000) == 0x3c0000)
4260 			  && (ABI_64_P (output_bfd)
4261 			      || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
4262 			x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
4263 		      else
4264 			x = INSN_BA | (reloc & 0x3fffff); /* ba */
4265 		      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4266 		      r = bfd_reloc_ok;
4267 		      if (rel->r_offset >= 4
4268 			  && (y & (0xffffffff ^ RS1(~0)))
4269 			     == (INSN_OR | RD(O7) | RS2(G0)))
4270 			{
4271 			  bfd_vma z;
4272 			  unsigned int reg;
4273 
4274 			  z = bfd_get_32 (input_bfd,
4275 					  contents + rel->r_offset - 4);
4276 			  if ((z & (0xffffffff ^ RD(~0)))
4277 			      != (INSN_OR | RS1(O7) | RS2(G0)))
4278 			    continue;
4279 
4280 			  /* The sequence was
4281 			     or %o7, %g0, %rN
4282 			     call foo
4283 			     or %rN, %g0, %o7
4284 
4285 			     If call foo was replaced with ba, replace
4286 			     or %rN, %g0, %o7 with nop.  */
4287 
4288 			  reg = (y & RS1(~0)) >> 14;
4289 			  if (reg != ((z & RD(~0)) >> 25)
4290 			      || reg == G0 || reg == O7)
4291 			    continue;
4292 
4293 			  bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4294 				      contents + rel->r_offset + 4);
4295 			}
4296 
4297 		    }
4298 		}
4299 	    }
4300 	}
4301 
4302       if (r == bfd_reloc_continue)
4303 	{
4304 do_relocation:
4305 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4306 					contents, rel->r_offset,
4307 					relocation, rel->r_addend);
4308 	}
4309       if (r != bfd_reloc_ok)
4310 	{
4311 	  switch (r)
4312 	    {
4313 	    default:
4314 	    case bfd_reloc_outofrange:
4315 	      abort ();
4316 	    case bfd_reloc_overflow:
4317 	      {
4318 		const char *name;
4319 
4320 		/* The Solaris native linker silently disregards overflows.
4321 		   We don't, but this breaks stabs debugging info, whose
4322 		   relocations are only 32-bits wide.  Ignore overflows in
4323 		   this case and also for discarded entries.  */
4324 		if ((r_type == R_SPARC_32
4325 		     || r_type == R_SPARC_UA32
4326 		     || r_type == R_SPARC_DISP32)
4327 		    && (((input_section->flags & SEC_DEBUGGING) != 0
4328 			 && strcmp (bfd_section_name (input_bfd,
4329 						      input_section),
4330 				    ".stab") == 0)
4331 			|| _bfd_elf_section_offset (output_bfd, info,
4332 						    input_section,
4333 						    rel->r_offset)
4334 			     == (bfd_vma)-1))
4335 		  break;
4336 
4337 		if (h != NULL)
4338 		  {
4339 		    /* Assume this is a call protected by other code that
4340 		       detect the symbol is undefined.  If this is the case,
4341 		       we can safely ignore the overflow.  If not, the
4342 		       program is hosed anyway, and a little warning isn't
4343 		       going to help.  */
4344 		    if (h->root.type == bfd_link_hash_undefweak
4345 			&& howto->pc_relative)
4346 		      break;
4347 
4348 	            name = NULL;
4349 		  }
4350 		else
4351 		  {
4352 		    name = bfd_elf_string_from_elf_section (input_bfd,
4353 							    symtab_hdr->sh_link,
4354 							    sym->st_name);
4355 		    if (name == NULL)
4356 		      return FALSE;
4357 		    if (*name == '\0')
4358 		      name = bfd_section_name (input_bfd, sec);
4359 		  }
4360 		(*info->callbacks->reloc_overflow)
4361 		  (info, (h ? &h->root : NULL), name, howto->name,
4362 		   (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4363 	      }
4364 	      break;
4365 	    }
4366 	}
4367     }
4368 
4369   return TRUE;
4370 }
4371 
4372 /* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
4373    and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
4374    is the offset of the associated .got.plt entry from
4375    _GLOBAL_OFFSET_TABLE_.  */
4376 
4377 static void
4378 sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4379 			       bfd_vma plt_offset, bfd_vma plt_index,
4380 			       bfd_vma got_offset)
4381 {
4382   bfd_vma got_base;
4383   const bfd_vma *plt_entry;
4384   struct _bfd_sparc_elf_link_hash_table *htab;
4385   bfd_byte *loc;
4386   Elf_Internal_Rela rela;
4387 
4388   htab = _bfd_sparc_elf_hash_table (info);
4389   BFD_ASSERT (htab != NULL);
4390 
4391   if (bfd_link_pic (info))
4392     {
4393       plt_entry = sparc_vxworks_shared_plt_entry;
4394       got_base = 0;
4395     }
4396   else
4397     {
4398       plt_entry = sparc_vxworks_exec_plt_entry;
4399       got_base = (htab->elf.hgot->root.u.def.value
4400 		  + htab->elf.hgot->root.u.def.section->output_offset
4401 		  + htab->elf.hgot->root.u.def.section->output_section->vma);
4402     }
4403 
4404   /* Fill in the entry in the procedure linkage table.  */
4405   bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4406 	      htab->elf.splt->contents + plt_offset);
4407   bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4408 	      htab->elf.splt->contents + plt_offset + 4);
4409   bfd_put_32 (output_bfd, plt_entry[2],
4410 	      htab->elf.splt->contents + plt_offset + 8);
4411   bfd_put_32 (output_bfd, plt_entry[3],
4412 	      htab->elf.splt->contents + plt_offset + 12);
4413   bfd_put_32 (output_bfd, plt_entry[4],
4414 	      htab->elf.splt->contents + plt_offset + 16);
4415   bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4416 	      htab->elf.splt->contents + plt_offset + 20);
4417   /* PC-relative displacement for a branch to the start of
4418      the PLT section.  */
4419   bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4420 					  & 0x003fffff),
4421 	      htab->elf.splt->contents + plt_offset + 24);
4422   bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4423 	      htab->elf.splt->contents + plt_offset + 28);
4424 
4425   /* Fill in the .got.plt entry, pointing initially at the
4426      second half of the PLT entry.  */
4427   BFD_ASSERT (htab->elf.sgotplt != NULL);
4428   bfd_put_32 (output_bfd,
4429 	      htab->elf.splt->output_section->vma
4430 	      + htab->elf.splt->output_offset
4431 	      + plt_offset + 20,
4432 	      htab->elf.sgotplt->contents + got_offset);
4433 
4434   /* Add relocations to .rela.plt.unloaded.  */
4435   if (!bfd_link_pic (info))
4436     {
4437       loc = (htab->srelplt2->contents
4438 	     + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4439 
4440       /* Relocate the initial sethi.  */
4441       rela.r_offset = (htab->elf.splt->output_section->vma
4442 		       + htab->elf.splt->output_offset
4443 		       + plt_offset);
4444       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4445       rela.r_addend = got_offset;
4446       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4447       loc += sizeof (Elf32_External_Rela);
4448 
4449       /* Likewise the following or.  */
4450       rela.r_offset += 4;
4451       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4452       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4453       loc += sizeof (Elf32_External_Rela);
4454 
4455       /* Relocate the .got.plt entry.  */
4456       rela.r_offset = (htab->elf.sgotplt->output_section->vma
4457 		       + htab->elf.sgotplt->output_offset
4458 		       + got_offset);
4459       rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4460       rela.r_addend = plt_offset + 20;
4461       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4462     }
4463 }
4464 
4465 /* Finish up dynamic symbol handling.  We set the contents of various
4466    dynamic sections here.  */
4467 
4468 bfd_boolean
4469 _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4470 				      struct bfd_link_info *info,
4471 				      struct elf_link_hash_entry *h,
4472 				      Elf_Internal_Sym *sym)
4473 {
4474   struct _bfd_sparc_elf_link_hash_table *htab;
4475   const struct elf_backend_data *bed;
4476   struct _bfd_sparc_elf_link_hash_entry  *eh;
4477   bfd_boolean local_undefweak;
4478 
4479   htab = _bfd_sparc_elf_hash_table (info);
4480   BFD_ASSERT (htab != NULL);
4481   bed = get_elf_backend_data (output_bfd);
4482 
4483   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
4484 
4485   /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4486      resolved undefined weak symbols in executable so that their
4487      references have value 0 at run-time.  */
4488   local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4489 
4490   if (h->plt.offset != (bfd_vma) -1)
4491     {
4492       asection *splt;
4493       asection *srela;
4494       Elf_Internal_Rela rela;
4495       bfd_byte *loc;
4496       bfd_vma r_offset, got_offset;
4497       int rela_index;
4498 
4499       /* When building a static executable, use .iplt and
4500 	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4501       if (htab->elf.splt != NULL)
4502 	{
4503 	  splt = htab->elf.splt;
4504 	  srela = htab->elf.srelplt;
4505 	}
4506       else
4507 	{
4508 	  splt = htab->elf.iplt;
4509 	  srela = htab->elf.irelplt;
4510 	}
4511 
4512       if (splt == NULL || srela == NULL)
4513 	abort ();
4514 
4515       /* Fill in the entry in the .rela.plt section.  */
4516       if (htab->is_vxworks)
4517 	{
4518 	  /* Work out the index of this PLT entry.  */
4519 	  rela_index = ((h->plt.offset - htab->plt_header_size)
4520 			/ htab->plt_entry_size);
4521 
4522 	  /* Calculate the offset of the associated .got.plt entry.
4523 	     The first three entries are reserved.  */
4524 	  got_offset = (rela_index + 3) * 4;
4525 
4526 	  sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4527 					 rela_index, got_offset);
4528 
4529 
4530 	  /* On VxWorks, the relocation points to the .got.plt entry,
4531 	     not the .plt entry.  */
4532 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
4533 			   + htab->elf.sgotplt->output_offset
4534 			   + got_offset);
4535 	  rela.r_addend = 0;
4536 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4537 					  R_SPARC_JMP_SLOT);
4538 	}
4539       else
4540 	{
4541 	  bfd_boolean ifunc = FALSE;
4542 
4543 	  /* Fill in the entry in the procedure linkage table.  */
4544 	  rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4545 						  h->plt.offset, splt->size,
4546 						  &r_offset);
4547 
4548 	  if (h == NULL
4549 	      || h->dynindx == -1
4550 	      || ((bfd_link_executable (info)
4551 		   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4552 		  && h->def_regular
4553 		  && h->type == STT_GNU_IFUNC))
4554 	    {
4555 	      ifunc = TRUE;
4556 	      BFD_ASSERT (h == NULL
4557 			  || (h->type == STT_GNU_IFUNC
4558 			      && h->def_regular
4559 			      && (h->root.type == bfd_link_hash_defined
4560 				  || h->root.type == bfd_link_hash_defweak)));
4561 	    }
4562 
4563 	  rela.r_offset = r_offset
4564 	    + (splt->output_section->vma + splt->output_offset);
4565 	  if (ABI_64_P (output_bfd)
4566 	      && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4567 	    {
4568 	      if (ifunc)
4569 		{
4570 		  rela.r_addend = (h->root.u.def.section->output_section->vma
4571 				   + h->root.u.def.section->output_offset
4572 				   + h->root.u.def.value);
4573 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4574 						  R_SPARC_IRELATIVE);
4575 		}
4576 	      else
4577 		{
4578 		  rela.r_addend = (-(h->plt.offset + 4)
4579 				   - splt->output_section->vma
4580 				   - splt->output_offset);
4581 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4582 						  R_SPARC_JMP_SLOT);
4583 		}
4584 	    }
4585 	  else
4586 	    {
4587 	      if (ifunc)
4588 		{
4589 		  rela.r_addend = (h->root.u.def.section->output_section->vma
4590 				   + h->root.u.def.section->output_offset
4591 				   + h->root.u.def.value);
4592 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4593 						  R_SPARC_JMP_IREL);
4594 		}
4595 	      else
4596 		{
4597 		  rela.r_addend = 0;
4598 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4599 						  R_SPARC_JMP_SLOT);
4600 		}
4601 	    }
4602 	}
4603 
4604       /* Adjust for the first 4 reserved elements in the .plt section
4605 	 when setting the offset in the .rela.plt section.
4606 	 Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4607 	 thus .plt[4] has corresponding .rela.plt[0] and so on.  */
4608 
4609       loc = srela->contents;
4610       loc += rela_index * bed->s->sizeof_rela;
4611       bed->s->swap_reloca_out (output_bfd, &rela, loc);
4612 
4613       if (!local_undefweak
4614           && !h->def_regular)
4615 	{
4616 	  /* Mark the symbol as undefined, rather than as defined in
4617 	     the .plt section.  Leave the value alone.  */
4618 	  sym->st_shndx = SHN_UNDEF;
4619 	  /* If the symbol is weak, we do need to clear the value.
4620 	     Otherwise, the PLT entry would provide a definition for
4621 	     the symbol even if the symbol wasn't defined anywhere,
4622 	     and so the symbol would never be NULL.  */
4623 	  if (!h->ref_regular_nonweak)
4624 	    sym->st_value = 0;
4625 	}
4626     }
4627 
4628   /* Don't generate dynamic GOT relocation against undefined weak
4629      symbol in executable.  */
4630   if (h->got.offset != (bfd_vma) -1
4631       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4632       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
4633       && !local_undefweak)
4634     {
4635       asection *sgot;
4636       asection *srela;
4637       Elf_Internal_Rela rela;
4638 
4639       /* This symbol has an entry in the GOT.  Set it up.  */
4640 
4641       sgot = htab->elf.sgot;
4642       srela = htab->elf.srelgot;
4643       BFD_ASSERT (sgot != NULL && srela != NULL);
4644 
4645       rela.r_offset = (sgot->output_section->vma
4646 		       + sgot->output_offset
4647 		       + (h->got.offset &~ (bfd_vma) 1));
4648 
4649       /* If this is a -Bsymbolic link, and the symbol is defined
4650 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
4651 	 the symbol was forced to be local because of a version file.
4652 	 The entry in the global offset table will already have been
4653 	 initialized in the relocate_section function.  */
4654       if (! bfd_link_pic (info)
4655 	  && h->type == STT_GNU_IFUNC
4656 	  && h->def_regular)
4657 	{
4658 	  asection *plt;
4659 
4660 	  /* We load the GOT entry with the PLT entry.  */
4661 	  plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4662 	  SPARC_ELF_PUT_WORD (htab, output_bfd,
4663 			      (plt->output_section->vma
4664 			       + plt->output_offset + h->plt.offset),
4665 			      htab->elf.sgot->contents
4666 			      + (h->got.offset & ~(bfd_vma) 1));
4667 	  return TRUE;
4668 	}
4669       else if (bfd_link_pic (info)
4670 	       && SYMBOL_REFERENCES_LOCAL (info, h))
4671 	{
4672 	  asection *sec = h->root.u.def.section;
4673 	  if (h->type == STT_GNU_IFUNC)
4674 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4675 	  else
4676 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4677 	  rela.r_addend = (h->root.u.def.value
4678 			   + sec->output_section->vma
4679 			   + sec->output_offset);
4680 	}
4681       else
4682 	{
4683 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4684 	  rela.r_addend = 0;
4685 	}
4686 
4687       SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4688 			  sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4689       sparc_elf_append_rela (output_bfd, srela, &rela);
4690     }
4691 
4692   if (h->needs_copy)
4693     {
4694       asection *s;
4695       Elf_Internal_Rela rela;
4696 
4697       /* This symbols needs a copy reloc.  Set it up.  */
4698       BFD_ASSERT (h->dynindx != -1);
4699 
4700       rela.r_offset = (h->root.u.def.value
4701 		       + h->root.u.def.section->output_section->vma
4702 		       + h->root.u.def.section->output_offset);
4703       rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4704       rela.r_addend = 0;
4705       if (h->root.u.def.section == htab->elf.sdynrelro)
4706 	s = htab->elf.sreldynrelro;
4707       else
4708 	s = htab->elf.srelbss;
4709       sparc_elf_append_rela (output_bfd, s, &rela);
4710     }
4711 
4712   /* Mark some specially defined symbols as absolute.  On VxWorks,
4713      _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4714      ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
4715   if (sym != NULL
4716       && (h == htab->elf.hdynamic
4717 	  || (!htab->is_vxworks
4718 	      && (h == htab->elf.hgot || h == htab->elf.hplt))))
4719     sym->st_shndx = SHN_ABS;
4720 
4721   return TRUE;
4722 }
4723 
4724 /* Finish up the dynamic sections.  */
4725 
4726 static bfd_boolean
4727 sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4728 		  bfd *dynobj, asection *sdyn,
4729 		  asection *splt ATTRIBUTE_UNUSED)
4730 {
4731   struct _bfd_sparc_elf_link_hash_table *htab;
4732   const struct elf_backend_data *bed;
4733   bfd_byte *dyncon, *dynconend;
4734   size_t dynsize;
4735   int stt_regidx = -1;
4736   bfd_boolean abi_64_p;
4737 
4738   htab = _bfd_sparc_elf_hash_table (info);
4739   BFD_ASSERT (htab != NULL);
4740   bed = get_elf_backend_data (output_bfd);
4741   dynsize = bed->s->sizeof_dyn;
4742   dynconend = sdyn->contents + sdyn->size;
4743   abi_64_p = ABI_64_P (output_bfd);
4744   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4745     {
4746       Elf_Internal_Dyn dyn;
4747       bfd_boolean size;
4748 
4749       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4750 
4751       if (htab->is_vxworks && dyn.d_tag == DT_PLTGOT)
4752 	{
4753 	  /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4754 	     not to the start of the PLT.  */
4755 	  if (htab->elf.sgotplt)
4756 	    {
4757 	      dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4758 				+ htab->elf.sgotplt->output_offset);
4759 	      bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4760 	    }
4761 	}
4762       else if (htab->is_vxworks
4763 	       && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4764 	bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4765       else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4766 	{
4767 	  if (stt_regidx == -1)
4768 	    {
4769 	      stt_regidx =
4770 		_bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4771 	      if (stt_regidx == -1)
4772 		return FALSE;
4773 	    }
4774 	  dyn.d_un.d_val = stt_regidx++;
4775 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4776 	}
4777       else
4778 	{
4779 	  asection *s;
4780 
4781 	  switch (dyn.d_tag)
4782 	    {
4783 	    case DT_PLTGOT:
4784 	      s = htab->elf.splt;
4785 	      size = FALSE;
4786 	      break;
4787 	    case DT_PLTRELSZ:
4788 	      s = htab->elf.srelplt;
4789 	      size = TRUE;
4790 	      break;
4791 	    case DT_JMPREL:
4792 	      s = htab->elf.srelplt;
4793 	      size = FALSE;
4794 	      break;
4795 	    default:
4796 	      continue;
4797 	    }
4798 
4799 	  if (s == NULL)
4800 	    dyn.d_un.d_val = 0;
4801 	  else
4802 	    {
4803 	      if (!size)
4804 		dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4805 	      else
4806 		dyn.d_un.d_val = s->size;
4807 	    }
4808 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4809 	}
4810     }
4811   return TRUE;
4812 }
4813 
4814 /* Install the first PLT entry in a VxWorks executable and make sure that
4815    .rela.plt.unloaded relocations have the correct symbol indexes.  */
4816 
4817 static void
4818 sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4819 {
4820   struct _bfd_sparc_elf_link_hash_table *htab;
4821   Elf_Internal_Rela rela;
4822   bfd_vma got_base;
4823   bfd_byte *loc;
4824 
4825   htab = _bfd_sparc_elf_hash_table (info);
4826   BFD_ASSERT (htab != NULL);
4827 
4828   /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
4829   got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4830 	      + htab->elf.hgot->root.u.def.section->output_offset
4831 	      + htab->elf.hgot->root.u.def.value);
4832 
4833   /* Install the initial PLT entry.  */
4834   bfd_put_32 (output_bfd,
4835 	      sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4836 	      htab->elf.splt->contents);
4837   bfd_put_32 (output_bfd,
4838 	      sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4839 	      htab->elf.splt->contents + 4);
4840   bfd_put_32 (output_bfd,
4841 	      sparc_vxworks_exec_plt0_entry[2],
4842 	      htab->elf.splt->contents + 8);
4843   bfd_put_32 (output_bfd,
4844 	      sparc_vxworks_exec_plt0_entry[3],
4845 	      htab->elf.splt->contents + 12);
4846   bfd_put_32 (output_bfd,
4847 	      sparc_vxworks_exec_plt0_entry[4],
4848 	      htab->elf.splt->contents + 16);
4849 
4850   loc = htab->srelplt2->contents;
4851 
4852   /* Add an unloaded relocation for the initial entry's "sethi".  */
4853   rela.r_offset = (htab->elf.splt->output_section->vma
4854 		   + htab->elf.splt->output_offset);
4855   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4856   rela.r_addend = 8;
4857   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4858   loc += sizeof (Elf32_External_Rela);
4859 
4860   /* Likewise the following "or".  */
4861   rela.r_offset += 4;
4862   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4863   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4864   loc += sizeof (Elf32_External_Rela);
4865 
4866   /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
4867      the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4868      in which symbols were output.  */
4869   while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4870     {
4871       Elf_Internal_Rela rel;
4872 
4873       /* The entry's initial "sethi" (against _G_O_T_).  */
4874       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4875       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4876       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4877       loc += sizeof (Elf32_External_Rela);
4878 
4879       /* The following "or" (also against _G_O_T_).  */
4880       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4881       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4882       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4883       loc += sizeof (Elf32_External_Rela);
4884 
4885       /* The .got.plt entry (against _P_L_T_).  */
4886       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4887       rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4888       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4889       loc += sizeof (Elf32_External_Rela);
4890     }
4891 }
4892 
4893 /* Install the first PLT entry in a VxWorks shared object.  */
4894 
4895 static void
4896 sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4897 {
4898   struct _bfd_sparc_elf_link_hash_table *htab;
4899   unsigned int i;
4900 
4901   htab = _bfd_sparc_elf_hash_table (info);
4902   BFD_ASSERT (htab != NULL);
4903 
4904   for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4905     bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4906 		htab->elf.splt->contents + i * 4);
4907 }
4908 
4909 /* Finish up local dynamic symbol handling.  We set the contents of
4910    various dynamic sections here.  */
4911 
4912 static bfd_boolean
4913 finish_local_dynamic_symbol (void **slot, void *inf)
4914 {
4915   struct elf_link_hash_entry *h
4916     = (struct elf_link_hash_entry *) *slot;
4917   struct bfd_link_info *info
4918     = (struct bfd_link_info *) inf;
4919 
4920   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4921 					       h, NULL);
4922 }
4923 
4924 /* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4925    here since undefined weak symbol may not be dynamic and may not be
4926    called for _bfd_sparc_elf_finish_dynamic_symbol.  */
4927 
4928 static bfd_boolean
4929 pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4930                              void *inf)
4931 {
4932   struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4933   struct bfd_link_info *info = (struct bfd_link_info *) inf;
4934 
4935   if (h->root.type != bfd_link_hash_undefweak
4936       || h->dynindx != -1)
4937     return TRUE;
4938 
4939   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4940                                                h, NULL);
4941 }
4942 
4943 bfd_boolean
4944 _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4945 {
4946   bfd *dynobj;
4947   asection *sdyn;
4948   struct _bfd_sparc_elf_link_hash_table *htab;
4949 
4950   htab = _bfd_sparc_elf_hash_table (info);
4951   BFD_ASSERT (htab != NULL);
4952   dynobj = htab->elf.dynobj;
4953 
4954   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4955 
4956   if (elf_hash_table (info)->dynamic_sections_created)
4957     {
4958       asection *splt;
4959 
4960       splt = htab->elf.splt;
4961       BFD_ASSERT (splt != NULL && sdyn != NULL);
4962 
4963       if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4964 	return FALSE;
4965 
4966       /* Initialize the contents of the .plt section.  */
4967       if (splt->size > 0)
4968 	{
4969 	  if (htab->is_vxworks)
4970 	    {
4971 	      if (bfd_link_pic (info))
4972 		sparc_vxworks_finish_shared_plt (output_bfd, info);
4973 	      else
4974 		sparc_vxworks_finish_exec_plt (output_bfd, info);
4975 	    }
4976 	  else
4977 	    {
4978 	      memset (splt->contents, 0, htab->plt_header_size);
4979 	      if (!ABI_64_P (output_bfd))
4980 		bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4981 			    splt->contents + splt->size - 4);
4982 	    }
4983 	}
4984 
4985       if (elf_section_data (splt->output_section) != NULL)
4986         elf_section_data (splt->output_section)->this_hdr.sh_entsize
4987           = ((htab->is_vxworks || !ABI_64_P (output_bfd))
4988              ? 0 : htab->plt_entry_size);
4989     }
4990 
4991   /* Set the first entry in the global offset table to the address of
4992      the dynamic section.  */
4993   if (htab->elf.sgot && htab->elf.sgot->size > 0)
4994     {
4995       bfd_vma val = (sdyn ?
4996 		     sdyn->output_section->vma + sdyn->output_offset :
4997 		     0);
4998 
4999       SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
5000     }
5001 
5002   if (htab->elf.sgot)
5003     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
5004       SPARC_ELF_WORD_BYTES (htab);
5005 
5006   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
5007   htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
5008 
5009   /* Fill PLT entries for undefined weak symbols in PIE.  */
5010   if (bfd_link_pie (info))
5011     bfd_hash_traverse (&info->hash->table,
5012                        pie_finish_undefweak_symbol,
5013                        info);
5014   return TRUE;
5015 }
5016 
5017 
5018 /* Set the right machine number for a SPARC ELF file.  */
5019 
5020 bfd_boolean
5021 _bfd_sparc_elf_object_p (bfd *abfd)
5022 {
5023   obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
5024   obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
5025   obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
5026 
5027   unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
5028   unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
5029                                   | ELF_SPARC_HWCAP_VIS3
5030                                   | ELF_SPARC_HWCAP_HPC);
5031   unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
5032                                   | ELF_SPARC_HWCAP_DES
5033                                   | ELF_SPARC_HWCAP_KASUMI
5034                                   | ELF_SPARC_HWCAP_CAMELLIA
5035                                   | ELF_SPARC_HWCAP_MD5
5036                                   | ELF_SPARC_HWCAP_SHA1
5037                                   | ELF_SPARC_HWCAP_SHA256
5038                                   | ELF_SPARC_HWCAP_SHA512
5039                                   | ELF_SPARC_HWCAP_MPMUL
5040                                   | ELF_SPARC_HWCAP_MONT
5041                                   | ELF_SPARC_HWCAP_CRC32C
5042                                   | ELF_SPARC_HWCAP_CBCOND
5043                                   | ELF_SPARC_HWCAP_PAUSE);
5044   unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
5045                                  | ELF_SPARC_HWCAP_IMA);
5046   unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
5047                                    | ELF_SPARC_HWCAP2_MWAIT
5048                                    | ELF_SPARC_HWCAP2_XMPMUL
5049                                    | ELF_SPARC_HWCAP2_XMONT);
5050 
5051   if (ABI_64_P (abfd))
5052     {
5053       unsigned long mach = bfd_mach_sparc_v9;
5054 
5055       if (hwcaps2->i & v9m_hwcaps2_mask)
5056         mach = bfd_mach_sparc_v9m;
5057       else if (hwcaps->i & v9v_hwcaps_mask)
5058         mach = bfd_mach_sparc_v9v;
5059       else if (hwcaps->i & v9e_hwcaps_mask)
5060         mach = bfd_mach_sparc_v9e;
5061       else if (hwcaps->i & v9d_hwcaps_mask)
5062         mach = bfd_mach_sparc_v9d;
5063       else if (hwcaps->i & v9c_hwcaps_mask)
5064         mach = bfd_mach_sparc_v9c;
5065       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
5066 	mach = bfd_mach_sparc_v9b;
5067       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
5068 	mach = bfd_mach_sparc_v9a;
5069       return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
5070     }
5071   else
5072     {
5073       if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
5074 	{
5075           if (hwcaps2->i & v9m_hwcaps2_mask)
5076 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5077 					      bfd_mach_sparc_v8plusm);
5078           else if (hwcaps->i & v9v_hwcaps_mask)
5079             return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5080 					      bfd_mach_sparc_v8plusv);
5081           else if (hwcaps->i & v9e_hwcaps_mask)
5082             return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5083 					      bfd_mach_sparc_v8pluse);
5084           else if (hwcaps->i & v9d_hwcaps_mask)
5085             return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5086 					      bfd_mach_sparc_v8plusd);
5087           else if (hwcaps->i & v9c_hwcaps_mask)
5088             return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5089 					      bfd_mach_sparc_v8plusc);
5090 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
5091 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5092 					      bfd_mach_sparc_v8plusb);
5093 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
5094 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5095 					      bfd_mach_sparc_v8plusa);
5096 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
5097 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5098 					      bfd_mach_sparc_v8plus);
5099 	  else
5100 	    return FALSE;
5101 	}
5102       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
5103 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
5104 					  bfd_mach_sparc_sparclite_le);
5105       else
5106 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
5107     }
5108 }
5109 
5110 /* Return address for Ith PLT stub in section PLT, for relocation REL
5111    or (bfd_vma) -1 if it should not be included.  */
5112 
5113 bfd_vma
5114 _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
5115 {
5116   if (ABI_64_P (plt->owner))
5117     {
5118       bfd_vma j;
5119 
5120       i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
5121       if (i < PLT64_LARGE_THRESHOLD)
5122 	return plt->vma + i * PLT64_ENTRY_SIZE;
5123 
5124       j = (i - PLT64_LARGE_THRESHOLD) % 160;
5125       i -= j;
5126       return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
5127     }
5128   else
5129     return rel->address;
5130 }
5131 
5132 /* Merge backend specific data from an object file to the output
5133    object file when linking.  */
5134 
5135 bfd_boolean
5136 _bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5137 {
5138   bfd *obfd = info->output_bfd;
5139   obj_attribute *in_attr, *in_attrs;
5140   obj_attribute *out_attr, *out_attrs;
5141 
5142   if (!elf_known_obj_attributes_proc (obfd)[0].i)
5143     {
5144       /* This is the first object.  Copy the attributes.  */
5145       _bfd_elf_copy_obj_attributes (ibfd, obfd);
5146 
5147       /* Use the Tag_null value to indicate the attributes have been
5148 	 initialized.  */
5149       elf_known_obj_attributes_proc (obfd)[0].i = 1;
5150 
5151       return TRUE;
5152     }
5153 
5154   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
5155   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
5156 
5157   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
5158   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
5159 
5160   out_attr->i |= in_attr->i;
5161   out_attr->type = 1;
5162 
5163   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
5164   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
5165 
5166   out_attr->i |= in_attr->i;
5167   out_attr->type = 1;
5168 
5169   /* Merge Tag_compatibility attributes and any common GNU ones.  */
5170   _bfd_elf_merge_object_attributes (ibfd, info);
5171 
5172   return TRUE;
5173 }
5174