1 /* SPARC-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 #include "elf/sparc.h"
27 #include "opcode/sparc.h"
29 static reloc_howto_type
*elf32_sparc_reloc_type_lookup
30 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
31 static void elf32_sparc_info_to_howto
32 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
33 static bfd_boolean elf32_sparc_check_relocs
34 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
35 const Elf_Internal_Rela
*));
36 static bfd_boolean elf32_sparc_adjust_dynamic_symbol
37 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
38 static bfd_boolean allocate_dynrelocs
39 PARAMS ((struct elf_link_hash_entry
*, PTR
));
40 static bfd_boolean readonly_dynrelocs
41 PARAMS ((struct elf_link_hash_entry
*, PTR
));
42 static bfd_boolean elf32_sparc_omit_section_dynsym
43 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*));
44 static bfd_boolean elf32_sparc_size_dynamic_sections
45 PARAMS ((bfd
*, struct bfd_link_info
*));
46 static bfd_boolean elf32_sparc_new_section_hook
47 PARAMS ((bfd
*, asection
*));
48 static bfd_boolean elf32_sparc_relax_section
49 PARAMS ((bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*));
50 static bfd_vma dtpoff_base
51 PARAMS ((struct bfd_link_info
*));
53 PARAMS ((struct bfd_link_info
*, bfd_vma
));
54 static bfd_boolean elf32_sparc_relocate_section
55 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
56 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
57 static bfd_boolean elf32_sparc_finish_dynamic_symbol
58 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
60 static bfd_boolean elf32_sparc_finish_dynamic_sections
61 PARAMS ((bfd
*, struct bfd_link_info
*));
62 static bfd_boolean elf32_sparc_merge_private_bfd_data
63 PARAMS ((bfd
*, bfd
*));
64 static struct bfd_hash_entry
*link_hash_newfunc
65 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *));
66 static struct bfd_link_hash_table
*elf32_sparc_link_hash_table_create
68 static bfd_boolean create_got_section
69 PARAMS ((bfd
*, struct bfd_link_info
*));
70 static bfd_boolean elf32_sparc_create_dynamic_sections
71 PARAMS ((bfd
*, struct bfd_link_info
*));
72 static void elf32_sparc_copy_indirect_symbol
73 PARAMS ((const struct elf_backend_data
*, struct elf_link_hash_entry
*,
74 struct elf_link_hash_entry
*));
75 static int elf32_sparc_tls_transition
76 PARAMS ((struct bfd_link_info
*, bfd
*, int, int));
78 static bfd_boolean elf32_sparc_mkobject
80 static bfd_boolean elf32_sparc_object_p
82 static void elf32_sparc_final_write_processing
83 PARAMS ((bfd
*, bfd_boolean
));
84 static enum elf_reloc_type_class elf32_sparc_reloc_type_class
85 PARAMS ((const Elf_Internal_Rela
*));
86 static asection
* elf32_sparc_gc_mark_hook
87 PARAMS ((asection
*, struct bfd_link_info
*, Elf_Internal_Rela
*,
88 struct elf_link_hash_entry
*, Elf_Internal_Sym
*));
89 static bfd_boolean elf32_sparc_gc_sweep_hook
90 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
91 const Elf_Internal_Rela
*));
93 /* The relocation "howto" table. */
95 static bfd_reloc_status_type sparc_elf_notsupported_reloc
96 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
97 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
98 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
99 static bfd_reloc_status_type sparc_elf_hix22_reloc
100 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
101 static bfd_reloc_status_type sparc_elf_lox10_reloc
102 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
104 reloc_howto_type _bfd_sparc_elf_howto_table
[] =
106 HOWTO(R_SPARC_NONE
, 0,0, 0,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", FALSE
,0,0x00000000,TRUE
),
107 HOWTO(R_SPARC_8
, 0,0, 8,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_8", FALSE
,0,0x000000ff,TRUE
),
108 HOWTO(R_SPARC_16
, 0,1,16,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_16", FALSE
,0,0x0000ffff,TRUE
),
109 HOWTO(R_SPARC_32
, 0,2,32,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_32", FALSE
,0,0xffffffff,TRUE
),
110 HOWTO(R_SPARC_DISP8
, 0,0, 8,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP8", FALSE
,0,0x000000ff,TRUE
),
111 HOWTO(R_SPARC_DISP16
, 0,1,16,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP16", FALSE
,0,0x0000ffff,TRUE
),
112 HOWTO(R_SPARC_DISP32
, 0,2,32,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP32", FALSE
,0,0xffffffff,TRUE
),
113 HOWTO(R_SPARC_WDISP30
, 2,2,30,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP30", FALSE
,0,0x3fffffff,TRUE
),
114 HOWTO(R_SPARC_WDISP22
, 2,2,22,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP22", FALSE
,0,0x003fffff,TRUE
),
115 HOWTO(R_SPARC_HI22
, 10,2,22,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_HI22", FALSE
,0,0x003fffff,TRUE
),
116 HOWTO(R_SPARC_22
, 0,2,22,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_22", FALSE
,0,0x003fffff,TRUE
),
117 HOWTO(R_SPARC_13
, 0,2,13,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_13", FALSE
,0,0x00001fff,TRUE
),
118 HOWTO(R_SPARC_LO10
, 0,2,10,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_LO10", FALSE
,0,0x000003ff,TRUE
),
119 HOWTO(R_SPARC_GOT10
, 0,2,10,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_GOT10", FALSE
,0,0x000003ff,TRUE
),
120 HOWTO(R_SPARC_GOT13
, 0,2,13,FALSE
,0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_GOT13", FALSE
,0,0x00001fff,TRUE
),
121 HOWTO(R_SPARC_GOT22
, 10,2,22,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_GOT22", FALSE
,0,0x003fffff,TRUE
),
122 HOWTO(R_SPARC_PC10
, 0,2,10,TRUE
, 0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_PC10", FALSE
,0,0x000003ff,TRUE
),
123 HOWTO(R_SPARC_PC22
, 10,2,22,TRUE
, 0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_PC22", FALSE
,0,0x003fffff,TRUE
),
124 HOWTO(R_SPARC_WPLT30
, 2,2,30,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WPLT30", FALSE
,0,0x3fffffff,TRUE
),
125 HOWTO(R_SPARC_COPY
, 0,0,00,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_COPY", FALSE
,0,0x00000000,TRUE
),
126 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
),
127 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
),
128 HOWTO(R_SPARC_RELATIVE
, 0,0,00,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_RELATIVE",FALSE
,0,0x00000000,TRUE
),
129 HOWTO(R_SPARC_UA32
, 0,2,32,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_UA32", FALSE
,0,0xffffffff,TRUE
),
130 HOWTO(R_SPARC_PLT32
, 0,0,00,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_PLT32", FALSE
,0,0xffffffff,TRUE
),
131 HOWTO(R_SPARC_HIPLT22
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HIPLT22", FALSE
,0,0x00000000,TRUE
),
132 HOWTO(R_SPARC_LOPLT10
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_LOPLT10", FALSE
,0,0x00000000,TRUE
),
133 HOWTO(R_SPARC_PCPLT32
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT32", FALSE
,0,0x00000000,TRUE
),
134 HOWTO(R_SPARC_PCPLT22
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT22", FALSE
,0,0x00000000,TRUE
),
135 HOWTO(R_SPARC_PCPLT10
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT10", FALSE
,0,0x00000000,TRUE
),
136 HOWTO(R_SPARC_10
, 0,2,10,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_10", FALSE
,0,0x000003ff,TRUE
),
137 HOWTO(R_SPARC_11
, 0,2,11,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_11", FALSE
,0,0x000007ff,TRUE
),
138 /* These are for sparc64 in a 64 bit environment.
139 Values need to be here because the table is indexed by reloc number. */
140 HOWTO(R_SPARC_64
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_64", FALSE
,0,0x00000000,TRUE
),
141 HOWTO(R_SPARC_OLO10
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_OLO10", FALSE
,0,0x00000000,TRUE
),
142 HOWTO(R_SPARC_HH22
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HH22", FALSE
,0,0x00000000,TRUE
),
143 HOWTO(R_SPARC_HM10
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HM10", FALSE
,0,0x00000000,TRUE
),
144 HOWTO(R_SPARC_LM22
, 0,0,00,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_LM22", FALSE
,0,0x00000000,TRUE
),
145 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
),
146 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
),
147 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
),
148 /* End sparc64 in 64 bit environment values.
149 The following are for sparc64 in a 32 bit environment. */
150 HOWTO(R_SPARC_WDISP16
, 2,2,16,TRUE
, 0,complain_overflow_signed
, sparc_elf_wdisp16_reloc
,"R_SPARC_WDISP16", FALSE
,0,0x00000000,TRUE
),
151 HOWTO(R_SPARC_WDISP19
, 2,2,19,TRUE
, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP19", FALSE
,0,0x0007ffff,TRUE
),
152 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
),
153 HOWTO(R_SPARC_7
, 0,2, 7,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_7", FALSE
,0,0x0000007f,TRUE
),
154 HOWTO(R_SPARC_5
, 0,2, 5,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_5", FALSE
,0,0x0000001f,TRUE
),
155 HOWTO(R_SPARC_6
, 0,2, 6,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_6", FALSE
,0,0x0000003f,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_NONE
, 0,0, 0,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", FALSE
,0,0x00000000,TRUE
),
163 HOWTO(R_SPARC_NONE
, 0,0, 0,FALSE
,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", FALSE
,0,0x00000000,TRUE
),
164 HOWTO(R_SPARC_UA64
, 0,0, 0,FALSE
,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_UA64", FALSE
,0,0x00000000,TRUE
),
165 HOWTO(R_SPARC_UA16
, 0,1,16,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_UA16", FALSE
,0,0x0000ffff,TRUE
),
166 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
),
167 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
),
168 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
),
169 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
),
170 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
),
171 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
),
172 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
),
173 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
),
174 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
),
175 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
),
176 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
),
177 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
),
178 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
),
179 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
),
180 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
),
181 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
),
182 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
),
183 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
),
184 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
),
185 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
),
186 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
),
187 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
),
188 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
),
189 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
)
191 static reloc_howto_type elf32_sparc_vtinherit_howto
=
192 HOWTO (R_SPARC_GNU_VTINHERIT
, 0,2,0,FALSE
,0,complain_overflow_dont
, NULL
, "R_SPARC_GNU_VTINHERIT", FALSE
,0, 0, FALSE
);
193 static reloc_howto_type elf32_sparc_vtentry_howto
=
194 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
);
195 static reloc_howto_type elf32_sparc_rev32_howto
=
196 HOWTO(R_SPARC_REV32
, 0,2,32,FALSE
,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_REV32", FALSE
,0,0xffffffff,TRUE
);
198 struct elf_reloc_map
{
199 bfd_reloc_code_real_type bfd_reloc_val
;
200 unsigned char elf_reloc_val
;
203 static const struct elf_reloc_map sparc_reloc_map
[] =
205 { BFD_RELOC_NONE
, R_SPARC_NONE
, },
206 { BFD_RELOC_16
, R_SPARC_16
, },
207 { BFD_RELOC_16_PCREL
, R_SPARC_DISP16
},
208 { BFD_RELOC_8
, R_SPARC_8
},
209 { BFD_RELOC_8_PCREL
, R_SPARC_DISP8
},
210 { BFD_RELOC_CTOR
, R_SPARC_32
},
211 { BFD_RELOC_32
, R_SPARC_32
},
212 { BFD_RELOC_32_PCREL
, R_SPARC_DISP32
},
213 { BFD_RELOC_HI22
, R_SPARC_HI22
},
214 { BFD_RELOC_LO10
, R_SPARC_LO10
, },
215 { BFD_RELOC_32_PCREL_S2
, R_SPARC_WDISP30
},
216 { BFD_RELOC_SPARC_PLT32
, R_SPARC_PLT32
},
217 { BFD_RELOC_SPARC22
, R_SPARC_22
},
218 { BFD_RELOC_SPARC13
, R_SPARC_13
},
219 { BFD_RELOC_SPARC_GOT10
, R_SPARC_GOT10
},
220 { BFD_RELOC_SPARC_GOT13
, R_SPARC_GOT13
},
221 { BFD_RELOC_SPARC_GOT22
, R_SPARC_GOT22
},
222 { BFD_RELOC_SPARC_PC10
, R_SPARC_PC10
},
223 { BFD_RELOC_SPARC_PC22
, R_SPARC_PC22
},
224 { BFD_RELOC_SPARC_WPLT30
, R_SPARC_WPLT30
},
225 { BFD_RELOC_SPARC_COPY
, R_SPARC_COPY
},
226 { BFD_RELOC_SPARC_GLOB_DAT
, R_SPARC_GLOB_DAT
},
227 { BFD_RELOC_SPARC_JMP_SLOT
, R_SPARC_JMP_SLOT
},
228 { BFD_RELOC_SPARC_RELATIVE
, R_SPARC_RELATIVE
},
229 { BFD_RELOC_SPARC_WDISP22
, R_SPARC_WDISP22
},
230 { BFD_RELOC_SPARC_UA16
, R_SPARC_UA16
},
231 { BFD_RELOC_SPARC_UA32
, R_SPARC_UA32
},
232 { BFD_RELOC_SPARC_UA64
, R_SPARC_UA64
},
233 { BFD_RELOC_SPARC_10
, R_SPARC_10
},
234 { BFD_RELOC_SPARC_11
, R_SPARC_11
},
235 { BFD_RELOC_SPARC_64
, R_SPARC_64
},
236 { BFD_RELOC_SPARC_OLO10
, R_SPARC_OLO10
},
237 { BFD_RELOC_SPARC_HH22
, R_SPARC_HH22
},
238 { BFD_RELOC_SPARC_HM10
, R_SPARC_HM10
},
239 { BFD_RELOC_SPARC_LM22
, R_SPARC_LM22
},
240 { BFD_RELOC_SPARC_PC_HH22
, R_SPARC_PC_HH22
},
241 { BFD_RELOC_SPARC_PC_HM10
, R_SPARC_PC_HM10
},
242 { BFD_RELOC_SPARC_PC_LM22
, R_SPARC_PC_LM22
},
243 { BFD_RELOC_SPARC_WDISP16
, R_SPARC_WDISP16
},
244 { BFD_RELOC_SPARC_WDISP19
, R_SPARC_WDISP19
},
245 { BFD_RELOC_SPARC_7
, R_SPARC_7
},
246 { BFD_RELOC_SPARC_5
, R_SPARC_5
},
247 { BFD_RELOC_SPARC_6
, R_SPARC_6
},
248 { BFD_RELOC_SPARC_TLS_GD_HI22
, R_SPARC_TLS_GD_HI22
},
249 { BFD_RELOC_SPARC_TLS_GD_LO10
, R_SPARC_TLS_GD_LO10
},
250 { BFD_RELOC_SPARC_TLS_GD_ADD
, R_SPARC_TLS_GD_ADD
},
251 { BFD_RELOC_SPARC_TLS_GD_CALL
, R_SPARC_TLS_GD_CALL
},
252 { BFD_RELOC_SPARC_TLS_LDM_HI22
, R_SPARC_TLS_LDM_HI22
},
253 { BFD_RELOC_SPARC_TLS_LDM_LO10
, R_SPARC_TLS_LDM_LO10
},
254 { BFD_RELOC_SPARC_TLS_LDM_ADD
, R_SPARC_TLS_LDM_ADD
},
255 { BFD_RELOC_SPARC_TLS_LDM_CALL
, R_SPARC_TLS_LDM_CALL
},
256 { BFD_RELOC_SPARC_TLS_LDO_HIX22
, R_SPARC_TLS_LDO_HIX22
},
257 { BFD_RELOC_SPARC_TLS_LDO_LOX10
, R_SPARC_TLS_LDO_LOX10
},
258 { BFD_RELOC_SPARC_TLS_LDO_ADD
, R_SPARC_TLS_LDO_ADD
},
259 { BFD_RELOC_SPARC_TLS_IE_HI22
, R_SPARC_TLS_IE_HI22
},
260 { BFD_RELOC_SPARC_TLS_IE_LO10
, R_SPARC_TLS_IE_LO10
},
261 { BFD_RELOC_SPARC_TLS_IE_LD
, R_SPARC_TLS_IE_LD
},
262 { BFD_RELOC_SPARC_TLS_IE_LDX
, R_SPARC_TLS_IE_LDX
},
263 { BFD_RELOC_SPARC_TLS_IE_ADD
, R_SPARC_TLS_IE_ADD
},
264 { BFD_RELOC_SPARC_TLS_LE_HIX22
, R_SPARC_TLS_LE_HIX22
},
265 { BFD_RELOC_SPARC_TLS_LE_LOX10
, R_SPARC_TLS_LE_LOX10
},
266 { BFD_RELOC_SPARC_TLS_DTPMOD32
, R_SPARC_TLS_DTPMOD32
},
267 { BFD_RELOC_SPARC_TLS_DTPMOD64
, R_SPARC_TLS_DTPMOD64
},
268 { BFD_RELOC_SPARC_TLS_DTPOFF32
, R_SPARC_TLS_DTPOFF32
},
269 { BFD_RELOC_SPARC_TLS_DTPOFF64
, R_SPARC_TLS_DTPOFF64
},
270 { BFD_RELOC_SPARC_TLS_TPOFF32
, R_SPARC_TLS_TPOFF32
},
271 { BFD_RELOC_SPARC_TLS_TPOFF64
, R_SPARC_TLS_TPOFF64
},
272 { BFD_RELOC_VTABLE_INHERIT
, R_SPARC_GNU_VTINHERIT
},
273 { BFD_RELOC_VTABLE_ENTRY
, R_SPARC_GNU_VTENTRY
},
274 { BFD_RELOC_SPARC_REV32
, R_SPARC_REV32
}
277 static reloc_howto_type
*
278 elf32_sparc_reloc_type_lookup (abfd
, code
)
279 bfd
*abfd ATTRIBUTE_UNUSED
;
280 bfd_reloc_code_real_type code
;
286 case BFD_RELOC_VTABLE_INHERIT
:
287 return &elf32_sparc_vtinherit_howto
;
289 case BFD_RELOC_VTABLE_ENTRY
:
290 return &elf32_sparc_vtentry_howto
;
292 case BFD_RELOC_SPARC_REV32
:
293 return &elf32_sparc_rev32_howto
;
297 i
< sizeof (sparc_reloc_map
) / sizeof (struct elf_reloc_map
);
300 if (sparc_reloc_map
[i
].bfd_reloc_val
== code
)
301 return (_bfd_sparc_elf_howto_table
302 + (int) sparc_reloc_map
[i
].elf_reloc_val
);
305 bfd_set_error (bfd_error_bad_value
);
309 /* We need to use ELF32_R_TYPE so we have our own copy of this function,
310 and elf64-sparc.c has its own copy. */
313 elf32_sparc_info_to_howto (abfd
, cache_ptr
, dst
)
314 bfd
*abfd ATTRIBUTE_UNUSED
;
316 Elf_Internal_Rela
*dst
;
318 switch (ELF32_R_TYPE(dst
->r_info
))
320 case R_SPARC_GNU_VTINHERIT
:
321 cache_ptr
->howto
= &elf32_sparc_vtinherit_howto
;
324 case R_SPARC_GNU_VTENTRY
:
325 cache_ptr
->howto
= &elf32_sparc_vtentry_howto
;
329 cache_ptr
->howto
= &elf32_sparc_rev32_howto
;
333 BFD_ASSERT (ELF32_R_TYPE(dst
->r_info
) < (unsigned int) R_SPARC_max_std
);
334 cache_ptr
->howto
= &_bfd_sparc_elf_howto_table
[ELF32_R_TYPE(dst
->r_info
)];
338 /* For unsupported relocs. */
340 static bfd_reloc_status_type
341 sparc_elf_notsupported_reloc (abfd
,
348 bfd
*abfd ATTRIBUTE_UNUSED
;
349 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
350 asymbol
*symbol ATTRIBUTE_UNUSED
;
351 PTR data ATTRIBUTE_UNUSED
;
352 asection
*input_section ATTRIBUTE_UNUSED
;
353 bfd
*output_bfd ATTRIBUTE_UNUSED
;
354 char **error_message ATTRIBUTE_UNUSED
;
356 return bfd_reloc_notsupported
;
359 /* Handle the WDISP16 reloc. */
361 static bfd_reloc_status_type
362 sparc_elf_wdisp16_reloc (abfd
,
370 arelent
*reloc_entry
;
373 asection
*input_section
;
375 char **error_message ATTRIBUTE_UNUSED
;
380 if (output_bfd
!= (bfd
*) NULL
381 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
382 && (! reloc_entry
->howto
->partial_inplace
383 || reloc_entry
->addend
== 0))
385 reloc_entry
->address
+= input_section
->output_offset
;
389 if (output_bfd
!= NULL
)
390 return bfd_reloc_continue
;
392 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
393 return bfd_reloc_outofrange
;
395 relocation
= (symbol
->value
396 + symbol
->section
->output_section
->vma
397 + symbol
->section
->output_offset
);
398 relocation
+= reloc_entry
->addend
;
399 relocation
-= (input_section
->output_section
->vma
400 + input_section
->output_offset
);
401 relocation
-= reloc_entry
->address
;
403 x
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
404 x
|= ((((relocation
>> 2) & 0xc000) << 6)
405 | ((relocation
>> 2) & 0x3fff));
406 bfd_put_32 (abfd
, x
, (bfd_byte
*) data
+ reloc_entry
->address
);
408 if ((bfd_signed_vma
) relocation
< - 0x40000
409 || (bfd_signed_vma
) relocation
> 0x3ffff)
410 return bfd_reloc_overflow
;
415 /* Handle the HIX22 reloc. */
417 static bfd_reloc_status_type
418 sparc_elf_hix22_reloc (abfd
,
426 arelent
*reloc_entry
;
429 asection
*input_section
;
431 char **error_message ATTRIBUTE_UNUSED
;
436 if (output_bfd
!= (bfd
*) NULL
437 && (symbol
->flags
& BSF_SECTION_SYM
) == 0)
439 reloc_entry
->address
+= input_section
->output_offset
;
443 if (output_bfd
!= NULL
)
444 return bfd_reloc_continue
;
446 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
447 return bfd_reloc_outofrange
;
449 relocation
= (symbol
->value
450 + symbol
->section
->output_section
->vma
451 + symbol
->section
->output_offset
);
452 relocation
+= reloc_entry
->addend
;
453 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
455 insn
= (insn
&~ (bfd_vma
) 0x3fffff) | (((~relocation
) >> 10) & 0x3fffff);
456 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ reloc_entry
->address
);
461 /* Handle the LOX10 reloc. */
463 static bfd_reloc_status_type
464 sparc_elf_lox10_reloc (abfd
,
472 arelent
*reloc_entry
;
475 asection
*input_section
;
477 char **error_message ATTRIBUTE_UNUSED
;
482 if (output_bfd
!= (bfd
*) NULL
483 && (symbol
->flags
& BSF_SECTION_SYM
) == 0)
485 reloc_entry
->address
+= input_section
->output_offset
;
489 if (output_bfd
!= NULL
)
490 return bfd_reloc_continue
;
492 if (reloc_entry
->address
> bfd_get_section_limit (abfd
, input_section
))
493 return bfd_reloc_outofrange
;
495 relocation
= (symbol
->value
496 + symbol
->section
->output_section
->vma
497 + symbol
->section
->output_offset
);
498 relocation
+= reloc_entry
->addend
;
499 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
501 insn
= (insn
&~ (bfd_vma
) 0x1fff) | 0x1c00 | (relocation
& 0x3ff);
502 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ reloc_entry
->address
);
507 /* Support for core dump NOTE sections. */
510 elf32_sparc_grok_psinfo (bfd
*abfd
, Elf_Internal_Note
*note
)
512 switch (note
->descsz
)
517 case 260: /* Solaris prpsinfo_t. */
518 elf_tdata (abfd
)->core_program
519 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 84, 16);
520 elf_tdata (abfd
)->core_command
521 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 100, 80);
524 case 336: /* Solaris psinfo_t. */
525 elf_tdata (abfd
)->core_program
526 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 88, 16);
527 elf_tdata (abfd
)->core_command
528 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 104, 80);
536 /* Functions for the SPARC ELF linker. */
538 /* The name of the dynamic interpreter. This is put in the .interp
541 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
543 /* The nop opcode we use. */
545 #define SPARC_NOP 0x01000000
547 /* The size in bytes of an entry in the procedure linkage table. */
549 #define PLT_ENTRY_SIZE 12
551 /* The first four entries in a procedure linkage table are reserved,
552 and the initial contents are unimportant (we zero them out).
553 Subsequent entries look like this. See the SVR4 ABI SPARC
554 supplement to see how this works. */
556 /* sethi %hi(.-.plt0),%g1. We fill in the address later. */
557 #define PLT_ENTRY_WORD0 0x03000000
558 /* b,a .plt0. We fill in the offset later. */
559 #define PLT_ENTRY_WORD1 0x30800000
561 #define PLT_ENTRY_WORD2 SPARC_NOP
563 /* The SPARC linker needs to keep track of the number of relocs that it
564 decides to copy as dynamic relocs in check_relocs for each symbol.
565 This is so that it can later discard them if they are found to be
566 unnecessary. We store the information in a field extending the
567 regular ELF linker hash table. */
569 struct elf32_sparc_dyn_relocs
571 struct elf32_sparc_dyn_relocs
*next
;
573 /* The input section of the reloc. */
576 /* Total number of relocs copied for the input section. */
579 /* Number of pc-relative relocs copied for the input section. */
580 bfd_size_type pc_count
;
583 /* SPARC ELF linker hash entry. */
585 struct elf32_sparc_link_hash_entry
587 struct elf_link_hash_entry elf
;
589 /* Track dynamic relocs copied for this symbol. */
590 struct elf32_sparc_dyn_relocs
*dyn_relocs
;
592 #define GOT_UNKNOWN 0
596 unsigned char tls_type
;
599 #define elf32_sparc_hash_entry(ent) ((struct elf32_sparc_link_hash_entry *)(ent))
601 struct elf32_sparc_obj_tdata
603 struct elf_obj_tdata root
;
605 /* tls_type for each local got entry. */
606 char *local_got_tls_type
;
608 /* TRUE if TLS GD relocs has been seen for this object. */
609 bfd_boolean has_tlsgd
;
612 #define elf32_sparc_tdata(abfd) \
613 ((struct elf32_sparc_obj_tdata *) (abfd)->tdata.any)
615 #define elf32_sparc_local_got_tls_type(abfd) \
616 (elf32_sparc_tdata (abfd)->local_got_tls_type)
619 elf32_sparc_mkobject (abfd
)
622 bfd_size_type amt
= sizeof (struct elf32_sparc_obj_tdata
);
623 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
624 if (abfd
->tdata
.any
== NULL
)
629 /* SPARC ELF linker hash table. */
631 struct elf32_sparc_link_hash_table
633 struct elf_link_hash_table elf
;
635 /* Short-cuts to get to dynamic linker sections. */
644 bfd_signed_vma refcount
;
648 /* Small local sym to section mapping cache. */
649 struct sym_sec_cache sym_sec
;
652 /* Get the SPARC ELF linker hash table from a link_info structure. */
654 #define elf32_sparc_hash_table(p) \
655 ((struct elf32_sparc_link_hash_table *) ((p)->hash))
657 /* Create an entry in an i386 ELF linker hash table. */
659 static struct bfd_hash_entry
*
660 link_hash_newfunc (entry
, table
, string
)
661 struct bfd_hash_entry
*entry
;
662 struct bfd_hash_table
*table
;
665 /* Allocate the structure if it has not already been allocated by a
669 entry
= bfd_hash_allocate (table
,
670 sizeof (struct elf32_sparc_link_hash_entry
));
675 /* Call the allocation method of the superclass. */
676 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
679 struct elf32_sparc_link_hash_entry
*eh
;
681 eh
= (struct elf32_sparc_link_hash_entry
*) entry
;
682 eh
->dyn_relocs
= NULL
;
683 eh
->tls_type
= GOT_UNKNOWN
;
689 /* Create a SPARC ELF linker hash table. */
691 static struct bfd_link_hash_table
*
692 elf32_sparc_link_hash_table_create (abfd
)
695 struct elf32_sparc_link_hash_table
*ret
;
696 bfd_size_type amt
= sizeof (struct elf32_sparc_link_hash_table
);
698 ret
= (struct elf32_sparc_link_hash_table
*) bfd_zmalloc (amt
);
702 if (! _bfd_elf_link_hash_table_init (&ret
->elf
, abfd
, link_hash_newfunc
))
708 return &ret
->elf
.root
;
711 /* Create .got and .rela.got sections in DYNOBJ, and set up
712 shortcuts to them in our hash table. */
715 create_got_section (dynobj
, info
)
717 struct bfd_link_info
*info
;
719 struct elf32_sparc_link_hash_table
*htab
;
721 if (! _bfd_elf_create_got_section (dynobj
, info
))
724 htab
= elf32_sparc_hash_table (info
);
725 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
726 BFD_ASSERT (htab
->sgot
!= NULL
);
728 htab
->srelgot
= bfd_make_section (dynobj
, ".rela.got");
729 if (htab
->srelgot
== NULL
730 || ! bfd_set_section_flags (dynobj
, htab
->srelgot
, SEC_ALLOC
736 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 2))
741 /* Create .plt, .rela.plt, .got, .rela.got, .dynbss, and
742 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
746 elf32_sparc_create_dynamic_sections (dynobj
, info
)
748 struct bfd_link_info
*info
;
750 struct elf32_sparc_link_hash_table
*htab
;
752 htab
= elf32_sparc_hash_table (info
);
753 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
756 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
759 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
760 htab
->srelplt
= bfd_get_section_by_name (dynobj
, ".rela.plt");
761 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
763 htab
->srelbss
= bfd_get_section_by_name (dynobj
, ".rela.bss");
765 if (!htab
->splt
|| !htab
->srelplt
|| !htab
->sdynbss
766 || (!info
->shared
&& !htab
->srelbss
))
772 /* Copy the extra info we tack onto an elf_link_hash_entry. */
775 elf32_sparc_copy_indirect_symbol (bed
, dir
, ind
)
776 const struct elf_backend_data
*bed
;
777 struct elf_link_hash_entry
*dir
, *ind
;
779 struct elf32_sparc_link_hash_entry
*edir
, *eind
;
781 edir
= (struct elf32_sparc_link_hash_entry
*) dir
;
782 eind
= (struct elf32_sparc_link_hash_entry
*) ind
;
784 if (eind
->dyn_relocs
!= NULL
)
786 if (edir
->dyn_relocs
!= NULL
)
788 struct elf32_sparc_dyn_relocs
**pp
;
789 struct elf32_sparc_dyn_relocs
*p
;
791 if (ind
->root
.type
== bfd_link_hash_indirect
)
794 /* Add reloc counts against the weak sym to the strong sym
795 list. Merge any entries against the same section. */
796 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
798 struct elf32_sparc_dyn_relocs
*q
;
800 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
801 if (q
->sec
== p
->sec
)
803 q
->pc_count
+= p
->pc_count
;
804 q
->count
+= p
->count
;
811 *pp
= edir
->dyn_relocs
;
814 edir
->dyn_relocs
= eind
->dyn_relocs
;
815 eind
->dyn_relocs
= NULL
;
818 if (ind
->root
.type
== bfd_link_hash_indirect
819 && dir
->got
.refcount
<= 0)
821 edir
->tls_type
= eind
->tls_type
;
822 eind
->tls_type
= GOT_UNKNOWN
;
824 _bfd_elf_link_hash_copy_indirect (bed
, dir
, ind
);
828 elf32_sparc_tls_transition (info
, abfd
, r_type
, is_local
)
829 struct bfd_link_info
*info
;
834 if (r_type
== R_SPARC_TLS_GD_HI22
835 && ! elf32_sparc_tdata (abfd
)->has_tlsgd
)
836 r_type
= R_SPARC_REV32
;
843 case R_SPARC_TLS_GD_HI22
:
845 return R_SPARC_TLS_LE_HIX22
;
846 return R_SPARC_TLS_IE_HI22
;
847 case R_SPARC_TLS_GD_LO10
:
849 return R_SPARC_TLS_LE_LOX10
;
850 return R_SPARC_TLS_IE_LO10
;
851 case R_SPARC_TLS_IE_HI22
:
853 return R_SPARC_TLS_LE_HIX22
;
855 case R_SPARC_TLS_IE_LO10
:
857 return R_SPARC_TLS_LE_LOX10
;
859 case R_SPARC_TLS_LDM_HI22
:
860 return R_SPARC_TLS_LE_HIX22
;
861 case R_SPARC_TLS_LDM_LO10
:
862 return R_SPARC_TLS_LE_LOX10
;
868 /* Look through the relocs for a section during the first phase, and
869 allocate space in the global offset table or procedure linkage
873 elf32_sparc_check_relocs (abfd
, info
, sec
, relocs
)
875 struct bfd_link_info
*info
;
877 const Elf_Internal_Rela
*relocs
;
879 struct elf32_sparc_link_hash_table
*htab
;
880 Elf_Internal_Shdr
*symtab_hdr
;
881 struct elf_link_hash_entry
**sym_hashes
;
882 bfd_vma
*local_got_offsets
;
883 const Elf_Internal_Rela
*rel
;
884 const Elf_Internal_Rela
*rel_end
;
886 bfd_boolean checked_tlsgd
= FALSE
;
888 if (info
->relocatable
)
891 htab
= elf32_sparc_hash_table (info
);
892 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
893 sym_hashes
= elf_sym_hashes (abfd
);
894 local_got_offsets
= elf_local_got_offsets (abfd
);
898 rel_end
= relocs
+ sec
->reloc_count
;
899 for (rel
= relocs
; rel
< rel_end
; rel
++)
902 unsigned long r_symndx
;
903 struct elf_link_hash_entry
*h
;
905 r_symndx
= ELF32_R_SYM (rel
->r_info
);
906 r_type
= ELF32_R_TYPE (rel
->r_info
);
908 if (r_symndx
>= NUM_SHDR_ENTRIES (symtab_hdr
))
910 (*_bfd_error_handler
) (_("%B: bad symbol index: %d"),
915 if (r_symndx
< symtab_hdr
->sh_info
)
918 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
920 /* Compatibility with old R_SPARC_REV32 reloc conflicting
921 with R_SPARC_TLS_GD_HI22. */
925 case R_SPARC_TLS_GD_HI22
:
927 const Elf_Internal_Rela
*relt
;
929 for (relt
= rel
+ 1; relt
< rel_end
; relt
++)
930 if (ELF32_R_TYPE (relt
->r_info
) == R_SPARC_TLS_GD_LO10
931 || ELF32_R_TYPE (relt
->r_info
) == R_SPARC_TLS_GD_ADD
932 || ELF32_R_TYPE (relt
->r_info
) == R_SPARC_TLS_GD_CALL
)
934 checked_tlsgd
= TRUE
;
935 elf32_sparc_tdata (abfd
)->has_tlsgd
= relt
< rel_end
;
938 case R_SPARC_TLS_GD_LO10
:
939 case R_SPARC_TLS_GD_ADD
:
940 case R_SPARC_TLS_GD_CALL
:
941 checked_tlsgd
= TRUE
;
942 elf32_sparc_tdata (abfd
)->has_tlsgd
= TRUE
;
946 r_type
= elf32_sparc_tls_transition (info
, abfd
, r_type
, h
== NULL
);
949 case R_SPARC_TLS_LDM_HI22
:
950 case R_SPARC_TLS_LDM_LO10
:
951 htab
->tls_ldm_got
.refcount
+= 1;
954 case R_SPARC_TLS_LE_HIX22
:
955 case R_SPARC_TLS_LE_LOX10
:
960 case R_SPARC_TLS_IE_HI22
:
961 case R_SPARC_TLS_IE_LO10
:
963 info
->flags
|= DF_STATIC_TLS
;
969 case R_SPARC_TLS_GD_HI22
:
970 case R_SPARC_TLS_GD_LO10
:
971 /* This symbol requires a global offset table entry. */
973 int tls_type
, old_tls_type
;
981 tls_type
= GOT_NORMAL
;
983 case R_SPARC_TLS_GD_HI22
:
984 case R_SPARC_TLS_GD_LO10
:
985 tls_type
= GOT_TLS_GD
;
987 case R_SPARC_TLS_IE_HI22
:
988 case R_SPARC_TLS_IE_LO10
:
989 tls_type
= GOT_TLS_IE
;
995 h
->got
.refcount
+= 1;
996 old_tls_type
= elf32_sparc_hash_entry(h
)->tls_type
;
1000 bfd_signed_vma
*local_got_refcounts
;
1002 /* This is a global offset table entry for a local symbol. */
1003 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1004 if (local_got_refcounts
== NULL
)
1008 size
= symtab_hdr
->sh_info
;
1009 size
*= (sizeof (bfd_signed_vma
) + sizeof(char));
1010 local_got_refcounts
= ((bfd_signed_vma
*)
1011 bfd_zalloc (abfd
, size
));
1012 if (local_got_refcounts
== NULL
)
1014 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
1015 elf32_sparc_local_got_tls_type (abfd
)
1016 = (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
1018 local_got_refcounts
[r_symndx
] += 1;
1019 old_tls_type
= elf32_sparc_local_got_tls_type (abfd
) [r_symndx
];
1022 /* If a TLS symbol is accessed using IE at least once,
1023 there is no point to use dynamic model for it. */
1024 if (old_tls_type
!= tls_type
&& old_tls_type
!= GOT_UNKNOWN
1025 && (old_tls_type
!= GOT_TLS_GD
1026 || tls_type
!= GOT_TLS_IE
))
1028 if (old_tls_type
== GOT_TLS_IE
&& tls_type
== GOT_TLS_GD
)
1029 tls_type
= old_tls_type
;
1032 (*_bfd_error_handler
)
1033 (_("%B: `%s' accessed both as normal and thread local symbol"),
1034 abfd
, h
? h
->root
.root
.string
: "<local>");
1039 if (old_tls_type
!= tls_type
)
1042 elf32_sparc_hash_entry (h
)->tls_type
= tls_type
;
1044 elf32_sparc_local_got_tls_type (abfd
) [r_symndx
] = tls_type
;
1048 if (htab
->sgot
== NULL
)
1050 if (htab
->elf
.dynobj
== NULL
)
1051 htab
->elf
.dynobj
= abfd
;
1052 if (!create_got_section (htab
->elf
.dynobj
, info
))
1057 case R_SPARC_TLS_GD_CALL
:
1058 case R_SPARC_TLS_LDM_CALL
:
1061 /* These are basically R_SPARC_TLS_WPLT30 relocs against
1063 struct bfd_link_hash_entry
*bh
= NULL
;
1064 if (! _bfd_generic_link_add_one_symbol (info
, abfd
,
1065 "__tls_get_addr", 0,
1066 bfd_und_section_ptr
, 0,
1070 h
= (struct elf_link_hash_entry
*) bh
;
1077 case R_SPARC_WPLT30
:
1078 /* This symbol requires a procedure linkage table entry. We
1079 actually build the entry in adjust_dynamic_symbol,
1080 because this might be a case of linking PIC code without
1081 linking in any dynamic objects, in which case we don't
1082 need to generate a procedure linkage table after all. */
1086 /* The Solaris native assembler will generate a WPLT30
1087 reloc for a local symbol if you assemble a call from
1088 one section to another when using -K pic. We treat
1090 if (ELF32_R_TYPE (rel
->r_info
) == R_SPARC_PLT32
)
1097 if (ELF32_R_TYPE (rel
->r_info
) == R_SPARC_PLT32
)
1099 h
->plt
.refcount
+= 1;
1108 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1113 case R_SPARC_DISP16
:
1114 case R_SPARC_DISP32
:
1115 case R_SPARC_WDISP30
:
1116 case R_SPARC_WDISP22
:
1117 case R_SPARC_WDISP19
:
1118 case R_SPARC_WDISP16
:
1132 if (h
!= NULL
&& !info
->shared
)
1134 /* We may need a .plt entry if the function this reloc
1135 refers to is in a shared lib. */
1136 h
->plt
.refcount
+= 1;
1139 /* If we are creating a shared library, and this is a reloc
1140 against a global symbol, or a non PC relative reloc
1141 against a local symbol, then we need to copy the reloc
1142 into the shared library. However, if we are linking with
1143 -Bsymbolic, we do not need to copy a reloc against a
1144 global symbol which is defined in an object we are
1145 including in the link (i.e., DEF_REGULAR is set). At
1146 this point we have not seen all the input files, so it is
1147 possible that DEF_REGULAR is not set now but will be set
1148 later (it is never cleared). In case of a weak definition,
1149 DEF_REGULAR may be cleared later by a strong definition in
1150 a shared library. We account for that possibility below by
1151 storing information in the relocs_copied field of the hash
1152 table entry. A similar situation occurs when creating
1153 shared libraries and symbol visibility changes render the
1156 If on the other hand, we are creating an executable, we
1157 may need to keep relocations for symbols satisfied by a
1158 dynamic library if we manage to avoid copy relocs for the
1161 && (sec
->flags
& SEC_ALLOC
) != 0
1162 && (! _bfd_sparc_elf_howto_table
[r_type
].pc_relative
1164 && (! info
->symbolic
1165 || h
->root
.type
== bfd_link_hash_defweak
1166 || !h
->def_regular
))))
1168 && (sec
->flags
& SEC_ALLOC
) != 0
1170 && (h
->root
.type
== bfd_link_hash_defweak
1171 || !h
->def_regular
)))
1173 struct elf32_sparc_dyn_relocs
*p
;
1174 struct elf32_sparc_dyn_relocs
**head
;
1176 /* When creating a shared object, we must copy these
1177 relocs into the output file. We create a reloc
1178 section in dynobj and make room for the reloc. */
1184 name
= (bfd_elf_string_from_elf_section
1186 elf_elfheader (abfd
)->e_shstrndx
,
1187 elf_section_data (sec
)->rel_hdr
.sh_name
));
1191 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
1192 && strcmp (bfd_get_section_name (abfd
, sec
),
1195 if (htab
->elf
.dynobj
== NULL
)
1196 htab
->elf
.dynobj
= abfd
;
1197 dynobj
= htab
->elf
.dynobj
;
1199 sreloc
= bfd_get_section_by_name (dynobj
, name
);
1204 sreloc
= bfd_make_section (dynobj
, name
);
1205 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
1206 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
1207 if ((sec
->flags
& SEC_ALLOC
) != 0)
1208 flags
|= SEC_ALLOC
| SEC_LOAD
;
1210 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
1211 || ! bfd_set_section_alignment (dynobj
, sreloc
, 2))
1214 elf_section_data (sec
)->sreloc
= sreloc
;
1217 /* If this is a global symbol, we count the number of
1218 relocations we need for this symbol. */
1220 head
= &((struct elf32_sparc_link_hash_entry
*) h
)->dyn_relocs
;
1223 /* Track dynamic relocs needed for local syms too.
1224 We really need local syms available to do this
1228 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
1233 head
= ((struct elf32_sparc_dyn_relocs
**)
1234 &elf_section_data (s
)->local_dynrel
);
1238 if (p
== NULL
|| p
->sec
!= sec
)
1240 bfd_size_type amt
= sizeof *p
;
1241 p
= ((struct elf32_sparc_dyn_relocs
*)
1242 bfd_alloc (htab
->elf
.dynobj
, amt
));
1253 if (_bfd_sparc_elf_howto_table
[r_type
].pc_relative
)
1259 case R_SPARC_GNU_VTINHERIT
:
1260 if (!bfd_elf_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
1264 case R_SPARC_GNU_VTENTRY
:
1265 if (!bfd_elf_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
1278 elf32_sparc_gc_mark_hook (sec
, info
, rel
, h
, sym
)
1280 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1281 Elf_Internal_Rela
*rel
;
1282 struct elf_link_hash_entry
*h
;
1283 Elf_Internal_Sym
*sym
;
1287 switch (ELF32_R_TYPE (rel
->r_info
))
1289 case R_SPARC_GNU_VTINHERIT
:
1290 case R_SPARC_GNU_VTENTRY
:
1294 switch (h
->root
.type
)
1296 case bfd_link_hash_defined
:
1297 case bfd_link_hash_defweak
:
1298 return h
->root
.u
.def
.section
;
1300 case bfd_link_hash_common
:
1301 return h
->root
.u
.c
.p
->section
;
1309 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
1314 /* Update the got entry reference counts for the section being removed. */
1316 elf32_sparc_gc_sweep_hook (abfd
, info
, sec
, relocs
)
1318 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1320 const Elf_Internal_Rela
*relocs
;
1322 Elf_Internal_Shdr
*symtab_hdr
;
1323 struct elf_link_hash_entry
**sym_hashes
;
1324 bfd_signed_vma
*local_got_refcounts
;
1325 const Elf_Internal_Rela
*rel
, *relend
;
1327 elf_section_data (sec
)->local_dynrel
= NULL
;
1329 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1330 sym_hashes
= elf_sym_hashes (abfd
);
1331 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1333 relend
= relocs
+ sec
->reloc_count
;
1334 for (rel
= relocs
; rel
< relend
; rel
++)
1336 unsigned long r_symndx
;
1337 unsigned int r_type
;
1338 struct elf_link_hash_entry
*h
= NULL
;
1340 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1341 if (r_symndx
>= symtab_hdr
->sh_info
)
1343 struct elf32_sparc_link_hash_entry
*eh
;
1344 struct elf32_sparc_dyn_relocs
**pp
;
1345 struct elf32_sparc_dyn_relocs
*p
;
1347 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1348 while (h
->root
.type
== bfd_link_hash_indirect
1349 || h
->root
.type
== bfd_link_hash_warning
)
1350 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1351 eh
= (struct elf32_sparc_link_hash_entry
*) h
;
1352 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
1355 /* Everything must go for SEC. */
1361 r_type
= ELF32_R_TYPE (rel
->r_info
);
1362 r_type
= elf32_sparc_tls_transition (info
, abfd
, r_type
, h
!= NULL
);
1365 case R_SPARC_TLS_LDM_HI22
:
1366 case R_SPARC_TLS_LDM_LO10
:
1367 if (elf32_sparc_hash_table (info
)->tls_ldm_got
.refcount
> 0)
1368 elf32_sparc_hash_table (info
)->tls_ldm_got
.refcount
-= 1;
1371 case R_SPARC_TLS_GD_HI22
:
1372 case R_SPARC_TLS_GD_LO10
:
1373 case R_SPARC_TLS_IE_HI22
:
1374 case R_SPARC_TLS_IE_LO10
:
1380 if (h
->got
.refcount
> 0)
1385 if (local_got_refcounts
[r_symndx
] > 0)
1386 local_got_refcounts
[r_symndx
]--;
1393 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1398 case R_SPARC_DISP16
:
1399 case R_SPARC_DISP32
:
1400 case R_SPARC_WDISP30
:
1401 case R_SPARC_WDISP22
:
1402 case R_SPARC_WDISP19
:
1403 case R_SPARC_WDISP16
:
1418 case R_SPARC_WPLT30
:
1421 if (h
->plt
.refcount
> 0)
1434 /* Adjust a symbol defined by a dynamic object and referenced by a
1435 regular object. The current definition is in some section of the
1436 dynamic object, but we're not including those sections. We have to
1437 change the definition to something the rest of the link can
1441 elf32_sparc_adjust_dynamic_symbol (info
, h
)
1442 struct bfd_link_info
*info
;
1443 struct elf_link_hash_entry
*h
;
1445 struct elf32_sparc_link_hash_table
*htab
;
1446 struct elf32_sparc_link_hash_entry
* eh
;
1447 struct elf32_sparc_dyn_relocs
*p
;
1449 unsigned int power_of_two
;
1451 htab
= elf32_sparc_hash_table (info
);
1453 /* Make sure we know what is going on here. */
1454 BFD_ASSERT (htab
->elf
.dynobj
!= NULL
1456 || h
->u
.weakdef
!= NULL
1459 && !h
->def_regular
)));
1461 /* If this is a function, put it in the procedure linkage table. We
1462 will fill in the contents of the procedure linkage table later
1463 (although we could actually do it here). The STT_NOTYPE
1464 condition is a hack specifically for the Oracle libraries
1465 delivered for Solaris; for some inexplicable reason, they define
1466 some of their functions as STT_NOTYPE when they really should be
1468 if (h
->type
== STT_FUNC
1470 || (h
->type
== STT_NOTYPE
1471 && (h
->root
.type
== bfd_link_hash_defined
1472 || h
->root
.type
== bfd_link_hash_defweak
)
1473 && (h
->root
.u
.def
.section
->flags
& SEC_CODE
) != 0))
1475 if (h
->plt
.refcount
<= 0
1479 && h
->root
.type
!= bfd_link_hash_undefweak
1480 && h
->root
.type
!= bfd_link_hash_undefined
))
1482 /* This case can occur if we saw a WPLT30 reloc in an input
1483 file, but the symbol was never referred to by a dynamic
1484 object, or if all references were garbage collected. In
1485 such a case, we don't actually need to build a procedure
1486 linkage table, and we can just do a WDISP30 reloc instead. */
1487 h
->plt
.offset
= (bfd_vma
) -1;
1494 h
->plt
.offset
= (bfd_vma
) -1;
1496 /* If this is a weak symbol, and there is a real definition, the
1497 processor independent code will have arranged for us to see the
1498 real definition first, and we can just use the same value. */
1499 if (h
->u
.weakdef
!= NULL
)
1501 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
1502 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
1503 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
1504 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
1508 /* This is a reference to a symbol defined by a dynamic object which
1509 is not a function. */
1511 /* If we are creating a shared library, we must presume that the
1512 only references to the symbol are via the global offset table.
1513 For such cases we need not do anything here; the relocations will
1514 be handled correctly by relocate_section. */
1518 /* If there are no references to this symbol that do not use the
1519 GOT, we don't need to generate a copy reloc. */
1520 if (!h
->non_got_ref
)
1523 eh
= (struct elf32_sparc_link_hash_entry
*) h
;
1524 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1526 s
= p
->sec
->output_section
;
1527 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
1531 /* If we didn't find any dynamic relocs in read-only sections, then
1532 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
1539 /* We must allocate the symbol in our .dynbss section, which will
1540 become part of the .bss section of the executable. There will be
1541 an entry for this symbol in the .dynsym section. The dynamic
1542 object will contain position independent code, so all references
1543 from the dynamic object to this symbol will go through the global
1544 offset table. The dynamic linker will use the .dynsym entry to
1545 determine the address it must put in the global offset table, so
1546 both the dynamic object and the regular object will refer to the
1547 same memory location for the variable. */
1549 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1550 to copy the initial value out of the dynamic object and into the
1551 runtime process image. We need to remember the offset into the
1552 .rel.bss section we are going to use. */
1553 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
1555 htab
->srelbss
->size
+= sizeof (Elf32_External_Rela
);
1559 /* We need to figure out the alignment required for this symbol. I
1560 have no idea how ELF linkers handle this. */
1561 power_of_two
= bfd_log2 (h
->size
);
1562 if (power_of_two
> 3)
1565 /* Apply the required alignment. */
1567 s
->size
= BFD_ALIGN (s
->size
, (bfd_size_type
) (1 << power_of_two
));
1568 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
1570 if (! bfd_set_section_alignment (dynobj
, s
, power_of_two
))
1574 /* Define the symbol as being at this point in the section. */
1575 h
->root
.u
.def
.section
= s
;
1576 h
->root
.u
.def
.value
= s
->size
;
1578 /* Increment the section size to make room for the symbol. */
1584 /* Allocate space in .plt, .got and associated reloc sections for
1588 allocate_dynrelocs (h
, inf
)
1589 struct elf_link_hash_entry
*h
;
1592 struct bfd_link_info
*info
;
1593 struct elf32_sparc_link_hash_table
*htab
;
1594 struct elf32_sparc_link_hash_entry
*eh
;
1595 struct elf32_sparc_dyn_relocs
*p
;
1597 if (h
->root
.type
== bfd_link_hash_indirect
)
1600 if (h
->root
.type
== bfd_link_hash_warning
)
1601 /* When warning symbols are created, they **replace** the "real"
1602 entry in the hash table, thus we never get to see the real
1603 symbol in a hash traversal. So look at it now. */
1604 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1606 info
= (struct bfd_link_info
*) inf
;
1607 htab
= elf32_sparc_hash_table (info
);
1609 if (htab
->elf
.dynamic_sections_created
1610 && h
->plt
.refcount
> 0)
1612 /* Make sure this symbol is output as a dynamic symbol.
1613 Undefined weak syms won't yet be marked as dynamic. */
1614 if (h
->dynindx
== -1
1615 && !h
->forced_local
)
1617 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1621 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
, h
))
1623 asection
*s
= htab
->splt
;
1625 /* The first four entries in .plt are reserved. */
1627 s
->size
= 4 * PLT_ENTRY_SIZE
;
1629 /* The procedure linkage table has a maximum size. */
1630 if (s
->size
>= 0x400000)
1632 bfd_set_error (bfd_error_bad_value
);
1636 h
->plt
.offset
= s
->size
;
1638 /* If this symbol is not defined in a regular file, and we are
1639 not generating a shared library, then set the symbol to this
1640 location in the .plt. This is required to make function
1641 pointers compare as equal between the normal executable and
1642 the shared library. */
1646 h
->root
.u
.def
.section
= s
;
1647 h
->root
.u
.def
.value
= h
->plt
.offset
;
1650 /* Make room for this entry. */
1651 s
->size
+= PLT_ENTRY_SIZE
;
1653 /* We also need to make an entry in the .rela.plt section. */
1654 htab
->srelplt
->size
+= sizeof (Elf32_External_Rela
);
1658 h
->plt
.offset
= (bfd_vma
) -1;
1664 h
->plt
.offset
= (bfd_vma
) -1;
1668 /* If R_SPARC_TLS_IE_{HI22,LO10} symbol is now local to the binary,
1669 make it a R_SPARC_TLS_LE_{HI22,LO10} requiring no TLS entry. */
1670 if (h
->got
.refcount
> 0
1673 && elf32_sparc_hash_entry(h
)->tls_type
== GOT_TLS_IE
)
1674 h
->got
.offset
= (bfd_vma
) -1;
1675 else if (h
->got
.refcount
> 0)
1679 int tls_type
= elf32_sparc_hash_entry(h
)->tls_type
;
1681 /* Make sure this symbol is output as a dynamic symbol.
1682 Undefined weak syms won't yet be marked as dynamic. */
1683 if (h
->dynindx
== -1
1684 && !h
->forced_local
)
1686 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1691 h
->got
.offset
= s
->size
;
1693 /* R_SPARC_TLS_GD_HI{22,LO10} needs 2 consecutive GOT slots. */
1694 if (tls_type
== GOT_TLS_GD
)
1696 dyn
= htab
->elf
.dynamic_sections_created
;
1697 /* R_SPARC_TLS_IE_{HI22,LO10} needs one dynamic relocation,
1698 R_SPARC_TLS_GD_{HI22,LO10} needs one if local symbol and two if
1700 if ((tls_type
== GOT_TLS_GD
&& h
->dynindx
== -1)
1701 || tls_type
== GOT_TLS_IE
)
1702 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
1703 else if (tls_type
== GOT_TLS_GD
)
1704 htab
->srelgot
->size
+= 2 * sizeof (Elf32_External_Rela
);
1705 else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
))
1706 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
1709 h
->got
.offset
= (bfd_vma
) -1;
1711 eh
= (struct elf32_sparc_link_hash_entry
*) h
;
1712 if (eh
->dyn_relocs
== NULL
)
1715 /* In the shared -Bsymbolic case, discard space allocated for
1716 dynamic pc-relative relocs against symbols which turn out to be
1717 defined in regular objects. For the normal shared case, discard
1718 space for pc-relative relocs that have become local due to symbol
1719 visibility changes. */
1727 struct elf32_sparc_dyn_relocs
**pp
;
1729 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
1731 p
->count
-= p
->pc_count
;
1742 /* For the non-shared case, discard space for relocs against
1743 symbols which turn out to need copy relocs or are not
1749 || (htab
->elf
.dynamic_sections_created
1750 && (h
->root
.type
== bfd_link_hash_undefweak
1751 || h
->root
.type
== bfd_link_hash_undefined
))))
1753 /* Make sure this symbol is output as a dynamic symbol.
1754 Undefined weak syms won't yet be marked as dynamic. */
1755 if (h
->dynindx
== -1
1756 && !h
->forced_local
)
1758 if (! bfd_elf_link_record_dynamic_symbol (info
, h
))
1762 /* If that succeeded, we know we'll be keeping all the
1764 if (h
->dynindx
!= -1)
1768 eh
->dyn_relocs
= NULL
;
1773 /* Finally, allocate space. */
1774 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1776 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
1777 sreloc
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
1783 /* Find any dynamic relocs that apply to read-only sections. */
1786 readonly_dynrelocs (h
, inf
)
1787 struct elf_link_hash_entry
*h
;
1790 struct elf32_sparc_link_hash_entry
*eh
;
1791 struct elf32_sparc_dyn_relocs
*p
;
1793 if (h
->root
.type
== bfd_link_hash_warning
)
1794 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1796 eh
= (struct elf32_sparc_link_hash_entry
*) h
;
1797 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
1799 asection
*s
= p
->sec
->output_section
;
1801 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
1803 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
1805 info
->flags
|= DF_TEXTREL
;
1807 /* Not an error, just cut short the traversal. */
1814 /* Return true if the dynamic symbol for a given section should be
1815 omitted when creating a shared library. */
1818 elf32_sparc_omit_section_dynsym (bfd
*output_bfd
,
1819 struct bfd_link_info
*info
,
1822 /* We keep the .got section symbol so that explicit relocations
1823 against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
1824 can be turned into relocations against the .got symbol. */
1825 if (strcmp (p
->name
, ".got") == 0)
1828 return _bfd_elf_link_omit_section_dynsym (output_bfd
, info
, p
);
1831 /* Set the sizes of the dynamic sections. */
1834 elf32_sparc_size_dynamic_sections (output_bfd
, info
)
1835 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1836 struct bfd_link_info
*info
;
1838 struct elf32_sparc_link_hash_table
*htab
;
1843 htab
= elf32_sparc_hash_table (info
);
1844 dynobj
= htab
->elf
.dynobj
;
1845 BFD_ASSERT (dynobj
!= NULL
);
1847 if (elf_hash_table (info
)->dynamic_sections_created
)
1849 /* Set the contents of the .interp section to the interpreter. */
1850 if (info
->executable
)
1852 s
= bfd_get_section_by_name (dynobj
, ".interp");
1853 BFD_ASSERT (s
!= NULL
);
1854 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
1855 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
1859 /* Set up .got offsets for local syms, and space for local dynamic
1861 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
1863 bfd_signed_vma
*local_got
;
1864 bfd_signed_vma
*end_local_got
;
1865 char *local_tls_type
;
1866 bfd_size_type locsymcount
;
1867 Elf_Internal_Shdr
*symtab_hdr
;
1870 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
1873 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
1875 struct elf32_sparc_dyn_relocs
*p
;
1877 for (p
= *((struct elf32_sparc_dyn_relocs
**)
1878 &elf_section_data (s
)->local_dynrel
);
1882 if (!bfd_is_abs_section (p
->sec
)
1883 && bfd_is_abs_section (p
->sec
->output_section
))
1885 /* Input section has been discarded, either because
1886 it is a copy of a linkonce section or due to
1887 linker script /DISCARD/, so we'll be discarding
1890 else if (p
->count
!= 0)
1892 srel
= elf_section_data (p
->sec
)->sreloc
;
1893 srel
->size
+= p
->count
* sizeof (Elf32_External_Rela
);
1894 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
1895 info
->flags
|= DF_TEXTREL
;
1900 local_got
= elf_local_got_refcounts (ibfd
);
1904 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
1905 locsymcount
= symtab_hdr
->sh_info
;
1906 end_local_got
= local_got
+ locsymcount
;
1907 local_tls_type
= elf32_sparc_local_got_tls_type (ibfd
);
1909 srel
= htab
->srelgot
;
1910 for (; local_got
< end_local_got
; ++local_got
, ++local_tls_type
)
1914 *local_got
= s
->size
;
1916 if (*local_tls_type
== GOT_TLS_GD
)
1919 || *local_tls_type
== GOT_TLS_GD
1920 || *local_tls_type
== GOT_TLS_IE
)
1921 srel
->size
+= sizeof (Elf32_External_Rela
);
1924 *local_got
= (bfd_vma
) -1;
1928 if (htab
->tls_ldm_got
.refcount
> 0)
1930 /* Allocate 2 got entries and 1 dynamic reloc for
1931 R_SPARC_TLS_LDM_{HI22,LO10} relocs. */
1932 htab
->tls_ldm_got
.offset
= htab
->sgot
->size
;
1933 htab
->sgot
->size
+= 8;
1934 htab
->srelgot
->size
+= sizeof (Elf32_External_Rela
);
1937 htab
->tls_ldm_got
.offset
= -1;
1939 /* Allocate global sym .plt and .got entries, and space for global
1940 sym dynamic relocs. */
1941 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, (PTR
) info
);
1943 if (elf_hash_table (info
)->dynamic_sections_created
)
1945 /* Make space for the trailing nop in .plt. */
1946 if (htab
->splt
->size
> 0)
1947 htab
->splt
->size
+= 4;
1949 /* If the .got section is more than 0x1000 bytes, we add
1950 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
1951 bit relocations have a greater chance of working. */
1952 if (htab
->sgot
->size
>= 0x1000
1953 && elf_hash_table (info
)->hgot
->root
.u
.def
.value
== 0)
1954 elf_hash_table (info
)->hgot
->root
.u
.def
.value
= 0x1000;
1957 /* The check_relocs and adjust_dynamic_symbol entry points have
1958 determined the sizes of the various dynamic sections. Allocate
1960 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
1963 bfd_boolean strip
= FALSE
;
1965 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
1968 /* It's OK to base decisions on the section name, because none
1969 of the dynobj section names depend upon the input files. */
1970 name
= bfd_get_section_name (dynobj
, s
);
1972 if (strncmp (name
, ".rela", 5) == 0)
1976 /* If we don't need this section, strip it from the
1977 output file. This is to handle .rela.bss and
1978 .rel.plt. We must create it in
1979 create_dynamic_sections, because it must be created
1980 before the linker maps input sections to output
1981 sections. The linker does that before
1982 adjust_dynamic_symbol is called, and it is that
1983 function which decides whether anything needs to go
1984 into these sections. */
1989 /* We use the reloc_count field as a counter if we need
1990 to copy relocs into the output file. */
1994 else if (s
!= htab
->splt
&& s
!= htab
->sgot
)
1996 /* It's not one of our sections, so don't allocate space. */
2002 _bfd_strip_section_from_output (info
, s
);
2006 /* Allocate memory for the section contents. */
2007 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc.
2008 Unused entries should be reclaimed before the section's contents
2009 are written out, but at the moment this does not happen. Thus in
2010 order to prevent writing out garbage, we initialise the section's
2011 contents to zero. */
2012 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
2013 if (s
->contents
== NULL
&& s
->size
!= 0)
2017 if (elf_hash_table (info
)->dynamic_sections_created
)
2019 /* Add some entries to the .dynamic section. We fill in the
2020 values later, in elf32_sparc_finish_dynamic_sections, but we
2021 must add the entries now so that we get the correct size for
2022 the .dynamic section. The DT_DEBUG entry is filled in by the
2023 dynamic linker and used by the debugger. */
2024 #define add_dynamic_entry(TAG, VAL) \
2025 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2027 if (info
->executable
)
2029 if (!add_dynamic_entry (DT_DEBUG
, 0))
2033 if (htab
->srelplt
->size
!= 0)
2035 if (!add_dynamic_entry (DT_PLTGOT
, 0)
2036 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
2037 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
2038 || !add_dynamic_entry (DT_JMPREL
, 0))
2042 if (!add_dynamic_entry (DT_RELA
, 0)
2043 || !add_dynamic_entry (DT_RELASZ
, 0)
2044 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf32_External_Rela
)))
2047 /* If any dynamic relocs apply to a read-only section,
2048 then we need a DT_TEXTREL entry. */
2049 if ((info
->flags
& DF_TEXTREL
) == 0)
2050 elf_link_hash_traverse (&htab
->elf
, readonly_dynrelocs
,
2053 if (info
->flags
& DF_TEXTREL
)
2055 if (!add_dynamic_entry (DT_TEXTREL
, 0))
2059 #undef add_dynamic_entry
2064 struct elf32_sparc_section_data
2066 struct bfd_elf_section_data elf
;
2067 unsigned int do_relax
;
2070 #define sec_do_relax(sec) \
2071 ((struct elf32_sparc_section_data *) elf_section_data (sec))->do_relax
2074 elf32_sparc_new_section_hook (abfd
, sec
)
2078 struct elf32_sparc_section_data
*sdata
;
2079 bfd_size_type amt
= sizeof (*sdata
);
2081 sdata
= (struct elf32_sparc_section_data
*) bfd_zalloc (abfd
, amt
);
2084 sec
->used_by_bfd
= (PTR
) sdata
;
2086 return _bfd_elf_new_section_hook (abfd
, sec
);
2090 elf32_sparc_relax_section (abfd
, section
, link_info
, again
)
2091 bfd
*abfd ATTRIBUTE_UNUSED
;
2092 asection
*section ATTRIBUTE_UNUSED
;
2093 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
2097 sec_do_relax (section
) = 1;
2101 /* Return the base VMA address which should be subtracted from real addresses
2102 when resolving @dtpoff relocation.
2103 This is PT_TLS segment p_vaddr. */
2107 struct bfd_link_info
*info
;
2109 /* If tls_sec is NULL, we should have signalled an error already. */
2110 if (elf_hash_table (info
)->tls_sec
== NULL
)
2112 return elf_hash_table (info
)->tls_sec
->vma
;
2115 /* Return the relocation value for @tpoff relocation
2116 if STT_TLS virtual address is ADDRESS. */
2119 tpoff (info
, address
)
2120 struct bfd_link_info
*info
;
2123 struct elf_link_hash_table
*htab
= elf_hash_table (info
);
2125 /* If tls_sec is NULL, we should have signalled an error already. */
2126 if (htab
->tls_sec
== NULL
)
2128 return address
- htab
->tls_size
- htab
->tls_sec
->vma
;
2131 /* Relocate a SPARC ELF section. */
2134 elf32_sparc_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
2135 contents
, relocs
, local_syms
, local_sections
)
2137 struct bfd_link_info
*info
;
2139 asection
*input_section
;
2141 Elf_Internal_Rela
*relocs
;
2142 Elf_Internal_Sym
*local_syms
;
2143 asection
**local_sections
;
2145 struct elf32_sparc_link_hash_table
*htab
;
2146 Elf_Internal_Shdr
*symtab_hdr
;
2147 struct elf_link_hash_entry
**sym_hashes
;
2148 bfd_vma
*local_got_offsets
;
2151 Elf_Internal_Rela
*rel
;
2152 Elf_Internal_Rela
*relend
;
2154 if (info
->relocatable
)
2157 htab
= elf32_sparc_hash_table (info
);
2158 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2159 sym_hashes
= elf_sym_hashes (input_bfd
);
2160 local_got_offsets
= elf_local_got_offsets (input_bfd
);
2162 if (elf_hash_table (info
)->hgot
== NULL
)
2165 got_base
= elf_hash_table (info
)->hgot
->root
.u
.def
.value
;
2167 sreloc
= elf_section_data (input_section
)->sreloc
;
2170 relend
= relocs
+ input_section
->reloc_count
;
2171 for (; rel
< relend
; rel
++)
2173 int r_type
, tls_type
;
2174 reloc_howto_type
*howto
;
2175 unsigned long r_symndx
;
2176 struct elf_link_hash_entry
*h
;
2177 Elf_Internal_Sym
*sym
;
2179 bfd_vma relocation
, off
;
2180 bfd_reloc_status_type r
;
2181 bfd_boolean is_plt
= FALSE
;
2182 bfd_boolean unresolved_reloc
;
2184 r_type
= ELF32_R_TYPE (rel
->r_info
);
2186 if (r_type
== R_SPARC_GNU_VTINHERIT
2187 || r_type
== R_SPARC_GNU_VTENTRY
)
2190 if (r_type
< 0 || r_type
>= (int) R_SPARC_max_std
)
2192 bfd_set_error (bfd_error_bad_value
);
2195 howto
= _bfd_sparc_elf_howto_table
+ r_type
;
2197 /* This is a final link. */
2198 r_symndx
= ELF32_R_SYM (rel
->r_info
);
2202 unresolved_reloc
= FALSE
;
2203 if (r_symndx
< symtab_hdr
->sh_info
)
2205 sym
= local_syms
+ r_symndx
;
2206 sec
= local_sections
[r_symndx
];
2207 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &sec
, rel
);
2211 bfd_boolean warned ATTRIBUTE_UNUSED
;
2213 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
2214 r_symndx
, symtab_hdr
, sym_hashes
,
2216 unresolved_reloc
, warned
);
2224 /* Relocation is to the entry for this symbol in the global
2226 if (htab
->sgot
== NULL
)
2233 off
= h
->got
.offset
;
2234 BFD_ASSERT (off
!= (bfd_vma
) -1);
2235 dyn
= elf_hash_table (info
)->dynamic_sections_created
;
2237 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
2244 /* This is actually a static link, or it is a
2245 -Bsymbolic link and the symbol is defined
2246 locally, or the symbol was forced to be local
2247 because of a version file. We must initialize
2248 this entry in the global offset table. Since the
2249 offset must always be a multiple of 4, we use the
2250 least significant bit to record whether we have
2251 initialized it already.
2253 When doing a dynamic link, we create a .rela.got
2254 relocation entry to initialize the value. This
2255 is done in the finish_dynamic_symbol routine. */
2260 bfd_put_32 (output_bfd
, relocation
,
2261 htab
->sgot
->contents
+ off
);
2266 unresolved_reloc
= FALSE
;
2270 BFD_ASSERT (local_got_offsets
!= NULL
2271 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
2273 off
= local_got_offsets
[r_symndx
];
2275 /* The offset must always be a multiple of 4. We use
2276 the least significant bit to record whether we have
2277 already processed this entry. */
2286 Elf_Internal_Rela outrel
;
2289 /* We need to generate a R_SPARC_RELATIVE reloc
2290 for the dynamic linker. */
2292 BFD_ASSERT (s
!= NULL
);
2294 outrel
.r_offset
= (htab
->sgot
->output_section
->vma
2295 + htab
->sgot
->output_offset
2297 outrel
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
2298 outrel
.r_addend
= relocation
;
2301 loc
+= s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
2302 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
2305 bfd_put_32 (output_bfd
, relocation
,
2306 htab
->sgot
->contents
+ off
);
2307 local_got_offsets
[r_symndx
] |= 1;
2310 relocation
= htab
->sgot
->output_offset
+ off
- got_base
;
2314 if (h
== NULL
|| h
->plt
.offset
== (bfd_vma
) -1)
2316 r_type
= R_SPARC_32
;
2320 case R_SPARC_WPLT30
:
2322 /* Relocation is to the entry for this symbol in the
2323 procedure linkage table. */
2325 /* The Solaris native assembler will generate a WPLT30 reloc
2326 for a local symbol if you assemble a call from one
2327 section to another when using -K pic. We treat it as
2332 if (h
->plt
.offset
== (bfd_vma
) -1 || htab
->splt
== NULL
)
2334 /* We didn't make a PLT entry for this symbol. This
2335 happens when statically linking PIC code, or when
2336 using -Bsymbolic. */
2340 relocation
= (htab
->splt
->output_section
->vma
2341 + htab
->splt
->output_offset
2343 unresolved_reloc
= FALSE
;
2344 if (r_type
== R_SPARC_PLT32
)
2346 r_type
= R_SPARC_32
;
2355 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
2359 case R_SPARC_DISP16
:
2360 case R_SPARC_DISP32
:
2361 case R_SPARC_WDISP30
:
2362 case R_SPARC_WDISP22
:
2363 case R_SPARC_WDISP19
:
2364 case R_SPARC_WDISP16
:
2375 /* r_symndx will be zero only for relocs against symbols
2376 from removed linkonce sections, or sections discarded by
2379 || (input_section
->flags
& SEC_ALLOC
) == 0)
2384 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
2385 || h
->root
.type
!= bfd_link_hash_undefweak
)
2386 && (! howto
->pc_relative
2389 && (! info
->symbolic
2390 || !h
->def_regular
))))
2397 || h
->root
.type
== bfd_link_hash_undefweak
2398 || h
->root
.type
== bfd_link_hash_undefined
)))
2400 Elf_Internal_Rela outrel
;
2402 bfd_boolean skip
, relocate
= FALSE
;
2404 /* When generating a shared object, these relocations
2405 are copied into the output file to be resolved at run
2408 BFD_ASSERT (sreloc
!= NULL
);
2413 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2415 if (outrel
.r_offset
== (bfd_vma
) -1)
2417 else if (outrel
.r_offset
== (bfd_vma
) -2)
2418 skip
= TRUE
, relocate
= TRUE
;
2419 outrel
.r_offset
+= (input_section
->output_section
->vma
2420 + input_section
->output_offset
);
2422 /* Optimize unaligned reloc usage now that we know where
2423 it finally resides. */
2427 if (outrel
.r_offset
& 1)
2428 r_type
= R_SPARC_UA16
;
2431 if (!(outrel
.r_offset
& 1))
2432 r_type
= R_SPARC_16
;
2435 if (outrel
.r_offset
& 3)
2436 r_type
= R_SPARC_UA32
;
2439 if (!(outrel
.r_offset
& 3))
2440 r_type
= R_SPARC_32
;
2443 case R_SPARC_DISP16
:
2444 case R_SPARC_DISP32
:
2445 /* If the symbol is not dynamic, we should not keep
2446 a dynamic relocation. But an .rela.* slot has been
2447 allocated for it, output R_SPARC_NONE.
2448 FIXME: Add code tracking needed dynamic relocs as
2450 if (h
->dynindx
== -1)
2451 skip
= TRUE
, relocate
= TRUE
;
2456 memset (&outrel
, 0, sizeof outrel
);
2457 /* h->dynindx may be -1 if the symbol was marked to
2459 else if (h
!= NULL
&& ! is_plt
2460 && ((! info
->symbolic
&& h
->dynindx
!= -1)
2461 || !h
->def_regular
))
2463 BFD_ASSERT (h
->dynindx
!= -1);
2464 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
2465 outrel
.r_addend
= rel
->r_addend
;
2469 if (r_type
== R_SPARC_32
)
2471 outrel
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
2472 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2481 if (bfd_is_abs_section (sec
))
2483 else if (sec
== NULL
|| sec
->owner
== NULL
)
2485 bfd_set_error (bfd_error_bad_value
);
2492 osec
= sec
->output_section
;
2493 indx
= elf_section_data (osec
)->dynindx
;
2495 /* FIXME: we really should be able to link non-pic
2496 shared libraries. */
2500 (*_bfd_error_handler
)
2501 (_("%B: probably compiled without -fPIC?"),
2503 bfd_set_error (bfd_error_bad_value
);
2508 outrel
.r_info
= ELF32_R_INFO (indx
, r_type
);
2509 outrel
.r_addend
= relocation
+ rel
->r_addend
;
2513 loc
= sreloc
->contents
;
2514 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
2515 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
2517 /* This reloc will be computed at runtime, so there's no
2518 need to do anything now. */
2524 case R_SPARC_TLS_GD_HI22
:
2525 if (! elf32_sparc_tdata (input_bfd
)->has_tlsgd
)
2527 /* R_SPARC_REV32 used the same reloc number as
2528 R_SPARC_TLS_GD_HI22. */
2529 r_type
= R_SPARC_REV32
;
2534 case R_SPARC_TLS_GD_LO10
:
2535 case R_SPARC_TLS_IE_HI22
:
2536 case R_SPARC_TLS_IE_LO10
:
2537 r_type
= elf32_sparc_tls_transition (info
, input_bfd
, r_type
,
2539 tls_type
= GOT_UNKNOWN
;
2540 if (h
== NULL
&& local_got_offsets
)
2541 tls_type
= elf32_sparc_local_got_tls_type (input_bfd
) [r_symndx
];
2544 tls_type
= elf32_sparc_hash_entry(h
)->tls_type
;
2545 if (!info
->shared
&& h
->dynindx
== -1 && tls_type
== GOT_TLS_IE
)
2546 switch (ELF32_R_TYPE (rel
->r_info
))
2548 case R_SPARC_TLS_GD_HI22
:
2549 case R_SPARC_TLS_IE_HI22
:
2550 r_type
= R_SPARC_TLS_LE_HIX22
;
2553 r_type
= R_SPARC_TLS_LE_LOX10
;
2557 if (tls_type
== GOT_TLS_IE
)
2560 case R_SPARC_TLS_GD_HI22
:
2561 r_type
= R_SPARC_TLS_IE_HI22
;
2563 case R_SPARC_TLS_GD_LO10
:
2564 r_type
= R_SPARC_TLS_IE_LO10
;
2568 if (r_type
== R_SPARC_TLS_LE_HIX22
)
2570 relocation
= tpoff (info
, relocation
);
2573 if (r_type
== R_SPARC_TLS_LE_LOX10
)
2575 /* Change add into xor. */
2576 relocation
= tpoff (info
, relocation
);
2577 bfd_put_32 (output_bfd
, (bfd_get_32 (input_bfd
,
2578 contents
+ rel
->r_offset
)
2579 | 0x80182000), contents
+ rel
->r_offset
);
2585 off
= h
->got
.offset
;
2590 BFD_ASSERT (local_got_offsets
!= NULL
);
2591 off
= local_got_offsets
[r_symndx
];
2592 local_got_offsets
[r_symndx
] |= 1;
2596 if (htab
->sgot
== NULL
)
2603 Elf_Internal_Rela outrel
;
2604 Elf32_External_Rela
*loc
;
2607 if (htab
->srelgot
== NULL
)
2610 bfd_put_32 (output_bfd
, 0, htab
->sgot
->contents
+ off
);
2611 outrel
.r_offset
= (htab
->sgot
->output_section
->vma
2612 + htab
->sgot
->output_offset
+ off
);
2613 indx
= h
&& h
->dynindx
!= -1 ? h
->dynindx
: 0;
2614 if (r_type
== R_SPARC_TLS_IE_HI22
2615 || r_type
== R_SPARC_TLS_IE_LO10
)
2616 dr_type
= R_SPARC_TLS_TPOFF32
;
2618 dr_type
= R_SPARC_TLS_DTPMOD32
;
2619 if (dr_type
== R_SPARC_TLS_TPOFF32
&& indx
== 0)
2620 outrel
.r_addend
= relocation
- dtpoff_base (info
);
2622 outrel
.r_addend
= 0;
2623 outrel
.r_info
= ELF32_R_INFO (indx
, dr_type
);
2624 loc
= (Elf32_External_Rela
*) htab
->srelgot
->contents
;
2625 loc
+= htab
->srelgot
->reloc_count
++;
2626 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,
2629 if (r_type
== R_SPARC_TLS_GD_HI22
2630 || r_type
== R_SPARC_TLS_GD_LO10
)
2634 BFD_ASSERT (! unresolved_reloc
);
2635 bfd_put_32 (output_bfd
,
2636 relocation
- dtpoff_base (info
),
2637 htab
->sgot
->contents
+ off
+ 4);
2641 bfd_put_32 (output_bfd
, 0,
2642 htab
->sgot
->contents
+ off
+ 4);
2643 outrel
.r_info
= ELF32_R_INFO (indx
,
2644 R_SPARC_TLS_DTPOFF32
);
2645 outrel
.r_offset
+= 4;
2646 htab
->srelgot
->reloc_count
++;
2648 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,
2652 else if (dr_type
== R_SPARC_TLS_DTPMOD32
)
2654 bfd_put_32 (output_bfd
, 0,
2655 htab
->sgot
->contents
+ off
+ 4);
2659 if (off
>= (bfd_vma
) -2)
2662 relocation
= htab
->sgot
->output_offset
+ off
- got_base
;
2663 unresolved_reloc
= FALSE
;
2664 howto
= _bfd_sparc_elf_howto_table
+ r_type
;
2667 case R_SPARC_TLS_LDM_HI22
:
2668 case R_SPARC_TLS_LDM_LO10
:
2671 bfd_put_32 (output_bfd
, SPARC_NOP
, contents
+ rel
->r_offset
);
2674 off
= htab
->tls_ldm_got
.offset
;
2675 htab
->tls_ldm_got
.offset
|= 1;
2676 goto r_sparc_tlsldm
;
2678 case R_SPARC_TLS_LDO_HIX22
:
2679 case R_SPARC_TLS_LDO_LOX10
:
2681 relocation
-= dtpoff_base (info
);
2683 relocation
= tpoff (info
, relocation
);
2686 case R_SPARC_TLS_LE_HIX22
:
2687 case R_SPARC_TLS_LE_LOX10
:
2690 Elf_Internal_Rela outrel
;
2691 bfd_boolean skip
, relocate
= FALSE
;
2693 BFD_ASSERT (sreloc
!= NULL
);
2696 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
2698 if (outrel
.r_offset
== (bfd_vma
) -1)
2700 else if (outrel
.r_offset
== (bfd_vma
) -2)
2701 skip
= TRUE
, relocate
= TRUE
;
2702 outrel
.r_offset
+= (input_section
->output_section
->vma
2703 + input_section
->output_offset
);
2705 memset (&outrel
, 0, sizeof outrel
);
2708 outrel
.r_info
= ELF32_R_INFO (0, r_type
);
2709 outrel
.r_addend
= relocation
- dtpoff_base (info
)
2713 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,
2714 (bfd_byte
*) (((Elf32_External_Rela
*)
2716 + sreloc
->reloc_count
));
2717 ++sreloc
->reloc_count
;
2720 relocation
= tpoff (info
, relocation
);
2723 case R_SPARC_TLS_LDM_CALL
:
2727 bfd_put_32 (output_bfd
, 0x90100000, contents
+ rel
->r_offset
);
2732 case R_SPARC_TLS_GD_CALL
:
2733 tls_type
= GOT_UNKNOWN
;
2734 if (h
== NULL
&& local_got_offsets
)
2735 tls_type
= elf32_sparc_local_got_tls_type (input_bfd
) [r_symndx
];
2737 tls_type
= elf32_sparc_hash_entry(h
)->tls_type
;
2739 || (r_type
== R_SPARC_TLS_GD_CALL
&& tls_type
== GOT_TLS_IE
))
2743 if (!info
->shared
&& (h
== NULL
|| h
->dynindx
== -1))
2746 bfd_put_32 (output_bfd
, SPARC_NOP
, contents
+ rel
->r_offset
);
2751 if (rel
+ 1 < relend
2752 && ELF32_R_TYPE (rel
[1].r_info
) == R_SPARC_TLS_GD_ADD
2753 && rel
[1].r_offset
== rel
->r_offset
+ 4
2754 && ELF32_R_SYM (rel
[1].r_info
) == r_symndx
2755 && (((insn
= bfd_get_32 (input_bfd
,
2756 contents
+ rel
[1].r_offset
))
2757 >> 25) & 0x1f) == 8)
2760 call __tls_get_addr, %tgd_call(foo)
2761 add %reg1, %reg2, %o0, %tgd_add(foo)
2762 and change it into IE:
2763 ld [%reg1 + %reg2], %o0, %tie_ld(foo)
2764 add %g7, %o0, %o0, %tie_add(foo).
2765 add is 0x80000000 | (rd << 25) | (rs1 << 14) | rs2,
2766 ld is 0xc0000000 | (rd << 25) | (rs1 << 14) | rs2. */
2767 bfd_put_32 (output_bfd
, insn
| 0xc0000000,
2768 contents
+ rel
->r_offset
);
2769 bfd_put_32 (output_bfd
, 0x9001c008,
2770 contents
+ rel
->r_offset
+ 4);
2775 bfd_put_32 (output_bfd
, 0x9001c008, contents
+ rel
->r_offset
);
2779 h
= (struct elf_link_hash_entry
*)
2780 bfd_link_hash_lookup (info
->hash
, "__tls_get_addr", FALSE
,
2782 BFD_ASSERT (h
!= NULL
);
2783 r_type
= R_SPARC_WPLT30
;
2784 howto
= _bfd_sparc_elf_howto_table
+ r_type
;
2785 goto r_sparc_wplt30
;
2787 case R_SPARC_TLS_GD_ADD
:
2788 tls_type
= GOT_UNKNOWN
;
2789 if (h
== NULL
&& local_got_offsets
)
2790 tls_type
= elf32_sparc_local_got_tls_type (input_bfd
) [r_symndx
];
2792 tls_type
= elf32_sparc_hash_entry(h
)->tls_type
;
2793 if (! info
->shared
|| tls_type
== GOT_TLS_IE
)
2795 /* add %reg1, %reg2, %reg3, %tgd_add(foo)
2797 ld [%reg1 + %reg2], %reg3, %tie_ld(foo)
2799 add %g7, %reg2, %reg3. */
2800 bfd_vma insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2801 if ((h
!= NULL
&& h
->dynindx
!= -1) || info
->shared
)
2802 relocation
= insn
| 0xc0000000;
2804 relocation
= (insn
& ~0x7c000) | 0x1c000;
2805 bfd_put_32 (output_bfd
, relocation
, contents
+ rel
->r_offset
);
2809 case R_SPARC_TLS_LDM_ADD
:
2811 bfd_put_32 (output_bfd
, SPARC_NOP
, contents
+ rel
->r_offset
);
2814 case R_SPARC_TLS_LDO_ADD
:
2817 /* Change rs1 into %g7. */
2818 bfd_vma insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2819 insn
= (insn
& ~0x7c000) | 0x1c000;
2820 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
2824 case R_SPARC_TLS_IE_LD
:
2825 case R_SPARC_TLS_IE_LDX
:
2826 if (! info
->shared
&& (h
== NULL
|| h
->dynindx
== -1))
2828 bfd_vma insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2829 int rs2
= insn
& 0x1f;
2830 int rd
= (insn
>> 25) & 0x1f;
2833 relocation
= SPARC_NOP
;
2835 relocation
= 0x80100000 | (insn
& 0x3e00001f);
2836 bfd_put_32 (output_bfd
, relocation
, contents
+ rel
->r_offset
);
2840 case R_SPARC_TLS_IE_ADD
:
2841 /* Totally useless relocation. */
2844 case R_SPARC_TLS_DTPOFF32
:
2845 relocation
-= dtpoff_base (info
);
2852 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2853 because such sections are not SEC_ALLOC and thus ld.so will
2854 not process them. */
2855 if (unresolved_reloc
2856 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
2858 (*_bfd_error_handler
)
2859 (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
2862 (long) rel
->r_offset
,
2863 h
->root
.root
.string
);
2865 r
= bfd_reloc_continue
;
2866 if (r_type
== R_SPARC_WDISP16
)
2870 relocation
+= rel
->r_addend
;
2871 relocation
-= (input_section
->output_section
->vma
2872 + input_section
->output_offset
);
2873 relocation
-= rel
->r_offset
;
2875 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2876 x
|= ((((relocation
>> 2) & 0xc000) << 6)
2877 | ((relocation
>> 2) & 0x3fff));
2878 bfd_put_32 (input_bfd
, x
, contents
+ rel
->r_offset
);
2880 if ((bfd_signed_vma
) relocation
< - 0x40000
2881 || (bfd_signed_vma
) relocation
> 0x3ffff)
2882 r
= bfd_reloc_overflow
;
2886 else if (r_type
== R_SPARC_REV32
)
2890 relocation
= relocation
+ rel
->r_addend
;
2892 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2894 bfd_putl32 (/*input_bfd,*/ x
, contents
+ rel
->r_offset
);
2897 else if (r_type
== R_SPARC_TLS_LDO_HIX22
2898 || r_type
== R_SPARC_TLS_LE_HIX22
)
2902 relocation
+= rel
->r_addend
;
2903 relocation
= relocation
^ 0xffffffff;
2905 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2906 x
= (x
& ~(bfd_vma
) 0x3fffff) | ((relocation
>> 10) & 0x3fffff);
2907 bfd_put_32 (input_bfd
, x
, contents
+ rel
->r_offset
);
2910 else if (r_type
== R_SPARC_TLS_LDO_LOX10
2911 || r_type
== R_SPARC_TLS_LE_LOX10
)
2915 relocation
+= rel
->r_addend
;
2916 relocation
= (relocation
& 0x3ff) | 0x1c00;
2918 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2919 x
= (x
& ~(bfd_vma
) 0x1fff) | relocation
;
2920 bfd_put_32 (input_bfd
, x
, contents
+ rel
->r_offset
);
2924 else if ((r_type
== R_SPARC_WDISP30
|| r_type
== R_SPARC_WPLT30
)
2925 && sec_do_relax (input_section
)
2926 && rel
->r_offset
+ 4 < input_section
->size
)
2930 #define XCC (2 << 20)
2931 #define COND(x) (((x)&0xf)<<25)
2932 #define CONDA COND(0x8)
2933 #define INSN_BPA (F2(0,1) | CONDA | BPRED | XCC)
2934 #define INSN_BA (F2(0,2) | CONDA)
2935 #define INSN_OR F3(2, 0x2, 0)
2936 #define INSN_NOP F2(0,4)
2940 /* If the instruction is a call with either:
2942 arithmetic instruction with rd == %o7
2943 where rs1 != %o7 and rs2 if it is register != %o7
2944 then we can optimize if the call destination is near
2945 by changing the call into a branch always. */
2946 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
2947 y
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
+ 4);
2948 if ((x
& OP(~0)) == OP(1) && (y
& OP(~0)) == OP(2))
2950 if (((y
& OP3(~0)) == OP3(0x3d) /* restore */
2951 || ((y
& OP3(0x28)) == 0 /* arithmetic */
2952 && (y
& RD(~0)) == RD(O7
)))
2953 && (y
& RS1(~0)) != RS1(O7
)
2955 || (y
& RS2(~0)) != RS2(O7
)))
2959 reloc
= relocation
+ rel
->r_addend
- rel
->r_offset
;
2960 reloc
-= (input_section
->output_section
->vma
2961 + input_section
->output_offset
);
2963 /* Ensure the reloc fits into simm22. */
2964 if ((reloc
& 3) == 0
2965 && ((reloc
& ~(bfd_vma
)0x7fffff) == 0
2966 || ((reloc
| 0x7fffff) == ~(bfd_vma
)0)))
2970 /* Check whether it fits into simm19 on v9. */
2971 if (((reloc
& 0x3c0000) == 0
2972 || (reloc
& 0x3c0000) == 0x3c0000)
2973 && (elf_elfheader (output_bfd
)->e_flags
& EF_SPARC_32PLUS
))
2974 x
= INSN_BPA
| (reloc
& 0x7ffff); /* ba,pt %xcc */
2976 x
= INSN_BA
| (reloc
& 0x3fffff); /* ba */
2977 bfd_put_32 (input_bfd
, x
, contents
+ rel
->r_offset
);
2979 if (rel
->r_offset
>= 4
2980 && (y
& (0xffffffff ^ RS1(~0)))
2981 == (INSN_OR
| RD(O7
) | RS2(G0
)))
2986 z
= bfd_get_32 (input_bfd
,
2987 contents
+ rel
->r_offset
- 4);
2988 if ((z
& (0xffffffff ^ RD(~0)))
2989 != (INSN_OR
| RS1(O7
) | RS2(G0
)))
2997 If call foo was replaced with ba, replace
2998 or %rN, %g0, %o7 with nop. */
3000 reg
= (y
& RS1(~0)) >> 14;
3001 if (reg
!= ((z
& RD(~0)) >> 25)
3002 || reg
== G0
|| reg
== O7
)
3005 bfd_put_32 (input_bfd
, (bfd_vma
) INSN_NOP
,
3006 contents
+ rel
->r_offset
+ 4);
3014 if (r
== bfd_reloc_continue
)
3015 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
3016 contents
, rel
->r_offset
,
3017 relocation
, rel
->r_addend
);
3019 if (r
!= bfd_reloc_ok
)
3024 case bfd_reloc_outofrange
:
3026 case bfd_reloc_overflow
:
3034 name
= bfd_elf_string_from_elf_section (input_bfd
,
3035 symtab_hdr
->sh_link
,
3040 name
= bfd_section_name (input_bfd
, sec
);
3042 if (! ((*info
->callbacks
->reloc_overflow
)
3043 (info
, (h
? &h
->root
: NULL
), name
, howto
->name
,
3044 (bfd_vma
) 0, input_bfd
, input_section
,
3056 /* Finish up dynamic symbol handling. We set the contents of various
3057 dynamic sections here. */
3060 elf32_sparc_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
3062 struct bfd_link_info
*info
;
3063 struct elf_link_hash_entry
*h
;
3064 Elf_Internal_Sym
*sym
;
3067 struct elf32_sparc_link_hash_table
*htab
;
3069 htab
= elf32_sparc_hash_table (info
);
3070 dynobj
= htab
->elf
.dynobj
;
3072 if (h
->plt
.offset
!= (bfd_vma
) -1)
3076 Elf_Internal_Rela rela
;
3079 /* This symbol has an entry in the procedure linkage table. Set
3082 BFD_ASSERT (h
->dynindx
!= -1);
3085 srela
= htab
->srelplt
;
3086 BFD_ASSERT (splt
!= NULL
&& srela
!= NULL
);
3088 /* Fill in the entry in the procedure linkage table. */
3089 bfd_put_32 (output_bfd
,
3090 PLT_ENTRY_WORD0
+ h
->plt
.offset
,
3091 splt
->contents
+ h
->plt
.offset
);
3092 bfd_put_32 (output_bfd
,
3094 + (((- (h
->plt
.offset
+ 4)) >> 2) & 0x3fffff)),
3095 splt
->contents
+ h
->plt
.offset
+ 4);
3096 bfd_put_32 (output_bfd
, (bfd_vma
) PLT_ENTRY_WORD2
,
3097 splt
->contents
+ h
->plt
.offset
+ 8);
3099 /* Fill in the entry in the .rela.plt section. */
3100 rela
.r_offset
= (splt
->output_section
->vma
3101 + splt
->output_offset
3103 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_JMP_SLOT
);
3105 loc
= srela
->contents
;
3106 loc
+= (h
->plt
.offset
/ PLT_ENTRY_SIZE
- 4) * sizeof (Elf32_External_Rela
);
3107 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
3109 if (!h
->def_regular
)
3111 /* Mark the symbol as undefined, rather than as defined in
3112 the .plt section. Leave the value alone. */
3113 sym
->st_shndx
= SHN_UNDEF
;
3114 /* If the symbol is weak, we do need to clear the value.
3115 Otherwise, the PLT entry would provide a definition for
3116 the symbol even if the symbol wasn't defined anywhere,
3117 and so the symbol would never be NULL. */
3118 if (!h
->ref_regular_nonweak
)
3123 if (h
->got
.offset
!= (bfd_vma
) -1
3124 && elf32_sparc_hash_entry(h
)->tls_type
!= GOT_TLS_GD
3125 && elf32_sparc_hash_entry(h
)->tls_type
!= GOT_TLS_IE
)
3129 Elf_Internal_Rela rela
;
3132 /* This symbol has an entry in the global offset table. Set it
3136 srela
= htab
->srelgot
;
3137 BFD_ASSERT (sgot
!= NULL
&& srela
!= NULL
);
3139 rela
.r_offset
= (sgot
->output_section
->vma
3140 + sgot
->output_offset
3141 + (h
->got
.offset
&~ (bfd_vma
) 1));
3143 /* If this is a -Bsymbolic link, and the symbol is defined
3144 locally, we just want to emit a RELATIVE reloc. Likewise if
3145 the symbol was forced to be local because of a version file.
3146 The entry in the global offset table will already have been
3147 initialized in the relocate_section function. */
3149 && (info
->symbolic
|| h
->dynindx
== -1)
3152 asection
*sec
= h
->root
.u
.def
.section
;
3153 rela
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
3154 rela
.r_addend
= (h
->root
.u
.def
.value
3155 + sec
->output_section
->vma
3156 + sec
->output_offset
);
3160 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_GLOB_DAT
);
3164 bfd_put_32 (output_bfd
, (bfd_vma
) 0,
3165 sgot
->contents
+ (h
->got
.offset
&~ (bfd_vma
) 1));
3166 loc
= srela
->contents
;
3167 loc
+= srela
->reloc_count
++ * sizeof (Elf32_External_Rela
);
3168 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
3174 Elf_Internal_Rela rela
;
3177 /* This symbols needs a copy reloc. Set it up. */
3179 BFD_ASSERT (h
->dynindx
!= -1);
3181 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
3183 BFD_ASSERT (s
!= NULL
);
3185 rela
.r_offset
= (h
->root
.u
.def
.value
3186 + h
->root
.u
.def
.section
->output_section
->vma
3187 + h
->root
.u
.def
.section
->output_offset
);
3188 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_COPY
);
3190 loc
= s
->contents
+ s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
3191 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
3194 /* Mark some specially defined symbols as absolute. */
3195 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
3196 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
3197 || strcmp (h
->root
.root
.string
, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3198 sym
->st_shndx
= SHN_ABS
;
3203 /* Finish up the dynamic sections. */
3206 elf32_sparc_finish_dynamic_sections (output_bfd
, info
)
3208 struct bfd_link_info
*info
;
3212 struct elf32_sparc_link_hash_table
*htab
;
3214 htab
= elf32_sparc_hash_table (info
);
3215 dynobj
= htab
->elf
.dynobj
;
3217 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
3219 if (elf_hash_table (info
)->dynamic_sections_created
)
3222 Elf32_External_Dyn
*dyncon
, *dynconend
;
3224 splt
= bfd_get_section_by_name (dynobj
, ".plt");
3225 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
3227 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
3228 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
3229 for (; dyncon
< dynconend
; dyncon
++)
3231 Elf_Internal_Dyn dyn
;
3235 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
3239 case DT_PLTGOT
: name
= ".plt"; size
= FALSE
; break;
3240 case DT_PLTRELSZ
: name
= ".rela.plt"; size
= TRUE
; break;
3241 case DT_JMPREL
: name
= ".rela.plt"; size
= FALSE
; break;
3242 default: name
= NULL
; size
= FALSE
; break;
3249 s
= bfd_get_section_by_name (output_bfd
, name
);
3255 dyn
.d_un
.d_ptr
= s
->vma
;
3257 dyn
.d_un
.d_val
= s
->size
;
3259 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
3263 /* Clear the first four entries in the procedure linkage table,
3264 and put a nop in the last four bytes. */
3267 memset (splt
->contents
, 0, 4 * PLT_ENTRY_SIZE
);
3268 bfd_put_32 (output_bfd
, (bfd_vma
) SPARC_NOP
,
3269 splt
->contents
+ splt
->size
- 4);
3272 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 0;
3275 /* Set the first entry in the global offset table to the address of
3276 the dynamic section. */
3277 if (htab
->sgot
&& htab
->sgot
->size
> 0)
3280 bfd_put_32 (output_bfd
, (bfd_vma
) 0, htab
->sgot
->contents
);
3282 bfd_put_32 (output_bfd
,
3283 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
3284 htab
->sgot
->contents
);
3288 elf_section_data (htab
->sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
3293 /* Functions for dealing with the e_flags field.
3295 We don't define set_private_flags or copy_private_bfd_data because
3296 the only currently defined values are based on the bfd mach number,
3297 so we use the latter instead and defer setting e_flags until the
3298 file is written out. */
3300 /* Merge backend specific data from an object file to the output
3301 object file when linking. */
3304 elf32_sparc_merge_private_bfd_data (ibfd
, obfd
)
3309 unsigned long ibfd_mach
;
3310 /* FIXME: This should not be static. */
3311 static unsigned long previous_ibfd_e_flags
= (unsigned long) -1;
3313 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
3314 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
3319 ibfd_mach
= bfd_get_mach (ibfd
);
3320 if (bfd_mach_sparc_64bit_p (ibfd_mach
))
3323 (*_bfd_error_handler
)
3324 (_("%B: compiled for a 64 bit system and target is 32 bit"), ibfd
);
3326 else if ((ibfd
->flags
& DYNAMIC
) == 0)
3328 if (bfd_get_mach (obfd
) < ibfd_mach
)
3329 bfd_set_arch_mach (obfd
, bfd_arch_sparc
, ibfd_mach
);
3332 if (((elf_elfheader (ibfd
)->e_flags
& EF_SPARC_LEDATA
)
3333 != previous_ibfd_e_flags
)
3334 && previous_ibfd_e_flags
!= (unsigned long) -1)
3336 (*_bfd_error_handler
)
3337 (_("%B: linking little endian files with big endian files"), ibfd
);
3340 previous_ibfd_e_flags
= elf_elfheader (ibfd
)->e_flags
& EF_SPARC_LEDATA
;
3344 bfd_set_error (bfd_error_bad_value
);
3351 /* Set the right machine number. */
3354 elf32_sparc_object_p (abfd
)
3357 if (elf_elfheader (abfd
)->e_machine
== EM_SPARC32PLUS
)
3359 if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_SUN_US3
)
3360 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
3361 bfd_mach_sparc_v8plusb
);
3362 else if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_SUN_US1
)
3363 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
3364 bfd_mach_sparc_v8plusa
);
3365 else if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_32PLUS
)
3366 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
3367 bfd_mach_sparc_v8plus
);
3371 else if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_LEDATA
)
3372 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
3373 bfd_mach_sparc_sparclite_le
);
3375 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
, bfd_mach_sparc
);
3378 /* The final processing done just before writing out the object file.
3379 We need to set the e_machine field appropriately. */
3382 elf32_sparc_final_write_processing (abfd
, linker
)
3384 bfd_boolean linker ATTRIBUTE_UNUSED
;
3386 switch (bfd_get_mach (abfd
))
3388 case bfd_mach_sparc
:
3389 case bfd_mach_sparc_sparclet
:
3390 case bfd_mach_sparc_sparclite
:
3391 break; /* nothing to do */
3392 case bfd_mach_sparc_v8plus
:
3393 elf_elfheader (abfd
)->e_machine
= EM_SPARC32PLUS
;
3394 elf_elfheader (abfd
)->e_flags
&=~ EF_SPARC_32PLUS_MASK
;
3395 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_32PLUS
;
3397 case bfd_mach_sparc_v8plusa
:
3398 elf_elfheader (abfd
)->e_machine
= EM_SPARC32PLUS
;
3399 elf_elfheader (abfd
)->e_flags
&=~ EF_SPARC_32PLUS_MASK
;
3400 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_32PLUS
| EF_SPARC_SUN_US1
;
3402 case bfd_mach_sparc_v8plusb
:
3403 elf_elfheader (abfd
)->e_machine
= EM_SPARC32PLUS
;
3404 elf_elfheader (abfd
)->e_flags
&=~ EF_SPARC_32PLUS_MASK
;
3405 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_32PLUS
| EF_SPARC_SUN_US1
3408 case bfd_mach_sparc_sparclite_le
:
3409 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_LEDATA
;
3417 static enum elf_reloc_type_class
3418 elf32_sparc_reloc_type_class (rela
)
3419 const Elf_Internal_Rela
*rela
;
3421 switch ((int) ELF32_R_TYPE (rela
->r_info
))
3423 case R_SPARC_RELATIVE
:
3424 return reloc_class_relative
;
3425 case R_SPARC_JMP_SLOT
:
3426 return reloc_class_plt
;
3428 return reloc_class_copy
;
3430 return reloc_class_normal
;
3434 /* Return address for Ith PLT stub in section PLT, for relocation REL
3435 or (bfd_vma) -1 if it should not be included. */
3438 elf32_sparc_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED
,
3439 const asection
*plt ATTRIBUTE_UNUSED
,
3442 return rel
->address
;
3445 #define TARGET_BIG_SYM bfd_elf32_sparc_vec
3446 #define TARGET_BIG_NAME "elf32-sparc"
3447 #define ELF_ARCH bfd_arch_sparc
3448 #define ELF_MACHINE_CODE EM_SPARC
3449 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
3450 #define ELF_MAXPAGESIZE 0x10000
3452 #define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
3453 #define bfd_elf32_bfd_link_hash_table_create \
3454 elf32_sparc_link_hash_table_create
3455 #define bfd_elf32_bfd_relax_section elf32_sparc_relax_section
3456 #define bfd_elf32_new_section_hook elf32_sparc_new_section_hook
3457 #define elf_info_to_howto elf32_sparc_info_to_howto
3458 #define elf_backend_copy_indirect_symbol \
3459 elf32_sparc_copy_indirect_symbol
3460 #define elf_backend_create_dynamic_sections \
3461 elf32_sparc_create_dynamic_sections
3462 #define elf_backend_check_relocs elf32_sparc_check_relocs
3463 #define elf_backend_adjust_dynamic_symbol \
3464 elf32_sparc_adjust_dynamic_symbol
3465 #define elf_backend_omit_section_dynsym elf32_sparc_omit_section_dynsym
3466 #define elf_backend_size_dynamic_sections \
3467 elf32_sparc_size_dynamic_sections
3468 #define elf_backend_relocate_section elf32_sparc_relocate_section
3469 #define elf_backend_finish_dynamic_symbol \
3470 elf32_sparc_finish_dynamic_symbol
3471 #define elf_backend_finish_dynamic_sections \
3472 elf32_sparc_finish_dynamic_sections
3473 #define bfd_elf32_bfd_merge_private_bfd_data \
3474 elf32_sparc_merge_private_bfd_data
3475 #define bfd_elf32_mkobject elf32_sparc_mkobject
3476 #define elf_backend_object_p elf32_sparc_object_p
3477 #define elf_backend_final_write_processing \
3478 elf32_sparc_final_write_processing
3479 #define elf_backend_gc_mark_hook elf32_sparc_gc_mark_hook
3480 #define elf_backend_gc_sweep_hook elf32_sparc_gc_sweep_hook
3481 #define elf_backend_grok_psinfo elf32_sparc_grok_psinfo
3482 #define elf_backend_reloc_type_class elf32_sparc_reloc_type_class
3483 #define elf_backend_plt_sym_val elf32_sparc_plt_sym_val
3485 #define elf_backend_can_gc_sections 1
3486 #define elf_backend_can_refcount 1
3487 #define elf_backend_want_got_plt 0
3488 #define elf_backend_plt_readonly 0
3489 #define elf_backend_want_plt_sym 1
3490 #define elf_backend_got_header_size 4
3491 #define elf_backend_rela_normal 1
3493 #include "elf32-target.h"