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