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   const struct elf_backend_data *bed;
2788 
2789   htab = _bfd_sparc_elf_hash_table (info);
2790   BFD_ASSERT (htab != NULL);
2791   symtab_hdr = &elf_symtab_hdr (input_bfd);
2792   sym_hashes = elf_sym_hashes (input_bfd);
2793   local_got_offsets = elf_local_got_offsets (input_bfd);
2794   bed = get_elf_backend_data (output_bfd);
2795 
2796   if (elf_hash_table (info)->hgot == NULL)
2797     got_base = 0;
2798   else
2799     got_base = elf_hash_table (info)->hgot->root.u.def.value;
2800 
2801   sreloc = elf_section_data (input_section)->sreloc;
2802   /* We have to handle relocations in vxworks .tls_vars sections
2803      specially, because the dynamic loader is 'weird'.  */
2804   is_vxworks_tls = (htab->elf.target_os == is_vxworks
2805 		    && bfd_link_pic (info)
2806 		    && !strcmp (input_section->output_section->name,
2807 				".tls_vars"));
2808 
2809   rel = relocs;
2810   if (ABI_64_P (output_bfd))
2811     num_relocs = NUM_SHDR_ENTRIES (_bfd_elf_single_rel_hdr (input_section));
2812   else
2813     num_relocs = input_section->reloc_count;
2814   relend = relocs + num_relocs;
2815   for (; rel < relend; rel++)
2816     {
2817       int r_type, tls_type;
2818       reloc_howto_type *howto;
2819       unsigned long r_symndx;
2820       struct elf_link_hash_entry *h;
2821       struct _bfd_sparc_elf_link_hash_entry *eh;
2822       Elf_Internal_Sym *sym;
2823       asection *sec;
2824       bfd_vma relocation, off;
2825       bfd_reloc_status_type r;
2826       bool is_plt = false;
2827       bool unresolved_reloc;
2828       bool resolved_to_zero;
2829       bool relative_reloc;
2830 
2831       r_type = SPARC_ELF_R_TYPE (rel->r_info);
2832       if (r_type == R_SPARC_GNU_VTINHERIT
2833 	  || r_type == R_SPARC_GNU_VTENTRY)
2834 	continue;
2835 
2836       if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2837 	{
2838 	  bfd_set_error (bfd_error_bad_value);
2839 	  return false;
2840 	}
2841 
2842       howto = _bfd_sparc_elf_howto_table + r_type;
2843       r_symndx = SPARC_ELF_R_SYMNDX (htab, rel->r_info);
2844       h = NULL;
2845       sym = NULL;
2846       sec = NULL;
2847       unresolved_reloc = false;
2848       if (r_symndx < symtab_hdr->sh_info)
2849 	{
2850 	  sym = local_syms + r_symndx;
2851 	  sec = local_sections[r_symndx];
2852 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2853 
2854 	  if (!bfd_link_relocatable (info)
2855 	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
2856 	    {
2857 	      /* Relocate against local STT_GNU_IFUNC symbol.  */
2858 	      h = elf_sparc_get_local_sym_hash (htab, input_bfd,
2859 						rel, false);
2860 	      if (h == NULL)
2861 		abort ();
2862 
2863 	      /* Set STT_GNU_IFUNC symbol value.  */
2864 	      h->root.u.def.value = sym->st_value;
2865 	      h->root.u.def.section = sec;
2866 	    }
2867 	}
2868       else
2869 	{
2870 	  bool warned, ignored;
2871 
2872 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2873 				   r_symndx, symtab_hdr, sym_hashes,
2874 				   h, sec, relocation,
2875 				   unresolved_reloc, warned, ignored);
2876 	  if (warned)
2877 	    {
2878 	      /* To avoid generating warning messages about truncated
2879 		 relocations, set the relocation's address to be the same as
2880 		 the start of this section.  */
2881 	      if (input_section->output_section != NULL)
2882 		relocation = input_section->output_section->vma;
2883 	      else
2884 		relocation = 0;
2885 	    }
2886 	}
2887 
2888       if (sec != NULL && discarded_section (sec))
2889 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2890 					 rel, 1, relend, howto, 0, contents);
2891 
2892       if (bfd_link_relocatable (info))
2893 	continue;
2894 
2895       if (h != NULL
2896 	  && h->type == STT_GNU_IFUNC
2897 	  && h->def_regular)
2898 	{
2899 	  asection *plt_sec;
2900 	  const char *name;
2901 
2902 	  if ((input_section->flags & SEC_ALLOC) == 0
2903 	      || h->plt.offset == (bfd_vma) -1)
2904 	    {
2905 	      /* If this is a SHT_NOTE section without SHF_ALLOC, treat
2906 	         STT_GNU_IFUNC symbol as STT_FUNC.  */
2907 	      if (elf_section_type (input_section) == SHT_NOTE)
2908 		goto skip_ifunc;
2909 
2910 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
2911 		 sections because such sections are not SEC_ALLOC and
2912 		 thus ld.so will not process them.  */
2913 	      if ((input_section->flags & SEC_ALLOC) == 0
2914 		  && (input_section->flags & SEC_DEBUGGING) != 0)
2915 		continue;
2916 
2917 	      _bfd_error_handler
2918 		/* xgettext:c-format */
2919 		(_("%pB(%pA+%#" PRIx64 "): "
2920 		   "unresolvable %s relocation against symbol `%s'"),
2921 		 input_bfd,
2922 		 input_section,
2923 		 (uint64_t) rel->r_offset,
2924 		 howto->name,
2925 		 h->root.root.string);
2926 	      bfd_set_error (bfd_error_bad_value);
2927 	      return false;
2928 	    }
2929 
2930 	  plt_sec = htab->elf.splt;
2931 	  if (! plt_sec)
2932 	    plt_sec =htab->elf.iplt;
2933 
2934 	  switch (r_type)
2935 	    {
2936 	    case R_SPARC_GOTDATA_OP:
2937 	      continue;
2938 
2939 	    case R_SPARC_GOTDATA_OP_HIX22:
2940 	    case R_SPARC_GOTDATA_OP_LOX10:
2941 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
2942 			? R_SPARC_GOT22
2943 			: R_SPARC_GOT10);
2944 	      howto = _bfd_sparc_elf_howto_table + r_type;
2945 	      /* Fall through.  */
2946 
2947 	    case R_SPARC_GOT10:
2948 	    case R_SPARC_GOT13:
2949 	    case R_SPARC_GOT22:
2950 	      if (htab->elf.sgot == NULL)
2951 		abort ();
2952 	      off = h->got.offset;
2953 	      if (off == (bfd_vma) -1)
2954 		abort();
2955 	      relocation = htab->elf.sgot->output_offset + off - got_base;
2956 	      goto do_relocation;
2957 
2958 	    case R_SPARC_WPLT30:
2959 	    case R_SPARC_WDISP30:
2960 	      relocation = (plt_sec->output_section->vma
2961 			    + plt_sec->output_offset + h->plt.offset);
2962 	      goto do_relocation;
2963 
2964 	    case R_SPARC_32:
2965 	    case R_SPARC_64:
2966 	      if (bfd_link_pic (info) && h->non_got_ref)
2967 		{
2968 		  Elf_Internal_Rela outrel;
2969 		  bfd_vma offset;
2970 
2971 		  offset = _bfd_elf_section_offset (output_bfd, info,
2972 						    input_section,
2973 						    rel->r_offset);
2974 		  if (offset == (bfd_vma) -1
2975 		      || offset == (bfd_vma) -2)
2976 		    abort();
2977 
2978 		  outrel.r_offset = (input_section->output_section->vma
2979 				     + input_section->output_offset
2980 				     + offset);
2981 
2982 		  if (h->dynindx == -1
2983 		      || h->forced_local
2984 		      || bfd_link_executable (info))
2985 		    {
2986 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
2987 							0, R_SPARC_IRELATIVE);
2988 		      outrel.r_addend = relocation + rel->r_addend;
2989 		    }
2990 		  else
2991 		    {
2992 		      if (h->dynindx == -1)
2993 			abort();
2994 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
2995 		      outrel.r_addend = rel->r_addend;
2996 		    }
2997 
2998 		  sparc_elf_append_rela (output_bfd, sreloc, &outrel);
2999 		  continue;
3000 		}
3001 
3002 	      relocation = (plt_sec->output_section->vma
3003 			    + plt_sec->output_offset + h->plt.offset);
3004 	      goto do_relocation;
3005 
3006 	    case R_SPARC_HI22:
3007 	    case R_SPARC_LO10:
3008 	      /* We should only see such relocs in static links.  */
3009 	      if (bfd_link_pic (info))
3010 		abort();
3011 	      relocation = (plt_sec->output_section->vma
3012 			    + plt_sec->output_offset + h->plt.offset);
3013 	      goto do_relocation;
3014 
3015 	    default:
3016 	      if (h->root.root.string)
3017 		name = h->root.root.string;
3018 	      else
3019 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3020 					 NULL);
3021 	      _bfd_error_handler
3022 		/* xgettext:c-format */
3023 		(_("%pB: relocation %s against STT_GNU_IFUNC "
3024 		   "symbol `%s' isn't handled by %s"), input_bfd,
3025 		 _bfd_sparc_elf_howto_table[r_type].name,
3026 		 name, __FUNCTION__);
3027 	      bfd_set_error (bfd_error_bad_value);
3028 	      return false;
3029 	    }
3030 	}
3031 
3032     skip_ifunc:
3033       eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
3034       resolved_to_zero = eh && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
3035 
3036       switch (r_type)
3037 	{
3038 	case R_SPARC_GOTDATA_OP_HIX22:
3039 	case R_SPARC_GOTDATA_OP_LOX10:
3040 	  if (gdop_relative_offset_ok (info, h, relocation))
3041 	    {
3042 	      r_type = (r_type == R_SPARC_GOTDATA_OP_HIX22
3043 			? R_SPARC_GOTDATA_HIX22
3044 			: R_SPARC_GOTDATA_LOX10);
3045 	      howto = _bfd_sparc_elf_howto_table + r_type;
3046 	    }
3047 	  break;
3048 
3049 	case R_SPARC_GOTDATA_OP:
3050 	  if (gdop_relative_offset_ok (info, h, relocation))
3051 	    {
3052 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3053 
3054 	      /* {ld,ldx} [%rs1 + %rs2], %rd --> add %rs1, %rs2, %rd */
3055 	      relocation = 0x80000000 | (insn & 0x3e07c01f);
3056 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3057 
3058 	      /* If the symbol is global but not dynamic, an .rela.* slot has
3059 		 been allocated for it in the GOT so output R_SPARC_NONE here,
3060 		 if it isn't also subject to another, old-style GOT relocation.
3061 		 See also the handling of these GOT relocations just below.  */
3062 	      if (h != NULL
3063 		  && h->dynindx == -1
3064 		  && !h->forced_local
3065 		  && h->root.type != bfd_link_hash_undefweak
3066 		  && !eh->has_old_style_got_reloc
3067 		  && (h->got.offset & 1) == 0
3068 		  && bfd_link_pic (info))
3069 		{
3070 		  asection *s = htab->elf.srelgot;
3071 		  Elf_Internal_Rela outrel;
3072 
3073 		  BFD_ASSERT (s != NULL);
3074 
3075 		  memset (&outrel, 0, sizeof outrel);
3076 		  sparc_elf_append_rela (output_bfd, s, &outrel);
3077 		  h->got.offset |= 1;
3078 		}
3079 	    }
3080 	  continue;
3081 	}
3082 
3083       switch (r_type)
3084 	{
3085 	case R_SPARC_GOTDATA_HIX22:
3086 	case R_SPARC_GOTDATA_LOX10:
3087 	  relocation = gdopoff (info, relocation);
3088 	  break;
3089 
3090 	case R_SPARC_GOTDATA_OP_HIX22:
3091 	case R_SPARC_GOTDATA_OP_LOX10:
3092 	case R_SPARC_GOT10:
3093 	case R_SPARC_GOT13:
3094 	case R_SPARC_GOT22:
3095 	  /* Relocation is to the entry for this symbol in the global
3096 	     offset table.  */
3097 	  if (htab->elf.sgot == NULL)
3098 	    abort ();
3099 
3100 	  relative_reloc = false;
3101 	  if (h != NULL)
3102 	    {
3103 	      bool dyn;
3104 
3105 	      off = h->got.offset;
3106 	      BFD_ASSERT (off != (bfd_vma) -1);
3107 	      dyn = elf_hash_table (info)->dynamic_sections_created;
3108 
3109 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3110 						     bfd_link_pic (info),
3111 						     h)
3112 		  || (bfd_link_pic (info)
3113 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
3114 		{
3115 		  /* This is actually a static link, or it is a
3116 		     -Bsymbolic link and the symbol is defined
3117 		     locally, or the symbol was forced to be local
3118 		     because of a version file.  We must initialize
3119 		     this entry in the global offset table.  Since the
3120 		     offset must always be a multiple of 8 for 64-bit
3121 		     and 4 for 32-bit, we use the least significant bit
3122 		     to record whether we have initialized it already.
3123 
3124 		     When doing a dynamic link, we create a .rela.got
3125 		     relocation entry to initialize the value.  This
3126 		     is done in the finish_dynamic_symbol routine.  */
3127 		  if ((off & 1) != 0)
3128 		    off &= ~1;
3129 		  else
3130 		    {
3131 		      /* If this symbol isn't dynamic in PIC mode, treat it
3132 			 like a local symbol in PIC mode below.  */
3133 		      if (h->dynindx == -1
3134 			  && !h->forced_local
3135 			  && h->root.type != bfd_link_hash_undefweak
3136 			  && bfd_link_pic (info))
3137 			relative_reloc = true;
3138 		      else
3139 			SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3140 					    htab->elf.sgot->contents + off);
3141 		      h->got.offset |= 1;
3142 		    }
3143 		}
3144 	      else
3145 		unresolved_reloc = false;
3146 	    }
3147 	  else
3148 	    {
3149 	      BFD_ASSERT (local_got_offsets != NULL
3150 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
3151 
3152 	      off = local_got_offsets[r_symndx];
3153 
3154 	      /* The offset must always be a multiple of 8 on 64-bit and
3155 		 4 on 32-bit.  We use the least significant bit to record
3156 		 whether we have already processed this entry.  */
3157 	      if ((off & 1) != 0)
3158 		off &= ~1;
3159 	      else
3160 		{
3161 		  /* For a local symbol in PIC mode, we need to generate a
3162 		     R_SPARC_RELATIVE reloc for the dynamic linker.  */
3163 		  if (bfd_link_pic (info))
3164 		    relative_reloc = true;
3165 		  else
3166 		    SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3167 					htab->elf.sgot->contents + off);
3168 		  local_got_offsets[r_symndx] |= 1;
3169 		}
3170 	    }
3171 
3172 	  if (relative_reloc)
3173 	    {
3174 	      asection *s = htab->elf.srelgot;
3175 	      Elf_Internal_Rela outrel;
3176 
3177 	      BFD_ASSERT (s != NULL);
3178 
3179 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
3180 				 + htab->elf.sgot->output_offset
3181 				 + off);
3182 	      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3183 						0, R_SPARC_RELATIVE);
3184 	      outrel.r_addend = relocation;
3185 	      sparc_elf_append_rela (output_bfd, s, &outrel);
3186 	      /* Versions of glibc ld.so at least up to 2.26 wrongly
3187 		 add the section contents to the value calculated for
3188 		 a RELATIVE reloc.  Zero the contents to work around
3189 		 this bug.  */
3190 	      relocation = 0;
3191 	      SPARC_ELF_PUT_WORD (htab, output_bfd, relocation,
3192 				  htab->elf.sgot->contents + off);
3193 	    }
3194 
3195 	  relocation = htab->elf.sgot->output_offset + off - got_base;
3196 	  break;
3197 
3198 	case R_SPARC_PLT32:
3199 	case R_SPARC_PLT64:
3200 	  if (h == NULL || h->plt.offset == (bfd_vma) -1)
3201 	    {
3202 	      r_type = (r_type == R_SPARC_PLT32) ? R_SPARC_32 : R_SPARC_64;
3203 	      goto r_sparc_plt32;
3204 	    }
3205 	  /* Fall through.  */
3206 
3207 	case R_SPARC_WPLT30:
3208 	case R_SPARC_HIPLT22:
3209 	case R_SPARC_LOPLT10:
3210 	case R_SPARC_PCPLT32:
3211 	case R_SPARC_PCPLT22:
3212 	case R_SPARC_PCPLT10:
3213 	r_sparc_wplt30:
3214 	  /* Relocation is to the entry for this symbol in the
3215 	     procedure linkage table.  */
3216 
3217 	  if (! ABI_64_P (output_bfd))
3218 	    {
3219 	      /* The Solaris native assembler will generate a WPLT30 reloc
3220 		 for a local symbol if you assemble a call from one
3221 		 section to another when using -K pic.  We treat it as
3222 		 WDISP30.  */
3223 	      if (h == NULL)
3224 		break;
3225 	    }
3226 	  /* PR 7027: We need similar behaviour for 64-bit binaries.  */
3227 	  else if (r_type == R_SPARC_WPLT30 && h == NULL)
3228 	    break;
3229 	  else
3230 	    {
3231 	      BFD_ASSERT (h != NULL);
3232 	    }
3233 
3234 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
3235 	    {
3236 	      /* We didn't make a PLT entry for this symbol.  This
3237 		 happens when statically linking PIC code, or when
3238 		 using -Bsymbolic.  */
3239 	      break;
3240 	    }
3241 
3242 	  relocation = (htab->elf.splt->output_section->vma
3243 			+ htab->elf.splt->output_offset
3244 			+ h->plt.offset);
3245 	  unresolved_reloc = false;
3246 	  if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
3247 	    {
3248 	      r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
3249 	      is_plt = true;
3250 	      goto r_sparc_plt32;
3251 	    }
3252 	  break;
3253 
3254 	case R_SPARC_PC10:
3255 	case R_SPARC_PC22:
3256 	case R_SPARC_PC_HH22:
3257 	case R_SPARC_PC_HM10:
3258 	case R_SPARC_PC_LM22:
3259 	  if (h != NULL
3260 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3261 	    break;
3262 	  /* Fall through.  */
3263 	case R_SPARC_DISP8:
3264 	case R_SPARC_DISP16:
3265 	case R_SPARC_DISP32:
3266 	case R_SPARC_DISP64:
3267 	case R_SPARC_WDISP30:
3268 	case R_SPARC_WDISP22:
3269 	case R_SPARC_WDISP19:
3270 	case R_SPARC_WDISP16:
3271 	case R_SPARC_WDISP10:
3272 	case R_SPARC_8:
3273 	case R_SPARC_16:
3274 	case R_SPARC_32:
3275 	case R_SPARC_HI22:
3276 	case R_SPARC_22:
3277 	case R_SPARC_13:
3278 	case R_SPARC_LO10:
3279 	case R_SPARC_UA16:
3280 	case R_SPARC_UA32:
3281 	case R_SPARC_10:
3282 	case R_SPARC_11:
3283 	case R_SPARC_64:
3284 	case R_SPARC_OLO10:
3285 	case R_SPARC_HH22:
3286 	case R_SPARC_HM10:
3287 	case R_SPARC_LM22:
3288 	case R_SPARC_7:
3289 	case R_SPARC_5:
3290 	case R_SPARC_6:
3291 	case R_SPARC_HIX22:
3292 	case R_SPARC_LOX10:
3293 	case R_SPARC_H44:
3294 	case R_SPARC_M44:
3295 	case R_SPARC_L44:
3296 	case R_SPARC_H34:
3297 	case R_SPARC_UA64:
3298 	r_sparc_plt32:
3299 	  if ((input_section->flags & SEC_ALLOC) == 0 || is_vxworks_tls)
3300 	    break;
3301 
3302 	  /* Copy dynamic function pointer relocations.  Don't generate
3303 	     dynamic relocations against resolved undefined weak symbols
3304 	     in PIE.  */
3305 	  if ((bfd_link_pic (info)
3306 	       && (h == NULL
3307 		   || !(h->root.type == bfd_link_hash_undefweak
3308 			&& (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3309 			    || resolved_to_zero)))
3310 	       && (! howto->pc_relative
3311 		   || !SYMBOL_CALLS_LOCAL (info, h)))
3312 	      || (!bfd_link_pic (info)
3313 		  && h != NULL
3314 		  && h->dynindx != -1
3315 		  && !h->non_got_ref
3316 		  && ((h->def_dynamic
3317 		       && !h->def_regular)
3318 		      || (h->root.type == bfd_link_hash_undefweak
3319 			  && !resolved_to_zero)
3320 		      || h->root.type == bfd_link_hash_undefined)))
3321 	    {
3322 	      Elf_Internal_Rela outrel;
3323 	      bool skip, relocate = false;
3324 
3325 	      /* When generating a shared object, these relocations
3326 		 are copied into the output file to be resolved at run
3327 		 time.  */
3328 
3329 	      BFD_ASSERT (sreloc != NULL);
3330 
3331 	      skip = false;
3332 
3333 	      outrel.r_offset =
3334 		_bfd_elf_section_offset (output_bfd, info, input_section,
3335 					 rel->r_offset);
3336 	      if (outrel.r_offset == (bfd_vma) -1)
3337 		skip = true;
3338 	      else if (outrel.r_offset == (bfd_vma) -2)
3339 		skip = true, relocate = true;
3340 	      outrel.r_offset += (input_section->output_section->vma
3341 				  + input_section->output_offset);
3342 
3343 	      /* Optimize unaligned reloc usage now that we know where
3344 		 it finally resides.  */
3345 	      switch (r_type)
3346 		{
3347 		case R_SPARC_16:
3348 		  if (outrel.r_offset & 1)
3349 		    r_type = R_SPARC_UA16;
3350 		  break;
3351 		case R_SPARC_UA16:
3352 		  if (!(outrel.r_offset & 1))
3353 		    r_type = R_SPARC_16;
3354 		  break;
3355 		case R_SPARC_32:
3356 		  if (outrel.r_offset & 3)
3357 		    r_type = R_SPARC_UA32;
3358 		  break;
3359 		case R_SPARC_UA32:
3360 		  if (!(outrel.r_offset & 3))
3361 		    r_type = R_SPARC_32;
3362 		  break;
3363 		case R_SPARC_64:
3364 		  if (outrel.r_offset & 7)
3365 		    r_type = R_SPARC_UA64;
3366 		  break;
3367 		case R_SPARC_UA64:
3368 		  if (!(outrel.r_offset & 7))
3369 		    r_type = R_SPARC_64;
3370 		  break;
3371 		case R_SPARC_DISP8:
3372 		case R_SPARC_DISP16:
3373 		case R_SPARC_DISP32:
3374 		case R_SPARC_DISP64:
3375 		  /* If the symbol is not dynamic, we should not keep
3376 		     a dynamic relocation.  But an .rela.* slot has been
3377 		     allocated for it, output R_SPARC_NONE.
3378 		     FIXME: Add code tracking needed dynamic relocs as
3379 		     e.g. i386 has.  */
3380 		  if (h->dynindx == -1)
3381 		    skip = true, relocate = true;
3382 		  break;
3383 		}
3384 
3385 	      if (skip)
3386 		memset (&outrel, 0, sizeof outrel);
3387 	      /* h->dynindx may be -1 if the symbol was marked to
3388 		 become local.  */
3389 	      else if (h != NULL
3390 		       && h->dynindx != -1
3391 		       && (_bfd_sparc_elf_howto_table[r_type].pc_relative
3392 			   || !bfd_link_pic (info)
3393 			   || !SYMBOLIC_BIND (info, h)
3394 			   || !h->def_regular))
3395 		{
3396 		  outrel.r_info = SPARC_ELF_R_INFO (htab, rel, h->dynindx, r_type);
3397 		  outrel.r_addend = rel->r_addend;
3398 		}
3399 	      else
3400 		{
3401 		  if (  (!ABI_64_P (output_bfd) && r_type == R_SPARC_32)
3402 		      || (ABI_64_P (output_bfd) && r_type == R_SPARC_64))
3403 		    {
3404 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL,
3405 							0, R_SPARC_RELATIVE);
3406 		      outrel.r_addend = relocation + rel->r_addend;
3407 		    }
3408 		  else
3409 		    {
3410 		      long indx;
3411 
3412 		      outrel.r_addend = relocation + rel->r_addend;
3413 
3414 		      if (is_plt)
3415 			sec = htab->elf.splt;
3416 
3417 		      if (bfd_is_abs_section (sec))
3418 			indx = 0;
3419 		      else if (sec == NULL || sec->owner == NULL)
3420 			{
3421 			  bfd_set_error (bfd_error_bad_value);
3422 			  return false;
3423 			}
3424 		      else
3425 			{
3426 			  asection *osec;
3427 
3428 			  /* We are turning this relocation into one
3429 			     against a section symbol.  It would be
3430 			     proper to subtract the symbol's value,
3431 			     osec->vma, from the emitted reloc addend,
3432 			     but ld.so expects buggy relocs.  */
3433 			  osec = sec->output_section;
3434 			  indx = elf_section_data (osec)->dynindx;
3435 
3436 			  if (indx == 0)
3437 			    {
3438 			      osec = htab->elf.text_index_section;
3439 			      indx = elf_section_data (osec)->dynindx;
3440 			    }
3441 
3442 			  /* FIXME: we really should be able to link non-pic
3443 			     shared libraries.  */
3444 			  if (indx == 0)
3445 			    {
3446 			      BFD_FAIL ();
3447 			      _bfd_error_handler
3448 				(_("%pB: probably compiled without -fPIC?"),
3449 				 input_bfd);
3450 			      bfd_set_error (bfd_error_bad_value);
3451 			      return false;
3452 			    }
3453 			  if (bed->elf_osabi == ELFOSABI_FREEBSD)
3454 			    outrel.r_addend -= osec->vma;
3455 			}
3456 
3457 		      outrel.r_info = SPARC_ELF_R_INFO (htab, rel, indx,
3458 							r_type);
3459 		    }
3460 		}
3461 
3462 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3463 
3464 	      /* This reloc will be computed at runtime, so there's no
3465 		 need to do anything now.  */
3466 	      if (! relocate)
3467 		continue;
3468 	    }
3469 	  break;
3470 
3471 	case R_SPARC_TLS_GD_HI22:
3472 	case R_SPARC_TLS_GD_LO10:
3473 	case R_SPARC_TLS_IE_HI22:
3474 	case R_SPARC_TLS_IE_LO10:
3475 	  r_type = sparc_elf_tls_transition (info, input_bfd, r_type,
3476 					     h == NULL || h->dynindx == -1);
3477 	  if (r_type == R_SPARC_REV32)
3478 	    break;
3479 	  if (h != NULL)
3480 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3481 	  else if (local_got_offsets)
3482 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3483 	  else
3484 	    tls_type = GOT_UNKNOWN;
3485 	  if (tls_type == GOT_TLS_IE)
3486 	    switch (r_type)
3487 	      {
3488 	      case R_SPARC_TLS_GD_HI22:
3489 		r_type = R_SPARC_TLS_IE_HI22;
3490 		break;
3491 	      case R_SPARC_TLS_GD_LO10:
3492 		r_type = R_SPARC_TLS_IE_LO10;
3493 		break;
3494 	      }
3495 
3496 	  if (r_type == R_SPARC_TLS_LE_HIX22)
3497 	    {
3498 	      relocation = tpoff (info, relocation);
3499 	      break;
3500 	    }
3501 	  if (r_type == R_SPARC_TLS_LE_LOX10)
3502 	    {
3503 	      /* Change add into xor.  */
3504 	      relocation = tpoff (info, relocation);
3505 	      bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
3506 						   contents + rel->r_offset)
3507 				       | 0x80182000), contents + rel->r_offset);
3508 	      break;
3509 	    }
3510 
3511 	  if (h != NULL)
3512 	    {
3513 	      off = h->got.offset;
3514 	      h->got.offset |= 1;
3515 	    }
3516 	  else
3517 	    {
3518 	      BFD_ASSERT (local_got_offsets != NULL);
3519 	      off = local_got_offsets[r_symndx];
3520 	      local_got_offsets[r_symndx] |= 1;
3521 	    }
3522 
3523 	r_sparc_tlsldm:
3524 	  if (htab->elf.sgot == NULL)
3525 	    abort ();
3526 
3527 	  if ((off & 1) != 0)
3528 	    off &= ~1;
3529 	  else
3530 	    {
3531 	      Elf_Internal_Rela outrel;
3532 	      int dr_type, indx;
3533 
3534 	      if (htab->elf.srelgot == NULL)
3535 		abort ();
3536 
3537 	      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3538 				  htab->elf.sgot->contents + off);
3539 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
3540 				 + htab->elf.sgot->output_offset + off);
3541 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
3542 	      if (r_type == R_SPARC_TLS_IE_HI22
3543 		  || r_type == R_SPARC_TLS_IE_LO10)
3544 		dr_type = SPARC_ELF_TPOFF_RELOC (htab);
3545 	      else
3546 		dr_type = SPARC_ELF_DTPMOD_RELOC (htab);
3547 	      if (dr_type == SPARC_ELF_TPOFF_RELOC (htab) && indx == 0)
3548 		outrel.r_addend = relocation - dtpoff_base (info);
3549 	      else
3550 		outrel.r_addend = 0;
3551 	      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx, dr_type);
3552 	      sparc_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
3553 
3554 	      if (r_type == R_SPARC_TLS_GD_HI22
3555 		  || r_type == R_SPARC_TLS_GD_LO10)
3556 		{
3557 		  if (indx == 0)
3558 		    {
3559 		      BFD_ASSERT (! unresolved_reloc);
3560 		      SPARC_ELF_PUT_WORD (htab, output_bfd,
3561 					  relocation - dtpoff_base (info),
3562 					  (htab->elf.sgot->contents + off
3563 					   + SPARC_ELF_WORD_BYTES (htab)));
3564 		    }
3565 		  else
3566 		    {
3567 		      SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3568 					  (htab->elf.sgot->contents + off
3569 					   + SPARC_ELF_WORD_BYTES (htab)));
3570 		      outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, indx,
3571 							SPARC_ELF_DTPOFF_RELOC (htab));
3572 		      outrel.r_offset += SPARC_ELF_WORD_BYTES (htab);
3573 		      sparc_elf_append_rela (output_bfd, htab->elf.srelgot,
3574 					     &outrel);
3575 		    }
3576 		}
3577 	      else if (dr_type == SPARC_ELF_DTPMOD_RELOC (htab))
3578 		{
3579 		  SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
3580 				      (htab->elf.sgot->contents + off
3581 				       + SPARC_ELF_WORD_BYTES (htab)));
3582 		}
3583 	    }
3584 
3585 	  if (off >= (bfd_vma) -2)
3586 	    abort ();
3587 
3588 	  relocation = htab->elf.sgot->output_offset + off - got_base;
3589 	  unresolved_reloc = false;
3590 	  howto = _bfd_sparc_elf_howto_table + r_type;
3591 	  break;
3592 
3593 	case R_SPARC_TLS_LDM_HI22:
3594 	case R_SPARC_TLS_LDM_LO10:
3595 	  /* LD -> LE */
3596 	  if (bfd_link_executable (info))
3597 	    {
3598 	      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3599 	      continue;
3600 	    }
3601 	  off = htab->tls_ldm_got.offset;
3602 	  htab->tls_ldm_got.offset |= 1;
3603 	  goto r_sparc_tlsldm;
3604 
3605 	case R_SPARC_TLS_LDO_HIX22:
3606 	case R_SPARC_TLS_LDO_LOX10:
3607 	  /* LD -> LE */
3608 	  if (bfd_link_executable (info))
3609 	    {
3610 	      if (r_type == R_SPARC_TLS_LDO_HIX22)
3611 		r_type = R_SPARC_TLS_LE_HIX22;
3612 	      else
3613 		r_type = R_SPARC_TLS_LE_LOX10;
3614 	    }
3615 	  else
3616 	    {
3617 	      relocation -= dtpoff_base (info);
3618 	      break;
3619 	    }
3620 	  /* Fall through.  */
3621 
3622 	case R_SPARC_TLS_LE_HIX22:
3623 	case R_SPARC_TLS_LE_LOX10:
3624 	  if (!bfd_link_executable (info))
3625 	    {
3626 	      Elf_Internal_Rela outrel;
3627 	      bfd_vma offset
3628 		= _bfd_elf_section_offset (output_bfd, info, input_section,
3629 					   rel->r_offset);
3630 	      if (offset == (bfd_vma) -1 || offset == (bfd_vma) -2)
3631 		memset (&outrel, 0, sizeof outrel);
3632 	      else
3633 		{
3634 		  outrel.r_offset = offset
3635 				    + input_section->output_section->vma
3636 				    + input_section->output_offset;
3637 		  outrel.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, r_type);
3638 		  outrel.r_addend
3639 		    = relocation - dtpoff_base (info) + rel->r_addend;
3640 		}
3641 
3642 	      BFD_ASSERT (sreloc != NULL);
3643 	      sparc_elf_append_rela (output_bfd, sreloc, &outrel);
3644 	      continue;
3645 	    }
3646 	  relocation = tpoff (info, relocation);
3647 	  break;
3648 
3649 	case R_SPARC_TLS_LDM_CALL:
3650 	  /* LD -> LE */
3651 	  if (bfd_link_executable (info))
3652 	    {
3653 	      /* mov %g0, %o0 */
3654 	      bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
3655 	      continue;
3656 	    }
3657 	  /* Fall through */
3658 
3659 	case R_SPARC_TLS_GD_CALL:
3660 	  if (h != NULL)
3661 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3662 	  else if (local_got_offsets)
3663 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3664 	  else
3665 	    tls_type = GOT_UNKNOWN;
3666 	  /* GD -> IE or LE */
3667 	  if (bfd_link_executable (info)
3668 	      || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
3669 	    {
3670 	      Elf_Internal_Rela *rel2;
3671 	      bfd_vma insn;
3672 
3673 	      /* GD -> LE */
3674 	      if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3675 		{
3676 		  bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3677 		  continue;
3678 		}
3679 
3680 	      /* GD -> IE */
3681 	      if (rel + 1 < relend
3682 		  && SPARC_ELF_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
3683 		  && rel[1].r_offset == rel->r_offset + 4
3684 		  && SPARC_ELF_R_SYMNDX (htab, rel[1].r_info) == r_symndx
3685 		  && (((insn = bfd_get_32 (input_bfd,
3686 					   contents + rel[1].r_offset))
3687 		       >> 25) & 0x1f) == 8)
3688 		{
3689 		  /* We have
3690 		     call __tls_get_addr, %tgd_call(foo)
3691 		      add %reg1, %reg2, %o0, %tgd_add(foo)
3692 		     and change it into IE:
3693 		     {ld,ldx} [%reg1 + %reg2], %o0, %tie_ldx(foo)
3694 		     add %g7, %o0, %o0, %tie_add(foo).
3695 		     add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
3696 		     ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2,
3697 		     ldx is 0xc0580000 | (rd << 25) | (rs1 << 14) | rs2.  */
3698 		  bfd_put_32 (output_bfd, insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000),
3699 			      contents + rel->r_offset);
3700 		  bfd_put_32 (output_bfd, 0x9001c008,
3701 			      contents + rel->r_offset + 4);
3702 		  rel++;
3703 		  continue;
3704 		}
3705 
3706 	      /* We cannot just overwrite the delay slot instruction,
3707 		 as it might be what puts the %o0 argument to
3708 		 __tls_get_addr into place.  So we have to transpose
3709 		 the delay slot with the add we patch in.  */
3710 	      insn = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3711 	      bfd_put_32 (output_bfd, insn,
3712 			  contents + rel->r_offset);
3713 	      bfd_put_32 (output_bfd, 0x9001c008,
3714 			  contents + rel->r_offset + 4);
3715 
3716 	      rel2 = rel;
3717 	      while ((rel2 = sparc_elf_find_reloc_at_ofs (rel2 + 1, relend,
3718 							  rel->r_offset + 4))
3719 		     != NULL)
3720 		{
3721 		  /* If the instruction we moved has a relocation attached to
3722 		     it, adjust the offset so that it will apply to the correct
3723 		     instruction.  */
3724 		  rel2->r_offset -= 4;
3725 		}
3726 	      continue;
3727 	    }
3728 
3729 	  h = (struct elf_link_hash_entry *)
3730 	      bfd_link_hash_lookup (info->hash, "__tls_get_addr", false,
3731 				    false, true);
3732 	  BFD_ASSERT (h != NULL);
3733 	  r_type = R_SPARC_WPLT30;
3734 	  howto = _bfd_sparc_elf_howto_table + r_type;
3735 	  goto r_sparc_wplt30;
3736 
3737 	case R_SPARC_TLS_GD_ADD:
3738 	  if (h != NULL)
3739 	    tls_type = _bfd_sparc_elf_hash_entry (h)->tls_type;
3740 	  else if (local_got_offsets)
3741 	    tls_type = _bfd_sparc_elf_local_got_tls_type (input_bfd) [r_symndx];
3742 	  else
3743 	    tls_type = GOT_UNKNOWN;
3744 	  /* GD -> IE or LE */
3745 	  if (bfd_link_executable (info) || tls_type == GOT_TLS_IE)
3746 	    {
3747 	      /* add %reg1, %reg2, %reg3, %tgd_add(foo)
3748 		 changed into IE:
3749 		 {ld,ldx} [%reg1 + %reg2], %reg3, %tie_ldx(foo)
3750 		 or LE:
3751 		 add %g7, %reg2, %reg3.  */
3752 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3753 	      if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3754 		relocation = (insn & ~0x7c000) | 0x1c000;
3755 	      else
3756 		relocation = insn | (ABI_64_P (output_bfd) ? 0xc0580000 : 0xc0000000);
3757 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3758 	    }
3759 	  continue;
3760 
3761 	case R_SPARC_TLS_LDM_ADD:
3762 	  /* LD -> LE */
3763 	  if (bfd_link_executable (info))
3764 	    bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
3765 	  continue;
3766 
3767 	case R_SPARC_TLS_LDO_ADD:
3768 	  /* LD -> LE */
3769 	  if (bfd_link_executable (info))
3770 	    {
3771 	      /* Change rs1 into %g7.  */
3772 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3773 	      insn = (insn & ~0x7c000) | 0x1c000;
3774 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
3775 	    }
3776 	  continue;
3777 
3778 	case R_SPARC_TLS_IE_LD:
3779 	case R_SPARC_TLS_IE_LDX:
3780 	  /* IE -> LE */
3781 	  if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1))
3782 	    {
3783 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
3784 	      int rs2 = insn & 0x1f;
3785 	      int rd = (insn >> 25) & 0x1f;
3786 
3787 	      if (rs2 == rd)
3788 		relocation = SPARC_NOP;
3789 	      else
3790 		relocation = 0x80100000 | (insn & 0x3e00001f);
3791 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
3792 	    }
3793 	  continue;
3794 
3795 	case R_SPARC_TLS_IE_ADD:
3796 	  /* Totally useless relocation.  */
3797 	  continue;
3798 
3799 	case R_SPARC_TLS_DTPOFF32:
3800 	case R_SPARC_TLS_DTPOFF64:
3801 	  relocation -= dtpoff_base (info);
3802 	  break;
3803 
3804 	default:
3805 	  break;
3806 	}
3807 
3808       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3809 	 because such sections are not SEC_ALLOC and thus ld.so will
3810 	 not process them.  */
3811       if (unresolved_reloc
3812 	  && !((input_section->flags & SEC_DEBUGGING) != 0
3813 	       && h->def_dynamic)
3814 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
3815 				      rel->r_offset) != (bfd_vma) -1)
3816 	_bfd_error_handler
3817 	  /* xgettext:c-format */
3818 	  (_("%pB(%pA+%#" PRIx64 "): "
3819 	     "unresolvable %s relocation against symbol `%s'"),
3820 	   input_bfd,
3821 	   input_section,
3822 	   (uint64_t) rel->r_offset,
3823 	   howto->name,
3824 	   h->root.root.string);
3825 
3826       r = bfd_reloc_continue;
3827       if (r_type == R_SPARC_OLO10)
3828 	{
3829 	    bfd_vma x;
3830 
3831 	    if (! ABI_64_P (output_bfd))
3832 	      abort ();
3833 
3834 	    relocation += rel->r_addend;
3835 	    relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
3836 
3837 	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3838 	    x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
3839 	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3840 
3841 	    r = bfd_check_overflow (howto->complain_on_overflow,
3842 				    howto->bitsize, howto->rightshift,
3843 				    bfd_arch_bits_per_address (input_bfd),
3844 				    relocation);
3845 	}
3846       else if (r_type == R_SPARC_WDISP16)
3847 	{
3848 	  bfd_vma x;
3849 
3850 	  relocation += rel->r_addend;
3851 	  relocation -= (input_section->output_section->vma
3852 			 + input_section->output_offset);
3853 	  relocation -= rel->r_offset;
3854 
3855 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3856 	  x |= ((((relocation >> 2) & 0xc000) << 6)
3857 		| ((relocation >> 2) & 0x3fff));
3858 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3859 
3860 	  r = bfd_check_overflow (howto->complain_on_overflow,
3861 				  howto->bitsize, howto->rightshift,
3862 				  bfd_arch_bits_per_address (input_bfd),
3863 				  relocation);
3864 	}
3865       else if (r_type == R_SPARC_WDISP10)
3866 	{
3867 	  bfd_vma x;
3868 
3869 	  relocation += rel->r_addend;
3870 	  relocation -= (input_section->output_section->vma
3871 			 + input_section->output_offset);
3872 	  relocation -= rel->r_offset;
3873 
3874 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3875 	  x |= ((((relocation >> 2) & 0x300) << 11)
3876 		| (((relocation >> 2) & 0xff) << 5));
3877 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3878 
3879 	  r = bfd_check_overflow (howto->complain_on_overflow,
3880 				  howto->bitsize, howto->rightshift,
3881 				  bfd_arch_bits_per_address (input_bfd),
3882 				  relocation);
3883 	}
3884       else if (r_type == R_SPARC_REV32)
3885 	{
3886 	  bfd_vma x;
3887 
3888 	  relocation = relocation + rel->r_addend;
3889 
3890 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3891 	  x = x + relocation;
3892 	  bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
3893 	  r = bfd_reloc_ok;
3894 	}
3895       else if (r_type == R_SPARC_TLS_LDO_HIX22
3896 	       || r_type == R_SPARC_TLS_LE_HIX22)
3897 	{
3898 	  bfd_vma x;
3899 
3900 	  relocation += rel->r_addend;
3901 	  if (r_type == R_SPARC_TLS_LE_HIX22)
3902 	    relocation ^= MINUS_ONE;
3903 
3904 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3905 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3906 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3907 	  r = bfd_reloc_ok;
3908 	}
3909       else if (r_type == R_SPARC_TLS_LDO_LOX10
3910 	       || r_type == R_SPARC_TLS_LE_LOX10)
3911 	{
3912 	  bfd_vma x;
3913 
3914 	  relocation += rel->r_addend;
3915 	  relocation &= 0x3ff;
3916 	  if (r_type == R_SPARC_TLS_LE_LOX10)
3917 	    relocation |= 0x1c00;
3918 
3919 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3920 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
3921 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3922 
3923 	  r = bfd_reloc_ok;
3924 	}
3925       else if (r_type == R_SPARC_HIX22
3926 	       || r_type == R_SPARC_GOTDATA_HIX22
3927 	       || r_type == R_SPARC_GOTDATA_OP_HIX22)
3928 	{
3929 	  bfd_vma x;
3930 
3931 	  relocation += rel->r_addend;
3932 	  if (r_type == R_SPARC_HIX22
3933 	      || (bfd_signed_vma) relocation < 0)
3934 	    relocation = relocation ^ MINUS_ONE;
3935 
3936 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3937 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
3938 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3939 
3940 	  r = bfd_check_overflow (howto->complain_on_overflow,
3941 				  howto->bitsize, howto->rightshift,
3942 				  bfd_arch_bits_per_address (input_bfd),
3943 				  relocation);
3944 	}
3945       else if (r_type == R_SPARC_LOX10
3946 	       || r_type == R_SPARC_GOTDATA_LOX10
3947 	       || r_type == R_SPARC_GOTDATA_OP_LOX10)
3948 	{
3949 	  bfd_vma x;
3950 
3951 	  relocation += rel->r_addend;
3952 	  if (r_type == R_SPARC_LOX10
3953 	      || (bfd_signed_vma) relocation < 0)
3954 	    relocation = (relocation & 0x3ff) | 0x1c00;
3955 	  else
3956 	    relocation = (relocation & 0x3ff);
3957 
3958 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3959 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
3960 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3961 
3962 	  r = bfd_reloc_ok;
3963 	}
3964       else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
3965 	       && sec_do_relax (input_section)
3966 	       && rel->r_offset + 4 < input_section->size)
3967 	{
3968 #define G0		0
3969 #define O7		15
3970 #define XCC		(2 << 20)
3971 #define COND(x)		(((x)&0xf)<<25)
3972 #define CONDA		COND(0x8)
3973 #define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
3974 #define INSN_BA		(F2(0,2) | CONDA)
3975 #define INSN_OR		F3(2, 0x2, 0)
3976 #define INSN_NOP	F2(0,4)
3977 
3978 	  bfd_vma x, y;
3979 
3980 	  /* If the instruction is a call with either:
3981 	     restore
3982 	     arithmetic instruction with rd == %o7
3983 	     where rs1 != %o7 and rs2 if it is register != %o7
3984 	     then we can optimize if the call destination is near
3985 	     by changing the call into a branch always.  */
3986 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
3987 	  y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
3988 	  if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
3989 	    {
3990 	      if (((y & OP3(~0)) == OP3(0x3d) /* restore */
3991 		   || ((y & OP3(0x28)) == 0 /* arithmetic */
3992 		       && (y & RD(~0)) == RD(O7)))
3993 		  && (y & RS1(~0)) != RS1(O7)
3994 		  && ((y & F3I(~0))
3995 		      || (y & RS2(~0)) != RS2(O7)))
3996 		{
3997 		  bfd_vma reloc;
3998 
3999 		  reloc = relocation + rel->r_addend - rel->r_offset;
4000 		  reloc -= (input_section->output_section->vma
4001 			    + input_section->output_offset);
4002 
4003 		  /* Ensure the branch fits into simm22.  */
4004 		  if ((reloc & 3) == 0
4005 		      && ((reloc & ~(bfd_vma)0x7fffff) == 0
4006 			  || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
4007 		    {
4008 		      reloc >>= 2;
4009 
4010 		      /* Check whether it fits into simm19.  */
4011 		      if (((reloc & 0x3c0000) == 0
4012 			   || (reloc & 0x3c0000) == 0x3c0000)
4013 			  && (ABI_64_P (output_bfd)
4014 			      || elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
4015 			x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
4016 		      else
4017 			x = INSN_BA | (reloc & 0x3fffff); /* ba */
4018 		      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
4019 		      r = bfd_reloc_ok;
4020 		      if (rel->r_offset >= 4
4021 			  && (y & (0xffffffff ^ RS1(~0)))
4022 			     == (INSN_OR | RD(O7) | RS2(G0)))
4023 			{
4024 			  bfd_vma z;
4025 			  unsigned int reg;
4026 
4027 			  z = bfd_get_32 (input_bfd,
4028 					  contents + rel->r_offset - 4);
4029 			  if ((z & (0xffffffff ^ RD(~0)))
4030 			      != (INSN_OR | RS1(O7) | RS2(G0)))
4031 			    continue;
4032 
4033 			  /* The sequence was
4034 			     or %o7, %g0, %rN
4035 			     call foo
4036 			     or %rN, %g0, %o7
4037 
4038 			     If call foo was replaced with ba, replace
4039 			     or %rN, %g0, %o7 with nop.  */
4040 
4041 			  reg = (y & RS1(~0)) >> 14;
4042 			  if (reg != ((z & RD(~0)) >> 25)
4043 			      || reg == G0 || reg == O7)
4044 			    continue;
4045 
4046 			  bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
4047 				      contents + rel->r_offset + 4);
4048 			}
4049 
4050 		    }
4051 		}
4052 	    }
4053 	}
4054 
4055       if (r == bfd_reloc_continue)
4056 	{
4057 	do_relocation:
4058 	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4059 					contents, rel->r_offset,
4060 					relocation, rel->r_addend);
4061 	}
4062       if (r != bfd_reloc_ok)
4063 	{
4064 	  switch (r)
4065 	    {
4066 	    default:
4067 	    case bfd_reloc_outofrange:
4068 	      abort ();
4069 	    case bfd_reloc_overflow:
4070 	      {
4071 		const char *name;
4072 
4073 		/* The Solaris native linker silently disregards overflows.
4074 		   We don't, but this breaks stabs debugging info, whose
4075 		   relocations are only 32-bits wide.  Ignore overflows in
4076 		   this case and also for discarded entries.  */
4077 		if ((r_type == R_SPARC_32
4078 		     || r_type == R_SPARC_UA32
4079 		     || r_type == R_SPARC_DISP32)
4080 		    && (((input_section->flags & SEC_DEBUGGING) != 0
4081 			 && strcmp (bfd_section_name (input_section),
4082 				    ".stab") == 0)
4083 			|| _bfd_elf_section_offset (output_bfd, info,
4084 						    input_section,
4085 						    rel->r_offset)
4086 			     == (bfd_vma)-1))
4087 		  break;
4088 
4089 		if (h != NULL)
4090 		  {
4091 		    /* Assume this is a call protected by other code that
4092 		       detect the symbol is undefined.  If this is the case,
4093 		       we can safely ignore the overflow.  If not, the
4094 		       program is hosed anyway, and a little warning isn't
4095 		       going to help.  */
4096 		    if (h->root.type == bfd_link_hash_undefweak
4097 			&& howto->pc_relative)
4098 		      break;
4099 
4100 		    name = NULL;
4101 		  }
4102 		else
4103 		  {
4104 		    name = bfd_elf_string_from_elf_section (input_bfd,
4105 							    symtab_hdr->sh_link,
4106 							    sym->st_name);
4107 		    if (name == NULL)
4108 		      return false;
4109 		    if (*name == '\0')
4110 		      name = bfd_section_name (sec);
4111 		  }
4112 		(*info->callbacks->reloc_overflow)
4113 		  (info, (h ? &h->root : NULL), name, howto->name,
4114 		   (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
4115 	      }
4116 	      break;
4117 	    }
4118 	}
4119     }
4120 
4121   return true;
4122 }
4123 
4124 /* Build a VxWorks PLT entry.  PLT_INDEX is the index of the PLT entry
4125    and PLT_OFFSET is the byte offset from the start of .plt.  GOT_OFFSET
4126    is the offset of the associated .got.plt entry from
4127    _GLOBAL_OFFSET_TABLE_.  */
4128 
4129 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)4130 sparc_vxworks_build_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
4131 			       bfd_vma plt_offset, bfd_vma plt_index,
4132 			       bfd_vma got_offset)
4133 {
4134   bfd_vma got_base;
4135   const bfd_vma *plt_entry;
4136   struct _bfd_sparc_elf_link_hash_table *htab;
4137   bfd_byte *loc;
4138   Elf_Internal_Rela rela;
4139 
4140   htab = _bfd_sparc_elf_hash_table (info);
4141   BFD_ASSERT (htab != NULL);
4142 
4143   if (bfd_link_pic (info))
4144     {
4145       plt_entry = sparc_vxworks_shared_plt_entry;
4146       got_base = 0;
4147     }
4148   else
4149     {
4150       plt_entry = sparc_vxworks_exec_plt_entry;
4151       got_base = (htab->elf.hgot->root.u.def.value
4152 		  + htab->elf.hgot->root.u.def.section->output_offset
4153 		  + htab->elf.hgot->root.u.def.section->output_section->vma);
4154     }
4155 
4156   /* Fill in the entry in the procedure linkage table.  */
4157   bfd_put_32 (output_bfd, plt_entry[0] + ((got_base + got_offset) >> 10),
4158 	      htab->elf.splt->contents + plt_offset);
4159   bfd_put_32 (output_bfd, plt_entry[1] + ((got_base + got_offset) & 0x3ff),
4160 	      htab->elf.splt->contents + plt_offset + 4);
4161   bfd_put_32 (output_bfd, plt_entry[2],
4162 	      htab->elf.splt->contents + plt_offset + 8);
4163   bfd_put_32 (output_bfd, plt_entry[3],
4164 	      htab->elf.splt->contents + plt_offset + 12);
4165   bfd_put_32 (output_bfd, plt_entry[4],
4166 	      htab->elf.splt->contents + plt_offset + 16);
4167   bfd_put_32 (output_bfd, plt_entry[5] + (plt_index >> 10),
4168 	      htab->elf.splt->contents + plt_offset + 20);
4169   /* PC-relative displacement for a branch to the start of
4170      the PLT section.  */
4171   bfd_put_32 (output_bfd, plt_entry[6] + (((-plt_offset - 24) >> 2)
4172 					  & 0x003fffff),
4173 	      htab->elf.splt->contents + plt_offset + 24);
4174   bfd_put_32 (output_bfd, plt_entry[7] + (plt_index & 0x3ff),
4175 	      htab->elf.splt->contents + plt_offset + 28);
4176 
4177   /* Fill in the .got.plt entry, pointing initially at the
4178      second half of the PLT entry.  */
4179   BFD_ASSERT (htab->elf.sgotplt != NULL);
4180   bfd_put_32 (output_bfd,
4181 	      htab->elf.splt->output_section->vma
4182 	      + htab->elf.splt->output_offset
4183 	      + plt_offset + 20,
4184 	      htab->elf.sgotplt->contents + got_offset);
4185 
4186   /* Add relocations to .rela.plt.unloaded.  */
4187   if (!bfd_link_pic (info))
4188     {
4189       loc = (htab->srelplt2->contents
4190 	     + (2 + 3 * plt_index) * sizeof (Elf32_External_Rela));
4191 
4192       /* Relocate the initial sethi.  */
4193       rela.r_offset = (htab->elf.splt->output_section->vma
4194 		       + htab->elf.splt->output_offset
4195 		       + plt_offset);
4196       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4197       rela.r_addend = got_offset;
4198       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4199       loc += sizeof (Elf32_External_Rela);
4200 
4201       /* Likewise the following or.  */
4202       rela.r_offset += 4;
4203       rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4204       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4205       loc += sizeof (Elf32_External_Rela);
4206 
4207       /* Relocate the .got.plt entry.  */
4208       rela.r_offset = (htab->elf.sgotplt->output_section->vma
4209 		       + htab->elf.sgotplt->output_offset
4210 		       + got_offset);
4211       rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4212       rela.r_addend = plt_offset + 20;
4213       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4214     }
4215 }
4216 
4217 /* Finish up dynamic symbol handling.  We set the contents of various
4218    dynamic sections here.  */
4219 
4220 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)4221 _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
4222 				      struct bfd_link_info *info,
4223 				      struct elf_link_hash_entry *h,
4224 				      Elf_Internal_Sym *sym)
4225 {
4226   struct _bfd_sparc_elf_link_hash_table *htab;
4227   const struct elf_backend_data *bed;
4228   struct _bfd_sparc_elf_link_hash_entry  *eh;
4229   bool resolved_to_zero;
4230 
4231   htab = _bfd_sparc_elf_hash_table (info);
4232   BFD_ASSERT (htab != NULL);
4233   bed = get_elf_backend_data (output_bfd);
4234 
4235   eh = (struct _bfd_sparc_elf_link_hash_entry *) h;
4236 
4237   /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
4238      resolved undefined weak symbols in executable so that their
4239      references have value 0 at run-time.  */
4240   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
4241 
4242   if (h->plt.offset != (bfd_vma) -1)
4243     {
4244       asection *splt;
4245       asection *srela;
4246       Elf_Internal_Rela rela;
4247       bfd_byte *loc;
4248       bfd_vma r_offset, got_offset;
4249       int rela_index;
4250 
4251       /* When building a static executable, use .iplt and
4252 	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
4253       if (htab->elf.splt != NULL)
4254 	{
4255 	  splt = htab->elf.splt;
4256 	  srela = htab->elf.srelplt;
4257 	}
4258       else
4259 	{
4260 	  splt = htab->elf.iplt;
4261 	  srela = htab->elf.irelplt;
4262 	}
4263 
4264       if (splt == NULL || srela == NULL)
4265 	abort ();
4266 
4267       /* Fill in the entry in the .rela.plt section.  */
4268       if (htab->elf.target_os == is_vxworks)
4269 	{
4270 	  /* Work out the index of this PLT entry.  */
4271 	  rela_index = ((h->plt.offset - htab->plt_header_size)
4272 			/ htab->plt_entry_size);
4273 
4274 	  /* Calculate the offset of the associated .got.plt entry.
4275 	     The first three entries are reserved.  */
4276 	  got_offset = (rela_index + 3) * 4;
4277 
4278 	  sparc_vxworks_build_plt_entry (output_bfd, info, h->plt.offset,
4279 					 rela_index, got_offset);
4280 
4281 
4282 	  /* On VxWorks, the relocation points to the .got.plt entry,
4283 	     not the .plt entry.  */
4284 	  rela.r_offset = (htab->elf.sgotplt->output_section->vma
4285 			   + htab->elf.sgotplt->output_offset
4286 			   + got_offset);
4287 	  rela.r_addend = 0;
4288 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4289 					  R_SPARC_JMP_SLOT);
4290 	}
4291       else
4292 	{
4293 	  bool ifunc = false;
4294 
4295 	  /* Fill in the entry in the procedure linkage table.  */
4296 	  rela_index = SPARC_ELF_BUILD_PLT_ENTRY (htab, output_bfd, splt,
4297 						  h->plt.offset, splt->size,
4298 						  &r_offset);
4299 
4300 	  if (h == NULL
4301 	      || h->dynindx == -1
4302 	      || ((bfd_link_executable (info)
4303 		   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4304 		  && h->def_regular
4305 		  && h->type == STT_GNU_IFUNC))
4306 	    {
4307 	      ifunc = true;
4308 	      BFD_ASSERT (h == NULL
4309 			  || (h->type == STT_GNU_IFUNC
4310 			      && h->def_regular
4311 			      && (h->root.type == bfd_link_hash_defined
4312 				  || h->root.type == bfd_link_hash_defweak)));
4313 	    }
4314 
4315 	  rela.r_offset = r_offset
4316 	    + (splt->output_section->vma + splt->output_offset);
4317 	  if (ABI_64_P (output_bfd)
4318 	      && h->plt.offset >= (PLT64_LARGE_THRESHOLD * PLT64_ENTRY_SIZE))
4319 	    {
4320 	      if (ifunc)
4321 		{
4322 		  rela.r_addend = (h->root.u.def.section->output_section->vma
4323 				   + h->root.u.def.section->output_offset
4324 				   + h->root.u.def.value);
4325 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4326 						  R_SPARC_IRELATIVE);
4327 		}
4328 	      else
4329 		{
4330 		  rela.r_addend = (-(h->plt.offset + 4)
4331 				   - splt->output_section->vma
4332 				   - splt->output_offset);
4333 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4334 						  R_SPARC_JMP_SLOT);
4335 		}
4336 	    }
4337 	  else
4338 	    {
4339 	      if (ifunc)
4340 		{
4341 		  rela.r_addend = (h->root.u.def.section->output_section->vma
4342 				   + h->root.u.def.section->output_offset
4343 				   + h->root.u.def.value);
4344 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0,
4345 						  R_SPARC_JMP_IREL);
4346 		}
4347 	      else
4348 		{
4349 		  rela.r_addend = 0;
4350 		  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx,
4351 						  R_SPARC_JMP_SLOT);
4352 		}
4353 	    }
4354 	}
4355 
4356       /* Adjust for the first 4 reserved elements in the .plt section
4357 	 when setting the offset in the .rela.plt section.
4358 	 Sun forgot to read their own ABI and copied elf32-sparc behaviour,
4359 	 thus .plt[4] has corresponding .rela.plt[0] and so on.  */
4360 
4361       loc = srela->contents;
4362       loc += rela_index * bed->s->sizeof_rela;
4363       bed->s->swap_reloca_out (output_bfd, &rela, loc);
4364 
4365       if (!resolved_to_zero && !h->def_regular)
4366 	{
4367 	  /* Mark the symbol as undefined, rather than as defined in
4368 	     the .plt section.  Leave the value alone.  */
4369 	  sym->st_shndx = SHN_UNDEF;
4370 	  /* If the symbol is weak, we do need to clear the value.
4371 	     Otherwise, the PLT entry would provide a definition for
4372 	     the symbol even if the symbol wasn't defined anywhere,
4373 	     and so the symbol would never be NULL.  */
4374 	  if (!h->ref_regular_nonweak)
4375 	    sym->st_value = 0;
4376 	}
4377     }
4378 
4379   /* Don't generate dynamic GOT relocation against resolved undefined weak
4380      symbols in an executable.  */
4381   if (h->got.offset != (bfd_vma) -1
4382       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_GD
4383       && _bfd_sparc_elf_hash_entry(h)->tls_type != GOT_TLS_IE
4384       && !(h->root.type == bfd_link_hash_undefweak
4385 	   && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4386 	       || resolved_to_zero)))
4387     {
4388       asection *sgot;
4389       asection *srela;
4390       Elf_Internal_Rela rela;
4391 
4392       /* This symbol has an entry in the GOT.  Set it up.  */
4393 
4394       sgot = htab->elf.sgot;
4395       srela = htab->elf.srelgot;
4396       BFD_ASSERT (sgot != NULL && srela != NULL);
4397 
4398       rela.r_offset = (sgot->output_section->vma
4399 		       + sgot->output_offset
4400 		       + (h->got.offset &~ (bfd_vma) 1));
4401 
4402       /* If this is a -Bsymbolic link, and the symbol is defined
4403 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
4404 	 the symbol was forced to be local because of a version file.
4405 	 The entry in the global offset table will already have been
4406 	 initialized in the relocate_section function.  */
4407       if (! bfd_link_pic (info)
4408 	  && h->type == STT_GNU_IFUNC
4409 	  && h->def_regular)
4410 	{
4411 	  asection *plt;
4412 
4413 	  /* We load the GOT entry with the PLT entry.  */
4414 	  plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
4415 	  SPARC_ELF_PUT_WORD (htab, output_bfd,
4416 			      (plt->output_section->vma
4417 			       + plt->output_offset + h->plt.offset),
4418 			      htab->elf.sgot->contents
4419 			      + (h->got.offset & ~(bfd_vma) 1));
4420 	  return true;
4421 	}
4422 
4423       if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
4424 	{
4425 	  asection *sec = h->root.u.def.section;
4426 	  if (h->type == STT_GNU_IFUNC)
4427 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_IRELATIVE);
4428 	  else
4429 	    rela.r_info = SPARC_ELF_R_INFO (htab, NULL, 0, R_SPARC_RELATIVE);
4430 	  rela.r_addend = (h->root.u.def.value
4431 			   + sec->output_section->vma
4432 			   + sec->output_offset);
4433 	}
4434       else
4435 	{
4436 	  rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_GLOB_DAT);
4437 	  rela.r_addend = 0;
4438 	}
4439 
4440       SPARC_ELF_PUT_WORD (htab, output_bfd, 0,
4441 			  sgot->contents + (h->got.offset & ~(bfd_vma) 1));
4442       sparc_elf_append_rela (output_bfd, srela, &rela);
4443     }
4444 
4445   if (h->needs_copy)
4446     {
4447       asection *s;
4448       Elf_Internal_Rela rela;
4449 
4450       /* This symbols needs a copy reloc.  Set it up.  */
4451       BFD_ASSERT (h->dynindx != -1);
4452 
4453       rela.r_offset = (h->root.u.def.value
4454 		       + h->root.u.def.section->output_section->vma
4455 		       + h->root.u.def.section->output_offset);
4456       rela.r_info = SPARC_ELF_R_INFO (htab, NULL, h->dynindx, R_SPARC_COPY);
4457       rela.r_addend = 0;
4458       if (h->root.u.def.section == htab->elf.sdynrelro)
4459 	s = htab->elf.sreldynrelro;
4460       else
4461 	s = htab->elf.srelbss;
4462       sparc_elf_append_rela (output_bfd, s, &rela);
4463     }
4464 
4465   /* Mark some specially defined symbols as absolute.  On VxWorks,
4466      _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
4467      ".got" section.  Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt".  */
4468   if (sym != NULL
4469       && (h == htab->elf.hdynamic
4470 	  || (htab->elf.target_os != is_vxworks
4471 	      && (h == htab->elf.hgot || h == htab->elf.hplt))))
4472     sym->st_shndx = SHN_ABS;
4473 
4474   return true;
4475 }
4476 
4477 /* Finish up the dynamic sections.  */
4478 
4479 static bool
sparc_finish_dyn(bfd * output_bfd,struct bfd_link_info * info,bfd * dynobj,asection * sdyn,asection * splt ATTRIBUTE_UNUSED)4480 sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
4481 		  bfd *dynobj, asection *sdyn,
4482 		  asection *splt ATTRIBUTE_UNUSED)
4483 {
4484   struct _bfd_sparc_elf_link_hash_table *htab;
4485   const struct elf_backend_data *bed;
4486   bfd_byte *dyncon, *dynconend;
4487   size_t dynsize;
4488   int stt_regidx = -1;
4489   bool abi_64_p;
4490 
4491   htab = _bfd_sparc_elf_hash_table (info);
4492   BFD_ASSERT (htab != NULL);
4493   bed = get_elf_backend_data (output_bfd);
4494   dynsize = bed->s->sizeof_dyn;
4495   dynconend = sdyn->contents + sdyn->size;
4496   abi_64_p = ABI_64_P (output_bfd);
4497   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
4498     {
4499       Elf_Internal_Dyn dyn;
4500       bool size;
4501 
4502       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
4503 
4504       if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
4505 	{
4506 	  /* On VxWorks, DT_PLTGOT should point to the start of the GOT,
4507 	     not to the start of the PLT.  */
4508 	  if (htab->elf.sgotplt)
4509 	    {
4510 	      dyn.d_un.d_val = (htab->elf.sgotplt->output_section->vma
4511 				+ htab->elf.sgotplt->output_offset);
4512 	      bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4513 	    }
4514 	}
4515       else if (htab->elf.target_os == is_vxworks
4516 	       && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
4517 	bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4518       else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
4519 	{
4520 	  if (stt_regidx == -1)
4521 	    {
4522 	      stt_regidx =
4523 		_bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
4524 	      if (stt_regidx == -1)
4525 		return false;
4526 	    }
4527 	  dyn.d_un.d_val = stt_regidx++;
4528 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4529 	}
4530       else
4531 	{
4532 	  asection *s;
4533 
4534 	  switch (dyn.d_tag)
4535 	    {
4536 	    case DT_PLTGOT:
4537 	      s = htab->elf.splt;
4538 	      size = false;
4539 	      break;
4540 	    case DT_PLTRELSZ:
4541 	      s = htab->elf.srelplt;
4542 	      size = true;
4543 	      break;
4544 	    case DT_JMPREL:
4545 	      s = htab->elf.srelplt;
4546 	      size = false;
4547 	      break;
4548 	    default:
4549 	      continue;
4550 	    }
4551 
4552 	  if (s == NULL)
4553 	    dyn.d_un.d_val = 0;
4554 	  else
4555 	    {
4556 	      if (!size)
4557 		dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4558 	      else
4559 		dyn.d_un.d_val = s->size;
4560 	    }
4561 	  bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
4562 	}
4563     }
4564   return true;
4565 }
4566 
4567 /* Install the first PLT entry in a VxWorks executable and make sure that
4568    .rela.plt.unloaded relocations have the correct symbol indexes.  */
4569 
4570 static void
sparc_vxworks_finish_exec_plt(bfd * output_bfd,struct bfd_link_info * info)4571 sparc_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
4572 {
4573   struct _bfd_sparc_elf_link_hash_table *htab;
4574   Elf_Internal_Rela rela;
4575   bfd_vma got_base;
4576   bfd_byte *loc;
4577 
4578   htab = _bfd_sparc_elf_hash_table (info);
4579   BFD_ASSERT (htab != NULL);
4580 
4581   /* Calculate the absolute value of _GLOBAL_OFFSET_TABLE_.  */
4582   got_base = (htab->elf.hgot->root.u.def.section->output_section->vma
4583 	      + htab->elf.hgot->root.u.def.section->output_offset
4584 	      + htab->elf.hgot->root.u.def.value);
4585 
4586   /* Install the initial PLT entry.  */
4587   bfd_put_32 (output_bfd,
4588 	      sparc_vxworks_exec_plt0_entry[0] + ((got_base + 8) >> 10),
4589 	      htab->elf.splt->contents);
4590   bfd_put_32 (output_bfd,
4591 	      sparc_vxworks_exec_plt0_entry[1] + ((got_base + 8) & 0x3ff),
4592 	      htab->elf.splt->contents + 4);
4593   bfd_put_32 (output_bfd,
4594 	      sparc_vxworks_exec_plt0_entry[2],
4595 	      htab->elf.splt->contents + 8);
4596   bfd_put_32 (output_bfd,
4597 	      sparc_vxworks_exec_plt0_entry[3],
4598 	      htab->elf.splt->contents + 12);
4599   bfd_put_32 (output_bfd,
4600 	      sparc_vxworks_exec_plt0_entry[4],
4601 	      htab->elf.splt->contents + 16);
4602 
4603   loc = htab->srelplt2->contents;
4604 
4605   /* Add an unloaded relocation for the initial entry's "sethi".  */
4606   rela.r_offset = (htab->elf.splt->output_section->vma
4607 		   + htab->elf.splt->output_offset);
4608   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4609   rela.r_addend = 8;
4610   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4611   loc += sizeof (Elf32_External_Rela);
4612 
4613   /* Likewise the following "or".  */
4614   rela.r_offset += 4;
4615   rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4616   bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4617   loc += sizeof (Elf32_External_Rela);
4618 
4619   /* Fix up the remaining .rela.plt.unloaded relocations.  They may have
4620      the wrong symbol index for _G_O_T_ or _P_L_T_ depending on the order
4621      in which symbols were output.  */
4622   while (loc < htab->srelplt2->contents + htab->srelplt2->size)
4623     {
4624       Elf_Internal_Rela rel;
4625 
4626       /* The entry's initial "sethi" (against _G_O_T_).  */
4627       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4628       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_HI22);
4629       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4630       loc += sizeof (Elf32_External_Rela);
4631 
4632       /* The following "or" (also against _G_O_T_).  */
4633       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4634       rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_SPARC_LO10);
4635       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4636       loc += sizeof (Elf32_External_Rela);
4637 
4638       /* The .got.plt entry (against _P_L_T_).  */
4639       bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
4640       rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_SPARC_32);
4641       bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
4642       loc += sizeof (Elf32_External_Rela);
4643     }
4644 }
4645 
4646 /* Install the first PLT entry in a VxWorks shared object.  */
4647 
4648 static void
sparc_vxworks_finish_shared_plt(bfd * output_bfd,struct bfd_link_info * info)4649 sparc_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
4650 {
4651   struct _bfd_sparc_elf_link_hash_table *htab;
4652   unsigned int i;
4653 
4654   htab = _bfd_sparc_elf_hash_table (info);
4655   BFD_ASSERT (htab != NULL);
4656 
4657   for (i = 0; i < ARRAY_SIZE (sparc_vxworks_shared_plt0_entry); i++)
4658     bfd_put_32 (output_bfd, sparc_vxworks_shared_plt0_entry[i],
4659 		htab->elf.splt->contents + i * 4);
4660 }
4661 
4662 /* Finish up local dynamic symbol handling.  We set the contents of
4663    various dynamic sections here.  */
4664 
4665 static int
finish_local_dynamic_symbol(void ** slot,void * inf)4666 finish_local_dynamic_symbol (void **slot, void *inf)
4667 {
4668   struct elf_link_hash_entry *h
4669     = (struct elf_link_hash_entry *) *slot;
4670   struct bfd_link_info *info
4671     = (struct bfd_link_info *) inf;
4672 
4673   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4674 					       h, NULL);
4675 }
4676 
4677 /* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
4678    here since undefined weak symbol may not be dynamic and may not be
4679    called for _bfd_sparc_elf_finish_dynamic_symbol.  */
4680 
4681 static bool
pie_finish_undefweak_symbol(struct bfd_hash_entry * bh,void * inf)4682 pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
4683 			     void *inf)
4684 {
4685   struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
4686   struct bfd_link_info *info = (struct bfd_link_info *) inf;
4687 
4688   if (h->root.type != bfd_link_hash_undefweak
4689       || h->dynindx != -1)
4690     return true;
4691 
4692   return _bfd_sparc_elf_finish_dynamic_symbol (info->output_bfd, info,
4693 					       h, NULL);
4694 }
4695 
4696 bool
_bfd_sparc_elf_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)4697 _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
4698 {
4699   bfd *dynobj;
4700   asection *sdyn;
4701   struct _bfd_sparc_elf_link_hash_table *htab;
4702 
4703   htab = _bfd_sparc_elf_hash_table (info);
4704   BFD_ASSERT (htab != NULL);
4705   dynobj = htab->elf.dynobj;
4706 
4707   /* We arranged in size_dynamic_sections to put the STT_REGISTER
4708      entries at the end of the dynlocal list, so they came at the end
4709      of the local symbols in the symtab.  Except that they aren't
4710      STB_LOCAL, so we need to back up symtab->sh_info.  */
4711   if (ABI_64_P (output_bfd)
4712       && elf_hash_table (info)->dynlocal)
4713     {
4714       asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
4715       struct elf_link_local_dynamic_entry *e;
4716 
4717       for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
4718 	if (e->input_indx == -1)
4719 	  break;
4720       if (e)
4721 	elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
4722 	  = e->dynindx;
4723     }
4724 
4725   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4726 
4727   if (elf_hash_table (info)->dynamic_sections_created)
4728     {
4729       asection *splt;
4730 
4731       splt = htab->elf.splt;
4732       BFD_ASSERT (splt != NULL && sdyn != NULL);
4733 
4734       if (!sparc_finish_dyn (output_bfd, info, dynobj, sdyn, splt))
4735 	return false;
4736 
4737       /* Initialize the contents of the .plt section.  */
4738       if (splt->size > 0)
4739 	{
4740 	  if (htab->elf.target_os == is_vxworks)
4741 	    {
4742 	      if (bfd_link_pic (info))
4743 		sparc_vxworks_finish_shared_plt (output_bfd, info);
4744 	      else
4745 		sparc_vxworks_finish_exec_plt (output_bfd, info);
4746 	    }
4747 	  else
4748 	    {
4749 	      memset (splt->contents, 0, htab->plt_header_size);
4750 	      if (!ABI_64_P (output_bfd))
4751 		bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
4752 			    splt->contents + splt->size - 4);
4753 	    }
4754 	}
4755 
4756       if (elf_section_data (splt->output_section) != NULL)
4757 	elf_section_data (splt->output_section)->this_hdr.sh_entsize
4758 	  = ((htab->elf.target_os == is_vxworks
4759 	      || !ABI_64_P (output_bfd))
4760 	     ? 0 : htab->plt_entry_size);
4761     }
4762 
4763   /* Set the first entry in the global offset table to the address of
4764      the dynamic section.  */
4765   if (htab->elf.sgot && htab->elf.sgot->size > 0)
4766     {
4767       bfd_vma val = (sdyn ?
4768 		     sdyn->output_section->vma + sdyn->output_offset :
4769 		     0);
4770 
4771       SPARC_ELF_PUT_WORD (htab, output_bfd, val, htab->elf.sgot->contents);
4772     }
4773 
4774   if (htab->elf.sgot)
4775     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
4776       SPARC_ELF_WORD_BYTES (htab);
4777 
4778   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
4779   htab_traverse (htab->loc_hash_table, finish_local_dynamic_symbol, info);
4780 
4781   /* Fill PLT entries for undefined weak symbols in PIE.  */
4782   if (bfd_link_pie (info))
4783     bfd_hash_traverse (&info->hash->table,
4784 		       pie_finish_undefweak_symbol,
4785 		       info);
4786   return true;
4787 }
4788 
4789 
4790 /* Set the right machine number for a SPARC ELF file.  */
4791 
4792 bool
_bfd_sparc_elf_object_p(bfd * abfd)4793 _bfd_sparc_elf_object_p (bfd *abfd)
4794 {
4795   obj_attribute *attrs = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
4796   obj_attribute *hwcaps = &attrs[Tag_GNU_Sparc_HWCAPS];
4797   obj_attribute *hwcaps2 = &attrs[Tag_GNU_Sparc_HWCAPS2];
4798 
4799   unsigned int v9c_hwcaps_mask = ELF_SPARC_HWCAP_ASI_BLK_INIT;
4800   unsigned int v9d_hwcaps_mask = (ELF_SPARC_HWCAP_FMAF
4801 				  | ELF_SPARC_HWCAP_VIS3
4802 				  | ELF_SPARC_HWCAP_HPC);
4803   unsigned int v9e_hwcaps_mask = (ELF_SPARC_HWCAP_AES
4804 				  | ELF_SPARC_HWCAP_DES
4805 				  | ELF_SPARC_HWCAP_KASUMI
4806 				  | ELF_SPARC_HWCAP_CAMELLIA
4807 				  | ELF_SPARC_HWCAP_MD5
4808 				  | ELF_SPARC_HWCAP_SHA1
4809 				  | ELF_SPARC_HWCAP_SHA256
4810 				  | ELF_SPARC_HWCAP_SHA512
4811 				  | ELF_SPARC_HWCAP_MPMUL
4812 				  | ELF_SPARC_HWCAP_MONT
4813 				  | ELF_SPARC_HWCAP_CRC32C
4814 				  | ELF_SPARC_HWCAP_CBCOND
4815 				  | ELF_SPARC_HWCAP_PAUSE);
4816   unsigned int v9v_hwcaps_mask = (ELF_SPARC_HWCAP_FJFMAU
4817 				 | ELF_SPARC_HWCAP_IMA);
4818   unsigned int v9m_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC5
4819 				   | ELF_SPARC_HWCAP2_MWAIT
4820 				   | ELF_SPARC_HWCAP2_XMPMUL
4821 				   | ELF_SPARC_HWCAP2_XMONT);
4822   unsigned int m8_hwcaps2_mask = (ELF_SPARC_HWCAP2_SPARC6
4823 				  | ELF_SPARC_HWCAP2_ONADDSUB
4824 				  | ELF_SPARC_HWCAP2_ONMUL
4825 				  | ELF_SPARC_HWCAP2_ONDIV
4826 				  | ELF_SPARC_HWCAP2_DICTUNP
4827 				  | ELF_SPARC_HWCAP2_FPCMPSHL
4828 				  | ELF_SPARC_HWCAP2_RLE
4829 				  | ELF_SPARC_HWCAP2_SHA3);
4830 
4831   if (ABI_64_P (abfd))
4832     {
4833       unsigned long mach = bfd_mach_sparc_v9;
4834 
4835       if (hwcaps2->i & m8_hwcaps2_mask)
4836 	mach = bfd_mach_sparc_v9m8;
4837       else if (hwcaps2->i & v9m_hwcaps2_mask)
4838 	mach = bfd_mach_sparc_v9m;
4839       else if (hwcaps->i & v9v_hwcaps_mask)
4840 	mach = bfd_mach_sparc_v9v;
4841       else if (hwcaps->i & v9e_hwcaps_mask)
4842 	mach = bfd_mach_sparc_v9e;
4843       else if (hwcaps->i & v9d_hwcaps_mask)
4844 	mach = bfd_mach_sparc_v9d;
4845       else if (hwcaps->i & v9c_hwcaps_mask)
4846 	mach = bfd_mach_sparc_v9c;
4847       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4848 	mach = bfd_mach_sparc_v9b;
4849       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4850 	mach = bfd_mach_sparc_v9a;
4851       return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
4852     }
4853   else
4854     {
4855       if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
4856 	{
4857 	  if (hwcaps2->i & m8_hwcaps2_mask)
4858 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4859 					      bfd_mach_sparc_v8plusm8);
4860 	  else if (hwcaps2->i & v9m_hwcaps2_mask)
4861 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4862 					      bfd_mach_sparc_v8plusm);
4863 	  else if (hwcaps->i & v9v_hwcaps_mask)
4864 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4865 					      bfd_mach_sparc_v8plusv);
4866 	  else if (hwcaps->i & v9e_hwcaps_mask)
4867 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4868 					      bfd_mach_sparc_v8pluse);
4869 	  else if (hwcaps->i & v9d_hwcaps_mask)
4870 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4871 					      bfd_mach_sparc_v8plusd);
4872 	  else if (hwcaps->i & v9c_hwcaps_mask)
4873 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4874 					      bfd_mach_sparc_v8plusc);
4875 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
4876 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4877 					      bfd_mach_sparc_v8plusb);
4878 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
4879 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4880 					      bfd_mach_sparc_v8plusa);
4881 	  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
4882 	    return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4883 					      bfd_mach_sparc_v8plus);
4884 	  else
4885 	    return false;
4886 	}
4887       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
4888 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
4889 					  bfd_mach_sparc_sparclite_le);
4890       else
4891 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
4892     }
4893 }
4894 
4895 /* Return address for Ith PLT stub in section PLT, for relocation REL
4896    or (bfd_vma) -1 if it should not be included.  */
4897 
4898 bfd_vma
_bfd_sparc_elf_plt_sym_val(bfd_vma i,const asection * plt,const arelent * rel)4899 _bfd_sparc_elf_plt_sym_val (bfd_vma i, const asection *plt, const arelent *rel)
4900 {
4901   if (ABI_64_P (plt->owner))
4902     {
4903       bfd_vma j;
4904 
4905       i += PLT64_HEADER_SIZE / PLT64_ENTRY_SIZE;
4906       if (i < PLT64_LARGE_THRESHOLD)
4907 	return plt->vma + i * PLT64_ENTRY_SIZE;
4908 
4909       j = (i - PLT64_LARGE_THRESHOLD) % 160;
4910       i -= j;
4911       return plt->vma + i * PLT64_ENTRY_SIZE + j * 4 * 6;
4912     }
4913   else
4914     return rel->address;
4915 }
4916 
4917 /* Merge backend specific data from an object file to the output
4918    object file when linking.  */
4919 
4920 bool
_bfd_sparc_elf_merge_private_bfd_data(bfd * ibfd,struct bfd_link_info * info)4921 _bfd_sparc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4922 {
4923   bfd *obfd = info->output_bfd;
4924   obj_attribute *in_attr, *in_attrs;
4925   obj_attribute *out_attr, *out_attrs;
4926 
4927   if (!elf_known_obj_attributes_proc (obfd)[0].i)
4928     {
4929       /* This is the first object.  Copy the attributes.  */
4930       _bfd_elf_copy_obj_attributes (ibfd, obfd);
4931 
4932       /* Use the Tag_null value to indicate the attributes have been
4933 	 initialized.  */
4934       elf_known_obj_attributes_proc (obfd)[0].i = 1;
4935 
4936       return true;
4937     }
4938 
4939   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4940   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4941 
4942   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS];
4943   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS];
4944 
4945   out_attr->i |= in_attr->i;
4946   out_attr->type = 1;
4947 
4948   in_attr = &in_attrs[Tag_GNU_Sparc_HWCAPS2];
4949   out_attr = &out_attrs[Tag_GNU_Sparc_HWCAPS2];
4950 
4951   out_attr->i |= in_attr->i;
4952   out_attr->type = 1;
4953 
4954   /* Merge Tag_compatibility attributes and any common GNU ones.  */
4955   _bfd_elf_merge_object_attributes (ibfd, info);
4956 
4957   return true;
4958 }
4959