1 /* SPARC-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004 Free Software Foundation, Inc.
4 
5    This file is part of BFD, the Binary File Descriptor library.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20 
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/sparc.h"
27 #include "opcode/sparc.h"
28 
29 static reloc_howto_type *elf32_sparc_reloc_type_lookup
30   PARAMS ((bfd *, bfd_reloc_code_real_type));
31 static void elf32_sparc_info_to_howto
32   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
33 static bfd_boolean elf32_sparc_check_relocs
34   PARAMS ((bfd *, struct bfd_link_info *, asection *,
35 	   const Elf_Internal_Rela *));
36 static bfd_boolean elf32_sparc_adjust_dynamic_symbol
37   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
38 static bfd_boolean allocate_dynrelocs
39   PARAMS ((struct elf_link_hash_entry *, PTR));
40 static bfd_boolean readonly_dynrelocs
41   PARAMS ((struct elf_link_hash_entry *, PTR));
42 static bfd_boolean elf32_sparc_size_dynamic_sections
43   PARAMS ((bfd *, struct bfd_link_info *));
44 static bfd_boolean elf32_sparc_new_section_hook
45   PARAMS ((bfd *, asection *));
46 static bfd_boolean elf32_sparc_relax_section
47   PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
48 static bfd_vma dtpoff_base
49   PARAMS ((struct bfd_link_info *));
50 static bfd_vma tpoff
51   PARAMS ((struct bfd_link_info *, bfd_vma));
52 static bfd_boolean elf32_sparc_relocate_section
53   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
54 	   Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
55 static bfd_boolean elf32_sparc_finish_dynamic_symbol
56   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
57 	   Elf_Internal_Sym *));
58 static bfd_boolean elf32_sparc_finish_dynamic_sections
59   PARAMS ((bfd *, struct bfd_link_info *));
60 static bfd_boolean elf32_sparc_merge_private_bfd_data
61   PARAMS ((bfd *, bfd *));
62 static struct bfd_hash_entry *link_hash_newfunc
63   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
64 static struct bfd_link_hash_table *elf32_sparc_link_hash_table_create
65   PARAMS ((bfd *));
66 static bfd_boolean create_got_section
67   PARAMS ((bfd *, struct bfd_link_info *));
68 static bfd_boolean elf32_sparc_create_dynamic_sections
69   PARAMS ((bfd *, struct bfd_link_info *));
70 static void elf32_sparc_copy_indirect_symbol
71   PARAMS ((const struct elf_backend_data *, struct elf_link_hash_entry *,
72 	  struct elf_link_hash_entry *));
73 static int elf32_sparc_tls_transition
74   PARAMS ((struct bfd_link_info *, bfd *, int, int));
75 
76 static bfd_boolean elf32_sparc_mkobject
77   PARAMS ((bfd *));
78 static bfd_boolean elf32_sparc_object_p
79   PARAMS ((bfd *));
80 static void elf32_sparc_final_write_processing
81   PARAMS ((bfd *, bfd_boolean));
82 static enum elf_reloc_type_class elf32_sparc_reloc_type_class
83   PARAMS ((const Elf_Internal_Rela *));
84 static asection * elf32_sparc_gc_mark_hook
85   PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
86 	   struct elf_link_hash_entry *, Elf_Internal_Sym *));
87 static bfd_boolean elf32_sparc_gc_sweep_hook
88   PARAMS ((bfd *, struct bfd_link_info *, asection *,
89 	   const Elf_Internal_Rela *));
90 
91 /* The relocation "howto" table.  */
92 
93 static bfd_reloc_status_type sparc_elf_notsupported_reloc
94   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
95 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
96   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
97 static bfd_reloc_status_type sparc_elf_hix22_reloc
98   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
99 static bfd_reloc_status_type sparc_elf_lox10_reloc
100   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
101 
102 reloc_howto_type _bfd_sparc_elf_howto_table[] =
103 {
104   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
105   HOWTO(R_SPARC_8,         0,0, 8,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_8",       FALSE,0,0x000000ff,TRUE),
106   HOWTO(R_SPARC_16,        0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_16",      FALSE,0,0x0000ffff,TRUE),
107   HOWTO(R_SPARC_32,        0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_32",      FALSE,0,0xffffffff,TRUE),
108   HOWTO(R_SPARC_DISP8,     0,0, 8,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP8",   FALSE,0,0x000000ff,TRUE),
109   HOWTO(R_SPARC_DISP16,    0,1,16,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP16",  FALSE,0,0x0000ffff,TRUE),
110   HOWTO(R_SPARC_DISP32,    0,2,32,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP32",  FALSE,0,0xffffffff,TRUE),
111   HOWTO(R_SPARC_WDISP30,   2,2,30,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP30", FALSE,0,0x3fffffff,TRUE),
112   HOWTO(R_SPARC_WDISP22,   2,2,22,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP22", FALSE,0,0x003fffff,TRUE),
113   HOWTO(R_SPARC_HI22,     10,2,22,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HI22",    FALSE,0,0x003fffff,TRUE),
114   HOWTO(R_SPARC_22,        0,2,22,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_22",      FALSE,0,0x003fffff,TRUE),
115   HOWTO(R_SPARC_13,        0,2,13,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_13",      FALSE,0,0x00001fff,TRUE),
116   HOWTO(R_SPARC_LO10,      0,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LO10",    FALSE,0,0x000003ff,TRUE),
117   HOWTO(R_SPARC_GOT10,     0,2,10,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT10",   FALSE,0,0x000003ff,TRUE),
118   HOWTO(R_SPARC_GOT13,     0,2,13,FALSE,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_GOT13",   FALSE,0,0x00001fff,TRUE),
119   HOWTO(R_SPARC_GOT22,    10,2,22,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT22",   FALSE,0,0x003fffff,TRUE),
120   HOWTO(R_SPARC_PC10,      0,2,10,TRUE, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC10",    FALSE,0,0x000003ff,TRUE),
121   HOWTO(R_SPARC_PC22,     10,2,22,TRUE, 0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PC22",    FALSE,0,0x003fffff,TRUE),
122   HOWTO(R_SPARC_WPLT30,    2,2,30,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WPLT30",  FALSE,0,0x3fffffff,TRUE),
123   HOWTO(R_SPARC_COPY,      0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_COPY",    FALSE,0,0x00000000,TRUE),
124   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),
125   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),
126   HOWTO(R_SPARC_RELATIVE,  0,0,00,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_RELATIVE",FALSE,0,0x00000000,TRUE),
127   HOWTO(R_SPARC_UA32,      0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA32",    FALSE,0,0xffffffff,TRUE),
128   HOWTO(R_SPARC_PLT32,     0,0,00,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PLT32",   FALSE,0,0xffffffff,TRUE),
129   HOWTO(R_SPARC_HIPLT22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_HIPLT22",  FALSE,0,0x00000000,TRUE),
130   HOWTO(R_SPARC_LOPLT10,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_LOPLT10",  FALSE,0,0x00000000,TRUE),
131   HOWTO(R_SPARC_PCPLT32,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PCPLT32",  FALSE,0,0x00000000,TRUE),
132   HOWTO(R_SPARC_PCPLT22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PCPLT22",  FALSE,0,0x00000000,TRUE),
133   HOWTO(R_SPARC_PCPLT10,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PCPLT10",  FALSE,0,0x00000000,TRUE),
134   HOWTO(R_SPARC_10,        0,2,10,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_10",      FALSE,0,0x000003ff,TRUE),
135   HOWTO(R_SPARC_11,        0,2,11,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_11",      FALSE,0,0x000007ff,TRUE),
136   /* These are for sparc64 in a 64 bit environment.
137      Values need to be here because the table is indexed by reloc number.  */
138   HOWTO(R_SPARC_64,        0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_64",      FALSE,0,0x00000000,TRUE),
139   HOWTO(R_SPARC_OLO10,     0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_OLO10",   FALSE,0,0x00000000,TRUE),
140   HOWTO(R_SPARC_HH22,      0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_HH22",    FALSE,0,0x00000000,TRUE),
141   HOWTO(R_SPARC_HM10,      0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_HM10",    FALSE,0,0x00000000,TRUE),
142   HOWTO(R_SPARC_LM22,      0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_LM22",    FALSE,0,0x00000000,TRUE),
143   HOWTO(R_SPARC_PC_HH22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PC_HH22", FALSE,0,0x00000000,TRUE),
144   HOWTO(R_SPARC_PC_HM10,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PC_HM10", FALSE,0,0x00000000,TRUE),
145   HOWTO(R_SPARC_PC_LM22,   0,0,00,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_PC_LM22", FALSE,0,0x00000000,TRUE),
146   /* End sparc64 in 64 bit environment values.
147      The following are for sparc64 in a 32 bit environment.  */
148   HOWTO(R_SPARC_WDISP16,   2,2,16,TRUE, 0,complain_overflow_signed,  sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", FALSE,0,0x00000000,TRUE),
149   HOWTO(R_SPARC_WDISP19,   2,2,19,TRUE, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP19", FALSE,0,0x0007ffff,TRUE),
150   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),
151   HOWTO(R_SPARC_7,         0,2, 7,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_7",       FALSE,0,0x0000007f,TRUE),
152   HOWTO(R_SPARC_5,         0,2, 5,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_5",       FALSE,0,0x0000001f,TRUE),
153   HOWTO(R_SPARC_6,         0,2, 6,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_6",       FALSE,0,0x0000003f,TRUE),
154   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
155   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
156   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
157   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
158   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
159   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
160   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
161   HOWTO(R_SPARC_NONE,      0,0, 0,FALSE,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_NONE",    FALSE,0,0x00000000,TRUE),
162   HOWTO(R_SPARC_UA64,      0,0, 0,FALSE,0,complain_overflow_dont,    sparc_elf_notsupported_reloc,  "R_SPARC_UA64",    FALSE,0,0x00000000,TRUE),
163   HOWTO(R_SPARC_UA16,      0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",    FALSE,0,0x0000ffff,TRUE),
164   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),
165   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),
166   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),
167   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),
168   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),
169   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),
170   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),
171   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),
172   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),
173   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),
174   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),
175   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),
176   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),
177   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),
178   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),
179   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),
180   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),
181   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),
182   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),
183   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),
184   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),
185   HOWTO(R_SPARC_TLS_DTPOFF64,0,0, 0,FALSE,0,complain_overflow_dont,  bfd_elf_generic_reloc,  "R_SPARC_TLS_DTPOFF64",FALSE,0,0x00000000,TRUE),
186   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),
187   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)
188 };
189 static reloc_howto_type elf32_sparc_vtinherit_howto =
190   HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
191 static reloc_howto_type elf32_sparc_vtentry_howto =
192   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);
193 static reloc_howto_type elf32_sparc_rev32_howto =
194   HOWTO(R_SPARC_REV32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", FALSE,0,0xffffffff,TRUE);
195 
196 struct elf_reloc_map {
197   bfd_reloc_code_real_type bfd_reloc_val;
198   unsigned char elf_reloc_val;
199 };
200 
201 static const struct elf_reloc_map sparc_reloc_map[] =
202 {
203   { BFD_RELOC_NONE, R_SPARC_NONE, },
204   { BFD_RELOC_16, R_SPARC_16, },
205   { BFD_RELOC_16_PCREL, R_SPARC_DISP16 },
206   { BFD_RELOC_8, R_SPARC_8 },
207   { BFD_RELOC_8_PCREL, R_SPARC_DISP8 },
208   { BFD_RELOC_CTOR, R_SPARC_32 },
209   { BFD_RELOC_32, R_SPARC_32 },
210   { BFD_RELOC_32_PCREL, R_SPARC_DISP32 },
211   { BFD_RELOC_HI22, R_SPARC_HI22 },
212   { BFD_RELOC_LO10, R_SPARC_LO10, },
213   { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 },
214   { BFD_RELOC_SPARC_PLT32, R_SPARC_PLT32 },
215   { BFD_RELOC_SPARC22, R_SPARC_22 },
216   { BFD_RELOC_SPARC13, R_SPARC_13 },
217   { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 },
218   { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 },
219   { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 },
220   { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 },
221   { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 },
222   { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 },
223   { BFD_RELOC_SPARC_COPY, R_SPARC_COPY },
224   { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT },
225   { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT },
226   { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE },
227   { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 },
228   { BFD_RELOC_SPARC_UA16, R_SPARC_UA16 },
229   { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 },
230   { BFD_RELOC_SPARC_UA64, R_SPARC_UA64 },
231   { BFD_RELOC_SPARC_10, R_SPARC_10 },
232   { BFD_RELOC_SPARC_11, R_SPARC_11 },
233   { BFD_RELOC_SPARC_64, R_SPARC_64 },
234   { BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10 },
235   { BFD_RELOC_SPARC_HH22, R_SPARC_HH22 },
236   { BFD_RELOC_SPARC_HM10, R_SPARC_HM10 },
237   { BFD_RELOC_SPARC_LM22, R_SPARC_LM22 },
238   { BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22 },
239   { BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10 },
240   { BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22 },
241   { BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16 },
242   { BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19 },
243   { BFD_RELOC_SPARC_7, R_SPARC_7 },
244   { BFD_RELOC_SPARC_5, R_SPARC_5 },
245   { BFD_RELOC_SPARC_6, R_SPARC_6 },
246   { BFD_RELOC_SPARC_TLS_GD_HI22, R_SPARC_TLS_GD_HI22 },
247   { BFD_RELOC_SPARC_TLS_GD_LO10, R_SPARC_TLS_GD_LO10 },
248   { BFD_RELOC_SPARC_TLS_GD_ADD, R_SPARC_TLS_GD_ADD },
249   { BFD_RELOC_SPARC_TLS_GD_CALL, R_SPARC_TLS_GD_CALL },
250   { BFD_RELOC_SPARC_TLS_LDM_HI22, R_SPARC_TLS_LDM_HI22 },
251   { BFD_RELOC_SPARC_TLS_LDM_LO10, R_SPARC_TLS_LDM_LO10 },
252   { BFD_RELOC_SPARC_TLS_LDM_ADD, R_SPARC_TLS_LDM_ADD },
253   { BFD_RELOC_SPARC_TLS_LDM_CALL, R_SPARC_TLS_LDM_CALL },
254   { BFD_RELOC_SPARC_TLS_LDO_HIX22, R_SPARC_TLS_LDO_HIX22 },
255   { BFD_RELOC_SPARC_TLS_LDO_LOX10, R_SPARC_TLS_LDO_LOX10 },
256   { BFD_RELOC_SPARC_TLS_LDO_ADD, R_SPARC_TLS_LDO_ADD },
257   { BFD_RELOC_SPARC_TLS_IE_HI22, R_SPARC_TLS_IE_HI22 },
258   { BFD_RELOC_SPARC_TLS_IE_LO10, R_SPARC_TLS_IE_LO10 },
259   { BFD_RELOC_SPARC_TLS_IE_LD, R_SPARC_TLS_IE_LD },
260   { BFD_RELOC_SPARC_TLS_IE_LDX, R_SPARC_TLS_IE_LDX },
261   { BFD_RELOC_SPARC_TLS_IE_ADD, R_SPARC_TLS_IE_ADD },
262   { BFD_RELOC_SPARC_TLS_LE_HIX22, R_SPARC_TLS_LE_HIX22 },
263   { BFD_RELOC_SPARC_TLS_LE_LOX10, R_SPARC_TLS_LE_LOX10 },
264   { BFD_RELOC_SPARC_TLS_DTPMOD32, R_SPARC_TLS_DTPMOD32 },
265   { BFD_RELOC_SPARC_TLS_DTPMOD64, R_SPARC_TLS_DTPMOD64 },
266   { BFD_RELOC_SPARC_TLS_DTPOFF32, R_SPARC_TLS_DTPOFF32 },
267   { BFD_RELOC_SPARC_TLS_DTPOFF64, R_SPARC_TLS_DTPOFF64 },
268   { BFD_RELOC_SPARC_TLS_TPOFF32, R_SPARC_TLS_TPOFF32 },
269   { BFD_RELOC_SPARC_TLS_TPOFF64, R_SPARC_TLS_TPOFF64 },
270   { BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT },
271   { BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY },
272   { BFD_RELOC_SPARC_REV32, R_SPARC_REV32 }
273 };
274 
275 static reloc_howto_type *
elf32_sparc_reloc_type_lookup(abfd,code)276 elf32_sparc_reloc_type_lookup (abfd, code)
277      bfd *abfd ATTRIBUTE_UNUSED;
278      bfd_reloc_code_real_type code;
279 {
280   unsigned int i;
281 
282   switch (code)
283     {
284     case BFD_RELOC_VTABLE_INHERIT:
285       return &elf32_sparc_vtinherit_howto;
286 
287     case BFD_RELOC_VTABLE_ENTRY:
288       return &elf32_sparc_vtentry_howto;
289 
290     case BFD_RELOC_SPARC_REV32:
291       return &elf32_sparc_rev32_howto;
292 
293     default:
294       for (i = 0;
295 	   i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map);
296 	   i++)
297 	{
298 	  if (sparc_reloc_map[i].bfd_reloc_val == code)
299 	    return (_bfd_sparc_elf_howto_table
300 		    + (int) sparc_reloc_map[i].elf_reloc_val);
301 	}
302     }
303     bfd_set_error (bfd_error_bad_value);
304     return NULL;
305 }
306 
307 /* We need to use ELF32_R_TYPE so we have our own copy of this function,
308    and elf64-sparc.c has its own copy.  */
309 
310 static void
elf32_sparc_info_to_howto(abfd,cache_ptr,dst)311 elf32_sparc_info_to_howto (abfd, cache_ptr, dst)
312      bfd *abfd ATTRIBUTE_UNUSED;
313      arelent *cache_ptr;
314      Elf_Internal_Rela *dst;
315 {
316   switch (ELF32_R_TYPE(dst->r_info))
317     {
318     case R_SPARC_GNU_VTINHERIT:
319       cache_ptr->howto = &elf32_sparc_vtinherit_howto;
320       break;
321 
322     case R_SPARC_GNU_VTENTRY:
323       cache_ptr->howto = &elf32_sparc_vtentry_howto;
324       break;
325 
326     case R_SPARC_REV32:
327       cache_ptr->howto = &elf32_sparc_rev32_howto;
328       break;
329 
330     default:
331       BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_SPARC_max_std);
332       cache_ptr->howto = &_bfd_sparc_elf_howto_table[ELF32_R_TYPE(dst->r_info)];
333     }
334 }
335 
336 /* For unsupported relocs.  */
337 
338 static bfd_reloc_status_type
sparc_elf_notsupported_reloc(abfd,reloc_entry,symbol,data,input_section,output_bfd,error_message)339 sparc_elf_notsupported_reloc (abfd,
340 			     reloc_entry,
341 			     symbol,
342 			     data,
343 			     input_section,
344 			     output_bfd,
345 			     error_message)
346      bfd *abfd ATTRIBUTE_UNUSED;
347      arelent *reloc_entry ATTRIBUTE_UNUSED;
348      asymbol *symbol ATTRIBUTE_UNUSED;
349      PTR data ATTRIBUTE_UNUSED;
350      asection *input_section ATTRIBUTE_UNUSED;
351      bfd *output_bfd ATTRIBUTE_UNUSED;
352      char **error_message ATTRIBUTE_UNUSED;
353 {
354   return bfd_reloc_notsupported;
355 }
356 
357 /* Handle the WDISP16 reloc.  */
358 
359 static bfd_reloc_status_type
sparc_elf_wdisp16_reloc(abfd,reloc_entry,symbol,data,input_section,output_bfd,error_message)360 sparc_elf_wdisp16_reloc (abfd,
361 			 reloc_entry,
362 			 symbol,
363 			 data,
364 			 input_section,
365 			 output_bfd,
366 			 error_message)
367      bfd *abfd;
368      arelent *reloc_entry;
369      asymbol *symbol;
370      PTR data;
371      asection *input_section;
372      bfd *output_bfd;
373      char **error_message ATTRIBUTE_UNUSED;
374 {
375   bfd_vma relocation;
376   bfd_vma x;
377 
378   if (output_bfd != (bfd *) NULL
379       && (symbol->flags & BSF_SECTION_SYM) == 0
380       && (! reloc_entry->howto->partial_inplace
381 	  || reloc_entry->addend == 0))
382     {
383       reloc_entry->address += input_section->output_offset;
384       return bfd_reloc_ok;
385     }
386 
387   if (output_bfd != NULL)
388     return bfd_reloc_continue;
389 
390   if (reloc_entry->address > input_section->_cooked_size)
391     return bfd_reloc_outofrange;
392 
393   relocation = (symbol->value
394 		+ symbol->section->output_section->vma
395 		+ symbol->section->output_offset);
396   relocation += reloc_entry->addend;
397   relocation -=	(input_section->output_section->vma
398 		 + input_section->output_offset);
399   relocation -= reloc_entry->address;
400 
401   x = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
402   x |= ((((relocation >> 2) & 0xc000) << 6)
403 	| ((relocation >> 2) & 0x3fff));
404   bfd_put_32 (abfd, x, (bfd_byte *) data + reloc_entry->address);
405 
406   if ((bfd_signed_vma) relocation < - 0x40000
407       || (bfd_signed_vma) relocation > 0x3ffff)
408     return bfd_reloc_overflow;
409   else
410     return bfd_reloc_ok;
411 }
412 
413 /* Handle the HIX22 reloc.  */
414 
415 static bfd_reloc_status_type
sparc_elf_hix22_reloc(abfd,reloc_entry,symbol,data,input_section,output_bfd,error_message)416 sparc_elf_hix22_reloc (abfd,
417 		       reloc_entry,
418 		       symbol,
419 		       data,
420 		       input_section,
421 		       output_bfd,
422 		       error_message)
423      bfd *abfd;
424      arelent *reloc_entry;
425      asymbol *symbol;
426      PTR data;
427      asection *input_section;
428      bfd *output_bfd;
429      char **error_message ATTRIBUTE_UNUSED;
430 {
431   bfd_vma relocation;
432   bfd_vma insn;
433 
434   if (output_bfd != (bfd *) NULL
435       && (symbol->flags & BSF_SECTION_SYM) == 0)
436     {
437       reloc_entry->address += input_section->output_offset;
438       return bfd_reloc_ok;
439     }
440 
441   if (output_bfd != NULL)
442     return bfd_reloc_continue;
443 
444   if (reloc_entry->address > input_section->_cooked_size)
445     return bfd_reloc_outofrange;
446 
447   relocation = (symbol->value
448 		+ symbol->section->output_section->vma
449 		+ symbol->section->output_offset);
450   relocation += reloc_entry->addend;
451   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
452 
453   insn = (insn &~ (bfd_vma) 0x3fffff) | (((~relocation) >> 10) & 0x3fffff);
454   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
455 
456   return bfd_reloc_ok;
457 }
458 
459 /* Handle the LOX10 reloc.  */
460 
461 static bfd_reloc_status_type
sparc_elf_lox10_reloc(abfd,reloc_entry,symbol,data,input_section,output_bfd,error_message)462 sparc_elf_lox10_reloc (abfd,
463 		       reloc_entry,
464 		       symbol,
465 		       data,
466 		       input_section,
467 		       output_bfd,
468 		       error_message)
469      bfd *abfd;
470      arelent *reloc_entry;
471      asymbol *symbol;
472      PTR data;
473      asection *input_section;
474      bfd *output_bfd;
475      char **error_message ATTRIBUTE_UNUSED;
476 {
477   bfd_vma relocation;
478   bfd_vma insn;
479 
480   if (output_bfd != (bfd *) NULL
481       && (symbol->flags & BSF_SECTION_SYM) == 0)
482     {
483       reloc_entry->address += input_section->output_offset;
484       return bfd_reloc_ok;
485     }
486 
487   if (output_bfd != NULL)
488     return bfd_reloc_continue;
489 
490   if (reloc_entry->address > input_section->_cooked_size)
491     return bfd_reloc_outofrange;
492 
493   relocation = (symbol->value
494 		+ symbol->section->output_section->vma
495 		+ symbol->section->output_offset);
496   relocation += reloc_entry->addend;
497   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
498 
499   insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
500   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
501 
502   return bfd_reloc_ok;
503 }
504 
505 /* Support for core dump NOTE sections.  */
506 
507 static bfd_boolean
elf32_sparc_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)508 elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
509 {
510   switch (note->descsz)
511     {
512     default:
513       return FALSE;
514 
515     case 260:			/* Solaris prpsinfo_t.  */
516       elf_tdata (abfd)->core_program
517 	= _bfd_elfcore_strndup (abfd, note->descdata + 84, 16);
518       elf_tdata (abfd)->core_command
519 	= _bfd_elfcore_strndup (abfd, note->descdata + 100, 80);
520       break;
521 
522     case 336:			/* Solaris psinfo_t.  */
523       elf_tdata (abfd)->core_program
524 	= _bfd_elfcore_strndup (abfd, note->descdata + 88, 16);
525       elf_tdata (abfd)->core_command
526 	= _bfd_elfcore_strndup (abfd, note->descdata + 104, 80);
527       break;
528     }
529 
530   return TRUE;
531 }
532 
533 
534 /* Functions for the SPARC ELF linker.  */
535 
536 /* The name of the dynamic interpreter.  This is put in the .interp
537    section.  */
538 
539 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
540 
541 /* The nop opcode we use.  */
542 
543 #define SPARC_NOP 0x01000000
544 
545 /* The size in bytes of an entry in the procedure linkage table.  */
546 
547 #define PLT_ENTRY_SIZE 12
548 
549 /* The first four entries in a procedure linkage table are reserved,
550    and the initial contents are unimportant (we zero them out).
551    Subsequent entries look like this.  See the SVR4 ABI SPARC
552    supplement to see how this works.  */
553 
554 /* sethi %hi(.-.plt0),%g1.  We fill in the address later.  */
555 #define PLT_ENTRY_WORD0 0x03000000
556 /* b,a .plt0.  We fill in the offset later.  */
557 #define PLT_ENTRY_WORD1 0x30800000
558 /* nop.  */
559 #define PLT_ENTRY_WORD2 SPARC_NOP
560 
561 /* The SPARC linker needs to keep track of the number of relocs that it
562    decides to copy as dynamic relocs in check_relocs for each symbol.
563    This is so that it can later discard them if they are found to be
564    unnecessary.  We store the information in a field extending the
565    regular ELF linker hash table.  */
566 
567 struct elf32_sparc_dyn_relocs
568 {
569   struct elf32_sparc_dyn_relocs *next;
570 
571   /* The input section of the reloc.  */
572   asection *sec;
573 
574   /* Total number of relocs copied for the input section.  */
575   bfd_size_type count;
576 
577   /* Number of pc-relative relocs copied for the input section.  */
578   bfd_size_type pc_count;
579 };
580 
581 /* SPARC ELF linker hash entry.  */
582 
583 struct elf32_sparc_link_hash_entry
584 {
585   struct elf_link_hash_entry elf;
586 
587   /* Track dynamic relocs copied for this symbol.  */
588   struct elf32_sparc_dyn_relocs *dyn_relocs;
589 
590 #define GOT_UNKNOWN     0
591 #define GOT_NORMAL      1
592 #define GOT_TLS_GD      2
593 #define GOT_TLS_IE      3
594   unsigned char tls_type;
595 };
596 
597 #define elf32_sparc_hash_entry(ent) ((struct elf32_sparc_link_hash_entry *)(ent))
598 
599 struct elf32_sparc_obj_tdata
600 {
601   struct elf_obj_tdata root;
602 
603   /* tls_type for each local got entry.  */
604   char *local_got_tls_type;
605 
606   /* TRUE if TLS GD relocs has been seen for this object.  */
607   bfd_boolean has_tlsgd;
608 };
609 
610 #define elf32_sparc_tdata(abfd) \
611   ((struct elf32_sparc_obj_tdata *) (abfd)->tdata.any)
612 
613 #define elf32_sparc_local_got_tls_type(abfd) \
614   (elf32_sparc_tdata (abfd)->local_got_tls_type)
615 
616 static bfd_boolean
elf32_sparc_mkobject(abfd)617 elf32_sparc_mkobject (abfd)
618      bfd *abfd;
619 {
620   bfd_size_type amt = sizeof (struct elf32_sparc_obj_tdata);
621   abfd->tdata.any = bfd_zalloc (abfd, amt);
622   if (abfd->tdata.any == NULL)
623     return FALSE;
624   return TRUE;
625 }
626 
627 /* SPARC ELF linker hash table.  */
628 
629 struct elf32_sparc_link_hash_table
630 {
631   struct elf_link_hash_table elf;
632 
633   /* Short-cuts to get to dynamic linker sections.  */
634   asection *sgot;
635   asection *srelgot;
636   asection *splt;
637   asection *srelplt;
638   asection *sdynbss;
639   asection *srelbss;
640 
641   union {
642     bfd_signed_vma refcount;
643     bfd_vma offset;
644   } tls_ldm_got;
645 
646   /* Small local sym to section mapping cache.  */
647   struct sym_sec_cache sym_sec;
648 };
649 
650 /* Get the SPARC ELF linker hash table from a link_info structure.  */
651 
652 #define elf32_sparc_hash_table(p) \
653   ((struct elf32_sparc_link_hash_table *) ((p)->hash))
654 
655 /* Create an entry in an i386 ELF linker hash table.  */
656 
657 static struct bfd_hash_entry *
link_hash_newfunc(entry,table,string)658 link_hash_newfunc (entry, table, string)
659      struct bfd_hash_entry *entry;
660      struct bfd_hash_table *table;
661      const char *string;
662 {
663   /* Allocate the structure if it has not already been allocated by a
664      subclass.  */
665   if (entry == NULL)
666     {
667       entry = bfd_hash_allocate (table,
668 				 sizeof (struct elf32_sparc_link_hash_entry));
669       if (entry == NULL)
670 	return entry;
671     }
672 
673   /* Call the allocation method of the superclass.  */
674   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
675   if (entry != NULL)
676     {
677       struct elf32_sparc_link_hash_entry *eh;
678 
679       eh = (struct elf32_sparc_link_hash_entry *) entry;
680       eh->dyn_relocs = NULL;
681       eh->tls_type = GOT_UNKNOWN;
682     }
683 
684   return entry;
685 }
686 
687 /* Create a SPARC ELF linker hash table.  */
688 
689 static struct bfd_link_hash_table *
elf32_sparc_link_hash_table_create(abfd)690 elf32_sparc_link_hash_table_create (abfd)
691      bfd *abfd;
692 {
693   struct elf32_sparc_link_hash_table *ret;
694   bfd_size_type amt = sizeof (struct elf32_sparc_link_hash_table);
695 
696   ret = (struct elf32_sparc_link_hash_table *) bfd_malloc (amt);
697   if (ret == NULL)
698     return NULL;
699 
700   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
701     {
702       free (ret);
703       return NULL;
704     }
705 
706   ret->sgot = NULL;
707   ret->srelgot = NULL;
708   ret->splt = NULL;
709   ret->srelplt = NULL;
710   ret->sdynbss = NULL;
711   ret->srelbss = NULL;
712   ret->tls_ldm_got.refcount = 0;
713   ret->sym_sec.abfd = NULL;
714 
715   return &ret->elf.root;
716 }
717 
718 /* Create .got and .rela.got sections in DYNOBJ, and set up
719    shortcuts to them in our hash table.  */
720 
721 static bfd_boolean
create_got_section(dynobj,info)722 create_got_section (dynobj, info)
723      bfd *dynobj;
724      struct bfd_link_info *info;
725 {
726   struct elf32_sparc_link_hash_table *htab;
727 
728   if (! _bfd_elf_create_got_section (dynobj, info))
729     return FALSE;
730 
731   htab = elf32_sparc_hash_table (info);
732   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
733   if (!htab->sgot)
734     abort ();
735 
736   htab->srelgot = bfd_make_section (dynobj, ".rela.got");
737   if (htab->srelgot == NULL
738       || ! bfd_set_section_flags (dynobj, htab->srelgot,
739 				  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
740 				   | SEC_IN_MEMORY | SEC_LINKER_CREATED
741 				   | SEC_READONLY))
742       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
743     return FALSE;
744   return TRUE;
745 }
746 
747 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
748    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
749    hash table.  */
750 
751 static bfd_boolean
elf32_sparc_create_dynamic_sections(dynobj,info)752 elf32_sparc_create_dynamic_sections (dynobj, info)
753      bfd *dynobj;
754      struct bfd_link_info *info;
755 {
756   struct elf32_sparc_link_hash_table *htab;
757 
758   htab = elf32_sparc_hash_table (info);
759   if (!htab->sgot && !create_got_section (dynobj, info))
760     return FALSE;
761 
762   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
763     return FALSE;
764 
765   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
766   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
767   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
768   if (!info->shared)
769     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
770 
771   if (!htab->splt || !htab->srelplt || !htab->sdynbss
772       || (!info->shared && !htab->srelbss))
773     abort ();
774 
775   return TRUE;
776 }
777 
778 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
779 
780 static void
elf32_sparc_copy_indirect_symbol(bed,dir,ind)781 elf32_sparc_copy_indirect_symbol (bed, dir, ind)
782      const struct elf_backend_data *bed;
783      struct elf_link_hash_entry *dir, *ind;
784 {
785   struct elf32_sparc_link_hash_entry *edir, *eind;
786 
787   edir = (struct elf32_sparc_link_hash_entry *) dir;
788   eind = (struct elf32_sparc_link_hash_entry *) ind;
789 
790   if (eind->dyn_relocs != NULL)
791     {
792       if (edir->dyn_relocs != NULL)
793 	{
794 	  struct elf32_sparc_dyn_relocs **pp;
795 	  struct elf32_sparc_dyn_relocs *p;
796 
797 	  if (ind->root.type == bfd_link_hash_indirect)
798 	    abort ();
799 
800 	  /* Add reloc counts against the weak sym to the strong sym
801 	     list.  Merge any entries against the same section.  */
802 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
803 	    {
804 	      struct elf32_sparc_dyn_relocs *q;
805 
806 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
807 		if (q->sec == p->sec)
808 		  {
809 		    q->pc_count += p->pc_count;
810 		    q->count += p->count;
811 		    *pp = p->next;
812 		    break;
813 		  }
814 	      if (q == NULL)
815 		pp = &p->next;
816 	    }
817 	  *pp = edir->dyn_relocs;
818 	}
819 
820       edir->dyn_relocs = eind->dyn_relocs;
821       eind->dyn_relocs = NULL;
822     }
823 
824   if (ind->root.type == bfd_link_hash_indirect
825       && dir->got.refcount <= 0)
826     {
827       edir->tls_type = eind->tls_type;
828       eind->tls_type = GOT_UNKNOWN;
829     }
830   _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
831 }
832 
833 static int
elf32_sparc_tls_transition(info,abfd,r_type,is_local)834 elf32_sparc_tls_transition (info, abfd, r_type, is_local)
835      struct bfd_link_info *info;
836      bfd *abfd;
837      int r_type;
838      int is_local;
839 {
840   if (r_type == R_SPARC_TLS_GD_HI22
841       && ! elf32_sparc_tdata (abfd)->has_tlsgd)
842     r_type = R_SPARC_REV32;
843 
844   if (info->shared)
845     return r_type;
846 
847   switch (r_type)
848     {
849     case R_SPARC_TLS_GD_HI22:
850       if (is_local)
851 	return R_SPARC_TLS_LE_HIX22;
852       return R_SPARC_TLS_IE_HI22;
853     case R_SPARC_TLS_GD_LO10:
854       if (is_local)
855 	return R_SPARC_TLS_LE_LOX10;
856       return R_SPARC_TLS_IE_LO10;
857     case R_SPARC_TLS_IE_HI22:
858       if (is_local)
859 	return R_SPARC_TLS_LE_HIX22;
860       return r_type;
861     case R_SPARC_TLS_IE_LO10:
862       if (is_local)
863 	return R_SPARC_TLS_LE_LOX10;
864       return r_type;
865     case R_SPARC_TLS_LDM_HI22:
866       return R_SPARC_TLS_LE_HIX22;
867     case R_SPARC_TLS_LDM_LO10:
868       return R_SPARC_TLS_LE_LOX10;
869     }
870 
871   return r_type;
872 }
873 
874 /* Look through the relocs for a section during the first phase, and
875    allocate space in the global offset table or procedure linkage
876    table.  */
877 
878 static bfd_boolean
elf32_sparc_check_relocs(abfd,info,sec,relocs)879 elf32_sparc_check_relocs (abfd, info, sec, relocs)
880      bfd *abfd;
881      struct bfd_link_info *info;
882      asection *sec;
883      const Elf_Internal_Rela *relocs;
884 {
885   struct elf32_sparc_link_hash_table *htab;
886   Elf_Internal_Shdr *symtab_hdr;
887   struct elf_link_hash_entry **sym_hashes;
888   bfd_vma *local_got_offsets;
889   const Elf_Internal_Rela *rel;
890   const Elf_Internal_Rela *rel_end;
891   asection *sreloc;
892   bfd_boolean checked_tlsgd = FALSE;
893 
894   if (info->relocatable)
895     return TRUE;
896 
897   htab = elf32_sparc_hash_table (info);
898   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
899   sym_hashes = elf_sym_hashes (abfd);
900   local_got_offsets = elf_local_got_offsets (abfd);
901 
902   sreloc = NULL;
903 
904   rel_end = relocs + sec->reloc_count;
905   for (rel = relocs; rel < rel_end; rel++)
906     {
907       unsigned int r_type;
908       unsigned long r_symndx;
909       struct elf_link_hash_entry *h;
910 
911       r_symndx = ELF32_R_SYM (rel->r_info);
912       r_type = ELF32_R_TYPE (rel->r_info);
913 
914       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
915 	{
916 	  (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
917 				 bfd_archive_filename (abfd),
918 				 r_symndx);
919 	  return FALSE;
920 	}
921 
922       if (r_symndx < symtab_hdr->sh_info)
923 	h = NULL;
924       else
925 	h = sym_hashes[r_symndx - symtab_hdr->sh_info];
926 
927       /* Compatibility with old R_SPARC_REV32 reloc conflicting
928 	 with R_SPARC_TLS_GD_HI22.  */
929       if (! checked_tlsgd)
930 	switch (r_type)
931 	  {
932 	  case R_SPARC_TLS_GD_HI22:
933 	    {
934 	      const Elf_Internal_Rela *relt;
935 
936 	      for (relt = rel + 1; relt < rel_end; relt++)
937 		if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
938 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
939 		    || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
940 		  break;
941 	      checked_tlsgd = TRUE;
942 	      elf32_sparc_tdata (abfd)->has_tlsgd = relt < rel_end;
943 	    }
944 	    break;
945 	  case R_SPARC_TLS_GD_LO10:
946 	  case R_SPARC_TLS_GD_ADD:
947 	  case R_SPARC_TLS_GD_CALL:
948 	    checked_tlsgd = TRUE;
949 	    elf32_sparc_tdata (abfd)->has_tlsgd = TRUE;
950 	    break;
951 	  }
952 
953       r_type = elf32_sparc_tls_transition (info, abfd, r_type, h == NULL);
954       switch (r_type)
955 	{
956 	case R_SPARC_TLS_LDM_HI22:
957 	case R_SPARC_TLS_LDM_LO10:
958 	  htab->tls_ldm_got.refcount += 1;
959 	  break;
960 
961 	case R_SPARC_TLS_LE_HIX22:
962 	case R_SPARC_TLS_LE_LOX10:
963 	  if (info->shared)
964 	    goto r_sparc_plt32;
965 	  break;
966 
967 	case R_SPARC_TLS_IE_HI22:
968 	case R_SPARC_TLS_IE_LO10:
969 	  if (info->shared)
970 	    info->flags |= DF_STATIC_TLS;
971 	  /* Fall through */
972 
973 	case R_SPARC_GOT10:
974 	case R_SPARC_GOT13:
975 	case R_SPARC_GOT22:
976 	case R_SPARC_TLS_GD_HI22:
977 	case R_SPARC_TLS_GD_LO10:
978 	  /* This symbol requires a global offset table entry.  */
979 	  {
980 	    int tls_type, old_tls_type;
981 
982 	    switch (r_type)
983 	      {
984 	      default:
985 	      case R_SPARC_GOT10:
986 	      case R_SPARC_GOT13:
987 	      case R_SPARC_GOT22:
988 		tls_type = GOT_NORMAL;
989 		break;
990 	      case R_SPARC_TLS_GD_HI22:
991 	      case R_SPARC_TLS_GD_LO10:
992 		tls_type = GOT_TLS_GD;
993 		break;
994 	      case R_SPARC_TLS_IE_HI22:
995 	      case R_SPARC_TLS_IE_LO10:
996 		tls_type = GOT_TLS_IE;
997 		break;
998 	      }
999 
1000 	    if (h != NULL)
1001 	      {
1002 		h->got.refcount += 1;
1003 		old_tls_type = elf32_sparc_hash_entry(h)->tls_type;
1004 	      }
1005 	    else
1006 	      {
1007 		bfd_signed_vma *local_got_refcounts;
1008 
1009 		/* This is a global offset table entry for a local symbol.  */
1010 		local_got_refcounts = elf_local_got_refcounts (abfd);
1011 		if (local_got_refcounts == NULL)
1012 		  {
1013 		    bfd_size_type size;
1014 
1015 		    size = symtab_hdr->sh_info;
1016 		    size *= (sizeof (bfd_signed_vma) + sizeof(char));
1017 		    local_got_refcounts = ((bfd_signed_vma *)
1018 					   bfd_zalloc (abfd, size));
1019 		    if (local_got_refcounts == NULL)
1020 		      return FALSE;
1021 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
1022 		    elf32_sparc_local_got_tls_type (abfd)
1023 		      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1024 		  }
1025 		local_got_refcounts[r_symndx] += 1;
1026 		old_tls_type = elf32_sparc_local_got_tls_type (abfd) [r_symndx];
1027 	      }
1028 
1029 	    /* If a TLS symbol is accessed using IE at least once,
1030 	       there is no point to use dynamic model for it.  */
1031 	    if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1032 		&& (old_tls_type != GOT_TLS_GD
1033 		    || tls_type != GOT_TLS_IE))
1034 	      {
1035 		if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1036 		  tls_type = old_tls_type;
1037 		else
1038 		  {
1039 		    (*_bfd_error_handler)
1040 		      (_("%s: `%s' accessed both as normal and thread local symbol"),
1041 		       bfd_archive_filename (abfd),
1042 		       h ? h->root.root.string : "<local>");
1043 		    return FALSE;
1044 		  }
1045 	      }
1046 
1047 	    if (old_tls_type != tls_type)
1048 	      {
1049 		if (h != NULL)
1050 		  elf32_sparc_hash_entry (h)->tls_type = tls_type;
1051 		else
1052 		  elf32_sparc_local_got_tls_type (abfd) [r_symndx] = tls_type;
1053 	      }
1054 	  }
1055 
1056 	  if (htab->sgot == NULL)
1057 	    {
1058 	      if (htab->elf.dynobj == NULL)
1059 		htab->elf.dynobj = abfd;
1060 	      if (!create_got_section (htab->elf.dynobj, info))
1061 		return FALSE;
1062 	    }
1063 	  break;
1064 
1065 	case R_SPARC_TLS_GD_CALL:
1066 	case R_SPARC_TLS_LDM_CALL:
1067 	  if (info->shared)
1068 	    {
1069 	      /* These are basically R_SPARC_TLS_WPLT30 relocs against
1070 		 __tls_get_addr.  */
1071 	      struct bfd_link_hash_entry *bh = NULL;
1072 	      if (! _bfd_generic_link_add_one_symbol (info, abfd,
1073 						      "__tls_get_addr", 0,
1074 						      bfd_und_section_ptr, 0,
1075 						      NULL, FALSE, FALSE,
1076 						      &bh))
1077 		return FALSE;
1078 	      h = (struct elf_link_hash_entry *) bh;
1079 	    }
1080 	  else
1081 	    break;
1082 	  /* Fall through */
1083 
1084 	case R_SPARC_PLT32:
1085 	case R_SPARC_WPLT30:
1086 	  /* This symbol requires a procedure linkage table entry.  We
1087 	     actually build the entry in adjust_dynamic_symbol,
1088 	     because this might be a case of linking PIC code without
1089 	     linking in any dynamic objects, in which case we don't
1090 	     need to generate a procedure linkage table after all.  */
1091 
1092 	  if (h == NULL)
1093 	    {
1094 	      /* The Solaris native assembler will generate a WPLT30
1095 		 reloc for a local symbol if you assemble a call from
1096 		 one section to another when using -K pic.  We treat
1097 		 it as WDISP30.  */
1098 	      if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1099 		goto r_sparc_plt32;
1100 	      break;
1101 	    }
1102 
1103 	  h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1104 
1105 	  if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1106 	    goto r_sparc_plt32;
1107 	  h->plt.refcount += 1;
1108 	  break;
1109 
1110 	case R_SPARC_PC10:
1111 	case R_SPARC_PC22:
1112 	  if (h != NULL)
1113 	    h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1114 
1115 	  if (h != NULL
1116 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1117 	    break;
1118 	  /* Fall through.  */
1119 
1120 	case R_SPARC_DISP8:
1121 	case R_SPARC_DISP16:
1122 	case R_SPARC_DISP32:
1123 	case R_SPARC_WDISP30:
1124 	case R_SPARC_WDISP22:
1125 	case R_SPARC_WDISP19:
1126 	case R_SPARC_WDISP16:
1127 	case R_SPARC_8:
1128 	case R_SPARC_16:
1129 	case R_SPARC_32:
1130 	case R_SPARC_HI22:
1131 	case R_SPARC_22:
1132 	case R_SPARC_13:
1133 	case R_SPARC_LO10:
1134 	case R_SPARC_UA16:
1135 	case R_SPARC_UA32:
1136 	  if (h != NULL)
1137 	    h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1138 
1139 	r_sparc_plt32:
1140 	  if (h != NULL && !info->shared)
1141 	    {
1142 	      /* We may need a .plt entry if the function this reloc
1143 		 refers to is in a shared lib.  */
1144 	      h->plt.refcount += 1;
1145 	    }
1146 
1147 	  /* If we are creating a shared library, and this is a reloc
1148 	     against a global symbol, or a non PC relative reloc
1149 	     against a local symbol, then we need to copy the reloc
1150 	     into the shared library.  However, if we are linking with
1151 	     -Bsymbolic, we do not need to copy a reloc against a
1152 	     global symbol which is defined in an object we are
1153 	     including in the link (i.e., DEF_REGULAR is set).  At
1154 	     this point we have not seen all the input files, so it is
1155 	     possible that DEF_REGULAR is not set now but will be set
1156 	     later (it is never cleared).  In case of a weak definition,
1157 	     DEF_REGULAR may be cleared later by a strong definition in
1158 	     a shared library.  We account for that possibility below by
1159 	     storing information in the relocs_copied field of the hash
1160 	     table entry.  A similar situation occurs when creating
1161 	     shared libraries and symbol visibility changes render the
1162 	     symbol local.
1163 
1164 	     If on the other hand, we are creating an executable, we
1165 	     may need to keep relocations for symbols satisfied by a
1166 	     dynamic library if we manage to avoid copy relocs for the
1167 	     symbol.  */
1168 	  if ((info->shared
1169 	       && (sec->flags & SEC_ALLOC) != 0
1170 	       && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1171 		   || (h != NULL
1172 		       && (! info->symbolic
1173 			   || h->root.type == bfd_link_hash_defweak
1174 			   || (h->elf_link_hash_flags
1175 			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1176 	      || (!info->shared
1177 		  && (sec->flags & SEC_ALLOC) != 0
1178 		  && h != NULL
1179 		  && (h->root.type == bfd_link_hash_defweak
1180 		      || (h->elf_link_hash_flags
1181 			  & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1182 	    {
1183 	      struct elf32_sparc_dyn_relocs *p;
1184 	      struct elf32_sparc_dyn_relocs **head;
1185 
1186 	      /* When creating a shared object, we must copy these
1187 		 relocs into the output file.  We create a reloc
1188 		 section in dynobj and make room for the reloc.  */
1189 	      if (sreloc == NULL)
1190 		{
1191 		  const char *name;
1192 		  bfd *dynobj;
1193 
1194 		  name = (bfd_elf_string_from_elf_section
1195 			  (abfd,
1196 			   elf_elfheader (abfd)->e_shstrndx,
1197 			   elf_section_data (sec)->rel_hdr.sh_name));
1198 		  if (name == NULL)
1199 		    return FALSE;
1200 
1201 		  BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1202 			      && strcmp (bfd_get_section_name (abfd, sec),
1203 					 name + 5) == 0);
1204 
1205 		  if (htab->elf.dynobj == NULL)
1206 		    htab->elf.dynobj = abfd;
1207 		  dynobj = htab->elf.dynobj;
1208 
1209 		  sreloc = bfd_get_section_by_name (dynobj, name);
1210 		  if (sreloc == NULL)
1211 		    {
1212 		      flagword flags;
1213 
1214 		      sreloc = bfd_make_section (dynobj, name);
1215 		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
1216 			       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1217 		      if ((sec->flags & SEC_ALLOC) != 0)
1218 			flags |= SEC_ALLOC | SEC_LOAD;
1219 		      if (sreloc == NULL
1220 			  || ! bfd_set_section_flags (dynobj, sreloc, flags)
1221 			  || ! bfd_set_section_alignment (dynobj, sreloc, 2))
1222 			return FALSE;
1223 		    }
1224 		  elf_section_data (sec)->sreloc = sreloc;
1225 		}
1226 
1227 	      /* If this is a global symbol, we count the number of
1228 		 relocations we need for this symbol.  */
1229 	      if (h != NULL)
1230 		head = &((struct elf32_sparc_link_hash_entry *) h)->dyn_relocs;
1231 	      else
1232 		{
1233 		  /* Track dynamic relocs needed for local syms too.
1234 		     We really need local syms available to do this
1235 		     easily.  Oh well.  */
1236 
1237 		  asection *s;
1238 		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1239 						 sec, r_symndx);
1240 		  if (s == NULL)
1241 		    return FALSE;
1242 
1243 		  head = ((struct elf32_sparc_dyn_relocs **)
1244 			  &elf_section_data (s)->local_dynrel);
1245 		}
1246 
1247 	      p = *head;
1248 	      if (p == NULL || p->sec != sec)
1249 		{
1250 		  bfd_size_type amt = sizeof *p;
1251 		  p = ((struct elf32_sparc_dyn_relocs *)
1252 		       bfd_alloc (htab->elf.dynobj, amt));
1253 		  if (p == NULL)
1254 		    return FALSE;
1255 		  p->next = *head;
1256 		  *head = p;
1257 		  p->sec = sec;
1258 		  p->count = 0;
1259 		  p->pc_count = 0;
1260 		}
1261 
1262 	      p->count += 1;
1263 	      if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1264 		p->pc_count += 1;
1265 	    }
1266 
1267 	  break;
1268 
1269 	case R_SPARC_GNU_VTINHERIT:
1270 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1271 	    return FALSE;
1272 	  break;
1273 
1274 	case R_SPARC_GNU_VTENTRY:
1275 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1276 	    return FALSE;
1277 	  break;
1278 
1279 	default:
1280 	  break;
1281 	}
1282     }
1283 
1284   return TRUE;
1285 }
1286 
1287 static asection *
elf32_sparc_gc_mark_hook(sec,info,rel,h,sym)1288 elf32_sparc_gc_mark_hook (sec, info, rel, h, sym)
1289        asection *sec;
1290        struct bfd_link_info *info ATTRIBUTE_UNUSED;
1291        Elf_Internal_Rela *rel;
1292        struct elf_link_hash_entry *h;
1293        Elf_Internal_Sym *sym;
1294 {
1295   if (h != NULL)
1296     {
1297       switch (ELF32_R_TYPE (rel->r_info))
1298       {
1299       case R_SPARC_GNU_VTINHERIT:
1300       case R_SPARC_GNU_VTENTRY:
1301 	break;
1302 
1303       default:
1304 	switch (h->root.type)
1305 	  {
1306 	  case bfd_link_hash_defined:
1307 	  case bfd_link_hash_defweak:
1308 	    return h->root.u.def.section;
1309 
1310 	  case bfd_link_hash_common:
1311 	    return h->root.u.c.p->section;
1312 
1313 	  default:
1314 	    break;
1315 	  }
1316        }
1317      }
1318    else
1319      return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1320 
1321   return NULL;
1322 }
1323 
1324 /* Update the got entry reference counts for the section being removed.  */
1325 static bfd_boolean
elf32_sparc_gc_sweep_hook(abfd,info,sec,relocs)1326 elf32_sparc_gc_sweep_hook (abfd, info, sec, relocs)
1327      bfd *abfd;
1328      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1329      asection *sec;
1330      const Elf_Internal_Rela *relocs;
1331 {
1332   Elf_Internal_Shdr *symtab_hdr;
1333   struct elf_link_hash_entry **sym_hashes;
1334   bfd_signed_vma *local_got_refcounts;
1335   const Elf_Internal_Rela *rel, *relend;
1336 
1337   elf_section_data (sec)->local_dynrel = NULL;
1338 
1339   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1340   sym_hashes = elf_sym_hashes (abfd);
1341   local_got_refcounts = elf_local_got_refcounts (abfd);
1342 
1343   relend = relocs + sec->reloc_count;
1344   for (rel = relocs; rel < relend; rel++)
1345     {
1346       unsigned long r_symndx;
1347       unsigned int r_type;
1348       struct elf_link_hash_entry *h = NULL;
1349 
1350       r_symndx = ELF32_R_SYM (rel->r_info);
1351       if (r_symndx >= symtab_hdr->sh_info)
1352 	{
1353 	  struct elf32_sparc_link_hash_entry *eh;
1354 	  struct elf32_sparc_dyn_relocs **pp;
1355 	  struct elf32_sparc_dyn_relocs *p;
1356 
1357 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1358 	  eh = (struct elf32_sparc_link_hash_entry *) h;
1359 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1360 	    if (p->sec == sec)
1361 	      {
1362 		/* Everything must go for SEC.  */
1363 		*pp = p->next;
1364 		break;
1365 	      }
1366 	}
1367 
1368       r_type = ELF32_R_TYPE (rel->r_info);
1369       r_type = elf32_sparc_tls_transition (info, abfd, r_type, h != NULL);
1370       switch (r_type)
1371 	{
1372 	case R_SPARC_TLS_LDM_HI22:
1373 	case R_SPARC_TLS_LDM_LO10:
1374 	  if (elf32_sparc_hash_table (info)->tls_ldm_got.refcount > 0)
1375 	    elf32_sparc_hash_table (info)->tls_ldm_got.refcount -= 1;
1376 	  break;
1377 
1378 	case R_SPARC_TLS_GD_HI22:
1379 	case R_SPARC_TLS_GD_LO10:
1380 	case R_SPARC_TLS_IE_HI22:
1381 	case R_SPARC_TLS_IE_LO10:
1382 	case R_SPARC_GOT10:
1383 	case R_SPARC_GOT13:
1384 	case R_SPARC_GOT22:
1385 	  if (h != NULL)
1386 	    {
1387 	      if (h->got.refcount > 0)
1388 		h->got.refcount--;
1389 	    }
1390 	  else
1391 	    {
1392 	      if (local_got_refcounts[r_symndx] > 0)
1393 		local_got_refcounts[r_symndx]--;
1394 	    }
1395 	  break;
1396 
1397 	case R_SPARC_PC10:
1398 	case R_SPARC_PC22:
1399 	  if (h != NULL
1400 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1401 	    break;
1402 	  /* Fall through.  */
1403 
1404 	case R_SPARC_DISP8:
1405 	case R_SPARC_DISP16:
1406 	case R_SPARC_DISP32:
1407 	case R_SPARC_WDISP30:
1408 	case R_SPARC_WDISP22:
1409 	case R_SPARC_WDISP19:
1410 	case R_SPARC_WDISP16:
1411 	case R_SPARC_8:
1412 	case R_SPARC_16:
1413 	case R_SPARC_32:
1414 	case R_SPARC_HI22:
1415 	case R_SPARC_22:
1416 	case R_SPARC_13:
1417 	case R_SPARC_LO10:
1418 	case R_SPARC_UA16:
1419 	case R_SPARC_UA32:
1420 	case R_SPARC_PLT32:
1421 	  if (info->shared)
1422 	    break;
1423 	  /* Fall through.  */
1424 
1425 	case R_SPARC_WPLT30:
1426 	  if (h != NULL)
1427 	    {
1428 	      if (h->plt.refcount > 0)
1429 		h->plt.refcount--;
1430 	    }
1431 	  break;
1432 
1433 	default:
1434 	  break;
1435 	}
1436     }
1437 
1438   return TRUE;
1439 }
1440 
1441 /* Adjust a symbol defined by a dynamic object and referenced by a
1442    regular object.  The current definition is in some section of the
1443    dynamic object, but we're not including those sections.  We have to
1444    change the definition to something the rest of the link can
1445    understand.  */
1446 
1447 static bfd_boolean
elf32_sparc_adjust_dynamic_symbol(info,h)1448 elf32_sparc_adjust_dynamic_symbol (info, h)
1449      struct bfd_link_info *info;
1450      struct elf_link_hash_entry *h;
1451 {
1452   struct elf32_sparc_link_hash_table *htab;
1453   struct elf32_sparc_link_hash_entry * eh;
1454   struct elf32_sparc_dyn_relocs *p;
1455   asection *s;
1456   unsigned int power_of_two;
1457 
1458   htab = elf32_sparc_hash_table (info);
1459 
1460   /* Make sure we know what is going on here.  */
1461   BFD_ASSERT (htab->elf.dynobj != NULL
1462 	      && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
1463 		  || h->weakdef != NULL
1464 		  || ((h->elf_link_hash_flags
1465 		       & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1466 		      && (h->elf_link_hash_flags
1467 			  & ELF_LINK_HASH_REF_REGULAR) != 0
1468 		      && (h->elf_link_hash_flags
1469 			  & ELF_LINK_HASH_DEF_REGULAR) == 0)));
1470 
1471   /* If this is a function, put it in the procedure linkage table.  We
1472      will fill in the contents of the procedure linkage table later
1473      (although we could actually do it here).  The STT_NOTYPE
1474      condition is a hack specifically for the Oracle libraries
1475      delivered for Solaris; for some inexplicable reason, they define
1476      some of their functions as STT_NOTYPE when they really should be
1477      STT_FUNC.  */
1478   if (h->type == STT_FUNC
1479       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
1480       || (h->type == STT_NOTYPE
1481 	  && (h->root.type == bfd_link_hash_defined
1482 	      || h->root.type == bfd_link_hash_defweak)
1483 	  && (h->root.u.def.section->flags & SEC_CODE) != 0))
1484     {
1485       if (h->plt.refcount <= 0
1486 	  || (! info->shared
1487 	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1488 	      && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1489 	      && h->root.type != bfd_link_hash_undefweak
1490 	      && h->root.type != bfd_link_hash_undefined))
1491 	{
1492 	  /* This case can occur if we saw a WPLT30 reloc in an input
1493 	     file, but the symbol was never referred to by a dynamic
1494 	     object, or if all references were garbage collected.  In
1495 	     such a case, we don't actually need to build a procedure
1496 	     linkage table, and we can just do a WDISP30 reloc instead.  */
1497 	  h->plt.offset = (bfd_vma) -1;
1498 	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1499 	}
1500 
1501       return TRUE;
1502     }
1503   else
1504     h->plt.offset = (bfd_vma) -1;
1505 
1506   /* If this is a weak symbol, and there is a real definition, the
1507      processor independent code will have arranged for us to see the
1508      real definition first, and we can just use the same value.  */
1509   if (h->weakdef != NULL)
1510     {
1511       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1512 		  || h->weakdef->root.type == bfd_link_hash_defweak);
1513       h->root.u.def.section = h->weakdef->root.u.def.section;
1514       h->root.u.def.value = h->weakdef->root.u.def.value;
1515       return TRUE;
1516     }
1517 
1518   /* This is a reference to a symbol defined by a dynamic object which
1519      is not a function.  */
1520 
1521   /* If we are creating a shared library, we must presume that the
1522      only references to the symbol are via the global offset table.
1523      For such cases we need not do anything here; the relocations will
1524      be handled correctly by relocate_section.  */
1525   if (info->shared)
1526     return TRUE;
1527 
1528   /* If there are no references to this symbol that do not use the
1529      GOT, we don't need to generate a copy reloc.  */
1530   if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1531     return TRUE;
1532 
1533   eh = (struct elf32_sparc_link_hash_entry *) h;
1534   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1535     {
1536       s = p->sec->output_section;
1537       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1538 	break;
1539     }
1540 
1541   /* If we didn't find any dynamic relocs in read-only sections, then
1542      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1543   if (p == NULL)
1544     {
1545       h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1546       return TRUE;
1547     }
1548 
1549   /* We must allocate the symbol in our .dynbss section, which will
1550      become part of the .bss section of the executable.  There will be
1551      an entry for this symbol in the .dynsym section.  The dynamic
1552      object will contain position independent code, so all references
1553      from the dynamic object to this symbol will go through the global
1554      offset table.  The dynamic linker will use the .dynsym entry to
1555      determine the address it must put in the global offset table, so
1556      both the dynamic object and the regular object will refer to the
1557      same memory location for the variable.  */
1558 
1559   /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1560      to copy the initial value out of the dynamic object and into the
1561      runtime process image.  We need to remember the offset into the
1562      .rel.bss section we are going to use.  */
1563   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1564     {
1565       htab->srelbss->_raw_size += sizeof (Elf32_External_Rela);
1566       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1567     }
1568 
1569   /* We need to figure out the alignment required for this symbol.  I
1570      have no idea how ELF linkers handle this.  */
1571   power_of_two = bfd_log2 (h->size);
1572   if (power_of_two > 3)
1573     power_of_two = 3;
1574 
1575   /* Apply the required alignment.  */
1576   s = htab->sdynbss;
1577   s->_raw_size = BFD_ALIGN (s->_raw_size,
1578 			    (bfd_size_type) (1 << power_of_two));
1579   if (power_of_two > bfd_get_section_alignment (dynobj, s))
1580     {
1581       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1582 	return FALSE;
1583     }
1584 
1585   /* Define the symbol as being at this point in the section.  */
1586   h->root.u.def.section = s;
1587   h->root.u.def.value = s->_raw_size;
1588 
1589   /* Increment the section size to make room for the symbol.  */
1590   s->_raw_size += h->size;
1591 
1592   return TRUE;
1593 }
1594 
1595 /* Allocate space in .plt, .got and associated reloc sections for
1596    dynamic relocs.  */
1597 
1598 static bfd_boolean
allocate_dynrelocs(h,inf)1599 allocate_dynrelocs (h, inf)
1600      struct elf_link_hash_entry *h;
1601      PTR inf;
1602 {
1603   struct bfd_link_info *info;
1604   struct elf32_sparc_link_hash_table *htab;
1605   struct elf32_sparc_link_hash_entry *eh;
1606   struct elf32_sparc_dyn_relocs *p;
1607 
1608   if (h->root.type == bfd_link_hash_indirect)
1609     return TRUE;
1610 
1611   if (h->root.type == bfd_link_hash_warning)
1612     /* When warning symbols are created, they **replace** the "real"
1613        entry in the hash table, thus we never get to see the real
1614        symbol in a hash traversal.  So look at it now.  */
1615     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1616 
1617   info = (struct bfd_link_info *) inf;
1618   htab = elf32_sparc_hash_table (info);
1619 
1620   if (htab->elf.dynamic_sections_created
1621       && h->plt.refcount > 0)
1622     {
1623       /* Make sure this symbol is output as a dynamic symbol.
1624 	 Undefined weak syms won't yet be marked as dynamic.  */
1625       if (h->dynindx == -1
1626 	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1627 	{
1628 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
1629 	    return FALSE;
1630 	}
1631 
1632       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
1633 	{
1634 	  asection *s = htab->splt;
1635 
1636 	  /* The first four entries in .plt are reserved.  */
1637 	  if (s->_raw_size == 0)
1638 	    s->_raw_size = 4 * PLT_ENTRY_SIZE;
1639 
1640 	  /* The procedure linkage table has a maximum size.  */
1641 	  if (s->_raw_size >= 0x400000)
1642 	    {
1643 	      bfd_set_error (bfd_error_bad_value);
1644 	      return FALSE;
1645 	    }
1646 
1647 	  h->plt.offset = s->_raw_size;
1648 
1649 	  /* If this symbol is not defined in a regular file, and we are
1650 	     not generating a shared library, then set the symbol to this
1651 	     location in the .plt.  This is required to make function
1652 	     pointers compare as equal between the normal executable and
1653 	     the shared library.  */
1654 	  if (! info->shared
1655 	      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1656 	    {
1657 	      h->root.u.def.section = s;
1658 	      h->root.u.def.value = h->plt.offset;
1659 	    }
1660 
1661 	  /* Make room for this entry.  */
1662 	  s->_raw_size += PLT_ENTRY_SIZE;
1663 
1664 	  /* We also need to make an entry in the .rela.plt section.  */
1665 	  htab->srelplt->_raw_size += sizeof (Elf32_External_Rela);
1666 	}
1667       else
1668 	{
1669 	  h->plt.offset = (bfd_vma) -1;
1670 	  h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1671 	}
1672     }
1673   else
1674     {
1675       h->plt.offset = (bfd_vma) -1;
1676       h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1677     }
1678 
1679   /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
1680      make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry.  */
1681   if (h->got.refcount > 0
1682       && !info->shared
1683       && h->dynindx == -1
1684       && elf32_sparc_hash_entry(h)->tls_type == GOT_TLS_IE)
1685     h->got.offset = (bfd_vma) -1;
1686   else if (h->got.refcount > 0)
1687     {
1688       asection *s;
1689       bfd_boolean dyn;
1690       int tls_type = elf32_sparc_hash_entry(h)->tls_type;
1691 
1692       /* Make sure this symbol is output as a dynamic symbol.
1693 	 Undefined weak syms won't yet be marked as dynamic.  */
1694       if (h->dynindx == -1
1695 	  && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1696 	{
1697 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
1698 	    return FALSE;
1699 	}
1700 
1701       s = htab->sgot;
1702       h->got.offset = s->_raw_size;
1703       s->_raw_size += 4;
1704       /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots.  */
1705       if (tls_type == GOT_TLS_GD)
1706 	s->_raw_size += 4;
1707       dyn = htab->elf.dynamic_sections_created;
1708       /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
1709 	 R_SPARC_TLS_GD_{HI22,LO10} needs one if local symbol and two if
1710 	 global.  */
1711       if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1712 	  || tls_type == GOT_TLS_IE)
1713 	htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1714       else if (tls_type == GOT_TLS_GD)
1715 	htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rela);
1716       else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
1717 	htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1718     }
1719   else
1720     h->got.offset = (bfd_vma) -1;
1721 
1722   eh = (struct elf32_sparc_link_hash_entry *) h;
1723   if (eh->dyn_relocs == NULL)
1724     return TRUE;
1725 
1726   /* In the shared -Bsymbolic case, discard space allocated for
1727      dynamic pc-relative relocs against symbols which turn out to be
1728      defined in regular objects.  For the normal shared case, discard
1729      space for pc-relative relocs that have become local due to symbol
1730      visibility changes.  */
1731 
1732   if (info->shared)
1733     {
1734       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1735 	  && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1736 	      || info->symbolic))
1737 	{
1738 	  struct elf32_sparc_dyn_relocs **pp;
1739 
1740 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1741 	    {
1742 	      p->count -= p->pc_count;
1743 	      p->pc_count = 0;
1744 	      if (p->count == 0)
1745 		*pp = p->next;
1746 	      else
1747 		pp = &p->next;
1748 	    }
1749 	}
1750     }
1751   else
1752     {
1753       /* For the non-shared case, discard space for relocs against
1754 	 symbols which turn out to need copy relocs or are not
1755 	 dynamic.  */
1756 
1757       if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1758 	  && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1759 	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1760 	      || (htab->elf.dynamic_sections_created
1761 		  && (h->root.type == bfd_link_hash_undefweak
1762 		      || h->root.type == bfd_link_hash_undefined))))
1763 	{
1764 	  /* Make sure this symbol is output as a dynamic symbol.
1765 	     Undefined weak syms won't yet be marked as dynamic.  */
1766 	  if (h->dynindx == -1
1767 	      && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1768 	    {
1769 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
1770 		return FALSE;
1771 	    }
1772 
1773 	  /* If that succeeded, we know we'll be keeping all the
1774 	     relocs.  */
1775 	  if (h->dynindx != -1)
1776 	    goto keep;
1777 	}
1778 
1779       eh->dyn_relocs = NULL;
1780 
1781     keep: ;
1782     }
1783 
1784   /* Finally, allocate space.  */
1785   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1786     {
1787       asection *sreloc = elf_section_data (p->sec)->sreloc;
1788       sreloc->_raw_size += p->count * sizeof (Elf32_External_Rela);
1789     }
1790 
1791   return TRUE;
1792 }
1793 
1794 /* Find any dynamic relocs that apply to read-only sections.  */
1795 
1796 static bfd_boolean
readonly_dynrelocs(h,inf)1797 readonly_dynrelocs (h, inf)
1798      struct elf_link_hash_entry *h;
1799      PTR inf;
1800 {
1801   struct elf32_sparc_link_hash_entry *eh;
1802   struct elf32_sparc_dyn_relocs *p;
1803 
1804   if (h->root.type == bfd_link_hash_warning)
1805     h = (struct elf_link_hash_entry *) h->root.u.i.link;
1806 
1807   eh = (struct elf32_sparc_link_hash_entry *) h;
1808   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1809     {
1810       asection *s = p->sec->output_section;
1811 
1812       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1813 	{
1814 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
1815 
1816 	  info->flags |= DF_TEXTREL;
1817 
1818 	  /* Not an error, just cut short the traversal.  */
1819 	  return FALSE;
1820 	}
1821     }
1822   return TRUE;
1823 }
1824 
1825 /* Set the sizes of the dynamic sections.  */
1826 
1827 static bfd_boolean
elf32_sparc_size_dynamic_sections(output_bfd,info)1828 elf32_sparc_size_dynamic_sections (output_bfd, info)
1829      bfd *output_bfd ATTRIBUTE_UNUSED;
1830      struct bfd_link_info *info;
1831 {
1832   struct elf32_sparc_link_hash_table *htab;
1833   bfd *dynobj;
1834   asection *s;
1835   bfd *ibfd;
1836 
1837   htab = elf32_sparc_hash_table (info);
1838   dynobj = htab->elf.dynobj;
1839   BFD_ASSERT (dynobj != NULL);
1840 
1841   if (elf_hash_table (info)->dynamic_sections_created)
1842     {
1843       /* Set the contents of the .interp section to the interpreter.  */
1844       if (info->executable)
1845 	{
1846 	  s = bfd_get_section_by_name (dynobj, ".interp");
1847 	  BFD_ASSERT (s != NULL);
1848 	  s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1849 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1850 	}
1851     }
1852 
1853   /* Set up .got offsets for local syms, and space for local dynamic
1854      relocs.  */
1855   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1856     {
1857       bfd_signed_vma *local_got;
1858       bfd_signed_vma *end_local_got;
1859       char *local_tls_type;
1860       bfd_size_type locsymcount;
1861       Elf_Internal_Shdr *symtab_hdr;
1862       asection *srel;
1863 
1864       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1865 	continue;
1866 
1867       for (s = ibfd->sections; s != NULL; s = s->next)
1868 	{
1869 	  struct elf32_sparc_dyn_relocs *p;
1870 
1871 	  for (p = *((struct elf32_sparc_dyn_relocs **)
1872 		     &elf_section_data (s)->local_dynrel);
1873 	       p != NULL;
1874 	       p = p->next)
1875 	    {
1876 	      if (!bfd_is_abs_section (p->sec)
1877 		  && bfd_is_abs_section (p->sec->output_section))
1878 		{
1879 		  /* Input section has been discarded, either because
1880 		     it is a copy of a linkonce section or due to
1881 		     linker script /DISCARD/, so we'll be discarding
1882 		     the relocs too.  */
1883 		}
1884 	      else if (p->count != 0)
1885 		{
1886 		  srel = elf_section_data (p->sec)->sreloc;
1887 		  srel->_raw_size += p->count * sizeof (Elf32_External_Rela);
1888 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1889 		    info->flags |= DF_TEXTREL;
1890 		}
1891 	    }
1892 	}
1893 
1894       local_got = elf_local_got_refcounts (ibfd);
1895       if (!local_got)
1896 	continue;
1897 
1898       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1899       locsymcount = symtab_hdr->sh_info;
1900       end_local_got = local_got + locsymcount;
1901       local_tls_type = elf32_sparc_local_got_tls_type (ibfd);
1902       s = htab->sgot;
1903       srel = htab->srelgot;
1904       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1905 	{
1906 	  if (*local_got > 0)
1907 	    {
1908 	      *local_got = s->_raw_size;
1909 	      s->_raw_size += 4;
1910 	      if (*local_tls_type == GOT_TLS_GD)
1911 		s->_raw_size += 4;
1912 	      if (info->shared
1913 		  || *local_tls_type == GOT_TLS_GD
1914 		  || *local_tls_type == GOT_TLS_IE)
1915 		srel->_raw_size += sizeof (Elf32_External_Rela);
1916 	    }
1917 	  else
1918 	    *local_got = (bfd_vma) -1;
1919 	}
1920     }
1921 
1922   if (htab->tls_ldm_got.refcount > 0)
1923     {
1924       /* Allocate 2 got entries and 1 dynamic reloc for
1925 	 R_SPARC_TLS_LDM_{HI22,LO10} relocs.  */
1926       htab->tls_ldm_got.offset = htab->sgot->_raw_size;
1927       htab->sgot->_raw_size += 8;
1928       htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1929     }
1930   else
1931     htab->tls_ldm_got.offset = -1;
1932 
1933   /* Allocate global sym .plt and .got entries, and space for global
1934      sym dynamic relocs.  */
1935   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1936 
1937   if (elf_hash_table (info)->dynamic_sections_created)
1938     {
1939       /* Make space for the trailing nop in .plt.  */
1940       if (htab->splt->_raw_size > 0)
1941 	htab->splt->_raw_size += 4;
1942 
1943       /* If the .got section is more than 0x1000 bytes, we add
1944 	 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
1945 	 bit relocations have a greater chance of working.  */
1946       if (htab->sgot->_raw_size >= 0x1000
1947 	  && elf_hash_table (info)->hgot->root.u.def.value == 0)
1948 	elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
1949     }
1950 
1951   /* The check_relocs and adjust_dynamic_symbol entry points have
1952      determined the sizes of the various dynamic sections.  Allocate
1953      memory for them.  */
1954   for (s = dynobj->sections; s != NULL; s = s->next)
1955     {
1956       const char *name;
1957       bfd_boolean strip = FALSE;
1958 
1959       if ((s->flags & SEC_LINKER_CREATED) == 0)
1960 	continue;
1961 
1962       /* It's OK to base decisions on the section name, because none
1963 	 of the dynobj section names depend upon the input files.  */
1964       name = bfd_get_section_name (dynobj, s);
1965 
1966       if (strncmp (name, ".rela", 5) == 0)
1967 	{
1968 	  if (s->_raw_size == 0)
1969 	    {
1970 	      /* If we don't need this section, strip it from the
1971 		 output file.  This is to handle .rela.bss and
1972 		 .rel.plt.  We must create it in
1973 		 create_dynamic_sections, because it must be created
1974 		 before the linker maps input sections to output
1975 		 sections.  The linker does that before
1976 		 adjust_dynamic_symbol is called, and it is that
1977 		 function which decides whether anything needs to go
1978 		 into these sections.  */
1979 	      strip = TRUE;
1980 	    }
1981 	  else
1982 	    {
1983 	      /* We use the reloc_count field as a counter if we need
1984 		 to copy relocs into the output file.  */
1985 	      s->reloc_count = 0;
1986 	    }
1987 	}
1988       else if (s != htab->splt && s != htab->sgot)
1989 	{
1990 	  /* It's not one of our sections, so don't allocate space.  */
1991 	  continue;
1992 	}
1993 
1994       if (strip)
1995 	{
1996 	  _bfd_strip_section_from_output (info, s);
1997 	  continue;
1998 	}
1999 
2000       /* Allocate memory for the section contents.  */
2001       /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
2002 	 Unused entries should be reclaimed before the section's contents
2003 	 are written out, but at the moment this does not happen.  Thus in
2004 	 order to prevent writing out garbage, we initialise the section's
2005 	 contents to zero.  */
2006       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2007       if (s->contents == NULL && s->_raw_size != 0)
2008 	return FALSE;
2009     }
2010 
2011   if (elf_hash_table (info)->dynamic_sections_created)
2012     {
2013       /* Add some entries to the .dynamic section.  We fill in the
2014 	 values later, in elf32_sparc_finish_dynamic_sections, but we
2015 	 must add the entries now so that we get the correct size for
2016 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
2017 	 dynamic linker and used by the debugger.  */
2018 #define add_dynamic_entry(TAG, VAL) \
2019   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2020 
2021       if (info->executable)
2022 	{
2023 	  if (!add_dynamic_entry (DT_DEBUG, 0))
2024 	    return FALSE;
2025 	}
2026 
2027       if (htab->srelplt->_raw_size != 0)
2028 	{
2029 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
2030 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
2031 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2032 	      || !add_dynamic_entry (DT_JMPREL, 0))
2033 	    return FALSE;
2034 	}
2035 
2036       if (!add_dynamic_entry (DT_RELA, 0)
2037 	  || !add_dynamic_entry (DT_RELASZ, 0)
2038 	  || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2039 	return FALSE;
2040 
2041       /* If any dynamic relocs apply to a read-only section,
2042 	 then we need a DT_TEXTREL entry.  */
2043       if ((info->flags & DF_TEXTREL) == 0)
2044 	elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2045 				(PTR) info);
2046 
2047       if (info->flags & DF_TEXTREL)
2048 	{
2049 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
2050 	    return FALSE;
2051 	}
2052     }
2053 #undef add_dynamic_entry
2054 
2055   return TRUE;
2056 }
2057 
2058 struct elf32_sparc_section_data
2059 {
2060   struct bfd_elf_section_data elf;
2061   unsigned int do_relax;
2062 };
2063 
2064 #define sec_do_relax(sec) \
2065   ((struct elf32_sparc_section_data *) elf_section_data (sec))->do_relax
2066 
2067 static bfd_boolean
elf32_sparc_new_section_hook(abfd,sec)2068 elf32_sparc_new_section_hook (abfd, sec)
2069      bfd *abfd;
2070      asection *sec;
2071 {
2072   struct elf32_sparc_section_data *sdata;
2073   bfd_size_type amt = sizeof (*sdata);
2074 
2075   sdata = (struct elf32_sparc_section_data *) bfd_zalloc (abfd, amt);
2076   if (sdata == NULL)
2077     return FALSE;
2078   sec->used_by_bfd = (PTR) sdata;
2079 
2080   return _bfd_elf_new_section_hook (abfd, sec);
2081 }
2082 
2083 static bfd_boolean
elf32_sparc_relax_section(abfd,section,link_info,again)2084 elf32_sparc_relax_section (abfd, section, link_info, again)
2085      bfd *abfd ATTRIBUTE_UNUSED;
2086      asection *section ATTRIBUTE_UNUSED;
2087      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
2088      bfd_boolean *again;
2089 {
2090   *again = FALSE;
2091   sec_do_relax (section) = 1;
2092   return TRUE;
2093 }
2094 
2095 /* Return the base VMA address which should be subtracted from real addresses
2096    when resolving @dtpoff relocation.
2097    This is PT_TLS segment p_vaddr.  */
2098 
2099 static bfd_vma
dtpoff_base(info)2100 dtpoff_base (info)
2101      struct bfd_link_info *info;
2102 {
2103   /* If tls_sec is NULL, we should have signalled an error already.  */
2104   if (elf_hash_table (info)->tls_sec == NULL)
2105     return 0;
2106   return elf_hash_table (info)->tls_sec->vma;
2107 }
2108 
2109 /* Return the relocation value for @tpoff relocation
2110    if STT_TLS virtual address is ADDRESS.  */
2111 
2112 static bfd_vma
tpoff(info,address)2113 tpoff (info, address)
2114      struct bfd_link_info *info;
2115      bfd_vma address;
2116 {
2117   struct elf_link_hash_table *htab = elf_hash_table (info);
2118 
2119   /* If tls_sec is NULL, we should have signalled an error already.  */
2120   if (htab->tls_sec == NULL)
2121     return 0;
2122   return address - htab->tls_size - htab->tls_sec->vma;
2123 }
2124 
2125 /* Relocate a SPARC ELF section.  */
2126 
2127 static bfd_boolean
elf32_sparc_relocate_section(output_bfd,info,input_bfd,input_section,contents,relocs,local_syms,local_sections)2128 elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
2129 			      contents, relocs, local_syms, local_sections)
2130      bfd *output_bfd;
2131      struct bfd_link_info *info;
2132      bfd *input_bfd;
2133      asection *input_section;
2134      bfd_byte *contents;
2135      Elf_Internal_Rela *relocs;
2136      Elf_Internal_Sym *local_syms;
2137      asection **local_sections;
2138 {
2139   struct elf32_sparc_link_hash_table *htab;
2140   Elf_Internal_Shdr *symtab_hdr;
2141   struct elf_link_hash_entry **sym_hashes;
2142   bfd_vma *local_got_offsets;
2143   bfd_vma got_base;
2144   asection *sreloc;
2145   Elf_Internal_Rela *rel;
2146   Elf_Internal_Rela *relend;
2147 
2148   if (info->relocatable)
2149     return TRUE;
2150 
2151   htab = elf32_sparc_hash_table (info);
2152   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2153   sym_hashes = elf_sym_hashes (input_bfd);
2154   local_got_offsets = elf_local_got_offsets (input_bfd);
2155 
2156   if (elf_hash_table (info)->hgot == NULL)
2157     got_base = 0;
2158   else
2159     got_base = elf_hash_table (info)->hgot->root.u.def.value;
2160 
2161   sreloc = elf_section_data (input_section)->sreloc;
2162 
2163   rel = relocs;
2164   relend = relocs + input_section->reloc_count;
2165   for (; rel < relend; rel++)
2166     {
2167       int r_type, tls_type;
2168       reloc_howto_type *howto;
2169       unsigned long r_symndx;
2170       struct elf_link_hash_entry *h;
2171       Elf_Internal_Sym *sym;
2172       asection *sec;
2173       bfd_vma relocation, off;
2174       bfd_reloc_status_type r;
2175       bfd_boolean is_plt = FALSE;
2176       bfd_boolean unresolved_reloc;
2177 
2178       r_type = ELF32_R_TYPE (rel->r_info);
2179 
2180       if (r_type == R_SPARC_GNU_VTINHERIT
2181 	  || r_type == R_SPARC_GNU_VTENTRY)
2182 	continue;
2183 
2184       if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2185 	{
2186 	  bfd_set_error (bfd_error_bad_value);
2187 	  return FALSE;
2188 	}
2189       howto = _bfd_sparc_elf_howto_table + r_type;
2190 
2191       /* This is a final link.  */
2192       r_symndx = ELF32_R_SYM (rel->r_info);
2193       h = NULL;
2194       sym = NULL;
2195       sec = NULL;
2196       unresolved_reloc = FALSE;
2197       if (r_symndx < symtab_hdr->sh_info)
2198 	{
2199 	  sym = local_syms + r_symndx;
2200 	  sec = local_sections[r_symndx];
2201 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2202 	}
2203       else
2204 	{
2205 	  bfd_boolean warned ATTRIBUTE_UNUSED;
2206 
2207 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2208 				   r_symndx, symtab_hdr, sym_hashes,
2209 				   h, sec, relocation,
2210 				   unresolved_reloc, warned);
2211 	}
2212 
2213       switch (r_type)
2214 	{
2215 	case R_SPARC_GOT10:
2216 	case R_SPARC_GOT13:
2217 	case R_SPARC_GOT22:
2218 	  /* Relocation is to the entry for this symbol in the global
2219 	     offset table.  */
2220 	  if (htab->sgot == NULL)
2221 	    abort ();
2222 
2223 	  if (h != NULL)
2224 	    {
2225 	      bfd_boolean dyn;
2226 
2227 	      off = h->got.offset;
2228 	      BFD_ASSERT (off != (bfd_vma) -1);
2229 	      dyn = elf_hash_table (info)->dynamic_sections_created;
2230 
2231 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2232 		  || (info->shared
2233 		      && (info->symbolic
2234 			  || h->dynindx == -1
2235 			  || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2236 		      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
2237 		{
2238 		  /* This is actually a static link, or it is a
2239 		     -Bsymbolic link and the symbol is defined
2240 		     locally, or the symbol was forced to be local
2241 		     because of a version file.  We must initialize
2242 		     this entry in the global offset table.  Since the
2243 		     offset must always be a multiple of 4, we use the
2244 		     least significant bit to record whether we have
2245 		     initialized it already.
2246 
2247 		     When doing a dynamic link, we create a .rela.got
2248 		     relocation entry to initialize the value.  This
2249 		     is done in the finish_dynamic_symbol routine.  */
2250 		  if ((off & 1) != 0)
2251 		    off &= ~1;
2252 		  else
2253 		    {
2254 		      bfd_put_32 (output_bfd, relocation,
2255 				  htab->sgot->contents + off);
2256 		      h->got.offset |= 1;
2257 		    }
2258 		}
2259 	      else
2260 		unresolved_reloc = FALSE;
2261 	    }
2262 	  else
2263 	    {
2264 	      BFD_ASSERT (local_got_offsets != NULL
2265 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
2266 
2267 	      off = local_got_offsets[r_symndx];
2268 
2269 	      /* The offset must always be a multiple of 4.  We use
2270 		 the least significant bit to record whether we have
2271 		 already processed this entry.  */
2272 	      if ((off & 1) != 0)
2273 		off &= ~1;
2274 	      else
2275 		{
2276 
2277 		  if (info->shared)
2278 		    {
2279 		      asection *s;
2280 		      Elf_Internal_Rela outrel;
2281 		      bfd_byte *loc;
2282 
2283 		      /* We need to generate a R_SPARC_RELATIVE reloc
2284 			 for the dynamic linker.  */
2285 		      s = htab->srelgot;
2286 		      BFD_ASSERT (s != NULL);
2287 
2288 		      outrel.r_offset = (htab->sgot->output_section->vma
2289 					 + htab->sgot->output_offset
2290 					 + off);
2291 		      outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2292 		      outrel.r_addend = relocation;
2293 		      relocation = 0;
2294 		      loc = s->contents;
2295 		      loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
2296 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2297 		    }
2298 
2299 		  bfd_put_32 (output_bfd, relocation,
2300 			      htab->sgot->contents + off);
2301 		  local_got_offsets[r_symndx] |= 1;
2302 		}
2303 	    }
2304 	  relocation = htab->sgot->output_offset + off - got_base;
2305 	  break;
2306 
2307 	case R_SPARC_PLT32:
2308 	  if (h == NULL || h->plt.offset == (bfd_vma) -1)
2309 	    {
2310 	      r_type = R_SPARC_32;
2311 	      goto r_sparc_plt32;
2312 	    }
2313 	  /* Fall through.  */
2314 	case R_SPARC_WPLT30:
2315 	r_sparc_wplt30:
2316 	  /* Relocation is to the entry for this symbol in the
2317 	     procedure linkage table.  */
2318 
2319 	  /* The Solaris native assembler will generate a WPLT30 reloc
2320 	     for a local symbol if you assemble a call from one
2321 	     section to another when using -K pic.  We treat it as
2322 	     WDISP30.  */
2323 	  if (h == NULL)
2324 	    break;
2325 
2326 	  if (h->plt.offset == (bfd_vma) -1 || htab->splt == NULL)
2327 	    {
2328 	      /* We didn't make a PLT entry for this symbol.  This
2329 		 happens when statically linking PIC code, or when
2330 		 using -Bsymbolic.  */
2331 	      break;
2332 	    }
2333 
2334 	  relocation = (htab->splt->output_section->vma
2335 			+ htab->splt->output_offset
2336 			+ h->plt.offset);
2337 	  unresolved_reloc = FALSE;
2338 	  if (r_type == R_SPARC_PLT32)
2339 	    {
2340 	      r_type = R_SPARC_32;
2341 	      is_plt = TRUE;
2342 	      goto r_sparc_plt32;
2343 	    }
2344 	  break;
2345 
2346 	case R_SPARC_PC10:
2347 	case R_SPARC_PC22:
2348 	  if (h != NULL
2349 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2350 	    break;
2351 	  /* Fall through.  */
2352 	case R_SPARC_DISP8:
2353 	case R_SPARC_DISP16:
2354 	case R_SPARC_DISP32:
2355 	case R_SPARC_WDISP30:
2356 	case R_SPARC_WDISP22:
2357 	case R_SPARC_WDISP19:
2358 	case R_SPARC_WDISP16:
2359 	case R_SPARC_8:
2360 	case R_SPARC_16:
2361 	case R_SPARC_32:
2362 	case R_SPARC_HI22:
2363 	case R_SPARC_22:
2364 	case R_SPARC_13:
2365 	case R_SPARC_LO10:
2366 	case R_SPARC_UA16:
2367 	case R_SPARC_UA32:
2368 	r_sparc_plt32:
2369 	  /* r_symndx will be zero only for relocs against symbols
2370 	     from removed linkonce sections, or sections discarded by
2371 	     a linker script.  */
2372 	  if (r_symndx == 0
2373 	      || (input_section->flags & SEC_ALLOC) == 0)
2374 	    break;
2375 
2376 	  if ((info->shared
2377 	       && (! howto->pc_relative
2378 		   || (h != NULL
2379 		       && h->dynindx != -1
2380 		       && (! info->symbolic
2381 			   || (h->elf_link_hash_flags
2382 			       & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2383 	      || (!info->shared
2384 		  && h != NULL
2385 		  && h->dynindx != -1
2386 		  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2387 		  && (((h->elf_link_hash_flags
2388 			& ELF_LINK_HASH_DEF_DYNAMIC) != 0
2389 		       && (h->elf_link_hash_flags
2390 			   & ELF_LINK_HASH_DEF_REGULAR) == 0)
2391 		      || h->root.type == bfd_link_hash_undefweak
2392 		      || h->root.type == bfd_link_hash_undefined)))
2393 	    {
2394 	      Elf_Internal_Rela outrel;
2395 	      bfd_byte *loc;
2396 	      bfd_boolean skip, relocate = FALSE;
2397 
2398 	      /* When generating a shared object, these relocations
2399 		 are copied into the output file to be resolved at run
2400 		 time.  */
2401 
2402 	      BFD_ASSERT (sreloc != NULL);
2403 
2404 	      skip = FALSE;
2405 
2406 	      outrel.r_offset =
2407 		_bfd_elf_section_offset (output_bfd, info, input_section,
2408 					 rel->r_offset);
2409 	      if (outrel.r_offset == (bfd_vma) -1)
2410 		skip = TRUE;
2411 	      else if (outrel.r_offset == (bfd_vma) -2)
2412 		skip = TRUE, relocate = TRUE;
2413 	      outrel.r_offset += (input_section->output_section->vma
2414 				  + input_section->output_offset);
2415 
2416 	      /* Optimize unaligned reloc usage now that we know where
2417 		 it finally resides.  */
2418 	      switch (r_type)
2419 		{
2420 		case R_SPARC_16:
2421 		  if (outrel.r_offset & 1)
2422 		    r_type = R_SPARC_UA16;
2423 		  break;
2424 		case R_SPARC_UA16:
2425 		  if (!(outrel.r_offset & 1))
2426 		    r_type = R_SPARC_16;
2427 		  break;
2428 		case R_SPARC_32:
2429 		  if (outrel.r_offset & 3)
2430 		    r_type = R_SPARC_UA32;
2431 		  break;
2432 		case R_SPARC_UA32:
2433 		  if (!(outrel.r_offset & 3))
2434 		    r_type = R_SPARC_32;
2435 		  break;
2436 	  	case R_SPARC_DISP8:
2437 		case R_SPARC_DISP16:
2438 	  	case R_SPARC_DISP32:
2439 		  /* If the symbol is not dynamic, we should not keep
2440 		     a dynamic relocation.  But an .rela.* slot has been
2441 		     allocated for it, output R_SPARC_NONE.
2442 		     FIXME: Add code tracking needed dynamic relocs as
2443 		     e.g. i386 has.  */
2444 		  if (h->dynindx == -1)
2445 		    skip = TRUE, relocate = TRUE;
2446 		  break;
2447 		}
2448 
2449 	      if (skip)
2450 		memset (&outrel, 0, sizeof outrel);
2451 	      /* h->dynindx may be -1 if the symbol was marked to
2452 		 become local.  */
2453 	      else if (h != NULL && ! is_plt
2454 		       && ((! info->symbolic && h->dynindx != -1)
2455 			   || (h->elf_link_hash_flags
2456 			       & ELF_LINK_HASH_DEF_REGULAR) == 0))
2457 		{
2458 		  BFD_ASSERT (h->dynindx != -1);
2459 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2460 		  outrel.r_addend = rel->r_addend;
2461 		}
2462 	      else
2463 		{
2464 		  if (r_type == R_SPARC_32)
2465 		    {
2466 		      outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2467 		      outrel.r_addend = relocation + rel->r_addend;
2468 		    }
2469 		  else
2470 		    {
2471 		      long indx;
2472 
2473 		      if (is_plt)
2474 			sec = htab->splt;
2475 
2476 		      if (bfd_is_abs_section (sec))
2477 			indx = 0;
2478 		      else if (sec == NULL || sec->owner == NULL)
2479 			{
2480 			  bfd_set_error (bfd_error_bad_value);
2481 			  return FALSE;
2482 			}
2483 		      else
2484 			{
2485 			  asection *osec;
2486 
2487 			  osec = sec->output_section;
2488 			  indx = elf_section_data (osec)->dynindx;
2489 
2490 			  /* FIXME: we really should be able to link non-pic
2491 			     shared libraries.  */
2492 			  if (indx == 0)
2493 			    {
2494 			      BFD_FAIL ();
2495 			      (*_bfd_error_handler)
2496 				(_("%s: probably compiled without -fPIC?"),
2497 				 bfd_archive_filename (input_bfd));
2498 			      bfd_set_error (bfd_error_bad_value);
2499 			      return FALSE;
2500 			    }
2501 			}
2502 
2503 		      outrel.r_info = ELF32_R_INFO (indx, r_type);
2504 		      outrel.r_addend = relocation + rel->r_addend;
2505 		    }
2506 		}
2507 
2508 	      loc = sreloc->contents;
2509 	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2510 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2511 
2512 	      /* This reloc will be computed at runtime, so there's no
2513 		 need to do anything now.  */
2514 	      if (! relocate)
2515 		continue;
2516 	    }
2517 	  break;
2518 
2519 	case R_SPARC_TLS_GD_HI22:
2520 	  if (! elf32_sparc_tdata (input_bfd)->has_tlsgd)
2521 	    {
2522 	      /* R_SPARC_REV32 used the same reloc number as
2523 		 R_SPARC_TLS_GD_HI22.  */
2524 	      r_type = R_SPARC_REV32;
2525 	      break;
2526 	    }
2527 	  /* Fall through */
2528 
2529 	case R_SPARC_TLS_GD_LO10:
2530 	case R_SPARC_TLS_IE_HI22:
2531 	case R_SPARC_TLS_IE_LO10:
2532 	  r_type = elf32_sparc_tls_transition (info, input_bfd, r_type,
2533 					       h == NULL);
2534 	  tls_type = GOT_UNKNOWN;
2535 	  if (h == NULL && local_got_offsets)
2536 	    tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2537 	  else if (h != NULL)
2538 	    {
2539 	      tls_type = elf32_sparc_hash_entry(h)->tls_type;
2540 	      if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2541 		switch (ELF32_R_TYPE (rel->r_info))
2542 		  {
2543 		  case R_SPARC_TLS_GD_HI22:
2544 		  case R_SPARC_TLS_IE_HI22:
2545 		    r_type = R_SPARC_TLS_LE_HIX22;
2546 		    break;
2547 		  default:
2548 		    r_type = R_SPARC_TLS_LE_LOX10;
2549 		    break;
2550 		  }
2551 	    }
2552 	  if (tls_type == GOT_TLS_IE)
2553 	    switch (r_type)
2554 	      {
2555 	      case R_SPARC_TLS_GD_HI22:
2556 		r_type = R_SPARC_TLS_IE_HI22;
2557 		break;
2558 	      case R_SPARC_TLS_GD_LO10:
2559 		r_type = R_SPARC_TLS_IE_LO10;
2560 		break;
2561 	      }
2562 
2563 	  if (r_type == R_SPARC_TLS_LE_HIX22)
2564 	    {
2565 	      relocation = tpoff (info, relocation);
2566 	      break;
2567 	    }
2568 	  if (r_type == R_SPARC_TLS_LE_LOX10)
2569 	    {
2570 	      /* Change add into xor.  */
2571 	      relocation = tpoff (info, relocation);
2572 	      bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
2573 						   contents + rel->r_offset)
2574 				       | 0x80182000), contents + rel->r_offset);
2575 	      break;
2576 	    }
2577 
2578 	  if (h != NULL)
2579 	    {
2580 	      off = h->got.offset;
2581 	      h->got.offset |= 1;
2582 	    }
2583 	  else
2584 	    {
2585 	      BFD_ASSERT (local_got_offsets != NULL);
2586 	      off = local_got_offsets[r_symndx];
2587 	      local_got_offsets[r_symndx] |= 1;
2588 	    }
2589 
2590 	r_sparc_tlsldm:
2591 	  if (htab->sgot == NULL)
2592 	    abort ();
2593 
2594 	  if ((off & 1) != 0)
2595 	    off &= ~1;
2596 	  else
2597 	    {
2598 	      Elf_Internal_Rela outrel;
2599 	      Elf32_External_Rela *loc;
2600 	      int dr_type, indx;
2601 
2602 	      if (htab->srelgot == NULL)
2603 		abort ();
2604 
2605 	      bfd_put_32 (output_bfd, 0, htab->sgot->contents + off);
2606 	      outrel.r_offset = (htab->sgot->output_section->vma
2607 				 + htab->sgot->output_offset + off);
2608 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
2609 	      if (r_type == R_SPARC_TLS_IE_HI22
2610 		|| r_type == R_SPARC_TLS_IE_LO10)
2611 		dr_type = R_SPARC_TLS_TPOFF32;
2612 	      else
2613 		dr_type = R_SPARC_TLS_DTPMOD32;
2614 	      if (dr_type == R_SPARC_TLS_TPOFF32 && indx == 0)
2615 		outrel.r_addend = relocation - dtpoff_base (info);
2616 	      else
2617 		outrel.r_addend = 0;
2618 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
2619 	      loc = (Elf32_External_Rela *) htab->srelgot->contents;
2620 	      loc += htab->srelgot->reloc_count++;
2621 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2622 					 (bfd_byte *) loc);
2623 
2624 	      if (r_type == R_SPARC_TLS_GD_HI22
2625 		  || r_type == R_SPARC_TLS_GD_LO10)
2626 		{
2627 		  if (indx == 0)
2628 		    {
2629 	    	      BFD_ASSERT (! unresolved_reloc);
2630 		      bfd_put_32 (output_bfd,
2631 				  relocation - dtpoff_base (info),
2632 				  htab->sgot->contents + off + 4);
2633 		    }
2634 		  else
2635 		    {
2636 		      bfd_put_32 (output_bfd, 0,
2637 				  htab->sgot->contents + off + 4);
2638 		      outrel.r_info = ELF32_R_INFO (indx,
2639 						    R_SPARC_TLS_DTPOFF32);
2640 		      outrel.r_offset += 4;
2641 		      htab->srelgot->reloc_count++;
2642 		      loc++;
2643 		      bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2644 						 (bfd_byte *) loc);
2645 		    }
2646 		}
2647 	      else if (dr_type == R_SPARC_TLS_DTPMOD32)
2648 		{
2649 		  bfd_put_32 (output_bfd, 0,
2650 			      htab->sgot->contents + off + 4);
2651 		}
2652 	    }
2653 
2654 	  if (off >= (bfd_vma) -2)
2655 	    abort ();
2656 
2657 	  relocation = htab->sgot->output_offset + off - got_base;
2658 	  unresolved_reloc = FALSE;
2659 	  howto = _bfd_sparc_elf_howto_table + r_type;
2660 	  break;
2661 
2662 	case R_SPARC_TLS_LDM_HI22:
2663 	case R_SPARC_TLS_LDM_LO10:
2664 	  if (! info->shared)
2665 	    {
2666 	      bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2667 	      continue;
2668 	    }
2669 	  off = htab->tls_ldm_got.offset;
2670 	  htab->tls_ldm_got.offset |= 1;
2671 	  goto r_sparc_tlsldm;
2672 
2673 	case R_SPARC_TLS_LDO_HIX22:
2674 	case R_SPARC_TLS_LDO_LOX10:
2675 	  if (info->shared)
2676 	    relocation -= dtpoff_base (info);
2677 	  else
2678 	    relocation = tpoff (info, relocation);
2679 	  break;
2680 
2681 	case R_SPARC_TLS_LE_HIX22:
2682 	case R_SPARC_TLS_LE_LOX10:
2683 	  if (info->shared)
2684 	    {
2685 	      Elf_Internal_Rela outrel;
2686 	      bfd_boolean skip, relocate = FALSE;
2687 
2688 	      BFD_ASSERT (sreloc != NULL);
2689 	      skip = FALSE;
2690 	      outrel.r_offset =
2691 		_bfd_elf_section_offset (output_bfd, info, input_section,
2692 					 rel->r_offset);
2693 	      if (outrel.r_offset == (bfd_vma) -1)
2694 		skip = TRUE;
2695 	      else if (outrel.r_offset == (bfd_vma) -2)
2696 		skip = TRUE, relocate = TRUE;
2697 	      outrel.r_offset += (input_section->output_section->vma
2698 				  + input_section->output_offset);
2699 	      if (skip)
2700 		memset (&outrel, 0, sizeof outrel);
2701 	      else
2702 		{
2703 		  outrel.r_info = ELF32_R_INFO (0, r_type);
2704 		  outrel.r_addend = relocation - dtpoff_base (info)
2705 				    + rel->r_addend;
2706 		}
2707 
2708 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2709 					 (bfd_byte *) (((Elf32_External_Rela *)
2710 							sreloc->contents)
2711 						       + sreloc->reloc_count));
2712 	      ++sreloc->reloc_count;
2713 	      continue;
2714 	    }
2715 	  relocation = tpoff (info, relocation);
2716 	  break;
2717 
2718 	case R_SPARC_TLS_LDM_CALL:
2719 	  if (! info->shared)
2720 	    {
2721 	      /* mov %g0, %o0 */
2722 	      bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
2723 	      continue;
2724 	    }
2725 	  /* Fall through */
2726 
2727 	case R_SPARC_TLS_GD_CALL:
2728 	  tls_type = GOT_UNKNOWN;
2729 	  if (h == NULL && local_got_offsets)
2730 	    tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2731 	  else if (h != NULL)
2732 	    tls_type = elf32_sparc_hash_entry(h)->tls_type;
2733 	  if (! info->shared
2734 	      || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
2735 	    {
2736 	      bfd_vma insn;
2737 
2738 	      if (!info->shared && (h == NULL || h->dynindx == -1))
2739 		{
2740 		  /* GD -> LE */
2741 		  bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2742 		  continue;
2743 		}
2744 
2745 	      /* GD -> IE */
2746 	      if (rel + 1 < relend
2747 		  && ELF32_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
2748 		  && rel[1].r_offset == rel->r_offset + 4
2749 		  && ELF32_R_SYM (rel[1].r_info) == r_symndx
2750 		  && (((insn = bfd_get_32 (input_bfd,
2751 					   contents + rel[1].r_offset))
2752 		       >> 25) & 0x1f) == 8)
2753 		{
2754 		  /* We have
2755 		     call __tls_get_addr, %tgd_call(foo)
2756 		      add %reg1, %reg2, %o0, %tgd_add(foo)
2757 		     and change it into IE:
2758 		     ld [%reg1 + %reg2], %o0, %tie_ld(foo)
2759 		     add %g7, %o0, %o0, %tie_add(foo).
2760 		     add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
2761 		     ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2.  */
2762 		  bfd_put_32 (output_bfd, insn | 0xc0000000,
2763 			      contents + rel->r_offset);
2764 		  bfd_put_32 (output_bfd, 0x9001c008,
2765 			      contents + rel->r_offset + 4);
2766 		  rel++;
2767 		  continue;
2768 		}
2769 
2770 	      bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
2771 	      continue;
2772 	    }
2773 
2774 	  h = (struct elf_link_hash_entry *)
2775 	      bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
2776 				    FALSE, TRUE);
2777 	  BFD_ASSERT (h != NULL);
2778 	  r_type = R_SPARC_WPLT30;
2779 	  howto = _bfd_sparc_elf_howto_table + r_type;
2780 	  goto r_sparc_wplt30;
2781 
2782 	case R_SPARC_TLS_GD_ADD:
2783 	  tls_type = GOT_UNKNOWN;
2784 	  if (h == NULL && local_got_offsets)
2785 	    tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2786 	  else if (h != NULL)
2787 	    tls_type = elf32_sparc_hash_entry(h)->tls_type;
2788 	  if (! info->shared || tls_type == GOT_TLS_IE)
2789 	    {
2790 	      /* add %reg1, %reg2, %reg3, %tgd_add(foo)
2791 		 changed into IE:
2792 		 ld [%reg1 + %reg2], %reg3, %tie_ld(foo)
2793 		 or LE:
2794 		 add %g7, %reg2, %reg3.  */
2795 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2796 	      if ((h != NULL && h->dynindx != -1) || info->shared)
2797 		relocation = insn | 0xc0000000;
2798 	      else
2799 		relocation = (insn & ~0x7c000) | 0x1c000;
2800 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2801 	    }
2802 	  continue;
2803 
2804 	case R_SPARC_TLS_LDM_ADD:
2805 	  if (! info->shared)
2806 	    bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2807 	  continue;
2808 
2809 	case R_SPARC_TLS_LDO_ADD:
2810 	  if (! info->shared)
2811 	    {
2812 	      /* Change rs1 into %g7.  */
2813 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2814 	      insn = (insn & ~0x7c000) | 0x1c000;
2815 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
2816 	    }
2817 	  continue;
2818 
2819 	case R_SPARC_TLS_IE_LD:
2820 	case R_SPARC_TLS_IE_LDX:
2821 	  if (! info->shared && (h == NULL || h->dynindx == -1))
2822 	    {
2823 	      bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2824 	      int rs2 = insn & 0x1f;
2825 	      int rd = (insn >> 25) & 0x1f;
2826 
2827 	      if (rs2 == rd)
2828 		relocation = SPARC_NOP;
2829 	      else
2830 		relocation = 0x80100000 | (insn & 0x3e00001f);
2831 	      bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2832 	    }
2833 	  continue;
2834 
2835 	case R_SPARC_TLS_IE_ADD:
2836 	  /* Totally useless relocation.  */
2837 	  continue;
2838 
2839 	case R_SPARC_TLS_DTPOFF32:
2840 	  relocation -= dtpoff_base (info);
2841 	  break;
2842 
2843 	default:
2844 	  break;
2845 	}
2846 
2847       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2848 	 because such sections are not SEC_ALLOC and thus ld.so will
2849 	 not process them.  */
2850       if (unresolved_reloc
2851 	  && !((input_section->flags & SEC_DEBUGGING) != 0
2852 	       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2853 	(*_bfd_error_handler)
2854 	  (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2855 	   bfd_archive_filename (input_bfd),
2856 	   bfd_get_section_name (input_bfd, input_section),
2857 	   (long) rel->r_offset,
2858 	   h->root.root.string);
2859 
2860       r = bfd_reloc_continue;
2861       if (r_type == R_SPARC_WDISP16)
2862 	{
2863 	  bfd_vma x;
2864 
2865 	  relocation += rel->r_addend;
2866 	  relocation -= (input_section->output_section->vma
2867 			 + input_section->output_offset);
2868 	  relocation -= rel->r_offset;
2869 
2870 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2871 	  x |= ((((relocation >> 2) & 0xc000) << 6)
2872 		| ((relocation >> 2) & 0x3fff));
2873 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2874 
2875 	  if ((bfd_signed_vma) relocation < - 0x40000
2876 	      || (bfd_signed_vma) relocation > 0x3ffff)
2877 	    r = bfd_reloc_overflow;
2878 	  else
2879 	    r = bfd_reloc_ok;
2880 	}
2881       else if (r_type == R_SPARC_REV32)
2882 	{
2883 	  bfd_vma x;
2884 
2885 	  relocation = relocation + rel->r_addend;
2886 
2887 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2888 	  x = x + relocation;
2889 	  bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
2890 	  r = bfd_reloc_ok;
2891 	}
2892       else if (r_type == R_SPARC_TLS_LDO_HIX22
2893 	       || r_type == R_SPARC_TLS_LE_HIX22)
2894 	{
2895 	  bfd_vma x;
2896 
2897 	  relocation += rel->r_addend;
2898 	  relocation = relocation ^ 0xffffffff;
2899 
2900 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2901 	  x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
2902 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2903 	  r = bfd_reloc_ok;
2904 	}
2905       else if (r_type == R_SPARC_TLS_LDO_LOX10
2906 	       || r_type == R_SPARC_TLS_LE_LOX10)
2907 	{
2908 	  bfd_vma x;
2909 
2910 	  relocation += rel->r_addend;
2911 	  relocation = (relocation & 0x3ff) | 0x1c00;
2912 
2913 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2914 	  x = (x & ~(bfd_vma) 0x1fff) | relocation;
2915 	  bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2916 
2917 	  r = bfd_reloc_ok;
2918 	}
2919       else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
2920 	       && sec_do_relax (input_section)
2921 	       && rel->r_offset + 4 < input_section->_raw_size)
2922 	{
2923 #define G0		0
2924 #define O7		15
2925 #define XCC		(2 << 20)
2926 #define COND(x)		(((x)&0xf)<<25)
2927 #define CONDA		COND(0x8)
2928 #define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
2929 #define INSN_BA		(F2(0,2) | CONDA)
2930 #define INSN_OR		F3(2, 0x2, 0)
2931 #define INSN_NOP	F2(0,4)
2932 
2933 	  bfd_vma x, y;
2934 
2935 	  /* If the instruction is a call with either:
2936 	     restore
2937 	     arithmetic instruction with rd == %o7
2938 	     where rs1 != %o7 and rs2 if it is register != %o7
2939 	     then we can optimize if the call destination is near
2940 	     by changing the call into a branch always.  */
2941 	  x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2942 	  y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
2943 	  if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
2944 	    {
2945 	      if (((y & OP3(~0)) == OP3(0x3d) /* restore */
2946 		   || ((y & OP3(0x28)) == 0 /* arithmetic */
2947 		       && (y & RD(~0)) == RD(O7)))
2948 		  && (y & RS1(~0)) != RS1(O7)
2949 		  && ((y & F3I(~0))
2950 		      || (y & RS2(~0)) != RS2(O7)))
2951 		{
2952 		  bfd_vma reloc;
2953 
2954 		  reloc = relocation + rel->r_addend - rel->r_offset;
2955 		  reloc -= (input_section->output_section->vma
2956 			   + input_section->output_offset);
2957 
2958 		  /* Ensure the reloc fits into simm22.  */
2959 		  if ((reloc & 3) == 0
2960 		      && ((reloc & ~(bfd_vma)0x7fffff) == 0
2961 			  || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
2962 		    {
2963 		      reloc >>= 2;
2964 
2965 		      /* Check whether it fits into simm19 on v9.  */
2966 		      if (((reloc & 0x3c0000) == 0
2967 			   || (reloc & 0x3c0000) == 0x3c0000)
2968 			  && (elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
2969 			x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
2970 		      else
2971 			x = INSN_BA | (reloc & 0x3fffff); /* ba */
2972 		      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2973 		      r = bfd_reloc_ok;
2974 		      if (rel->r_offset >= 4
2975 			  && (y & (0xffffffff ^ RS1(~0)))
2976 			      == (INSN_OR | RD(O7) | RS2(G0)))
2977 			{
2978 			  bfd_vma z;
2979 			  unsigned int reg;
2980 
2981 			  z = bfd_get_32 (input_bfd,
2982 					  contents + rel->r_offset - 4);
2983 			  if ((z & (0xffffffff ^ RD(~0)))
2984 			      != (INSN_OR | RS1(O7) | RS2(G0)))
2985 			    break;
2986 
2987 			  /* The sequence was
2988 			     or %o7, %g0, %rN
2989 			     call foo
2990 			     or %rN, %g0, %o7
2991 
2992 			     If call foo was replaced with ba, replace
2993 			     or %rN, %g0, %o7 with nop.  */
2994 
2995 			  reg = (y & RS1(~0)) >> 14;
2996 			  if (reg != ((z & RD(~0)) >> 25)
2997 			      || reg == G0 || reg == O7)
2998 			    break;
2999 
3000 			  bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
3001 				      contents + rel->r_offset + 4);
3002 			}
3003 
3004 		    }
3005 		}
3006 	    }
3007 	}
3008 
3009       if (r == bfd_reloc_continue)
3010 	r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3011 				      contents, rel->r_offset,
3012 				      relocation, rel->r_addend);
3013 
3014       if (r != bfd_reloc_ok)
3015 	{
3016 	  switch (r)
3017 	    {
3018 	    default:
3019 	    case bfd_reloc_outofrange:
3020 	      abort ();
3021 	    case bfd_reloc_overflow:
3022 	      {
3023 		const char *name;
3024 
3025 		if (h != NULL)
3026 		  name = h->root.root.string;
3027 		else
3028 		  {
3029 		    name = bfd_elf_string_from_elf_section (input_bfd,
3030 							    symtab_hdr->sh_link,
3031 							    sym->st_name);
3032 		    if (name == NULL)
3033 		      return FALSE;
3034 		    if (*name == '\0')
3035 		      name = bfd_section_name (input_bfd, sec);
3036 		  }
3037 		if (! ((*info->callbacks->reloc_overflow)
3038 		       (info, name, howto->name, (bfd_vma) 0,
3039 			input_bfd, input_section, rel->r_offset)))
3040 		  return FALSE;
3041 	      }
3042 	      break;
3043 	    }
3044 	}
3045     }
3046 
3047   return TRUE;
3048 }
3049 
3050 /* Finish up dynamic symbol handling.  We set the contents of various
3051    dynamic sections here.  */
3052 
3053 static bfd_boolean
elf32_sparc_finish_dynamic_symbol(output_bfd,info,h,sym)3054 elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
3055      bfd *output_bfd;
3056      struct bfd_link_info *info;
3057      struct elf_link_hash_entry *h;
3058      Elf_Internal_Sym *sym;
3059 {
3060   bfd *dynobj;
3061   struct elf32_sparc_link_hash_table *htab;
3062 
3063   htab = elf32_sparc_hash_table (info);
3064   dynobj = htab->elf.dynobj;
3065 
3066   if (h->plt.offset != (bfd_vma) -1)
3067     {
3068       asection *splt;
3069       asection *srela;
3070       Elf_Internal_Rela rela;
3071       bfd_byte *loc;
3072 
3073       /* This symbol has an entry in the procedure linkage table.  Set
3074 	 it up.  */
3075 
3076       BFD_ASSERT (h->dynindx != -1);
3077 
3078       splt = htab->splt;
3079       srela = htab->srelplt;
3080       BFD_ASSERT (splt != NULL && srela != NULL);
3081 
3082       /* Fill in the entry in the procedure linkage table.  */
3083       bfd_put_32 (output_bfd,
3084 		  PLT_ENTRY_WORD0 + h->plt.offset,
3085 		  splt->contents + h->plt.offset);
3086       bfd_put_32 (output_bfd,
3087 		  (PLT_ENTRY_WORD1
3088 		   + (((- (h->plt.offset + 4)) >> 2) & 0x3fffff)),
3089 		  splt->contents + h->plt.offset + 4);
3090       bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
3091 		  splt->contents + h->plt.offset + 8);
3092 
3093       /* Fill in the entry in the .rela.plt section.  */
3094       rela.r_offset = (splt->output_section->vma
3095 		       + splt->output_offset
3096 		       + h->plt.offset);
3097       rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
3098       rela.r_addend = 0;
3099       loc = srela->contents;
3100       loc += (h->plt.offset / PLT_ENTRY_SIZE - 4) * sizeof (Elf32_External_Rela);
3101       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3102 
3103       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3104 	{
3105 	  /* Mark the symbol as undefined, rather than as defined in
3106 	     the .plt section.  Leave the value alone.  */
3107 	  sym->st_shndx = SHN_UNDEF;
3108 	  /* If the symbol is weak, we do need to clear the value.
3109 	     Otherwise, the PLT entry would provide a definition for
3110 	     the symbol even if the symbol wasn't defined anywhere,
3111 	     and so the symbol would never be NULL.  */
3112 	  if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
3113 	      == 0)
3114 	    sym->st_value = 0;
3115 	}
3116     }
3117 
3118   if (h->got.offset != (bfd_vma) -1
3119       && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_GD
3120       && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_IE)
3121     {
3122       asection *sgot;
3123       asection *srela;
3124       Elf_Internal_Rela rela;
3125       bfd_byte *loc;
3126 
3127       /* This symbol has an entry in the global offset table.  Set it
3128 	 up.  */
3129 
3130       sgot = htab->sgot;
3131       srela = htab->srelgot;
3132       BFD_ASSERT (sgot != NULL && srela != NULL);
3133 
3134       rela.r_offset = (sgot->output_section->vma
3135 		       + sgot->output_offset
3136 		       + (h->got.offset &~ (bfd_vma) 1));
3137 
3138       /* If this is a -Bsymbolic link, and the symbol is defined
3139 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
3140 	 the symbol was forced to be local because of a version file.
3141 	 The entry in the global offset table will already have been
3142 	 initialized in the relocate_section function.  */
3143       if (info->shared
3144 	  && (info->symbolic || h->dynindx == -1)
3145 	  && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3146 	{
3147 	  asection *sec = h->root.u.def.section;
3148 	  rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
3149 	  rela.r_addend = (h->root.u.def.value
3150 			   + sec->output_section->vma
3151 			   + sec->output_offset);
3152 	}
3153       else
3154 	{
3155 	  rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
3156 	  rela.r_addend = 0;
3157 	}
3158 
3159       bfd_put_32 (output_bfd, (bfd_vma) 0,
3160 		  sgot->contents + (h->got.offset &~ (bfd_vma) 1));
3161       loc = srela->contents;
3162       loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
3163       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3164     }
3165 
3166   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3167     {
3168       asection *s;
3169       Elf_Internal_Rela rela;
3170       bfd_byte *loc;
3171 
3172       /* This symbols needs a copy reloc.  Set it up.  */
3173 
3174       BFD_ASSERT (h->dynindx != -1);
3175 
3176       s = bfd_get_section_by_name (h->root.u.def.section->owner,
3177 				   ".rela.bss");
3178       BFD_ASSERT (s != NULL);
3179 
3180       rela.r_offset = (h->root.u.def.value
3181 		       + h->root.u.def.section->output_section->vma
3182 		       + h->root.u.def.section->output_offset);
3183       rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY);
3184       rela.r_addend = 0;
3185       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3186       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3187     }
3188 
3189   /* Mark some specially defined symbols as absolute.  */
3190   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3191       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3192       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3193     sym->st_shndx = SHN_ABS;
3194 
3195   return TRUE;
3196 }
3197 
3198 /* Finish up the dynamic sections.  */
3199 
3200 static bfd_boolean
elf32_sparc_finish_dynamic_sections(output_bfd,info)3201 elf32_sparc_finish_dynamic_sections (output_bfd, info)
3202      bfd *output_bfd;
3203      struct bfd_link_info *info;
3204 {
3205   bfd *dynobj;
3206   asection *sdyn;
3207   struct elf32_sparc_link_hash_table *htab;
3208 
3209   htab = elf32_sparc_hash_table (info);
3210   dynobj = htab->elf.dynobj;
3211 
3212   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3213 
3214   if (elf_hash_table (info)->dynamic_sections_created)
3215     {
3216       asection *splt;
3217       Elf32_External_Dyn *dyncon, *dynconend;
3218 
3219       splt = bfd_get_section_by_name (dynobj, ".plt");
3220       BFD_ASSERT (splt != NULL && sdyn != NULL);
3221 
3222       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3223       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3224       for (; dyncon < dynconend; dyncon++)
3225 	{
3226 	  Elf_Internal_Dyn dyn;
3227 	  const char *name;
3228 	  bfd_boolean size;
3229 
3230 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3231 
3232 	  switch (dyn.d_tag)
3233 	    {
3234 	    case DT_PLTGOT:   name = ".plt"; size = FALSE; break;
3235 	    case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
3236 	    case DT_JMPREL:   name = ".rela.plt"; size = FALSE; break;
3237 	    default:	  name = NULL; size = FALSE; break;
3238 	    }
3239 
3240 	  if (name != NULL)
3241 	    {
3242 	      asection *s;
3243 
3244 	      s = bfd_get_section_by_name (output_bfd, name);
3245 	      if (s == NULL)
3246 		dyn.d_un.d_val = 0;
3247 	      else
3248 		{
3249 		  if (! size)
3250 		    dyn.d_un.d_ptr = s->vma;
3251 		  else
3252 		    {
3253 		      if (s->_cooked_size != 0)
3254 			dyn.d_un.d_val = s->_cooked_size;
3255 		      else
3256 			dyn.d_un.d_val = s->_raw_size;
3257 		    }
3258 		}
3259 	      bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3260 	    }
3261 	}
3262 
3263       /* Clear the first four entries in the procedure linkage table,
3264 	 and put a nop in the last four bytes.  */
3265       if (splt->_raw_size > 0)
3266 	{
3267 	  memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE);
3268 	  bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
3269 		      splt->contents + splt->_raw_size - 4);
3270 	}
3271 
3272       elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
3273     }
3274 
3275   /* Set the first entry in the global offset table to the address of
3276      the dynamic section.  */
3277   if (htab->sgot && htab->sgot->_raw_size > 0)
3278     {
3279       if (sdyn == NULL)
3280 	bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgot->contents);
3281       else
3282 	bfd_put_32 (output_bfd,
3283 		    sdyn->output_section->vma + sdyn->output_offset,
3284 		    htab->sgot->contents);
3285     }
3286 
3287   if (htab->sgot)
3288     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3289 
3290   return TRUE;
3291 }
3292 
3293 /* Functions for dealing with the e_flags field.
3294 
3295    We don't define set_private_flags or copy_private_bfd_data because
3296    the only currently defined values are based on the bfd mach number,
3297    so we use the latter instead and defer setting e_flags until the
3298    file is written out.  */
3299 
3300 /* Merge backend specific data from an object file to the output
3301    object file when linking.  */
3302 
3303 static bfd_boolean
elf32_sparc_merge_private_bfd_data(ibfd,obfd)3304 elf32_sparc_merge_private_bfd_data (ibfd, obfd)
3305      bfd *ibfd;
3306      bfd *obfd;
3307 {
3308   bfd_boolean error;
3309   /* FIXME: This should not be static.  */
3310   static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
3311 
3312   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3313       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3314     return TRUE;
3315 
3316   error = FALSE;
3317 
3318   if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
3319     {
3320       error = TRUE;
3321       (*_bfd_error_handler)
3322 	(_("%s: compiled for a 64 bit system and target is 32 bit"),
3323 	 bfd_archive_filename (ibfd));
3324     }
3325   else if ((ibfd->flags & DYNAMIC) == 0)
3326     {
3327       if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
3328 	bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
3329     }
3330 
3331   if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
3332        != previous_ibfd_e_flags)
3333       && previous_ibfd_e_flags != (unsigned long) -1)
3334     {
3335       (*_bfd_error_handler)
3336 	(_("%s: linking little endian files with big endian files"),
3337 	 bfd_archive_filename (ibfd));
3338       error = TRUE;
3339     }
3340   previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
3341 
3342   if (error)
3343     {
3344       bfd_set_error (bfd_error_bad_value);
3345       return FALSE;
3346     }
3347 
3348   return TRUE;
3349 }
3350 
3351 /* Set the right machine number.  */
3352 
3353 static bfd_boolean
elf32_sparc_object_p(abfd)3354 elf32_sparc_object_p (abfd)
3355      bfd *abfd;
3356 {
3357   if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
3358     {
3359       if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3360 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3361 					  bfd_mach_sparc_v8plusb);
3362       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3363 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3364 					  bfd_mach_sparc_v8plusa);
3365       else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
3366 	return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3367 					  bfd_mach_sparc_v8plus);
3368       else
3369 	return FALSE;
3370     }
3371   else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
3372     return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3373 				      bfd_mach_sparc_sparclite_le);
3374   else
3375     return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
3376 }
3377 
3378 /* The final processing done just before writing out the object file.
3379    We need to set the e_machine field appropriately.  */
3380 
3381 static void
elf32_sparc_final_write_processing(abfd,linker)3382 elf32_sparc_final_write_processing (abfd, linker)
3383      bfd *abfd;
3384      bfd_boolean linker ATTRIBUTE_UNUSED;
3385 {
3386   switch (bfd_get_mach (abfd))
3387     {
3388     case bfd_mach_sparc :
3389       break; /* nothing to do */
3390     case bfd_mach_sparc_v8plus :
3391       elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3392       elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3393       elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
3394       break;
3395     case bfd_mach_sparc_v8plusa :
3396       elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3397       elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3398       elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
3399       break;
3400     case bfd_mach_sparc_v8plusb :
3401       elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3402       elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3403       elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1
3404 				       | EF_SPARC_SUN_US3;
3405       break;
3406     case bfd_mach_sparc_sparclite_le :
3407       elf_elfheader (abfd)->e_machine = EM_SPARC;
3408       elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
3409       break;
3410     default :
3411       abort ();
3412       break;
3413     }
3414 }
3415 
3416 static enum elf_reloc_type_class
elf32_sparc_reloc_type_class(rela)3417 elf32_sparc_reloc_type_class (rela)
3418      const Elf_Internal_Rela *rela;
3419 {
3420   switch ((int) ELF32_R_TYPE (rela->r_info))
3421     {
3422     case R_SPARC_RELATIVE:
3423       return reloc_class_relative;
3424     case R_SPARC_JMP_SLOT:
3425       return reloc_class_plt;
3426     case R_SPARC_COPY:
3427       return reloc_class_copy;
3428     default:
3429       return reloc_class_normal;
3430     }
3431 }
3432 
3433 #define TARGET_BIG_SYM	bfd_elf32_sparc_vec
3434 #define TARGET_BIG_NAME	"elf32-sparc"
3435 #define ELF_ARCH	bfd_arch_sparc
3436 #define ELF_MACHINE_CODE EM_SPARC
3437 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
3438 #define ELF_MAXPAGESIZE 0x10000
3439 
3440 #define bfd_elf32_bfd_reloc_type_lookup	elf32_sparc_reloc_type_lookup
3441 #define bfd_elf32_bfd_link_hash_table_create \
3442 					elf32_sparc_link_hash_table_create
3443 #define bfd_elf32_bfd_relax_section	elf32_sparc_relax_section
3444 #define bfd_elf32_new_section_hook	elf32_sparc_new_section_hook
3445 #define elf_info_to_howto		elf32_sparc_info_to_howto
3446 #define elf_backend_copy_indirect_symbol \
3447 					elf32_sparc_copy_indirect_symbol
3448 #define elf_backend_create_dynamic_sections \
3449 					elf32_sparc_create_dynamic_sections
3450 #define elf_backend_check_relocs	elf32_sparc_check_relocs
3451 #define elf_backend_adjust_dynamic_symbol \
3452 					elf32_sparc_adjust_dynamic_symbol
3453 #define elf_backend_size_dynamic_sections \
3454 					elf32_sparc_size_dynamic_sections
3455 #define elf_backend_relocate_section	elf32_sparc_relocate_section
3456 #define elf_backend_finish_dynamic_symbol \
3457 					elf32_sparc_finish_dynamic_symbol
3458 #define elf_backend_finish_dynamic_sections \
3459 					elf32_sparc_finish_dynamic_sections
3460 #define bfd_elf32_bfd_merge_private_bfd_data \
3461 					elf32_sparc_merge_private_bfd_data
3462 #define bfd_elf32_mkobject		elf32_sparc_mkobject
3463 #define elf_backend_object_p		elf32_sparc_object_p
3464 #define elf_backend_final_write_processing \
3465 					elf32_sparc_final_write_processing
3466 #define elf_backend_gc_mark_hook	elf32_sparc_gc_mark_hook
3467 #define elf_backend_gc_sweep_hook       elf32_sparc_gc_sweep_hook
3468 #define elf_backend_grok_psinfo		elf32_sparc_grok_psinfo
3469 #define elf_backend_reloc_type_class	elf32_sparc_reloc_type_class
3470 
3471 #define elf_backend_can_gc_sections 1
3472 #define elf_backend_can_refcount 1
3473 #define elf_backend_want_got_plt 0
3474 #define elf_backend_plt_readonly 0
3475 #define elf_backend_want_plt_sym 1
3476 #define elf_backend_got_header_size 4
3477 #define elf_backend_rela_normal 1
3478 
3479 #include "elf32-target.h"
3480