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