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