1 /* SPARC-specific support for 32-bit ELF
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
25 #include "elf/sparc.h"
27 static reloc_howto_type
*elf32_sparc_reloc_type_lookup
28 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
29 static void elf32_sparc_info_to_howto
30 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
31 static boolean elf32_sparc_check_relocs
32 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
33 const Elf_Internal_Rela
*));
34 static boolean elf32_sparc_adjust_dynamic_symbol
35 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
36 static boolean elf32_sparc_adjust_dynindx
37 PARAMS ((struct elf_link_hash_entry
*, PTR
));
38 static boolean elf32_sparc_size_dynamic_sections
39 PARAMS ((bfd
*, struct bfd_link_info
*));
40 static boolean elf32_sparc_relocate_section
41 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
42 Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
43 static boolean elf32_sparc_finish_dynamic_symbol
44 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
46 static boolean elf32_sparc_finish_dynamic_sections
47 PARAMS ((bfd
*, struct bfd_link_info
*));
48 static boolean elf32_sparc_merge_private_bfd_data
PARAMS ((bfd
*, bfd
*));
49 static boolean elf32_sparc_object_p
51 static void elf32_sparc_final_write_processing
52 PARAMS ((bfd
*, boolean
));
54 /* The relocation "howto" table. */
56 static bfd_reloc_status_type sparc_elf_notsupported_reloc
57 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
58 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
59 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
61 reloc_howto_type _bfd_sparc_elf_howto_table
[] =
63 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
64 HOWTO(R_SPARC_8
, 0,0, 8,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_8", false,0,0x000000ff,true),
65 HOWTO(R_SPARC_16
, 0,1,16,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_16", false,0,0x0000ffff,true),
66 HOWTO(R_SPARC_32
, 0,2,32,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_32", false,0,0xffffffff,true),
67 HOWTO(R_SPARC_DISP8
, 0,0, 8,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP8", false,0,0x000000ff,true),
68 HOWTO(R_SPARC_DISP16
, 0,1,16,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP16", false,0,0x0000ffff,true),
69 HOWTO(R_SPARC_DISP32
, 0,2,32,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_DISP32", false,0,0x00ffffff,true),
70 HOWTO(R_SPARC_WDISP30
, 2,2,30,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP30", false,0,0x3fffffff,true),
71 HOWTO(R_SPARC_WDISP22
, 2,2,22,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP22", false,0,0x003fffff,true),
72 HOWTO(R_SPARC_HI22
, 10,2,22,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_HI22", false,0,0x003fffff,true),
73 HOWTO(R_SPARC_22
, 0,2,22,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_22", false,0,0x003fffff,true),
74 HOWTO(R_SPARC_13
, 0,2,13,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_13", false,0,0x00001fff,true),
75 HOWTO(R_SPARC_LO10
, 0,2,10,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_LO10", false,0,0x000003ff,true),
76 HOWTO(R_SPARC_GOT10
, 0,2,10,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_GOT10", false,0,0x000003ff,true),
77 HOWTO(R_SPARC_GOT13
, 0,2,13,false,0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_GOT13", false,0,0x00001fff,true),
78 HOWTO(R_SPARC_GOT22
, 10,2,22,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_GOT22", false,0,0x003fffff,true),
79 HOWTO(R_SPARC_PC10
, 0,2,10,true, 0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_PC10", false,0,0x000003ff,true),
80 HOWTO(R_SPARC_PC22
, 10,2,22,true, 0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_PC22", false,0,0x003fffff,true),
81 HOWTO(R_SPARC_WPLT30
, 2,2,30,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WPLT30", false,0,0x3fffffff,true),
82 HOWTO(R_SPARC_COPY
, 0,0,00,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_COPY", false,0,0x00000000,true),
83 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),
84 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),
85 HOWTO(R_SPARC_RELATIVE
, 0,0,00,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_RELATIVE",false,0,0x00000000,true),
86 HOWTO(R_SPARC_UA32
, 0,0,00,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_UA32", false,0,0x00000000,true),
87 HOWTO(R_SPARC_PLT32
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PLT32", false,0,0x00000000,true),
88 HOWTO(R_SPARC_HIPLT22
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HIPLT22", false,0,0x00000000,true),
89 HOWTO(R_SPARC_LOPLT10
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_LOPLT10", false,0,0x00000000,true),
90 HOWTO(R_SPARC_PCPLT32
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT32", false,0,0x00000000,true),
91 HOWTO(R_SPARC_PCPLT22
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT22", false,0,0x00000000,true),
92 HOWTO(R_SPARC_PCPLT10
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_PCPLT10", false,0,0x00000000,true),
93 HOWTO(R_SPARC_10
, 0,2,10,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_10", false,0,0x000003ff,true),
94 HOWTO(R_SPARC_11
, 0,2,11,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_11", false,0,0x000007ff,true),
95 /* These are for sparc64 in a 64 bit environment.
96 Values need to be here because the table is indexed by reloc number. */
97 HOWTO(R_SPARC_64
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_64", false,0,0x00000000,true),
98 HOWTO(R_SPARC_OLO10
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_OLO10", false,0,0x00000000,true),
99 HOWTO(R_SPARC_HH22
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HH22", false,0,0x00000000,true),
100 HOWTO(R_SPARC_HM10
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_HM10", false,0,0x00000000,true),
101 HOWTO(R_SPARC_LM22
, 0,0,00,false,0,complain_overflow_dont
, sparc_elf_notsupported_reloc
, "R_SPARC_LM22", false,0,0x00000000,true),
102 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),
103 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),
104 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),
105 /* End sparc64 in 64 bit environment values.
106 The following are for sparc64 in a 32 bit environment. */
107 HOWTO(R_SPARC_WDISP16
, 2,2,16,true, 0,complain_overflow_signed
, sparc_elf_wdisp16_reloc
,"R_SPARC_WDISP16", false,0,0x00000000,true),
108 HOWTO(R_SPARC_WDISP19
, 2,2,19,true, 0,complain_overflow_signed
, bfd_elf_generic_reloc
, "R_SPARC_WDISP19", false,0,0x0007ffff,true),
109 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),
110 HOWTO(R_SPARC_7
, 0,2, 7,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_7", false,0,0x0000007f,true),
111 HOWTO(R_SPARC_5
, 0,2, 5,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_5", false,0,0x0000001f,true),
112 HOWTO(R_SPARC_6
, 0,2, 6,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_6", false,0,0x0000003f,true),
113 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
114 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
115 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
116 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
117 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
118 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
119 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
120 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
121 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
122 HOWTO(R_SPARC_NONE
, 0,0, 0,false,0,complain_overflow_dont
, bfd_elf_generic_reloc
, "R_SPARC_NONE", false,0,0x00000000,true),
123 HOWTO(R_SPARC_32LE
, 0,2,32,false,0,complain_overflow_bitfield
,bfd_elf_generic_reloc
, "R_SPARC_32LE", false,0,0xffffffff,true)
126 struct elf_reloc_map
{
127 unsigned char bfd_reloc_val
;
128 unsigned char elf_reloc_val
;
131 static CONST
struct elf_reloc_map sparc_reloc_map
[] =
133 { BFD_RELOC_NONE
, R_SPARC_NONE
, },
134 { BFD_RELOC_16
, R_SPARC_16
, },
135 { BFD_RELOC_8
, R_SPARC_8
},
136 { BFD_RELOC_8_PCREL
, R_SPARC_DISP8
},
137 { BFD_RELOC_CTOR
, R_SPARC_32
},
138 { BFD_RELOC_32
, R_SPARC_32
},
139 { BFD_RELOC_32_PCREL
, R_SPARC_DISP32
},
140 { BFD_RELOC_HI22
, R_SPARC_HI22
},
141 { BFD_RELOC_LO10
, R_SPARC_LO10
, },
142 { BFD_RELOC_32_PCREL_S2
, R_SPARC_WDISP30
},
143 { BFD_RELOC_SPARC22
, R_SPARC_22
},
144 { BFD_RELOC_SPARC13
, R_SPARC_13
},
145 { BFD_RELOC_SPARC_GOT10
, R_SPARC_GOT10
},
146 { BFD_RELOC_SPARC_GOT13
, R_SPARC_GOT13
},
147 { BFD_RELOC_SPARC_GOT22
, R_SPARC_GOT22
},
148 { BFD_RELOC_SPARC_PC10
, R_SPARC_PC10
},
149 { BFD_RELOC_SPARC_PC22
, R_SPARC_PC22
},
150 { BFD_RELOC_SPARC_WPLT30
, R_SPARC_WPLT30
},
151 { BFD_RELOC_SPARC_COPY
, R_SPARC_COPY
},
152 { BFD_RELOC_SPARC_GLOB_DAT
, R_SPARC_GLOB_DAT
},
153 { BFD_RELOC_SPARC_JMP_SLOT
, R_SPARC_JMP_SLOT
},
154 { BFD_RELOC_SPARC_RELATIVE
, R_SPARC_RELATIVE
},
155 { BFD_RELOC_SPARC_WDISP22
, R_SPARC_WDISP22
},
156 /* ??? Doesn't dwarf use this? */
157 /*{ BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */
158 {BFD_RELOC_SPARC_10
, R_SPARC_10
},
159 {BFD_RELOC_SPARC_11
, R_SPARC_11
},
160 {BFD_RELOC_SPARC_64
, R_SPARC_64
},
161 {BFD_RELOC_SPARC_OLO10
, R_SPARC_OLO10
},
162 {BFD_RELOC_SPARC_HH22
, R_SPARC_HH22
},
163 {BFD_RELOC_SPARC_HM10
, R_SPARC_HM10
},
164 {BFD_RELOC_SPARC_LM22
, R_SPARC_LM22
},
165 {BFD_RELOC_SPARC_PC_HH22
, R_SPARC_PC_HH22
},
166 {BFD_RELOC_SPARC_PC_HM10
, R_SPARC_PC_HM10
},
167 {BFD_RELOC_SPARC_PC_LM22
, R_SPARC_PC_LM22
},
168 {BFD_RELOC_SPARC_WDISP16
, R_SPARC_WDISP16
},
169 {BFD_RELOC_SPARC_WDISP19
, R_SPARC_WDISP19
},
170 {BFD_RELOC_SPARC_7
, R_SPARC_7
},
171 {BFD_RELOC_SPARC_5
, R_SPARC_5
},
172 {BFD_RELOC_SPARC_6
, R_SPARC_6
},
173 {BFD_RELOC_SPARC_32LE
, R_SPARC_32LE
},
176 static reloc_howto_type
*
177 elf32_sparc_reloc_type_lookup (abfd
, code
)
179 bfd_reloc_code_real_type code
;
182 for (i
= 0; i
< sizeof (sparc_reloc_map
) / sizeof (struct elf_reloc_map
); i
++)
184 if (sparc_reloc_map
[i
].bfd_reloc_val
== code
)
185 return &_bfd_sparc_elf_howto_table
[(int) sparc_reloc_map
[i
].elf_reloc_val
];
190 /* We need to use ELF32_R_TYPE so we have our own copy of this function,
191 and elf64-sparc.c has its own copy. */
194 elf32_sparc_info_to_howto (abfd
, cache_ptr
, dst
)
197 Elf_Internal_Rela
*dst
;
199 BFD_ASSERT (ELF32_R_TYPE(dst
->r_info
) < (unsigned int) R_SPARC_max
);
200 cache_ptr
->howto
= &_bfd_sparc_elf_howto_table
[ELF32_R_TYPE(dst
->r_info
)];
203 /* For unsupported relocs. */
205 static bfd_reloc_status_type
206 sparc_elf_notsupported_reloc (abfd
,
214 arelent
*reloc_entry
;
217 asection
*input_section
;
219 char **error_message
;
221 return bfd_reloc_notsupported
;
224 /* Handle the WDISP16 reloc. */
226 static bfd_reloc_status_type
227 sparc_elf_wdisp16_reloc (abfd
,
235 arelent
*reloc_entry
;
238 asection
*input_section
;
240 char **error_message
;
245 if (output_bfd
!= (bfd
*) NULL
246 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
247 && (! reloc_entry
->howto
->partial_inplace
248 || reloc_entry
->addend
== 0))
250 reloc_entry
->address
+= input_section
->output_offset
;
254 if (output_bfd
!= NULL
)
255 return bfd_reloc_continue
;
257 if (reloc_entry
->address
> input_section
->_cooked_size
)
258 return bfd_reloc_outofrange
;
260 relocation
= (symbol
->value
261 + symbol
->section
->output_section
->vma
262 + symbol
->section
->output_offset
);
263 relocation
+= reloc_entry
->addend
;
264 relocation
-= (input_section
->output_section
->vma
265 + input_section
->output_offset
);
266 relocation
-= reloc_entry
->address
;
268 x
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
269 x
|= ((((relocation
>> 2) & 0xc000) << 6)
270 | ((relocation
>> 2) & 0x3fff));
271 bfd_put_32 (abfd
, x
, (bfd_byte
*) data
+ reloc_entry
->address
);
273 if ((bfd_signed_vma
) relocation
< - 0x40000
274 || (bfd_signed_vma
) relocation
> 0x3ffff)
275 return bfd_reloc_overflow
;
280 /* Functions for the SPARC ELF linker. */
282 /* The name of the dynamic interpreter. This is put in the .interp
285 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
287 /* The nop opcode we use. */
289 #define SPARC_NOP 0x01000000
291 /* The size in bytes of an entry in the procedure linkage table. */
293 #define PLT_ENTRY_SIZE 12
295 /* The first four entries in a procedure linkage table are reserved,
296 and the initial contents are unimportant (we zero them out).
297 Subsequent entries look like this. See the SVR4 ABI SPARC
298 supplement to see how this works. */
300 /* sethi %hi(.-.plt0),%g1. We fill in the address later. */
301 #define PLT_ENTRY_WORD0 0x03000000
302 /* b,a .plt0. We fill in the offset later. */
303 #define PLT_ENTRY_WORD1 0x30800000
305 #define PLT_ENTRY_WORD2 SPARC_NOP
307 /* Look through the relocs for a section during the first phase, and
308 allocate space in the global offset table or procedure linkage
312 elf32_sparc_check_relocs (abfd
, info
, sec
, relocs
)
314 struct bfd_link_info
*info
;
316 const Elf_Internal_Rela
*relocs
;
319 Elf_Internal_Shdr
*symtab_hdr
;
320 struct elf_link_hash_entry
**sym_hashes
;
321 bfd_vma
*local_got_offsets
;
322 const Elf_Internal_Rela
*rel
;
323 const Elf_Internal_Rela
*rel_end
;
328 if (info
->relocateable
)
331 dynobj
= elf_hash_table (info
)->dynobj
;
332 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
333 sym_hashes
= elf_sym_hashes (abfd
);
334 local_got_offsets
= elf_local_got_offsets (abfd
);
340 rel_end
= relocs
+ sec
->reloc_count
;
341 for (rel
= relocs
; rel
< rel_end
; rel
++)
343 unsigned long r_symndx
;
344 struct elf_link_hash_entry
*h
;
346 r_symndx
= ELF32_R_SYM (rel
->r_info
);
347 if (r_symndx
< symtab_hdr
->sh_info
)
350 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
352 switch (ELF32_R_TYPE (rel
->r_info
))
357 /* This symbol requires a global offset table entry. */
361 /* Create the .got section. */
362 elf_hash_table (info
)->dynobj
= dynobj
= abfd
;
363 if (! _bfd_elf_create_got_section (dynobj
, info
))
369 sgot
= bfd_get_section_by_name (dynobj
, ".got");
370 BFD_ASSERT (sgot
!= NULL
);
374 && (h
!= NULL
|| info
->shared
))
376 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
379 srelgot
= bfd_make_section (dynobj
, ".rela.got");
381 || ! bfd_set_section_flags (dynobj
, srelgot
,
388 || ! bfd_set_section_alignment (dynobj
, srelgot
, 2))
395 if (h
->got
.offset
!= (bfd_vma
) -1)
397 /* We have already allocated space in the .got. */
400 h
->got
.offset
= sgot
->_raw_size
;
402 /* Make sure this symbol is output as a dynamic symbol. */
403 if (h
->dynindx
== -1)
405 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
409 srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
413 /* This is a global offset table entry for a local
415 if (local_got_offsets
== NULL
)
418 register unsigned int i
;
420 size
= symtab_hdr
->sh_info
* sizeof (bfd_vma
);
421 local_got_offsets
= (bfd_vma
*) bfd_alloc (abfd
, size
);
422 if (local_got_offsets
== NULL
)
424 elf_local_got_offsets (abfd
) = local_got_offsets
;
425 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++)
426 local_got_offsets
[i
] = (bfd_vma
) -1;
428 if (local_got_offsets
[r_symndx
] != (bfd_vma
) -1)
430 /* We have already allocated space in the .got. */
433 local_got_offsets
[r_symndx
] = sgot
->_raw_size
;
437 /* If we are generating a shared object, we need to
438 output a R_SPARC_RELATIVE reloc so that the
439 dynamic linker can adjust this GOT entry. */
440 srelgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
444 sgot
->_raw_size
+= 4;
446 /* If the .got section is more than 0x1000 bytes, we add
447 0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
448 bit relocations have a greater chance of working. */
449 if (sgot
->_raw_size
>= 0x1000
450 && elf_hash_table (info
)->hgot
->root
.u
.def
.value
== 0)
451 elf_hash_table (info
)->hgot
->root
.u
.def
.value
= 0x1000;
456 /* This symbol requires a procedure linkage table entry. We
457 actually build the entry in adjust_dynamic_symbol,
458 because this might be a case of linking PIC code without
459 linking in any dynamic objects, in which case we don't
460 need to generate a procedure linkage table after all. */
464 /* It does not make sense to have a procedure linkage
465 table entry for a local symbol. */
466 bfd_set_error (bfd_error_bad_value
);
470 /* Make sure this symbol is output as a dynamic symbol. */
471 if (h
->dynindx
== -1)
473 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
477 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
484 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
490 case R_SPARC_WDISP30
:
491 case R_SPARC_WDISP22
:
492 case R_SPARC_WDISP19
:
493 case R_SPARC_WDISP16
:
494 /* If we are linking with -Bsymbolic, we do not need to copy
495 a PC relative reloc against a global symbol which is
496 defined in an object we are including in the link (i.e.,
497 DEF_REGULAR is set). FIXME: At this point we have not
498 seen all the input files, so it is possible that
499 DEF_REGULAR is not set now but will be set later (it is
500 never cleared). This needs to be handled as in
504 && (h
->elf_link_hash_flags
505 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
518 /* When creating a shared object, we must copy these
519 relocs into the output file. We create a reloc
520 section in dynobj and make room for the reloc. */
525 name
= (bfd_elf_string_from_elf_section
527 elf_elfheader (abfd
)->e_shstrndx
,
528 elf_section_data (sec
)->rel_hdr
.sh_name
));
532 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
533 && strcmp (bfd_get_section_name (abfd
, sec
),
536 sreloc
= bfd_get_section_by_name (dynobj
, name
);
541 sreloc
= bfd_make_section (dynobj
, name
);
542 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
543 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
544 if ((sec
->flags
& SEC_ALLOC
) != 0)
545 flags
|= SEC_ALLOC
| SEC_LOAD
;
547 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
548 || ! bfd_set_section_alignment (dynobj
, sreloc
, 2))
553 sreloc
->_raw_size
+= sizeof (Elf32_External_Rela
);
566 /* Adjust a symbol defined by a dynamic object and referenced by a
567 regular object. The current definition is in some section of the
568 dynamic object, but we're not including those sections. We have to
569 change the definition to something the rest of the link can
573 elf32_sparc_adjust_dynamic_symbol (info
, h
)
574 struct bfd_link_info
*info
;
575 struct elf_link_hash_entry
*h
;
579 unsigned int power_of_two
;
581 dynobj
= elf_hash_table (info
)->dynobj
;
583 /* Make sure we know what is going on here. */
584 BFD_ASSERT (dynobj
!= NULL
585 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
586 || h
->weakdef
!= NULL
587 || ((h
->elf_link_hash_flags
588 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
589 && (h
->elf_link_hash_flags
590 & ELF_LINK_HASH_REF_REGULAR
) != 0
591 && (h
->elf_link_hash_flags
592 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
594 /* If this is a function, put it in the procedure linkage table. We
595 will fill in the contents of the procedure linkage table later
596 (although we could actually do it here). The STT_NOTYPE
597 condition is a hack specifically for the Oracle libraries
598 delivered for Solaris; for some inexplicable reason, they define
599 some of their functions as STT_NOTYPE when they really should be
601 if (h
->type
== STT_FUNC
602 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0
603 || (h
->type
== STT_NOTYPE
604 && (h
->root
.type
== bfd_link_hash_defined
605 || h
->root
.type
== bfd_link_hash_defweak
)
606 && (h
->root
.u
.def
.section
->flags
& SEC_CODE
) != 0))
608 if (! elf_hash_table (info
)->dynamic_sections_created
609 || ((!info
->shared
|| info
->symbolic
|| h
->dynindx
== -1)
610 && (h
->elf_link_hash_flags
611 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
613 /* This case can occur if we saw a WPLT30 reloc in an input
614 file, but none of the input files were dynamic objects.
615 Or, when linking the main application or a -Bsymbolic
616 shared library against PIC code. Or when a global symbol
617 has been made private, e.g. via versioning.
619 In these cases we know what value the symbol will resolve
620 to, so we don't actually need to build a procedure linkage
621 table, and we can just do a WDISP30 reloc instead. */
623 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
627 s
= bfd_get_section_by_name (dynobj
, ".plt");
628 BFD_ASSERT (s
!= NULL
);
630 /* The first four entries in .plt are reserved. */
631 if (s
->_raw_size
== 0)
632 s
->_raw_size
= 4 * PLT_ENTRY_SIZE
;
634 /* The procedure linkage table has a maximum size. */
635 if (s
->_raw_size
>= 0x400000)
637 bfd_set_error (bfd_error_bad_value
);
641 /* If this symbol is not defined in a regular file, and we are
642 not generating a shared library, then set the symbol to this
643 location in the .plt. This is required to make function
644 pointers compare as equal between the normal executable and
645 the shared library. */
647 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
649 h
->root
.u
.def
.section
= s
;
650 h
->root
.u
.def
.value
= s
->_raw_size
;
653 h
->plt
.offset
= s
->_raw_size
;
655 /* Make room for this entry. */
656 s
->_raw_size
+= PLT_ENTRY_SIZE
;
658 /* We also need to make an entry in the .rela.plt section. */
660 s
= bfd_get_section_by_name (dynobj
, ".rela.plt");
661 BFD_ASSERT (s
!= NULL
);
662 s
->_raw_size
+= sizeof (Elf32_External_Rela
);
667 /* If this is a weak symbol, and there is a real definition, the
668 processor independent code will have arranged for us to see the
669 real definition first, and we can just use the same value. */
670 if (h
->weakdef
!= NULL
)
672 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
673 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
674 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
675 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
679 /* This is a reference to a symbol defined by a dynamic object which
680 is not a function. */
682 /* If we are creating a shared library, we must presume that the
683 only references to the symbol are via the global offset table.
684 For such cases we need not do anything here; the relocations will
685 be handled correctly by relocate_section. */
689 /* We must allocate the symbol in our .dynbss section, which will
690 become part of the .bss section of the executable. There will be
691 an entry for this symbol in the .dynsym section. The dynamic
692 object will contain position independent code, so all references
693 from the dynamic object to this symbol will go through the global
694 offset table. The dynamic linker will use the .dynsym entry to
695 determine the address it must put in the global offset table, so
696 both the dynamic object and the regular object will refer to the
697 same memory location for the variable. */
699 s
= bfd_get_section_by_name (dynobj
, ".dynbss");
700 BFD_ASSERT (s
!= NULL
);
702 /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
703 to copy the initial value out of the dynamic object and into the
704 runtime process image. We need to remember the offset into the
705 .rel.bss section we are going to use. */
706 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
710 srel
= bfd_get_section_by_name (dynobj
, ".rela.bss");
711 BFD_ASSERT (srel
!= NULL
);
712 srel
->_raw_size
+= sizeof (Elf32_External_Rela
);
713 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
716 /* We need to figure out the alignment required for this symbol. I
717 have no idea how ELF linkers handle this. */
718 power_of_two
= bfd_log2 (h
->size
);
719 if (power_of_two
> 3)
722 /* Apply the required alignment. */
723 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
,
724 (bfd_size_type
) (1 << power_of_two
));
725 if (power_of_two
> bfd_get_section_alignment (dynobj
, s
))
727 if (! bfd_set_section_alignment (dynobj
, s
, power_of_two
))
731 /* Define the symbol as being at this point in the section. */
732 h
->root
.u
.def
.section
= s
;
733 h
->root
.u
.def
.value
= s
->_raw_size
;
735 /* Increment the section size to make room for the symbol. */
736 s
->_raw_size
+= h
->size
;
741 /* Set the sizes of the dynamic sections. */
744 elf32_sparc_size_dynamic_sections (output_bfd
, info
)
746 struct bfd_link_info
*info
;
753 dynobj
= elf_hash_table (info
)->dynobj
;
754 BFD_ASSERT (dynobj
!= NULL
);
756 if (elf_hash_table (info
)->dynamic_sections_created
)
758 /* Set the contents of the .interp section to the interpreter. */
761 s
= bfd_get_section_by_name (dynobj
, ".interp");
762 BFD_ASSERT (s
!= NULL
);
763 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
764 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
767 /* Make space for the trailing nop in .plt. */
768 s
= bfd_get_section_by_name (dynobj
, ".plt");
769 BFD_ASSERT (s
!= NULL
);
770 if (s
->_raw_size
> 0)
775 /* We may have created entries in the .rela.got section.
776 However, if we are not creating the dynamic sections, we will
777 not actually use these entries. Reset the size of .rela.got,
778 which will cause it to get stripped from the output file
780 s
= bfd_get_section_by_name (dynobj
, ".rela.got");
785 /* The check_relocs and adjust_dynamic_symbol entry points have
786 determined the sizes of the various dynamic sections. Allocate
790 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
795 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
798 /* It's OK to base decisions on the section name, because none
799 of the dynobj section names depend upon the input files. */
800 name
= bfd_get_section_name (dynobj
, s
);
804 if (strncmp (name
, ".rela", 5) == 0)
806 if (s
->_raw_size
== 0)
808 /* If we don't need this section, strip it from the
809 output file. This is to handle .rela.bss and
810 .rel.plt. We must create it in
811 create_dynamic_sections, because it must be created
812 before the linker maps input sections to output
813 sections. The linker does that before
814 adjust_dynamic_symbol is called, and it is that
815 function which decides whether anything needs to go
816 into these sections. */
824 /* If this relocation section applies to a read only
825 section, then we probably need a DT_TEXTREL entry. */
826 outname
= bfd_get_section_name (output_bfd
,
828 target
= bfd_get_section_by_name (output_bfd
, outname
+ 5);
830 && (target
->flags
& SEC_READONLY
) != 0
831 && (target
->flags
& SEC_ALLOC
) != 0)
834 if (strcmp (name
, ".rela.plt") == 0)
837 /* We use the reloc_count field as a counter if we need
838 to copy relocs into the output file. */
842 else if (strcmp (name
, ".plt") != 0
843 && strcmp (name
, ".got") != 0)
845 /* It's not one of our sections, so don't allocate space. */
853 for (spp
= &s
->output_section
->owner
->sections
;
854 *spp
!= s
->output_section
;
857 *spp
= s
->output_section
->next
;
858 --s
->output_section
->owner
->section_count
;
863 /* Allocate memory for the section contents. */
864 s
->contents
= (bfd_byte
*) bfd_alloc (dynobj
, s
->_raw_size
);
865 if (s
->contents
== NULL
&& s
->_raw_size
!= 0)
869 if (elf_hash_table (info
)->dynamic_sections_created
)
871 /* Add some entries to the .dynamic section. We fill in the
872 values later, in elf32_sparc_finish_dynamic_sections, but we
873 must add the entries now so that we get the correct size for
874 the .dynamic section. The DT_DEBUG entry is filled in by the
875 dynamic linker and used by the debugger. */
878 if (! bfd_elf32_add_dynamic_entry (info
, DT_DEBUG
, 0))
884 if (! bfd_elf32_add_dynamic_entry (info
, DT_PLTGOT
, 0)
885 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTRELSZ
, 0)
886 || ! bfd_elf32_add_dynamic_entry (info
, DT_PLTREL
, DT_RELA
)
887 || ! bfd_elf32_add_dynamic_entry (info
, DT_JMPREL
, 0))
891 if (! bfd_elf32_add_dynamic_entry (info
, DT_RELA
, 0)
892 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELASZ
, 0)
893 || ! bfd_elf32_add_dynamic_entry (info
, DT_RELAENT
,
894 sizeof (Elf32_External_Rela
)))
899 if (! bfd_elf32_add_dynamic_entry (info
, DT_TEXTREL
, 0))
904 /* If we are generating a shared library, we generate a section
905 symbol for each output section for which we might need to copy
906 relocs. These are local symbols, which means that they must come
907 first in the dynamic symbol table. That means we must increment
908 the dynamic symbol index of every other dynamic symbol. */
914 for (s
= output_bfd
->sections
; s
!= NULL
; s
= s
->next
)
916 if ((s
->flags
& SEC_LINKER_CREATED
) != 0
917 || (s
->flags
& SEC_ALLOC
) == 0)
920 elf_section_data (s
)->dynindx
= c
+ 1;
922 /* These symbols will have no names, so we don't need to
923 fiddle with dynstr_index. */
928 elf_link_hash_traverse (elf_hash_table (info
),
929 elf32_sparc_adjust_dynindx
,
931 elf_hash_table (info
)->dynsymcount
+= c
;
937 /* Increment the index of a dynamic symbol by a given amount. Called
938 via elf_link_hash_traverse. */
941 elf32_sparc_adjust_dynindx (h
, cparg
)
942 struct elf_link_hash_entry
*h
;
945 int *cp
= (int *) cparg
;
947 if (h
->dynindx
!= -1)
952 /* Relocate a SPARC ELF section. */
955 elf32_sparc_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
956 contents
, relocs
, local_syms
, local_sections
)
958 struct bfd_link_info
*info
;
960 asection
*input_section
;
962 Elf_Internal_Rela
*relocs
;
963 Elf_Internal_Sym
*local_syms
;
964 asection
**local_sections
;
967 Elf_Internal_Shdr
*symtab_hdr
;
968 struct elf_link_hash_entry
**sym_hashes
;
969 bfd_vma
*local_got_offsets
;
974 Elf_Internal_Rela
*rel
;
975 Elf_Internal_Rela
*relend
;
977 dynobj
= elf_hash_table (info
)->dynobj
;
978 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
979 sym_hashes
= elf_sym_hashes (input_bfd
);
980 local_got_offsets
= elf_local_got_offsets (input_bfd
);
982 if (elf_hash_table (info
)->hgot
== NULL
)
985 got_base
= elf_hash_table (info
)->hgot
->root
.u
.def
.value
;
992 relend
= relocs
+ input_section
->reloc_count
;
993 for (; rel
< relend
; rel
++)
996 reloc_howto_type
*howto
;
997 unsigned long r_symndx
;
998 struct elf_link_hash_entry
*h
;
999 Elf_Internal_Sym
*sym
;
1002 bfd_reloc_status_type r
;
1004 r_type
= ELF32_R_TYPE (rel
->r_info
);
1005 if (r_type
< 0 || r_type
>= (int) R_SPARC_max
)
1007 bfd_set_error (bfd_error_bad_value
);
1010 howto
= _bfd_sparc_elf_howto_table
+ r_type
;
1012 r_symndx
= ELF32_R_SYM (rel
->r_info
);
1014 if (info
->relocateable
)
1016 /* This is a relocateable link. We don't have to change
1017 anything, unless the reloc is against a section symbol,
1018 in which case we have to adjust according to where the
1019 section symbol winds up in the output section. */
1020 if (r_symndx
< symtab_hdr
->sh_info
)
1022 sym
= local_syms
+ r_symndx
;
1023 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1025 sec
= local_sections
[r_symndx
];
1026 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
1033 /* This is a final link. */
1037 if (r_symndx
< symtab_hdr
->sh_info
)
1039 sym
= local_syms
+ r_symndx
;
1040 sec
= local_sections
[r_symndx
];
1041 relocation
= (sec
->output_section
->vma
1042 + sec
->output_offset
1047 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1048 while (h
->root
.type
== bfd_link_hash_indirect
1049 || h
->root
.type
== bfd_link_hash_warning
)
1050 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1051 if (h
->root
.type
== bfd_link_hash_defined
1052 || h
->root
.type
== bfd_link_hash_defweak
)
1054 sec
= h
->root
.u
.def
.section
;
1055 if ((r_type
== R_SPARC_WPLT30
1056 && h
->plt
.offset
!= (bfd_vma
) -1)
1057 || ((r_type
== R_SPARC_GOT10
1058 || r_type
== R_SPARC_GOT13
1059 || r_type
== R_SPARC_GOT22
)
1060 && elf_hash_table (info
)->dynamic_sections_created
1062 || (! info
->symbolic
&& h
->dynindx
!= -1)
1063 || (h
->elf_link_hash_flags
1064 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
1066 && ((! info
->symbolic
&& h
->dynindx
!= -1)
1067 || (h
->elf_link_hash_flags
1068 & ELF_LINK_HASH_DEF_REGULAR
) == 0)
1069 && (r_type
== R_SPARC_8
1070 || r_type
== R_SPARC_16
1071 || r_type
== R_SPARC_32
1072 || r_type
== R_SPARC_DISP8
1073 || r_type
== R_SPARC_DISP16
1074 || r_type
== R_SPARC_DISP32
1075 || r_type
== R_SPARC_WDISP30
1076 || r_type
== R_SPARC_WDISP22
1077 || r_type
== R_SPARC_WDISP19
1078 || r_type
== R_SPARC_WDISP16
1079 || r_type
== R_SPARC_HI22
1080 || r_type
== R_SPARC_22
1081 || r_type
== R_SPARC_13
1082 || r_type
== R_SPARC_LO10
1083 || r_type
== R_SPARC_UA32
1084 || ((r_type
== R_SPARC_PC10
1085 || r_type
== R_SPARC_PC22
)
1086 && strcmp (h
->root
.root
.string
,
1087 "_GLOBAL_OFFSET_TABLE_") != 0))))
1089 /* In these cases, we don't need the relocation
1090 value. We check specially because in some
1091 obscure cases sec->output_section will be NULL. */
1095 relocation
= (h
->root
.u
.def
.value
1096 + sec
->output_section
->vma
1097 + sec
->output_offset
);
1099 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1101 else if (info
->shared
&& !info
->symbolic
)
1105 if (! ((*info
->callbacks
->undefined_symbol
)
1106 (info
, h
->root
.root
.string
, input_bfd
,
1107 input_section
, rel
->r_offset
)))
1118 /* Relocation is to the entry for this symbol in the global
1122 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1123 BFD_ASSERT (sgot
!= NULL
);
1130 off
= h
->got
.offset
;
1131 BFD_ASSERT (off
!= (bfd_vma
) -1);
1133 if (! elf_hash_table (info
)->dynamic_sections_created
1135 && (info
->symbolic
|| h
->dynindx
== -1)
1136 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)))
1138 /* This is actually a static link, or it is a
1139 -Bsymbolic link and the symbol is defined
1140 locally, or the symbol was forced to be local
1141 because of a version file. We must initialize
1142 this entry in the global offset table. Since the
1143 offset must always be a multiple of 4, we use the
1144 least significant bit to record whether we have
1145 initialized it already.
1147 When doing a dynamic link, we create a .rela.got
1148 relocation entry to initialize the value. This
1149 is done in the finish_dynamic_symbol routine. */
1154 bfd_put_32 (output_bfd
, relocation
,
1155 sgot
->contents
+ off
);
1160 relocation
= sgot
->output_offset
+ off
- got_base
;
1166 BFD_ASSERT (local_got_offsets
!= NULL
1167 && local_got_offsets
[r_symndx
] != (bfd_vma
) -1);
1169 off
= local_got_offsets
[r_symndx
];
1171 /* The offset must always be a multiple of 4. We use
1172 the least significant bit to record whether we have
1173 already processed this entry. */
1178 bfd_put_32 (output_bfd
, relocation
, sgot
->contents
+ off
);
1183 Elf_Internal_Rela outrel
;
1185 /* We need to generate a R_SPARC_RELATIVE reloc
1186 for the dynamic linker. */
1187 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
1188 BFD_ASSERT (srelgot
!= NULL
);
1190 outrel
.r_offset
= (sgot
->output_section
->vma
1191 + sgot
->output_offset
1193 outrel
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
1194 outrel
.r_addend
= 0;
1195 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,
1196 (((Elf32_External_Rela
*)
1198 + srelgot
->reloc_count
));
1199 ++srelgot
->reloc_count
;
1202 local_got_offsets
[r_symndx
] |= 1;
1205 relocation
= sgot
->output_offset
+ off
- got_base
;
1210 case R_SPARC_WPLT30
:
1211 /* Relocation is to the entry for this symbol in the
1212 procedure linkage table. */
1213 BFD_ASSERT (h
!= NULL
);
1215 if (h
->plt
.offset
== (bfd_vma
) -1)
1217 /* We didn't make a PLT entry for this symbol. This
1218 happens when statically linking PIC code, or when
1219 using -Bsymbolic. */
1225 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1226 BFD_ASSERT (splt
!= NULL
);
1229 relocation
= (splt
->output_section
->vma
1230 + splt
->output_offset
1237 && strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
1241 case R_SPARC_DISP16
:
1242 case R_SPARC_DISP32
:
1243 case R_SPARC_WDISP30
:
1244 case R_SPARC_WDISP22
:
1245 case R_SPARC_WDISP19
:
1246 case R_SPARC_WDISP16
:
1249 && (h
->elf_link_hash_flags
1250 & ELF_LINK_HASH_DEF_REGULAR
) != 0))
1263 Elf_Internal_Rela outrel
;
1266 /* When generating a shared object, these relocations
1267 are copied into the output file to be resolved at run
1274 name
= (bfd_elf_string_from_elf_section
1276 elf_elfheader (input_bfd
)->e_shstrndx
,
1277 elf_section_data (input_section
)->rel_hdr
.sh_name
));
1281 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
1282 && strcmp (bfd_get_section_name (input_bfd
,
1286 sreloc
= bfd_get_section_by_name (dynobj
, name
);
1287 BFD_ASSERT (sreloc
!= NULL
);
1292 if (elf_section_data (input_section
)->stab_info
== NULL
)
1293 outrel
.r_offset
= rel
->r_offset
;
1298 off
= (_bfd_stab_section_offset
1299 (output_bfd
, &elf_hash_table (info
)->stab_info
,
1301 &elf_section_data (input_section
)->stab_info
,
1303 if (off
== (bfd_vma
) -1)
1305 outrel
.r_offset
= off
;
1308 outrel
.r_offset
+= (input_section
->output_section
->vma
1309 + input_section
->output_offset
);
1312 memset (&outrel
, 0, sizeof outrel
);
1313 /* h->dynindx may be -1 if the symbol was marked to
1316 && ((! info
->symbolic
&& h
->dynindx
!= -1)
1317 || (h
->elf_link_hash_flags
1318 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
1320 BFD_ASSERT (h
->dynindx
!= -1);
1321 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
1322 outrel
.r_addend
= rel
->r_addend
;
1326 if (r_type
== R_SPARC_32
)
1328 outrel
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
1329 outrel
.r_addend
= relocation
+ rel
->r_addend
;
1336 sec
= local_sections
[r_symndx
];
1339 BFD_ASSERT (h
->root
.type
== bfd_link_hash_defined
1341 == bfd_link_hash_defweak
));
1342 sec
= h
->root
.u
.def
.section
;
1344 if (sec
!= NULL
&& bfd_is_abs_section (sec
))
1346 else if (sec
== NULL
|| sec
->owner
== NULL
)
1348 bfd_set_error (bfd_error_bad_value
);
1355 osec
= sec
->output_section
;
1356 indx
= elf_section_data (osec
)->dynindx
;
1358 /* FIXME: we really should be able to link non-pic
1359 shared libraries. */
1363 (*_bfd_error_handler
)
1364 (_("%s: probably compiled without -fPIC?"),
1365 bfd_get_filename (input_bfd
));
1366 bfd_set_error (bfd_error_bad_value
);
1371 outrel
.r_info
= ELF32_R_INFO (indx
, r_type
);
1372 outrel
.r_addend
= relocation
+ rel
->r_addend
;
1376 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
,
1377 (((Elf32_External_Rela
*)
1379 + sreloc
->reloc_count
));
1380 ++sreloc
->reloc_count
;
1382 /* This reloc will be computed at runtime, so there's no
1383 need to do anything now, unless this is a RELATIVE
1384 reloc in an unallocated section. */
1386 || (input_section
->flags
& SEC_ALLOC
) != 0
1387 || ELF32_R_TYPE (outrel
.r_info
) != R_SPARC_RELATIVE
)
1396 if (r_type
== R_SPARC_WDISP16
)
1400 relocation
+= rel
->r_addend
;
1401 relocation
-= (input_section
->output_section
->vma
1402 + input_section
->output_offset
);
1403 relocation
-= rel
->r_offset
;
1405 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1406 x
|= ((((relocation
>> 2) & 0xc000) << 6)
1407 | ((relocation
>> 2) & 0x3fff));
1408 bfd_put_32 (input_bfd
, x
, contents
+ rel
->r_offset
);
1410 if ((bfd_signed_vma
) relocation
< - 0x40000
1411 || (bfd_signed_vma
) relocation
> 0x3ffff)
1412 r
= bfd_reloc_overflow
;
1416 else if (r_type
== R_SPARC_32LE
)
1420 relocation
= relocation
+ rel
->r_addend
;
1422 x
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
1424 bfd_putl32 (/*input_bfd,*/ x
, contents
+ rel
->r_offset
);
1428 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
1429 contents
, rel
->r_offset
,
1430 relocation
, rel
->r_addend
);
1433 if (r
!= bfd_reloc_ok
)
1438 case bfd_reloc_outofrange
:
1440 case bfd_reloc_overflow
:
1445 name
= h
->root
.root
.string
;
1448 name
= bfd_elf_string_from_elf_section (input_bfd
,
1449 symtab_hdr
->sh_link
,
1454 name
= bfd_section_name (input_bfd
, sec
);
1456 if (! ((*info
->callbacks
->reloc_overflow
)
1457 (info
, name
, howto
->name
, (bfd_vma
) 0,
1458 input_bfd
, input_section
, rel
->r_offset
)))
1469 /* Finish up dynamic symbol handling. We set the contents of various
1470 dynamic sections here. */
1473 elf32_sparc_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
1475 struct bfd_link_info
*info
;
1476 struct elf_link_hash_entry
*h
;
1477 Elf_Internal_Sym
*sym
;
1481 dynobj
= elf_hash_table (info
)->dynobj
;
1483 if (h
->plt
.offset
!= (bfd_vma
) -1)
1487 Elf_Internal_Rela rela
;
1489 /* This symbol has an entry in the procedure linkage table. Set
1492 BFD_ASSERT (h
->dynindx
!= -1);
1494 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1495 srela
= bfd_get_section_by_name (dynobj
, ".rela.plt");
1496 BFD_ASSERT (splt
!= NULL
&& srela
!= NULL
);
1498 /* Fill in the entry in the procedure linkage table. */
1499 bfd_put_32 (output_bfd
,
1500 PLT_ENTRY_WORD0
+ h
->plt
.offset
,
1501 splt
->contents
+ h
->plt
.offset
);
1502 bfd_put_32 (output_bfd
,
1504 + (((- (h
->plt
.offset
+ 4)) >> 2) & 0x3fffff)),
1505 splt
->contents
+ h
->plt
.offset
+ 4);
1506 bfd_put_32 (output_bfd
, PLT_ENTRY_WORD2
,
1507 splt
->contents
+ h
->plt
.offset
+ 8);
1509 /* Fill in the entry in the .rela.plt section. */
1510 rela
.r_offset
= (splt
->output_section
->vma
1511 + splt
->output_offset
1513 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_JMP_SLOT
);
1515 bfd_elf32_swap_reloca_out (output_bfd
, &rela
,
1516 ((Elf32_External_Rela
*) srela
->contents
1517 + h
->plt
.offset
/ PLT_ENTRY_SIZE
- 4));
1519 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
1521 /* Mark the symbol as undefined, rather than as defined in
1522 the .plt section. Leave the value alone. */
1523 sym
->st_shndx
= SHN_UNDEF
;
1527 if (h
->got
.offset
!= (bfd_vma
) -1)
1531 Elf_Internal_Rela rela
;
1533 /* This symbol has an entry in the global offset table. Set it
1536 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1537 srela
= bfd_get_section_by_name (dynobj
, ".rela.got");
1538 BFD_ASSERT (sgot
!= NULL
&& srela
!= NULL
);
1540 rela
.r_offset
= (sgot
->output_section
->vma
1541 + sgot
->output_offset
1542 + (h
->got
.offset
&~ 1));
1544 /* If this is a -Bsymbolic link, and the symbol is defined
1545 locally, we just want to emit a RELATIVE reloc. Likewise if
1546 the symbol was forced to be local because of a version file.
1547 The entry in the global offset table will already have been
1548 initialized in the relocate_section function. */
1550 && (info
->symbolic
|| h
->dynindx
== -1)
1551 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
1552 rela
.r_info
= ELF32_R_INFO (0, R_SPARC_RELATIVE
);
1555 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
+ h
->got
.offset
);
1556 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_GLOB_DAT
);
1560 bfd_elf32_swap_reloca_out (output_bfd
, &rela
,
1561 ((Elf32_External_Rela
*) srela
->contents
1562 + srela
->reloc_count
));
1563 ++srela
->reloc_count
;
1566 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
1569 Elf_Internal_Rela rela
;
1571 /* This symbols needs a copy reloc. Set it up. */
1573 BFD_ASSERT (h
->dynindx
!= -1);
1575 s
= bfd_get_section_by_name (h
->root
.u
.def
.section
->owner
,
1577 BFD_ASSERT (s
!= NULL
);
1579 rela
.r_offset
= (h
->root
.u
.def
.value
1580 + h
->root
.u
.def
.section
->output_section
->vma
1581 + h
->root
.u
.def
.section
->output_offset
);
1582 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_SPARC_COPY
);
1584 bfd_elf32_swap_reloca_out (output_bfd
, &rela
,
1585 ((Elf32_External_Rela
*) s
->contents
1590 /* Mark some specially defined symbols as absolute. */
1591 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
1592 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
1593 || strcmp (h
->root
.root
.string
, "_PROCEDURE_LINKAGE_TABLE_") == 0)
1594 sym
->st_shndx
= SHN_ABS
;
1599 /* Finish up the dynamic sections. */
1602 elf32_sparc_finish_dynamic_sections (output_bfd
, info
)
1604 struct bfd_link_info
*info
;
1610 dynobj
= elf_hash_table (info
)->dynobj
;
1612 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
1614 if (elf_hash_table (info
)->dynamic_sections_created
)
1617 Elf32_External_Dyn
*dyncon
, *dynconend
;
1619 splt
= bfd_get_section_by_name (dynobj
, ".plt");
1620 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
1622 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
1623 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
1624 for (; dyncon
< dynconend
; dyncon
++)
1626 Elf_Internal_Dyn dyn
;
1630 bfd_elf32_swap_dyn_in (dynobj
, dyncon
, &dyn
);
1634 case DT_PLTGOT
: name
= ".plt"; size
= false; break;
1635 case DT_PLTRELSZ
: name
= ".rela.plt"; size
= true; break;
1636 case DT_JMPREL
: name
= ".rela.plt"; size
= false; break;
1637 default: name
= NULL
; size
= false; break;
1644 s
= bfd_get_section_by_name (output_bfd
, name
);
1650 dyn
.d_un
.d_ptr
= s
->vma
;
1653 if (s
->_cooked_size
!= 0)
1654 dyn
.d_un
.d_val
= s
->_cooked_size
;
1656 dyn
.d_un
.d_val
= s
->_raw_size
;
1659 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
1663 /* Clear the first four entries in the procedure linkage table,
1664 and put a nop in the last four bytes. */
1665 if (splt
->_raw_size
> 0)
1667 memset (splt
->contents
, 0, 4 * PLT_ENTRY_SIZE
);
1668 bfd_put_32 (output_bfd
, SPARC_NOP
,
1669 splt
->contents
+ splt
->_raw_size
- 4);
1672 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
=
1676 /* Set the first entry in the global offset table to the address of
1677 the dynamic section. */
1678 sgot
= bfd_get_section_by_name (dynobj
, ".got");
1679 BFD_ASSERT (sgot
!= NULL
);
1680 if (sgot
->_raw_size
> 0)
1683 bfd_put_32 (output_bfd
, (bfd_vma
) 0, sgot
->contents
);
1685 bfd_put_32 (output_bfd
,
1686 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
1690 elf_section_data (sgot
->output_section
)->this_hdr
.sh_entsize
= 4;
1696 Elf_Internal_Sym sym
;
1699 /* Set up the section symbols for the output sections. */
1701 sdynsym
= bfd_get_section_by_name (dynobj
, ".dynsym");
1702 BFD_ASSERT (sdynsym
!= NULL
);
1706 sym
.st_info
= ELF_ST_INFO (STB_LOCAL
, STT_SECTION
);
1710 for (s
= output_bfd
->sections
; s
!= NULL
; s
= s
->next
)
1714 if (elf_section_data (s
)->dynindx
== 0)
1717 sym
.st_value
= s
->vma
;
1719 indx
= elf_section_data (s
)->this_idx
;
1720 BFD_ASSERT (indx
> 0);
1721 sym
.st_shndx
= indx
;
1723 bfd_elf32_swap_symbol_out (output_bfd
, &sym
,
1724 (PTR
) (((Elf32_External_Sym
*)
1726 + elf_section_data (s
)->dynindx
));
1731 /* Set the sh_info field of the output .dynsym section to the
1732 index of the first global symbol. */
1733 elf_section_data (sdynsym
->output_section
)->this_hdr
.sh_info
= c
+ 1;
1739 /* Functions for dealing with the e_flags field.
1741 We don't define set_private_flags or copy_private_bfd_data because
1742 the only currently defined values are based on the bfd mach number,
1743 so we use the latter instead and defer setting e_flags until the
1744 file is written out. */
1746 /* Merge backend specific data from an object file to the output
1747 object file when linking. */
1750 elf32_sparc_merge_private_bfd_data (ibfd
, obfd
)
1755 static int previous_ibfd_e_flags
= -1;
1757 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1758 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1764 /* ??? The native linker doesn't do this so we can't (otherwise gcc would
1765 have to know which linker is being used). Instead, the native linker
1766 bumps up the architecture level when it has to. However, I still think
1767 warnings like these are good, so it would be nice to have them turned on
1770 /* If the output machine is normal sparc, we can't allow v9 input files. */
1771 if (bfd_get_mach (obfd
) == bfd_mach_sparc
1772 && (bfd_get_mach (ibfd
) == bfd_mach_sparc_v8plus
1773 || bfd_get_mach (ibfd
) == bfd_mach_sparc_v8plusa
))
1776 (*_bfd_error_handler
)
1777 (_("%s: compiled for a v8plus system and target is v8"),
1778 bfd_get_filename (ibfd
));
1780 /* If the output machine is v9, we can't allow v9+vis input files. */
1781 if (bfd_get_mach (obfd
) == bfd_mach_sparc_v8plus
1782 && bfd_get_mach (ibfd
) == bfd_mach_sparc_v8plusa
)
1785 (*_bfd_error_handler
)
1786 (_("%s: compiled for a v8plusa system and target is v8plus"),
1787 bfd_get_filename (ibfd
));
1790 if (bfd_get_mach (ibfd
) >= bfd_mach_sparc_v9
)
1793 (*_bfd_error_handler
)
1794 (_("%s: compiled for a 64 bit system and target is 32 bit"),
1795 bfd_get_filename (ibfd
));
1797 else if (bfd_get_mach (obfd
) < bfd_get_mach (ibfd
))
1798 bfd_set_arch_mach (obfd
, bfd_arch_sparc
, bfd_get_mach (ibfd
));
1801 if (((elf_elfheader (ibfd
)->e_flags
& EF_SPARC_LEDATA
)
1802 != previous_ibfd_e_flags
)
1803 && previous_ibfd_e_flags
>= 0)
1805 (*_bfd_error_handler
)
1806 (_("%s: linking little endian files with big endian files"),
1807 bfd_get_filename (ibfd
));
1810 previous_ibfd_e_flags
= elf_elfheader (ibfd
)->e_flags
& EF_SPARC_LEDATA
;
1814 bfd_set_error (bfd_error_bad_value
);
1821 /* Set the right machine number. */
1824 elf32_sparc_object_p (abfd
)
1827 if (elf_elfheader (abfd
)->e_machine
== EM_SPARC32PLUS
)
1829 if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_SUN_US1
)
1830 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
1831 bfd_mach_sparc_v8plusa
);
1832 else if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_32PLUS
)
1833 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
1834 bfd_mach_sparc_v8plus
);
1838 else if (elf_elfheader (abfd
)->e_flags
& EF_SPARC_LEDATA
)
1839 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
,
1840 bfd_mach_sparc_sparclite_le
);
1842 return bfd_default_set_arch_mach (abfd
, bfd_arch_sparc
, bfd_mach_sparc
);
1845 /* The final processing done just before writing out the object file.
1846 We need to set the e_machine field appropriately. */
1849 elf32_sparc_final_write_processing (abfd
, linker
)
1853 switch (bfd_get_mach (abfd
))
1855 case bfd_mach_sparc
:
1856 break; /* nothing to do */
1857 case bfd_mach_sparc_v8plus
:
1858 elf_elfheader (abfd
)->e_machine
= EM_SPARC32PLUS
;
1859 elf_elfheader (abfd
)->e_flags
&=~ EF_SPARC_32PLUS_MASK
;
1860 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_32PLUS
;
1862 case bfd_mach_sparc_v8plusa
:
1863 elf_elfheader (abfd
)->e_machine
= EM_SPARC32PLUS
;
1864 elf_elfheader (abfd
)->e_flags
&=~ EF_SPARC_32PLUS_MASK
;
1865 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_32PLUS
| EF_SPARC_SUN_US1
;
1867 case bfd_mach_sparc_sparclite_le
:
1868 elf_elfheader (abfd
)->e_machine
= EM_SPARC
;
1869 elf_elfheader (abfd
)->e_flags
|= EF_SPARC_LEDATA
;
1876 #define TARGET_BIG_SYM bfd_elf32_sparc_vec
1877 #define TARGET_BIG_NAME "elf32-sparc"
1878 #define ELF_ARCH bfd_arch_sparc
1879 #define ELF_MACHINE_CODE EM_SPARC
1880 #define ELF_MACHINE_ALT1 EM_SPARC32PLUS
1881 #define ELF_MAXPAGESIZE 0x10000
1883 #define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup
1884 #define elf_info_to_howto elf32_sparc_info_to_howto
1885 #define elf_backend_create_dynamic_sections \
1886 _bfd_elf_create_dynamic_sections
1887 #define elf_backend_check_relocs elf32_sparc_check_relocs
1888 #define elf_backend_adjust_dynamic_symbol \
1889 elf32_sparc_adjust_dynamic_symbol
1890 #define elf_backend_size_dynamic_sections \
1891 elf32_sparc_size_dynamic_sections
1892 #define elf_backend_relocate_section elf32_sparc_relocate_section
1893 #define elf_backend_finish_dynamic_symbol \
1894 elf32_sparc_finish_dynamic_symbol
1895 #define elf_backend_finish_dynamic_sections \
1896 elf32_sparc_finish_dynamic_sections
1897 #define bfd_elf32_bfd_merge_private_bfd_data \
1898 elf32_sparc_merge_private_bfd_data
1899 #define elf_backend_object_p elf32_sparc_object_p
1900 #define elf_backend_final_write_processing \
1901 elf32_sparc_final_write_processing
1902 #define elf_backend_want_got_plt 0
1903 #define elf_backend_plt_readonly 0
1904 #define elf_backend_want_plt_sym 1
1905 #define elf_backend_got_header_size 4
1906 #define elf_backend_plt_header_size (4*PLT_ENTRY_SIZE)
1908 #include "elf32-target.h"