Fix the behaviour of --allow-shlib-undefined, so that it does what it claims
[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->no_undefined
2228 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2229 ;
2230 else
2231 {
2232 if (! ((*info->callbacks->undefined_symbol)
2233 (info, h->root.root.string, input_bfd,
2234 input_section, rel->r_offset,
2235 (!info->shared || info->no_undefined
2236 || ELF_ST_VISIBILITY (h->other)))))
2237 return FALSE;
2238 }
2239 }
2240
2241 switch (r_type)
2242 {
2243 case R_SPARC_GOT10:
2244 case R_SPARC_GOT13:
2245 case R_SPARC_GOT22:
2246 /* Relocation is to the entry for this symbol in the global
2247 offset table. */
2248 if (htab->sgot == NULL)
2249 abort ();
2250
2251 if (h != NULL)
2252 {
2253 bfd_boolean dyn;
2254
2255 off = h->got.offset;
2256 BFD_ASSERT (off != (bfd_vma) -1);
2257 dyn = elf_hash_table (info)->dynamic_sections_created;
2258
2259 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
2260 || (info->shared
2261 && (info->symbolic
2262 || h->dynindx == -1
2263 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2264 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
2265 {
2266 /* This is actually a static link, or it is a
2267 -Bsymbolic link and the symbol is defined
2268 locally, or the symbol was forced to be local
2269 because of a version file. We must initialize
2270 this entry in the global offset table. Since the
2271 offset must always be a multiple of 4, we use the
2272 least significant bit to record whether we have
2273 initialized it already.
2274
2275 When doing a dynamic link, we create a .rela.got
2276 relocation entry to initialize the value. This
2277 is done in the finish_dynamic_symbol routine. */
2278 if ((off & 1) != 0)
2279 off &= ~1;
2280 else
2281 {
2282 bfd_put_32 (output_bfd, relocation,
2283 htab->sgot->contents + off);
2284 h->got.offset |= 1;
2285 }
2286 }
2287 else
2288 unresolved_reloc = FALSE;
2289 }
2290 else
2291 {
2292 BFD_ASSERT (local_got_offsets != NULL
2293 && local_got_offsets[r_symndx] != (bfd_vma) -1);
2294
2295 off = local_got_offsets[r_symndx];
2296
2297 /* The offset must always be a multiple of 4. We use
2298 the least significant bit to record whether we have
2299 already processed this entry. */
2300 if ((off & 1) != 0)
2301 off &= ~1;
2302 else
2303 {
2304
2305 if (info->shared)
2306 {
2307 asection *s;
2308 Elf_Internal_Rela outrel;
2309 bfd_byte *loc;
2310
2311 /* We need to generate a R_SPARC_RELATIVE reloc
2312 for the dynamic linker. */
2313 s = htab->srelgot;
2314 BFD_ASSERT (s != NULL);
2315
2316 outrel.r_offset = (htab->sgot->output_section->vma
2317 + htab->sgot->output_offset
2318 + off);
2319 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2320 outrel.r_addend = relocation;
2321 relocation = 0;
2322 loc = s->contents;
2323 loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
2324 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2325 }
2326
2327 bfd_put_32 (output_bfd, relocation,
2328 htab->sgot->contents + off);
2329 local_got_offsets[r_symndx] |= 1;
2330 }
2331 }
2332 relocation = htab->sgot->output_offset + off - got_base;
2333 break;
2334
2335 case R_SPARC_PLT32:
2336 if (h == NULL || h->plt.offset == (bfd_vma) -1)
2337 {
2338 r_type = R_SPARC_32;
2339 goto r_sparc_plt32;
2340 }
2341 /* Fall through. */
2342 case R_SPARC_WPLT30:
2343 r_sparc_wplt30:
2344 /* Relocation is to the entry for this symbol in the
2345 procedure linkage table. */
2346
2347 /* The Solaris native assembler will generate a WPLT30 reloc
2348 for a local symbol if you assemble a call from one
2349 section to another when using -K pic. We treat it as
2350 WDISP30. */
2351 if (h == NULL)
2352 break;
2353
2354 if (h->plt.offset == (bfd_vma) -1)
2355 {
2356 /* We didn't make a PLT entry for this symbol. This
2357 happens when statically linking PIC code, or when
2358 using -Bsymbolic. */
2359 break;
2360 }
2361
2362 if (htab->splt == NULL)
2363 abort ();
2364
2365 relocation = (htab->splt->output_section->vma
2366 + htab->splt->output_offset
2367 + h->plt.offset);
2368 unresolved_reloc = FALSE;
2369 if (r_type == R_SPARC_PLT32)
2370 {
2371 r_type = R_SPARC_32;
2372 is_plt = TRUE;
2373 goto r_sparc_plt32;
2374 }
2375 break;
2376
2377 case R_SPARC_PC10:
2378 case R_SPARC_PC22:
2379 if (h != NULL
2380 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2381 break;
2382 /* Fall through. */
2383 case R_SPARC_DISP8:
2384 case R_SPARC_DISP16:
2385 case R_SPARC_DISP32:
2386 case R_SPARC_WDISP30:
2387 case R_SPARC_WDISP22:
2388 case R_SPARC_WDISP19:
2389 case R_SPARC_WDISP16:
2390 case R_SPARC_8:
2391 case R_SPARC_16:
2392 case R_SPARC_32:
2393 case R_SPARC_HI22:
2394 case R_SPARC_22:
2395 case R_SPARC_13:
2396 case R_SPARC_LO10:
2397 case R_SPARC_UA16:
2398 case R_SPARC_UA32:
2399 r_sparc_plt32:
2400 /* r_symndx will be zero only for relocs against symbols
2401 from removed linkonce sections, or sections discarded by
2402 a linker script. */
2403 if (r_symndx == 0
2404 || (input_section->flags & SEC_ALLOC) == 0)
2405 break;
2406
2407 if ((info->shared
2408 && (! howto->pc_relative
2409 || (h != NULL
2410 && h->dynindx != -1
2411 && (! info->symbolic
2412 || (h->elf_link_hash_flags
2413 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2414 || (!info->shared
2415 && h != NULL
2416 && h->dynindx != -1
2417 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2418 && (((h->elf_link_hash_flags
2419 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2420 && (h->elf_link_hash_flags
2421 & ELF_LINK_HASH_DEF_REGULAR) == 0)
2422 || h->root.type == bfd_link_hash_undefweak
2423 || h->root.type == bfd_link_hash_undefined)))
2424 {
2425 Elf_Internal_Rela outrel;
2426 bfd_byte *loc;
2427 bfd_boolean skip, relocate = FALSE;
2428
2429 /* When generating a shared object, these relocations
2430 are copied into the output file to be resolved at run
2431 time. */
2432
2433 BFD_ASSERT (sreloc != NULL);
2434
2435 skip = FALSE;
2436
2437 outrel.r_offset =
2438 _bfd_elf_section_offset (output_bfd, info, input_section,
2439 rel->r_offset);
2440 if (outrel.r_offset == (bfd_vma) -1)
2441 skip = TRUE;
2442 else if (outrel.r_offset == (bfd_vma) -2)
2443 skip = TRUE, relocate = TRUE;
2444 outrel.r_offset += (input_section->output_section->vma
2445 + input_section->output_offset);
2446
2447 /* Optimize unaligned reloc usage now that we know where
2448 it finally resides. */
2449 switch (r_type)
2450 {
2451 case R_SPARC_16:
2452 if (outrel.r_offset & 1)
2453 r_type = R_SPARC_UA16;
2454 break;
2455 case R_SPARC_UA16:
2456 if (!(outrel.r_offset & 1))
2457 r_type = R_SPARC_16;
2458 break;
2459 case R_SPARC_32:
2460 if (outrel.r_offset & 3)
2461 r_type = R_SPARC_UA32;
2462 break;
2463 case R_SPARC_UA32:
2464 if (!(outrel.r_offset & 3))
2465 r_type = R_SPARC_32;
2466 break;
2467 case R_SPARC_DISP8:
2468 case R_SPARC_DISP16:
2469 case R_SPARC_DISP32:
2470 /* If the symbol is not dynamic, we should not keep
2471 a dynamic relocation. But an .rela.* slot has been
2472 allocated for it, output R_SPARC_NONE.
2473 FIXME: Add code tracking needed dynamic relocs as
2474 e.g. i386 has. */
2475 if (h->dynindx == -1)
2476 skip = TRUE, relocate = TRUE;
2477 break;
2478 }
2479
2480 if (skip)
2481 memset (&outrel, 0, sizeof outrel);
2482 /* h->dynindx may be -1 if the symbol was marked to
2483 become local. */
2484 else if (h != NULL && ! is_plt
2485 && ((! info->symbolic && h->dynindx != -1)
2486 || (h->elf_link_hash_flags
2487 & ELF_LINK_HASH_DEF_REGULAR) == 0))
2488 {
2489 BFD_ASSERT (h->dynindx != -1);
2490 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2491 outrel.r_addend = rel->r_addend;
2492 }
2493 else
2494 {
2495 if (r_type == R_SPARC_32)
2496 {
2497 outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
2498 outrel.r_addend = relocation + rel->r_addend;
2499 }
2500 else
2501 {
2502 long indx;
2503
2504 if (is_plt)
2505 sec = htab->splt;
2506 else if (h == NULL)
2507 sec = local_sections[r_symndx];
2508 else
2509 {
2510 BFD_ASSERT (h->root.type == bfd_link_hash_defined
2511 || (h->root.type
2512 == bfd_link_hash_defweak));
2513 sec = h->root.u.def.section;
2514 }
2515 if (sec != NULL && bfd_is_abs_section (sec))
2516 indx = 0;
2517 else if (sec == NULL || sec->owner == NULL)
2518 {
2519 bfd_set_error (bfd_error_bad_value);
2520 return FALSE;
2521 }
2522 else
2523 {
2524 asection *osec;
2525
2526 osec = sec->output_section;
2527 indx = elf_section_data (osec)->dynindx;
2528
2529 /* FIXME: we really should be able to link non-pic
2530 shared libraries. */
2531 if (indx == 0)
2532 {
2533 BFD_FAIL ();
2534 (*_bfd_error_handler)
2535 (_("%s: probably compiled without -fPIC?"),
2536 bfd_archive_filename (input_bfd));
2537 bfd_set_error (bfd_error_bad_value);
2538 return FALSE;
2539 }
2540 }
2541
2542 outrel.r_info = ELF32_R_INFO (indx, r_type);
2543 outrel.r_addend = relocation + rel->r_addend;
2544 }
2545 }
2546
2547 loc = sreloc->contents;
2548 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
2549 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
2550
2551 /* This reloc will be computed at runtime, so there's no
2552 need to do anything now. */
2553 if (! relocate)
2554 continue;
2555 }
2556 break;
2557
2558 case R_SPARC_TLS_GD_HI22:
2559 if (! elf32_sparc_tdata (input_bfd)->has_tlsgd)
2560 {
2561 /* R_SPARC_REV32 used the same reloc number as
2562 R_SPARC_TLS_GD_HI22. */
2563 r_type = R_SPARC_REV32;
2564 break;
2565 }
2566 /* Fall through */
2567
2568 case R_SPARC_TLS_GD_LO10:
2569 case R_SPARC_TLS_IE_HI22:
2570 case R_SPARC_TLS_IE_LO10:
2571 r_type = elf32_sparc_tls_transition (info, input_bfd, r_type,
2572 h == NULL);
2573 tls_type = GOT_UNKNOWN;
2574 if (h == NULL && local_got_offsets)
2575 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2576 else if (h != NULL)
2577 {
2578 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2579 if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
2580 switch (ELF32_R_TYPE (rel->r_info))
2581 {
2582 case R_SPARC_TLS_GD_HI22:
2583 case R_SPARC_TLS_IE_HI22:
2584 r_type = R_SPARC_TLS_LE_HIX22;
2585 break;
2586 default:
2587 r_type = R_SPARC_TLS_LE_LOX10;
2588 break;
2589 }
2590 }
2591 if (tls_type == GOT_TLS_IE)
2592 switch (r_type)
2593 {
2594 case R_SPARC_TLS_GD_HI22:
2595 r_type = R_SPARC_TLS_IE_HI22;
2596 break;
2597 case R_SPARC_TLS_GD_LO10:
2598 r_type = R_SPARC_TLS_IE_LO10;
2599 break;
2600 }
2601
2602 if (r_type == R_SPARC_TLS_LE_HIX22)
2603 {
2604 relocation = tpoff (info, relocation);
2605 break;
2606 }
2607 if (r_type == R_SPARC_TLS_LE_LOX10)
2608 {
2609 /* Change add into xor. */
2610 relocation = tpoff (info, relocation);
2611 bfd_put_32 (output_bfd, (bfd_get_32 (input_bfd,
2612 contents + rel->r_offset)
2613 | 0x80182000), contents + rel->r_offset);
2614 break;
2615 }
2616
2617 if (h != NULL)
2618 {
2619 off = h->got.offset;
2620 h->got.offset |= 1;
2621 }
2622 else
2623 {
2624 BFD_ASSERT (local_got_offsets != NULL);
2625 off = local_got_offsets[r_symndx];
2626 local_got_offsets[r_symndx] |= 1;
2627 }
2628
2629 r_sparc_tlsldm:
2630 if (htab->sgot == NULL)
2631 abort ();
2632
2633 if ((off & 1) != 0)
2634 off &= ~1;
2635 else
2636 {
2637 Elf_Internal_Rela outrel;
2638 Elf32_External_Rela *loc;
2639 int dr_type, indx;
2640
2641 if (htab->srelgot == NULL)
2642 abort ();
2643
2644 bfd_put_32 (output_bfd, 0, htab->sgot->contents + off);
2645 outrel.r_offset = (htab->sgot->output_section->vma
2646 + htab->sgot->output_offset + off);
2647 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2648 if (r_type == R_SPARC_TLS_IE_HI22
2649 || r_type == R_SPARC_TLS_IE_LO10)
2650 dr_type = R_SPARC_TLS_TPOFF32;
2651 else
2652 dr_type = R_SPARC_TLS_DTPMOD32;
2653 if (dr_type == R_SPARC_TLS_TPOFF32 && indx == 0)
2654 outrel.r_addend = relocation - dtpoff_base (info);
2655 else
2656 outrel.r_addend = 0;
2657 outrel.r_info = ELF32_R_INFO (indx, dr_type);
2658 loc = (Elf32_External_Rela *) htab->srelgot->contents;
2659 loc += htab->srelgot->reloc_count++;
2660 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2661 (bfd_byte *) loc);
2662
2663 if (r_type == R_SPARC_TLS_GD_HI22
2664 || r_type == R_SPARC_TLS_GD_LO10)
2665 {
2666 if (indx == 0)
2667 {
2668 BFD_ASSERT (! unresolved_reloc);
2669 bfd_put_32 (output_bfd,
2670 relocation - dtpoff_base (info),
2671 htab->sgot->contents + off + 4);
2672 }
2673 else
2674 {
2675 bfd_put_32 (output_bfd, 0,
2676 htab->sgot->contents + off + 4);
2677 outrel.r_info = ELF32_R_INFO (indx,
2678 R_SPARC_TLS_DTPOFF32);
2679 outrel.r_offset += 4;
2680 htab->srelgot->reloc_count++;
2681 loc++;
2682 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2683 (bfd_byte *) loc);
2684 }
2685 }
2686 else if (dr_type == R_SPARC_TLS_DTPMOD32)
2687 {
2688 bfd_put_32 (output_bfd, 0,
2689 htab->sgot->contents + off + 4);
2690 }
2691 }
2692
2693 if (off >= (bfd_vma) -2)
2694 abort ();
2695
2696 relocation = htab->sgot->output_offset + off - got_base;
2697 unresolved_reloc = FALSE;
2698 howto = _bfd_sparc_elf_howto_table + r_type;
2699 break;
2700
2701 case R_SPARC_TLS_LDM_HI22:
2702 case R_SPARC_TLS_LDM_LO10:
2703 if (! info->shared)
2704 {
2705 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2706 continue;
2707 }
2708 off = htab->tls_ldm_got.offset;
2709 htab->tls_ldm_got.offset |= 1;
2710 goto r_sparc_tlsldm;
2711
2712 case R_SPARC_TLS_LDO_HIX22:
2713 case R_SPARC_TLS_LDO_LOX10:
2714 if (info->shared)
2715 relocation -= dtpoff_base (info);
2716 else
2717 relocation = tpoff (info, relocation);
2718 break;
2719
2720 case R_SPARC_TLS_LE_HIX22:
2721 case R_SPARC_TLS_LE_LOX10:
2722 if (info->shared)
2723 {
2724 Elf_Internal_Rela outrel;
2725 bfd_boolean skip, relocate = FALSE;
2726
2727 BFD_ASSERT (sreloc != NULL);
2728 skip = FALSE;
2729 outrel.r_offset =
2730 _bfd_elf_section_offset (output_bfd, info, input_section,
2731 rel->r_offset);
2732 if (outrel.r_offset == (bfd_vma) -1)
2733 skip = TRUE;
2734 else if (outrel.r_offset == (bfd_vma) -2)
2735 skip = TRUE, relocate = TRUE;
2736 outrel.r_offset += (input_section->output_section->vma
2737 + input_section->output_offset);
2738 if (skip)
2739 memset (&outrel, 0, sizeof outrel);
2740 else
2741 {
2742 outrel.r_info = ELF32_R_INFO (0, r_type);
2743 outrel.r_addend = relocation - dtpoff_base (info)
2744 + rel->r_addend;
2745 }
2746
2747 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
2748 (bfd_byte *) (((Elf32_External_Rela *)
2749 sreloc->contents)
2750 + sreloc->reloc_count));
2751 ++sreloc->reloc_count;
2752 continue;
2753 }
2754 relocation = tpoff (info, relocation);
2755 break;
2756
2757 case R_SPARC_TLS_LDM_CALL:
2758 if (! info->shared)
2759 {
2760 /* mov %g0, %o0 */
2761 bfd_put_32 (output_bfd, 0x90100000, contents + rel->r_offset);
2762 continue;
2763 }
2764 /* Fall through */
2765
2766 case R_SPARC_TLS_GD_CALL:
2767 tls_type = GOT_UNKNOWN;
2768 if (h == NULL && local_got_offsets)
2769 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2770 else if (h != NULL)
2771 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2772 if (! info->shared
2773 || (r_type == R_SPARC_TLS_GD_CALL && tls_type == GOT_TLS_IE))
2774 {
2775 bfd_vma insn;
2776
2777 if (!info->shared && (h == NULL || h->dynindx == -1))
2778 {
2779 /* GD -> LE */
2780 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2781 continue;
2782 }
2783
2784 /* GD -> IE */
2785 if (rel + 1 < relend
2786 && ELF32_R_TYPE (rel[1].r_info) == R_SPARC_TLS_GD_ADD
2787 && rel[1].r_offset == rel->r_offset + 4
2788 && ELF32_R_SYM (rel[1].r_info) == r_symndx
2789 && (((insn = bfd_get_32 (input_bfd,
2790 contents + rel[1].r_offset))
2791 >> 25) & 0x1f) == 8)
2792 {
2793 /* We have
2794 call __tls_get_addr, %tgd_call(foo)
2795 add %reg1, %reg2, %o0, %tgd_add(foo)
2796 and change it into IE:
2797 ld [%reg1 + %reg2], %o0, %tie_ld(foo)
2798 add %g7, %o0, %o0, %tie_add(foo).
2799 add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
2800 ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2. */
2801 bfd_put_32 (output_bfd, insn | 0xc0000000,
2802 contents + rel->r_offset);
2803 bfd_put_32 (output_bfd, 0x9001c008,
2804 contents + rel->r_offset + 4);
2805 rel++;
2806 continue;
2807 }
2808
2809 bfd_put_32 (output_bfd, 0x9001c008, contents + rel->r_offset);
2810 continue;
2811 }
2812
2813 h = (struct elf_link_hash_entry *)
2814 bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
2815 FALSE, TRUE);
2816 BFD_ASSERT (h != NULL);
2817 r_type = R_SPARC_WPLT30;
2818 howto = _bfd_sparc_elf_howto_table + r_type;
2819 goto r_sparc_wplt30;
2820
2821 case R_SPARC_TLS_GD_ADD:
2822 tls_type = GOT_UNKNOWN;
2823 if (h == NULL && local_got_offsets)
2824 tls_type = elf32_sparc_local_got_tls_type (input_bfd) [r_symndx];
2825 else if (h != NULL)
2826 tls_type = elf32_sparc_hash_entry(h)->tls_type;
2827 if (! info->shared || tls_type == GOT_TLS_IE)
2828 {
2829 /* add %reg1, %reg2, %reg3, %tgd_add(foo)
2830 changed into IE:
2831 ld [%reg1 + %reg2], %reg3, %tie_ld(foo)
2832 or LE:
2833 add %g7, %reg2, %reg3. */
2834 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2835 if ((h != NULL && h->dynindx != -1) || info->shared)
2836 relocation = insn | 0xc0000000;
2837 else
2838 relocation = (insn & ~0x7c000) | 0x1c000;
2839 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2840 }
2841 continue;
2842
2843 case R_SPARC_TLS_LDM_ADD:
2844 if (! info->shared)
2845 bfd_put_32 (output_bfd, SPARC_NOP, contents + rel->r_offset);
2846 continue;
2847
2848 case R_SPARC_TLS_LDO_ADD:
2849 if (! info->shared)
2850 {
2851 /* Change rs1 into %g7. */
2852 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2853 insn = (insn & ~0x7c000) | 0x1c000;
2854 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
2855 }
2856 continue;
2857
2858 case R_SPARC_TLS_IE_LD:
2859 case R_SPARC_TLS_IE_LDX:
2860 if (! info->shared && (h == NULL || h->dynindx == -1))
2861 {
2862 bfd_vma insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
2863 int rs2 = insn & 0x1f;
2864 int rd = (insn >> 25) & 0x1f;
2865
2866 if (rs2 == rd)
2867 relocation = SPARC_NOP;
2868 else
2869 relocation = 0x80100000 | (insn & 0x3e00001f);
2870 bfd_put_32 (output_bfd, relocation, contents + rel->r_offset);
2871 }
2872 continue;
2873
2874 case R_SPARC_TLS_IE_ADD:
2875 /* Totally useless relocation. */
2876 continue;
2877
2878 case R_SPARC_TLS_DTPOFF32:
2879 relocation -= dtpoff_base (info);
2880 break;
2881
2882 default:
2883 break;
2884 }
2885
2886 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2887 because such sections are not SEC_ALLOC and thus ld.so will
2888 not process them. */
2889 if (unresolved_reloc
2890 && !((input_section->flags & SEC_DEBUGGING) != 0
2891 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
2892 (*_bfd_error_handler)
2893 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
2894 bfd_archive_filename (input_bfd),
2895 bfd_get_section_name (input_bfd, input_section),
2896 (long) rel->r_offset,
2897 h->root.root.string);
2898
2899 r = bfd_reloc_continue;
2900 if (r_type == R_SPARC_WDISP16)
2901 {
2902 bfd_vma x;
2903
2904 relocation += rel->r_addend;
2905 relocation -= (input_section->output_section->vma
2906 + input_section->output_offset);
2907 relocation -= rel->r_offset;
2908
2909 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2910 x |= ((((relocation >> 2) & 0xc000) << 6)
2911 | ((relocation >> 2) & 0x3fff));
2912 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2913
2914 if ((bfd_signed_vma) relocation < - 0x40000
2915 || (bfd_signed_vma) relocation > 0x3ffff)
2916 r = bfd_reloc_overflow;
2917 else
2918 r = bfd_reloc_ok;
2919 }
2920 else if (r_type == R_SPARC_REV32)
2921 {
2922 bfd_vma x;
2923
2924 relocation = relocation + rel->r_addend;
2925
2926 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2927 x = x + relocation;
2928 bfd_putl32 (/*input_bfd,*/ x, contents + rel->r_offset);
2929 r = bfd_reloc_ok;
2930 }
2931 else if (r_type == R_SPARC_TLS_LDO_HIX22
2932 || r_type == R_SPARC_TLS_LE_HIX22)
2933 {
2934 bfd_vma x;
2935
2936 relocation += rel->r_addend;
2937 relocation = relocation ^ 0xffffffff;
2938
2939 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2940 x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
2941 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2942 r = bfd_reloc_ok;
2943 }
2944 else if (r_type == R_SPARC_TLS_LDO_LOX10
2945 || r_type == R_SPARC_TLS_LE_LOX10)
2946 {
2947 bfd_vma x;
2948
2949 relocation += rel->r_addend;
2950 relocation = (relocation & 0x3ff) | 0x1c00;
2951
2952 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2953 x = (x & ~(bfd_vma) 0x1fff) | relocation;
2954 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2955
2956 r = bfd_reloc_ok;
2957 }
2958 else if ((r_type == R_SPARC_WDISP30 || r_type == R_SPARC_WPLT30)
2959 && sec_do_relax (input_section)
2960 && rel->r_offset + 4 < input_section->_raw_size)
2961 {
2962 #define G0 0
2963 #define O7 15
2964 #define XCC (2 << 20)
2965 #define COND(x) (((x)&0xf)<<25)
2966 #define CONDA COND(0x8)
2967 #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
2968 #define INSN_BA (F2(0,2) | CONDA)
2969 #define INSN_OR F3(2, 0x2, 0)
2970 #define INSN_NOP F2(0,4)
2971
2972 bfd_vma x, y;
2973
2974 /* If the instruction is a call with either:
2975 restore
2976 arithmetic instruction with rd == %o7
2977 where rs1 != %o7 and rs2 if it is register != %o7
2978 then we can optimize if the call destination is near
2979 by changing the call into a branch always. */
2980 x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2981 y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
2982 if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
2983 {
2984 if (((y & OP3(~0)) == OP3(0x3d) /* restore */
2985 || ((y & OP3(0x28)) == 0 /* arithmetic */
2986 && (y & RD(~0)) == RD(O7)))
2987 && (y & RS1(~0)) != RS1(O7)
2988 && ((y & F3I(~0))
2989 || (y & RS2(~0)) != RS2(O7)))
2990 {
2991 bfd_vma reloc;
2992
2993 reloc = relocation + rel->r_addend - rel->r_offset;
2994 reloc -= (input_section->output_section->vma
2995 + input_section->output_offset);
2996
2997 /* Ensure the reloc fits into simm22. */
2998 if ((reloc & 3) == 0
2999 && ((reloc & ~(bfd_vma)0x7fffff) == 0
3000 || ((reloc | 0x7fffff) == ~(bfd_vma)0)))
3001 {
3002 reloc >>= 2;
3003
3004 /* Check whether it fits into simm19 on v9. */
3005 if (((reloc & 0x3c0000) == 0
3006 || (reloc & 0x3c0000) == 0x3c0000)
3007 && (elf_elfheader (output_bfd)->e_flags & EF_SPARC_32PLUS))
3008 x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
3009 else
3010 x = INSN_BA | (reloc & 0x3fffff); /* ba */
3011 bfd_put_32 (input_bfd, x, contents + rel->r_offset);
3012 r = bfd_reloc_ok;
3013 if (rel->r_offset >= 4
3014 && (y & (0xffffffff ^ RS1(~0)))
3015 == (INSN_OR | RD(O7) | RS2(G0)))
3016 {
3017 bfd_vma z;
3018 unsigned int reg;
3019
3020 z = bfd_get_32 (input_bfd,
3021 contents + rel->r_offset - 4);
3022 if ((z & (0xffffffff ^ RD(~0)))
3023 != (INSN_OR | RS1(O7) | RS2(G0)))
3024 break;
3025
3026 /* The sequence was
3027 or %o7, %g0, %rN
3028 call foo
3029 or %rN, %g0, %o7
3030
3031 If call foo was replaced with ba, replace
3032 or %rN, %g0, %o7 with nop. */
3033
3034 reg = (y & RS1(~0)) >> 14;
3035 if (reg != ((z & RD(~0)) >> 25)
3036 || reg == G0 || reg == O7)
3037 break;
3038
3039 bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
3040 contents + rel->r_offset + 4);
3041 }
3042
3043 }
3044 }
3045 }
3046 }
3047
3048 if (r == bfd_reloc_continue)
3049 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3050 contents, rel->r_offset,
3051 relocation, rel->r_addend);
3052
3053 if (r != bfd_reloc_ok)
3054 {
3055 switch (r)
3056 {
3057 default:
3058 case bfd_reloc_outofrange:
3059 abort ();
3060 case bfd_reloc_overflow:
3061 {
3062 const char *name;
3063
3064 if (h != NULL)
3065 name = h->root.root.string;
3066 else
3067 {
3068 name = bfd_elf_string_from_elf_section (input_bfd,
3069 symtab_hdr->sh_link,
3070 sym->st_name);
3071 if (name == NULL)
3072 return FALSE;
3073 if (*name == '\0')
3074 name = bfd_section_name (input_bfd, sec);
3075 }
3076 if (! ((*info->callbacks->reloc_overflow)
3077 (info, name, howto->name, (bfd_vma) 0,
3078 input_bfd, input_section, rel->r_offset)))
3079 return FALSE;
3080 }
3081 break;
3082 }
3083 }
3084 }
3085
3086 return TRUE;
3087 }
3088
3089 /* Finish up dynamic symbol handling. We set the contents of various
3090 dynamic sections here. */
3091
3092 static bfd_boolean
3093 elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
3094 bfd *output_bfd;
3095 struct bfd_link_info *info;
3096 struct elf_link_hash_entry *h;
3097 Elf_Internal_Sym *sym;
3098 {
3099 bfd *dynobj;
3100 struct elf32_sparc_link_hash_table *htab;
3101
3102 htab = elf32_sparc_hash_table (info);
3103 dynobj = htab->elf.dynobj;
3104
3105 if (h->plt.offset != (bfd_vma) -1)
3106 {
3107 asection *splt;
3108 asection *srela;
3109 Elf_Internal_Rela rela;
3110 bfd_byte *loc;
3111
3112 /* This symbol has an entry in the procedure linkage table. Set
3113 it up. */
3114
3115 BFD_ASSERT (h->dynindx != -1);
3116
3117 splt = htab->splt;
3118 srela = htab->srelplt;
3119 BFD_ASSERT (splt != NULL && srela != NULL);
3120
3121 /* Fill in the entry in the procedure linkage table. */
3122 bfd_put_32 (output_bfd,
3123 PLT_ENTRY_WORD0 + h->plt.offset,
3124 splt->contents + h->plt.offset);
3125 bfd_put_32 (output_bfd,
3126 (PLT_ENTRY_WORD1
3127 + (((- (h->plt.offset + 4)) >> 2) & 0x3fffff)),
3128 splt->contents + h->plt.offset + 4);
3129 bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
3130 splt->contents + h->plt.offset + 8);
3131
3132 /* Fill in the entry in the .rela.plt section. */
3133 rela.r_offset = (splt->output_section->vma
3134 + splt->output_offset
3135 + h->plt.offset);
3136 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
3137 rela.r_addend = 0;
3138 loc = srela->contents;
3139 loc += (h->plt.offset / PLT_ENTRY_SIZE - 4) * sizeof (Elf32_External_Rela);
3140 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3141
3142 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3143 {
3144 /* Mark the symbol as undefined, rather than as defined in
3145 the .plt section. Leave the value alone. */
3146 sym->st_shndx = SHN_UNDEF;
3147 /* If the symbol is weak, we do need to clear the value.
3148 Otherwise, the PLT entry would provide a definition for
3149 the symbol even if the symbol wasn't defined anywhere,
3150 and so the symbol would never be NULL. */
3151 if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
3152 == 0)
3153 sym->st_value = 0;
3154 }
3155 }
3156
3157 if (h->got.offset != (bfd_vma) -1
3158 && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_GD
3159 && elf32_sparc_hash_entry(h)->tls_type != GOT_TLS_IE)
3160 {
3161 asection *sgot;
3162 asection *srela;
3163 Elf_Internal_Rela rela;
3164 bfd_byte *loc;
3165
3166 /* This symbol has an entry in the global offset table. Set it
3167 up. */
3168
3169 sgot = htab->sgot;
3170 srela = htab->srelgot;
3171 BFD_ASSERT (sgot != NULL && srela != NULL);
3172
3173 rela.r_offset = (sgot->output_section->vma
3174 + sgot->output_offset
3175 + (h->got.offset &~ (bfd_vma) 1));
3176
3177 /* If this is a -Bsymbolic link, and the symbol is defined
3178 locally, we just want to emit a RELATIVE reloc. Likewise if
3179 the symbol was forced to be local because of a version file.
3180 The entry in the global offset table will already have been
3181 initialized in the relocate_section function. */
3182 if (info->shared
3183 && (info->symbolic || h->dynindx == -1)
3184 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3185 {
3186 asection *sec = h->root.u.def.section;
3187 rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
3188 rela.r_addend = (h->root.u.def.value
3189 + sec->output_section->vma
3190 + sec->output_offset);
3191 }
3192 else
3193 {
3194 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
3195 rela.r_addend = 0;
3196 }
3197
3198 bfd_put_32 (output_bfd, (bfd_vma) 0,
3199 sgot->contents + (h->got.offset &~ (bfd_vma) 1));
3200 loc = srela->contents;
3201 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
3202 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3203 }
3204
3205 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
3206 {
3207 asection *s;
3208 Elf_Internal_Rela rela;
3209 bfd_byte *loc;
3210
3211 /* This symbols needs a copy reloc. Set it up. */
3212
3213 BFD_ASSERT (h->dynindx != -1);
3214
3215 s = bfd_get_section_by_name (h->root.u.def.section->owner,
3216 ".rela.bss");
3217 BFD_ASSERT (s != NULL);
3218
3219 rela.r_offset = (h->root.u.def.value
3220 + h->root.u.def.section->output_section->vma
3221 + h->root.u.def.section->output_offset);
3222 rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY);
3223 rela.r_addend = 0;
3224 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
3225 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3226 }
3227
3228 /* Mark some specially defined symbols as absolute. */
3229 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3230 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3231 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3232 sym->st_shndx = SHN_ABS;
3233
3234 return TRUE;
3235 }
3236
3237 /* Finish up the dynamic sections. */
3238
3239 static bfd_boolean
3240 elf32_sparc_finish_dynamic_sections (output_bfd, info)
3241 bfd *output_bfd;
3242 struct bfd_link_info *info;
3243 {
3244 bfd *dynobj;
3245 asection *sdyn;
3246 struct elf32_sparc_link_hash_table *htab;
3247
3248 htab = elf32_sparc_hash_table (info);
3249 dynobj = htab->elf.dynobj;
3250
3251 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3252
3253 if (elf_hash_table (info)->dynamic_sections_created)
3254 {
3255 asection *splt;
3256 Elf32_External_Dyn *dyncon, *dynconend;
3257
3258 splt = bfd_get_section_by_name (dynobj, ".plt");
3259 BFD_ASSERT (splt != NULL && sdyn != NULL);
3260
3261 dyncon = (Elf32_External_Dyn *) sdyn->contents;
3262 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3263 for (; dyncon < dynconend; dyncon++)
3264 {
3265 Elf_Internal_Dyn dyn;
3266 const char *name;
3267 bfd_boolean size;
3268
3269 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3270
3271 switch (dyn.d_tag)
3272 {
3273 case DT_PLTGOT: name = ".plt"; size = FALSE; break;
3274 case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
3275 case DT_JMPREL: name = ".rela.plt"; size = FALSE; break;
3276 default: name = NULL; size = FALSE; break;
3277 }
3278
3279 if (name != NULL)
3280 {
3281 asection *s;
3282
3283 s = bfd_get_section_by_name (output_bfd, name);
3284 if (s == NULL)
3285 dyn.d_un.d_val = 0;
3286 else
3287 {
3288 if (! size)
3289 dyn.d_un.d_ptr = s->vma;
3290 else
3291 {
3292 if (s->_cooked_size != 0)
3293 dyn.d_un.d_val = s->_cooked_size;
3294 else
3295 dyn.d_un.d_val = s->_raw_size;
3296 }
3297 }
3298 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3299 }
3300 }
3301
3302 /* Clear the first four entries in the procedure linkage table,
3303 and put a nop in the last four bytes. */
3304 if (splt->_raw_size > 0)
3305 {
3306 memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE);
3307 bfd_put_32 (output_bfd, (bfd_vma) SPARC_NOP,
3308 splt->contents + splt->_raw_size - 4);
3309 }
3310
3311 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3312 PLT_ENTRY_SIZE;
3313 }
3314
3315 /* Set the first entry in the global offset table to the address of
3316 the dynamic section. */
3317 if (htab->sgot && htab->sgot->_raw_size > 0)
3318 {
3319 if (sdyn == NULL)
3320 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgot->contents);
3321 else
3322 bfd_put_32 (output_bfd,
3323 sdyn->output_section->vma + sdyn->output_offset,
3324 htab->sgot->contents);
3325 }
3326
3327 if (htab->sgot)
3328 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3329
3330 return TRUE;
3331 }
3332 \f
3333 /* Functions for dealing with the e_flags field.
3334
3335 We don't define set_private_flags or copy_private_bfd_data because
3336 the only currently defined values are based on the bfd mach number,
3337 so we use the latter instead and defer setting e_flags until the
3338 file is written out. */
3339
3340 /* Merge backend specific data from an object file to the output
3341 object file when linking. */
3342
3343 static bfd_boolean
3344 elf32_sparc_merge_private_bfd_data (ibfd, obfd)
3345 bfd *ibfd;
3346 bfd *obfd;
3347 {
3348 bfd_boolean error;
3349 /* FIXME: This should not be static. */
3350 static unsigned long previous_ibfd_e_flags = (unsigned long) -1;
3351
3352 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3353 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3354 return TRUE;
3355
3356 error = FALSE;
3357
3358 if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9)
3359 {
3360 error = TRUE;
3361 (*_bfd_error_handler)
3362 (_("%s: compiled for a 64 bit system and target is 32 bit"),
3363 bfd_archive_filename (ibfd));
3364 }
3365 else if ((ibfd->flags & DYNAMIC) == 0)
3366 {
3367 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
3368 bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd));
3369 }
3370
3371 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA)
3372 != previous_ibfd_e_flags)
3373 && previous_ibfd_e_flags != (unsigned long) -1)
3374 {
3375 (*_bfd_error_handler)
3376 (_("%s: linking little endian files with big endian files"),
3377 bfd_archive_filename (ibfd));
3378 error = TRUE;
3379 }
3380 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA;
3381
3382 if (error)
3383 {
3384 bfd_set_error (bfd_error_bad_value);
3385 return FALSE;
3386 }
3387
3388 return TRUE;
3389 }
3390 \f
3391 /* Set the right machine number. */
3392
3393 static bfd_boolean
3394 elf32_sparc_object_p (abfd)
3395 bfd *abfd;
3396 {
3397 /* Allocate our special target data. */
3398 struct elf32_sparc_obj_tdata *new_tdata;
3399 bfd_size_type amt = sizeof (struct elf32_sparc_obj_tdata);
3400 new_tdata = bfd_zalloc (abfd, amt);
3401 if (new_tdata == NULL)
3402 return FALSE;
3403 new_tdata->root = *abfd->tdata.elf_obj_data;
3404 abfd->tdata.any = new_tdata;
3405
3406 if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS)
3407 {
3408 if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3409 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3410 bfd_mach_sparc_v8plusb);
3411 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3412 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3413 bfd_mach_sparc_v8plusa);
3414 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS)
3415 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3416 bfd_mach_sparc_v8plus);
3417 else
3418 return FALSE;
3419 }
3420 else if (elf_elfheader (abfd)->e_flags & EF_SPARC_LEDATA)
3421 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc,
3422 bfd_mach_sparc_sparclite_le);
3423 else
3424 return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc);
3425 }
3426
3427 /* The final processing done just before writing out the object file.
3428 We need to set the e_machine field appropriately. */
3429
3430 static void
3431 elf32_sparc_final_write_processing (abfd, linker)
3432 bfd *abfd;
3433 bfd_boolean linker ATTRIBUTE_UNUSED;
3434 {
3435 switch (bfd_get_mach (abfd))
3436 {
3437 case bfd_mach_sparc :
3438 break; /* nothing to do */
3439 case bfd_mach_sparc_v8plus :
3440 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3441 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3442 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS;
3443 break;
3444 case bfd_mach_sparc_v8plusa :
3445 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3446 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3447 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1;
3448 break;
3449 case bfd_mach_sparc_v8plusb :
3450 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS;
3451 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK;
3452 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1
3453 | EF_SPARC_SUN_US3;
3454 break;
3455 case bfd_mach_sparc_sparclite_le :
3456 elf_elfheader (abfd)->e_machine = EM_SPARC;
3457 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA;
3458 break;
3459 default :
3460 abort ();
3461 break;
3462 }
3463 }
3464
3465 static enum elf_reloc_type_class
3466 elf32_sparc_reloc_type_class (rela)
3467 const Elf_Internal_Rela *rela;
3468 {
3469 switch ((int) ELF32_R_TYPE (rela->r_info))
3470 {
3471 case R_SPARC_RELATIVE:
3472 return reloc_class_relative;
3473 case R_SPARC_JMP_SLOT:
3474 return reloc_class_plt;
3475 case R_SPARC_COPY:
3476 return reloc_class_copy;
3477 default:
3478 return reloc_class_normal;
3479 }
3480 }
3481 \f
3482 #define TARGET_BIG_SYM bfd_elf32_sparc_vec
3483 #define TARGET_BIG_NAME "elf32-sparc"
3484 #define ELF_ARCH bfd_arch_sparc
3485 #define ELF_MACHINE_CODE EM_SPARC
3486 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
3487 #define ELF_MAXPAGESIZE 0x10000
3488
3489 #define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
3490 #define bfd_elf32_bfd_link_hash_table_create \
3491 elf32_sparc_link_hash_table_create
3492 #define bfd_elf32_bfd_relax_section elf32_sparc_relax_section
3493 #define bfd_elf32_new_section_hook elf32_sparc_new_section_hook
3494 #define elf_info_to_howto elf32_sparc_info_to_howto
3495 #define elf_backend_copy_indirect_symbol \
3496 elf32_sparc_copy_indirect_symbol
3497 #define elf_backend_create_dynamic_sections \
3498 elf32_sparc_create_dynamic_sections
3499 #define elf_backend_check_relocs elf32_sparc_check_relocs
3500 #define elf_backend_adjust_dynamic_symbol \
3501 elf32_sparc_adjust_dynamic_symbol
3502 #define elf_backend_size_dynamic_sections \
3503 elf32_sparc_size_dynamic_sections
3504 #define elf_backend_relocate_section elf32_sparc_relocate_section
3505 #define elf_backend_finish_dynamic_symbol \
3506 elf32_sparc_finish_dynamic_symbol
3507 #define elf_backend_finish_dynamic_sections \
3508 elf32_sparc_finish_dynamic_sections
3509 #define bfd_elf32_bfd_merge_private_bfd_data \
3510 elf32_sparc_merge_private_bfd_data
3511 #define bfd_elf32_mkobject elf32_sparc_mkobject
3512 #define elf_backend_object_p elf32_sparc_object_p
3513 #define elf_backend_final_write_processing \
3514 elf32_sparc_final_write_processing
3515 #define elf_backend_gc_mark_hook elf32_sparc_gc_mark_hook
3516 #define elf_backend_gc_sweep_hook elf32_sparc_gc_sweep_hook
3517 #define elf_backend_reloc_type_class elf32_sparc_reloc_type_class
3518
3519 #define elf_backend_can_gc_sections 1
3520 #define elf_backend_can_refcount 1
3521 #define elf_backend_want_got_plt 0
3522 #define elf_backend_plt_readonly 0
3523 #define elf_backend_want_plt_sym 1
3524 #define elf_backend_got_header_size 4
3525 #define elf_backend_plt_header_size (4*PLT_ENTRY_SIZE)
3526 #define elf_backend_rela_normal 1
3527
3528 #include "elf32-target.h"
This page took 0.111763 seconds and 4 git commands to generate.