bfd
[deliverable/binutils-gdb.git] / bfd / elf32-sparc.c
1 /* SPARC-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/sparc.h"
27 #include "opcode/sparc.h"
28
29 static reloc_howto_type *elf32_sparc_reloc_type_lookup
30 PARAMS ((bfd *, bfd_reloc_code_real_type));
31 static void elf32_sparc_info_to_howto
32 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
33 static bfd_boolean elf32_sparc_check_relocs
34 PARAMS ((bfd *, struct bfd_link_info *, asection *,
35 const Elf_Internal_Rela *));
36 static bfd_boolean elf32_sparc_adjust_dynamic_symbol
37 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
38 static bfd_boolean allocate_dynrelocs
39 PARAMS ((struct elf_link_hash_entry *, PTR));
40 static bfd_boolean readonly_dynrelocs
41 PARAMS ((struct elf_link_hash_entry *, PTR));
42 static bfd_boolean elf32_sparc_size_dynamic_sections
43 PARAMS ((bfd *, struct bfd_link_info *));
44 static bfd_boolean elf32_sparc_new_section_hook
45 PARAMS ((bfd *, asection *));
46 static bfd_boolean elf32_sparc_relax_section
47 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
48 static bfd_vma dtpoff_base
49 PARAMS ((struct bfd_link_info *));
50 static bfd_vma tpoff
51 PARAMS ((struct bfd_link_info *, bfd_vma));
52 static bfd_boolean elf32_sparc_relocate_section
53 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
54 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
55 static bfd_boolean elf32_sparc_finish_dynamic_symbol
56 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
57 Elf_Internal_Sym *));
58 static bfd_boolean elf32_sparc_finish_dynamic_sections
59 PARAMS ((bfd *, struct bfd_link_info *));
60 static bfd_boolean elf32_sparc_merge_private_bfd_data
61 PARAMS ((bfd *, bfd *));
62 static struct bfd_hash_entry *link_hash_newfunc
63 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
64 static struct bfd_link_hash_table *elf32_sparc_link_hash_table_create
65 PARAMS ((bfd *));
66 static bfd_boolean create_got_section 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));
75
76 static bfd_boolean elf32_sparc_mkobject
77 PARAMS ((bfd *));
78 static bfd_boolean elf32_sparc_object_p
79 PARAMS ((bfd *));
80 static void elf32_sparc_final_write_processing
81 PARAMS ((bfd *, bfd_boolean));
82 static enum elf_reloc_type_class elf32_sparc_reloc_type_class
83 PARAMS ((const Elf_Internal_Rela *));
84 static asection * elf32_sparc_gc_mark_hook
85 PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
86 struct elf_link_hash_entry *, Elf_Internal_Sym *));
87 static bfd_boolean elf32_sparc_gc_sweep_hook
88 PARAMS ((bfd *, struct bfd_link_info *, asection *,
89 const Elf_Internal_Rela *));
90 \f
91 /* The relocation "howto" table. */
92
93 static bfd_reloc_status_type sparc_elf_notsupported_reloc
94 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
95 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
96 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
97 static bfd_reloc_status_type sparc_elf_hix22_reloc
98 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
99 static bfd_reloc_status_type sparc_elf_lox10_reloc
100 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
101
102 reloc_howto_type _bfd_sparc_elf_howto_table[] =
103 {
104 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
105 HOWTO(R_SPARC_8, 0,0, 8,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", FALSE,0,0x000000ff,TRUE),
106 HOWTO(R_SPARC_16, 0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", FALSE,0,0x0000ffff,TRUE),
107 HOWTO(R_SPARC_32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", FALSE,0,0xffffffff,TRUE),
108 HOWTO(R_SPARC_DISP8, 0,0, 8,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", FALSE,0,0x000000ff,TRUE),
109 HOWTO(R_SPARC_DISP16, 0,1,16,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", FALSE,0,0x0000ffff,TRUE),
110 HOWTO(R_SPARC_DISP32, 0,2,32,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", FALSE,0,0xffffffff,TRUE),
111 HOWTO(R_SPARC_WDISP30, 2,2,30,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", FALSE,0,0x3fffffff,TRUE),
112 HOWTO(R_SPARC_WDISP22, 2,2,22,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", FALSE,0,0x003fffff,TRUE),
113 HOWTO(R_SPARC_HI22, 10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", FALSE,0,0x003fffff,TRUE),
114 HOWTO(R_SPARC_22, 0,2,22,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", FALSE,0,0x003fffff,TRUE),
115 HOWTO(R_SPARC_13, 0,2,13,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", FALSE,0,0x00001fff,TRUE),
116 HOWTO(R_SPARC_LO10, 0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", FALSE,0,0x000003ff,TRUE),
117 HOWTO(R_SPARC_GOT10, 0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", FALSE,0,0x000003ff,TRUE),
118 HOWTO(R_SPARC_GOT13, 0,2,13,FALSE,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", FALSE,0,0x00001fff,TRUE),
119 HOWTO(R_SPARC_GOT22, 10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", FALSE,0,0x003fffff,TRUE),
120 HOWTO(R_SPARC_PC10, 0,2,10,TRUE, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", FALSE,0,0x000003ff,TRUE),
121 HOWTO(R_SPARC_PC22, 10,2,22,TRUE, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", FALSE,0,0x003fffff,TRUE),
122 HOWTO(R_SPARC_WPLT30, 2,2,30,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", FALSE,0,0x3fffffff,TRUE),
123 HOWTO(R_SPARC_COPY, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", FALSE,0,0x00000000,TRUE),
124 HOWTO(R_SPARC_GLOB_DAT, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",FALSE,0,0x00000000,TRUE),
125 HOWTO(R_SPARC_JMP_SLOT, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_JMP_SLOT",FALSE,0,0x00000000,TRUE),
126 HOWTO(R_SPARC_RELATIVE, 0,0,00,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",FALSE,0,0x00000000,TRUE),
127 HOWTO(R_SPARC_UA32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA32", FALSE,0,0xffffffff,TRUE),
128 HOWTO(R_SPARC_PLT32, 0,0,00,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PLT32", FALSE,0,0xffffffff,TRUE),
129 HOWTO(R_SPARC_HIPLT22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HIPLT22", FALSE,0,0x00000000,TRUE),
130 HOWTO(R_SPARC_LOPLT10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LOPLT10", FALSE,0,0x00000000,TRUE),
131 HOWTO(R_SPARC_PCPLT32, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT32", FALSE,0,0x00000000,TRUE),
132 HOWTO(R_SPARC_PCPLT22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT22", FALSE,0,0x00000000,TRUE),
133 HOWTO(R_SPARC_PCPLT10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT10", FALSE,0,0x00000000,TRUE),
134 HOWTO(R_SPARC_10, 0,2,10,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", FALSE,0,0x000003ff,TRUE),
135 HOWTO(R_SPARC_11, 0,2,11,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", FALSE,0,0x000007ff,TRUE),
136 /* These are for sparc64 in a 64 bit environment.
137 Values need to be here because the table is indexed by reloc number. */
138 HOWTO(R_SPARC_64, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_64", FALSE,0,0x00000000,TRUE),
139 HOWTO(R_SPARC_OLO10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_OLO10", FALSE,0,0x00000000,TRUE),
140 HOWTO(R_SPARC_HH22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HH22", FALSE,0,0x00000000,TRUE),
141 HOWTO(R_SPARC_HM10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HM10", FALSE,0,0x00000000,TRUE),
142 HOWTO(R_SPARC_LM22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LM22", FALSE,0,0x00000000,TRUE),
143 HOWTO(R_SPARC_PC_HH22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HH22", FALSE,0,0x00000000,TRUE),
144 HOWTO(R_SPARC_PC_HM10, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HM10", FALSE,0,0x00000000,TRUE),
145 HOWTO(R_SPARC_PC_LM22, 0,0,00,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_LM22", FALSE,0,0x00000000,TRUE),
146 /* End sparc64 in 64 bit environment values.
147 The following are for sparc64 in a 32 bit environment. */
148 HOWTO(R_SPARC_WDISP16, 2,2,16,TRUE, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", FALSE,0,0x00000000,TRUE),
149 HOWTO(R_SPARC_WDISP19, 2,2,19,TRUE, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", FALSE,0,0x0007ffff,TRUE),
150 HOWTO(R_SPARC_UNUSED_42, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_UNUSED_42",FALSE,0,0x00000000,TRUE),
151 HOWTO(R_SPARC_7, 0,2, 7,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", FALSE,0,0x0000007f,TRUE),
152 HOWTO(R_SPARC_5, 0,2, 5,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", FALSE,0,0x0000001f,TRUE),
153 HOWTO(R_SPARC_6, 0,2, 6,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", FALSE,0,0x0000003f,TRUE),
154 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
155 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
156 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
157 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
158 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
159 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
160 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
161 HOWTO(R_SPARC_NONE, 0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", FALSE,0,0x00000000,TRUE),
162 HOWTO(R_SPARC_UA64, 0,0, 0,FALSE,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_UA64", FALSE,0,0x00000000,TRUE),
163 HOWTO(R_SPARC_UA16, 0,1,16,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_UA16", FALSE,0,0x0000ffff,TRUE),
164 HOWTO(R_SPARC_TLS_GD_HI22,10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_HI22",FALSE,0,0x003fffff,TRUE),
165 HOWTO(R_SPARC_TLS_GD_LO10,0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_LO10",FALSE,0,0x000003ff,TRUE),
166 HOWTO(R_SPARC_TLS_GD_ADD,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_ADD",FALSE,0,0x00000000,TRUE),
167 HOWTO(R_SPARC_TLS_GD_CALL,2,2,30,TRUE,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_TLS_GD_CALL",FALSE,0,0x3fffffff,TRUE),
168 HOWTO(R_SPARC_TLS_LDM_HI22,10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_HI22",FALSE,0,0x003fffff,TRUE),
169 HOWTO(R_SPARC_TLS_LDM_LO10,0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_LO10",FALSE,0,0x000003ff,TRUE),
170 HOWTO(R_SPARC_TLS_LDM_ADD,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_ADD",FALSE,0,0x00000000,TRUE),
171 HOWTO(R_SPARC_TLS_LDM_CALL,2,2,30,TRUE,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_TLS_LDM_CALL",FALSE,0,0x3fffffff,TRUE),
172 HOWTO(R_SPARC_TLS_LDO_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,"R_SPARC_TLS_LDO_HIX22",FALSE,0,0x003fffff, FALSE),
173 HOWTO(R_SPARC_TLS_LDO_LOX10,0,2,0,FALSE,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_TLS_LDO_LOX10",FALSE,0,0x000003ff, FALSE),
174 HOWTO(R_SPARC_TLS_LDO_ADD,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_LDO_ADD",FALSE,0,0x00000000,TRUE),
175 HOWTO(R_SPARC_TLS_IE_HI22,10,2,22,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_HI22",FALSE,0,0x003fffff,TRUE),
176 HOWTO(R_SPARC_TLS_IE_LO10,0,2,10,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LO10",FALSE,0,0x000003ff,TRUE),
177 HOWTO(R_SPARC_TLS_IE_LD,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LD",FALSE,0,0x00000000,TRUE),
178 HOWTO(R_SPARC_TLS_IE_LDX,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_LDX",FALSE,0,0x00000000,TRUE),
179 HOWTO(R_SPARC_TLS_IE_ADD,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_IE_ADD",FALSE,0,0x00000000,TRUE),
180 HOWTO(R_SPARC_TLS_LE_HIX22,0,2,0,FALSE,0,complain_overflow_bitfield,sparc_elf_hix22_reloc, "R_SPARC_TLS_LE_HIX22",FALSE,0,0x003fffff, FALSE),
181 HOWTO(R_SPARC_TLS_LE_LOX10,0,2,0,FALSE,0,complain_overflow_dont, sparc_elf_lox10_reloc, "R_SPARC_TLS_LE_LOX10",FALSE,0,0x000003ff, FALSE),
182 HOWTO(R_SPARC_TLS_DTPMOD32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD32",FALSE,0,0x00000000,TRUE),
183 HOWTO(R_SPARC_TLS_DTPMOD64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPMOD64",FALSE,0,0x00000000,TRUE),
184 HOWTO(R_SPARC_TLS_DTPOFF32,0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc,"R_SPARC_TLS_DTPOFF32",FALSE,0,0xffffffff,TRUE),
185 HOWTO(R_SPARC_TLS_DTPOFF64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_DTPOFF64",FALSE,0,0x00000000,TRUE),
186 HOWTO(R_SPARC_TLS_TPOFF32,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF32",FALSE,0,0x00000000,TRUE),
187 HOWTO(R_SPARC_TLS_TPOFF64,0,0, 0,FALSE,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_TLS_TPOFF64",FALSE,0,0x00000000,TRUE)
188 };
189 static reloc_howto_type elf32_sparc_vtinherit_howto =
190 HOWTO (R_SPARC_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_SPARC_GNU_VTINHERIT", FALSE,0, 0, FALSE);
191 static reloc_howto_type elf32_sparc_vtentry_howto =
192 HOWTO (R_SPARC_GNU_VTENTRY, 0,2,0,FALSE,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_SPARC_GNU_VTENTRY", FALSE,0,0, FALSE);
193 static reloc_howto_type elf32_sparc_rev32_howto =
194 HOWTO(R_SPARC_REV32, 0,2,32,FALSE,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_REV32", FALSE,0,0xffffffff,TRUE);
195
196 struct elf_reloc_map {
197 bfd_reloc_code_real_type bfd_reloc_val;
198 unsigned char elf_reloc_val;
199 };
200
201 static const struct elf_reloc_map sparc_reloc_map[] =
202 {
203 { BFD_RELOC_NONE, R_SPARC_NONE, },
204 { BFD_RELOC_16, R_SPARC_16, },
205 { BFD_RELOC_16_PCREL, R_SPARC_DISP16 },
206 { BFD_RELOC_8, R_SPARC_8 },
207 { BFD_RELOC_8_PCREL, R_SPARC_DISP8 },
208 { BFD_RELOC_CTOR, R_SPARC_32 },
209 { BFD_RELOC_32, R_SPARC_32 },
210 { BFD_RELOC_32_PCREL, R_SPARC_DISP32 },
211 { BFD_RELOC_HI22, R_SPARC_HI22 },
212 { BFD_RELOC_LO10, R_SPARC_LO10, },
213 { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 },
214 { BFD_RELOC_SPARC_PLT32, R_SPARC_PLT32 },
215 { BFD_RELOC_SPARC22, R_SPARC_22 },
216 { BFD_RELOC_SPARC13, R_SPARC_13 },
217 { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 },
218 { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 },
219 { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 },
220 { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 },
221 { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 },
222 { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 },
223 { BFD_RELOC_SPARC_COPY, R_SPARC_COPY },
224 { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT },
225 { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT },
226 { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE },
227 { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 },
228 { BFD_RELOC_SPARC_UA16, R_SPARC_UA16 },
229 { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 },
230 { BFD_RELOC_SPARC_UA64, R_SPARC_UA64 },
231 { BFD_RELOC_SPARC_10, R_SPARC_10 },
232 { BFD_RELOC_SPARC_11, R_SPARC_11 },
233 { BFD_RELOC_SPARC_64, R_SPARC_64 },
234 { BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10 },
235 { BFD_RELOC_SPARC_HH22, R_SPARC_HH22 },
236 { BFD_RELOC_SPARC_HM10, R_SPARC_HM10 },
237 { BFD_RELOC_SPARC_LM22, R_SPARC_LM22 },
238 { BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22 },
239 { BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10 },
240 { BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22 },
241 { BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16 },
242 { BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19 },
243 { BFD_RELOC_SPARC_7, R_SPARC_7 },
244 { BFD_RELOC_SPARC_5, R_SPARC_5 },
245 { BFD_RELOC_SPARC_6, R_SPARC_6 },
246 { BFD_RELOC_SPARC_TLS_GD_HI22, R_SPARC_TLS_GD_HI22 },
247 { BFD_RELOC_SPARC_TLS_GD_LO10, R_SPARC_TLS_GD_LO10 },
248 { BFD_RELOC_SPARC_TLS_GD_ADD, R_SPARC_TLS_GD_ADD },
249 { BFD_RELOC_SPARC_TLS_GD_CALL, R_SPARC_TLS_GD_CALL },
250 { BFD_RELOC_SPARC_TLS_LDM_HI22, R_SPARC_TLS_LDM_HI22 },
251 { BFD_RELOC_SPARC_TLS_LDM_LO10, R_SPARC_TLS_LDM_LO10 },
252 { BFD_RELOC_SPARC_TLS_LDM_ADD, R_SPARC_TLS_LDM_ADD },
253 { BFD_RELOC_SPARC_TLS_LDM_CALL, R_SPARC_TLS_LDM_CALL },
254 { BFD_RELOC_SPARC_TLS_LDO_HIX22, R_SPARC_TLS_LDO_HIX22 },
255 { BFD_RELOC_SPARC_TLS_LDO_LOX10, R_SPARC_TLS_LDO_LOX10 },
256 { BFD_RELOC_SPARC_TLS_LDO_ADD, R_SPARC_TLS_LDO_ADD },
257 { BFD_RELOC_SPARC_TLS_IE_HI22, R_SPARC_TLS_IE_HI22 },
258 { BFD_RELOC_SPARC_TLS_IE_LO10, R_SPARC_TLS_IE_LO10 },
259 { BFD_RELOC_SPARC_TLS_IE_LD, R_SPARC_TLS_IE_LD },
260 { BFD_RELOC_SPARC_TLS_IE_LDX, R_SPARC_TLS_IE_LDX },
261 { BFD_RELOC_SPARC_TLS_IE_ADD, R_SPARC_TLS_IE_ADD },
262 { BFD_RELOC_SPARC_TLS_LE_HIX22, R_SPARC_TLS_LE_HIX22 },
263 { BFD_RELOC_SPARC_TLS_LE_LOX10, R_SPARC_TLS_LE_LOX10 },
264 { BFD_RELOC_SPARC_TLS_DTPMOD32, R_SPARC_TLS_DTPMOD32 },
265 { BFD_RELOC_SPARC_TLS_DTPMOD64, R_SPARC_TLS_DTPMOD64 },
266 { BFD_RELOC_SPARC_TLS_DTPOFF32, R_SPARC_TLS_DTPOFF32 },
267 { BFD_RELOC_SPARC_TLS_DTPOFF64, R_SPARC_TLS_DTPOFF64 },
268 { BFD_RELOC_SPARC_TLS_TPOFF32, R_SPARC_TLS_TPOFF32 },
269 { BFD_RELOC_SPARC_TLS_TPOFF64, R_SPARC_TLS_TPOFF64 },
270 { BFD_RELOC_VTABLE_INHERIT, R_SPARC_GNU_VTINHERIT },
271 { BFD_RELOC_VTABLE_ENTRY, R_SPARC_GNU_VTENTRY },
272 { BFD_RELOC_SPARC_REV32, R_SPARC_REV32 }
273 };
274
275 static reloc_howto_type *
276 elf32_sparc_reloc_type_lookup (abfd, code)
277 bfd *abfd ATTRIBUTE_UNUSED;
278 bfd_reloc_code_real_type code;
279 {
280 unsigned int i;
281
282 switch (code)
283 {
284 case BFD_RELOC_VTABLE_INHERIT:
285 return &elf32_sparc_vtinherit_howto;
286
287 case BFD_RELOC_VTABLE_ENTRY:
288 return &elf32_sparc_vtentry_howto;
289
290 case BFD_RELOC_SPARC_REV32:
291 return &elf32_sparc_rev32_howto;
292
293 default:
294 for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
295 {
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];
298 }
299 }
300 bfd_set_error (bfd_error_bad_value);
301 return NULL;
302 }
303
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. */
306
307 static void
308 elf32_sparc_info_to_howto (abfd, cache_ptr, dst)
309 bfd *abfd ATTRIBUTE_UNUSED;
310 arelent *cache_ptr;
311 Elf_Internal_Rela *dst;
312 {
313 switch (ELF32_R_TYPE(dst->r_info))
314 {
315 case R_SPARC_GNU_VTINHERIT:
316 cache_ptr->howto = &elf32_sparc_vtinherit_howto;
317 break;
318
319 case R_SPARC_GNU_VTENTRY:
320 cache_ptr->howto = &elf32_sparc_vtentry_howto;
321 break;
322
323 case R_SPARC_REV32:
324 cache_ptr->howto = &elf32_sparc_rev32_howto;
325 break;
326
327 default:
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)];
330 }
331 }
332 \f
333 /* For unsupported relocs. */
334
335 static bfd_reloc_status_type
336 sparc_elf_notsupported_reloc (abfd,
337 reloc_entry,
338 symbol,
339 data,
340 input_section,
341 output_bfd,
342 error_message)
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;
350 {
351 return bfd_reloc_notsupported;
352 }
353
354 /* Handle the WDISP16 reloc. */
355
356 static bfd_reloc_status_type
357 sparc_elf_wdisp16_reloc (abfd,
358 reloc_entry,
359 symbol,
360 data,
361 input_section,
362 output_bfd,
363 error_message)
364 bfd *abfd;
365 arelent *reloc_entry;
366 asymbol *symbol;
367 PTR data;
368 asection *input_section;
369 bfd *output_bfd;
370 char **error_message ATTRIBUTE_UNUSED;
371 {
372 bfd_vma relocation;
373 bfd_vma x;
374
375 if (output_bfd != (bfd *) NULL
376 && (symbol->flags & BSF_SECTION_SYM) == 0
377 && (! reloc_entry->howto->partial_inplace
378 || reloc_entry->addend == 0))
379 {
380 reloc_entry->address += input_section->output_offset;
381 return bfd_reloc_ok;
382 }
383
384 if (output_bfd != NULL)
385 return bfd_reloc_continue;
386
387 if (reloc_entry->address > input_section->_cooked_size)
388 return bfd_reloc_outofrange;
389
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;
397
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);
402
403 if ((bfd_signed_vma) relocation < - 0x40000
404 || (bfd_signed_vma) relocation > 0x3ffff)
405 return bfd_reloc_overflow;
406 else
407 return bfd_reloc_ok;
408 }
409
410 /* Handle the HIX22 reloc. */
411
412 static bfd_reloc_status_type
413 sparc_elf_hix22_reloc (abfd,
414 reloc_entry,
415 symbol,
416 data,
417 input_section,
418 output_bfd,
419 error_message)
420 bfd *abfd;
421 arelent *reloc_entry;
422 asymbol *symbol;
423 PTR data;
424 asection *input_section;
425 bfd *output_bfd;
426 char **error_message ATTRIBUTE_UNUSED;
427 {
428 bfd_vma relocation;
429 bfd_vma insn;
430
431 if (output_bfd != (bfd *) NULL
432 && (symbol->flags & BSF_SECTION_SYM) == 0)
433 {
434 reloc_entry->address += input_section->output_offset;
435 return bfd_reloc_ok;
436 }
437
438 if (output_bfd != NULL)
439 return bfd_reloc_continue;
440
441 if (reloc_entry->address > input_section->_cooked_size)
442 return bfd_reloc_outofrange;
443
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);
449
450 insn = (insn &~ (bfd_vma) 0x3fffff) | (((~relocation) >> 10) & 0x3fffff);
451 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
452
453 return bfd_reloc_ok;
454 }
455
456 /* Handle the LOX10 reloc. */
457
458 static bfd_reloc_status_type
459 sparc_elf_lox10_reloc (abfd,
460 reloc_entry,
461 symbol,
462 data,
463 input_section,
464 output_bfd,
465 error_message)
466 bfd *abfd;
467 arelent *reloc_entry;
468 asymbol *symbol;
469 PTR data;
470 asection *input_section;
471 bfd *output_bfd;
472 char **error_message ATTRIBUTE_UNUSED;
473 {
474 bfd_vma relocation;
475 bfd_vma insn;
476
477 if (output_bfd != (bfd *) NULL
478 && (symbol->flags & BSF_SECTION_SYM) == 0)
479 {
480 reloc_entry->address += input_section->output_offset;
481 return bfd_reloc_ok;
482 }
483
484 if (output_bfd != NULL)
485 return bfd_reloc_continue;
486
487 if (reloc_entry->address > input_section->_cooked_size)
488 return bfd_reloc_outofrange;
489
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);
495
496 insn = (insn &~ (bfd_vma) 0x1fff) | 0x1c00 | (relocation & 0x3ff);
497 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
498
499 return bfd_reloc_ok;
500 }
501 \f
502 /* Functions for the SPARC ELF linker. */
503
504 /* The name of the dynamic interpreter. This is put in the .interp
505 section. */
506
507 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
508
509 /* The nop opcode we use. */
510
511 #define SPARC_NOP 0x01000000
512
513 /* The size in bytes of an entry in the procedure linkage table. */
514
515 #define PLT_ENTRY_SIZE 12
516
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. */
521
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
526 /* nop. */
527 #define PLT_ENTRY_WORD2 SPARC_NOP
528
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. */
534
535 struct elf32_sparc_dyn_relocs
536 {
537 struct elf32_sparc_dyn_relocs *next;
538
539 /* The input section of the reloc. */
540 asection *sec;
541
542 /* Total number of relocs copied for the input section. */
543 bfd_size_type count;
544
545 /* Number of pc-relative relocs copied for the input section. */
546 bfd_size_type pc_count;
547 };
548
549 /* SPARC ELF linker hash entry. */
550
551 struct elf32_sparc_link_hash_entry
552 {
553 struct elf_link_hash_entry elf;
554
555 /* Track dynamic relocs copied for this symbol. */
556 struct elf32_sparc_dyn_relocs *dyn_relocs;
557
558 #define GOT_UNKNOWN 0
559 #define GOT_NORMAL 1
560 #define GOT_TLS_GD 2
561 #define GOT_TLS_IE 3
562 unsigned char tls_type;
563 };
564
565 #define elf32_sparc_hash_entry(ent) ((struct elf32_sparc_link_hash_entry *)(ent))
566
567 struct elf32_sparc_obj_tdata
568 {
569 struct elf_obj_tdata root;
570
571 /* tls_type for each local got entry. */
572 char *local_got_tls_type;
573
574 /* TRUE if TLS GD relocs has been seen for this object. */
575 bfd_boolean has_tlsgd;
576 };
577
578 #define elf32_sparc_tdata(abfd) \
579 ((struct elf32_sparc_obj_tdata *) (abfd)->tdata.any)
580
581 #define elf32_sparc_local_got_tls_type(abfd) \
582 (elf32_sparc_tdata (abfd)->local_got_tls_type)
583
584 static bfd_boolean
585 elf32_sparc_mkobject (abfd)
586 bfd *abfd;
587 {
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)
591 return FALSE;
592 return TRUE;
593 }
594
595 /* SPARC ELF linker hash table. */
596
597 struct elf32_sparc_link_hash_table
598 {
599 struct elf_link_hash_table elf;
600
601 /* Short-cuts to get to dynamic linker sections. */
602 asection *sgot;
603 asection *srelgot;
604 asection *splt;
605 asection *srelplt;
606 asection *sdynbss;
607 asection *srelbss;
608
609 union {
610 bfd_signed_vma refcount;
611 bfd_vma offset;
612 } tls_ldm_got;
613
614 /* Small local sym to section mapping cache. */
615 struct sym_sec_cache sym_sec;
616 };
617
618 /* Get the SPARC ELF linker hash table from a link_info structure. */
619
620 #define elf32_sparc_hash_table(p) \
621 ((struct elf32_sparc_link_hash_table *) ((p)->hash))
622
623 /* Create an entry in an i386 ELF linker hash table. */
624
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;
629 const char *string;
630 {
631 /* Allocate the structure if it has not already been allocated by a
632 subclass. */
633 if (entry == NULL)
634 {
635 entry = bfd_hash_allocate (table,
636 sizeof (struct elf32_sparc_link_hash_entry));
637 if (entry == NULL)
638 return entry;
639 }
640
641 /* Call the allocation method of the superclass. */
642 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
643 if (entry != NULL)
644 {
645 struct elf32_sparc_link_hash_entry *eh;
646
647 eh = (struct elf32_sparc_link_hash_entry *) entry;
648 eh->dyn_relocs = NULL;
649 eh->tls_type = GOT_UNKNOWN;
650 }
651
652 return entry;
653 }
654
655 /* Create a SPARC ELF linker hash table. */
656
657 static struct bfd_link_hash_table *
658 elf32_sparc_link_hash_table_create (abfd)
659 bfd *abfd;
660 {
661 struct elf32_sparc_link_hash_table *ret;
662 bfd_size_type amt = sizeof (struct elf32_sparc_link_hash_table);
663
664 ret = (struct elf32_sparc_link_hash_table *) bfd_malloc (amt);
665 if (ret == NULL)
666 return NULL;
667
668 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
669 {
670 free (ret);
671 return NULL;
672 }
673
674 ret->sgot = NULL;
675 ret->srelgot = NULL;
676 ret->splt = NULL;
677 ret->srelplt = NULL;
678 ret->sdynbss = NULL;
679 ret->srelbss = NULL;
680 ret->tls_ldm_got.refcount = 0;
681 ret->sym_sec.abfd = NULL;
682
683 return &ret->elf.root;
684 }
685
686 /* Create .got and .rela.got sections in DYNOBJ, and set up
687 shortcuts to them in our hash table. */
688
689 static bfd_boolean
690 create_got_section (dynobj, info)
691 bfd *dynobj;
692 struct bfd_link_info *info;
693 {
694 struct elf32_sparc_link_hash_table *htab;
695
696 if (! _bfd_elf_create_got_section (dynobj, info))
697 return FALSE;
698
699 htab = elf32_sparc_hash_table (info);
700 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
701 if (!htab->sgot)
702 abort ();
703
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
709 | SEC_READONLY))
710 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
711 return FALSE;
712 return TRUE;
713 }
714
715 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
716 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
717 hash table. */
718
719 static bfd_boolean
720 elf32_sparc_create_dynamic_sections (dynobj, info)
721 bfd *dynobj;
722 struct bfd_link_info *info;
723 {
724 struct elf32_sparc_link_hash_table *htab;
725
726 htab = elf32_sparc_hash_table (info);
727 if (!htab->sgot && !create_got_section (dynobj, info))
728 return FALSE;
729
730 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
731 return FALSE;
732
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");
736 if (!info->shared)
737 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
738
739 if (!htab->splt || !htab->srelplt || !htab->sdynbss
740 || (!info->shared && !htab->srelbss))
741 abort ();
742
743 return TRUE;
744 }
745
746 /* Copy the extra info we tack onto an elf_link_hash_entry. */
747
748 static void
749 elf32_sparc_copy_indirect_symbol (bed, dir, ind)
750 struct elf_backend_data *bed;
751 struct elf_link_hash_entry *dir, *ind;
752 {
753 struct elf32_sparc_link_hash_entry *edir, *eind;
754
755 edir = (struct elf32_sparc_link_hash_entry *) dir;
756 eind = (struct elf32_sparc_link_hash_entry *) ind;
757
758 if (eind->dyn_relocs != NULL)
759 {
760 if (edir->dyn_relocs != NULL)
761 {
762 struct elf32_sparc_dyn_relocs **pp;
763 struct elf32_sparc_dyn_relocs *p;
764
765 if (ind->root.type == bfd_link_hash_indirect)
766 abort ();
767
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; )
771 {
772 struct elf32_sparc_dyn_relocs *q;
773
774 for (q = edir->dyn_relocs; q != NULL; q = q->next)
775 if (q->sec == p->sec)
776 {
777 q->pc_count += p->pc_count;
778 q->count += p->count;
779 *pp = p->next;
780 break;
781 }
782 if (q == NULL)
783 pp = &p->next;
784 }
785 *pp = edir->dyn_relocs;
786 }
787
788 edir->dyn_relocs = eind->dyn_relocs;
789 eind->dyn_relocs = NULL;
790 }
791
792 if (ind->root.type == bfd_link_hash_indirect
793 && dir->got.refcount <= 0)
794 {
795 edir->tls_type = eind->tls_type;
796 eind->tls_type = GOT_UNKNOWN;
797 }
798 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
799 }
800
801 static int
802 elf32_sparc_tls_transition (info, abfd, r_type, is_local)
803 struct bfd_link_info *info;
804 bfd *abfd;
805 int r_type;
806 int is_local;
807 {
808 if (r_type == R_SPARC_TLS_GD_HI22
809 && ! elf32_sparc_tdata (abfd)->has_tlsgd)
810 r_type = R_SPARC_REV32;
811
812 if (info->shared)
813 return r_type;
814
815 switch (r_type)
816 {
817 case R_SPARC_TLS_GD_HI22:
818 if (is_local)
819 return R_SPARC_TLS_LE_HIX22;
820 return R_SPARC_TLS_IE_HI22;
821 case R_SPARC_TLS_GD_LO10:
822 if (is_local)
823 return R_SPARC_TLS_LE_LOX10;
824 return R_SPARC_TLS_IE_LO10;
825 case R_SPARC_TLS_IE_HI22:
826 if (is_local)
827 return R_SPARC_TLS_LE_HIX22;
828 return r_type;
829 case R_SPARC_TLS_IE_LO10:
830 if (is_local)
831 return R_SPARC_TLS_LE_LOX10;
832 return r_type;
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;
837 }
838
839 return r_type;
840 }
841
842 /* Look through the relocs for a section during the first phase, and
843 allocate space in the global offset table or procedure linkage
844 table. */
845
846 static bfd_boolean
847 elf32_sparc_check_relocs (abfd, info, sec, relocs)
848 bfd *abfd;
849 struct bfd_link_info *info;
850 asection *sec;
851 const Elf_Internal_Rela *relocs;
852 {
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;
859 asection *sreloc;
860 bfd_boolean checked_tlsgd = FALSE;
861
862 if (info->relocateable)
863 return TRUE;
864
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);
869
870 sreloc = NULL;
871
872 rel_end = relocs + sec->reloc_count;
873 for (rel = relocs; rel < rel_end; rel++)
874 {
875 unsigned int r_type;
876 unsigned long r_symndx;
877 struct elf_link_hash_entry *h;
878
879 r_symndx = ELF32_R_SYM (rel->r_info);
880 r_type = ELF32_R_TYPE (rel->r_info);
881
882 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
883 {
884 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
885 bfd_archive_filename (abfd),
886 r_symndx);
887 return FALSE;
888 }
889
890 if (r_symndx < symtab_hdr->sh_info)
891 h = NULL;
892 else
893 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
894
895 /* Compatibility with old R_SPARC_REV32 reloc conflicting
896 with R_SPARC_TLS_GD_HI22. */
897 if (! checked_tlsgd)
898 switch (r_type)
899 {
900 case R_SPARC_TLS_GD_HI22:
901 {
902 const Elf_Internal_Rela *relt;
903
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)
908 break;
909 checked_tlsgd = TRUE;
910 elf32_sparc_tdata (abfd)->has_tlsgd = relt < rel_end;
911 }
912 break;
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;
918 break;
919 }
920
921 r_type = elf32_sparc_tls_transition (info, abfd, r_type, h == NULL);
922 switch (r_type)
923 {
924 case R_SPARC_TLS_LDM_HI22:
925 case R_SPARC_TLS_LDM_LO10:
926 htab->tls_ldm_got.refcount += 1;
927 break;
928
929 case R_SPARC_TLS_LE_HIX22:
930 case R_SPARC_TLS_LE_LOX10:
931 if (info->shared)
932 goto r_sparc_plt32;
933 break;
934
935 case R_SPARC_TLS_IE_HI22:
936 case R_SPARC_TLS_IE_LO10:
937 if (info->shared)
938 info->flags |= DF_STATIC_TLS;
939 /* Fall through */
940
941 case R_SPARC_GOT10:
942 case R_SPARC_GOT13:
943 case R_SPARC_GOT22:
944 case R_SPARC_TLS_GD_HI22:
945 case R_SPARC_TLS_GD_LO10:
946 /* This symbol requires a global offset table entry. */
947 {
948 int tls_type, old_tls_type;
949
950 switch (r_type)
951 {
952 default:
953 case R_SPARC_GOT10:
954 case R_SPARC_GOT13:
955 case R_SPARC_GOT22:
956 tls_type = GOT_NORMAL;
957 break;
958 case R_SPARC_TLS_GD_HI22:
959 case R_SPARC_TLS_GD_LO10:
960 tls_type = GOT_TLS_GD;
961 break;
962 case R_SPARC_TLS_IE_HI22:
963 case R_SPARC_TLS_IE_LO10:
964 tls_type = GOT_TLS_IE;
965 break;
966 }
967
968 if (h != NULL)
969 {
970 h->got.refcount += 1;
971 old_tls_type = elf32_sparc_hash_entry(h)->tls_type;
972 }
973 else
974 {
975 bfd_signed_vma *local_got_refcounts;
976
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)
980 {
981 bfd_size_type size;
982
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)
988 return FALSE;
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);
992 }
993 local_got_refcounts[r_symndx] += 1;
994 old_tls_type = elf32_sparc_local_got_tls_type (abfd) [r_symndx];
995 }
996
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))
1002 {
1003 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1004 tls_type = old_tls_type;
1005 else
1006 {
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>");
1011 return FALSE;
1012 }
1013 }
1014
1015 if (old_tls_type != tls_type)
1016 {
1017 if (h != NULL)
1018 elf32_sparc_hash_entry (h)->tls_type = tls_type;
1019 else
1020 elf32_sparc_local_got_tls_type (abfd) [r_symndx] = tls_type;
1021 }
1022 }
1023
1024 if (htab->elf.dynobj == NULL)
1025 htab->elf.dynobj = abfd;
1026 if (!create_got_section (htab->elf.dynobj, info))
1027 return FALSE;
1028 break;
1029
1030 case R_SPARC_TLS_GD_CALL:
1031 case R_SPARC_TLS_LDM_CALL:
1032 if (info->shared)
1033 {
1034 /* These are basically R_SPARC_TLS_WPLT30 relocs against
1035 __tls_get_addr. */
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,
1040 NULL, FALSE, FALSE,
1041 &bh))
1042 return FALSE;
1043 h = (struct elf_link_hash_entry *) bh;
1044 }
1045 else
1046 break;
1047 /* Fall through */
1048
1049 case R_SPARC_PLT32:
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. */
1056
1057 if (h == NULL)
1058 {
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
1062 it as WDISP30. */
1063 if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1064 goto r_sparc_plt32;
1065 break;
1066 }
1067
1068 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1069
1070 if (ELF32_R_TYPE (rel->r_info) == R_SPARC_PLT32)
1071 goto r_sparc_plt32;
1072 h->plt.refcount += 1;
1073 break;
1074
1075 case R_SPARC_PC10:
1076 case R_SPARC_PC22:
1077 if (h != NULL)
1078 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1079
1080 if (h != NULL
1081 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1082 break;
1083 /* Fall through. */
1084
1085 case R_SPARC_DISP8:
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:
1092 case R_SPARC_8:
1093 case R_SPARC_16:
1094 case R_SPARC_32:
1095 case R_SPARC_HI22:
1096 case R_SPARC_22:
1097 case R_SPARC_13:
1098 case R_SPARC_LO10:
1099 case R_SPARC_UA16:
1100 case R_SPARC_UA32:
1101 if (h != NULL)
1102 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
1103
1104 r_sparc_plt32:
1105 if (h != NULL && !info->shared)
1106 {
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;
1110 }
1111
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
1127 symbol local.
1128
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
1132 symbol. */
1133 if ((info->shared
1134 && (sec->flags & SEC_ALLOC) != 0
1135 && (! _bfd_sparc_elf_howto_table[r_type].pc_relative
1136 || (h != NULL
1137 && (! info->symbolic
1138 || h->root.type == bfd_link_hash_defweak
1139 || (h->elf_link_hash_flags
1140 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1141 || (!info->shared
1142 && (sec->flags & SEC_ALLOC) != 0
1143 && h != NULL
1144 && (h->root.type == bfd_link_hash_defweak
1145 || (h->elf_link_hash_flags
1146 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
1147 {
1148 struct elf32_sparc_dyn_relocs *p;
1149 struct elf32_sparc_dyn_relocs **head;
1150
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. */
1154 if (sreloc == NULL)
1155 {
1156 const char *name;
1157 bfd *dynobj;
1158
1159 name = (bfd_elf_string_from_elf_section
1160 (abfd,
1161 elf_elfheader (abfd)->e_shstrndx,
1162 elf_section_data (sec)->rel_hdr.sh_name));
1163 if (name == NULL)
1164 return FALSE;
1165
1166 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1167 && strcmp (bfd_get_section_name (abfd, sec),
1168 name + 5) == 0);
1169
1170 if (htab->elf.dynobj == NULL)
1171 htab->elf.dynobj = abfd;
1172 dynobj = htab->elf.dynobj;
1173
1174 sreloc = bfd_get_section_by_name (dynobj, name);
1175 if (sreloc == NULL)
1176 {
1177 flagword flags;
1178
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;
1184 if (sreloc == NULL
1185 || ! bfd_set_section_flags (dynobj, sreloc, flags)
1186 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
1187 return FALSE;
1188 }
1189 elf_section_data (sec)->sreloc = sreloc;
1190 }
1191
1192 /* If this is a global symbol, we count the number of
1193 relocations we need for this symbol. */
1194 if (h != NULL)
1195 head = &((struct elf32_sparc_link_hash_entry *) h)->dyn_relocs;
1196 else
1197 {
1198 /* Track dynamic relocs needed for local syms too.
1199 We really need local syms available to do this
1200 easily. Oh well. */
1201
1202 asection *s;
1203 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1204 sec, r_symndx);
1205 if (s == NULL)
1206 return FALSE;
1207
1208 head = ((struct elf32_sparc_dyn_relocs **)
1209 &elf_section_data (s)->local_dynrel);
1210 }
1211
1212 p = *head;
1213 if (p == NULL || p->sec != sec)
1214 {
1215 bfd_size_type amt = sizeof *p;
1216 p = ((struct elf32_sparc_dyn_relocs *)
1217 bfd_alloc (htab->elf.dynobj, amt));
1218 if (p == NULL)
1219 return FALSE;
1220 p->next = *head;
1221 *head = p;
1222 p->sec = sec;
1223 p->count = 0;
1224 p->pc_count = 0;
1225 }
1226
1227 p->count += 1;
1228 if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1229 p->pc_count += 1;
1230 }
1231
1232 break;
1233
1234 case R_SPARC_GNU_VTINHERIT:
1235 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1236 return FALSE;
1237 break;
1238
1239 case R_SPARC_GNU_VTENTRY:
1240 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1241 return FALSE;
1242 break;
1243
1244 default:
1245 break;
1246 }
1247 }
1248
1249 return TRUE;
1250 }
1251
1252 static asection *
1253 elf32_sparc_gc_mark_hook (sec, info, rel, h, sym)
1254 asection *sec;
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;
1259 {
1260 if (h != NULL)
1261 {
1262 switch (ELF32_R_TYPE (rel->r_info))
1263 {
1264 case R_SPARC_GNU_VTINHERIT:
1265 case R_SPARC_GNU_VTENTRY:
1266 break;
1267
1268 default:
1269 switch (h->root.type)
1270 {
1271 case bfd_link_hash_defined:
1272 case bfd_link_hash_defweak:
1273 return h->root.u.def.section;
1274
1275 case bfd_link_hash_common:
1276 return h->root.u.c.p->section;
1277
1278 default:
1279 break;
1280 }
1281 }
1282 }
1283 else
1284 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
1285
1286 return NULL;
1287 }
1288
1289 /* Update the got entry reference counts for the section being removed. */
1290 static bfd_boolean
1291 elf32_sparc_gc_sweep_hook (abfd, info, sec, relocs)
1292 bfd *abfd;
1293 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1294 asection *sec;
1295 const Elf_Internal_Rela *relocs;
1296 {
1297
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;
1303 int r_type;
1304 struct elf_link_hash_entry *h;
1305
1306 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1307 sym_hashes = elf_sym_hashes (abfd);
1308 local_got_refcounts = elf_local_got_refcounts (abfd);
1309
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)))
1316 {
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;
1321 break;
1322
1323 case R_SPARC_TLS_LE_HIX22:
1324 case R_SPARC_TLS_LE_LOX10:
1325 if (info->shared)
1326 goto r_sparc_plt32;
1327 break;
1328
1329 case R_SPARC_PC10:
1330 case R_SPARC_PC22:
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)
1335 break;
1336 /* Fall through. */
1337
1338 case R_SPARC_DISP8:
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:
1345 case R_SPARC_8:
1346 case R_SPARC_16:
1347 case R_SPARC_32:
1348 case R_SPARC_HI22:
1349 case R_SPARC_22:
1350 case R_SPARC_13:
1351 case R_SPARC_LO10:
1352 case R_SPARC_UA16:
1353 case R_SPARC_UA32:
1354 r_sparc_plt32:
1355 r_symndx = ELF32_R_SYM (rel->r_info);
1356 if (r_symndx >= symtab_hdr->sh_info)
1357 {
1358 struct elf32_sparc_link_hash_entry *eh;
1359 struct elf32_sparc_dyn_relocs **pp;
1360 struct elf32_sparc_dyn_relocs *p;
1361
1362 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1363
1364 if (! info->shared)
1365 --h->plt.refcount;
1366
1367 eh = (struct elf32_sparc_link_hash_entry *) h;
1368
1369 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1370 if (p->sec == sec)
1371 {
1372 if (_bfd_sparc_elf_howto_table[r_type].pc_relative)
1373 p->pc_count -= 1;
1374 p->count -= 1;
1375 if (p->count == 0)
1376 *pp = p->next;
1377 break;
1378 }
1379 }
1380 break;
1381
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:
1386 case R_SPARC_GOT10:
1387 case R_SPARC_GOT13:
1388 case R_SPARC_GOT22:
1389 r_symndx = ELF32_R_SYM (rel->r_info);
1390 if (r_symndx >= symtab_hdr->sh_info)
1391 {
1392 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1393 if (h->got.refcount > 0)
1394 h->got.refcount--;
1395 }
1396 else
1397 {
1398 if (local_got_refcounts[r_symndx] > 0)
1399 local_got_refcounts[r_symndx]--;
1400 }
1401 break;
1402
1403 case R_SPARC_PLT32:
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)
1410 {
1411 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1412 if (h->plt.refcount > 0)
1413 h->plt.refcount--;
1414 }
1415 if (r_type == R_SPARC_PLT32)
1416 goto r_sparc_plt32;
1417 break;
1418
1419 default:
1420 break;
1421 }
1422
1423 return TRUE;
1424 }
1425
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
1430 understand. */
1431
1432 static bfd_boolean
1433 elf32_sparc_adjust_dynamic_symbol (info, h)
1434 struct bfd_link_info *info;
1435 struct elf_link_hash_entry *h;
1436 {
1437 struct elf32_sparc_link_hash_table *htab;
1438 struct elf32_sparc_link_hash_entry * eh;
1439 struct elf32_sparc_dyn_relocs *p;
1440 asection *s;
1441 unsigned int power_of_two;
1442
1443 htab = elf32_sparc_hash_table (info);
1444
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)));
1455
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
1462 STT_FUNC. */
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))
1469 {
1470 if (h->plt.refcount <= 0
1471 || (! info->shared
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))
1476 {
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;
1484 }
1485
1486 return TRUE;
1487 }
1488 else
1489 h->plt.offset = (bfd_vma) -1;
1490
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)
1495 {
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;
1500 return TRUE;
1501 }
1502
1503 /* This is a reference to a symbol defined by a dynamic object which
1504 is not a function. */
1505
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. */
1510 if (info->shared)
1511 return TRUE;
1512
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)
1516 return TRUE;
1517
1518 eh = (struct elf32_sparc_link_hash_entry *) h;
1519 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1520 {
1521 s = p->sec->output_section;
1522 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1523 break;
1524 }
1525
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. */
1528 if (p == NULL)
1529 {
1530 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
1531 return TRUE;
1532 }
1533
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. */
1543
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)
1549 {
1550 htab->srelbss->_raw_size += sizeof (Elf32_External_Rela);
1551 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1552 }
1553
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)
1558 power_of_two = 3;
1559
1560 /* Apply the required alignment. */
1561 s = htab->sdynbss;
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))
1565 {
1566 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1567 return FALSE;
1568 }
1569
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;
1573
1574 /* Increment the section size to make room for the symbol. */
1575 s->_raw_size += h->size;
1576
1577 return TRUE;
1578 }
1579
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) \
1585 ((DYN) \
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))
1590
1591 /* Allocate space in .plt, .got and associated reloc sections for
1592 dynamic relocs. */
1593
1594 static bfd_boolean
1595 allocate_dynrelocs (h, inf)
1596 struct elf_link_hash_entry *h;
1597 PTR inf;
1598 {
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;
1603
1604 if (h->root.type == bfd_link_hash_indirect)
1605 return TRUE;
1606
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;
1612
1613 info = (struct bfd_link_info *) inf;
1614 htab = elf32_sparc_hash_table (info);
1615
1616 if (htab->elf.dynamic_sections_created
1617 && h->plt.refcount > 0)
1618 {
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)
1623 {
1624 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1625 return FALSE;
1626 }
1627
1628 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1629 {
1630 asection *s = htab->splt;
1631
1632 /* The first four entries in .plt are reserved. */
1633 if (s->_raw_size == 0)
1634 s->_raw_size = 4 * PLT_ENTRY_SIZE;
1635
1636 /* The procedure linkage table has a maximum size. */
1637 if (s->_raw_size >= 0x400000)
1638 {
1639 bfd_set_error (bfd_error_bad_value);
1640 return FALSE;
1641 }
1642
1643 h->plt.offset = s->_raw_size;
1644
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. */
1650 if (! info->shared
1651 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1652 {
1653 h->root.u.def.section = s;
1654 h->root.u.def.value = h->plt.offset;
1655 }
1656
1657 /* Make room for this entry. */
1658 s->_raw_size += PLT_ENTRY_SIZE;
1659
1660 /* We also need to make an entry in the .rela.plt section. */
1661 htab->srelplt->_raw_size += sizeof (Elf32_External_Rela);
1662 }
1663 else
1664 {
1665 h->plt.offset = (bfd_vma) -1;
1666 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1667 }
1668 }
1669 else
1670 {
1671 h->plt.offset = (bfd_vma) -1;
1672 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1673 }
1674
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
1678 && !info->shared
1679 && h->dynindx == -1
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)
1683 {
1684 asection *s;
1685 bfd_boolean dyn;
1686 int tls_type = elf32_sparc_hash_entry(h)->tls_type;
1687
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)
1692 {
1693 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1694 return FALSE;
1695 }
1696
1697 s = htab->sgot;
1698 h->got.offset = s->_raw_size;
1699 s->_raw_size += 4;
1700 /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots. */
1701 if (tls_type == GOT_TLS_GD)
1702 s->_raw_size += 4;
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
1706 global. */
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);
1714 }
1715 else
1716 h->got.offset = (bfd_vma) -1;
1717
1718 eh = (struct elf32_sparc_link_hash_entry *) h;
1719 if (eh->dyn_relocs == NULL)
1720 return TRUE;
1721
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. */
1727
1728 if (info->shared)
1729 {
1730 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1731 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1732 || info->symbolic))
1733 {
1734 struct elf32_sparc_dyn_relocs **pp;
1735
1736 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1737 {
1738 p->count -= p->pc_count;
1739 p->pc_count = 0;
1740 if (p->count == 0)
1741 *pp = p->next;
1742 else
1743 pp = &p->next;
1744 }
1745 }
1746 }
1747 else
1748 {
1749 /* For the non-shared case, discard space for relocs against
1750 symbols which turn out to need copy relocs or are not
1751 dynamic. */
1752
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))))
1759 {
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)
1764 {
1765 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1766 return FALSE;
1767 }
1768
1769 /* If that succeeded, we know we'll be keeping all the
1770 relocs. */
1771 if (h->dynindx != -1)
1772 goto keep;
1773 }
1774
1775 eh->dyn_relocs = NULL;
1776
1777 keep: ;
1778 }
1779
1780 /* Finally, allocate space. */
1781 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1782 {
1783 asection *sreloc = elf_section_data (p->sec)->sreloc;
1784 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rela);
1785 }
1786
1787 return TRUE;
1788 }
1789
1790 /* Find any dynamic relocs that apply to read-only sections. */
1791
1792 static bfd_boolean
1793 readonly_dynrelocs (h, inf)
1794 struct elf_link_hash_entry *h;
1795 PTR inf;
1796 {
1797 struct elf32_sparc_link_hash_entry *eh;
1798 struct elf32_sparc_dyn_relocs *p;
1799
1800 if (h->root.type == bfd_link_hash_warning)
1801 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1802
1803 eh = (struct elf32_sparc_link_hash_entry *) h;
1804 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1805 {
1806 asection *s = p->sec->output_section;
1807
1808 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1809 {
1810 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1811
1812 info->flags |= DF_TEXTREL;
1813
1814 /* Not an error, just cut short the traversal. */
1815 return FALSE;
1816 }
1817 }
1818 return TRUE;
1819 }
1820
1821 /* Set the sizes of the dynamic sections. */
1822
1823 static bfd_boolean
1824 elf32_sparc_size_dynamic_sections (output_bfd, info)
1825 bfd *output_bfd ATTRIBUTE_UNUSED;
1826 struct bfd_link_info *info;
1827 {
1828 struct elf32_sparc_link_hash_table *htab;
1829 bfd *dynobj;
1830 asection *s;
1831 bfd *ibfd;
1832
1833 htab = elf32_sparc_hash_table (info);
1834 dynobj = htab->elf.dynobj;
1835 BFD_ASSERT (dynobj != NULL);
1836
1837 if (elf_hash_table (info)->dynamic_sections_created)
1838 {
1839 /* Set the contents of the .interp section to the interpreter. */
1840 if (! info->shared)
1841 {
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;
1846 }
1847 }
1848
1849 /* Set up .got offsets for local syms, and space for local dynamic
1850 relocs. */
1851 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1852 {
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;
1858 asection *srel;
1859
1860 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1861 continue;
1862
1863 for (s = ibfd->sections; s != NULL; s = s->next)
1864 {
1865 struct elf32_sparc_dyn_relocs *p;
1866
1867 for (p = *((struct elf32_sparc_dyn_relocs **)
1868 &elf_section_data (s)->local_dynrel);
1869 p != NULL;
1870 p = p->next)
1871 {
1872 if (!bfd_is_abs_section (p->sec)
1873 && bfd_is_abs_section (p->sec->output_section))
1874 {
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
1878 the relocs too. */
1879 }
1880 else if (p->count != 0)
1881 {
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;
1886 }
1887 }
1888 }
1889
1890 local_got = elf_local_got_refcounts (ibfd);
1891 if (!local_got)
1892 continue;
1893
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);
1898 s = htab->sgot;
1899 srel = htab->srelgot;
1900 for (; local_got < end_local_got; ++local_got, ++local_tls_type)
1901 {
1902 if (*local_got > 0)
1903 {
1904 *local_got = s->_raw_size;
1905 s->_raw_size += 4;
1906 if (*local_tls_type == GOT_TLS_GD)
1907 s->_raw_size += 4;
1908 if (info->shared
1909 || *local_tls_type == GOT_TLS_GD
1910 || *local_tls_type == GOT_TLS_IE)
1911 srel->_raw_size += sizeof (Elf32_External_Rela);
1912 }
1913 else
1914 *local_got = (bfd_vma) -1;
1915 }
1916 }
1917
1918 if (htab->tls_ldm_got.refcount > 0)
1919 {
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);
1925 }
1926 else
1927 htab->tls_ldm_got.offset = -1;
1928
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);
1932
1933 if (elf_hash_table (info)->dynamic_sections_created)
1934 {
1935 /* Make space for the trailing nop in .plt. */
1936 if (htab->splt->_raw_size > 0)
1937 htab->splt->_raw_size += 4;
1938
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;
1945 }
1946
1947 /* The check_relocs and adjust_dynamic_symbol entry points have
1948 determined the sizes of the various dynamic sections. Allocate
1949 memory for them. */
1950 for (s = dynobj->sections; s != NULL; s = s->next)
1951 {
1952 const char *name;
1953 bfd_boolean strip = FALSE;
1954
1955 if ((s->flags & SEC_LINKER_CREATED) == 0)
1956 continue;
1957
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);
1961
1962 if (strncmp (name, ".rela", 5) == 0)
1963 {
1964 if (s->_raw_size == 0)
1965 {
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. */
1975 strip = TRUE;
1976 }
1977 else
1978 {
1979 /* We use the reloc_count field as a counter if we need
1980 to copy relocs into the output file. */
1981 s->reloc_count = 0;
1982 }
1983 }
1984 else if (s != htab->splt && s != htab->sgot)
1985 {
1986 /* It's not one of our sections, so don't allocate space. */
1987 continue;
1988 }
1989
1990 if (strip)
1991 {
1992 _bfd_strip_section_from_output (info, s);
1993 continue;
1994 }
1995
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)
2004 return FALSE;
2005 }
2006
2007 if (elf_hash_table (info)->dynamic_sections_created)
2008 {
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))
2016
2017 if (!info->shared)
2018 {
2019 if (!add_dynamic_entry (DT_DEBUG, 0))
2020 return FALSE;
2021 }
2022
2023 if (htab->srelplt->_raw_size != 0)
2024 {
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))
2029 return FALSE;
2030 }
2031
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)))
2035 return FALSE;
2036
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,
2041 (PTR) info);
2042
2043 if (info->flags & DF_TEXTREL)
2044 {
2045 if (!add_dynamic_entry (DT_TEXTREL, 0))
2046 return FALSE;
2047 }
2048 }
2049 #undef add_dynamic_entry
2050
2051 return TRUE;
2052 }
2053
2054 struct elf32_sparc_section_data
2055 {
2056 struct bfd_elf_section_data elf;
2057 unsigned int do_relax;
2058 };
2059
2060 #define sec_do_relax(sec) \
2061 ((struct elf32_sparc_section_data *) elf_section_data (sec))->do_relax
2062
2063 static bfd_boolean
2064 elf32_sparc_new_section_hook (abfd, sec)
2065 bfd *abfd;
2066 asection *sec;
2067 {
2068 struct elf32_sparc_section_data *sdata;
2069 bfd_size_type amt = sizeof (*sdata);
2070
2071 sdata = (struct elf32_sparc_section_data *) bfd_zalloc (abfd, amt);
2072 if (sdata == NULL)
2073 return FALSE;
2074 sec->used_by_bfd = (PTR) sdata;
2075
2076 return _bfd_elf_new_section_hook (abfd, sec);
2077 }
2078
2079 static bfd_boolean
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;
2084 bfd_boolean *again;
2085 {
2086 *again = FALSE;
2087 sec_do_relax (section) = 1;
2088 return TRUE;
2089 }
2090
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. */
2094
2095 static bfd_vma
2096 dtpoff_base (info)
2097 struct bfd_link_info *info;
2098 {
2099 /* If tls_segment is NULL, we should have signalled an error already. */
2100 if (elf_hash_table (info)->tls_segment == NULL)
2101 return 0;
2102 return elf_hash_table (info)->tls_segment->start;
2103 }
2104
2105 /* Return the relocation value for @tpoff relocation
2106 if STT_TLS virtual address is ADDRESS. */
2107
2108 static bfd_vma
2109 tpoff (info, address)
2110 struct bfd_link_info *info;
2111 bfd_vma address;
2112 {
2113 struct elf_link_tls_segment *tls_segment
2114 = elf_hash_table (info)->tls_segment;
2115
2116 /* If tls_segment is NULL, we should have signalled an error already. */
2117 if (tls_segment == NULL)
2118 return 0;
2119 return -(align_power (tls_segment->size, tls_segment->align)
2120 + tls_segment->start - address);
2121 }
2122
2123 /* Relocate a SPARC ELF section. */
2124
2125 static bfd_boolean
2126 elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
2127 contents, relocs, local_syms, local_sections)
2128 bfd *output_bfd;
2129 struct bfd_link_info *info;
2130 bfd *input_bfd;
2131 asection *input_section;
2132 bfd_byte *contents;
2133 Elf_Internal_Rela *relocs;
2134 Elf_Internal_Sym *local_syms;
2135 asection **local_sections;
2136 {
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;
2141 bfd_vma got_base;
2142 asection *sreloc;
2143 Elf_Internal_Rela *rel;
2144 Elf_Internal_Rela *relend;
2145
2146 if (info->relocateable)
2147 return TRUE;
2148
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);
2153
2154 if (elf_hash_table (info)->hgot == NULL)
2155 got_base = 0;
2156 else
2157 got_base = elf_hash_table (info)->hgot->root.u.def.value;
2158
2159 sreloc = elf_section_data (input_section)->sreloc;
2160
2161 rel = relocs;
2162 relend = relocs + input_section->reloc_count;
2163 for (; rel < relend; rel++)
2164 {
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;
2170 asection *sec;
2171 bfd_vma relocation, off;
2172 bfd_reloc_status_type r;
2173 bfd_boolean is_plt = FALSE;
2174 bfd_boolean unresolved_reloc;
2175
2176 r_type = ELF32_R_TYPE (rel->r_info);
2177
2178 if (r_type == R_SPARC_GNU_VTINHERIT
2179 || r_type == R_SPARC_GNU_VTENTRY)
2180 continue;
2181
2182 if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2183 {
2184 bfd_set_error (bfd_error_bad_value);
2185 return FALSE;
2186 }
2187 howto = _bfd_sparc_elf_howto_table + r_type;
2188
2189 /* This is a final link. */
2190 r_symndx = ELF32_R_SYM (rel->r_info);
2191 h = NULL;
2192 sym = NULL;
2193 sec = NULL;
2194 unresolved_reloc = FALSE;
2195 if (r_symndx < symtab_hdr->sh_info)
2196 {
2197 sym = local_syms + r_symndx;
2198 sec = local_sections[r_symndx];
2199 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
2200 }
2201 else
2202 {
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;
2207
2208 relocation = 0;
2209 if (h->root.type == bfd_link_hash_defined
2210 || h->root.type == bfd_link_hash_defweak)
2211 {
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
2217 library. */
2218 unresolved_reloc = TRUE;
2219 else
2220 relocation = (h->root.u.def.value
2221 + sec->output_section->vma
2222 + sec->output_offset);
2223 }
2224 else if (h->root.type == bfd_link_hash_undefweak)
2225 ;
2226 else if (info->shared
2227 && (!info->symbolic || info->allow_shlib_undefined)
2228 && !info->no_undefined
2229 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2230 ;
2231 else
2232 {
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)))))
2238 return FALSE;
2239 }
2240 }
2241
2242 switch (r_type)
2243 {
2244 case R_SPARC_GOT10:
2245 case R_SPARC_GOT13:
2246 case R_SPARC_GOT22:
2247 /* Relocation is to the entry for this symbol in the global
2248 offset table. */
2249 if (htab->sgot == NULL)
2250 abort ();
2251
2252 if (h != NULL)
2253 {
2254 bfd_boolean dyn;
2255
2256 off = h->got.offset;
2257 BFD_ASSERT (off != (bfd_vma) -1);
2258 dyn = elf_hash_table (info)->dynamic_sections_created;
2259
2260 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
2261 || (info->shared
2262 && (info->symbolic
2263 || h->dynindx == -1
2264 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2265 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
2266 {
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.
2275
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. */
2279 if ((off & 1) != 0)
2280 off &= ~1;
2281 else
2282 {
2283 bfd_put_32 (output_bfd, relocation,
2284 htab->sgot->contents + off);
2285 h->got.offset |= 1;
2286 }
2287 }
2288 else
2289 unresolved_reloc = FALSE;
2290 }
2291 else
2292 {
2293 BFD_ASSERT (local_got_offsets != NULL
2294 && local_got_offsets[r_symndx] != (bfd_vma) -1);
2295
2296 off = local_got_offsets[r_symndx];
2297
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. */
2301 if ((off & 1) != 0)
2302 off &= ~1;
2303 else
2304 {
2305
2306 if (info->shared)
2307 {
2308 asection *s;
2309 Elf_Internal_Rela outrel;
2310 bfd_byte *loc;
2311
2312 /* We need to generate a R_SPARC_RELATIVE reloc
2313 for the dynamic linker. */
2314 s = htab->srelgot;
2315 BFD_ASSERT (s != NULL);
2316
2317 outrel.r_offset = (htab->sgot->output_section->vma
2318 + htab->sgot->output_offset
2319 + off);
2320 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2321 outrel.r_addend = relocation;
2322 relocation = 0;
2323 loc = s->contents;
2324 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
2325 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2326 }
2327
2328 bfd_put_32 (output_bfd, relocation,
2329 htab->sgot->contents + off);
2330 local_got_offsets[r_symndx] |= 1;
2331 }
2332 }
2333 relocation = htab->sgot->output_offset + off - got_base;
2334 break;
2335
2336 case R_SPARC_PLT32:
2337 if (h == NULL || h->plt.offset == (bfd_vma) -1)
2338 {
2339 r_type = R_SPARC_32;
2340 goto r_sparc_plt32;
2341 }
2342 /* Fall through. */
2343 case R_SPARC_WPLT30:
2344 r_sparc_wplt30:
2345 /* Relocation is to the entry for this symbol in the
2346 procedure linkage table. */
2347
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
2351 WDISP30. */
2352 if (h == NULL)
2353 break;
2354
2355 if (h->plt.offset == (bfd_vma) -1)
2356 {
2357 /* We didn't make a PLT entry for this symbol. This
2358 happens when statically linking PIC code, or when
2359 using -Bsymbolic. */
2360 break;
2361 }
2362
2363 if (htab->splt == NULL)
2364 abort ();
2365
2366 relocation = (htab->splt->output_section->vma
2367 + htab->splt->output_offset
2368 + h->plt.offset);
2369 unresolved_reloc = FALSE;
2370 if (r_type == R_SPARC_PLT32)
2371 {
2372 r_type = R_SPARC_32;
2373 is_plt = TRUE;
2374 goto r_sparc_plt32;
2375 }
2376 break;
2377
2378 case R_SPARC_PC10:
2379 case R_SPARC_PC22:
2380 if (h != NULL
2381 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2382 break;
2383 /* Fall through. */
2384 case R_SPARC_DISP8:
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:
2391 case R_SPARC_8:
2392 case R_SPARC_16:
2393 case R_SPARC_32:
2394 case R_SPARC_HI22:
2395 case R_SPARC_22:
2396 case R_SPARC_13:
2397 case R_SPARC_LO10:
2398 case R_SPARC_UA16:
2399 case R_SPARC_UA32:
2400 r_sparc_plt32:
2401 /* r_symndx will be zero only for relocs against symbols
2402 from removed linkonce sections, or sections discarded by
2403 a linker script. */
2404 if (r_symndx == 0
2405 || (input_section->flags & SEC_ALLOC) == 0)
2406 break;
2407
2408 if ((info->shared
2409 && (! howto->pc_relative
2410 || (h != NULL
2411 && h->dynindx != -1
2412 && (! info->symbolic
2413 || (h->elf_link_hash_flags
2414 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2415 || (!info->shared
2416 && h != NULL
2417 && h->dynindx != -1
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)))
2425 {
2426 Elf_Internal_Rela outrel;
2427 bfd_byte *loc;
2428 bfd_boolean skip, relocate = FALSE;
2429
2430 /* When generating a shared object, these relocations
2431 are copied into the output file to be resolved at run
2432 time. */
2433
2434 BFD_ASSERT (sreloc != NULL);
2435
2436 skip = FALSE;
2437
2438 outrel.r_offset =
2439 _bfd_elf_section_offset (output_bfd, info, input_section,
2440 rel->r_offset);
2441 if (outrel.r_offset == (bfd_vma) -1)
2442 skip = TRUE;
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);
2447
2448 /* Optimize unaligned reloc usage now that we know where
2449 it finally resides. */
2450 switch (r_type)
2451 {
2452 case R_SPARC_16:
2453 if (outrel.r_offset & 1)
2454 r_type = R_SPARC_UA16;
2455 break;
2456 case R_SPARC_UA16:
2457 if (!(outrel.r_offset & 1))
2458 r_type = R_SPARC_16;
2459 break;
2460 case R_SPARC_32:
2461 if (outrel.r_offset & 3)
2462 r_type = R_SPARC_UA32;
2463 break;
2464 case R_SPARC_UA32:
2465 if (!(outrel.r_offset & 3))
2466 r_type = R_SPARC_32;
2467 break;
2468 case R_SPARC_DISP8:
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
2475 e.g. i386 has. */
2476 if (h->dynindx == -1)
2477 skip = TRUE, relocate = TRUE;
2478 break;
2479 }
2480
2481 if (skip)
2482 memset (&outrel, 0, sizeof outrel);
2483 /* h->dynindx may be -1 if the symbol was marked to
2484 become local. */
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))
2489 {
2490 BFD_ASSERT (h->dynindx != -1);
2491 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2492 outrel.r_addend = rel->r_addend;
2493 }
2494 else
2495 {
2496 if (r_type == R_SPARC_32)
2497 {
2498 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2499 outrel.r_addend = relocation + rel->r_addend;
2500 }
2501 else
2502 {
2503 long indx;
2504
2505 if (is_plt)
2506 sec = htab->splt;
2507 else if (h == NULL)
2508 sec = local_sections[r_symndx];
2509 else
2510 {
2511 BFD_ASSERT (h->root.type == bfd_link_hash_defined
2512 || (h->root.type
2513 == bfd_link_hash_defweak));
2514 sec = h->root.u.def.section;
2515 }
2516 if (sec != NULL && bfd_is_abs_section (sec))
2517 indx = 0;
2518 else if (sec == NULL || sec->owner == NULL)
2519 {
2520 bfd_set_error (bfd_error_bad_value);
2521 return FALSE;
2522 }
2523 else
2524 {
2525 asection *osec;
2526
2527 osec = sec->output_section;
2528 indx = elf_section_data (osec)->dynindx;
2529
2530 /* FIXME: we really should be able to link non-pic
2531 shared libraries. */
2532 if (indx == 0)
2533 {
2534 BFD_FAIL ();
2535 (*_bfd_error_handler)
2536 (_("%s: probably compiled without -fPIC?"),
2537 bfd_archive_filename (input_bfd));
2538 bfd_set_error (bfd_error_bad_value);
2539 return FALSE;
2540 }
2541 }
2542
2543 outrel.r_info = ELF32_R_INFO (indx, r_type);
2544 outrel.r_addend = relocation + rel->r_addend;
2545 }
2546 }
2547
2548 loc = sreloc->contents;
2549 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2550 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2551
2552 /* This reloc will be computed at runtime, so there's no
2553 need to do anything now. */
2554 if (! relocate)
2555 continue;
2556 }
2557 break;
2558
2559 case R_SPARC_TLS_GD_HI22:
2560 if (! elf32_sparc_tdata (input_bfd)->has_tlsgd)
2561 {
2562 /* R_SPARC_REV32 used the same reloc number as
2563 R_SPARC_TLS_GD_HI22. */
2564 r_type = R_SPARC_REV32;
2565 break;
2566 }
2567 /* Fall through */
2568
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,
2573 h == NULL);
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];
2577 else if (h != NULL)
2578 {
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))
2582 {
2583 case R_SPARC_TLS_GD_HI22:
2584 case R_SPARC_TLS_IE_HI22:
2585 r_type = R_SPARC_TLS_LE_HIX22;
2586 break;
2587 default:
2588 r_type = R_SPARC_TLS_LE_LOX10;
2589 break;
2590 }
2591 }
2592 if (tls_type == GOT_TLS_IE)
2593 switch (r_type)
2594 {
2595 case R_SPARC_TLS_GD_HI22:
2596 r_type = R_SPARC_TLS_IE_HI22;
2597 break;
2598 case R_SPARC_TLS_GD_LO10:
2599 r_type = R_SPARC_TLS_IE_LO10;
2600 break;
2601 }
2602
2603 if (r_type == R_SPARC_TLS_LE_HIX22)
2604 {
2605 relocation = tpoff (info, relocation);
2606 break;
2607 }
2608 if (r_type == R_SPARC_TLS_LE_LOX10)
2609 {
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);
2615 break;
2616 }
2617
2618 if (h != NULL)
2619 {
2620 off = h->got.offset;
2621 h->got.offset |= 1;
2622 }
2623 else
2624 {
2625 BFD_ASSERT (local_got_offsets != NULL);
2626 off = local_got_offsets[r_symndx];
2627 local_got_offsets[r_symndx] |= 1;
2628 }
2629
2630 r_sparc_tlsldm:
2631 if (htab->sgot == NULL)
2632 abort ();
2633
2634 if ((off & 1) != 0)
2635 off &= ~1;
2636 else
2637 {
2638 Elf_Internal_Rela outrel;
2639 Elf32_External_Rela *loc;
2640 int dr_type, indx;
2641
2642 if (htab->srelgot == NULL)
2643 abort ();
2644
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;
2652 else
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);
2656 else
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,
2662 (bfd_byte *) loc);
2663
2664 if (r_type == R_SPARC_TLS_GD_HI22
2665 || r_type == R_SPARC_TLS_GD_LO10)
2666 {
2667 if (indx == 0)
2668 {
2669 BFD_ASSERT (! unresolved_reloc);
2670 bfd_put_32 (output_bfd,
2671 relocation - dtpoff_base (info),
2672 htab->sgot->contents + off + 4);
2673 }
2674 else
2675 {
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++;
2682 loc++;
2683 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2684 (bfd_byte *) loc);
2685 }
2686 }
2687 else if (dr_type == R_SPARC_TLS_DTPMOD32)
2688 {
2689 bfd_put_32 (output_bfd, 0,
2690 htab->sgot->contents + off + 4);
2691 }
2692 }
2693
2694 if (off >= (bfd_vma) -2)
2695 abort ();
2696
2697 relocation = htab->sgot->output_offset + off - got_base;
2698 unresolved_reloc = FALSE;
2699 howto = _bfd_sparc_elf_howto_table + r_type;
2700 break;
2701
2702 case R_SPARC_TLS_LDM_HI22:
2703 case R_SPARC_TLS_LDM_LO10:
2704 if (! info->shared)
2705 {
2706 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2707 continue;
2708 }
2709 off = htab->tls_ldm_got.offset;
2710 htab->tls_ldm_got.offset |= 1;
2711 goto r_sparc_tlsldm;
2712
2713 case R_SPARC_TLS_LDO_HIX22:
2714 case R_SPARC_TLS_LDO_LOX10:
2715 if (info->shared)
2716 relocation -= dtpoff_base (info);
2717 else
2718 relocation = tpoff (info, relocation);
2719 break;
2720
2721 case R_SPARC_TLS_LE_HIX22:
2722 case R_SPARC_TLS_LE_LOX10:
2723 if (info->shared)
2724 {
2725 Elf_Internal_Rela outrel;
2726 bfd_boolean skip, relocate = FALSE;
2727
2728 BFD_ASSERT (sreloc != NULL);
2729 skip = FALSE;
2730 outrel.r_offset =
2731 _bfd_elf_section_offset (output_bfd, info, input_section,
2732 rel->r_offset);
2733 if (outrel.r_offset == (bfd_vma) -1)
2734 skip = TRUE;
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);
2739 if (skip)
2740 memset (&outrel, 0, sizeof outrel);
2741 else
2742 {
2743 outrel.r_info = ELF32_R_INFO (0, r_type);
2744 outrel.r_addend = relocation - dtpoff_base (info)
2745 + rel->r_addend;
2746 }
2747
2748 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2749 (bfd_byte *) (((Elf32_External_Rela *)
2750 sreloc->contents)
2751 + sreloc->reloc_count));
2752 ++sreloc->reloc_count;
2753 continue;
2754 }
2755 relocation = tpoff (info, relocation);
2756 break;
2757
2758 case R_SPARC_TLS_LDM_CALL:
2759 if (! info->shared)
2760 {
2761 /* mov %g0, %o0 */
2762 bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
2763 continue;
2764 }
2765 /* Fall through */
2766
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];
2771 else if (h != NULL)
2772 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2773 if (! info->shared
2774 || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
2775 {
2776 bfd_vma insn;
2777
2778 if (!info->shared && (h == NULL || h->dynindx == -1))
2779 {
2780 /* GD -> LE */
2781 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2782 continue;
2783 }
2784
2785 /* GD -> IE */
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)
2793 {
2794 /* We have
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);
2806 rel++;
2807 continue;
2808 }
2809
2810 bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
2811 continue;
2812 }
2813
2814 h = (struct elf_link_hash_entry *)
2815 bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
2816 FALSE, TRUE);
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;
2821
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];
2826 else if (h != NULL)
2827 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2828 if (! info->shared || tls_type == GOT_TLS_IE)
2829 {
2830 /* add %reg1, %reg2, %reg3, %tgd_add(foo)
2831 changed into IE:
2832 ld [%reg1 + %reg2], %reg3, %tie_ld(foo)
2833 or LE:
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;
2838 else
2839 relocation = (insn & ~0x7c000) | 0x1c000;
2840 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2841 }
2842 continue;
2843
2844 case R_SPARC_TLS_LDM_ADD:
2845 if (! info->shared)
2846 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2847 continue;
2848
2849 case R_SPARC_TLS_LDO_ADD:
2850 if (! info->shared)
2851 {
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);
2856 }
2857 continue;
2858
2859 case R_SPARC_TLS_IE_LD:
2860 case R_SPARC_TLS_IE_LDX:
2861 if (! info->shared && (h == NULL || h->dynindx == -1))
2862 {
2863 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2864 int rs2 = insn & 0x1f;
2865 int rd = (insn >> 25) & 0x1f;
2866
2867 if (rs2 == rd)
2868 relocation = SPARC_NOP;
2869 else
2870 relocation = 0x80100000 | (insn & 0x3e00001f);
2871 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2872 }
2873 continue;
2874
2875 case R_SPARC_TLS_IE_ADD:
2876 /* Totally useless relocation. */
2877 continue;
2878
2879 case R_SPARC_TLS_DTPOFF32:
2880 relocation -= dtpoff_base (info);
2881 break;
2882
2883 default:
2884 break;
2885 }
2886
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);
2899
2900 r = bfd_reloc_continue;
2901 if (r_type == R_SPARC_WDISP16)
2902 {
2903 bfd_vma x;
2904
2905 relocation += rel->r_addend;
2906 relocation -= (input_section->output_section->vma
2907 + input_section->output_offset);
2908 relocation -= rel->r_offset;
2909
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);
2914
2915 if ((bfd_signed_vma) relocation < - 0x40000
2916 || (bfd_signed_vma) relocation > 0x3ffff)
2917 r = bfd_reloc_overflow;
2918 else
2919 r = bfd_reloc_ok;
2920 }
2921 else if (r_type == R_SPARC_REV32)
2922 {
2923 bfd_vma x;
2924
2925 relocation = relocation + rel->r_addend;
2926
2927 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2928 x = x + relocation;
2929 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
2930 r = bfd_reloc_ok;
2931 }
2932 else if (r_type == R_SPARC_TLS_LDO_HIX22
2933 || r_type == R_SPARC_TLS_LE_HIX22)
2934 {
2935 bfd_vma x;
2936
2937 relocation += rel->r_addend;
2938 relocation = relocation ^ 0xffffffff;
2939
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);
2943 r = bfd_reloc_ok;
2944 }
2945 else if (r_type == R_SPARC_TLS_LDO_LOX10
2946 || r_type == R_SPARC_TLS_LE_LOX10)
2947 {
2948 bfd_vma x;
2949
2950 relocation += rel->r_addend;
2951 relocation = (relocation & 0x3ff) | 0x1c00;
2952
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);
2956
2957 r = bfd_reloc_ok;
2958 }
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)
2962 {
2963 #define G0 0
2964 #define O7 15
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)
2972
2973 bfd_vma x, y;
2974
2975 /* If the instruction is a call with either:
2976 restore
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))
2984 {
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)
2989 && ((y & F3I(~0))
2990 || (y & RS2(~0)) != RS2(O7)))
2991 {
2992 bfd_vma reloc;
2993
2994 reloc = relocation + rel->r_addend - rel->r_offset;
2995 reloc -= (input_section->output_section->vma
2996 + input_section->output_offset);
2997
2998 /* Ensure the reloc fits into simm22. */
2999 if ((reloc & 3) == 0
3000 && ((reloc & ~(bfd_vma)0x7fffff) == 0
3001 || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
3002 {
3003 reloc >>= 2;
3004
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 */
3010 else
3011 x = INSN_BA | (reloc & 0x3fffff); /* ba */
3012 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3013 r = bfd_reloc_ok;
3014 if (rel->r_offset >= 4
3015 && (y & (0xffffffff ^ RS1(~0)))
3016 == (INSN_OR | RD(O7) | RS2(G0)))
3017 {
3018 bfd_vma z;
3019 unsigned int reg;
3020
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)))
3025 break;
3026
3027 /* The sequence was
3028 or %o7, %g0, %rN
3029 call foo
3030 or %rN, %g0, %o7
3031
3032 If call foo was replaced with ba, replace
3033 or %rN, %g0, %o7 with nop. */
3034
3035 reg = (y & RS1(~0)) >> 14;
3036 if (reg != ((z & RD(~0)) >> 25)
3037 || reg == G0 || reg == O7)
3038 break;
3039
3040 bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
3041 contents + rel->r_offset + 4);
3042 }
3043
3044 }
3045 }
3046 }
3047 }
3048
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);
3053
3054 if (r != bfd_reloc_ok)
3055 {
3056 switch (r)
3057 {
3058 default:
3059 case bfd_reloc_outofrange:
3060 abort ();
3061 case bfd_reloc_overflow:
3062 {
3063 const char *name;
3064
3065 if (h != NULL)
3066 name = h->root.root.string;
3067 else
3068 {
3069 name = bfd_elf_string_from_elf_section (input_bfd,
3070 symtab_hdr->sh_link,
3071 sym->st_name);
3072 if (name == NULL)
3073 return FALSE;
3074 if (*name == '\0')
3075 name = bfd_section_name (input_bfd, sec);
3076 }
3077 if (! ((*info->callbacks->reloc_overflow)
3078 (info, name, howto->name, (bfd_vma) 0,
3079 input_bfd, input_section, rel->r_offset)))
3080 return FALSE;
3081 }
3082 break;
3083 }
3084 }
3085 }
3086
3087 return TRUE;
3088 }
3089
3090 /* Finish up dynamic symbol handling. We set the contents of various
3091 dynamic sections here. */
3092
3093 static bfd_boolean
3094 elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
3095 bfd *output_bfd;
3096 struct bfd_link_info *info;
3097 struct elf_link_hash_entry *h;
3098 Elf_Internal_Sym *sym;
3099 {
3100 bfd *dynobj;
3101 struct elf32_sparc_link_hash_table *htab;
3102
3103 htab = elf32_sparc_hash_table (info);
3104 dynobj = htab->elf.dynobj;
3105
3106 if (h->plt.offset != (bfd_vma) -1)
3107 {
3108 asection *splt;
3109 asection *srela;
3110 Elf_Internal_Rela rela;
3111 bfd_byte *loc;
3112
3113 /* This symbol has an entry in the procedure linkage table. Set
3114 it up. */
3115
3116 BFD_ASSERT (h->dynindx != -1);
3117
3118 splt = htab->splt;
3119 srela = htab->srelplt;
3120 BFD_ASSERT (splt != NULL && srela != NULL);
3121
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,
3127 (PLT_ENTRY_WORD1
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);
3132
3133 /* Fill in the entry in the .rela.plt section. */
3134 rela.r_offset = (splt->output_section->vma
3135 + splt->output_offset
3136 + h->plt.offset);
3137 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
3138 rela.r_addend = 0;
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);
3142
3143 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3144 {
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)
3153 == 0)
3154 sym->st_value = 0;
3155 }
3156 }
3157
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)
3161 {
3162 asection *sgot;
3163 asection *srela;
3164 Elf_Internal_Rela rela;
3165 bfd_byte *loc;
3166
3167 /* This symbol has an entry in the global offset table. Set it
3168 up. */
3169
3170 sgot = htab->sgot;
3171 srela = htab->srelgot;
3172 BFD_ASSERT (sgot != NULL && srela != NULL);
3173
3174 rela.r_offset = (sgot->output_section->vma
3175 + sgot->output_offset
3176 + (h->got.offset &~ (bfd_vma) 1));
3177
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. */
3183 if (info->shared
3184 && (info->symbolic || h->dynindx == -1)
3185 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3186 {
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);
3192 }
3193 else
3194 {
3195 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
3196 rela.r_addend = 0;
3197 }
3198
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);
3204 }
3205
3206 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3207 {
3208 asection *s;
3209 Elf_Internal_Rela rela;
3210 bfd_byte *loc;
3211
3212 /* This symbols needs a copy reloc. Set it up. */
3213
3214 BFD_ASSERT (h->dynindx != -1);
3215
3216 s = bfd_get_section_by_name (h->root.u.def.section->owner,
3217 ".rela.bss");
3218 BFD_ASSERT (s != NULL);
3219
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);
3224 rela.r_addend = 0;
3225 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3226 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3227 }
3228
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;
3234
3235 return TRUE;
3236 }
3237
3238 /* Finish up the dynamic sections. */
3239
3240 static bfd_boolean
3241 elf32_sparc_finish_dynamic_sections (output_bfd, info)
3242 bfd *output_bfd;
3243 struct bfd_link_info *info;
3244 {
3245 bfd *dynobj;
3246 asection *sdyn;
3247 struct elf32_sparc_link_hash_table *htab;
3248
3249 htab = elf32_sparc_hash_table (info);
3250 dynobj = htab->elf.dynobj;
3251
3252 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3253
3254 if (elf_hash_table (info)->dynamic_sections_created)
3255 {
3256 asection *splt;
3257 Elf32_External_Dyn *dyncon, *dynconend;
3258
3259 splt = bfd_get_section_by_name (dynobj, ".plt");
3260 BFD_ASSERT (splt != NULL && sdyn != NULL);
3261
3262 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3263 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3264 for (; dyncon < dynconend; dyncon++)
3265 {
3266 Elf_Internal_Dyn dyn;
3267 const char *name;
3268 bfd_boolean size;
3269
3270 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3271
3272 switch (dyn.d_tag)
3273 {
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;
3278 }
3279
3280 if (name != NULL)
3281 {
3282 asection *s;
3283
3284 s = bfd_get_section_by_name (output_bfd, name);
3285 if (s == NULL)
3286 dyn.d_un.d_val = 0;
3287 else
3288 {
3289 if (! size)
3290 dyn.d_un.d_ptr = s->vma;
3291 else
3292 {
3293 if (s->_cooked_size != 0)
3294 dyn.d_un.d_val = s->_cooked_size;
3295 else
3296 dyn.d_un.d_val = s->_raw_size;
3297 }
3298 }
3299 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3300 }
3301 }
3302
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)
3306 {
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);
3310 }
3311
3312 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3313 PLT_ENTRY_SIZE;
3314 }
3315
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)
3319 {
3320 if (sdyn == NULL)
3321 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgot->contents);
3322 else
3323 bfd_put_32 (output_bfd,
3324 sdyn->output_section->vma + sdyn->output_offset,
3325 htab->sgot->contents);
3326 }
3327
3328 if (htab->sgot)
3329 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3330
3331 return TRUE;
3332 }
3333 \f
3334 /* Functions for dealing with the e_flags field.
3335
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. */
3340
3341 /* Merge backend specific data from an object file to the output
3342 object file when linking. */
3343
3344 static bfd_boolean
3345 elf32_sparc_merge_private_bfd_data (ibfd, obfd)
3346 bfd *ibfd;
3347 bfd *obfd;
3348 {
3349 bfd_boolean error;
3350 /* FIXME: This should not be static. */
3351 static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
3352
3353 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3354 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3355 return TRUE;
3356
3357 error = FALSE;
3358
3359 if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
3360 {
3361 error = TRUE;
3362 (*_bfd_error_handler)
3363 (_("%s: compiled for a 64 bit system and target is 32 bit"),
3364 bfd_archive_filename (ibfd));
3365 }
3366 else if ((ibfd->flags & DYNAMIC) == 0)
3367 {
3368 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
3369 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
3370 }
3371
3372 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
3373 != previous_ibfd_e_flags)
3374 && previous_ibfd_e_flags != (unsigned long) -1)
3375 {
3376 (*_bfd_error_handler)
3377 (_("%s: linking little endian files with big endian files"),
3378 bfd_archive_filename (ibfd));
3379 error = TRUE;
3380 }
3381 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
3382
3383 if (error)
3384 {
3385 bfd_set_error (bfd_error_bad_value);
3386 return FALSE;
3387 }
3388
3389 return TRUE;
3390 }
3391 \f
3392 /* Set the right machine number. */
3393
3394 static bfd_boolean
3395 elf32_sparc_object_p (abfd)
3396 bfd *abfd;
3397 {
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)
3403 return FALSE;
3404 new_tdata->root = *abfd->tdata.elf_obj_data;
3405 abfd->tdata.any = new_tdata;
3406
3407 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
3408 {
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);
3418 else
3419 return FALSE;
3420 }
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);
3424 else
3425 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
3426 }
3427
3428 /* The final processing done just before writing out the object file.
3429 We need to set the e_machine field appropriately. */
3430
3431 static void
3432 elf32_sparc_final_write_processing (abfd, linker)
3433 bfd *abfd;
3434 bfd_boolean linker ATTRIBUTE_UNUSED;
3435 {
3436 switch (bfd_get_mach (abfd))
3437 {
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;
3444 break;
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;
3449 break;
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
3454 | EF_SPARC_SUN_US3;
3455 break;
3456 case bfd_mach_sparc_sparclite_le :
3457 elf_elfheader (abfd)->e_machine = EM_SPARC;
3458 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
3459 break;
3460 default :
3461 abort ();
3462 break;
3463 }
3464 }
3465
3466 static enum elf_reloc_type_class
3467 elf32_sparc_reloc_type_class (rela)
3468 const Elf_Internal_Rela *rela;
3469 {
3470 switch ((int) ELF32_R_TYPE (rela->r_info))
3471 {
3472 case R_SPARC_RELATIVE:
3473 return reloc_class_relative;
3474 case R_SPARC_JMP_SLOT:
3475 return reloc_class_plt;
3476 case R_SPARC_COPY:
3477 return reloc_class_copy;
3478 default:
3479 return reloc_class_normal;
3480 }
3481 }
3482 \f
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
3489
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
3519
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
3528
3529 #include "elf32-target.h"
This page took 0.155348 seconds and 5 git commands to generate.