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