1 /* SPARC-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
26 #include "elf/sparc.h"
27 #include "opcode/sparc.h"
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 *));
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 *,
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
66 static bfd_boolean create_got_section PARAMS ((bfd *,
67 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 ((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));
76 static bfd_boolean elf32_sparc_mkobject
78 static bfd_boolean elf32_sparc_object_p
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 *));
91 /* The relocation "howto" table. */
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 **));
102 reloc_howto_type _bfd_sparc_elf_howto_table[] =
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)
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);
196 struct elf_reloc_map {
197 bfd_reloc_code_real_type bfd_reloc_val;
198 unsigned char elf_reloc_val;
201 static const struct elf_reloc_map sparc_reloc_map[] =
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 }
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;
284 case BFD_RELOC_VTABLE_INHERIT:
285 return &elf32_sparc_vtinherit_howto;
287 case BFD_RELOC_VTABLE_ENTRY:
288 return &elf32_sparc_vtentry_howto;
290 case BFD_RELOC_SPARC_REV32:
291 return &elf32_sparc_rev32_howto;
294 for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
296 if (sparc_reloc_map[i].bfd_reloc_val == code)
297 return &_bfd_sparc_elf_howto_table[(int) sparc_reloc_map[i].elf_reloc_val];
300 bfd_set_error (bfd_error_bad_value);
304 /* We need to use ELF32_R_TYPE so we have our own copy of this function,
305 and elf64-sparc.c has its own copy. */
308 elf32_sparc_info_to_howto (abfd, cache_ptr, dst)
309 bfd *abfd ATTRIBUTE_UNUSED;
311 Elf_Internal_Rela *dst;
313 switch (ELF32_R_TYPE(dst->r_info))
315 case R_SPARC_GNU_VTINHERIT:
316 cache_ptr->howto = &elf32_sparc_vtinherit_howto;
319 case R_SPARC_GNU_VTENTRY:
320 cache_ptr->howto = &elf32_sparc_vtentry_howto;
324 cache_ptr->howto = &elf32_sparc_rev32_howto;
328 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_SPARC_max_std);
329 cache_ptr->howto = &_bfd_sparc_elf_howto_table[ELF32_R_TYPE(dst->r_info)];
333 /* For unsupported relocs. */
335 static bfd_reloc_status_type
336 sparc_elf_notsupported_reloc (abfd,
343 bfd *abfd ATTRIBUTE_UNUSED;
344 arelent *reloc_entry ATTRIBUTE_UNUSED;
345 asymbol *symbol ATTRIBUTE_UNUSED;
346 PTR data ATTRIBUTE_UNUSED;
347 asection *input_section ATTRIBUTE_UNUSED;
348 bfd *output_bfd ATTRIBUTE_UNUSED;
349 char **error_message ATTRIBUTE_UNUSED;
351 return bfd_reloc_notsupported;
354 /* Handle the WDISP16 reloc. */
356 static bfd_reloc_status_type
357 sparc_elf_wdisp16_reloc (abfd,
365 arelent *reloc_entry;
368 asection *input_section;
370 char **error_message ATTRIBUTE_UNUSED;
375 if (output_bfd != (bfd *) NULL
376 && (symbol->flags & BSF_SECTION_SYM) == 0
377 && (! reloc_entry->howto->partial_inplace
378 || reloc_entry->addend == 0))
380 reloc_entry->address += input_section->output_offset;
384 if (output_bfd != NULL)
385 return bfd_reloc_continue;
387 if (reloc_entry->address > input_section->_cooked_size)
388 return bfd_reloc_outofrange;
390 relocation = (symbol->value
391 + symbol->section->output_section->vma
392 + symbol->section->output_offset);
393 relocation += reloc_entry->addend;
394 relocation -= (input_section->output_section->vma
395 + input_section->output_offset);
396 relocation -= reloc_entry->address;
398 x = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
399 x |= ((((relocation >> 2) & 0xc000) << 6)
400 | ((relocation >> 2) & 0x3fff));
401 bfd_put_32 (abfd, x, (bfd_byte *) data + reloc_entry->address);
403 if ((bfd_signed_vma) relocation < - 0x40000
404 || (bfd_signed_vma) relocation > 0x3ffff)
405 return bfd_reloc_overflow;
410 /* Handle the HIX22 reloc. */
412 static bfd_reloc_status_type
413 sparc_elf_hix22_reloc (abfd,
421 arelent *reloc_entry;
424 asection *input_section;
426 char **error_message ATTRIBUTE_UNUSED;
431 if (output_bfd != (bfd *) NULL
432 && (symbol->flags & BSF_SECTION_SYM) == 0)
434 reloc_entry->address += input_section->output_offset;
438 if (output_bfd != NULL)
439 return bfd_reloc_continue;
441 if (reloc_entry->address > input_section->_cooked_size)
442 return bfd_reloc_outofrange;
444 relocation = (symbol->value
445 + symbol->section->output_section->vma
446 + symbol->section->output_offset);
447 relocation += reloc_entry->addend;
448 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
450 insn = (insn &~ (bfd_vma) 0x3fffff) | (((~relocation) >> 10) & 0x3fffff);
451 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
456 /* Handle the LOX10 reloc. */
458 static bfd_reloc_status_type
459 sparc_elf_lox10_reloc (abfd,
467 arelent *reloc_entry;
470 asection *input_section;
472 char **error_message ATTRIBUTE_UNUSED;
477 if (output_bfd != (bfd *) NULL
478 && (symbol->flags & BSF_SECTION_SYM) == 0)
480 reloc_entry->address += input_section->output_offset;
484 if (output_bfd != NULL)
485 return bfd_reloc_continue;
487 if (reloc_entry->address > input_section->_cooked_size)
488 return bfd_reloc_outofrange;
490 relocation = (symbol->value
491 + symbol->section->output_section->vma
492 + symbol->section->output_offset);
493 relocation += reloc_entry->addend;
494 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
496 insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
497 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
502 /* Functions for the SPARC ELF linker. */
504 /* The name of the dynamic interpreter. This is put in the .interp
507 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
509 /* The nop opcode we use. */
511 #define SPARC_NOP 0x01000000
513 /* The size in bytes of an entry in the procedure linkage table. */
515 #define PLT_ENTRY_SIZE 12
517 /* The first four entries in a procedure linkage table are reserved,
518 and the initial contents are unimportant (we zero them out).
519 Subsequent entries look like this. See the SVR4 ABI SPARC
520 supplement to see how this works. */
522 /* sethi %hi(.-.plt0),%g1. We fill in the address later. */
523 #define PLT_ENTRY_WORD0 0x03000000
524 /* b,a .plt0. We fill in the offset later. */
525 #define PLT_ENTRY_WORD1 0x30800000
527 #define PLT_ENTRY_WORD2 SPARC_NOP
529 /* The SPARC linker needs to keep track of the number of relocs that it
530 decides to copy as dynamic relocs in check_relocs for each symbol.
531 This is so that it can later discard them if they are found to be
532 unnecessary. We store the information in a field extending the
533 regular ELF linker hash table. */
535 struct elf32_sparc_dyn_relocs
537 struct elf32_sparc_dyn_relocs *next;
539 /* The input section of the reloc. */
542 /* Total number of relocs copied for the input section. */
545 /* Number of pc-relative relocs copied for the input section. */
546 bfd_size_type pc_count;
549 /* SPARC ELF linker hash entry. */
551 struct elf32_sparc_link_hash_entry
553 struct elf_link_hash_entry elf;
555 /* Track dynamic relocs copied for this symbol. */
556 struct elf32_sparc_dyn_relocs *dyn_relocs;
558 #define GOT_UNKNOWN 0
562 unsigned char tls_type;
565 #define elf32_sparc_hash_entry(ent) ((struct elf32_sparc_link_hash_entry *)(ent))
567 struct elf32_sparc_obj_tdata
569 struct elf_obj_tdata root;
571 /* tls_type for each local got entry. */
572 char *local_got_tls_type;
574 /* TRUE if TLS GD relocs has been seen for this object. */
575 bfd_boolean has_tlsgd;
578 #define elf32_sparc_tdata(abfd) \
579 ((struct elf32_sparc_obj_tdata *) (abfd)->tdata.any)
581 #define elf32_sparc_local_got_tls_type(abfd) \
582 (elf32_sparc_tdata (abfd)->local_got_tls_type)
585 elf32_sparc_mkobject (abfd)
588 bfd_size_type amt = sizeof (struct elf32_sparc_obj_tdata);
589 abfd->tdata.any = bfd_zalloc (abfd, amt);
590 if (abfd->tdata.any == NULL)
595 /* SPARC ELF linker hash table. */
597 struct elf32_sparc_link_hash_table
599 struct elf_link_hash_table elf;
601 /* Short-cuts to get to dynamic linker sections. */
610 bfd_signed_vma refcount;
614 /* Small local sym to section mapping cache. */
615 struct sym_sec_cache sym_sec;
618 /* Get the SPARC ELF linker hash table from a link_info structure. */
620 #define elf32_sparc_hash_table(p) \
621 ((struct elf32_sparc_link_hash_table *) ((p)->hash))
623 /* Create an entry in an i386 ELF linker hash table. */
625 static struct bfd_hash_entry *
626 link_hash_newfunc (entry, table, string)
627 struct bfd_hash_entry *entry;
628 struct bfd_hash_table *table;
631 /* Allocate the structure if it has not already been allocated by a
635 entry = bfd_hash_allocate (table,
636 sizeof (struct elf32_sparc_link_hash_entry));
641 /* Call the allocation method of the superclass. */
642 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
645 struct elf32_sparc_link_hash_entry *eh;
647 eh = (struct elf32_sparc_link_hash_entry *) entry;
648 eh->dyn_relocs = NULL;
649 eh->tls_type = GOT_UNKNOWN;
655 /* Create a SPARC ELF linker hash table. */
657 static struct bfd_link_hash_table *
658 elf32_sparc_link_hash_table_create (abfd)
661 struct elf32_sparc_link_hash_table *ret;
662 bfd_size_type amt = sizeof (struct elf32_sparc_link_hash_table);
664 ret = (struct elf32_sparc_link_hash_table *) bfd_malloc (amt);
668 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
680 ret->tls_ldm_got.refcount = 0;
681 ret->sym_sec.abfd = NULL;
683 return &ret->elf.root;
686 /* Create .got and .rela.got sections in DYNOBJ, and set up
687 shortcuts to them in our hash table. */
690 create_got_section (dynobj, info)
692 struct bfd_link_info *info;
694 struct elf32_sparc_link_hash_table *htab;
696 if (! _bfd_elf_create_got_section (dynobj, info))
699 htab = elf32_sparc_hash_table (info);
700 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
704 htab->srelgot = bfd_make_section (dynobj, ".rela.got");
705 if (htab->srelgot == NULL
706 || ! bfd_set_section_flags (dynobj, htab->srelgot,
707 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
708 | SEC_IN_MEMORY | SEC_LINKER_CREATED
710 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
715 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
716 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
720 elf32_sparc_create_dynamic_sections (dynobj, info)
722 struct bfd_link_info *info;
724 struct elf32_sparc_link_hash_table *htab;
726 htab = elf32_sparc_hash_table (info);
727 if (!htab->sgot && !create_got_section (dynobj, info))
730 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
733 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
734 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
735 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
737 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
739 if (!htab->splt || !htab->srelplt || !htab->sdynbss
740 || (!info->shared && !htab->srelbss))
746 /* Copy the extra info we tack onto an elf_link_hash_entry. */
749 elf32_sparc_copy_indirect_symbol (bed, dir, ind)
750 struct elf_backend_data *bed;
751 struct elf_link_hash_entry *dir, *ind;
753 struct elf32_sparc_link_hash_entry *edir, *eind;
755 edir = (struct elf32_sparc_link_hash_entry *) dir;
756 eind = (struct elf32_sparc_link_hash_entry *) ind;
758 if (eind->dyn_relocs != NULL)
760 if (edir->dyn_relocs != NULL)
762 struct elf32_sparc_dyn_relocs **pp;
763 struct elf32_sparc_dyn_relocs *p;
765 if (ind->root.type == bfd_link_hash_indirect)
768 /* Add reloc counts against the weak sym to the strong sym
769 list. Merge any entries against the same section. */
770 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
772 struct elf32_sparc_dyn_relocs *q;
774 for (q = edir->dyn_relocs; q != NULL; q = q->next)
775 if (q->sec == p->sec)
777 q->pc_count += p->pc_count;
778 q->count += p->count;
785 *pp = edir->dyn_relocs;
788 edir->dyn_relocs = eind->dyn_relocs;
789 eind->dyn_relocs = NULL;
792 if (ind->root.type == bfd_link_hash_indirect
793 && dir->got.refcount <= 0)
795 edir->tls_type = eind->tls_type;
796 eind->tls_type = GOT_UNKNOWN;
798 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
802 elf32_sparc_tls_transition (info, abfd, r_type, is_local)
803 struct bfd_link_info *info;
808 if (r_type == R_SPARC_TLS_GD_HI22
809 && ! elf32_sparc_tdata (abfd)->has_tlsgd)
810 r_type = R_SPARC_REV32;
817 case R_SPARC_TLS_GD_HI22:
819 return R_SPARC_TLS_LE_HIX22;
820 return R_SPARC_TLS_IE_HI22;
821 case R_SPARC_TLS_GD_LO10:
823 return R_SPARC_TLS_LE_LOX10;
824 return R_SPARC_TLS_IE_LO10;
825 case R_SPARC_TLS_IE_HI22:
827 return R_SPARC_TLS_LE_HIX22;
829 case R_SPARC_TLS_IE_LO10:
831 return R_SPARC_TLS_LE_LOX10;
833 case R_SPARC_TLS_LDM_HI22:
834 return R_SPARC_TLS_LE_HIX22;
835 case R_SPARC_TLS_LDM_LO10:
836 return R_SPARC_TLS_LE_LOX10;
842 /* Look through the relocs for a section during the first phase, and
843 allocate space in the global offset table or procedure linkage
847 elf32_sparc_check_relocs (abfd, info, sec, relocs)
849 struct bfd_link_info *info;
851 const Elf_Internal_Rela *relocs;
853 struct elf32_sparc_link_hash_table *htab;
854 Elf_Internal_Shdr *symtab_hdr;
855 struct elf_link_hash_entry **sym_hashes;
856 bfd_vma *local_got_offsets;
857 const Elf_Internal_Rela *rel;
858 const Elf_Internal_Rela *rel_end;
860 bfd_boolean checked_tlsgd = FALSE;
862 if (info->relocateable)
865 htab = elf32_sparc_hash_table (info);
866 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
867 sym_hashes = elf_sym_hashes (abfd);
868 local_got_offsets = elf_local_got_offsets (abfd);
872 rel_end = relocs + sec->reloc_count;
873 for (rel = relocs; rel < rel_end; rel++)
876 unsigned long r_symndx;
877 struct elf_link_hash_entry *h;
879 r_symndx = ELF32_R_SYM (rel->r_info);
880 r_type = ELF32_R_TYPE (rel->r_info);
882 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
884 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
885 bfd_archive_filename (abfd),
890 if (r_symndx < symtab_hdr->sh_info)
893 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
895 /* Compatibility with old R_SPARC_REV32 reloc conflicting
896 with R_SPARC_TLS_GD_HI22. */
900 case R_SPARC_TLS_GD_HI22:
902 const Elf_Internal_Rela *relt;
904 for (relt = rel + 1; relt < rel_end; relt++)
905 if (ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_LO10
906 || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_ADD
907 || ELF32_R_TYPE (relt->r_info) == R_SPARC_TLS_GD_CALL)
909 checked_tlsgd = TRUE;
910 elf32_sparc_tdata (abfd)->has_tlsgd = relt < rel_end;
913 case R_SPARC_TLS_GD_LO10:
914 case R_SPARC_TLS_GD_ADD:
915 case R_SPARC_TLS_GD_CALL:
916 checked_tlsgd = TRUE;
917 elf32_sparc_tdata (abfd)->has_tlsgd = TRUE;
921 r_type = elf32_sparc_tls_transition (info, abfd, r_type, h == NULL);
924 case R_SPARC_TLS_LDM_HI22:
925 case R_SPARC_TLS_LDM_LO10:
926 htab->tls_ldm_got.refcount += 1;
929 case R_SPARC_TLS_LE_HIX22:
930 case R_SPARC_TLS_LE_LOX10:
935 case R_SPARC_TLS_IE_HI22:
936 case R_SPARC_TLS_IE_LO10:
938 info->flags |= DF_STATIC_TLS;
944 case R_SPARC_TLS_GD_HI22:
945 case R_SPARC_TLS_GD_LO10:
946 /* This symbol requires a global offset table entry. */
948 int tls_type, old_tls_type;
956 tls_type = GOT_NORMAL;
958 case R_SPARC_TLS_GD_HI22:
959 case R_SPARC_TLS_GD_LO10:
960 tls_type = GOT_TLS_GD;
962 case R_SPARC_TLS_IE_HI22:
963 case R_SPARC_TLS_IE_LO10:
964 tls_type = GOT_TLS_IE;
970 h->got.refcount += 1;
971 old_tls_type = elf32_sparc_hash_entry(h)->tls_type;
975 bfd_signed_vma *local_got_refcounts;
977 /* This is a global offset table entry for a local symbol. */
978 local_got_refcounts = elf_local_got_refcounts (abfd);
979 if (local_got_refcounts == NULL)
983 size = symtab_hdr->sh_info;
984 size *= (sizeof (bfd_signed_vma) + sizeof(char));
985 local_got_refcounts = ((bfd_signed_vma *)
986 bfd_zalloc (abfd, size));
987 if (local_got_refcounts == NULL)
989 elf_local_got_refcounts (abfd) = local_got_refcounts;
990 elf32_sparc_local_got_tls_type (abfd)
991 = (char *) (local_got_refcounts + symtab_hdr->sh_info);
993 local_got_refcounts[r_symndx] += 1;
994 old_tls_type = elf32_sparc_local_got_tls_type (abfd) [r_symndx];
997 /* If a TLS symbol is accessed using IE at least once,
998 there is no point to use dynamic model for it. */
999 if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1000 && (old_tls_type != GOT_TLS_GD
1001 || tls_type != GOT_TLS_IE))
1003 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1004 tls_type = old_tls_type;
1007 (*_bfd_error_handler)
1008 (_("%s: `%s' accessed both as normal and thread local symbol"),
1009 bfd_archive_filename (abfd),
1010 h ? h->root.root.string : "<local>");
1015 if (old_tls_type != tls_type)
1018 elf32_sparc_hash_entry (h)->tls_type = tls_type;
1020 elf32_sparc_local_got_tls_type (abfd) [r_symndx] = tls_type;
1024 if (htab->elf.dynobj == NULL)
1025 htab->elf.dynobj = abfd;
1026 if (!create_got_section (htab->elf.dynobj, info))
1030 case R_SPARC_TLS_GD_CALL:
1031 case R_SPARC_TLS_LDM_CALL:
1034 /* These are basically R_SPARC_TLS_WPLT30 relocs against
1036 struct bfd_link_hash_entry *bh = NULL;
1037 if (! _bfd_generic_link_add_one_symbol (info, abfd,
1038 "__tls_get_addr", 0,
1039 bfd_und_section_ptr, 0,
1043 h = (struct elf_link_hash_entry *) bh;
1050 case R_SPARC_WPLT30:
1051 /* This symbol requires a procedure linkage table entry. We
1052 actually build the entry in adjust_dynamic_symbol,
1053 because this might be a case of linking PIC code without
1054 linking in any dynamic objects, in which case we don't
1055 need to generate a procedure linkage table after all. */
1059 /* The Solaris native assembler will generate a WPLT30
1060 reloc for a local symbol if you assemble a call from
1061 one section to another when using -K pic. We treat
1063 if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1068 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1070 if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1072 h->plt.refcount += 1;
1078 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1081 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1086 case R_SPARC_DISP16:
1087 case R_SPARC_DISP32:
1088 case R_SPARC_WDISP30:
1089 case R_SPARC_WDISP22:
1090 case R_SPARC_WDISP19:
1091 case R_SPARC_WDISP16:
1102 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1105 if (h != NULL && !info->shared)
1107 /* We may need a .plt entry if the function this reloc
1108 refers to is in a shared lib. */
1109 h->plt.refcount += 1;
1112 /* If we are creating a shared library, and this is a reloc
1113 against a global symbol, or a non PC relative reloc
1114 against a local symbol, then we need to copy the reloc
1115 into the shared library. However, if we are linking with
1116 -Bsymbolic, we do not need to copy a reloc against a
1117 global symbol which is defined in an object we are
1118 including in the link (i.e., DEF_REGULAR is set). At
1119 this point we have not seen all the input files, so it is
1120 possible that DEF_REGULAR is not set now but will be set
1121 later (it is never cleared). In case of a weak definition,
1122 DEF_REGULAR may be cleared later by a strong definition in
1123 a shared library. We account for that possibility below by
1124 storing information in the relocs_copied field of the hash
1125 table entry. A similar situation occurs when creating
1126 shared libraries and symbol visibility changes render the
1129 If on the other hand, we are creating an executable, we
1130 may need to keep relocations for symbols satisfied by a
1131 dynamic library if we manage to avoid copy relocs for the
1134 && (sec->flags & SEC_ALLOC) != 0
1135 && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1137 && (! info->symbolic
1138 || h->root.type == bfd_link_hash_defweak
1139 || (h->elf_link_hash_flags
1140 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1142 && (sec->flags & SEC_ALLOC) != 0
1144 && (h->root.type == bfd_link_hash_defweak
1145 || (h->elf_link_hash_flags
1146 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1148 struct elf32_sparc_dyn_relocs *p;
1149 struct elf32_sparc_dyn_relocs **head;
1151 /* When creating a shared object, we must copy these
1152 relocs into the output file. We create a reloc
1153 section in dynobj and make room for the reloc. */
1159 name = (bfd_elf_string_from_elf_section
1161 elf_elfheader (abfd)->e_shstrndx,
1162 elf_section_data (sec)->rel_hdr.sh_name));
1166 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1167 && strcmp (bfd_get_section_name (abfd, sec),
1170 if (htab->elf.dynobj == NULL)
1171 htab->elf.dynobj = abfd;
1172 dynobj = htab->elf.dynobj;
1174 sreloc = bfd_get_section_by_name (dynobj, name);
1179 sreloc = bfd_make_section (dynobj, name);
1180 flags = (SEC_HAS_CONTENTS | SEC_READONLY
1181 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1182 if ((sec->flags & SEC_ALLOC) != 0)
1183 flags |= SEC_ALLOC | SEC_LOAD;
1185 || ! bfd_set_section_flags (dynobj, sreloc, flags)
1186 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
1189 elf_section_data (sec)->sreloc = sreloc;
1192 /* If this is a global symbol, we count the number of
1193 relocations we need for this symbol. */
1195 head = &((struct elf32_sparc_link_hash_entry *) h)->dyn_relocs;
1198 /* Track dynamic relocs needed for local syms too.
1199 We really need local syms available to do this
1203 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1208 head = ((struct elf32_sparc_dyn_relocs **)
1209 &elf_section_data (s)->local_dynrel);
1213 if (p == NULL || p->sec != sec)
1215 bfd_size_type amt = sizeof *p;
1216 p = ((struct elf32_sparc_dyn_relocs *)
1217 bfd_alloc (htab->elf.dynobj, amt));
1228 if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1234 case R_SPARC_GNU_VTINHERIT:
1235 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1239 case R_SPARC_GNU_VTENTRY:
1240 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1253 elf32_sparc_gc_mark_hook (sec, info, rel, h, sym)
1255 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1256 Elf_Internal_Rela *rel;
1257 struct elf_link_hash_entry *h;
1258 Elf_Internal_Sym *sym;
1262 switch (ELF32_R_TYPE (rel->r_info))
1264 case R_SPARC_GNU_VTINHERIT:
1265 case R_SPARC_GNU_VTENTRY:
1269 switch (h->root.type)
1271 case bfd_link_hash_defined:
1272 case bfd_link_hash_defweak:
1273 return h->root.u.def.section;
1275 case bfd_link_hash_common:
1276 return h->root.u.c.p->section;
1284 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1289 /* Update the got entry reference counts for the section being removed. */
1291 elf32_sparc_gc_sweep_hook (abfd, info, sec, relocs)
1293 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1295 const Elf_Internal_Rela *relocs;
1298 Elf_Internal_Shdr *symtab_hdr;
1299 struct elf_link_hash_entry **sym_hashes;
1300 bfd_signed_vma *local_got_refcounts;
1301 const Elf_Internal_Rela *rel, *relend;
1302 unsigned long r_symndx;
1304 struct elf_link_hash_entry *h;
1306 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1307 sym_hashes = elf_sym_hashes (abfd);
1308 local_got_refcounts = elf_local_got_refcounts (abfd);
1310 relend = relocs + sec->reloc_count;
1311 for (rel = relocs; rel < relend; rel++)
1312 switch ((r_type = elf32_sparc_tls_transition (info, abfd,
1313 ELF32_R_TYPE (rel->r_info),
1314 ELF32_R_SYM (rel->r_info)
1315 >= symtab_hdr->sh_info)))
1317 case R_SPARC_TLS_LDM_HI22:
1318 case R_SPARC_TLS_LDM_LO10:
1319 if (elf32_sparc_hash_table (info)->tls_ldm_got.refcount > 0)
1320 elf32_sparc_hash_table (info)->tls_ldm_got.refcount -= 1;
1323 case R_SPARC_TLS_LE_HIX22:
1324 case R_SPARC_TLS_LE_LOX10:
1331 if ((r_symndx = ELF32_R_SYM (rel->r_info)) >= symtab_hdr->sh_info
1332 && strcmp (sym_hashes[r_symndx
1333 - symtab_hdr->sh_info]->root.root.string,
1334 "_GLOBAL_OFFSET_TABLE_") == 0)
1339 case R_SPARC_DISP16:
1340 case R_SPARC_DISP32:
1341 case R_SPARC_WDISP30:
1342 case R_SPARC_WDISP22:
1343 case R_SPARC_WDISP19:
1344 case R_SPARC_WDISP16:
1355 r_symndx = ELF32_R_SYM (rel->r_info);
1356 if (r_symndx >= symtab_hdr->sh_info)
1358 struct elf32_sparc_link_hash_entry *eh;
1359 struct elf32_sparc_dyn_relocs **pp;
1360 struct elf32_sparc_dyn_relocs *p;
1362 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1367 eh = (struct elf32_sparc_link_hash_entry *) h;
1369 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1372 if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1382 case R_SPARC_TLS_GD_HI22:
1383 case R_SPARC_TLS_GD_LO10:
1384 case R_SPARC_TLS_IE_HI22:
1385 case R_SPARC_TLS_IE_LO10:
1389 r_symndx = ELF32_R_SYM (rel->r_info);
1390 if (r_symndx >= symtab_hdr->sh_info)
1392 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1393 if (h->got.refcount > 0)
1398 if (local_got_refcounts[r_symndx] > 0)
1399 local_got_refcounts[r_symndx]--;
1404 case R_SPARC_HIPLT22:
1405 case R_SPARC_LOPLT10:
1406 case R_SPARC_PCPLT32:
1407 case R_SPARC_PCPLT10:
1408 r_symndx = ELF32_R_SYM (rel->r_info);
1409 if (r_symndx >= symtab_hdr->sh_info)
1411 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1412 if (h->plt.refcount > 0)
1415 if (r_type == R_SPARC_PLT32)
1426 /* Adjust a symbol defined by a dynamic object and referenced by a
1427 regular object. The current definition is in some section of the
1428 dynamic object, but we're not including those sections. We have to
1429 change the definition to something the rest of the link can
1433 elf32_sparc_adjust_dynamic_symbol (info, h)
1434 struct bfd_link_info *info;
1435 struct elf_link_hash_entry *h;
1437 struct elf32_sparc_link_hash_table *htab;
1438 struct elf32_sparc_link_hash_entry * eh;
1439 struct elf32_sparc_dyn_relocs *p;
1441 unsigned int power_of_two;
1443 htab = elf32_sparc_hash_table (info);
1445 /* Make sure we know what is going on here. */
1446 BFD_ASSERT (htab->elf.dynobj != NULL
1447 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
1448 || h->weakdef != NULL
1449 || ((h->elf_link_hash_flags
1450 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1451 && (h->elf_link_hash_flags
1452 & ELF_LINK_HASH_REF_REGULAR) != 0
1453 && (h->elf_link_hash_flags
1454 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
1456 /* If this is a function, put it in the procedure linkage table. We
1457 will fill in the contents of the procedure linkage table later
1458 (although we could actually do it here). The STT_NOTYPE
1459 condition is a hack specifically for the Oracle libraries
1460 delivered for Solaris; for some inexplicable reason, they define
1461 some of their functions as STT_NOTYPE when they really should be
1463 if (h->type == STT_FUNC
1464 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
1465 || (h->type == STT_NOTYPE
1466 && (h->root.type == bfd_link_hash_defined
1467 || h->root.type == bfd_link_hash_defweak)
1468 && (h->root.u.def.section->flags & SEC_CODE) != 0))
1470 if (h->plt.refcount <= 0
1472 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1473 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1474 && h->root.type != bfd_link_hash_undefweak
1475 && h->root.type != bfd_link_hash_undefined))
1477 /* This case can occur if we saw a WPLT30 reloc in an input
1478 file, but the symbol was never referred to by a dynamic
1479 object, or if all references were garbage collected. In
1480 such a case, we don't actually need to build a procedure
1481 linkage table, and we can just do a WDISP30 reloc instead. */
1482 h->plt.offset = (bfd_vma) -1;
1483 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1489 h->plt.offset = (bfd_vma) -1;
1491 /* If this is a weak symbol, and there is a real definition, the
1492 processor independent code will have arranged for us to see the
1493 real definition first, and we can just use the same value. */
1494 if (h->weakdef != NULL)
1496 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1497 || h->weakdef->root.type == bfd_link_hash_defweak);
1498 h->root.u.def.section = h->weakdef->root.u.def.section;
1499 h->root.u.def.value = h->weakdef->root.u.def.value;
1503 /* This is a reference to a symbol defined by a dynamic object which
1504 is not a function. */
1506 /* If we are creating a shared library, we must presume that the
1507 only references to the symbol are via the global offset table.
1508 For such cases we need not do anything here; the relocations will
1509 be handled correctly by relocate_section. */
1513 /* If there are no references to this symbol that do not use the
1514 GOT, we don't need to generate a copy reloc. */
1515 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1518 eh = (struct elf32_sparc_link_hash_entry *) h;
1519 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1521 s = p->sec->output_section;
1522 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1526 /* If we didn't find any dynamic relocs in read-only sections, then
1527 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1530 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1534 /* We must allocate the symbol in our .dynbss section, which will
1535 become part of the .bss section of the executable. There will be
1536 an entry for this symbol in the .dynsym section. The dynamic
1537 object will contain position independent code, so all references
1538 from the dynamic object to this symbol will go through the global
1539 offset table. The dynamic linker will use the .dynsym entry to
1540 determine the address it must put in the global offset table, so
1541 both the dynamic object and the regular object will refer to the
1542 same memory location for the variable. */
1544 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1545 to copy the initial value out of the dynamic object and into the
1546 runtime process image. We need to remember the offset into the
1547 .rel.bss section we are going to use. */
1548 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1550 htab->srelbss->_raw_size += sizeof (Elf32_External_Rela);
1551 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1554 /* We need to figure out the alignment required for this symbol. I
1555 have no idea how ELF linkers handle this. */
1556 power_of_two = bfd_log2 (h->size);
1557 if (power_of_two > 3)
1560 /* Apply the required alignment. */
1562 s->_raw_size = BFD_ALIGN (s->_raw_size,
1563 (bfd_size_type) (1 << power_of_two));
1564 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1566 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1570 /* Define the symbol as being at this point in the section. */
1571 h->root.u.def.section = s;
1572 h->root.u.def.value = s->_raw_size;
1574 /* Increment the section size to make room for the symbol. */
1575 s->_raw_size += h->size;
1580 /* This is the condition under which finish_dynamic_symbol will be called
1581 from elflink.h. If elflink.h doesn't call our finish_dynamic_symbol
1582 routine, we'll need to do something about initializing any .plt and .got
1583 entries in relocate_section. */
1584 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1586 && ((INFO)->shared \
1587 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1588 && ((H)->dynindx != -1 \
1589 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1591 /* Allocate space in .plt, .got and associated reloc sections for
1595 allocate_dynrelocs (h, inf)
1596 struct elf_link_hash_entry *h;
1599 struct bfd_link_info *info;
1600 struct elf32_sparc_link_hash_table *htab;
1601 struct elf32_sparc_link_hash_entry *eh;
1602 struct elf32_sparc_dyn_relocs *p;
1604 if (h->root.type == bfd_link_hash_indirect)
1607 if (h->root.type == bfd_link_hash_warning)
1608 /* When warning symbols are created, they **replace** the "real"
1609 entry in the hash table, thus we never get to see the real
1610 symbol in a hash traversal. So look at it now. */
1611 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1613 info = (struct bfd_link_info *) inf;
1614 htab = elf32_sparc_hash_table (info);
1616 if (htab->elf.dynamic_sections_created
1617 && h->plt.refcount > 0)
1619 /* Make sure this symbol is output as a dynamic symbol.
1620 Undefined weak syms won't yet be marked as dynamic. */
1621 if (h->dynindx == -1
1622 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1624 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1628 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1630 asection *s = htab->splt;
1632 /* The first four entries in .plt are reserved. */
1633 if (s->_raw_size == 0)
1634 s->_raw_size = 4 * PLT_ENTRY_SIZE;
1636 /* The procedure linkage table has a maximum size. */
1637 if (s->_raw_size >= 0x400000)
1639 bfd_set_error (bfd_error_bad_value);
1643 h->plt.offset = s->_raw_size;
1645 /* If this symbol is not defined in a regular file, and we are
1646 not generating a shared library, then set the symbol to this
1647 location in the .plt. This is required to make function
1648 pointers compare as equal between the normal executable and
1649 the shared library. */
1651 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1653 h->root.u.def.section = s;
1654 h->root.u.def.value = h->plt.offset;
1657 /* Make room for this entry. */
1658 s->_raw_size += PLT_ENTRY_SIZE;
1660 /* We also need to make an entry in the .rela.plt section. */
1661 htab->srelplt->_raw_size += sizeof (Elf32_External_Rela);
1665 h->plt.offset = (bfd_vma) -1;
1666 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1671 h->plt.offset = (bfd_vma) -1;
1672 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1675 /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
1676 make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */
1677 if (h->got.refcount > 0
1680 && elf32_sparc_hash_entry(h)->tls_type == GOT_TLS_IE)
1681 h->got.offset = (bfd_vma) -1;
1682 else if (h->got.refcount > 0)
1686 int tls_type = elf32_sparc_hash_entry(h)->tls_type;
1688 /* Make sure this symbol is output as a dynamic symbol.
1689 Undefined weak syms won't yet be marked as dynamic. */
1690 if (h->dynindx == -1
1691 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1693 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1698 h->got.offset = s->_raw_size;
1700 /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots. */
1701 if (tls_type == GOT_TLS_GD)
1703 dyn = htab->elf.dynamic_sections_created;
1704 /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
1705 R_SPARC_TLS_GD_{HI22,LO10} needs one if local symbol and two if
1707 if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
1708 || tls_type == GOT_TLS_IE)
1709 htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1710 else if (tls_type == GOT_TLS_GD)
1711 htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rela);
1712 else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1713 htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1716 h->got.offset = (bfd_vma) -1;
1718 eh = (struct elf32_sparc_link_hash_entry *) h;
1719 if (eh->dyn_relocs == NULL)
1722 /* In the shared -Bsymbolic case, discard space allocated for
1723 dynamic pc-relative relocs against symbols which turn out to be
1724 defined in regular objects. For the normal shared case, discard
1725 space for pc-relative relocs that have become local due to symbol
1726 visibility changes. */
1730 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1731 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1734 struct elf32_sparc_dyn_relocs **pp;
1736 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1738 p->count -= p->pc_count;
1749 /* For the non-shared case, discard space for relocs against
1750 symbols which turn out to need copy relocs or are not
1753 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1754 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1755 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1756 || (htab->elf.dynamic_sections_created
1757 && (h->root.type == bfd_link_hash_undefweak
1758 || h->root.type == bfd_link_hash_undefined))))
1760 /* Make sure this symbol is output as a dynamic symbol.
1761 Undefined weak syms won't yet be marked as dynamic. */
1762 if (h->dynindx == -1
1763 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1765 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1769 /* If that succeeded, we know we'll be keeping all the
1771 if (h->dynindx != -1)
1775 eh->dyn_relocs = NULL;
1780 /* Finally, allocate space. */
1781 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1783 asection *sreloc = elf_section_data (p->sec)->sreloc;
1784 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rela);
1790 /* Find any dynamic relocs that apply to read-only sections. */
1793 readonly_dynrelocs (h, inf)
1794 struct elf_link_hash_entry *h;
1797 struct elf32_sparc_link_hash_entry *eh;
1798 struct elf32_sparc_dyn_relocs *p;
1800 if (h->root.type == bfd_link_hash_warning)
1801 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1803 eh = (struct elf32_sparc_link_hash_entry *) h;
1804 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1806 asection *s = p->sec->output_section;
1808 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1810 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1812 info->flags |= DF_TEXTREL;
1814 /* Not an error, just cut short the traversal. */
1821 /* Set the sizes of the dynamic sections. */
1824 elf32_sparc_size_dynamic_sections (output_bfd, info)
1825 bfd *output_bfd ATTRIBUTE_UNUSED;
1826 struct bfd_link_info *info;
1828 struct elf32_sparc_link_hash_table *htab;
1833 htab = elf32_sparc_hash_table (info);
1834 dynobj = htab->elf.dynobj;
1835 BFD_ASSERT (dynobj != NULL);
1837 if (elf_hash_table (info)->dynamic_sections_created)
1839 /* Set the contents of the .interp section to the interpreter. */
1842 s = bfd_get_section_by_name (dynobj, ".interp");
1843 BFD_ASSERT (s != NULL);
1844 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1845 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1849 /* Set up .got offsets for local syms, and space for local dynamic
1851 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1853 bfd_signed_vma *local_got;
1854 bfd_signed_vma *end_local_got;
1855 char *local_tls_type;
1856 bfd_size_type locsymcount;
1857 Elf_Internal_Shdr *symtab_hdr;
1860 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1863 for (s = ibfd->sections; s != NULL; s = s->next)
1865 struct elf32_sparc_dyn_relocs *p;
1867 for (p = *((struct elf32_sparc_dyn_relocs **)
1868 &elf_section_data (s)->local_dynrel);
1872 if (!bfd_is_abs_section (p->sec)
1873 && bfd_is_abs_section (p->sec->output_section))
1875 /* Input section has been discarded, either because
1876 it is a copy of a linkonce section or due to
1877 linker script /DISCARD/, so we'll be discarding
1880 else if (p->count != 0)
1882 srel = elf_section_data (p->sec)->sreloc;
1883 srel->_raw_size += p->count * sizeof (Elf32_External_Rela);
1884 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1885 info->flags |= DF_TEXTREL;
1890 local_got = elf_local_got_refcounts (ibfd);
1894 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1895 locsymcount = symtab_hdr->sh_info;
1896 end_local_got = local_got + locsymcount;
1897 local_tls_type = elf32_sparc_local_got_tls_type (ibfd);
1899 srel = htab->srelgot;
1900 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1904 *local_got = s->_raw_size;
1906 if (*local_tls_type == GOT_TLS_GD)
1909 || *local_tls_type == GOT_TLS_GD
1910 || *local_tls_type == GOT_TLS_IE)
1911 srel->_raw_size += sizeof (Elf32_External_Rela);
1914 *local_got = (bfd_vma) -1;
1918 if (htab->tls_ldm_got.refcount > 0)
1920 /* Allocate 2 got entries and 1 dynamic reloc for
1921 R_SPARC_TLS_LDM_{HI22,LO10} relocs. */
1922 htab->tls_ldm_got.offset = htab->sgot->_raw_size;
1923 htab->sgot->_raw_size += 8;
1924 htab->srelgot->_raw_size += sizeof (Elf32_External_Rela);
1927 htab->tls_ldm_got.offset = -1;
1929 /* Allocate global sym .plt and .got entries, and space for global
1930 sym dynamic relocs. */
1931 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
1933 if (elf_hash_table (info)->dynamic_sections_created)
1935 /* Make space for the trailing nop in .plt. */
1936 if (htab->splt->_raw_size > 0)
1937 htab->splt->_raw_size += 4;
1939 /* If the .got section is more than 0x1000 bytes, we add
1940 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
1941 bit relocations have a greater chance of working. */
1942 if (htab->sgot->_raw_size >= 0x1000
1943 && elf_hash_table (info)->hgot->root.u.def.value == 0)
1944 elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
1947 /* The check_relocs and adjust_dynamic_symbol entry points have
1948 determined the sizes of the various dynamic sections. Allocate
1950 for (s = dynobj->sections; s != NULL; s = s->next)
1953 bfd_boolean strip = FALSE;
1955 if ((s->flags & SEC_LINKER_CREATED) == 0)
1958 /* It's OK to base decisions on the section name, because none
1959 of the dynobj section names depend upon the input files. */
1960 name = bfd_get_section_name (dynobj, s);
1962 if (strncmp (name, ".rela", 5) == 0)
1964 if (s->_raw_size == 0)
1966 /* If we don't need this section, strip it from the
1967 output file. This is to handle .rela.bss and
1968 .rel.plt. We must create it in
1969 create_dynamic_sections, because it must be created
1970 before the linker maps input sections to output
1971 sections. The linker does that before
1972 adjust_dynamic_symbol is called, and it is that
1973 function which decides whether anything needs to go
1974 into these sections. */
1979 /* We use the reloc_count field as a counter if we need
1980 to copy relocs into the output file. */
1984 else if (s != htab->splt && s != htab->sgot)
1986 /* It's not one of our sections, so don't allocate space. */
1992 _bfd_strip_section_from_output (info, s);
1996 /* Allocate memory for the section contents. */
1997 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
1998 Unused entries should be reclaimed before the section's contents
1999 are written out, but at the moment this does not happen. Thus in
2000 order to prevent writing out garbage, we initialise the section's
2001 contents to zero. */
2002 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
2003 if (s->contents == NULL && s->_raw_size != 0)
2007 if (elf_hash_table (info)->dynamic_sections_created)
2009 /* Add some entries to the .dynamic section. We fill in the
2010 values later, in elf32_sparc_finish_dynamic_sections, but we
2011 must add the entries now so that we get the correct size for
2012 the .dynamic section. The DT_DEBUG entry is filled in by the
2013 dynamic linker and used by the debugger. */
2014 #define add_dynamic_entry(TAG, VAL) \
2015 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
2019 if (!add_dynamic_entry (DT_DEBUG, 0))
2023 if (htab->srelplt->_raw_size != 0)
2025 if (!add_dynamic_entry (DT_PLTGOT, 0)
2026 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2027 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2028 || !add_dynamic_entry (DT_JMPREL, 0))
2032 if (!add_dynamic_entry (DT_RELA, 0)
2033 || !add_dynamic_entry (DT_RELASZ, 0)
2034 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2037 /* If any dynamic relocs apply to a read-only section,
2038 then we need a DT_TEXTREL entry. */
2039 if ((info->flags & DF_TEXTREL) == 0)
2040 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2043 if (info->flags & DF_TEXTREL)
2045 if (!add_dynamic_entry (DT_TEXTREL, 0))
2049 #undef add_dynamic_entry
2054 struct elf32_sparc_section_data
2056 struct bfd_elf_section_data elf;
2057 unsigned int do_relax;
2060 #define sec_do_relax(sec) \
2061 ((struct elf32_sparc_section_data *) (sec)->used_by_bfd)->do_relax
2064 elf32_sparc_new_section_hook (abfd, sec)
2068 struct elf32_sparc_section_data *sdata;
2069 bfd_size_type amt = sizeof (*sdata);
2071 sdata = (struct elf32_sparc_section_data *) bfd_zalloc (abfd, amt);
2074 sec->used_by_bfd = (PTR) sdata;
2076 return _bfd_elf_new_section_hook (abfd, sec);
2080 elf32_sparc_relax_section (abfd, section, link_info, again)
2081 bfd *abfd ATTRIBUTE_UNUSED;
2082 asection *section ATTRIBUTE_UNUSED;
2083 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
2087 sec_do_relax (section) = 1;
2091 /* Return the base VMA address which should be subtracted from real addresses
2092 when resolving @dtpoff relocation.
2093 This is PT_TLS segment p_vaddr. */
2097 struct bfd_link_info *info;
2099 /* If tls_segment is NULL, we should have signalled an error already. */
2100 if (elf_hash_table (info)->tls_segment == NULL)
2102 return elf_hash_table (info)->tls_segment->start;
2105 /* Return the relocation value for @tpoff relocation
2106 if STT_TLS virtual address is ADDRESS. */
2109 tpoff (info, address)
2110 struct bfd_link_info *info;
2113 struct elf_link_tls_segment *tls_segment
2114 = elf_hash_table (info)->tls_segment;
2116 /* If tls_segment is NULL, we should have signalled an error already. */
2117 if (tls_segment == NULL)
2119 return -(align_power (tls_segment->size, tls_segment->align)
2120 + tls_segment->start - address);
2123 /* Relocate a SPARC ELF section. */
2126 elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
2127 contents, relocs, local_syms, local_sections)
2129 struct bfd_link_info *info;
2131 asection *input_section;
2133 Elf_Internal_Rela *relocs;
2134 Elf_Internal_Sym *local_syms;
2135 asection **local_sections;
2137 struct elf32_sparc_link_hash_table *htab;
2138 Elf_Internal_Shdr *symtab_hdr;
2139 struct elf_link_hash_entry **sym_hashes;
2140 bfd_vma *local_got_offsets;
2143 Elf_Internal_Rela *rel;
2144 Elf_Internal_Rela *relend;
2146 if (info->relocateable)
2149 htab = elf32_sparc_hash_table (info);
2150 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2151 sym_hashes = elf_sym_hashes (input_bfd);
2152 local_got_offsets = elf_local_got_offsets (input_bfd);
2154 if (elf_hash_table (info)->hgot == NULL)
2157 got_base = elf_hash_table (info)->hgot->root.u.def.value;
2159 sreloc = elf_section_data (input_section)->sreloc;
2162 relend = relocs + input_section->reloc_count;
2163 for (; rel < relend; rel++)
2165 int r_type, tls_type;
2166 reloc_howto_type *howto;
2167 unsigned long r_symndx;
2168 struct elf_link_hash_entry *h;
2169 Elf_Internal_Sym *sym;
2171 bfd_vma relocation, off;
2172 bfd_reloc_status_type r;
2173 bfd_boolean is_plt = FALSE;
2174 bfd_boolean unresolved_reloc;
2176 r_type = ELF32_R_TYPE (rel->r_info);
2178 if (r_type == R_SPARC_GNU_VTINHERIT
2179 || r_type == R_SPARC_GNU_VTENTRY)
2182 if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2184 bfd_set_error (bfd_error_bad_value);
2187 howto = _bfd_sparc_elf_howto_table + r_type;
2189 /* This is a final link. */
2190 r_symndx = ELF32_R_SYM (rel->r_info);
2194 unresolved_reloc = FALSE;
2195 if (r_symndx < symtab_hdr->sh_info)
2197 sym = local_syms + r_symndx;
2198 sec = local_sections[r_symndx];
2199 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
2203 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2204 while (h->root.type == bfd_link_hash_indirect
2205 || h->root.type == bfd_link_hash_warning)
2206 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2209 if (h->root.type == bfd_link_hash_defined
2210 || h->root.type == bfd_link_hash_defweak)
2212 sec = h->root.u.def.section;
2213 if (sec->output_section == NULL)
2214 /* Set a flag that will be cleared later if we find a
2215 relocation value for this symbol. output_section
2216 is typically NULL for symbols satisfied by a shared
2218 unresolved_reloc = TRUE;
2220 relocation = (h->root.u.def.value
2221 + sec->output_section->vma
2222 + sec->output_offset);
2224 else if (h->root.type == bfd_link_hash_undefweak)
2226 else if (info->shared
2227 && (!info->symbolic || info->allow_shlib_undefined)
2228 && !info->no_undefined
2229 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2233 if (! ((*info->callbacks->undefined_symbol)
2234 (info, h->root.root.string, input_bfd,
2235 input_section, rel->r_offset,
2236 (!info->shared || info->no_undefined
2237 || ELF_ST_VISIBILITY (h->other)))))
2247 /* Relocation is to the entry for this symbol in the global
2249 if (htab->sgot == NULL)
2256 off = h->got.offset;
2257 BFD_ASSERT (off != (bfd_vma) -1);
2258 dyn = elf_hash_table (info)->dynamic_sections_created;
2260 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
2264 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2265 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
2267 /* This is actually a static link, or it is a
2268 -Bsymbolic link and the symbol is defined
2269 locally, or the symbol was forced to be local
2270 because of a version file. We must initialize
2271 this entry in the global offset table. Since the
2272 offset must always be a multiple of 4, we use the
2273 least significant bit to record whether we have
2274 initialized it already.
2276 When doing a dynamic link, we create a .rela.got
2277 relocation entry to initialize the value. This
2278 is done in the finish_dynamic_symbol routine. */
2283 bfd_put_32 (output_bfd, relocation,
2284 htab->sgot->contents + off);
2289 unresolved_reloc = FALSE;
2293 BFD_ASSERT (local_got_offsets != NULL
2294 && local_got_offsets[r_symndx] != (bfd_vma) -1);
2296 off = local_got_offsets[r_symndx];
2298 /* The offset must always be a multiple of 4. We use
2299 the least significant bit to record whether we have
2300 already processed this entry. */
2309 Elf_Internal_Rela outrel;
2312 /* We need to generate a R_SPARC_RELATIVE reloc
2313 for the dynamic linker. */
2315 BFD_ASSERT (s != NULL);
2317 outrel.r_offset = (htab->sgot->output_section->vma
2318 + htab->sgot->output_offset
2320 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2321 outrel.r_addend = relocation;
2324 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
2325 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2328 bfd_put_32 (output_bfd, relocation,
2329 htab->sgot->contents + off);
2330 local_got_offsets[r_symndx] |= 1;
2333 relocation = htab->sgot->output_offset + off - got_base;
2337 if (h == NULL || h->plt.offset == (bfd_vma) -1)
2339 r_type = R_SPARC_32;
2343 case R_SPARC_WPLT30:
2345 /* Relocation is to the entry for this symbol in the
2346 procedure linkage table. */
2348 /* The Solaris native assembler will generate a WPLT30 reloc
2349 for a local symbol if you assemble a call from one
2350 section to another when using -K pic. We treat it as
2355 if (h->plt.offset == (bfd_vma) -1)
2357 /* We didn't make a PLT entry for this symbol. This
2358 happens when statically linking PIC code, or when
2359 using -Bsymbolic. */
2363 if (htab->splt == NULL)
2366 relocation = (htab->splt->output_section->vma
2367 + htab->splt->output_offset
2369 unresolved_reloc = FALSE;
2370 if (r_type == R_SPARC_PLT32)
2372 r_type = R_SPARC_32;
2381 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2385 case R_SPARC_DISP16:
2386 case R_SPARC_DISP32:
2387 case R_SPARC_WDISP30:
2388 case R_SPARC_WDISP22:
2389 case R_SPARC_WDISP19:
2390 case R_SPARC_WDISP16:
2401 /* r_symndx will be zero only for relocs against symbols
2402 from removed linkonce sections, or sections discarded by
2405 || (input_section->flags & SEC_ALLOC) == 0)
2409 && (! howto->pc_relative
2412 && (! info->symbolic
2413 || (h->elf_link_hash_flags
2414 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2418 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2419 && (((h->elf_link_hash_flags
2420 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2421 && (h->elf_link_hash_flags
2422 & ELF_LINK_HASH_DEF_REGULAR) == 0)
2423 || h->root.type == bfd_link_hash_undefweak
2424 || h->root.type == bfd_link_hash_undefined)))
2426 Elf_Internal_Rela outrel;
2428 bfd_boolean skip, relocate = FALSE;
2430 /* When generating a shared object, these relocations
2431 are copied into the output file to be resolved at run
2434 BFD_ASSERT (sreloc != NULL);
2439 _bfd_elf_section_offset (output_bfd, info, input_section,
2441 if (outrel.r_offset == (bfd_vma) -1)
2443 else if (outrel.r_offset == (bfd_vma) -2)
2444 skip = TRUE, relocate = TRUE;
2445 outrel.r_offset += (input_section->output_section->vma
2446 + input_section->output_offset);
2448 /* Optimize unaligned reloc usage now that we know where
2449 it finally resides. */
2453 if (outrel.r_offset & 1)
2454 r_type = R_SPARC_UA16;
2457 if (!(outrel.r_offset & 1))
2458 r_type = R_SPARC_16;
2461 if (outrel.r_offset & 3)
2462 r_type = R_SPARC_UA32;
2465 if (!(outrel.r_offset & 3))
2466 r_type = R_SPARC_32;
2469 case R_SPARC_DISP16:
2470 case R_SPARC_DISP32:
2471 /* If the symbol is not dynamic, we should not keep
2472 a dynamic relocation. But an .rela.* slot has been
2473 allocated for it, output R_SPARC_NONE.
2474 FIXME: Add code tracking needed dynamic relocs as
2476 if (h->dynindx == -1)
2477 skip = TRUE, relocate = TRUE;
2482 memset (&outrel, 0, sizeof outrel);
2483 /* h->dynindx may be -1 if the symbol was marked to
2485 else if (h != NULL && ! is_plt
2486 && ((! info->symbolic && h->dynindx != -1)
2487 || (h->elf_link_hash_flags
2488 & ELF_LINK_HASH_DEF_REGULAR) == 0))
2490 BFD_ASSERT (h->dynindx != -1);
2491 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2492 outrel.r_addend = rel->r_addend;
2496 if (r_type == R_SPARC_32)
2498 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2499 outrel.r_addend = relocation + rel->r_addend;
2508 sec = local_sections[r_symndx];
2511 BFD_ASSERT (h->root.type == bfd_link_hash_defined
2513 == bfd_link_hash_defweak));
2514 sec = h->root.u.def.section;
2516 if (sec != NULL && bfd_is_abs_section (sec))
2518 else if (sec == NULL || sec->owner == NULL)
2520 bfd_set_error (bfd_error_bad_value);
2527 osec = sec->output_section;
2528 indx = elf_section_data (osec)->dynindx;
2530 /* FIXME: we really should be able to link non-pic
2531 shared libraries. */
2535 (*_bfd_error_handler)
2536 (_("%s: probably compiled without -fPIC?"),
2537 bfd_archive_filename (input_bfd));
2538 bfd_set_error (bfd_error_bad_value);
2543 outrel.r_info = ELF32_R_INFO (indx, r_type);
2544 outrel.r_addend = relocation + rel->r_addend;
2548 loc = sreloc->contents;
2549 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2550 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2552 /* This reloc will be computed at runtime, so there's no
2553 need to do anything now. */
2559 case R_SPARC_TLS_GD_HI22:
2560 if (! elf32_sparc_tdata (input_bfd)->has_tlsgd)
2562 /* R_SPARC_REV32 used the same reloc number as
2563 R_SPARC_TLS_GD_HI22. */
2564 r_type = R_SPARC_REV32;
2569 case R_SPARC_TLS_GD_LO10:
2570 case R_SPARC_TLS_IE_HI22:
2571 case R_SPARC_TLS_IE_LO10:
2572 r_type = elf32_sparc_tls_transition (info, input_bfd, r_type,
2574 tls_type = GOT_UNKNOWN;
2575 if (h == NULL && local_got_offsets)
2576 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2579 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2580 if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2581 switch (ELF32_R_TYPE (rel->r_info))
2583 case R_SPARC_TLS_GD_HI22:
2584 case R_SPARC_TLS_IE_HI22:
2585 r_type = R_SPARC_TLS_LE_HIX22;
2588 r_type = R_SPARC_TLS_LE_LOX10;
2592 if (tls_type == GOT_TLS_IE)
2595 case R_SPARC_TLS_GD_HI22:
2596 r_type = R_SPARC_TLS_IE_HI22;
2598 case R_SPARC_TLS_GD_LO10:
2599 r_type = R_SPARC_TLS_IE_LO10;
2603 if (r_type == R_SPARC_TLS_LE_HIX22)
2605 relocation = tpoff (info, relocation);
2608 if (r_type == R_SPARC_TLS_LE_LOX10)
2610 /* Change add into xor. */
2611 relocation = tpoff (info, relocation);
2612 bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
2613 contents + rel->r_offset)
2614 | 0x80182000), contents + rel->r_offset);
2620 off = h->got.offset;
2625 BFD_ASSERT (local_got_offsets != NULL);
2626 off = local_got_offsets[r_symndx];
2627 local_got_offsets[r_symndx] |= 1;
2631 if (htab->sgot == NULL)
2638 Elf_Internal_Rela outrel;
2639 Elf32_External_Rela *loc;
2642 if (htab->srelgot == NULL)
2645 bfd_put_32 (output_bfd, 0, htab->sgot->contents + off);
2646 outrel.r_offset = (htab->sgot->output_section->vma
2647 + htab->sgot->output_offset + off);
2648 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2649 if (r_type == R_SPARC_TLS_IE_HI22
2650 || r_type == R_SPARC_TLS_IE_LO10)
2651 dr_type = R_SPARC_TLS_TPOFF32;
2653 dr_type = R_SPARC_TLS_DTPMOD32;
2654 if (dr_type == R_SPARC_TLS_TPOFF32 && indx == 0)
2655 outrel.r_addend = relocation - dtpoff_base (info);
2657 outrel.r_addend = 0;
2658 outrel.r_info = ELF32_R_INFO (indx, dr_type);
2659 loc = (Elf32_External_Rela *) htab->srelgot->contents;
2660 loc += htab->srelgot->reloc_count++;
2661 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2664 if (r_type == R_SPARC_TLS_GD_HI22
2665 || r_type == R_SPARC_TLS_GD_LO10)
2669 BFD_ASSERT (! unresolved_reloc);
2670 bfd_put_32 (output_bfd,
2671 relocation - dtpoff_base (info),
2672 htab->sgot->contents + off + 4);
2676 bfd_put_32 (output_bfd, 0,
2677 htab->sgot->contents + off + 4);
2678 outrel.r_info = ELF32_R_INFO (indx,
2679 R_SPARC_TLS_DTPOFF32);
2680 outrel.r_offset += 4;
2681 htab->srelgot->reloc_count++;
2683 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2687 else if (dr_type == R_SPARC_TLS_DTPMOD32)
2689 bfd_put_32 (output_bfd, 0,
2690 htab->sgot->contents + off + 4);
2694 if (off >= (bfd_vma) -2)
2697 relocation = htab->sgot->output_offset + off - got_base;
2698 unresolved_reloc = FALSE;
2699 howto = _bfd_sparc_elf_howto_table + r_type;
2702 case R_SPARC_TLS_LDM_HI22:
2703 case R_SPARC_TLS_LDM_LO10:
2706 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2709 off = htab->tls_ldm_got.offset;
2710 htab->tls_ldm_got.offset |= 1;
2711 goto r_sparc_tlsldm;
2713 case R_SPARC_TLS_LDO_HIX22:
2714 case R_SPARC_TLS_LDO_LOX10:
2716 relocation -= dtpoff_base (info);
2718 relocation = tpoff (info, relocation);
2721 case R_SPARC_TLS_LE_HIX22:
2722 case R_SPARC_TLS_LE_LOX10:
2725 Elf_Internal_Rela outrel;
2726 bfd_boolean skip, relocate = FALSE;
2728 BFD_ASSERT (sreloc != NULL);
2731 _bfd_elf_section_offset (output_bfd, info, input_section,
2733 if (outrel.r_offset == (bfd_vma) -1)
2735 else if (outrel.r_offset == (bfd_vma) -2)
2736 skip = TRUE, relocate = TRUE;
2737 outrel.r_offset += (input_section->output_section->vma
2738 + input_section->output_offset);
2740 memset (&outrel, 0, sizeof outrel);
2743 outrel.r_info = ELF32_R_INFO (0, r_type);
2744 outrel.r_addend = relocation - dtpoff_base (info)
2748 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2749 (bfd_byte *) (((Elf32_External_Rela *)
2751 + sreloc->reloc_count));
2752 ++sreloc->reloc_count;
2755 relocation = tpoff (info, relocation);
2758 case R_SPARC_TLS_LDM_CALL:
2762 bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
2767 case R_SPARC_TLS_GD_CALL:
2768 tls_type = GOT_UNKNOWN;
2769 if (h == NULL && local_got_offsets)
2770 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2772 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2774 || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
2778 if (!info->shared && (h == NULL || h->dynindx == -1))
2781 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2786 if (rel + 1 < relend
2787 && ELF32_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
2788 && rel[1].r_offset == rel->r_offset + 4
2789 && ELF32_R_SYM (rel[1].r_info) == r_symndx
2790 && (((insn = bfd_get_32 (input_bfd,
2791 contents + rel[1].r_offset))
2792 >> 25) & 0x1f) == 8)
2795 call __tls_get_addr, %tgd_call(foo)
2796 add %reg1, %reg2, %o0, %tgd_add(foo)
2797 and change it into IE:
2798 ld [%reg1 + %reg2], %o0, %tie_ld(foo)
2799 add %g7, %o0, %o0, %tie_add(foo).
2800 add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
2801 ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2. */
2802 bfd_put_32 (output_bfd, insn | 0xc0000000,
2803 contents + rel->r_offset);
2804 bfd_put_32 (output_bfd, 0x9001c008,
2805 contents + rel->r_offset + 4);
2810 bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
2814 h = (struct elf_link_hash_entry *)
2815 bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
2817 BFD_ASSERT (h != NULL);
2818 r_type = R_SPARC_WPLT30;
2819 howto = _bfd_sparc_elf_howto_table + r_type;
2820 goto r_sparc_wplt30;
2822 case R_SPARC_TLS_GD_ADD:
2823 tls_type = GOT_UNKNOWN;
2824 if (h == NULL && local_got_offsets)
2825 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2827 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2828 if (! info->shared || tls_type == GOT_TLS_IE)
2830 /* add %reg1, %reg2, %reg3, %tgd_add(foo)
2832 ld [%reg1 + %reg2], %reg3, %tie_ld(foo)
2834 add %g7, %reg2, %reg3. */
2835 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2836 if ((h != NULL && h->dynindx != -1) || info->shared)
2837 relocation = insn | 0xc0000000;
2839 relocation = (insn & ~0x7c000) | 0x1c000;
2840 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2844 case R_SPARC_TLS_LDM_ADD:
2846 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2849 case R_SPARC_TLS_LDO_ADD:
2852 /* Change rs1 into %g7. */
2853 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2854 insn = (insn & ~0x7c000) | 0x1c000;
2855 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
2859 case R_SPARC_TLS_IE_LD:
2860 case R_SPARC_TLS_IE_LDX:
2861 if (! info->shared && (h == NULL || h->dynindx == -1))
2863 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2864 int rs2 = insn & 0x1f;
2865 int rd = (insn >> 25) & 0x1f;
2868 relocation = SPARC_NOP;
2870 relocation = 0x80100000 | (insn & 0x3e00001f);
2871 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2875 case R_SPARC_TLS_IE_ADD:
2876 /* Totally useless relocation. */
2879 case R_SPARC_TLS_DTPOFF32:
2880 relocation -= dtpoff_base (info);
2887 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2888 because such sections are not SEC_ALLOC and thus ld.so will
2889 not process them. */
2890 if (unresolved_reloc
2891 && !((input_section->flags & SEC_DEBUGGING) != 0
2892 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2893 (*_bfd_error_handler)
2894 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2895 bfd_archive_filename (input_bfd),
2896 bfd_get_section_name (input_bfd, input_section),
2897 (long) rel->r_offset,
2898 h->root.root.string);
2900 r = bfd_reloc_continue;
2901 if (r_type == R_SPARC_WDISP16)
2905 relocation += rel->r_addend;
2906 relocation -= (input_section->output_section->vma
2907 + input_section->output_offset);
2908 relocation -= rel->r_offset;
2910 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2911 x |= ((((relocation >> 2) & 0xc000) << 6)
2912 | ((relocation >> 2) & 0x3fff));
2913 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2915 if ((bfd_signed_vma) relocation < - 0x40000
2916 || (bfd_signed_vma) relocation > 0x3ffff)
2917 r = bfd_reloc_overflow;
2921 else if (r_type == R_SPARC_REV32)
2925 relocation = relocation + rel->r_addend;
2927 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2929 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
2932 else if (r_type == R_SPARC_TLS_LDO_HIX22
2933 || r_type == R_SPARC_TLS_LE_HIX22)
2937 relocation += rel->r_addend;
2938 relocation = relocation ^ 0xffffffff;
2940 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2941 x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
2942 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2945 else if (r_type == R_SPARC_TLS_LDO_LOX10
2946 || r_type == R_SPARC_TLS_LE_LOX10)
2950 relocation += rel->r_addend;
2951 relocation = (relocation & 0x3ff) | 0x1c00;
2953 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2954 x = (x & ~(bfd_vma) 0x1fff) | relocation;
2955 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2959 else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
2960 && sec_do_relax (input_section)
2961 && rel->r_offset + 4 < input_section->_raw_size)
2965 #define XCC (2 << 20)
2966 #define COND(x) (((x)&0xf)<<25)
2967 #define CONDA COND(0x8)
2968 #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
2969 #define INSN_BA (F2(0,2) | CONDA)
2970 #define INSN_OR F3(2, 0x2, 0)
2971 #define INSN_NOP F2(0,4)
2975 /* If the instruction is a call with either:
2977 arithmetic instruction with rd == %o7
2978 where rs1 != %o7 and rs2 if it is register != %o7
2979 then we can optimize if the call destination is near
2980 by changing the call into a branch always. */
2981 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2982 y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
2983 if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
2985 if (((y & OP3(~0)) == OP3(0x3d) /* restore */
2986 || ((y & OP3(0x28)) == 0 /* arithmetic */
2987 && (y & RD(~0)) == RD(O7)))
2988 && (y & RS1(~0)) != RS1(O7)
2990 || (y & RS2(~0)) != RS2(O7)))
2994 reloc = relocation + rel->r_addend - rel->r_offset;
2995 reloc -= (input_section->output_section->vma
2996 + input_section->output_offset);
2998 /* Ensure the reloc fits into simm22. */
2999 if ((reloc & 3) == 0
3000 && ((reloc & ~(bfd_vma)0x7fffff) == 0
3001 || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
3005 /* Check whether it fits into simm19 on v9. */
3006 if (((reloc & 0x3c0000) == 0
3007 || (reloc & 0x3c0000) == 0x3c0000)
3008 && (elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
3009 x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
3011 x = INSN_BA | (reloc & 0x3fffff); /* ba */
3012 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3014 if (rel->r_offset >= 4
3015 && (y & (0xffffffff ^ RS1(~0)))
3016 == (INSN_OR | RD(O7) | RS2(G0)))
3021 z = bfd_get_32 (input_bfd,
3022 contents + rel->r_offset - 4);
3023 if ((z & (0xffffffff ^ RD(~0)))
3024 != (INSN_OR | RS1(O7) | RS2(G0)))
3032 If call foo was replaced with ba, replace
3033 or %rN, %g0, %o7 with nop. */
3035 reg = (y & RS1(~0)) >> 14;
3036 if (reg != ((z & RD(~0)) >> 25)
3037 || reg == G0 || reg == O7)
3040 bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
3041 contents + rel->r_offset + 4);
3049 if (r == bfd_reloc_continue)
3050 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3051 contents, rel->r_offset,
3052 relocation, rel->r_addend);
3054 if (r != bfd_reloc_ok)
3059 case bfd_reloc_outofrange:
3061 case bfd_reloc_overflow:
3066 name = h->root.root.string;
3069 name = bfd_elf_string_from_elf_section (input_bfd,
3070 symtab_hdr->sh_link,
3075 name = bfd_section_name (input_bfd, sec);
3077 if (! ((*info->callbacks->reloc_overflow)
3078 (info, name, howto->name, (bfd_vma) 0,
3079 input_bfd, input_section, rel->r_offset)))
3090 /* Finish up dynamic symbol handling. We set the contents of various
3091 dynamic sections here. */
3094 elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
3096 struct bfd_link_info *info;
3097 struct elf_link_hash_entry *h;
3098 Elf_Internal_Sym *sym;
3101 struct elf32_sparc_link_hash_table *htab;
3103 htab = elf32_sparc_hash_table (info);
3104 dynobj = htab->elf.dynobj;
3106 if (h->plt.offset != (bfd_vma) -1)
3110 Elf_Internal_Rela rela;
3113 /* This symbol has an entry in the procedure linkage table. Set
3116 BFD_ASSERT (h->dynindx != -1);
3119 srela = htab->srelplt;
3120 BFD_ASSERT (splt != NULL && srela != NULL);
3122 /* Fill in the entry in the procedure linkage table. */
3123 bfd_put_32 (output_bfd,
3124 PLT_ENTRY_WORD0 + h->plt.offset,
3125 splt->contents + h->plt.offset);
3126 bfd_put_32 (output_bfd,
3128 + (((- (h->plt.offset + 4)) >> 2) & 0x3fffff)),
3129 splt->contents + h->plt.offset + 4);
3130 bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
3131 splt->contents + h->plt.offset + 8);
3133 /* Fill in the entry in the .rela.plt section. */
3134 rela.r_offset = (splt->output_section->vma
3135 + splt->output_offset
3137 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
3139 loc = srela->contents;
3140 loc += (h->plt.offset / PLT_ENTRY_SIZE - 4) * sizeof (Elf32_External_Rela);
3141 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3143 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3145 /* Mark the symbol as undefined, rather than as defined in
3146 the .plt section. Leave the value alone. */
3147 sym->st_shndx = SHN_UNDEF;
3148 /* If the symbol is weak, we do need to clear the value.
3149 Otherwise, the PLT entry would provide a definition for
3150 the symbol even if the symbol wasn't defined anywhere,
3151 and so the symbol would never be NULL. */
3152 if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
3158 if (h->got.offset != (bfd_vma) -1
3159 && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_GD
3160 && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_IE)
3164 Elf_Internal_Rela rela;
3167 /* This symbol has an entry in the global offset table. Set it
3171 srela = htab->srelgot;
3172 BFD_ASSERT (sgot != NULL && srela != NULL);
3174 rela.r_offset = (sgot->output_section->vma
3175 + sgot->output_offset
3176 + (h->got.offset &~ (bfd_vma) 1));
3178 /* If this is a -Bsymbolic link, and the symbol is defined
3179 locally, we just want to emit a RELATIVE reloc. Likewise if
3180 the symbol was forced to be local because of a version file.
3181 The entry in the global offset table will already have been
3182 initialized in the relocate_section function. */
3184 && (info->symbolic || h->dynindx == -1)
3185 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3187 asection *sec = h->root.u.def.section;
3188 rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
3189 rela.r_addend = (h->root.u.def.value
3190 + sec->output_section->vma
3191 + sec->output_offset);
3195 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
3199 bfd_put_32 (output_bfd, (bfd_vma) 0,
3200 sgot->contents + (h->got.offset &~ (bfd_vma) 1));
3201 loc = srela->contents;
3202 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
3203 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3206 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3209 Elf_Internal_Rela rela;
3212 /* This symbols needs a copy reloc. Set it up. */
3214 BFD_ASSERT (h->dynindx != -1);
3216 s = bfd_get_section_by_name (h->root.u.def.section->owner,
3218 BFD_ASSERT (s != NULL);
3220 rela.r_offset = (h->root.u.def.value
3221 + h->root.u.def.section->output_section->vma
3222 + h->root.u.def.section->output_offset);
3223 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY);
3225 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3226 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3229 /* Mark some specially defined symbols as absolute. */
3230 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3231 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3232 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3233 sym->st_shndx = SHN_ABS;
3238 /* Finish up the dynamic sections. */
3241 elf32_sparc_finish_dynamic_sections (output_bfd, info)
3243 struct bfd_link_info *info;
3247 struct elf32_sparc_link_hash_table *htab;
3249 htab = elf32_sparc_hash_table (info);
3250 dynobj = htab->elf.dynobj;
3252 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3254 if (elf_hash_table (info)->dynamic_sections_created)
3257 Elf32_External_Dyn *dyncon, *dynconend;
3259 splt = bfd_get_section_by_name (dynobj, ".plt");
3260 BFD_ASSERT (splt != NULL && sdyn != NULL);
3262 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3263 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3264 for (; dyncon < dynconend; dyncon++)
3266 Elf_Internal_Dyn dyn;
3270 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3274 case DT_PLTGOT: name = ".plt"; size = FALSE; break;
3275 case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
3276 case DT_JMPREL: name = ".rela.plt"; size = FALSE; break;
3277 default: name = NULL; size = FALSE; break;
3284 s = bfd_get_section_by_name (output_bfd, name);
3290 dyn.d_un.d_ptr = s->vma;
3293 if (s->_cooked_size != 0)
3294 dyn.d_un.d_val = s->_cooked_size;
3296 dyn.d_un.d_val = s->_raw_size;
3299 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3303 /* Clear the first four entries in the procedure linkage table,
3304 and put a nop in the last four bytes. */
3305 if (splt->_raw_size > 0)
3307 memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE);
3308 bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
3309 splt->contents + splt->_raw_size - 4);
3312 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3316 /* Set the first entry in the global offset table to the address of
3317 the dynamic section. */
3318 if (htab->sgot && htab->sgot->_raw_size > 0)
3321 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgot->contents);
3323 bfd_put_32 (output_bfd,
3324 sdyn->output_section->vma + sdyn->output_offset,
3325 htab->sgot->contents);
3329 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3334 /* Functions for dealing with the e_flags field.
3336 We don't define set_private_flags or copy_private_bfd_data because
3337 the only currently defined values are based on the bfd mach number,
3338 so we use the latter instead and defer setting e_flags until the
3339 file is written out. */
3341 /* Merge backend specific data from an object file to the output
3342 object file when linking. */
3345 elf32_sparc_merge_private_bfd_data (ibfd, obfd)
3350 /* FIXME: This should not be static. */
3351 static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
3353 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3354 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3359 if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
3362 (*_bfd_error_handler)
3363 (_("%s: compiled for a 64 bit system and target is 32 bit"),
3364 bfd_archive_filename (ibfd));
3366 else if ((ibfd->flags & DYNAMIC) == 0)
3368 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
3369 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
3372 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
3373 != previous_ibfd_e_flags)
3374 && previous_ibfd_e_flags != (unsigned long) -1)
3376 (*_bfd_error_handler)
3377 (_("%s: linking little endian files with big endian files"),
3378 bfd_archive_filename (ibfd));
3381 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
3385 bfd_set_error (bfd_error_bad_value);
3392 /* Set the right machine number. */
3395 elf32_sparc_object_p (abfd)
3398 /* Allocate our special target data. */
3399 struct elf32_sparc_obj_tdata *new_tdata;
3400 bfd_size_type amt = sizeof (struct elf32_sparc_obj_tdata);
3401 new_tdata = bfd_zalloc (abfd, amt);
3402 if (new_tdata == NULL)
3404 new_tdata->root = *abfd->tdata.elf_obj_data;
3405 abfd->tdata.any = new_tdata;
3407 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
3409 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3410 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3411 bfd_mach_sparc_v8plusb);
3412 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3413 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3414 bfd_mach_sparc_v8plusa);
3415 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
3416 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3417 bfd_mach_sparc_v8plus);
3421 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
3422 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3423 bfd_mach_sparc_sparclite_le);
3425 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
3428 /* The final processing done just before writing out the object file.
3429 We need to set the e_machine field appropriately. */
3432 elf32_sparc_final_write_processing (abfd, linker)
3434 bfd_boolean linker ATTRIBUTE_UNUSED;
3436 switch (bfd_get_mach (abfd))
3438 case bfd_mach_sparc :
3439 break; /* nothing to do */
3440 case bfd_mach_sparc_v8plus :
3441 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3442 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3443 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
3445 case bfd_mach_sparc_v8plusa :
3446 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3447 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3448 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
3450 case bfd_mach_sparc_v8plusb :
3451 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3452 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3453 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1
3456 case bfd_mach_sparc_sparclite_le :
3457 elf_elfheader (abfd)->e_machine = EM_SPARC;
3458 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
3466 static enum elf_reloc_type_class
3467 elf32_sparc_reloc_type_class (rela)
3468 const Elf_Internal_Rela *rela;
3470 switch ((int) ELF32_R_TYPE (rela->r_info))
3472 case R_SPARC_RELATIVE:
3473 return reloc_class_relative;
3474 case R_SPARC_JMP_SLOT:
3475 return reloc_class_plt;
3477 return reloc_class_copy;
3479 return reloc_class_normal;
3483 #define TARGET_BIG_SYM bfd_elf32_sparc_vec
3484 #define TARGET_BIG_NAME "elf32-sparc"
3485 #define ELF_ARCH bfd_arch_sparc
3486 #define ELF_MACHINE_CODE EM_SPARC
3487 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
3488 #define ELF_MAXPAGESIZE 0x10000
3490 #define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
3491 #define bfd_elf32_bfd_link_hash_table_create \
3492 elf32_sparc_link_hash_table_create
3493 #define bfd_elf32_bfd_relax_section elf32_sparc_relax_section
3494 #define bfd_elf32_new_section_hook elf32_sparc_new_section_hook
3495 #define elf_info_to_howto elf32_sparc_info_to_howto
3496 #define elf_backend_copy_indirect_symbol \
3497 elf32_sparc_copy_indirect_symbol
3498 #define elf_backend_create_dynamic_sections \
3499 elf32_sparc_create_dynamic_sections
3500 #define elf_backend_check_relocs elf32_sparc_check_relocs
3501 #define elf_backend_adjust_dynamic_symbol \
3502 elf32_sparc_adjust_dynamic_symbol
3503 #define elf_backend_size_dynamic_sections \
3504 elf32_sparc_size_dynamic_sections
3505 #define elf_backend_relocate_section elf32_sparc_relocate_section
3506 #define elf_backend_finish_dynamic_symbol \
3507 elf32_sparc_finish_dynamic_symbol
3508 #define elf_backend_finish_dynamic_sections \
3509 elf32_sparc_finish_dynamic_sections
3510 #define bfd_elf32_bfd_merge_private_bfd_data \
3511 elf32_sparc_merge_private_bfd_data
3512 #define bfd_elf32_mkobject elf32_sparc_mkobject
3513 #define elf_backend_object_p elf32_sparc_object_p
3514 #define elf_backend_final_write_processing \
3515 elf32_sparc_final_write_processing
3516 #define elf_backend_gc_mark_hook elf32_sparc_gc_mark_hook
3517 #define elf_backend_gc_sweep_hook elf32_sparc_gc_sweep_hook
3518 #define elf_backend_reloc_type_class elf32_sparc_reloc_type_class
3520 #define elf_backend_can_gc_sections 1
3521 #define elf_backend_can_refcount 1
3522 #define elf_backend_want_got_plt 0
3523 #define elf_backend_plt_readonly 0
3524 #define elf_backend_want_plt_sym 1
3525 #define elf_backend_got_header_size 4
3526 #define elf_backend_plt_header_size (4*PLT_ENTRY_SIZE)
3527 #define elf_backend_rela_normal 1
3529 #include "elf32-target.h"