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