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