* elf-bfd.h (enum elf_reloc_type_class): New.
[external/binutils.git] / bfd / elf64-sparc.c
1 /* SPARC-specific support for 64-bit ELF
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3    Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "opcode/sparc.h"
26
27 /* This is defined if one wants to build upward compatible binaries
28    with the original sparc64-elf toolchain.  The support is kept in for
29    now but is turned off by default.  dje 970930  */
30 /*#define SPARC64_OLD_RELOCS*/
31
32 #include "elf/sparc.h"
33
34 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
35 #define MINUS_ONE (~ (bfd_vma) 0)
36
37 static struct bfd_link_hash_table * sparc64_elf_bfd_link_hash_table_create
38   PARAMS ((bfd *));
39 static bfd_reloc_status_type init_insn_reloc
40   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *,
41            bfd *, bfd_vma *, bfd_vma *));
42 static reloc_howto_type *sparc64_elf_reloc_type_lookup
43   PARAMS ((bfd *, bfd_reloc_code_real_type));
44 static void sparc64_elf_info_to_howto
45   PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
46
47 static void sparc64_elf_build_plt
48   PARAMS ((bfd *, unsigned char *, int));
49 static bfd_vma sparc64_elf_plt_entry_offset
50   PARAMS ((int));
51 static bfd_vma sparc64_elf_plt_ptr_offset
52   PARAMS ((int, int));
53
54 static boolean sparc64_elf_check_relocs
55   PARAMS ((bfd *, struct bfd_link_info *, asection *sec,
56            const Elf_Internal_Rela *));
57 static boolean sparc64_elf_adjust_dynamic_symbol
58   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
59 static boolean sparc64_elf_size_dynamic_sections
60   PARAMS ((bfd *, struct bfd_link_info *));
61 static int sparc64_elf_get_symbol_type
62   PARAMS (( Elf_Internal_Sym *, int));
63 static boolean sparc64_elf_add_symbol_hook
64   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
65            const char **, flagword *, asection **, bfd_vma *));
66 static boolean sparc64_elf_output_arch_syms
67   PARAMS ((bfd *, struct bfd_link_info *, PTR,
68            boolean (*) (PTR, const char *, Elf_Internal_Sym *, asection *)));
69 static void sparc64_elf_symbol_processing
70   PARAMS ((bfd *, asymbol *));
71
72 static boolean sparc64_elf_copy_private_bfd_data
73   PARAMS ((bfd *, bfd *));
74 static boolean sparc64_elf_merge_private_bfd_data
75   PARAMS ((bfd *, bfd *));
76
77 static const char *sparc64_elf_print_symbol_all
78   PARAMS ((bfd *, PTR, asymbol *));
79 static boolean sparc64_elf_relax_section
80   PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
81 static boolean sparc64_elf_relocate_section
82   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
83            Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
84 static boolean sparc64_elf_finish_dynamic_symbol
85   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
86            Elf_Internal_Sym *));
87 static boolean sparc64_elf_finish_dynamic_sections
88   PARAMS ((bfd *, struct bfd_link_info *));
89 static boolean sparc64_elf_object_p PARAMS ((bfd *));
90 static long sparc64_elf_get_reloc_upper_bound PARAMS ((bfd *, asection *));
91 static long sparc64_elf_get_dynamic_reloc_upper_bound PARAMS ((bfd *));
92 static boolean sparc64_elf_slurp_one_reloc_table
93   PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, asymbol **, boolean));
94 static boolean sparc64_elf_slurp_reloc_table
95   PARAMS ((bfd *, asection *, asymbol **, boolean));
96 static long sparc64_elf_canonicalize_dynamic_reloc
97   PARAMS ((bfd *, arelent **, asymbol **));
98 static void sparc64_elf_write_relocs PARAMS ((bfd *, asection *, PTR));
99 static enum elf_reloc_type_class sparc64_elf_reloc_type_class PARAMS ((int));
100 \f
101 /* The relocation "howto" table.  */
102
103 static bfd_reloc_status_type sparc_elf_notsup_reloc
104   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
105 static bfd_reloc_status_type sparc_elf_wdisp16_reloc
106   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
107 static bfd_reloc_status_type sparc_elf_hix22_reloc
108   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
109 static bfd_reloc_status_type sparc_elf_lox10_reloc
110   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
111
112 static reloc_howto_type sparc64_elf_howto_table[] =
113 {
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_8,         0,0, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_8",       false,0,0x000000ff,true),
116   HOWTO(R_SPARC_16,        0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_16",      false,0,0x0000ffff,true),
117   HOWTO(R_SPARC_32,        0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_32",      false,0,0xffffffff,true),
118   HOWTO(R_SPARC_DISP8,     0,0, 8,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP8",   false,0,0x000000ff,true),
119   HOWTO(R_SPARC_DISP16,    0,1,16,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP16",  false,0,0x0000ffff,true),
120   HOWTO(R_SPARC_DISP32,    0,2,32,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP32",  false,0,0x00ffffff,true),
121   HOWTO(R_SPARC_WDISP30,   2,2,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP30", false,0,0x3fffffff,true),
122   HOWTO(R_SPARC_WDISP22,   2,2,22,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP22", false,0,0x003fffff,true),
123   HOWTO(R_SPARC_HI22,     10,2,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HI22",    false,0,0x003fffff,true),
124   HOWTO(R_SPARC_22,        0,2,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_22",      false,0,0x003fffff,true),
125   HOWTO(R_SPARC_13,        0,2,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_13",      false,0,0x00001fff,true),
126   HOWTO(R_SPARC_LO10,      0,2,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LO10",    false,0,0x000003ff,true),
127   HOWTO(R_SPARC_GOT10,     0,2,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT10",   false,0,0x000003ff,true),
128   HOWTO(R_SPARC_GOT13,     0,2,13,false,0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_GOT13",   false,0,0x00001fff,true),
129   HOWTO(R_SPARC_GOT22,    10,2,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_GOT22",   false,0,0x003fffff,true),
130   HOWTO(R_SPARC_PC10,      0,2,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC10",    false,0,0x000003ff,true),
131   HOWTO(R_SPARC_PC22,     10,2,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_PC22",    false,0,0x003fffff,true),
132   HOWTO(R_SPARC_WPLT30,    2,2,30,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WPLT30",  false,0,0x3fffffff,true),
133   HOWTO(R_SPARC_COPY,      0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_COPY",    false,0,0x00000000,true),
134   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),
135   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),
136   HOWTO(R_SPARC_RELATIVE,  0,0,00,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_RELATIVE",false,0,0x00000000,true),
137   HOWTO(R_SPARC_UA32,      0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA32",    false,0,0xffffffff,true),
138 #ifndef SPARC64_OLD_RELOCS
139   /* These aren't implemented yet.  */
140   HOWTO(R_SPARC_PLT32,     0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PLT32",    false,0,0x00000000,true),
141   HOWTO(R_SPARC_HIPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_HIPLT22",  false,0,0x00000000,true),
142   HOWTO(R_SPARC_LOPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_LOPLT10",  false,0,0x00000000,true),
143   HOWTO(R_SPARC_PCPLT32,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT32",  false,0,0x00000000,true),
144   HOWTO(R_SPARC_PCPLT22,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT22",  false,0,0x00000000,true),
145   HOWTO(R_SPARC_PCPLT10,   0,0,00,false,0,complain_overflow_dont,    sparc_elf_notsup_reloc, "R_SPARC_PCPLT10",  false,0,0x00000000,true),
146 #endif
147   HOWTO(R_SPARC_10,        0,2,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_10",      false,0,0x000003ff,true),
148   HOWTO(R_SPARC_11,        0,2,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_11",      false,0,0x000007ff,true),
149   HOWTO(R_SPARC_64,        0,4,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_64",      false,0,MINUS_ONE, true),
150   HOWTO(R_SPARC_OLO10,     0,2,13,false,0,complain_overflow_signed,  sparc_elf_notsup_reloc, "R_SPARC_OLO10",   false,0,0x00001fff,true),
151   HOWTO(R_SPARC_HH22,     42,2,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_HH22",    false,0,0x003fffff,true),
152   HOWTO(R_SPARC_HM10,     32,2,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_HM10",    false,0,0x000003ff,true),
153   HOWTO(R_SPARC_LM22,     10,2,22,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_LM22",    false,0,0x003fffff,true),
154   HOWTO(R_SPARC_PC_HH22,  42,2,22,true, 0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_PC_HH22",    false,0,0x003fffff,true),
155   HOWTO(R_SPARC_PC_HM10,  32,2,10,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_HM10",    false,0,0x000003ff,true),
156   HOWTO(R_SPARC_PC_LM22,  10,2,22,true, 0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_PC_LM22",    false,0,0x003fffff,true),
157   HOWTO(R_SPARC_WDISP16,   2,2,16,true, 0,complain_overflow_signed,  sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true),
158   HOWTO(R_SPARC_WDISP19,   2,2,19,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_WDISP19", false,0,0x0007ffff,true),
159   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),
160   HOWTO(R_SPARC_7,         0,2, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_7",       false,0,0x0000007f,true),
161   HOWTO(R_SPARC_5,         0,2, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_5",       false,0,0x0000001f,true),
162   HOWTO(R_SPARC_6,         0,2, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_6",       false,0,0x0000003f,true),
163   HOWTO(R_SPARC_DISP64,    0,4,64,true, 0,complain_overflow_signed,  bfd_elf_generic_reloc,  "R_SPARC_DISP64",  false,0,MINUS_ONE, true),
164   HOWTO(R_SPARC_PLT64,     0,4,64,false,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_PLT64",   false,0,MINUS_ONE, false),
165   HOWTO(R_SPARC_HIX22,     0,4, 0,false,0,complain_overflow_bitfield,sparc_elf_hix22_reloc,  "R_SPARC_HIX22",   false,0,MINUS_ONE, false),
166   HOWTO(R_SPARC_LOX10,     0,4, 0,false,0,complain_overflow_dont,    sparc_elf_lox10_reloc,  "R_SPARC_LOX10",   false,0,MINUS_ONE, false),
167   HOWTO(R_SPARC_H44,      22,2,22,false,0,complain_overflow_unsigned,bfd_elf_generic_reloc,  "R_SPARC_H44",     false,0,0x003fffff,false),
168   HOWTO(R_SPARC_M44,      12,2,10,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_M44",     false,0,0x000003ff,false),
169   HOWTO(R_SPARC_L44,       0,2,13,false,0,complain_overflow_dont,    bfd_elf_generic_reloc,  "R_SPARC_L44",     false,0,0x00000fff,false),
170   HOWTO(R_SPARC_REGISTER,  0,4, 0,false,0,complain_overflow_bitfield,sparc_elf_notsup_reloc, "R_SPARC_REGISTER",false,0,MINUS_ONE, false),
171   HOWTO(R_SPARC_UA64,        0,4,64,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA64",      false,0,MINUS_ONE, true),
172   HOWTO(R_SPARC_UA16,        0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc,  "R_SPARC_UA16",      false,0,0x0000ffff,true)
173 };
174
175 struct elf_reloc_map {
176   bfd_reloc_code_real_type bfd_reloc_val;
177   unsigned char elf_reloc_val;
178 };
179
180 static CONST struct elf_reloc_map sparc_reloc_map[] =
181 {
182   { BFD_RELOC_NONE, R_SPARC_NONE, },
183   { BFD_RELOC_16, R_SPARC_16, },
184   { BFD_RELOC_8, R_SPARC_8 },
185   { BFD_RELOC_8_PCREL, R_SPARC_DISP8 },
186   { BFD_RELOC_CTOR, R_SPARC_64 },
187   { BFD_RELOC_32, R_SPARC_32 },
188   { BFD_RELOC_32_PCREL, R_SPARC_DISP32 },
189   { BFD_RELOC_HI22, R_SPARC_HI22 },
190   { BFD_RELOC_LO10, R_SPARC_LO10, },
191   { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 },
192   { BFD_RELOC_SPARC22, R_SPARC_22 },
193   { BFD_RELOC_SPARC13, R_SPARC_13 },
194   { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 },
195   { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 },
196   { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 },
197   { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 },
198   { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 },
199   { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 },
200   { BFD_RELOC_SPARC_COPY, R_SPARC_COPY },
201   { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT },
202   { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT },
203   { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE },
204   { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 },
205   { BFD_RELOC_SPARC_UA16, R_SPARC_UA16 },
206   { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 },
207   { BFD_RELOC_SPARC_UA64, R_SPARC_UA64 },
208   { BFD_RELOC_SPARC_10, R_SPARC_10 },
209   { BFD_RELOC_SPARC_11, R_SPARC_11 },
210   { BFD_RELOC_SPARC_64, R_SPARC_64 },
211   { BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10 },
212   { BFD_RELOC_SPARC_HH22, R_SPARC_HH22 },
213   { BFD_RELOC_SPARC_HM10, R_SPARC_HM10 },
214   { BFD_RELOC_SPARC_LM22, R_SPARC_LM22 },
215   { BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22 },
216   { BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10 },
217   { BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22 },
218   { BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16 },
219   { BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19 },
220   { BFD_RELOC_SPARC_7, R_SPARC_7 },
221   { BFD_RELOC_SPARC_5, R_SPARC_5 },
222   { BFD_RELOC_SPARC_6, R_SPARC_6 },
223   { BFD_RELOC_SPARC_DISP64, R_SPARC_DISP64 },
224   { BFD_RELOC_SPARC_PLT64, R_SPARC_PLT64 },
225   { BFD_RELOC_SPARC_HIX22, R_SPARC_HIX22 },
226   { BFD_RELOC_SPARC_LOX10, R_SPARC_LOX10 },
227   { BFD_RELOC_SPARC_H44, R_SPARC_H44 },
228   { BFD_RELOC_SPARC_M44, R_SPARC_M44 },
229   { BFD_RELOC_SPARC_L44, R_SPARC_L44 },
230   { BFD_RELOC_SPARC_REGISTER, R_SPARC_REGISTER }
231 };
232
233 static reloc_howto_type *
234 sparc64_elf_reloc_type_lookup (abfd, code)
235      bfd *abfd ATTRIBUTE_UNUSED;
236      bfd_reloc_code_real_type code;
237 {
238   unsigned int i;
239   for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
240     {
241       if (sparc_reloc_map[i].bfd_reloc_val == code)
242         return &sparc64_elf_howto_table[(int) sparc_reloc_map[i].elf_reloc_val];
243     }
244   return 0;
245 }
246
247 static void
248 sparc64_elf_info_to_howto (abfd, cache_ptr, dst)
249      bfd *abfd ATTRIBUTE_UNUSED;
250      arelent *cache_ptr;
251      Elf64_Internal_Rela *dst;
252 {
253   BFD_ASSERT (ELF64_R_TYPE_ID (dst->r_info) < (unsigned int) R_SPARC_max_std);
254   cache_ptr->howto = &sparc64_elf_howto_table[ELF64_R_TYPE_ID (dst->r_info)];
255 }
256 \f
257 /* Due to the way how we handle R_SPARC_OLO10, each entry in a SHT_RELA
258    section can represent up to two relocs, we must tell the user to allocate
259    more space.  */
260
261 static long
262 sparc64_elf_get_reloc_upper_bound (abfd, sec)
263      bfd *abfd ATTRIBUTE_UNUSED;
264      asection *sec;
265 {
266   return (sec->reloc_count * 2 + 1) * sizeof (arelent *);
267 }
268
269 static long
270 sparc64_elf_get_dynamic_reloc_upper_bound (abfd)
271      bfd *abfd;
272 {
273   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 2;
274 }
275
276 /* Read  relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
277    them.  We cannot use generic elf routines for this,  because R_SPARC_OLO10
278    has secondary addend in ELF64_R_TYPE_DATA.  We handle it as two relocations
279    for the same location,  R_SPARC_LO10 and R_SPARC_13.  */
280
281 static boolean
282 sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, dynamic)
283      bfd *abfd;
284      asection *asect;
285      Elf_Internal_Shdr *rel_hdr;
286      asymbol **symbols;
287      boolean dynamic;
288 {
289   PTR allocated = NULL;
290   bfd_byte *native_relocs;
291   arelent *relent;
292   unsigned int i;
293   int entsize;
294   bfd_size_type count;
295   arelent *relents;
296
297   allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size);
298   if (allocated == NULL)
299     goto error_return;
300
301   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
302       || (bfd_read (allocated, 1, rel_hdr->sh_size, abfd)
303           != rel_hdr->sh_size))
304     goto error_return;
305
306   native_relocs = (bfd_byte *) allocated;
307
308   relents = asect->relocation + asect->reloc_count;
309
310   entsize = rel_hdr->sh_entsize;
311   BFD_ASSERT (entsize == sizeof (Elf64_External_Rela));
312
313   count = rel_hdr->sh_size / entsize;
314
315   for (i = 0, relent = relents; i < count;
316        i++, relent++, native_relocs += entsize)
317     {
318       Elf_Internal_Rela rela;
319
320       bfd_elf64_swap_reloca_in (abfd, (Elf64_External_Rela *) native_relocs, &rela);
321
322       /* The address of an ELF reloc is section relative for an object
323          file, and absolute for an executable file or shared library.
324          The address of a normal BFD reloc is always section relative,
325          and the address of a dynamic reloc is absolute..  */
326       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
327         relent->address = rela.r_offset;
328       else
329         relent->address = rela.r_offset - asect->vma;
330
331       if (ELF64_R_SYM (rela.r_info) == 0)
332         relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
333       else
334         {
335           asymbol **ps, *s;
336
337           ps = symbols + ELF64_R_SYM (rela.r_info) - 1;
338           s = *ps;
339
340           /* Canonicalize ELF section symbols.  FIXME: Why?  */
341           if ((s->flags & BSF_SECTION_SYM) == 0)
342             relent->sym_ptr_ptr = ps;
343           else
344             relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
345         }
346
347       relent->addend = rela.r_addend;
348
349       BFD_ASSERT (ELF64_R_TYPE_ID (rela.r_info) < (unsigned int) R_SPARC_max_std);
350       if (ELF64_R_TYPE_ID (rela.r_info) == R_SPARC_OLO10)
351         {
352           relent->howto = &sparc64_elf_howto_table[R_SPARC_LO10];
353           relent[1].address = relent->address;
354           relent++;
355           relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
356           relent->addend = ELF64_R_TYPE_DATA (rela.r_info);
357           relent->howto = &sparc64_elf_howto_table[R_SPARC_13];
358         }
359       else
360         relent->howto = &sparc64_elf_howto_table[ELF64_R_TYPE_ID (rela.r_info)];
361     }
362
363   asect->reloc_count += relent - relents;
364
365   if (allocated != NULL)
366     free (allocated);
367
368   return true;
369
370  error_return:
371   if (allocated != NULL)
372     free (allocated);
373   return false;
374 }
375
376 /* Read in and swap the external relocs.  */
377
378 static boolean
379 sparc64_elf_slurp_reloc_table (abfd, asect, symbols, dynamic)
380      bfd *abfd;
381      asection *asect;
382      asymbol **symbols;
383      boolean dynamic;
384 {
385   struct bfd_elf_section_data * const d = elf_section_data (asect);
386   Elf_Internal_Shdr *rel_hdr;
387   Elf_Internal_Shdr *rel_hdr2;
388
389   if (asect->relocation != NULL)
390     return true;
391
392   if (! dynamic)
393     {
394       if ((asect->flags & SEC_RELOC) == 0
395           || asect->reloc_count == 0)
396         return true;
397
398       rel_hdr = &d->rel_hdr;
399       rel_hdr2 = d->rel_hdr2;
400
401       BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
402                   || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
403     }
404   else
405     {
406       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
407          case because relocations against this section may use the
408          dynamic symbol table, and in that case bfd_section_from_shdr
409          in elf.c does not update the RELOC_COUNT.  */
410       if (asect->_raw_size == 0)
411         return true;
412
413       rel_hdr = &d->this_hdr;
414       asect->reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
415       rel_hdr2 = NULL;
416     }
417
418   asect->relocation = ((arelent *)
419                        bfd_alloc (abfd,
420                                   asect->reloc_count * 2 * sizeof (arelent)));
421   if (asect->relocation == NULL)
422     return false;
423
424   /* The sparc64_elf_slurp_one_reloc_table routine increments reloc_count.  */
425   asect->reloc_count = 0;
426
427   if (!sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols,
428                                           dynamic))
429     return false;
430
431   if (rel_hdr2
432       && !sparc64_elf_slurp_one_reloc_table (abfd, asect, rel_hdr2, symbols,
433                                              dynamic))
434     return false;
435
436   return true;
437 }
438
439 /* Canonicalize the dynamic relocation entries.  Note that we return
440    the dynamic relocations as a single block, although they are
441    actually associated with particular sections; the interface, which
442    was designed for SunOS style shared libraries, expects that there
443    is only one set of dynamic relocs.  Any section that was actually
444    installed in the BFD, and has type SHT_REL or SHT_RELA, and uses
445    the dynamic symbol table, is considered to be a dynamic reloc
446    section.  */
447
448 static long
449 sparc64_elf_canonicalize_dynamic_reloc (abfd, storage, syms)
450      bfd *abfd;
451      arelent **storage;
452      asymbol **syms;
453 {
454   asection *s;
455   long ret;
456
457   if (elf_dynsymtab (abfd) == 0)
458     {
459       bfd_set_error (bfd_error_invalid_operation);
460       return -1;
461     }
462
463   ret = 0;
464   for (s = abfd->sections; s != NULL; s = s->next)
465     {
466       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
467           && (elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
468         {
469           arelent *p;
470           long count, i;
471
472           if (! sparc64_elf_slurp_reloc_table (abfd, s, syms, true))
473             return -1;
474           count = s->reloc_count;
475           p = s->relocation;
476           for (i = 0; i < count; i++)
477             *storage++ = p++;
478           ret += count;
479         }
480     }
481
482   *storage = NULL;
483
484   return ret;
485 }
486
487 /* Write out the relocs.  */
488
489 static void
490 sparc64_elf_write_relocs (abfd, sec, data)
491      bfd *abfd;
492      asection *sec;
493      PTR data;
494 {
495   boolean *failedp = (boolean *) data;
496   Elf_Internal_Shdr *rela_hdr;
497   Elf64_External_Rela *outbound_relocas, *src_rela;
498   unsigned int idx, count;
499   asymbol *last_sym = 0;
500   int last_sym_idx = 0;
501
502   /* If we have already failed, don't do anything.  */
503   if (*failedp)
504     return;
505
506   if ((sec->flags & SEC_RELOC) == 0)
507     return;
508
509   /* The linker backend writes the relocs out itself, and sets the
510      reloc_count field to zero to inhibit writing them here.  Also,
511      sometimes the SEC_RELOC flag gets set even when there aren't any
512      relocs.  */
513   if (sec->reloc_count == 0)
514     return;
515
516   /* We can combine two relocs that refer to the same address
517      into R_SPARC_OLO10 if first one is R_SPARC_LO10 and the
518      latter is R_SPARC_13 with no associated symbol.  */
519   count = 0;
520   for (idx = 0; idx < sec->reloc_count; idx++)
521     {
522       bfd_vma addr;
523
524       ++count;
525
526       addr = sec->orelocation[idx]->address;
527       if (sec->orelocation[idx]->howto->type == R_SPARC_LO10
528           && idx < sec->reloc_count - 1)
529         {
530           arelent *r = sec->orelocation[idx + 1];
531
532           if (r->howto->type == R_SPARC_13
533               && r->address == addr
534               && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
535               && (*r->sym_ptr_ptr)->value == 0)
536             ++idx;
537         }
538     }
539
540   rela_hdr = &elf_section_data (sec)->rel_hdr;
541
542   rela_hdr->sh_size = rela_hdr->sh_entsize * count;
543   rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size);
544   if (rela_hdr->contents == NULL)
545     {
546       *failedp = true;
547       return;
548     }
549
550   /* Figure out whether the relocations are RELA or REL relocations.  */
551   if (rela_hdr->sh_type != SHT_RELA)
552     abort ();
553
554   /* orelocation has the data, reloc_count has the count...  */
555   outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents;
556   src_rela = outbound_relocas;
557
558   for (idx = 0; idx < sec->reloc_count; idx++)
559     {
560       Elf_Internal_Rela dst_rela;
561       arelent *ptr;
562       asymbol *sym;
563       int n;
564
565       ptr = sec->orelocation[idx];
566
567       /* The address of an ELF reloc is section relative for an object
568          file, and absolute for an executable file or shared library.
569          The address of a BFD reloc is always section relative.  */
570       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
571         dst_rela.r_offset = ptr->address;
572       else
573         dst_rela.r_offset = ptr->address + sec->vma;
574
575       sym = *ptr->sym_ptr_ptr;
576       if (sym == last_sym)
577         n = last_sym_idx;
578       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
579         n = STN_UNDEF;
580       else
581         {
582           last_sym = sym;
583           n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
584           if (n < 0)
585             {
586               *failedp = true;
587               return;
588             }
589           last_sym_idx = n;
590         }
591
592       if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
593           && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
594           && ! _bfd_elf_validate_reloc (abfd, ptr))
595         {
596           *failedp = true;
597           return;
598         }
599
600       if (ptr->howto->type == R_SPARC_LO10
601           && idx < sec->reloc_count - 1)
602         {
603           arelent *r = sec->orelocation[idx + 1];
604
605           if (r->howto->type == R_SPARC_13
606               && r->address == ptr->address
607               && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
608               && (*r->sym_ptr_ptr)->value == 0)
609             {
610               idx++;
611               dst_rela.r_info
612                 = ELF64_R_INFO (n, ELF64_R_TYPE_INFO (r->addend,
613                                                       R_SPARC_OLO10));
614             }
615           else
616             dst_rela.r_info = ELF64_R_INFO (n, R_SPARC_LO10);
617         }
618       else
619         dst_rela.r_info = ELF64_R_INFO (n, ptr->howto->type);
620
621       dst_rela.r_addend = ptr->addend;
622       bfd_elf64_swap_reloca_out (abfd, &dst_rela, src_rela);
623       ++src_rela;
624     }
625 }
626 \f
627 /* Sparc64 ELF linker hash table.  */
628
629 struct sparc64_elf_app_reg
630 {
631   unsigned char bind;
632   unsigned short shndx;
633   bfd *abfd;
634   char *name;
635 };
636
637 struct sparc64_elf_link_hash_table
638 {
639   struct elf_link_hash_table root;
640
641   struct sparc64_elf_app_reg app_regs [4];
642 };
643
644 /* Get the Sparc64 ELF linker hash table from a link_info structure.  */
645
646 #define sparc64_elf_hash_table(p) \
647   ((struct sparc64_elf_link_hash_table *) ((p)->hash))
648
649 /* Create a Sparc64 ELF linker hash table.  */
650
651 static struct bfd_link_hash_table *
652 sparc64_elf_bfd_link_hash_table_create (abfd)
653      bfd *abfd;
654 {
655   struct sparc64_elf_link_hash_table *ret;
656
657   ret = ((struct sparc64_elf_link_hash_table *)
658          bfd_zalloc (abfd, sizeof (struct sparc64_elf_link_hash_table)));
659   if (ret == (struct sparc64_elf_link_hash_table *) NULL)
660     return NULL;
661
662   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
663                                        _bfd_elf_link_hash_newfunc))
664     {
665       bfd_release (abfd, ret);
666       return NULL;
667     }
668
669   return &ret->root.root;
670 }
671 \f
672 /* Utility for performing the standard initial work of an instruction
673    relocation.
674    *PRELOCATION will contain the relocated item.
675    *PINSN will contain the instruction from the input stream.
676    If the result is `bfd_reloc_other' the caller can continue with
677    performing the relocation.  Otherwise it must stop and return the
678    value to its caller.  */
679
680 static bfd_reloc_status_type
681 init_insn_reloc (abfd,
682                  reloc_entry,
683                  symbol,
684                  data,
685                  input_section,
686                  output_bfd,
687                  prelocation,
688                  pinsn)
689      bfd *abfd;
690      arelent *reloc_entry;
691      asymbol *symbol;
692      PTR data;
693      asection *input_section;
694      bfd *output_bfd;
695      bfd_vma *prelocation;
696      bfd_vma *pinsn;
697 {
698   bfd_vma relocation;
699   reloc_howto_type *howto = reloc_entry->howto;
700
701   if (output_bfd != (bfd *) NULL
702       && (symbol->flags & BSF_SECTION_SYM) == 0
703       && (! howto->partial_inplace
704           || reloc_entry->addend == 0))
705     {
706       reloc_entry->address += input_section->output_offset;
707       return bfd_reloc_ok;
708     }
709
710   /* This works because partial_inplace == false.  */
711   if (output_bfd != NULL)
712     return bfd_reloc_continue;
713
714   if (reloc_entry->address > input_section->_cooked_size)
715     return bfd_reloc_outofrange;
716
717   relocation = (symbol->value
718                 + symbol->section->output_section->vma
719                 + symbol->section->output_offset);
720   relocation += reloc_entry->addend;
721   if (howto->pc_relative)
722     {
723       relocation -= (input_section->output_section->vma
724                      + input_section->output_offset);
725       relocation -= reloc_entry->address;
726     }
727
728   *prelocation = relocation;
729   *pinsn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
730   return bfd_reloc_other;
731 }
732
733 /* For unsupported relocs.  */
734
735 static bfd_reloc_status_type
736 sparc_elf_notsup_reloc (abfd,
737                         reloc_entry,
738                         symbol,
739                         data,
740                         input_section,
741                         output_bfd,
742                         error_message)
743      bfd *abfd ATTRIBUTE_UNUSED;
744      arelent *reloc_entry ATTRIBUTE_UNUSED;
745      asymbol *symbol ATTRIBUTE_UNUSED;
746      PTR data ATTRIBUTE_UNUSED;
747      asection *input_section ATTRIBUTE_UNUSED;
748      bfd *output_bfd ATTRIBUTE_UNUSED;
749      char **error_message ATTRIBUTE_UNUSED;
750 {
751   return bfd_reloc_notsupported;
752 }
753
754 /* Handle the WDISP16 reloc.  */
755
756 static bfd_reloc_status_type
757 sparc_elf_wdisp16_reloc (abfd, reloc_entry, symbol, data, input_section,
758                          output_bfd, error_message)
759      bfd *abfd;
760      arelent *reloc_entry;
761      asymbol *symbol;
762      PTR data;
763      asection *input_section;
764      bfd *output_bfd;
765      char **error_message ATTRIBUTE_UNUSED;
766 {
767   bfd_vma relocation;
768   bfd_vma insn;
769   bfd_reloc_status_type status;
770
771   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
772                             input_section, output_bfd, &relocation, &insn);
773   if (status != bfd_reloc_other)
774     return status;
775
776   insn = (insn & ~0x303fff) | ((((relocation >> 2) & 0xc000) << 6)
777                                | ((relocation >> 2) & 0x3fff));
778   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
779
780   if ((bfd_signed_vma) relocation < - 0x40000
781       || (bfd_signed_vma) relocation > 0x3ffff)
782     return bfd_reloc_overflow;
783   else
784     return bfd_reloc_ok;
785 }
786
787 /* Handle the HIX22 reloc.  */
788
789 static bfd_reloc_status_type
790 sparc_elf_hix22_reloc (abfd,
791                        reloc_entry,
792                        symbol,
793                        data,
794                        input_section,
795                        output_bfd,
796                        error_message)
797      bfd *abfd;
798      arelent *reloc_entry;
799      asymbol *symbol;
800      PTR data;
801      asection *input_section;
802      bfd *output_bfd;
803      char **error_message ATTRIBUTE_UNUSED;
804 {
805   bfd_vma relocation;
806   bfd_vma insn;
807   bfd_reloc_status_type status;
808
809   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
810                             input_section, output_bfd, &relocation, &insn);
811   if (status != bfd_reloc_other)
812     return status;
813
814   relocation ^= MINUS_ONE;
815   insn = (insn & ~0x3fffff) | ((relocation >> 10) & 0x3fffff);
816   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
817
818   if ((relocation & ~ (bfd_vma) 0xffffffff) != 0)
819     return bfd_reloc_overflow;
820   else
821     return bfd_reloc_ok;
822 }
823
824 /* Handle the LOX10 reloc.  */
825
826 static bfd_reloc_status_type
827 sparc_elf_lox10_reloc (abfd,
828                        reloc_entry,
829                        symbol,
830                        data,
831                        input_section,
832                        output_bfd,
833                        error_message)
834      bfd *abfd;
835      arelent *reloc_entry;
836      asymbol *symbol;
837      PTR data;
838      asection *input_section;
839      bfd *output_bfd;
840      char **error_message ATTRIBUTE_UNUSED;
841 {
842   bfd_vma relocation;
843   bfd_vma insn;
844   bfd_reloc_status_type status;
845
846   status = init_insn_reloc (abfd, reloc_entry, symbol, data,
847                             input_section, output_bfd, &relocation, &insn);
848   if (status != bfd_reloc_other)
849     return status;
850
851   insn = (insn & ~0x1fff) | 0x1c00 | (relocation & 0x3ff);
852   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
853
854   return bfd_reloc_ok;
855 }
856 \f
857 /* PLT/GOT stuff */
858
859 /* Both the headers and the entries are icache aligned.  */
860 #define PLT_ENTRY_SIZE          32
861 #define PLT_HEADER_SIZE         (4 * PLT_ENTRY_SIZE)
862 #define LARGE_PLT_THRESHOLD     32768
863 #define GOT_RESERVED_ENTRIES    1
864
865 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/sparcv9/ld.so.1"
866
867 /* Fill in the .plt section.  */
868
869 static void
870 sparc64_elf_build_plt (output_bfd, contents, nentries)
871      bfd *output_bfd;
872      unsigned char *contents;
873      int nentries;
874 {
875   const unsigned int nop = 0x01000000;
876   int i, j;
877
878   /* The first four entries are reserved, and are initially undefined.
879      We fill them with `illtrap 0' to force ld.so to do something.  */
880
881   for (i = 0; i < PLT_HEADER_SIZE/4; ++i)
882     bfd_put_32 (output_bfd, 0, contents+i*4);
883
884   /* The first 32768 entries are close enough to plt1 to get there via
885      a straight branch.  */
886
887   for (i = 4; i < LARGE_PLT_THRESHOLD && i < nentries; ++i)
888     {
889       unsigned char *entry = contents + i * PLT_ENTRY_SIZE;
890       unsigned int sethi, ba;
891
892       /* sethi (. - plt0), %g1 */
893       sethi = 0x03000000 | (i * PLT_ENTRY_SIZE);
894
895       /* ba,a,pt %xcc, plt1 */
896       ba = 0x30680000 | (((contents+PLT_ENTRY_SIZE) - (entry+4)) / 4 & 0x7ffff);
897
898       bfd_put_32 (output_bfd, sethi, entry);
899       bfd_put_32 (output_bfd, ba, entry+4);
900       bfd_put_32 (output_bfd, nop, entry+8);
901       bfd_put_32 (output_bfd, nop, entry+12);
902       bfd_put_32 (output_bfd, nop, entry+16);
903       bfd_put_32 (output_bfd, nop, entry+20);
904       bfd_put_32 (output_bfd, nop, entry+24);
905       bfd_put_32 (output_bfd, nop, entry+28);
906     }
907
908   /* Now the tricky bit.  Entries 32768 and higher are grouped in blocks of
909      160: 160 entries and 160 pointers.  This is to separate code from data,
910      which is much friendlier on the cache.  */
911
912   for (; i < nentries; i += 160)
913     {
914       int block = (i + 160 <= nentries ? 160 : nentries - i);
915       for (j = 0; j < block; ++j)
916         {
917           unsigned char *entry, *ptr;
918           unsigned int ldx;
919
920           entry = contents + i*PLT_ENTRY_SIZE + j*4*6;
921           ptr = contents + i*PLT_ENTRY_SIZE + block*4*6 + j*8;
922
923           /* ldx [%o7 + ptr - entry+4], %g1 */
924           ldx = 0xc25be000 | ((ptr - entry+4) & 0x1fff);
925
926           bfd_put_32 (output_bfd, 0x8a10000f, entry);    /* mov %o7,%g5 */
927           bfd_put_32 (output_bfd, 0x40000002, entry+4);  /* call .+8 */
928           bfd_put_32 (output_bfd, nop, entry+8);         /* nop */
929           bfd_put_32 (output_bfd, ldx, entry+12);        /* ldx [%o7+P],%g1 */
930           bfd_put_32 (output_bfd, 0x83c3c001, entry+16); /* jmpl %o7+%g1,%g1 */
931           bfd_put_32 (output_bfd, 0x9e100005, entry+20); /* mov %g5,%o7 */
932
933           bfd_put_64 (output_bfd, contents - (entry+4), ptr);
934         }
935     }
936 }
937
938 /* Return the offset of a particular plt entry within the .plt section.  */
939
940 static bfd_vma
941 sparc64_elf_plt_entry_offset (index)
942      int index;
943 {
944   int block, ofs;
945
946   if (index < LARGE_PLT_THRESHOLD)
947     return index * PLT_ENTRY_SIZE;
948
949   /* See above for details.  */
950
951   block = (index - LARGE_PLT_THRESHOLD) / 160;
952   ofs = (index - LARGE_PLT_THRESHOLD) % 160;
953
954   return ((bfd_vma) (LARGE_PLT_THRESHOLD + block*160) * PLT_ENTRY_SIZE
955           + ofs * 6*4);
956 }
957
958 static bfd_vma
959 sparc64_elf_plt_ptr_offset (index, max)
960      int index, max;
961 {
962   int block, ofs, last;
963
964   BFD_ASSERT(index >= LARGE_PLT_THRESHOLD);
965
966   /* See above for details.  */
967
968   block = (((index - LARGE_PLT_THRESHOLD) / 160) * 160)
969           + LARGE_PLT_THRESHOLD;
970   ofs = index - block;
971   if (block + 160 > max)
972     last = (max - LARGE_PLT_THRESHOLD) % 160;
973   else
974     last = 160;
975
976   return (block * PLT_ENTRY_SIZE
977           + last * 6*4
978           + ofs * 8);
979 }
980 \f
981 /* Look through the relocs for a section during the first phase, and
982    allocate space in the global offset table or procedure linkage
983    table.  */
984
985 static boolean
986 sparc64_elf_check_relocs (abfd, info, sec, relocs)
987      bfd *abfd;
988      struct bfd_link_info *info;
989      asection *sec;
990      const Elf_Internal_Rela *relocs;
991 {
992   bfd *dynobj;
993   Elf_Internal_Shdr *symtab_hdr;
994   struct elf_link_hash_entry **sym_hashes;
995   bfd_vma *local_got_offsets;
996   const Elf_Internal_Rela *rel;
997   const Elf_Internal_Rela *rel_end;
998   asection *sgot;
999   asection *srelgot;
1000   asection *sreloc;
1001
1002   if (info->relocateable || !(sec->flags & SEC_ALLOC))
1003     return true;
1004
1005   dynobj = elf_hash_table (info)->dynobj;
1006   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1007   sym_hashes = elf_sym_hashes (abfd);
1008   local_got_offsets = elf_local_got_offsets (abfd);
1009
1010   sgot = NULL;
1011   srelgot = NULL;
1012   sreloc = NULL;
1013
1014   rel_end = relocs + NUM_SHDR_ENTRIES (& elf_section_data (sec)->rel_hdr);
1015   for (rel = relocs; rel < rel_end; rel++)
1016     {
1017       unsigned long r_symndx;
1018       struct elf_link_hash_entry *h;
1019
1020       r_symndx = ELF64_R_SYM (rel->r_info);
1021       if (r_symndx < symtab_hdr->sh_info)
1022         h = NULL;
1023       else
1024         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1025
1026       switch (ELF64_R_TYPE_ID (rel->r_info))
1027         {
1028         case R_SPARC_GOT10:
1029         case R_SPARC_GOT13:
1030         case R_SPARC_GOT22:
1031           /* This symbol requires a global offset table entry.  */
1032
1033           if (dynobj == NULL)
1034             {
1035               /* Create the .got section.  */
1036               elf_hash_table (info)->dynobj = dynobj = abfd;
1037               if (! _bfd_elf_create_got_section (dynobj, info))
1038                 return false;
1039             }
1040
1041           if (sgot == NULL)
1042             {
1043               sgot = bfd_get_section_by_name (dynobj, ".got");
1044               BFD_ASSERT (sgot != NULL);
1045             }
1046
1047           if (srelgot == NULL && (h != NULL || info->shared))
1048             {
1049               srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1050               if (srelgot == NULL)
1051                 {
1052                   srelgot = bfd_make_section (dynobj, ".rela.got");
1053                   if (srelgot == NULL
1054                       || ! bfd_set_section_flags (dynobj, srelgot,
1055                                                   (SEC_ALLOC
1056                                                    | SEC_LOAD
1057                                                    | SEC_HAS_CONTENTS
1058                                                    | SEC_IN_MEMORY
1059                                                    | SEC_LINKER_CREATED
1060                                                    | SEC_READONLY))
1061                       || ! bfd_set_section_alignment (dynobj, srelgot, 3))
1062                     return false;
1063                 }
1064             }
1065
1066           if (h != NULL)
1067             {
1068               if (h->got.offset != (bfd_vma) -1)
1069                 {
1070                   /* We have already allocated space in the .got.  */
1071                   break;
1072                 }
1073               h->got.offset = sgot->_raw_size;
1074
1075               /* Make sure this symbol is output as a dynamic symbol.  */
1076               if (h->dynindx == -1)
1077                 {
1078                   if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1079                     return false;
1080                 }
1081
1082               srelgot->_raw_size += sizeof (Elf64_External_Rela);
1083             }
1084           else
1085             {
1086               /* This is a global offset table entry for a local
1087                  symbol.  */
1088               if (local_got_offsets == NULL)
1089                 {
1090                   size_t size;
1091                   register unsigned int i;
1092
1093                   size = symtab_hdr->sh_info * sizeof (bfd_vma);
1094                   local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
1095                   if (local_got_offsets == NULL)
1096                     return false;
1097                   elf_local_got_offsets (abfd) = local_got_offsets;
1098                   for (i = 0; i < symtab_hdr->sh_info; i++)
1099                     local_got_offsets[i] = (bfd_vma) -1;
1100                 }
1101               if (local_got_offsets[r_symndx] != (bfd_vma) -1)
1102                 {
1103                   /* We have already allocated space in the .got.  */
1104                   break;
1105                 }
1106               local_got_offsets[r_symndx] = sgot->_raw_size;
1107
1108               if (info->shared)
1109                 {
1110                   /* If we are generating a shared object, we need to
1111                      output a R_SPARC_RELATIVE reloc so that the
1112                      dynamic linker can adjust this GOT entry.  */
1113                   srelgot->_raw_size += sizeof (Elf64_External_Rela);
1114                 }
1115             }
1116
1117           sgot->_raw_size += 8;
1118
1119 #if 0
1120           /* Doesn't work for 64-bit -fPIC, since sethi/or builds
1121              unsigned numbers.  If we permit ourselves to modify
1122              code so we get sethi/xor, this could work.
1123              Question: do we consider conditionally re-enabling
1124              this for -fpic, once we know about object code models?  */
1125           /* If the .got section is more than 0x1000 bytes, we add
1126              0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
1127              bit relocations have a greater chance of working.  */
1128           if (sgot->_raw_size >= 0x1000
1129               && elf_hash_table (info)->hgot->root.u.def.value == 0)
1130             elf_hash_table (info)->hgot->root.u.def.value = 0x1000;
1131 #endif
1132
1133           break;
1134
1135         case R_SPARC_WPLT30:
1136         case R_SPARC_PLT32:
1137         case R_SPARC_HIPLT22:
1138         case R_SPARC_LOPLT10:
1139         case R_SPARC_PCPLT32:
1140         case R_SPARC_PCPLT22:
1141         case R_SPARC_PCPLT10:
1142         case R_SPARC_PLT64:
1143           /* This symbol requires a procedure linkage table entry.  We
1144              actually build the entry in adjust_dynamic_symbol,
1145              because this might be a case of linking PIC code without
1146              linking in any dynamic objects, in which case we don't
1147              need to generate a procedure linkage table after all.  */
1148
1149           if (h == NULL)
1150             {
1151               /* It does not make sense to have a procedure linkage
1152                  table entry for a local symbol.  */
1153               bfd_set_error (bfd_error_bad_value);
1154               return false;
1155             }
1156
1157           /* Make sure this symbol is output as a dynamic symbol.  */
1158           if (h->dynindx == -1)
1159             {
1160               if (! bfd_elf64_link_record_dynamic_symbol (info, h))
1161                 return false;
1162             }
1163
1164           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1165           break;
1166
1167         case R_SPARC_PC10:
1168         case R_SPARC_PC22:
1169         case R_SPARC_PC_HH22:
1170         case R_SPARC_PC_HM10:
1171         case R_SPARC_PC_LM22:
1172           if (h != NULL
1173               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1174             break;
1175           /* Fall through.  */
1176         case R_SPARC_DISP8:
1177         case R_SPARC_DISP16:
1178         case R_SPARC_DISP32:
1179         case R_SPARC_DISP64:
1180         case R_SPARC_WDISP30:
1181         case R_SPARC_WDISP22:
1182         case R_SPARC_WDISP19:
1183         case R_SPARC_WDISP16:
1184           if (h == NULL)
1185             break;
1186           /* Fall through.  */
1187         case R_SPARC_8:
1188         case R_SPARC_16:
1189         case R_SPARC_32:
1190         case R_SPARC_HI22:
1191         case R_SPARC_22:
1192         case R_SPARC_13:
1193         case R_SPARC_LO10:
1194         case R_SPARC_UA32:
1195         case R_SPARC_10:
1196         case R_SPARC_11:
1197         case R_SPARC_64:
1198         case R_SPARC_OLO10:
1199         case R_SPARC_HH22:
1200         case R_SPARC_HM10:
1201         case R_SPARC_LM22:
1202         case R_SPARC_7:
1203         case R_SPARC_5:
1204         case R_SPARC_6:
1205         case R_SPARC_HIX22:
1206         case R_SPARC_LOX10:
1207         case R_SPARC_H44:
1208         case R_SPARC_M44:
1209         case R_SPARC_L44:
1210         case R_SPARC_UA64:
1211         case R_SPARC_UA16:
1212           /* When creating a shared object, we must copy these relocs
1213              into the output file.  We create a reloc section in
1214              dynobj and make room for the reloc.
1215
1216              But don't do this for debugging sections -- this shows up
1217              with DWARF2 -- first because they are not loaded, and
1218              second because DWARF sez the debug info is not to be
1219              biased by the load address.  */
1220           if (info->shared && (sec->flags & SEC_ALLOC))
1221             {
1222               if (sreloc == NULL)
1223                 {
1224                   const char *name;
1225
1226                   name = (bfd_elf_string_from_elf_section
1227                           (abfd,
1228                            elf_elfheader (abfd)->e_shstrndx,
1229                            elf_section_data (sec)->rel_hdr.sh_name));
1230                   if (name == NULL)
1231                     return false;
1232
1233                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1234                               && strcmp (bfd_get_section_name (abfd, sec),
1235                                          name + 5) == 0);
1236
1237                   sreloc = bfd_get_section_by_name (dynobj, name);
1238                   if (sreloc == NULL)
1239                     {
1240                       flagword flags;
1241
1242                       sreloc = bfd_make_section (dynobj, name);
1243                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
1244                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1245                       if ((sec->flags & SEC_ALLOC) != 0)
1246                         flags |= SEC_ALLOC | SEC_LOAD;
1247                       if (sreloc == NULL
1248                           || ! bfd_set_section_flags (dynobj, sreloc, flags)
1249                           || ! bfd_set_section_alignment (dynobj, sreloc, 3))
1250                         return false;
1251                     }
1252                   if (sec->flags & SEC_READONLY)
1253                     info->flags |= DF_TEXTREL;
1254                 }
1255
1256               sreloc->_raw_size += sizeof (Elf64_External_Rela);
1257             }
1258           break;
1259
1260         case R_SPARC_REGISTER:
1261           /* Nothing to do.  */
1262           break;
1263
1264         default:
1265           (*_bfd_error_handler) (_("%s: check_relocs: unhandled reloc type %d"),
1266                                 bfd_get_filename(abfd),
1267                                 ELF64_R_TYPE_ID (rel->r_info));
1268           return false;
1269         }
1270     }
1271
1272   return true;
1273 }
1274
1275 /* Hook called by the linker routine which adds symbols from an object
1276    file.  We use it for STT_REGISTER symbols.  */
1277
1278 static boolean
1279 sparc64_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1280      bfd *abfd;
1281      struct bfd_link_info *info;
1282      const Elf_Internal_Sym *sym;
1283      const char **namep;
1284      flagword *flagsp ATTRIBUTE_UNUSED;
1285      asection **secp ATTRIBUTE_UNUSED;
1286      bfd_vma *valp ATTRIBUTE_UNUSED;
1287 {
1288   static char *stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" };
1289
1290   if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER)
1291     {
1292       int reg;
1293       struct sparc64_elf_app_reg *p;
1294
1295       reg = (int)sym->st_value;
1296       switch (reg & ~1)
1297         {
1298         case 2: reg -= 2; break;
1299         case 6: reg -= 4; break;
1300         default:
1301           (*_bfd_error_handler)
1302             (_("%s: Only registers %%g[2367] can be declared using STT_REGISTER"),
1303              bfd_get_filename (abfd));
1304           return false;
1305         }
1306
1307       if (info->hash->creator != abfd->xvec
1308           || (abfd->flags & DYNAMIC) != 0)
1309         {
1310           /* STT_REGISTER only works when linking an elf64_sparc object.
1311              If STT_REGISTER comes from a dynamic object, don't put it into
1312              the output bfd.  The dynamic linker will recheck it.  */
1313           *namep = NULL;
1314           return true;
1315         }
1316
1317       p = sparc64_elf_hash_table(info)->app_regs + reg;
1318
1319       if (p->name != NULL && strcmp (p->name, *namep))
1320         {
1321           (*_bfd_error_handler)
1322             (_("Register %%g%d used incompatibly: "
1323                "previously declared in %s to %s, in %s redefined to %s"),
1324              (int)sym->st_value,
1325              bfd_get_filename (p->abfd), *p->name ? p->name : "#scratch",
1326              bfd_get_filename (abfd), **namep ? *namep : "#scratch");
1327           return false;
1328         }
1329
1330       if (p->name == NULL)
1331         {
1332           if (**namep)
1333             {
1334               struct elf_link_hash_entry *h;
1335
1336               h = (struct elf_link_hash_entry *)
1337                 bfd_link_hash_lookup (info->hash, *namep, false, false, false);
1338
1339               if (h != NULL)
1340                 {
1341                   unsigned char type = h->type;
1342
1343                   if (type > STT_FUNC) type = 0;
1344                   (*_bfd_error_handler)
1345                     (_("Symbol `%s' has differing types: "
1346                        "previously %s, REGISTER in %s"),
1347                      *namep, stt_types [type], bfd_get_filename (abfd));
1348                   return false;
1349                 }
1350
1351               p->name = bfd_hash_allocate (&info->hash->table,
1352                                            strlen (*namep) + 1);
1353               if (!p->name)
1354                 return false;
1355
1356               strcpy (p->name, *namep);
1357             }
1358           else
1359             p->name = "";
1360           p->bind = ELF_ST_BIND (sym->st_info);
1361           p->abfd = abfd;
1362           p->shndx = sym->st_shndx;
1363         }
1364       else
1365         {
1366           if (p->bind == STB_WEAK
1367               && ELF_ST_BIND (sym->st_info) == STB_GLOBAL)
1368             {
1369               p->bind = STB_GLOBAL;
1370               p->abfd = abfd;
1371             }
1372         }
1373       *namep = NULL;
1374       return true;
1375     }
1376   else if (! *namep || ! **namep)
1377     return true;
1378   else
1379     {
1380       int i;
1381       struct sparc64_elf_app_reg *p;
1382
1383       p = sparc64_elf_hash_table(info)->app_regs;
1384       for (i = 0; i < 4; i++, p++)
1385         if (p->name != NULL && ! strcmp (p->name, *namep))
1386           {
1387             unsigned char type = ELF_ST_TYPE (sym->st_info);
1388
1389             if (type > STT_FUNC) type = 0;
1390             (*_bfd_error_handler)
1391               (_("Symbol `%s' has differing types: "
1392                  "REGISTER in %s, %s in %s"),
1393                *namep, bfd_get_filename (p->abfd), stt_types [type],
1394                bfd_get_filename (abfd));
1395             return false;
1396           }
1397     }
1398   return true;
1399 }
1400
1401 /* This function takes care of emiting STT_REGISTER symbols
1402    which we cannot easily keep in the symbol hash table.  */
1403
1404 static boolean
1405 sparc64_elf_output_arch_syms (output_bfd, info, finfo, func)
1406      bfd *output_bfd ATTRIBUTE_UNUSED;
1407      struct bfd_link_info *info;
1408      PTR finfo;
1409      boolean (*func) PARAMS ((PTR, const char *,
1410                               Elf_Internal_Sym *, asection *));
1411 {
1412   int reg;
1413   struct sparc64_elf_app_reg *app_regs =
1414     sparc64_elf_hash_table(info)->app_regs;
1415   Elf_Internal_Sym sym;
1416
1417   /* We arranged in size_dynamic_sections to put the STT_REGISTER entries
1418      at the end of the dynlocal list, so they came at the end of the local
1419      symbols in the symtab.  Except that they aren't STB_LOCAL, so we need
1420      to back up symtab->sh_info.  */
1421   if (elf_hash_table (info)->dynlocal)
1422     {
1423       bfd * dynobj = elf_hash_table (info)->dynobj;
1424       asection *dynsymsec = bfd_get_section_by_name (dynobj, ".dynsym");
1425       struct elf_link_local_dynamic_entry *e;
1426
1427       for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
1428         if (e->input_indx == -1)
1429           break;
1430       if (e)
1431         {
1432           elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
1433             = e->dynindx;
1434         }
1435     }
1436
1437   if (info->strip == strip_all)
1438     return true;
1439
1440   for (reg = 0; reg < 4; reg++)
1441     if (app_regs [reg].name != NULL)
1442       {
1443         if (info->strip == strip_some
1444             && bfd_hash_lookup (info->keep_hash,
1445                                 app_regs [reg].name,
1446                                 false, false) == NULL)
1447           continue;
1448
1449         sym.st_value = reg < 2 ? reg + 2 : reg + 4;
1450         sym.st_size = 0;
1451         sym.st_other = 0;
1452         sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER);
1453         sym.st_shndx = app_regs [reg].shndx;
1454         if (! (*func) (finfo, app_regs [reg].name, &sym,
1455                        sym.st_shndx == SHN_ABS
1456                          ? bfd_abs_section_ptr : bfd_und_section_ptr))
1457           return false;
1458       }
1459
1460   return true;
1461 }
1462
1463 static int
1464 sparc64_elf_get_symbol_type (elf_sym, type)
1465      Elf_Internal_Sym * elf_sym;
1466      int type;
1467 {
1468   if (ELF_ST_TYPE (elf_sym->st_info) == STT_REGISTER)
1469     return STT_REGISTER;
1470   else
1471     return type;
1472 }
1473
1474 /* A STB_GLOBAL,STT_REGISTER symbol should be BSF_GLOBAL
1475    even in SHN_UNDEF section.  */
1476
1477 static void
1478 sparc64_elf_symbol_processing (abfd, asym)
1479      bfd *abfd ATTRIBUTE_UNUSED;
1480      asymbol *asym;
1481 {
1482   elf_symbol_type *elfsym;
1483
1484   elfsym = (elf_symbol_type *) asym;
1485   if (elfsym->internal_elf_sym.st_info
1486       == ELF_ST_INFO (STB_GLOBAL, STT_REGISTER))
1487     {
1488       asym->flags |= BSF_GLOBAL;
1489     }
1490 }
1491
1492 /* Adjust a symbol defined by a dynamic object and referenced by a
1493    regular object.  The current definition is in some section of the
1494    dynamic object, but we're not including those sections.  We have to
1495    change the definition to something the rest of the link can
1496    understand.  */
1497
1498 static boolean
1499 sparc64_elf_adjust_dynamic_symbol (info, h)
1500      struct bfd_link_info *info;
1501      struct elf_link_hash_entry *h;
1502 {
1503   bfd *dynobj;
1504   asection *s;
1505   unsigned int power_of_two;
1506
1507   dynobj = elf_hash_table (info)->dynobj;
1508
1509   /* Make sure we know what is going on here.  */
1510   BFD_ASSERT (dynobj != NULL
1511               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
1512                   || h->weakdef != NULL
1513                   || ((h->elf_link_hash_flags
1514                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1515                       && (h->elf_link_hash_flags
1516                           & ELF_LINK_HASH_REF_REGULAR) != 0
1517                       && (h->elf_link_hash_flags
1518                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
1519
1520   /* If this is a function, put it in the procedure linkage table.  We
1521      will fill in the contents of the procedure linkage table later
1522      (although we could actually do it here).  The STT_NOTYPE
1523      condition is a hack specifically for the Oracle libraries
1524      delivered for Solaris; for some inexplicable reason, they define
1525      some of their functions as STT_NOTYPE when they really should be
1526      STT_FUNC.  */
1527   if (h->type == STT_FUNC
1528       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
1529       || (h->type == STT_NOTYPE
1530           && (h->root.type == bfd_link_hash_defined
1531               || h->root.type == bfd_link_hash_defweak)
1532           && (h->root.u.def.section->flags & SEC_CODE) != 0))
1533     {
1534       if (! elf_hash_table (info)->dynamic_sections_created)
1535         {
1536           /* This case can occur if we saw a WPLT30 reloc in an input
1537              file, but none of the input files were dynamic objects.
1538              In such a case, we don't actually need to build a
1539              procedure linkage table, and we can just do a WDISP30
1540              reloc instead.  */
1541           BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0);
1542           return true;
1543         }
1544
1545       s = bfd_get_section_by_name (dynobj, ".plt");
1546       BFD_ASSERT (s != NULL);
1547
1548       /* The first four bit in .plt is reserved.  */
1549       if (s->_raw_size == 0)
1550         s->_raw_size = PLT_HEADER_SIZE;
1551
1552       /* If this symbol is not defined in a regular file, and we are
1553          not generating a shared library, then set the symbol to this
1554          location in the .plt.  This is required to make function
1555          pointers compare as equal between the normal executable and
1556          the shared library.  */
1557       if (! info->shared
1558           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1559         {
1560           h->root.u.def.section = s;
1561           h->root.u.def.value = s->_raw_size;
1562         }
1563
1564       /* To simplify matters later, just store the plt index here.  */
1565       h->plt.offset = s->_raw_size / PLT_ENTRY_SIZE;
1566
1567       /* Make room for this entry.  */
1568       s->_raw_size += PLT_ENTRY_SIZE;
1569
1570       /* We also need to make an entry in the .rela.plt section.  */
1571
1572       s = bfd_get_section_by_name (dynobj, ".rela.plt");
1573       BFD_ASSERT (s != NULL);
1574
1575       s->_raw_size += sizeof (Elf64_External_Rela);
1576
1577       /* The procedure linkage table size is bounded by the magnitude
1578          of the offset we can describe in the entry.  */
1579       if (s->_raw_size >= (bfd_vma)1 << 32)
1580         {
1581           bfd_set_error (bfd_error_bad_value);
1582           return false;
1583         }
1584
1585       return true;
1586     }
1587
1588   /* If this is a weak symbol, and there is a real definition, the
1589      processor independent code will have arranged for us to see the
1590      real definition first, and we can just use the same value.  */
1591   if (h->weakdef != NULL)
1592     {
1593       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1594                   || h->weakdef->root.type == bfd_link_hash_defweak);
1595       h->root.u.def.section = h->weakdef->root.u.def.section;
1596       h->root.u.def.value = h->weakdef->root.u.def.value;
1597       return true;
1598     }
1599
1600   /* This is a reference to a symbol defined by a dynamic object which
1601      is not a function.  */
1602
1603   /* If we are creating a shared library, we must presume that the
1604      only references to the symbol are via the global offset table.
1605      For such cases we need not do anything here; the relocations will
1606      be handled correctly by relocate_section.  */
1607   if (info->shared)
1608     return true;
1609
1610   /* We must allocate the symbol in our .dynbss section, which will
1611      become part of the .bss section of the executable.  There will be
1612      an entry for this symbol in the .dynsym section.  The dynamic
1613      object will contain position independent code, so all references
1614      from the dynamic object to this symbol will go through the global
1615      offset table.  The dynamic linker will use the .dynsym entry to
1616      determine the address it must put in the global offset table, so
1617      both the dynamic object and the regular object will refer to the
1618      same memory location for the variable.  */
1619
1620   s = bfd_get_section_by_name (dynobj, ".dynbss");
1621   BFD_ASSERT (s != NULL);
1622
1623   /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1624      to copy the initial value out of the dynamic object and into the
1625      runtime process image.  We need to remember the offset into the
1626      .rel.bss section we are going to use.  */
1627   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1628     {
1629       asection *srel;
1630
1631       srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1632       BFD_ASSERT (srel != NULL);
1633       srel->_raw_size += sizeof (Elf64_External_Rela);
1634       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1635     }
1636
1637   /* We need to figure out the alignment required for this symbol.  I
1638      have no idea how ELF linkers handle this.  16-bytes is the size
1639      of the largest type that requires hard alignment -- long double.  */
1640   power_of_two = bfd_log2 (h->size);
1641   if (power_of_two > 4)
1642     power_of_two = 4;
1643
1644   /* Apply the required alignment.  */
1645   s->_raw_size = BFD_ALIGN (s->_raw_size,
1646                             (bfd_size_type) (1 << power_of_two));
1647   if (power_of_two > bfd_get_section_alignment (dynobj, s))
1648     {
1649       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1650         return false;
1651     }
1652
1653   /* Define the symbol as being at this point in the section.  */
1654   h->root.u.def.section = s;
1655   h->root.u.def.value = s->_raw_size;
1656
1657   /* Increment the section size to make room for the symbol.  */
1658   s->_raw_size += h->size;
1659
1660   return true;
1661 }
1662
1663 /* Set the sizes of the dynamic sections.  */
1664
1665 static boolean
1666 sparc64_elf_size_dynamic_sections (output_bfd, info)
1667      bfd *output_bfd;
1668      struct bfd_link_info *info;
1669 {
1670   bfd *dynobj;
1671   asection *s;
1672   boolean relplt;
1673
1674   dynobj = elf_hash_table (info)->dynobj;
1675   BFD_ASSERT (dynobj != NULL);
1676
1677   if (elf_hash_table (info)->dynamic_sections_created)
1678     {
1679       /* Set the contents of the .interp section to the interpreter.  */
1680       if (! info->shared)
1681         {
1682           s = bfd_get_section_by_name (dynobj, ".interp");
1683           BFD_ASSERT (s != NULL);
1684           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1685           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1686         }
1687     }
1688   else
1689     {
1690       /* We may have created entries in the .rela.got section.
1691          However, if we are not creating the dynamic sections, we will
1692          not actually use these entries.  Reset the size of .rela.got,
1693          which will cause it to get stripped from the output file
1694          below.  */
1695       s = bfd_get_section_by_name (dynobj, ".rela.got");
1696       if (s != NULL)
1697         s->_raw_size = 0;
1698     }
1699
1700   /* The check_relocs and adjust_dynamic_symbol entry points have
1701      determined the sizes of the various dynamic sections.  Allocate
1702      memory for them.  */
1703   relplt = false;
1704   for (s = dynobj->sections; s != NULL; s = s->next)
1705     {
1706       const char *name;
1707       boolean strip;
1708
1709       if ((s->flags & SEC_LINKER_CREATED) == 0)
1710         continue;
1711
1712       /* It's OK to base decisions on the section name, because none
1713          of the dynobj section names depend upon the input files.  */
1714       name = bfd_get_section_name (dynobj, s);
1715
1716       strip = false;
1717
1718       if (strncmp (name, ".rela", 5) == 0)
1719         {
1720           if (s->_raw_size == 0)
1721             {
1722               /* If we don't need this section, strip it from the
1723                  output file.  This is to handle .rela.bss and
1724                  .rel.plt.  We must create it in
1725                  create_dynamic_sections, because it must be created
1726                  before the linker maps input sections to output
1727                  sections.  The linker does that before
1728                  adjust_dynamic_symbol is called, and it is that
1729                  function which decides whether anything needs to go
1730                  into these sections.  */
1731               strip = true;
1732             }
1733           else
1734             {
1735               if (strcmp (name, ".rela.plt") == 0)
1736                 relplt = true;
1737
1738               /* We use the reloc_count field as a counter if we need
1739                  to copy relocs into the output file.  */
1740               s->reloc_count = 0;
1741             }
1742         }
1743       else if (strcmp (name, ".plt") != 0
1744                && strncmp (name, ".got", 4) != 0)
1745         {
1746           /* It's not one of our sections, so don't allocate space.  */
1747           continue;
1748         }
1749
1750       if (strip)
1751         {
1752           _bfd_strip_section_from_output (info, s);
1753           continue;
1754         }
1755
1756       /* Allocate memory for the section contents.  Zero the memory
1757          for the benefit of .rela.plt, which has 4 unused entries
1758          at the beginning, and we don't want garbage.  */
1759       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1760       if (s->contents == NULL && s->_raw_size != 0)
1761         return false;
1762     }
1763
1764   if (elf_hash_table (info)->dynamic_sections_created)
1765     {
1766       /* Add some entries to the .dynamic section.  We fill in the
1767          values later, in sparc64_elf_finish_dynamic_sections, but we
1768          must add the entries now so that we get the correct size for
1769          the .dynamic section.  The DT_DEBUG entry is filled in by the
1770          dynamic linker and used by the debugger.  */
1771       int reg;
1772       struct sparc64_elf_app_reg * app_regs;
1773       struct bfd_strtab_hash *dynstr;
1774       struct elf_link_hash_table *eht = elf_hash_table (info);
1775
1776       if (! info->shared)
1777         {
1778           if (! bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0))
1779             return false;
1780         }
1781
1782       if (relplt)
1783         {
1784           if (! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0)
1785               || ! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1786               || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1787               || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
1788             return false;
1789         }
1790
1791       if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
1792           || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
1793           || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
1794                                             sizeof (Elf64_External_Rela)))
1795         return false;
1796
1797       if (info->flags & DF_TEXTREL)
1798         {
1799           if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
1800             return false;
1801         }
1802
1803       /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
1804          entries if needed.  */
1805       app_regs = sparc64_elf_hash_table (info)->app_regs;
1806       dynstr = eht->dynstr;
1807
1808       for (reg = 0; reg < 4; reg++)
1809         if (app_regs [reg].name != NULL)
1810           {
1811             struct elf_link_local_dynamic_entry *entry, *e;
1812
1813             if (! bfd_elf64_add_dynamic_entry (info, DT_SPARC_REGISTER, 0))
1814               return false;
1815
1816             entry = (struct elf_link_local_dynamic_entry *)
1817               bfd_hash_allocate (&info->hash->table, sizeof (*entry));
1818             if (entry == NULL)
1819               return false;
1820
1821             /* We cheat here a little bit: the symbol will not be local, so we
1822                put it at the end of the dynlocal linked list.  We will fix it
1823                later on, as we have to fix other fields anyway.  */
1824             entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
1825             entry->isym.st_size = 0;
1826             if (*app_regs [reg].name != '\0')
1827               entry->isym.st_name
1828                 = _bfd_stringtab_add (dynstr, app_regs[reg].name, true, false);
1829             else
1830               entry->isym.st_name = 0;
1831             entry->isym.st_other = 0;
1832             entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
1833                                                STT_REGISTER);
1834             entry->isym.st_shndx = app_regs [reg].shndx;
1835             entry->next = NULL;
1836             entry->input_bfd = output_bfd;
1837             entry->input_indx = -1;
1838
1839             if (eht->dynlocal == NULL)
1840               eht->dynlocal = entry;
1841             else
1842               {
1843                 for (e = eht->dynlocal; e->next; e = e->next)
1844                   ;
1845                 e->next = entry;
1846               }
1847             eht->dynsymcount++;
1848           }
1849     }
1850
1851   return true;
1852 }
1853 \f
1854 #define SET_SEC_DO_RELAX(section) do { elf_section_data(section)->tdata = (void *)1; } while (0)
1855 #define SEC_DO_RELAX(section) (elf_section_data(section)->tdata == (void *)1)
1856
1857 static boolean
1858 sparc64_elf_relax_section (abfd, section, link_info, again)
1859      bfd *abfd ATTRIBUTE_UNUSED;
1860      asection *section ATTRIBUTE_UNUSED;
1861      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1862      boolean *again;
1863 {
1864   *again = false;
1865   SET_SEC_DO_RELAX (section);
1866   return true;
1867 }
1868 \f
1869 /* Relocate a SPARC64 ELF section.  */
1870
1871 static boolean
1872 sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1873                               contents, relocs, local_syms, local_sections)
1874      bfd *output_bfd;
1875      struct bfd_link_info *info;
1876      bfd *input_bfd;
1877      asection *input_section;
1878      bfd_byte *contents;
1879      Elf_Internal_Rela *relocs;
1880      Elf_Internal_Sym *local_syms;
1881      asection **local_sections;
1882 {
1883   bfd *dynobj;
1884   Elf_Internal_Shdr *symtab_hdr;
1885   struct elf_link_hash_entry **sym_hashes;
1886   bfd_vma *local_got_offsets;
1887   bfd_vma got_base;
1888   asection *sgot;
1889   asection *splt;
1890   asection *sreloc;
1891   Elf_Internal_Rela *rel;
1892   Elf_Internal_Rela *relend;
1893
1894   dynobj = elf_hash_table (info)->dynobj;
1895   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1896   sym_hashes = elf_sym_hashes (input_bfd);
1897   local_got_offsets = elf_local_got_offsets (input_bfd);
1898
1899   if (elf_hash_table(info)->hgot == NULL)
1900     got_base = 0;
1901   else
1902     got_base = elf_hash_table (info)->hgot->root.u.def.value;
1903
1904   sgot = splt = sreloc = NULL;
1905
1906   rel = relocs;
1907   relend = relocs + NUM_SHDR_ENTRIES (& elf_section_data (input_section)->rel_hdr);
1908   for (; rel < relend; rel++)
1909     {
1910       int r_type;
1911       reloc_howto_type *howto;
1912       unsigned long r_symndx;
1913       struct elf_link_hash_entry *h;
1914       Elf_Internal_Sym *sym;
1915       asection *sec;
1916       bfd_vma relocation;
1917       bfd_reloc_status_type r;
1918
1919       r_type = ELF64_R_TYPE_ID (rel->r_info);
1920       if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
1921         {
1922           bfd_set_error (bfd_error_bad_value);
1923           return false;
1924         }
1925       howto = sparc64_elf_howto_table + r_type;
1926
1927       r_symndx = ELF64_R_SYM (rel->r_info);
1928
1929       if (info->relocateable)
1930         {
1931           /* This is a relocateable link.  We don't have to change
1932              anything, unless the reloc is against a section symbol,
1933              in which case we have to adjust according to where the
1934              section symbol winds up in the output section.  */
1935           if (r_symndx < symtab_hdr->sh_info)
1936             {
1937               sym = local_syms + r_symndx;
1938               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1939                 {
1940                   sec = local_sections[r_symndx];
1941                   rel->r_addend += sec->output_offset + sym->st_value;
1942                 }
1943             }
1944
1945           continue;
1946         }
1947
1948       /* This is a final link.  */
1949       h = NULL;
1950       sym = NULL;
1951       sec = NULL;
1952       if (r_symndx < symtab_hdr->sh_info)
1953         {
1954           sym = local_syms + r_symndx;
1955           sec = local_sections[r_symndx];
1956           relocation = (sec->output_section->vma
1957                         + sec->output_offset
1958                         + sym->st_value);
1959         }
1960       else
1961         {
1962           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1963           while (h->root.type == bfd_link_hash_indirect
1964                  || h->root.type == bfd_link_hash_warning)
1965             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1966           if (h->root.type == bfd_link_hash_defined
1967               || h->root.type == bfd_link_hash_defweak)
1968             {
1969               boolean skip_it = false;
1970               sec = h->root.u.def.section;
1971
1972               switch (r_type)
1973                 {
1974                 case R_SPARC_WPLT30:
1975                 case R_SPARC_PLT32:
1976                 case R_SPARC_HIPLT22:
1977                 case R_SPARC_LOPLT10:
1978                 case R_SPARC_PCPLT32:
1979                 case R_SPARC_PCPLT22:
1980                 case R_SPARC_PCPLT10:
1981                 case R_SPARC_PLT64:
1982                   if (h->plt.offset != (bfd_vma) -1)
1983                     skip_it = true;
1984                   break;
1985
1986                 case R_SPARC_GOT10:
1987                 case R_SPARC_GOT13:
1988                 case R_SPARC_GOT22:
1989                   if (elf_hash_table(info)->dynamic_sections_created
1990                       && (!info->shared
1991                           || (!info->symbolic && h->dynindx != -1)
1992                           || !(h->elf_link_hash_flags
1993                                & ELF_LINK_HASH_DEF_REGULAR)))
1994                     skip_it = true;
1995                   break;
1996
1997                 case R_SPARC_PC10:
1998                 case R_SPARC_PC22:
1999                 case R_SPARC_PC_HH22:
2000                 case R_SPARC_PC_HM10:
2001                 case R_SPARC_PC_LM22:
2002                   if (!strcmp(h->root.root.string, "_GLOBAL_OFFSET_TABLE_"))
2003                     break;
2004                   /* FALLTHRU */
2005
2006                 case R_SPARC_8:
2007                 case R_SPARC_16:
2008                 case R_SPARC_32:
2009                 case R_SPARC_DISP8:
2010                 case R_SPARC_DISP16:
2011                 case R_SPARC_DISP32:
2012                 case R_SPARC_WDISP30:
2013                 case R_SPARC_WDISP22:
2014                 case R_SPARC_HI22:
2015                 case R_SPARC_22:
2016                 case R_SPARC_13:
2017                 case R_SPARC_LO10:
2018                 case R_SPARC_UA32:
2019                 case R_SPARC_10:
2020                 case R_SPARC_11:
2021                 case R_SPARC_64:
2022                 case R_SPARC_OLO10:
2023                 case R_SPARC_HH22:
2024                 case R_SPARC_HM10:
2025                 case R_SPARC_LM22:
2026                 case R_SPARC_WDISP19:
2027                 case R_SPARC_WDISP16:
2028                 case R_SPARC_7:
2029                 case R_SPARC_5:
2030                 case R_SPARC_6:
2031                 case R_SPARC_DISP64:
2032                 case R_SPARC_HIX22:
2033                 case R_SPARC_LOX10:
2034                 case R_SPARC_H44:
2035                 case R_SPARC_M44:
2036                 case R_SPARC_L44:
2037                 case R_SPARC_UA64:
2038                 case R_SPARC_UA16:
2039                   if (info->shared
2040                       && ((!info->symbolic && h->dynindx != -1)
2041                           || !(h->elf_link_hash_flags
2042                                & ELF_LINK_HASH_DEF_REGULAR)))
2043                     skip_it = true;
2044                   break;
2045                 }
2046
2047               if (skip_it)
2048                 {
2049                   /* In these cases, we don't need the relocation
2050                      value.  We check specially because in some
2051                      obscure cases sec->output_section will be NULL.  */
2052                   relocation = 0;
2053                 }
2054               else
2055                 {
2056                   relocation = (h->root.u.def.value
2057                                 + sec->output_section->vma
2058                                 + sec->output_offset);
2059                 }
2060             }
2061           else if (h->root.type == bfd_link_hash_undefweak)
2062             relocation = 0;
2063           else if (info->shared && !info->symbolic
2064                    && !info->no_undefined
2065                    && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2066             relocation = 0;
2067           else
2068             {
2069               if (! ((*info->callbacks->undefined_symbol)
2070                      (info, h->root.root.string, input_bfd,
2071                       input_section, rel->r_offset,
2072                       (!info->shared || info->no_undefined
2073                        || ELF_ST_VISIBILITY (h->other)))))
2074                 return false;
2075
2076               /* To avoid generating warning messages about truncated
2077                  relocations, set the relocation's address to be the same as
2078                  the start of this section.  */
2079
2080               if (input_section->output_section != NULL)
2081                 relocation = input_section->output_section->vma;
2082               else
2083                 relocation = 0;
2084             }
2085         }
2086
2087       /* When generating a shared object, these relocations are copied
2088          into the output file to be resolved at run time.  */
2089       if (info->shared && (input_section->flags & SEC_ALLOC))
2090         {
2091           switch (r_type)
2092             {
2093             case R_SPARC_PC10:
2094             case R_SPARC_PC22:
2095             case R_SPARC_PC_HH22:
2096             case R_SPARC_PC_HM10:
2097             case R_SPARC_PC_LM22:
2098               if (h != NULL
2099                   && !strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_"))
2100                 break;
2101               /* Fall through.  */
2102             case R_SPARC_DISP8:
2103             case R_SPARC_DISP16:
2104             case R_SPARC_DISP32:
2105             case R_SPARC_WDISP30:
2106             case R_SPARC_WDISP22:
2107             case R_SPARC_WDISP19:
2108             case R_SPARC_WDISP16:
2109             case R_SPARC_DISP64:
2110               if (h == NULL)
2111                 break;
2112               /* Fall through.  */
2113             case R_SPARC_8:
2114             case R_SPARC_16:
2115             case R_SPARC_32:
2116             case R_SPARC_HI22:
2117             case R_SPARC_22:
2118             case R_SPARC_13:
2119             case R_SPARC_LO10:
2120             case R_SPARC_UA32:
2121             case R_SPARC_10:
2122             case R_SPARC_11:
2123             case R_SPARC_64:
2124             case R_SPARC_OLO10:
2125             case R_SPARC_HH22:
2126             case R_SPARC_HM10:
2127             case R_SPARC_LM22:
2128             case R_SPARC_7:
2129             case R_SPARC_5:
2130             case R_SPARC_6:
2131             case R_SPARC_HIX22:
2132             case R_SPARC_LOX10:
2133             case R_SPARC_H44:
2134             case R_SPARC_M44:
2135             case R_SPARC_L44:
2136             case R_SPARC_UA64:
2137             case R_SPARC_UA16:
2138               {
2139                 Elf_Internal_Rela outrel;
2140                 boolean skip;
2141
2142                 if (sreloc == NULL)
2143                   {
2144                     const char *name =
2145                       (bfd_elf_string_from_elf_section
2146                        (input_bfd,
2147                         elf_elfheader (input_bfd)->e_shstrndx,
2148                         elf_section_data (input_section)->rel_hdr.sh_name));
2149
2150                     if (name == NULL)
2151                       return false;
2152
2153                     BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2154                                 && strcmp (bfd_get_section_name(input_bfd,
2155                                                                 input_section),
2156                                            name + 5) == 0);
2157
2158                     sreloc = bfd_get_section_by_name (dynobj, name);
2159                     BFD_ASSERT (sreloc != NULL);
2160                   }
2161
2162                 skip = false;
2163
2164                 if (elf_section_data (input_section)->stab_info == NULL)
2165                   outrel.r_offset = rel->r_offset;
2166                 else
2167                   {
2168                     bfd_vma off;
2169
2170                     off = (_bfd_stab_section_offset
2171                            (output_bfd, &elf_hash_table (info)->stab_info,
2172                             input_section,
2173                             &elf_section_data (input_section)->stab_info,
2174                             rel->r_offset));
2175                     if (off == MINUS_ONE)
2176                       skip = true;
2177                     outrel.r_offset = off;
2178                   }
2179
2180                 outrel.r_offset += (input_section->output_section->vma
2181                                     + input_section->output_offset);
2182
2183                 /* Optimize unaligned reloc usage now that we know where
2184                    it finally resides.  */
2185                 switch (r_type)
2186                   {
2187                   case R_SPARC_16:
2188                     if (outrel.r_offset & 1) r_type = R_SPARC_UA16;
2189                     break;
2190                   case R_SPARC_UA16:
2191                     if (!(outrel.r_offset & 1)) r_type = R_SPARC_16;
2192                     break;
2193                   case R_SPARC_32:
2194                     if (outrel.r_offset & 3) r_type = R_SPARC_UA32;
2195                     break;
2196                   case R_SPARC_UA32:
2197                     if (!(outrel.r_offset & 3)) r_type = R_SPARC_32;
2198                     break;
2199                   case R_SPARC_64:
2200                     if (outrel.r_offset & 7) r_type = R_SPARC_UA64;
2201                     break;
2202                   case R_SPARC_UA64:
2203                     if (!(outrel.r_offset & 7)) r_type = R_SPARC_64;
2204                     break;
2205                   }
2206
2207                 if (skip)
2208                   memset (&outrel, 0, sizeof outrel);
2209                 /* h->dynindx may be -1 if the symbol was marked to
2210                    become local.  */
2211                 else if (h != NULL
2212                          && ((! info->symbolic && h->dynindx != -1)
2213                              || (h->elf_link_hash_flags
2214                                  & ELF_LINK_HASH_DEF_REGULAR) == 0))
2215                   {
2216                     BFD_ASSERT (h->dynindx != -1);
2217                     outrel.r_info
2218                       = ELF64_R_INFO (h->dynindx,
2219                                       ELF64_R_TYPE_INFO (
2220                                         ELF64_R_TYPE_DATA (rel->r_info),
2221                                                            r_type));
2222                     outrel.r_addend = rel->r_addend;
2223                   }
2224                 else
2225                   {
2226                     if (r_type == R_SPARC_64)
2227                       {
2228                         outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2229                         outrel.r_addend = relocation + rel->r_addend;
2230                       }
2231                     else
2232                       {
2233                         long indx;
2234
2235                         if (h == NULL)
2236                           sec = local_sections[r_symndx];
2237                         else
2238                           {
2239                             BFD_ASSERT (h->root.type == bfd_link_hash_defined
2240                                         || (h->root.type
2241                                             == bfd_link_hash_defweak));
2242                             sec = h->root.u.def.section;
2243                           }
2244                         if (sec != NULL && bfd_is_abs_section (sec))
2245                           indx = 0;
2246                         else if (sec == NULL || sec->owner == NULL)
2247                           {
2248                             bfd_set_error (bfd_error_bad_value);
2249                             return false;
2250                           }
2251                         else
2252                           {
2253                             asection *osec;
2254
2255                             osec = sec->output_section;
2256                             indx = elf_section_data (osec)->dynindx;
2257
2258                             /* FIXME: we really should be able to link non-pic
2259                                shared libraries.  */
2260                             if (indx == 0)
2261                               {
2262                                 BFD_FAIL ();
2263                                 (*_bfd_error_handler)
2264                                   (_("%s: probably compiled without -fPIC?"),
2265                                    bfd_get_filename (input_bfd));
2266                                 bfd_set_error (bfd_error_bad_value);
2267                                 return false;
2268                               }
2269                           }
2270
2271                         outrel.r_info
2272                           = ELF64_R_INFO (indx,
2273                                           ELF64_R_TYPE_INFO (
2274                                             ELF64_R_TYPE_DATA (rel->r_info),
2275                                                                r_type));
2276                         outrel.r_addend = relocation + rel->r_addend;
2277                       }
2278                   }
2279
2280                 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
2281                                            (((Elf64_External_Rela *)
2282                                              sreloc->contents)
2283                                             + sreloc->reloc_count));
2284                 ++sreloc->reloc_count;
2285
2286                 /* This reloc will be computed at runtime, so there's no
2287                    need to do anything now.  */
2288                 continue;
2289               }
2290             break;
2291             }
2292         }
2293
2294       switch (r_type)
2295         {
2296         case R_SPARC_GOT10:
2297         case R_SPARC_GOT13:
2298         case R_SPARC_GOT22:
2299           /* Relocation is to the entry for this symbol in the global
2300              offset table.  */
2301           if (sgot == NULL)
2302             {
2303               sgot = bfd_get_section_by_name (dynobj, ".got");
2304               BFD_ASSERT (sgot != NULL);
2305             }
2306
2307           if (h != NULL)
2308             {
2309               bfd_vma off = h->got.offset;
2310               BFD_ASSERT (off != (bfd_vma) -1);
2311
2312               if (! elf_hash_table (info)->dynamic_sections_created
2313                   || (info->shared
2314                       && (info->symbolic || h->dynindx == -1)
2315                       && (h->elf_link_hash_flags
2316                           & ELF_LINK_HASH_DEF_REGULAR)))
2317                 {
2318                   /* This is actually a static link, or it is a -Bsymbolic
2319                      link and the symbol is defined locally, or the symbol
2320                      was forced to be local because of a version file.  We
2321                      must initialize this entry in the global offset table.
2322                      Since the offset must always be a multiple of 8, we
2323                      use the least significant bit to record whether we
2324                      have initialized it already.
2325
2326                      When doing a dynamic link, we create a .rela.got
2327                      relocation entry to initialize the value.  This is
2328                      done in the finish_dynamic_symbol routine.  */
2329
2330                   if ((off & 1) != 0)
2331                     off &= ~1;
2332                   else
2333                     {
2334                       bfd_put_64 (output_bfd, relocation,
2335                                   sgot->contents + off);
2336                       h->got.offset |= 1;
2337                     }
2338                 }
2339               relocation = sgot->output_offset + off - got_base;
2340             }
2341           else
2342             {
2343               bfd_vma off;
2344
2345               BFD_ASSERT (local_got_offsets != NULL);
2346               off = local_got_offsets[r_symndx];
2347               BFD_ASSERT (off != (bfd_vma) -1);
2348
2349               /* The offset must always be a multiple of 8.  We use
2350                  the least significant bit to record whether we have
2351                  already processed this entry.  */
2352               if ((off & 1) != 0)
2353                 off &= ~1;
2354               else
2355                 {
2356                   local_got_offsets[r_symndx] |= 1;
2357
2358                   if (info->shared)
2359                     {
2360                       asection *srelgot;
2361                       Elf_Internal_Rela outrel;
2362
2363                       /* The Solaris 2.7 64-bit linker adds the contents
2364                          of the location to the value of the reloc.
2365                          Note this is different behaviour to the
2366                          32-bit linker, which both adds the contents
2367                          and ignores the addend.  So clear the location.  */
2368                       bfd_put_64 (output_bfd, 0, sgot->contents + off);
2369
2370                       /* We need to generate a R_SPARC_RELATIVE reloc
2371                          for the dynamic linker.  */
2372                       srelgot = bfd_get_section_by_name(dynobj, ".rela.got");
2373                       BFD_ASSERT (srelgot != NULL);
2374
2375                       outrel.r_offset = (sgot->output_section->vma
2376                                          + sgot->output_offset
2377                                          + off);
2378                       outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2379                       outrel.r_addend = relocation;
2380                       bfd_elf64_swap_reloca_out (output_bfd, &outrel,
2381                                                  (((Elf64_External_Rela *)
2382                                                    srelgot->contents)
2383                                                   + srelgot->reloc_count));
2384                       ++srelgot->reloc_count;
2385                     }
2386                   else
2387                     bfd_put_64 (output_bfd, relocation, sgot->contents + off);
2388                 }
2389               relocation = sgot->output_offset + off - got_base;
2390             }
2391           goto do_default;
2392
2393         case R_SPARC_WPLT30:
2394         case R_SPARC_PLT32:
2395         case R_SPARC_HIPLT22:
2396         case R_SPARC_LOPLT10:
2397         case R_SPARC_PCPLT32:
2398         case R_SPARC_PCPLT22:
2399         case R_SPARC_PCPLT10:
2400         case R_SPARC_PLT64:
2401           /* Relocation is to the entry for this symbol in the
2402              procedure linkage table.  */
2403           BFD_ASSERT (h != NULL);
2404
2405           if (h->plt.offset == (bfd_vma) -1)
2406             {
2407               /* We didn't make a PLT entry for this symbol.  This
2408                  happens when statically linking PIC code, or when
2409                  using -Bsymbolic.  */
2410               goto do_default;
2411             }
2412
2413           if (splt == NULL)
2414             {
2415               splt = bfd_get_section_by_name (dynobj, ".plt");
2416               BFD_ASSERT (splt != NULL);
2417             }
2418
2419           relocation = (splt->output_section->vma
2420                         + splt->output_offset
2421                         + sparc64_elf_plt_entry_offset (h->plt.offset));
2422           if (r_type == R_SPARC_WPLT30)
2423             goto do_wplt30;
2424           goto do_default;
2425
2426         case R_SPARC_OLO10:
2427           {
2428             bfd_vma x;
2429
2430             relocation += rel->r_addend;
2431             relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
2432
2433             x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2434             x = (x & ~0x1fff) | (relocation & 0x1fff);
2435             bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2436
2437             r = bfd_check_overflow (howto->complain_on_overflow,
2438                                     howto->bitsize, howto->rightshift,
2439                                     bfd_arch_bits_per_address (input_bfd),
2440                                     relocation);
2441           }
2442           break;
2443
2444         case R_SPARC_WDISP16:
2445           {
2446             bfd_vma x;
2447
2448             relocation += rel->r_addend;
2449             /* Adjust for pc-relative-ness.  */
2450             relocation -= (input_section->output_section->vma
2451                            + input_section->output_offset);
2452             relocation -= rel->r_offset;
2453
2454             x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2455             x = (x & ~0x303fff) | ((((relocation >> 2) & 0xc000) << 6)
2456                                    | ((relocation >> 2) & 0x3fff));
2457             bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2458
2459             r = bfd_check_overflow (howto->complain_on_overflow,
2460                                     howto->bitsize, howto->rightshift,
2461                                     bfd_arch_bits_per_address (input_bfd),
2462                                     relocation);
2463           }
2464           break;
2465
2466         case R_SPARC_HIX22:
2467           {
2468             bfd_vma x;
2469
2470             relocation += rel->r_addend;
2471             relocation = relocation ^ MINUS_ONE;
2472
2473             x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2474             x = (x & ~0x3fffff) | ((relocation >> 10) & 0x3fffff);
2475             bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2476
2477             r = bfd_check_overflow (howto->complain_on_overflow,
2478                                     howto->bitsize, howto->rightshift,
2479                                     bfd_arch_bits_per_address (input_bfd),
2480                                     relocation);
2481           }
2482           break;
2483
2484         case R_SPARC_LOX10:
2485           {
2486             bfd_vma x;
2487
2488             relocation += rel->r_addend;
2489             relocation = (relocation & 0x3ff) | 0x1c00;
2490
2491             x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2492             x = (x & ~0x1fff) | relocation;
2493             bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2494
2495             r = bfd_reloc_ok;
2496           }
2497           break;
2498
2499         case R_SPARC_WDISP30:
2500         do_wplt30:
2501           if (SEC_DO_RELAX (input_section)
2502               && rel->r_offset + 4 < input_section->_raw_size)
2503             {
2504 #define G0              0
2505 #define O7              15
2506 #define XCC             (2 << 20)
2507 #define COND(x)         (((x)&0xf)<<25)
2508 #define CONDA           COND(0x8)
2509 #define INSN_BPA        (F2(0,1) | CONDA | BPRED | XCC)
2510 #define INSN_BA         (F2(0,2) | CONDA)
2511 #define INSN_OR         F3(2, 0x2, 0)
2512 #define INSN_NOP        F2(0,4)
2513
2514               bfd_vma x, y;
2515
2516               /* If the instruction is a call with either:
2517                  restore
2518                  arithmetic instruction with rd == %o7
2519                  where rs1 != %o7 and rs2 if it is register != %o7
2520                  then we can optimize if the call destination is near
2521                  by changing the call into a branch always.  */
2522               x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2523               y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
2524               if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
2525                 {
2526                   if (((y & OP3(~0)) == OP3(0x3d) /* restore */
2527                        || ((y & OP3(0x28)) == 0 /* arithmetic */
2528                            && (y & RD(~0)) == RD(O7)))
2529                       && (y & RS1(~0)) != RS1(O7)
2530                       && ((y & F3I(~0))
2531                           || (y & RS2(~0)) != RS2(O7)))
2532                     {
2533                       bfd_vma reloc;
2534
2535                       reloc = relocation + rel->r_addend - rel->r_offset;
2536                       reloc -= (input_section->output_section->vma
2537                                 + input_section->output_offset);
2538                       if (reloc & 3)
2539                         goto do_default;
2540
2541                       /* Ensure the branch fits into simm22.  */
2542                       if ((reloc & ~(bfd_vma)0x7fffff)
2543                            && ((reloc | 0x7fffff) != MINUS_ONE))
2544                         goto do_default;
2545                       reloc >>= 2;
2546
2547                       /* Check whether it fits into simm19.  */
2548                       if ((reloc & 0x3c0000) == 0
2549                           || (reloc & 0x3c0000) == 0x3c0000)
2550                         x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
2551                       else
2552                         x = INSN_BA | (reloc & 0x3fffff); /* ba */
2553                       bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2554                       r = bfd_reloc_ok;
2555                       if (rel->r_offset >= 4
2556                           && (y & (0xffffffff ^ RS1(~0)))
2557                              == (INSN_OR | RD(O7) | RS2(G0)))
2558                         {
2559                           bfd_vma z;
2560                           unsigned int reg;
2561
2562                           z = bfd_get_32 (input_bfd,
2563                                           contents + rel->r_offset - 4);
2564                           if ((z & (0xffffffff ^ RD(~0)))
2565                               != (INSN_OR | RS1(O7) | RS2(G0)))
2566                             break;
2567
2568                           /* The sequence was
2569                              or %o7, %g0, %rN
2570                              call foo
2571                              or %rN, %g0, %o7
2572
2573                              If call foo was replaced with ba, replace
2574                              or %rN, %g0, %o7 with nop.  */
2575
2576                           reg = (y & RS1(~0)) >> 14;
2577                           if (reg != ((z & RD(~0)) >> 25)
2578                               || reg == G0 || reg == O7)
2579                             break;
2580
2581                           bfd_put_32 (input_bfd, INSN_NOP,
2582                                       contents + rel->r_offset + 4);
2583                         }
2584                       break;
2585                     }
2586                 }
2587             }
2588           /* FALLTHROUGH */
2589
2590         default:
2591         do_default:
2592           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2593                                         contents, rel->r_offset,
2594                                         relocation, rel->r_addend);
2595           break;
2596         }
2597
2598       switch (r)
2599         {
2600         case bfd_reloc_ok:
2601           break;
2602
2603         default:
2604         case bfd_reloc_outofrange:
2605           abort ();
2606
2607         case bfd_reloc_overflow:
2608           {
2609             const char *name;
2610
2611             if (h != NULL)
2612               {
2613                 if (h->root.type == bfd_link_hash_undefweak
2614                     && howto->pc_relative)
2615                   {
2616                     /* Assume this is a call protected by other code that
2617                        detect the symbol is undefined.  If this is the case,
2618                        we can safely ignore the overflow.  If not, the
2619                        program is hosed anyway, and a little warning isn't
2620                        going to help.  */
2621                     break;
2622                   }
2623
2624                 name = h->root.root.string;
2625               }
2626             else
2627               {
2628                 name = (bfd_elf_string_from_elf_section
2629                         (input_bfd,
2630                          symtab_hdr->sh_link,
2631                          sym->st_name));
2632                 if (name == NULL)
2633                   return false;
2634                 if (*name == '\0')
2635                   name = bfd_section_name (input_bfd, sec);
2636               }
2637             if (! ((*info->callbacks->reloc_overflow)
2638                    (info, name, howto->name, (bfd_vma) 0,
2639                     input_bfd, input_section, rel->r_offset)))
2640               return false;
2641           }
2642         break;
2643         }
2644     }
2645
2646   return true;
2647 }
2648
2649 /* Finish up dynamic symbol handling.  We set the contents of various
2650    dynamic sections here.  */
2651
2652 static boolean
2653 sparc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
2654      bfd *output_bfd;
2655      struct bfd_link_info *info;
2656      struct elf_link_hash_entry *h;
2657      Elf_Internal_Sym *sym;
2658 {
2659   bfd *dynobj;
2660
2661   dynobj = elf_hash_table (info)->dynobj;
2662
2663   if (h->plt.offset != (bfd_vma) -1)
2664     {
2665       asection *splt;
2666       asection *srela;
2667       Elf_Internal_Rela rela;
2668
2669       /* This symbol has an entry in the PLT.  Set it up.  */
2670
2671       BFD_ASSERT (h->dynindx != -1);
2672
2673       splt = bfd_get_section_by_name (dynobj, ".plt");
2674       srela = bfd_get_section_by_name (dynobj, ".rela.plt");
2675       BFD_ASSERT (splt != NULL && srela != NULL);
2676
2677       /* Fill in the entry in the .rela.plt section.  */
2678
2679       if (h->plt.offset < LARGE_PLT_THRESHOLD)
2680         {
2681           rela.r_offset = sparc64_elf_plt_entry_offset (h->plt.offset);
2682           rela.r_addend = 0;
2683         }
2684       else
2685         {
2686           int max = splt->_raw_size / PLT_ENTRY_SIZE;
2687           rela.r_offset = sparc64_elf_plt_ptr_offset (h->plt.offset, max);
2688           rela.r_addend = -(sparc64_elf_plt_entry_offset (h->plt.offset) + 4)
2689                           -(splt->output_section->vma + splt->output_offset);
2690         }
2691       rela.r_offset += (splt->output_section->vma + splt->output_offset);
2692       rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
2693
2694       /* Adjust for the first 4 reserved elements in the .plt section
2695          when setting the offset in the .rela.plt section.
2696          Sun forgot to read their own ABI and copied elf32-sparc behaviour,
2697          thus .plt[4] has corresponding .rela.plt[0] and so on.  */
2698
2699       bfd_elf64_swap_reloca_out (output_bfd, &rela,
2700                                  ((Elf64_External_Rela *) srela->contents
2701                                   + (h->plt.offset - 4)));
2702
2703       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2704         {
2705           /* Mark the symbol as undefined, rather than as defined in
2706              the .plt section.  Leave the value alone.  */
2707           sym->st_shndx = SHN_UNDEF;
2708           /* If the symbol is weak, we do need to clear the value.
2709              Otherwise, the PLT entry would provide a definition for
2710              the symbol even if the symbol wasn't defined anywhere,
2711              and so the symbol would never be NULL.  */
2712           if ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR_NONWEAK)
2713               == 0)
2714             sym->st_value = 0;
2715         }
2716     }
2717
2718   if (h->got.offset != (bfd_vma) -1)
2719     {
2720       asection *sgot;
2721       asection *srela;
2722       Elf_Internal_Rela rela;
2723
2724       /* This symbol has an entry in the GOT.  Set it up.  */
2725
2726       sgot = bfd_get_section_by_name (dynobj, ".got");
2727       srela = bfd_get_section_by_name (dynobj, ".rela.got");
2728       BFD_ASSERT (sgot != NULL && srela != NULL);
2729
2730       rela.r_offset = (sgot->output_section->vma
2731                        + sgot->output_offset
2732                        + (h->got.offset &~ 1));
2733
2734       /* If this is a -Bsymbolic link, and the symbol is defined
2735          locally, we just want to emit a RELATIVE reloc.  Likewise if
2736          the symbol was forced to be local because of a version file.
2737          The entry in the global offset table will already have been
2738          initialized in the relocate_section function.  */
2739       if (info->shared
2740           && (info->symbolic || h->dynindx == -1)
2741           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
2742         {
2743           asection *sec = h->root.u.def.section;
2744           rela.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2745           rela.r_addend = (h->root.u.def.value
2746                            + sec->output_section->vma
2747                            + sec->output_offset);
2748         }
2749       else
2750         {
2751           bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
2752           rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
2753           rela.r_addend = 0;
2754         }
2755
2756       bfd_elf64_swap_reloca_out (output_bfd, &rela,
2757                                  ((Elf64_External_Rela *) srela->contents
2758                                   + srela->reloc_count));
2759       ++srela->reloc_count;
2760     }
2761
2762   if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
2763     {
2764       asection *s;
2765       Elf_Internal_Rela rela;
2766
2767       /* This symbols needs a copy reloc.  Set it up.  */
2768
2769       BFD_ASSERT (h->dynindx != -1);
2770
2771       s = bfd_get_section_by_name (h->root.u.def.section->owner,
2772                                    ".rela.bss");
2773       BFD_ASSERT (s != NULL);
2774
2775       rela.r_offset = (h->root.u.def.value
2776                        + h->root.u.def.section->output_section->vma
2777                        + h->root.u.def.section->output_offset);
2778       rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_COPY);
2779       rela.r_addend = 0;
2780       bfd_elf64_swap_reloca_out (output_bfd, &rela,
2781                                  ((Elf64_External_Rela *) s->contents
2782                                   + s->reloc_count));
2783       ++s->reloc_count;
2784     }
2785
2786   /* Mark some specially defined symbols as absolute.  */
2787   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2788       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
2789       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
2790     sym->st_shndx = SHN_ABS;
2791
2792   return true;
2793 }
2794
2795 /* Finish up the dynamic sections.  */
2796
2797 static boolean
2798 sparc64_elf_finish_dynamic_sections (output_bfd, info)
2799      bfd *output_bfd;
2800      struct bfd_link_info *info;
2801 {
2802   bfd *dynobj;
2803   int stt_regidx = -1;
2804   asection *sdyn;
2805   asection *sgot;
2806
2807   dynobj = elf_hash_table (info)->dynobj;
2808
2809   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2810
2811   if (elf_hash_table (info)->dynamic_sections_created)
2812     {
2813       asection *splt;
2814       Elf64_External_Dyn *dyncon, *dynconend;
2815
2816       splt = bfd_get_section_by_name (dynobj, ".plt");
2817       BFD_ASSERT (splt != NULL && sdyn != NULL);
2818
2819       dyncon = (Elf64_External_Dyn *) sdyn->contents;
2820       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2821       for (; dyncon < dynconend; dyncon++)
2822         {
2823           Elf_Internal_Dyn dyn;
2824           const char *name;
2825           boolean size;
2826
2827           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2828
2829           switch (dyn.d_tag)
2830             {
2831             case DT_PLTGOT:   name = ".plt"; size = false; break;
2832             case DT_PLTRELSZ: name = ".rela.plt"; size = true; break;
2833             case DT_JMPREL:   name = ".rela.plt"; size = false; break;
2834             case DT_SPARC_REGISTER:
2835               if (stt_regidx == -1)
2836                 {
2837                   stt_regidx =
2838                     _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
2839                   if (stt_regidx == -1)
2840                     return false;
2841                 }
2842               dyn.d_un.d_val = stt_regidx++;
2843               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2844               /* fallthrough */
2845             default:          name = NULL; size = false; break;
2846             }
2847
2848           if (name != NULL)
2849             {
2850               asection *s;
2851
2852               s = bfd_get_section_by_name (output_bfd, name);
2853               if (s == NULL)
2854                 dyn.d_un.d_val = 0;
2855               else
2856                 {
2857                   if (! size)
2858                     dyn.d_un.d_ptr = s->vma;
2859                   else
2860                     {
2861                       if (s->_cooked_size != 0)
2862                         dyn.d_un.d_val = s->_cooked_size;
2863                       else
2864                         dyn.d_un.d_val = s->_raw_size;
2865                     }
2866                 }
2867               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2868             }
2869         }
2870
2871       /* Initialize the contents of the .plt section.  */
2872       if (splt->_raw_size > 0)
2873         {
2874           sparc64_elf_build_plt(output_bfd, splt->contents,
2875                                 splt->_raw_size / PLT_ENTRY_SIZE);
2876         }
2877
2878       elf_section_data (splt->output_section)->this_hdr.sh_entsize =
2879         PLT_ENTRY_SIZE;
2880     }
2881
2882   /* Set the first entry in the global offset table to the address of
2883      the dynamic section.  */
2884   sgot = bfd_get_section_by_name (dynobj, ".got");
2885   BFD_ASSERT (sgot != NULL);
2886   if (sgot->_raw_size > 0)
2887     {
2888       if (sdyn == NULL)
2889         bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents);
2890       else
2891         bfd_put_64 (output_bfd,
2892                     sdyn->output_section->vma + sdyn->output_offset,
2893                     sgot->contents);
2894     }
2895
2896   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8;
2897
2898   return true;
2899 }
2900
2901 static enum elf_reloc_type_class
2902 sparc64_elf_reloc_type_class (type)
2903      int type;
2904 {
2905   switch (type)
2906     {
2907     case R_SPARC_RELATIVE:
2908       return reloc_class_relative;
2909     case R_SPARC_JMP_SLOT:
2910       return reloc_class_plt;
2911     case R_SPARC_COPY:
2912       return reloc_class_copy;
2913     default:
2914       return reloc_class_normal;
2915     }
2916 }
2917 \f
2918 /* Functions for dealing with the e_flags field.  */
2919
2920 /* Copy backend specific data from one object module to another */
2921 static boolean
2922 sparc64_elf_copy_private_bfd_data (ibfd, obfd)
2923      bfd *ibfd, *obfd;
2924 {
2925   if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2926       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2927     return true;
2928
2929   BFD_ASSERT (!elf_flags_init (obfd)
2930               || (elf_elfheader (obfd)->e_flags
2931                   == elf_elfheader (ibfd)->e_flags));
2932
2933   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
2934   elf_flags_init (obfd) = true;
2935   return true;
2936 }
2937
2938 /* Merge backend specific data from an object file to the output
2939    object file when linking.  */
2940
2941 static boolean
2942 sparc64_elf_merge_private_bfd_data (ibfd, obfd)
2943      bfd *ibfd;
2944      bfd *obfd;
2945 {
2946   boolean error;
2947   flagword new_flags, old_flags;
2948   int new_mm, old_mm;
2949
2950   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2951       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2952     return true;
2953
2954   new_flags = elf_elfheader (ibfd)->e_flags;
2955   old_flags = elf_elfheader (obfd)->e_flags;
2956
2957   if (!elf_flags_init (obfd))   /* First call, no flags set */
2958     {
2959       elf_flags_init (obfd) = true;
2960       elf_elfheader (obfd)->e_flags = new_flags;
2961     }
2962
2963   else if (new_flags == old_flags)      /* Compatible flags are ok */
2964     ;
2965
2966   else                                  /* Incompatible flags */
2967     {
2968       error = false;
2969
2970 #define EF_SPARC_ISA_EXTENSIONS \
2971   (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3 | EF_SPARC_HAL_R1)
2972
2973       if ((ibfd->flags & DYNAMIC) != 0)
2974         {
2975           /* We don't want dynamic objects memory ordering and
2976              architecture to have any role. That's what dynamic linker
2977              should do.  */
2978           new_flags &= ~(EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS);
2979           new_flags |= (old_flags
2980                         & (EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS));
2981         }
2982       else
2983         {
2984           /* Choose the highest architecture requirements.  */
2985           old_flags |= (new_flags & EF_SPARC_ISA_EXTENSIONS);
2986           new_flags |= (old_flags & EF_SPARC_ISA_EXTENSIONS);
2987           if ((old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3))
2988               && (old_flags & EF_SPARC_HAL_R1))
2989             {
2990               error = true;
2991               (*_bfd_error_handler)
2992                 (_("%s: linking UltraSPARC specific with HAL specific code"),
2993                  bfd_get_filename (ibfd));
2994             }
2995           /* Choose the most restrictive memory ordering.  */
2996           old_mm = (old_flags & EF_SPARCV9_MM);
2997           new_mm = (new_flags & EF_SPARCV9_MM);
2998           old_flags &= ~EF_SPARCV9_MM;
2999           new_flags &= ~EF_SPARCV9_MM;
3000           if (new_mm < old_mm)
3001             old_mm = new_mm;
3002           old_flags |= old_mm;
3003           new_flags |= old_mm;
3004         }
3005
3006       /* Warn about any other mismatches */
3007       if (new_flags != old_flags)
3008         {
3009           error = true;
3010           (*_bfd_error_handler)
3011             (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
3012              bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
3013         }
3014
3015       elf_elfheader (obfd)->e_flags = old_flags;
3016
3017       if (error)
3018         {
3019           bfd_set_error (bfd_error_bad_value);
3020           return false;
3021         }
3022     }
3023   return true;
3024 }
3025 \f
3026 /* Print a STT_REGISTER symbol to file FILE.  */
3027
3028 static const char *
3029 sparc64_elf_print_symbol_all (abfd, filep, symbol)
3030      bfd *abfd ATTRIBUTE_UNUSED;
3031      PTR filep;
3032      asymbol *symbol;
3033 {
3034   FILE *file = (FILE *) filep;
3035   int reg, type;
3036
3037   if (ELF_ST_TYPE (((elf_symbol_type *) symbol)->internal_elf_sym.st_info)
3038       != STT_REGISTER)
3039     return NULL;
3040
3041   reg = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
3042   type = symbol->flags;
3043   fprintf (file, "REG_%c%c%11s%c%c    R", "GOLI" [reg / 8], '0' + (reg & 7), "",
3044                  ((type & BSF_LOCAL)
3045                   ? (type & BSF_GLOBAL) ? '!' : 'l'
3046                   : (type & BSF_GLOBAL) ? 'g' : ' '),
3047                  (type & BSF_WEAK) ? 'w' : ' ');
3048   if (symbol->name == NULL || symbol->name [0] == '\0')
3049     return "#scratch";
3050   else
3051     return symbol->name;
3052 }
3053 \f
3054 /* Set the right machine number for a SPARC64 ELF file.  */
3055
3056 static boolean
3057 sparc64_elf_object_p (abfd)
3058      bfd *abfd;
3059 {
3060   unsigned long mach = bfd_mach_sparc_v9;
3061
3062   if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3063     mach = bfd_mach_sparc_v9b;
3064   else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3065     mach = bfd_mach_sparc_v9a;
3066   return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
3067 }
3068
3069 /* Relocations in the 64 bit SPARC ELF ABI are more complex than in
3070    standard ELF, because R_SPARC_OLO10 has secondary addend in
3071    ELF64_R_TYPE_DATA field.  This structure is used to redirect the
3072    relocation handling routines.  */
3073
3074 const struct elf_size_info sparc64_elf_size_info =
3075 {
3076   sizeof (Elf64_External_Ehdr),
3077   sizeof (Elf64_External_Phdr),
3078   sizeof (Elf64_External_Shdr),
3079   sizeof (Elf64_External_Rel),
3080   sizeof (Elf64_External_Rela),
3081   sizeof (Elf64_External_Sym),
3082   sizeof (Elf64_External_Dyn),
3083   sizeof (Elf_External_Note),
3084   4,            /* hash-table entry size */
3085   /* internal relocations per external relocations.
3086      For link purposes we use just 1 internal per
3087      1 external, for assembly and slurp symbol table
3088      we use 2.  */
3089   1,
3090   64,           /* arch_size */
3091   8,            /* file_align */
3092   ELFCLASS64,
3093   EV_CURRENT,
3094   bfd_elf64_write_out_phdrs,
3095   bfd_elf64_write_shdrs_and_ehdr,
3096   sparc64_elf_write_relocs,
3097   bfd_elf64_swap_symbol_out,
3098   sparc64_elf_slurp_reloc_table,
3099   bfd_elf64_slurp_symbol_table,
3100   bfd_elf64_swap_dyn_in,
3101   bfd_elf64_swap_dyn_out,
3102   NULL,
3103   NULL,
3104   NULL,
3105   NULL
3106 };
3107
3108 #define TARGET_BIG_SYM  bfd_elf64_sparc_vec
3109 #define TARGET_BIG_NAME "elf64-sparc"
3110 #define ELF_ARCH        bfd_arch_sparc
3111 #define ELF_MAXPAGESIZE 0x100000
3112
3113 /* This is the official ABI value.  */
3114 #define ELF_MACHINE_CODE EM_SPARCV9
3115
3116 /* This is the value that we used before the ABI was released.  */
3117 #define ELF_MACHINE_ALT1 EM_OLD_SPARCV9
3118
3119 #define bfd_elf64_bfd_link_hash_table_create \
3120   sparc64_elf_bfd_link_hash_table_create
3121
3122 #define elf_info_to_howto \
3123   sparc64_elf_info_to_howto
3124 #define bfd_elf64_get_reloc_upper_bound \
3125   sparc64_elf_get_reloc_upper_bound
3126 #define bfd_elf64_get_dynamic_reloc_upper_bound \
3127   sparc64_elf_get_dynamic_reloc_upper_bound
3128 #define bfd_elf64_canonicalize_dynamic_reloc \
3129   sparc64_elf_canonicalize_dynamic_reloc
3130 #define bfd_elf64_bfd_reloc_type_lookup \
3131   sparc64_elf_reloc_type_lookup
3132 #define bfd_elf64_bfd_relax_section \
3133   sparc64_elf_relax_section
3134
3135 #define elf_backend_create_dynamic_sections \
3136   _bfd_elf_create_dynamic_sections
3137 #define elf_backend_add_symbol_hook \
3138   sparc64_elf_add_symbol_hook
3139 #define elf_backend_get_symbol_type \
3140   sparc64_elf_get_symbol_type
3141 #define elf_backend_symbol_processing \
3142   sparc64_elf_symbol_processing
3143 #define elf_backend_check_relocs \
3144   sparc64_elf_check_relocs
3145 #define elf_backend_adjust_dynamic_symbol \
3146   sparc64_elf_adjust_dynamic_symbol
3147 #define elf_backend_size_dynamic_sections \
3148   sparc64_elf_size_dynamic_sections
3149 #define elf_backend_relocate_section \
3150   sparc64_elf_relocate_section
3151 #define elf_backend_finish_dynamic_symbol \
3152   sparc64_elf_finish_dynamic_symbol
3153 #define elf_backend_finish_dynamic_sections \
3154   sparc64_elf_finish_dynamic_sections
3155 #define elf_backend_print_symbol_all \
3156   sparc64_elf_print_symbol_all
3157 #define elf_backend_output_arch_syms \
3158   sparc64_elf_output_arch_syms
3159 #define bfd_elf64_bfd_copy_private_bfd_data \
3160   sparc64_elf_copy_private_bfd_data
3161 #define bfd_elf64_bfd_merge_private_bfd_data \
3162   sparc64_elf_merge_private_bfd_data
3163
3164 #define elf_backend_size_info \
3165   sparc64_elf_size_info
3166 #define elf_backend_object_p \
3167   sparc64_elf_object_p
3168 #define elf_backend_reloc_type_class \
3169   sparc64_elf_reloc_type_class
3170
3171 #define elf_backend_want_got_plt 0
3172 #define elf_backend_plt_readonly 0
3173 #define elf_backend_want_plt_sym 1
3174
3175 /* Section 5.2.4 of the ABI specifies a 256-byte boundary for the table.  */
3176 #define elf_backend_plt_alignment 8
3177
3178 #define elf_backend_got_header_size 8
3179 #define elf_backend_plt_header_size PLT_HEADER_SIZE
3180
3181 #include "elf64-target.h"