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