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->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 > bfd_get_section_limit (abfd, input_section))
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->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->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->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->size += sizeof (Elf64_External_Rela);
1218		}
1219	    }
1220
1221	  sgot->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->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->needs_plt = 1;
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->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) (_("%B: check_relocs: unhandled reloc type %d"),
1372				abfd, ELF64_R_TYPE_ID (rel->r_info));
1373	  return FALSE;
1374	}
1375    }
1376
1377  return TRUE;
1378}
1379
1380/* Hook called by the linker routine which adds symbols from an object
1381   file.  We use it for STT_REGISTER symbols.  */
1382
1383static bfd_boolean
1384sparc64_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1385     bfd *abfd;
1386     struct bfd_link_info *info;
1387     Elf_Internal_Sym *sym;
1388     const char **namep;
1389     flagword *flagsp ATTRIBUTE_UNUSED;
1390     asection **secp ATTRIBUTE_UNUSED;
1391     bfd_vma *valp ATTRIBUTE_UNUSED;
1392{
1393  static const char *const stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" };
1394
1395  if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER)
1396    {
1397      int reg;
1398      struct sparc64_elf_app_reg *p;
1399
1400      reg = (int)sym->st_value;
1401      switch (reg & ~1)
1402	{
1403	case 2: reg -= 2; break;
1404	case 6: reg -= 4; break;
1405	default:
1406          (*_bfd_error_handler)
1407            (_("%B: Only registers %%g[2367] can be declared using STT_REGISTER"),
1408             abfd);
1409	  return FALSE;
1410	}
1411
1412      if (info->hash->creator != abfd->xvec
1413	  || (abfd->flags & DYNAMIC) != 0)
1414        {
1415	  /* STT_REGISTER only works when linking an elf64_sparc object.
1416	     If STT_REGISTER comes from a dynamic object, don't put it into
1417	     the output bfd.  The dynamic linker will recheck it.  */
1418	  *namep = NULL;
1419	  return TRUE;
1420        }
1421
1422      p = sparc64_elf_hash_table(info)->app_regs + reg;
1423
1424      if (p->name != NULL && strcmp (p->name, *namep))
1425	{
1426          (*_bfd_error_handler)
1427            (_("Register %%g%d used incompatibly: %s in %B, previously %s in %B"),
1428             abfd, p->abfd, (int) sym->st_value,
1429             **namep ? *namep : "#scratch",
1430             *p->name ? p->name : "#scratch");
1431	  return FALSE;
1432	}
1433
1434      if (p->name == NULL)
1435	{
1436	  if (**namep)
1437	    {
1438	      struct elf_link_hash_entry *h;
1439
1440	      h = (struct elf_link_hash_entry *)
1441		bfd_link_hash_lookup (info->hash, *namep, FALSE, FALSE, FALSE);
1442
1443	      if (h != NULL)
1444		{
1445		  unsigned char type = h->type;
1446
1447		  if (type > STT_FUNC)
1448		    type = 0;
1449		  (*_bfd_error_handler)
1450		    (_("Symbol `%s' has differing types: REGISTER in %B, previously %s in %B"),
1451		     abfd, p->abfd, *namep, stt_types[type]);
1452		  return FALSE;
1453		}
1454
1455	      p->name = bfd_hash_allocate (&info->hash->table,
1456					   strlen (*namep) + 1);
1457	      if (!p->name)
1458		return FALSE;
1459
1460	      strcpy (p->name, *namep);
1461	    }
1462	  else
1463	    p->name = "";
1464	  p->bind = ELF_ST_BIND (sym->st_info);
1465	  p->abfd = abfd;
1466	  p->shndx = sym->st_shndx;
1467	}
1468      else
1469	{
1470	  if (p->bind == STB_WEAK
1471	      && ELF_ST_BIND (sym->st_info) == STB_GLOBAL)
1472	    {
1473	      p->bind = STB_GLOBAL;
1474	      p->abfd = abfd;
1475	    }
1476	}
1477      *namep = NULL;
1478      return TRUE;
1479    }
1480  else if (*namep && **namep
1481	   && info->hash->creator == abfd->xvec)
1482    {
1483      int i;
1484      struct sparc64_elf_app_reg *p;
1485
1486      p = sparc64_elf_hash_table(info)->app_regs;
1487      for (i = 0; i < 4; i++, p++)
1488	if (p->name != NULL && ! strcmp (p->name, *namep))
1489	  {
1490	    unsigned char type = ELF_ST_TYPE (sym->st_info);
1491
1492	    if (type > STT_FUNC)
1493	      type = 0;
1494	    (*_bfd_error_handler)
1495	      (_("Symbol `%s' has differing types: %s in %B, previously REGISTER in %B"),
1496	       abfd, p->abfd, *namep, stt_types[type]);
1497	    return FALSE;
1498	  }
1499    }
1500  return TRUE;
1501}
1502
1503/* This function takes care of emitting STT_REGISTER symbols
1504   which we cannot easily keep in the symbol hash table.  */
1505
1506static bfd_boolean
1507sparc64_elf_output_arch_syms (output_bfd, info, finfo, func)
1508     bfd *output_bfd ATTRIBUTE_UNUSED;
1509     struct bfd_link_info *info;
1510     PTR finfo;
1511     bfd_boolean (*func)
1512       PARAMS ((PTR, const char *, Elf_Internal_Sym *, asection *,
1513		struct elf_link_hash_entry *));
1514{
1515  int reg;
1516  struct sparc64_elf_app_reg *app_regs =
1517    sparc64_elf_hash_table(info)->app_regs;
1518  Elf_Internal_Sym sym;
1519
1520  /* We arranged in size_dynamic_sections to put the STT_REGISTER entries
1521     at the end of the dynlocal list, so they came at the end of the local
1522     symbols in the symtab.  Except that they aren't STB_LOCAL, so we need
1523     to back up symtab->sh_info.  */
1524  if (elf_hash_table (info)->dynlocal)
1525    {
1526      bfd * dynobj = elf_hash_table (info)->dynobj;
1527      asection *dynsymsec = bfd_get_section_by_name (dynobj, ".dynsym");
1528      struct elf_link_local_dynamic_entry *e;
1529
1530      for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
1531	if (e->input_indx == -1)
1532	  break;
1533      if (e)
1534	{
1535	  elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
1536	    = e->dynindx;
1537	}
1538    }
1539
1540  if (info->strip == strip_all)
1541    return TRUE;
1542
1543  for (reg = 0; reg < 4; reg++)
1544    if (app_regs [reg].name != NULL)
1545      {
1546	if (info->strip == strip_some
1547	    && bfd_hash_lookup (info->keep_hash,
1548				app_regs [reg].name,
1549				FALSE, FALSE) == NULL)
1550	  continue;
1551
1552	sym.st_value = reg < 2 ? reg + 2 : reg + 4;
1553	sym.st_size = 0;
1554	sym.st_other = 0;
1555	sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER);
1556	sym.st_shndx = app_regs [reg].shndx;
1557	if (! (*func) (finfo, app_regs [reg].name, &sym,
1558		       sym.st_shndx == SHN_ABS
1559			 ? bfd_abs_section_ptr : bfd_und_section_ptr,
1560		       NULL))
1561	  return FALSE;
1562      }
1563
1564  return TRUE;
1565}
1566
1567static int
1568sparc64_elf_get_symbol_type (elf_sym, type)
1569     Elf_Internal_Sym * elf_sym;
1570     int type;
1571{
1572  if (ELF_ST_TYPE (elf_sym->st_info) == STT_REGISTER)
1573    return STT_REGISTER;
1574  else
1575    return type;
1576}
1577
1578/* A STB_GLOBAL,STT_REGISTER symbol should be BSF_GLOBAL
1579   even in SHN_UNDEF section.  */
1580
1581static void
1582sparc64_elf_symbol_processing (abfd, asym)
1583     bfd *abfd ATTRIBUTE_UNUSED;
1584     asymbol *asym;
1585{
1586  elf_symbol_type *elfsym;
1587
1588  elfsym = (elf_symbol_type *) asym;
1589  if (elfsym->internal_elf_sym.st_info
1590      == ELF_ST_INFO (STB_GLOBAL, STT_REGISTER))
1591    {
1592      asym->flags |= BSF_GLOBAL;
1593    }
1594}
1595
1596/* Adjust a symbol defined by a dynamic object and referenced by a
1597   regular object.  The current definition is in some section of the
1598   dynamic object, but we're not including those sections.  We have to
1599   change the definition to something the rest of the link can
1600   understand.  */
1601
1602static bfd_boolean
1603sparc64_elf_adjust_dynamic_symbol (info, h)
1604     struct bfd_link_info *info;
1605     struct elf_link_hash_entry *h;
1606{
1607  bfd *dynobj;
1608  asection *s;
1609  unsigned int power_of_two;
1610
1611  dynobj = elf_hash_table (info)->dynobj;
1612
1613  /* Make sure we know what is going on here.  */
1614  BFD_ASSERT (dynobj != NULL
1615	      && (h->needs_plt
1616		  || h->u.weakdef != NULL
1617		  || (h->def_dynamic
1618		      && h->ref_regular
1619		      && !h->def_regular)));
1620
1621  /* If this is a function, put it in the procedure linkage table.  We
1622     will fill in the contents of the procedure linkage table later
1623     (although we could actually do it here).  The STT_NOTYPE
1624     condition is a hack specifically for the Oracle libraries
1625     delivered for Solaris; for some inexplicable reason, they define
1626     some of their functions as STT_NOTYPE when they really should be
1627     STT_FUNC.  */
1628  if (h->type == STT_FUNC
1629      || h->needs_plt
1630      || (h->type == STT_NOTYPE
1631	  && (h->root.type == bfd_link_hash_defined
1632	      || h->root.type == bfd_link_hash_defweak)
1633	  && (h->root.u.def.section->flags & SEC_CODE) != 0))
1634    {
1635      if (! elf_hash_table (info)->dynamic_sections_created)
1636	{
1637	  /* This case can occur if we saw a WPLT30 reloc in an input
1638             file, but none of the input files were dynamic objects.
1639             In such a case, we don't actually need to build a
1640             procedure linkage table, and we can just do a WDISP30
1641             reloc instead.  */
1642	  BFD_ASSERT (h->needs_plt);
1643	  return TRUE;
1644	}
1645
1646      s = bfd_get_section_by_name (dynobj, ".plt");
1647      BFD_ASSERT (s != NULL);
1648
1649      /* The first four bit in .plt is reserved.  */
1650      if (s->size == 0)
1651	s->size = PLT_HEADER_SIZE;
1652
1653      /* To simplify matters later, just store the plt index here.  */
1654      h->plt.offset = s->size / PLT_ENTRY_SIZE;
1655
1656      /* If this symbol is not defined in a regular file, and we are
1657	 not generating a shared library, then set the symbol to this
1658	 location in the .plt.  This is required to make function
1659	 pointers compare as equal between the normal executable and
1660	 the shared library.  */
1661      if (! info->shared
1662	  && !h->def_regular)
1663	{
1664	  h->root.u.def.section = s;
1665	  h->root.u.def.value = sparc64_elf_plt_entry_offset (h->plt.offset);
1666	}
1667
1668      /* Make room for this entry.  */
1669      s->size += PLT_ENTRY_SIZE;
1670
1671      /* We also need to make an entry in the .rela.plt section.  */
1672
1673      s = bfd_get_section_by_name (dynobj, ".rela.plt");
1674      BFD_ASSERT (s != NULL);
1675
1676      s->size += sizeof (Elf64_External_Rela);
1677
1678      /* The procedure linkage table size is bounded by the magnitude
1679	 of the offset we can describe in the entry.  */
1680      if (s->size >= (bfd_vma)1 << 32)
1681	{
1682	  bfd_set_error (bfd_error_bad_value);
1683	  return FALSE;
1684	}
1685
1686      return TRUE;
1687    }
1688
1689  /* If this is a weak symbol, and there is a real definition, the
1690     processor independent code will have arranged for us to see the
1691     real definition first, and we can just use the same value.  */
1692  if (h->u.weakdef != NULL)
1693    {
1694      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1695		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
1696      h->root.u.def.section = h->u.weakdef->root.u.def.section;
1697      h->root.u.def.value = h->u.weakdef->root.u.def.value;
1698      return TRUE;
1699    }
1700
1701  /* This is a reference to a symbol defined by a dynamic object which
1702     is not a function.  */
1703
1704  /* If we are creating a shared library, we must presume that the
1705     only references to the symbol are via the global offset table.
1706     For such cases we need not do anything here; the relocations will
1707     be handled correctly by relocate_section.  */
1708  if (info->shared)
1709    return TRUE;
1710
1711  /* We must allocate the symbol in our .dynbss section, which will
1712     become part of the .bss section of the executable.  There will be
1713     an entry for this symbol in the .dynsym section.  The dynamic
1714     object will contain position independent code, so all references
1715     from the dynamic object to this symbol will go through the global
1716     offset table.  The dynamic linker will use the .dynsym entry to
1717     determine the address it must put in the global offset table, so
1718     both the dynamic object and the regular object will refer to the
1719     same memory location for the variable.  */
1720
1721  s = bfd_get_section_by_name (dynobj, ".dynbss");
1722  BFD_ASSERT (s != NULL);
1723
1724  /* We must generate a R_SPARC_COPY reloc to tell the dynamic linker
1725     to copy the initial value out of the dynamic object and into the
1726     runtime process image.  We need to remember the offset into the
1727     .rel.bss section we are going to use.  */
1728  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1729    {
1730      asection *srel;
1731
1732      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1733      BFD_ASSERT (srel != NULL);
1734      srel->size += sizeof (Elf64_External_Rela);
1735      h->needs_copy = 1;
1736    }
1737
1738  /* We need to figure out the alignment required for this symbol.  I
1739     have no idea how ELF linkers handle this.  16-bytes is the size
1740     of the largest type that requires hard alignment -- long double.  */
1741  power_of_two = bfd_log2 (h->size);
1742  if (power_of_two > 4)
1743    power_of_two = 4;
1744
1745  /* Apply the required alignment.  */
1746  s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
1747  if (power_of_two > bfd_get_section_alignment (dynobj, s))
1748    {
1749      if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1750	return FALSE;
1751    }
1752
1753  /* Define the symbol as being at this point in the section.  */
1754  h->root.u.def.section = s;
1755  h->root.u.def.value = s->size;
1756
1757  /* Increment the section size to make room for the symbol.  */
1758  s->size += h->size;
1759
1760  return TRUE;
1761}
1762
1763/* Set the sizes of the dynamic sections.  */
1764
1765static bfd_boolean
1766sparc64_elf_size_dynamic_sections (output_bfd, info)
1767     bfd *output_bfd;
1768     struct bfd_link_info *info;
1769{
1770  bfd *dynobj;
1771  asection *s;
1772  bfd_boolean relplt;
1773
1774  dynobj = elf_hash_table (info)->dynobj;
1775  BFD_ASSERT (dynobj != NULL);
1776
1777  if (elf_hash_table (info)->dynamic_sections_created)
1778    {
1779      /* Set the contents of the .interp section to the interpreter.  */
1780      if (info->executable)
1781	{
1782	  s = bfd_get_section_by_name (dynobj, ".interp");
1783	  BFD_ASSERT (s != NULL);
1784	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1785	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1786	}
1787    }
1788  else
1789    {
1790      /* We may have created entries in the .rela.got section.
1791         However, if we are not creating the dynamic sections, we will
1792         not actually use these entries.  Reset the size of .rela.got,
1793         which will cause it to get stripped from the output file
1794         below.  */
1795      s = bfd_get_section_by_name (dynobj, ".rela.got");
1796      if (s != NULL)
1797	s->size = 0;
1798    }
1799
1800  /* The check_relocs and adjust_dynamic_symbol entry points have
1801     determined the sizes of the various dynamic sections.  Allocate
1802     memory for them.  */
1803  relplt = FALSE;
1804  for (s = dynobj->sections; s != NULL; s = s->next)
1805    {
1806      const char *name;
1807      bfd_boolean strip;
1808
1809      if ((s->flags & SEC_LINKER_CREATED) == 0)
1810	continue;
1811
1812      /* It's OK to base decisions on the section name, because none
1813	 of the dynobj section names depend upon the input files.  */
1814      name = bfd_get_section_name (dynobj, s);
1815
1816      strip = FALSE;
1817
1818      if (strncmp (name, ".rela", 5) == 0)
1819	{
1820	  if (s->size == 0)
1821	    {
1822	      /* If we don't need this section, strip it from the
1823		 output file.  This is to handle .rela.bss and
1824		 .rel.plt.  We must create it in
1825		 create_dynamic_sections, because it must be created
1826		 before the linker maps input sections to output
1827		 sections.  The linker does that before
1828		 adjust_dynamic_symbol is called, and it is that
1829		 function which decides whether anything needs to go
1830		 into these sections.  */
1831	      strip = TRUE;
1832	    }
1833	  else
1834	    {
1835	      if (strcmp (name, ".rela.plt") == 0)
1836		relplt = TRUE;
1837
1838	      /* We use the reloc_count field as a counter if we need
1839		 to copy relocs into the output file.  */
1840	      s->reloc_count = 0;
1841	    }
1842	}
1843      else if (strcmp (name, ".plt") != 0
1844	       && strncmp (name, ".got", 4) != 0)
1845	{
1846	  /* It's not one of our sections, so don't allocate space.  */
1847	  continue;
1848	}
1849
1850      if (strip)
1851	{
1852	  _bfd_strip_section_from_output (info, s);
1853	  continue;
1854	}
1855
1856      /* Allocate memory for the section contents.  Zero the memory
1857	 for the benefit of .rela.plt, which has 4 unused entries
1858	 at the beginning, and we don't want garbage.  */
1859      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
1860      if (s->contents == NULL && s->size != 0)
1861	return FALSE;
1862    }
1863
1864  if (elf_hash_table (info)->dynamic_sections_created)
1865    {
1866      /* Add some entries to the .dynamic section.  We fill in the
1867	 values later, in sparc64_elf_finish_dynamic_sections, but we
1868	 must add the entries now so that we get the correct size for
1869	 the .dynamic section.  The DT_DEBUG entry is filled in by the
1870	 dynamic linker and used by the debugger.  */
1871#define add_dynamic_entry(TAG, VAL) \
1872  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1873
1874      int reg;
1875      struct sparc64_elf_app_reg * app_regs;
1876      struct elf_strtab_hash *dynstr;
1877      struct elf_link_hash_table *eht = elf_hash_table (info);
1878
1879      if (info->executable)
1880	{
1881	  if (!add_dynamic_entry (DT_DEBUG, 0))
1882	    return FALSE;
1883	}
1884
1885      if (relplt)
1886	{
1887	  if (!add_dynamic_entry (DT_PLTGOT, 0)
1888	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
1889	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1890	      || !add_dynamic_entry (DT_JMPREL, 0))
1891	    return FALSE;
1892	}
1893
1894      if (!add_dynamic_entry (DT_RELA, 0)
1895	  || !add_dynamic_entry (DT_RELASZ, 0)
1896	  || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1897	return FALSE;
1898
1899      if (info->flags & DF_TEXTREL)
1900	{
1901	  if (!add_dynamic_entry (DT_TEXTREL, 0))
1902	    return FALSE;
1903	}
1904
1905      /* Add dynamic STT_REGISTER symbols and corresponding DT_SPARC_REGISTER
1906	 entries if needed.  */
1907      app_regs = sparc64_elf_hash_table (info)->app_regs;
1908      dynstr = eht->dynstr;
1909
1910      for (reg = 0; reg < 4; reg++)
1911	if (app_regs [reg].name != NULL)
1912	  {
1913	    struct elf_link_local_dynamic_entry *entry, *e;
1914
1915	    if (!add_dynamic_entry (DT_SPARC_REGISTER, 0))
1916	      return FALSE;
1917
1918	    entry = (struct elf_link_local_dynamic_entry *)
1919	      bfd_hash_allocate (&info->hash->table, sizeof (*entry));
1920	    if (entry == NULL)
1921	      return FALSE;
1922
1923	    /* We cheat here a little bit: the symbol will not be local, so we
1924	       put it at the end of the dynlocal linked list.  We will fix it
1925	       later on, as we have to fix other fields anyway.  */
1926	    entry->isym.st_value = reg < 2 ? reg + 2 : reg + 4;
1927	    entry->isym.st_size = 0;
1928	    if (*app_regs [reg].name != '\0')
1929	      entry->isym.st_name
1930		= _bfd_elf_strtab_add (dynstr, app_regs[reg].name, FALSE);
1931	    else
1932	      entry->isym.st_name = 0;
1933	    entry->isym.st_other = 0;
1934	    entry->isym.st_info = ELF_ST_INFO (app_regs [reg].bind,
1935					       STT_REGISTER);
1936	    entry->isym.st_shndx = app_regs [reg].shndx;
1937	    entry->next = NULL;
1938	    entry->input_bfd = output_bfd;
1939	    entry->input_indx = -1;
1940
1941	    if (eht->dynlocal == NULL)
1942	      eht->dynlocal = entry;
1943	    else
1944	      {
1945		for (e = eht->dynlocal; e->next; e = e->next)
1946		  ;
1947		e->next = entry;
1948	      }
1949	    eht->dynsymcount++;
1950	  }
1951    }
1952#undef add_dynamic_entry
1953
1954  return TRUE;
1955}
1956
1957static bfd_boolean
1958sparc64_elf_new_section_hook (abfd, sec)
1959     bfd *abfd;
1960     asection *sec;
1961{
1962  struct sparc64_elf_section_data *sdata;
1963  bfd_size_type amt = sizeof (*sdata);
1964
1965  sdata = (struct sparc64_elf_section_data *) bfd_zalloc (abfd, amt);
1966  if (sdata == NULL)
1967    return FALSE;
1968  sec->used_by_bfd = (PTR) sdata;
1969
1970  return _bfd_elf_new_section_hook (abfd, sec);
1971}
1972
1973static bfd_boolean
1974sparc64_elf_relax_section (abfd, section, link_info, again)
1975     bfd *abfd ATTRIBUTE_UNUSED;
1976     asection *section ATTRIBUTE_UNUSED;
1977     struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1978     bfd_boolean *again;
1979{
1980  *again = FALSE;
1981  sec_do_relax (section) = 1;
1982  return TRUE;
1983}
1984
1985/* Relocate a SPARC64 ELF section.  */
1986
1987static bfd_boolean
1988sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1989			      contents, relocs, local_syms, local_sections)
1990     bfd *output_bfd;
1991     struct bfd_link_info *info;
1992     bfd *input_bfd;
1993     asection *input_section;
1994     bfd_byte *contents;
1995     Elf_Internal_Rela *relocs;
1996     Elf_Internal_Sym *local_syms;
1997     asection **local_sections;
1998{
1999  bfd *dynobj;
2000  Elf_Internal_Shdr *symtab_hdr;
2001  struct elf_link_hash_entry **sym_hashes;
2002  bfd_vma *local_got_offsets;
2003  bfd_vma got_base;
2004  asection *sgot;
2005  asection *splt;
2006  asection *sreloc;
2007  Elf_Internal_Rela *rel;
2008  Elf_Internal_Rela *relend;
2009
2010  if (info->relocatable)
2011    return TRUE;
2012
2013  dynobj = elf_hash_table (info)->dynobj;
2014  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2015  sym_hashes = elf_sym_hashes (input_bfd);
2016  local_got_offsets = elf_local_got_offsets (input_bfd);
2017
2018  if (elf_hash_table(info)->hgot == NULL)
2019    got_base = 0;
2020  else
2021    got_base = elf_hash_table (info)->hgot->root.u.def.value;
2022
2023  sgot = splt = sreloc = NULL;
2024  if (dynobj != NULL)
2025    splt = bfd_get_section_by_name (dynobj, ".plt");
2026
2027  rel = relocs;
2028  relend = relocs + NUM_SHDR_ENTRIES (& elf_section_data (input_section)->rel_hdr);
2029  for (; rel < relend; rel++)
2030    {
2031      int r_type;
2032      reloc_howto_type *howto;
2033      unsigned long r_symndx;
2034      struct elf_link_hash_entry *h;
2035      Elf_Internal_Sym *sym;
2036      asection *sec;
2037      bfd_vma relocation, off;
2038      bfd_reloc_status_type r;
2039      bfd_boolean is_plt = FALSE;
2040      bfd_boolean unresolved_reloc;
2041
2042      r_type = ELF64_R_TYPE_ID (rel->r_info);
2043      if (r_type < 0 || r_type >= (int) R_SPARC_max_std)
2044	{
2045	  bfd_set_error (bfd_error_bad_value);
2046	  return FALSE;
2047	}
2048      howto = sparc64_elf_howto_table + r_type;
2049
2050      /* This is a final link.  */
2051      r_symndx = ELF64_R_SYM (rel->r_info);
2052      h = NULL;
2053      sym = NULL;
2054      sec = NULL;
2055      unresolved_reloc = FALSE;
2056      if (r_symndx < symtab_hdr->sh_info)
2057	{
2058	  sym = local_syms + r_symndx;
2059	  sec = local_sections[r_symndx];
2060	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2061	}
2062      else
2063	{
2064	  bfd_boolean warned;
2065
2066	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2067				   r_symndx, symtab_hdr, sym_hashes,
2068				   h, sec, relocation,
2069				   unresolved_reloc, warned);
2070	  if (warned)
2071	    {
2072	      /* To avoid generating warning messages about truncated
2073		 relocations, set the relocation's address to be the same as
2074		 the start of this section.  */
2075	      if (input_section->output_section != NULL)
2076		relocation = input_section->output_section->vma;
2077	      else
2078		relocation = 0;
2079	    }
2080	}
2081
2082 do_dynreloc:
2083      /* When generating a shared object, these relocations are copied
2084	 into the output file to be resolved at run time.  */
2085      if (info->shared && r_symndx != 0 && (input_section->flags & SEC_ALLOC))
2086	{
2087	  switch (r_type)
2088	    {
2089	    case R_SPARC_PC10:
2090	    case R_SPARC_PC22:
2091	    case R_SPARC_PC_HH22:
2092	    case R_SPARC_PC_HM10:
2093	    case R_SPARC_PC_LM22:
2094	      if (h != NULL
2095		  && !strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_"))
2096		break;
2097	      /* Fall through.  */
2098	    case R_SPARC_DISP8:
2099	    case R_SPARC_DISP16:
2100	    case R_SPARC_DISP32:
2101	    case R_SPARC_DISP64:
2102	    case R_SPARC_WDISP30:
2103	    case R_SPARC_WDISP22:
2104	    case R_SPARC_WDISP19:
2105	    case R_SPARC_WDISP16:
2106	      if (h == NULL)
2107		break;
2108	      /* Fall through.  */
2109	    case R_SPARC_8:
2110	    case R_SPARC_16:
2111	    case R_SPARC_32:
2112	    case R_SPARC_HI22:
2113	    case R_SPARC_22:
2114	    case R_SPARC_13:
2115	    case R_SPARC_LO10:
2116	    case R_SPARC_UA32:
2117	    case R_SPARC_10:
2118	    case R_SPARC_11:
2119	    case R_SPARC_64:
2120	    case R_SPARC_OLO10:
2121	    case R_SPARC_HH22:
2122	    case R_SPARC_HM10:
2123	    case R_SPARC_LM22:
2124	    case R_SPARC_7:
2125	    case R_SPARC_5:
2126	    case R_SPARC_6:
2127	    case R_SPARC_HIX22:
2128	    case R_SPARC_LOX10:
2129	    case R_SPARC_H44:
2130	    case R_SPARC_M44:
2131	    case R_SPARC_L44:
2132	    case R_SPARC_UA64:
2133	    case R_SPARC_UA16:
2134	      {
2135		Elf_Internal_Rela outrel;
2136		bfd_byte *loc;
2137		bfd_boolean skip, relocate;
2138
2139		if (sreloc == NULL)
2140		  {
2141		    const char *name =
2142		      (bfd_elf_string_from_elf_section
2143		       (input_bfd,
2144			elf_elfheader (input_bfd)->e_shstrndx,
2145			elf_section_data (input_section)->rel_hdr.sh_name));
2146
2147		    if (name == NULL)
2148		      return FALSE;
2149
2150		    BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2151				&& strcmp (bfd_get_section_name(input_bfd,
2152								input_section),
2153					   name + 5) == 0);
2154
2155		    sreloc = bfd_get_section_by_name (dynobj, name);
2156		    BFD_ASSERT (sreloc != NULL);
2157		  }
2158
2159		skip = FALSE;
2160		relocate = FALSE;
2161
2162		outrel.r_offset =
2163		  _bfd_elf_section_offset (output_bfd, info, input_section,
2164					   rel->r_offset);
2165		if (outrel.r_offset == (bfd_vma) -1)
2166		  skip = TRUE;
2167		else if (outrel.r_offset == (bfd_vma) -2)
2168		  skip = TRUE, relocate = TRUE;
2169
2170		outrel.r_offset += (input_section->output_section->vma
2171				    + input_section->output_offset);
2172
2173		/* Optimize unaligned reloc usage now that we know where
2174		   it finally resides.  */
2175		switch (r_type)
2176		  {
2177		  case R_SPARC_16:
2178		    if (outrel.r_offset & 1) r_type = R_SPARC_UA16;
2179		    break;
2180		  case R_SPARC_UA16:
2181		    if (!(outrel.r_offset & 1)) r_type = R_SPARC_16;
2182		    break;
2183		  case R_SPARC_32:
2184		    if (outrel.r_offset & 3) r_type = R_SPARC_UA32;
2185		    break;
2186		  case R_SPARC_UA32:
2187		    if (!(outrel.r_offset & 3)) r_type = R_SPARC_32;
2188		    break;
2189		  case R_SPARC_64:
2190		    if (outrel.r_offset & 7) r_type = R_SPARC_UA64;
2191		    break;
2192		  case R_SPARC_UA64:
2193		    if (!(outrel.r_offset & 7)) r_type = R_SPARC_64;
2194		    break;
2195		  case R_SPARC_DISP8:
2196		  case R_SPARC_DISP16:
2197		  case R_SPARC_DISP32:
2198		  case R_SPARC_DISP64:
2199		    /* If the symbol is not dynamic, we should not keep
2200		       a dynamic relocation.  But an .rela.* slot has been
2201		       allocated for it, output R_SPARC_NONE.
2202		       FIXME: Add code tracking needed dynamic relocs as
2203		       e.g. i386 has.  */
2204		    if (h->dynindx == -1)
2205		      skip = TRUE, relocate = TRUE;
2206		    break;
2207		  }
2208
2209		/* FIXME: Dynamic reloc handling really needs to be rewritten.  */
2210		if (!skip
2211		    && h != NULL
2212		    && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2213		    && h->root.type == bfd_link_hash_undefweak)
2214		  skip = TRUE, relocate = TRUE;
2215
2216		if (skip)
2217		  memset (&outrel, 0, sizeof outrel);
2218		/* h->dynindx may be -1 if the symbol was marked to
2219		   become local.  */
2220		else if (h != NULL && ! is_plt
2221			 && ((! info->symbolic && h->dynindx != -1)
2222			     || !h->def_regular))
2223		  {
2224		    BFD_ASSERT (h->dynindx != -1);
2225		    outrel.r_info
2226		      = ELF64_R_INFO (h->dynindx,
2227				      ELF64_R_TYPE_INFO (
2228					ELF64_R_TYPE_DATA (rel->r_info),
2229							   r_type));
2230		    outrel.r_addend = rel->r_addend;
2231		  }
2232		else
2233		  {
2234		    outrel.r_addend = relocation + rel->r_addend;
2235		    if (r_type == R_SPARC_64)
2236		      outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2237		    else
2238		      {
2239			long indx;
2240
2241			if (is_plt)
2242			  sec = splt;
2243
2244			if (bfd_is_abs_section (sec))
2245			  indx = 0;
2246			else if (sec == NULL || sec->owner == NULL)
2247			  {
2248			    bfd_set_error (bfd_error_bad_value);
2249			    return FALSE;
2250			  }
2251			else
2252			  {
2253			    asection *osec;
2254
2255			    osec = sec->output_section;
2256			    indx = elf_section_data (osec)->dynindx;
2257
2258			    /* We are turning this relocation into one
2259			       against a section symbol, so subtract out
2260			       the output section's address but not the
2261			       offset of the input section in the output
2262			       section.  */
2263			    outrel.r_addend -= osec->vma;
2264
2265			    /* FIXME: we really should be able to link non-pic
2266			       shared libraries.  */
2267			    if (indx == 0)
2268			      {
2269				BFD_FAIL ();
2270				(*_bfd_error_handler)
2271				  (_("%B: probably compiled without -fPIC?"),
2272				   input_bfd);
2273				bfd_set_error (bfd_error_bad_value);
2274				return FALSE;
2275			      }
2276			  }
2277
2278			outrel.r_info
2279			  = ELF64_R_INFO (indx,
2280					  ELF64_R_TYPE_INFO (
2281					    ELF64_R_TYPE_DATA (rel->r_info),
2282							       r_type));
2283		      }
2284		  }
2285
2286		loc = sreloc->contents;
2287		loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
2288		bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2289
2290		/* This reloc will be computed at runtime, so there's no
2291		   need to do anything now.  */
2292		if (! relocate)
2293		  continue;
2294	      }
2295	    break;
2296	    }
2297	}
2298
2299      switch (r_type)
2300	{
2301	case R_SPARC_GOT10:
2302	case R_SPARC_GOT13:
2303	case R_SPARC_GOT22:
2304	  /* Relocation is to the entry for this symbol in the global
2305	     offset table.  */
2306	  if (sgot == NULL)
2307	    {
2308	      sgot = bfd_get_section_by_name (dynobj, ".got");
2309	      BFD_ASSERT (sgot != NULL);
2310	    }
2311
2312	  if (h != NULL)
2313	    {
2314	      bfd_boolean dyn;
2315
2316	      off = h->got.offset;
2317	      BFD_ASSERT (off != (bfd_vma) -1);
2318	      dyn = elf_hash_table (info)->dynamic_sections_created;
2319
2320	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2321		  || (info->shared
2322		      && (info->symbolic
2323			  || h->dynindx == -1
2324			  || h->forced_local)
2325		      && h->def_regular))
2326		{
2327		  /* This is actually a static link, or it is a -Bsymbolic
2328		     link and the symbol is defined locally, or the symbol
2329		     was forced to be local because of a version file.  We
2330		     must initialize this entry in the global offset table.
2331		     Since the offset must always be a multiple of 8, we
2332		     use the least significant bit to record whether we
2333		     have initialized it already.
2334
2335		     When doing a dynamic link, we create a .rela.got
2336		     relocation entry to initialize the value.  This is
2337		     done in the finish_dynamic_symbol routine.  */
2338
2339		  if ((off & 1) != 0)
2340		    off &= ~1;
2341		  else
2342		    {
2343		      bfd_put_64 (output_bfd, relocation,
2344				  sgot->contents + off);
2345		      h->got.offset |= 1;
2346		    }
2347		}
2348	      else
2349		unresolved_reloc = FALSE;
2350	    }
2351	  else
2352	    {
2353	      BFD_ASSERT (local_got_offsets != NULL);
2354	      off = local_got_offsets[r_symndx];
2355	      BFD_ASSERT (off != (bfd_vma) -1);
2356
2357	      /* The offset must always be a multiple of 8.  We use
2358		 the least significant bit to record whether we have
2359		 already processed this entry.  */
2360	      if ((off & 1) != 0)
2361		off &= ~1;
2362	      else
2363		{
2364		  local_got_offsets[r_symndx] |= 1;
2365
2366		  if (info->shared)
2367		    {
2368		      asection *s;
2369		      Elf_Internal_Rela outrel;
2370		      bfd_byte *loc;
2371
2372		      /* The Solaris 2.7 64-bit linker adds the contents
2373			 of the location to the value of the reloc.
2374			 Note this is different behaviour to the
2375			 32-bit linker, which both adds the contents
2376			 and ignores the addend.  So clear the location.  */
2377		      bfd_put_64 (output_bfd, (bfd_vma) 0,
2378				  sgot->contents + off);
2379
2380		      /* We need to generate a R_SPARC_RELATIVE reloc
2381			 for the dynamic linker.  */
2382		      s = bfd_get_section_by_name(dynobj, ".rela.got");
2383		      BFD_ASSERT (s != NULL);
2384
2385		      outrel.r_offset = (sgot->output_section->vma
2386					 + sgot->output_offset
2387					 + off);
2388		      outrel.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2389		      outrel.r_addend = relocation;
2390		      loc = s->contents;
2391		      loc += s->reloc_count++ * sizeof (Elf64_External_Rela);
2392		      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
2393		    }
2394		  else
2395		    bfd_put_64 (output_bfd, relocation, sgot->contents + off);
2396		}
2397	    }
2398	  relocation = sgot->output_offset + off - got_base;
2399	  goto do_default;
2400
2401	case R_SPARC_WPLT30:
2402	case R_SPARC_PLT32:
2403	case R_SPARC_HIPLT22:
2404	case R_SPARC_LOPLT10:
2405	case R_SPARC_PCPLT32:
2406	case R_SPARC_PCPLT22:
2407	case R_SPARC_PCPLT10:
2408	case R_SPARC_PLT64:
2409	  /* Relocation is to the entry for this symbol in the
2410             procedure linkage table.  */
2411	  BFD_ASSERT (h != NULL);
2412
2413	  if (h->plt.offset == (bfd_vma) -1 || splt == NULL)
2414	    {
2415	      /* We didn't make a PLT entry for this symbol.  This
2416		 happens when statically linking PIC code, or when
2417		 using -Bsymbolic.  */
2418	      goto do_default;
2419	    }
2420
2421	  relocation = (splt->output_section->vma
2422			+ splt->output_offset
2423			+ sparc64_elf_plt_entry_offset (h->plt.offset));
2424	  unresolved_reloc = FALSE;
2425	  if (r_type == R_SPARC_WPLT30)
2426	    goto do_wplt30;
2427	  if (r_type == R_SPARC_PLT32 || r_type == R_SPARC_PLT64)
2428	    {
2429	      r_type = r_type == R_SPARC_PLT32 ? R_SPARC_32 : R_SPARC_64;
2430	      is_plt = TRUE;
2431	      goto do_dynreloc;
2432	    }
2433	  goto do_default;
2434
2435	case R_SPARC_OLO10:
2436	  {
2437	    bfd_vma x;
2438
2439	    relocation += rel->r_addend;
2440	    relocation = (relocation & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info);
2441
2442	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2443	    x = (x & ~(bfd_vma) 0x1fff) | (relocation & 0x1fff);
2444	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2445
2446	    r = bfd_check_overflow (howto->complain_on_overflow,
2447				    howto->bitsize, howto->rightshift,
2448				    bfd_arch_bits_per_address (input_bfd),
2449				    relocation);
2450	  }
2451	  break;
2452
2453	case R_SPARC_WDISP16:
2454	  {
2455	    bfd_vma x;
2456
2457	    relocation += rel->r_addend;
2458	    /* Adjust for pc-relative-ness.  */
2459	    relocation -= (input_section->output_section->vma
2460			   + input_section->output_offset);
2461	    relocation -= rel->r_offset;
2462
2463	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2464	    x &= ~(bfd_vma) 0x303fff;
2465	    x |= ((((relocation >> 2) & 0xc000) << 6)
2466		  | ((relocation >> 2) & 0x3fff));
2467	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2468
2469	    r = bfd_check_overflow (howto->complain_on_overflow,
2470				    howto->bitsize, howto->rightshift,
2471				    bfd_arch_bits_per_address (input_bfd),
2472				    relocation);
2473	  }
2474	  break;
2475
2476	case R_SPARC_HIX22:
2477	  {
2478	    bfd_vma x;
2479
2480	    relocation += rel->r_addend;
2481	    relocation = relocation ^ MINUS_ONE;
2482
2483	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2484	    x = (x & ~(bfd_vma) 0x3fffff) | ((relocation >> 10) & 0x3fffff);
2485	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2486
2487	    r = bfd_check_overflow (howto->complain_on_overflow,
2488				    howto->bitsize, howto->rightshift,
2489				    bfd_arch_bits_per_address (input_bfd),
2490				    relocation);
2491	  }
2492	  break;
2493
2494	case R_SPARC_LOX10:
2495	  {
2496	    bfd_vma x;
2497
2498	    relocation += rel->r_addend;
2499	    relocation = (relocation & 0x3ff) | 0x1c00;
2500
2501	    x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2502	    x = (x & ~(bfd_vma) 0x1fff) | relocation;
2503	    bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2504
2505	    r = bfd_reloc_ok;
2506	  }
2507	  break;
2508
2509	case R_SPARC_WDISP30:
2510	do_wplt30:
2511	  if (sec_do_relax (input_section)
2512	      && rel->r_offset + 4 < input_section->size)
2513	    {
2514#define G0		0
2515#define O7		15
2516#define XCC		(2 << 20)
2517#define COND(x)		(((x)&0xf)<<25)
2518#define CONDA		COND(0x8)
2519#define INSN_BPA	(F2(0,1) | CONDA | BPRED | XCC)
2520#define INSN_BA		(F2(0,2) | CONDA)
2521#define INSN_OR		F3(2, 0x2, 0)
2522#define INSN_NOP	F2(0,4)
2523
2524	      bfd_vma x, y;
2525
2526	      /* If the instruction is a call with either:
2527		 restore
2528		 arithmetic instruction with rd == %o7
2529		 where rs1 != %o7 and rs2 if it is register != %o7
2530		 then we can optimize if the call destination is near
2531		 by changing the call into a branch always.  */
2532	      x = bfd_get_32 (input_bfd, contents + rel->r_offset);
2533	      y = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
2534	      if ((x & OP(~0)) == OP(1) && (y & OP(~0)) == OP(2))
2535		{
2536		  if (((y & OP3(~0)) == OP3(0x3d) /* restore */
2537		       || ((y & OP3(0x28)) == 0 /* arithmetic */
2538			   && (y & RD(~0)) == RD(O7)))
2539		      && (y & RS1(~0)) != RS1(O7)
2540		      && ((y & F3I(~0))
2541			  || (y & RS2(~0)) != RS2(O7)))
2542		    {
2543		      bfd_vma reloc;
2544
2545		      reloc = relocation + rel->r_addend - rel->r_offset;
2546		      reloc -= (input_section->output_section->vma
2547				+ input_section->output_offset);
2548		      if (reloc & 3)
2549			goto do_default;
2550
2551		      /* Ensure the branch fits into simm22.  */
2552		      if ((reloc & ~(bfd_vma)0x7fffff)
2553			   && ((reloc | 0x7fffff) != MINUS_ONE))
2554			goto do_default;
2555		      reloc >>= 2;
2556
2557		      /* Check whether it fits into simm19.  */
2558		      if ((reloc & 0x3c0000) == 0
2559			  || (reloc & 0x3c0000) == 0x3c0000)
2560			x = INSN_BPA | (reloc & 0x7ffff); /* ba,pt %xcc */
2561		      else
2562			x = INSN_BA | (reloc & 0x3fffff); /* ba */
2563		      bfd_put_32 (input_bfd, x, contents + rel->r_offset);
2564		      r = bfd_reloc_ok;
2565		      if (rel->r_offset >= 4
2566			  && (y & (0xffffffff ^ RS1(~0)))
2567			     == (INSN_OR | RD(O7) | RS2(G0)))
2568			{
2569			  bfd_vma z;
2570			  unsigned int reg;
2571
2572			  z = bfd_get_32 (input_bfd,
2573					  contents + rel->r_offset - 4);
2574			  if ((z & (0xffffffff ^ RD(~0)))
2575			      != (INSN_OR | RS1(O7) | RS2(G0)))
2576			    break;
2577
2578			  /* The sequence was
2579			     or %o7, %g0, %rN
2580			     call foo
2581			     or %rN, %g0, %o7
2582
2583			     If call foo was replaced with ba, replace
2584			     or %rN, %g0, %o7 with nop.  */
2585
2586			  reg = (y & RS1(~0)) >> 14;
2587			  if (reg != ((z & RD(~0)) >> 25)
2588			      || reg == G0 || reg == O7)
2589			    break;
2590
2591			  bfd_put_32 (input_bfd, (bfd_vma) INSN_NOP,
2592				      contents + rel->r_offset + 4);
2593			}
2594		      break;
2595		    }
2596		}
2597	    }
2598	  /* Fall through.  */
2599
2600	default:
2601	do_default:
2602	  r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2603					contents, rel->r_offset,
2604					relocation, rel->r_addend);
2605	  break;
2606	}
2607
2608      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
2609	 because such sections are not SEC_ALLOC and thus ld.so will
2610	 not process them.  */
2611      if (unresolved_reloc
2612	  && !((input_section->flags & SEC_DEBUGGING) != 0
2613	       && h->def_dynamic))
2614	(*_bfd_error_handler)
2615	  (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
2616	   input_bfd, input_section,
2617	   (long) rel->r_offset,
2618	   h->root.root.string);
2619
2620      switch (r)
2621	{
2622	case bfd_reloc_ok:
2623	  break;
2624
2625	default:
2626	case bfd_reloc_outofrange:
2627	  abort ();
2628
2629	case bfd_reloc_overflow:
2630	  {
2631	    const char *name;
2632
2633	    /* The Solaris native linker silently disregards
2634	       overflows.  We don't, but this breaks stabs debugging
2635	       info, whose relocations are only 32-bits wide.  Ignore
2636	       overflows for discarded entries.  */
2637	    if ((r_type == R_SPARC_32 || r_type == R_SPARC_DISP32)
2638		&& _bfd_elf_section_offset (output_bfd, info, input_section,
2639					    rel->r_offset) == (bfd_vma) -1)
2640	      break;
2641
2642	    if (h != NULL)
2643	      {
2644		if (h->root.type == bfd_link_hash_undefweak
2645		    && howto->pc_relative)
2646		  {
2647		    /* Assume this is a call protected by other code that
2648		       detect the symbol is undefined.  If this is the case,
2649		       we can safely ignore the overflow.  If not, the
2650		       program is hosed anyway, and a little warning isn't
2651		       going to help.  */
2652		    break;
2653		  }
2654
2655	        name = h->root.root.string;
2656	      }
2657	    else
2658	      {
2659		name = (bfd_elf_string_from_elf_section
2660			(input_bfd,
2661			 symtab_hdr->sh_link,
2662			 sym->st_name));
2663		if (name == NULL)
2664		  return FALSE;
2665		if (*name == '\0')
2666		  name = bfd_section_name (input_bfd, sec);
2667	      }
2668	    if (! ((*info->callbacks->reloc_overflow)
2669		   (info, name, howto->name, (bfd_vma) 0,
2670		    input_bfd, input_section, rel->r_offset)))
2671	      return FALSE;
2672	  }
2673	break;
2674	}
2675    }
2676
2677  return TRUE;
2678}
2679
2680/* Finish up dynamic symbol handling.  We set the contents of various
2681   dynamic sections here.  */
2682
2683static bfd_boolean
2684sparc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
2685     bfd *output_bfd;
2686     struct bfd_link_info *info;
2687     struct elf_link_hash_entry *h;
2688     Elf_Internal_Sym *sym;
2689{
2690  bfd *dynobj;
2691
2692  dynobj = elf_hash_table (info)->dynobj;
2693
2694  if (h->plt.offset != (bfd_vma) -1)
2695    {
2696      asection *splt;
2697      asection *srela;
2698      Elf_Internal_Rela rela;
2699      bfd_byte *loc;
2700
2701      /* This symbol has an entry in the PLT.  Set it up.  */
2702
2703      BFD_ASSERT (h->dynindx != -1);
2704
2705      splt = bfd_get_section_by_name (dynobj, ".plt");
2706      srela = bfd_get_section_by_name (dynobj, ".rela.plt");
2707      BFD_ASSERT (splt != NULL && srela != NULL);
2708
2709      /* Fill in the entry in the .rela.plt section.  */
2710
2711      if (h->plt.offset < LARGE_PLT_THRESHOLD)
2712	{
2713	  rela.r_offset = sparc64_elf_plt_entry_offset (h->plt.offset);
2714	  rela.r_addend = 0;
2715	}
2716      else
2717	{
2718	  bfd_vma max = splt->size / PLT_ENTRY_SIZE;
2719	  rela.r_offset = sparc64_elf_plt_ptr_offset (h->plt.offset, max);
2720	  rela.r_addend = -(sparc64_elf_plt_entry_offset (h->plt.offset) + 4)
2721			  -(splt->output_section->vma + splt->output_offset);
2722	}
2723      rela.r_offset += (splt->output_section->vma + splt->output_offset);
2724      rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
2725
2726      /* Adjust for the first 4 reserved elements in the .plt section
2727	 when setting the offset in the .rela.plt section.
2728	 Sun forgot to read their own ABI and copied elf32-sparc behaviour,
2729	 thus .plt[4] has corresponding .rela.plt[0] and so on.  */
2730
2731      loc = srela->contents;
2732      loc += (h->plt.offset - 4) * sizeof (Elf64_External_Rela);
2733      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2734
2735      if (!h->def_regular)
2736	{
2737	  /* Mark the symbol as undefined, rather than as defined in
2738	     the .plt section.  Leave the value alone.  */
2739	  sym->st_shndx = SHN_UNDEF;
2740	  /* If the symbol is weak, we do need to clear the value.
2741	     Otherwise, the PLT entry would provide a definition for
2742	     the symbol even if the symbol wasn't defined anywhere,
2743	     and so the symbol would never be NULL.  */
2744	  if (!h->ref_regular_nonweak)
2745	    sym->st_value = 0;
2746	}
2747    }
2748
2749  if (h->got.offset != (bfd_vma) -1)
2750    {
2751      asection *sgot;
2752      asection *srela;
2753      Elf_Internal_Rela rela;
2754      bfd_byte *loc;
2755
2756      /* This symbol has an entry in the GOT.  Set it up.  */
2757
2758      sgot = bfd_get_section_by_name (dynobj, ".got");
2759      srela = bfd_get_section_by_name (dynobj, ".rela.got");
2760      BFD_ASSERT (sgot != NULL && srela != NULL);
2761
2762      rela.r_offset = (sgot->output_section->vma
2763		       + sgot->output_offset
2764		       + (h->got.offset &~ (bfd_vma) 1));
2765
2766      /* If this is a -Bsymbolic link, and the symbol is defined
2767	 locally, we just want to emit a RELATIVE reloc.  Likewise if
2768	 the symbol was forced to be local because of a version file.
2769	 The entry in the global offset table will already have been
2770	 initialized in the relocate_section function.  */
2771      if (info->shared
2772	  && (info->symbolic || h->dynindx == -1)
2773	  && h->def_regular)
2774	{
2775	  asection *sec = h->root.u.def.section;
2776	  rela.r_info = ELF64_R_INFO (0, R_SPARC_RELATIVE);
2777	  rela.r_addend = (h->root.u.def.value
2778			   + sec->output_section->vma
2779			   + sec->output_offset);
2780	}
2781      else
2782	{
2783	  rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
2784	  rela.r_addend = 0;
2785	}
2786
2787      bfd_put_64 (output_bfd, (bfd_vma) 0,
2788		  sgot->contents + (h->got.offset &~ (bfd_vma) 1));
2789      loc = srela->contents;
2790      loc += srela->reloc_count++ * sizeof (Elf64_External_Rela);
2791      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2792    }
2793
2794  if (h->needs_copy)
2795    {
2796      asection *s;
2797      Elf_Internal_Rela rela;
2798      bfd_byte *loc;
2799
2800      /* This symbols needs a copy reloc.  Set it up.  */
2801      BFD_ASSERT (h->dynindx != -1);
2802
2803      s = bfd_get_section_by_name (h->root.u.def.section->owner,
2804				   ".rela.bss");
2805      BFD_ASSERT (s != NULL);
2806
2807      rela.r_offset = (h->root.u.def.value
2808		       + h->root.u.def.section->output_section->vma
2809		       + h->root.u.def.section->output_offset);
2810      rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_COPY);
2811      rela.r_addend = 0;
2812      loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela);
2813      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
2814    }
2815
2816  /* Mark some specially defined symbols as absolute.  */
2817  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2818      || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
2819      || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
2820    sym->st_shndx = SHN_ABS;
2821
2822  return TRUE;
2823}
2824
2825/* Finish up the dynamic sections.  */
2826
2827static bfd_boolean
2828sparc64_elf_finish_dynamic_sections (output_bfd, info)
2829     bfd *output_bfd;
2830     struct bfd_link_info *info;
2831{
2832  bfd *dynobj;
2833  int stt_regidx = -1;
2834  asection *sdyn;
2835  asection *sgot;
2836
2837  dynobj = elf_hash_table (info)->dynobj;
2838
2839  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2840
2841  if (elf_hash_table (info)->dynamic_sections_created)
2842    {
2843      asection *splt;
2844      Elf64_External_Dyn *dyncon, *dynconend;
2845
2846      splt = bfd_get_section_by_name (dynobj, ".plt");
2847      BFD_ASSERT (splt != NULL && sdyn != NULL);
2848
2849      dyncon = (Elf64_External_Dyn *) sdyn->contents;
2850      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
2851      for (; dyncon < dynconend; dyncon++)
2852	{
2853	  Elf_Internal_Dyn dyn;
2854	  const char *name;
2855	  bfd_boolean size;
2856
2857	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2858
2859	  switch (dyn.d_tag)
2860	    {
2861	    case DT_PLTGOT:   name = ".plt"; size = FALSE; break;
2862	    case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break;
2863	    case DT_JMPREL:   name = ".rela.plt"; size = FALSE; break;
2864	    case DT_SPARC_REGISTER:
2865	      if (stt_regidx == -1)
2866		{
2867		  stt_regidx =
2868		    _bfd_elf_link_lookup_local_dynindx (info, output_bfd, -1);
2869		  if (stt_regidx == -1)
2870		    return FALSE;
2871		}
2872	      dyn.d_un.d_val = stt_regidx++;
2873	      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2874	      /* fallthrough */
2875	    default:	      name = NULL; size = FALSE; break;
2876	    }
2877
2878	  if (name != NULL)
2879	    {
2880	      asection *s;
2881
2882	      s = bfd_get_section_by_name (output_bfd, name);
2883	      if (s == NULL)
2884		dyn.d_un.d_val = 0;
2885	      else
2886		{
2887		  if (! size)
2888		    dyn.d_un.d_ptr = s->vma;
2889		  else
2890		    dyn.d_un.d_val = s->size;
2891		}
2892	      bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2893	    }
2894	}
2895
2896      /* Initialize the contents of the .plt section.  */
2897      if (splt->size > 0)
2898	sparc64_elf_build_plt (output_bfd, splt->contents,
2899			       (int) (splt->size / PLT_ENTRY_SIZE));
2900
2901      elf_section_data (splt->output_section)->this_hdr.sh_entsize =
2902	PLT_ENTRY_SIZE;
2903    }
2904
2905  /* Set the first entry in the global offset table to the address of
2906     the dynamic section.  */
2907  sgot = bfd_get_section_by_name (dynobj, ".got");
2908  BFD_ASSERT (sgot != NULL);
2909  if (sgot->size > 0)
2910    {
2911      if (sdyn == NULL)
2912	bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents);
2913      else
2914	bfd_put_64 (output_bfd,
2915		    sdyn->output_section->vma + sdyn->output_offset,
2916		    sgot->contents);
2917    }
2918
2919  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8;
2920
2921  return TRUE;
2922}
2923
2924static enum elf_reloc_type_class
2925sparc64_elf_reloc_type_class (rela)
2926     const Elf_Internal_Rela *rela;
2927{
2928  switch ((int) ELF64_R_TYPE (rela->r_info))
2929    {
2930    case R_SPARC_RELATIVE:
2931      return reloc_class_relative;
2932    case R_SPARC_JMP_SLOT:
2933      return reloc_class_plt;
2934    case R_SPARC_COPY:
2935      return reloc_class_copy;
2936    default:
2937      return reloc_class_normal;
2938    }
2939}
2940
2941/* Functions for dealing with the e_flags field.  */
2942
2943/* Merge backend specific data from an object file to the output
2944   object file when linking.  */
2945
2946static bfd_boolean
2947sparc64_elf_merge_private_bfd_data (ibfd, obfd)
2948     bfd *ibfd;
2949     bfd *obfd;
2950{
2951  bfd_boolean error;
2952  flagword new_flags, old_flags;
2953  int new_mm, old_mm;
2954
2955  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2956      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2957    return TRUE;
2958
2959  new_flags = elf_elfheader (ibfd)->e_flags;
2960  old_flags = elf_elfheader (obfd)->e_flags;
2961
2962  if (!elf_flags_init (obfd))   /* First call, no flags set */
2963    {
2964      elf_flags_init (obfd) = TRUE;
2965      elf_elfheader (obfd)->e_flags = new_flags;
2966    }
2967
2968  else if (new_flags == old_flags)      /* Compatible flags are ok */
2969    ;
2970
2971  else                                  /* Incompatible flags */
2972    {
2973      error = FALSE;
2974
2975#define EF_SPARC_ISA_EXTENSIONS \
2976  (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3 | EF_SPARC_HAL_R1)
2977
2978      if ((ibfd->flags & DYNAMIC) != 0)
2979	{
2980	  /* We don't want dynamic objects memory ordering and
2981	     architecture to have any role. That's what dynamic linker
2982	     should do.  */
2983	  new_flags &= ~(EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS);
2984	  new_flags |= (old_flags
2985			& (EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS));
2986	}
2987      else
2988	{
2989	  /* Choose the highest architecture requirements.  */
2990	  old_flags |= (new_flags & EF_SPARC_ISA_EXTENSIONS);
2991	  new_flags |= (old_flags & EF_SPARC_ISA_EXTENSIONS);
2992	  if ((old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3))
2993	      && (old_flags & EF_SPARC_HAL_R1))
2994	    {
2995	      error = TRUE;
2996	      (*_bfd_error_handler)
2997		(_("%B: linking UltraSPARC specific with HAL specific code"),
2998		 ibfd);
2999	    }
3000	  /* Choose the most restrictive memory ordering.  */
3001	  old_mm = (old_flags & EF_SPARCV9_MM);
3002	  new_mm = (new_flags & EF_SPARCV9_MM);
3003	  old_flags &= ~EF_SPARCV9_MM;
3004	  new_flags &= ~EF_SPARCV9_MM;
3005	  if (new_mm < old_mm)
3006	    old_mm = new_mm;
3007	  old_flags |= old_mm;
3008	  new_flags |= old_mm;
3009	}
3010
3011      /* Warn about any other mismatches */
3012      if (new_flags != old_flags)
3013        {
3014          error = TRUE;
3015          (*_bfd_error_handler)
3016            (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
3017             ibfd, (long) new_flags, (long) old_flags);
3018        }
3019
3020      elf_elfheader (obfd)->e_flags = old_flags;
3021
3022      if (error)
3023        {
3024          bfd_set_error (bfd_error_bad_value);
3025          return FALSE;
3026        }
3027    }
3028  return TRUE;
3029}
3030
3031/* MARCO: Set the correct entry size for the .stab section.  */
3032
3033static bfd_boolean
3034sparc64_elf_fake_sections (abfd, hdr, sec)
3035     bfd *abfd ATTRIBUTE_UNUSED;
3036     Elf_Internal_Shdr *hdr ATTRIBUTE_UNUSED;
3037     asection *sec;
3038{
3039  const char *name;
3040
3041  name = bfd_get_section_name (abfd, sec);
3042
3043  if (strcmp (name, ".stab") == 0)
3044    {
3045      /* Even in the 64bit case the stab entries are only 12 bytes long.  */
3046      elf_section_data (sec)->this_hdr.sh_entsize = 12;
3047    }
3048
3049  return TRUE;
3050}
3051
3052/* Print a STT_REGISTER symbol to file FILE.  */
3053
3054static const char *
3055sparc64_elf_print_symbol_all (abfd, filep, symbol)
3056     bfd *abfd ATTRIBUTE_UNUSED;
3057     PTR filep;
3058     asymbol *symbol;
3059{
3060  FILE *file = (FILE *) filep;
3061  int reg, type;
3062
3063  if (ELF_ST_TYPE (((elf_symbol_type *) symbol)->internal_elf_sym.st_info)
3064      != STT_REGISTER)
3065    return NULL;
3066
3067  reg = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
3068  type = symbol->flags;
3069  fprintf (file, "REG_%c%c%11s%c%c    R", "GOLI" [reg / 8], '0' + (reg & 7), "",
3070		 ((type & BSF_LOCAL)
3071		  ? (type & BSF_GLOBAL) ? '!' : 'l'
3072	          : (type & BSF_GLOBAL) ? 'g' : ' '),
3073	         (type & BSF_WEAK) ? 'w' : ' ');
3074  if (symbol->name == NULL || symbol->name [0] == '\0')
3075    return "#scratch";
3076  else
3077    return symbol->name;
3078}
3079
3080/* Set the right machine number for a SPARC64 ELF file.  */
3081
3082static bfd_boolean
3083sparc64_elf_object_p (abfd)
3084     bfd *abfd;
3085{
3086  unsigned long mach = bfd_mach_sparc_v9;
3087
3088  if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US3)
3089    mach = bfd_mach_sparc_v9b;
3090  else if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1)
3091    mach = bfd_mach_sparc_v9a;
3092  return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, mach);
3093}
3094
3095/* Return address for Ith PLT stub in section PLT, for relocation REL
3096   or (bfd_vma) -1 if it should not be included.  */
3097
3098static bfd_vma
3099sparc64_elf_plt_sym_val (bfd_vma i, const asection *plt,
3100			 const arelent *rel ATTRIBUTE_UNUSED)
3101{
3102  bfd_vma j;
3103
3104  i += PLT_HEADER_SIZE / PLT_ENTRY_SIZE;
3105  if (i < LARGE_PLT_THRESHOLD)
3106    return plt->vma + i * PLT_ENTRY_SIZE;
3107
3108  j = (i - LARGE_PLT_THRESHOLD) % 160;
3109  i -= j;
3110  return plt->vma + i * PLT_ENTRY_SIZE + j * 4 * 6;
3111}
3112
3113/* Relocations in the 64 bit SPARC ELF ABI are more complex than in
3114   standard ELF, because R_SPARC_OLO10 has secondary addend in
3115   ELF64_R_TYPE_DATA field.  This structure is used to redirect the
3116   relocation handling routines.  */
3117
3118const struct elf_size_info sparc64_elf_size_info =
3119{
3120  sizeof (Elf64_External_Ehdr),
3121  sizeof (Elf64_External_Phdr),
3122  sizeof (Elf64_External_Shdr),
3123  sizeof (Elf64_External_Rel),
3124  sizeof (Elf64_External_Rela),
3125  sizeof (Elf64_External_Sym),
3126  sizeof (Elf64_External_Dyn),
3127  sizeof (Elf_External_Note),
3128  4,		/* hash-table entry size.  */
3129  /* Internal relocations per external relocations.
3130     For link purposes we use just 1 internal per
3131     1 external, for assembly and slurp symbol table
3132     we use 2.  */
3133  1,
3134  64,		/* arch_size.  */
3135  3,		/* log_file_align.  */
3136  ELFCLASS64,
3137  EV_CURRENT,
3138  bfd_elf64_write_out_phdrs,
3139  bfd_elf64_write_shdrs_and_ehdr,
3140  sparc64_elf_write_relocs,
3141  bfd_elf64_swap_symbol_in,
3142  bfd_elf64_swap_symbol_out,
3143  sparc64_elf_slurp_reloc_table,
3144  bfd_elf64_slurp_symbol_table,
3145  bfd_elf64_swap_dyn_in,
3146  bfd_elf64_swap_dyn_out,
3147  bfd_elf64_swap_reloc_in,
3148  bfd_elf64_swap_reloc_out,
3149  bfd_elf64_swap_reloca_in,
3150  bfd_elf64_swap_reloca_out
3151};
3152
3153#define TARGET_BIG_SYM	bfd_elf64_sparc_vec
3154#define TARGET_BIG_NAME	"elf64-sparc"
3155#define ELF_ARCH	bfd_arch_sparc
3156#define ELF_MAXPAGESIZE 0x100000
3157
3158/* This is the official ABI value.  */
3159#define ELF_MACHINE_CODE EM_SPARCV9
3160
3161/* This is the value that we used before the ABI was released.  */
3162#define ELF_MACHINE_ALT1 EM_OLD_SPARCV9
3163
3164#define bfd_elf64_bfd_link_hash_table_create \
3165  sparc64_elf_bfd_link_hash_table_create
3166
3167#define elf_info_to_howto \
3168  sparc64_elf_info_to_howto
3169#define bfd_elf64_get_reloc_upper_bound \
3170  sparc64_elf_get_reloc_upper_bound
3171#define bfd_elf64_get_dynamic_reloc_upper_bound \
3172  sparc64_elf_get_dynamic_reloc_upper_bound
3173#define bfd_elf64_canonicalize_reloc \
3174  sparc64_elf_canonicalize_reloc
3175#define bfd_elf64_canonicalize_dynamic_reloc \
3176  sparc64_elf_canonicalize_dynamic_reloc
3177#define bfd_elf64_bfd_reloc_type_lookup \
3178  sparc64_elf_reloc_type_lookup
3179#define bfd_elf64_bfd_relax_section \
3180  sparc64_elf_relax_section
3181#define bfd_elf64_new_section_hook \
3182  sparc64_elf_new_section_hook
3183
3184#define elf_backend_create_dynamic_sections \
3185  _bfd_elf_create_dynamic_sections
3186#define elf_backend_add_symbol_hook \
3187  sparc64_elf_add_symbol_hook
3188#define elf_backend_get_symbol_type \
3189  sparc64_elf_get_symbol_type
3190#define elf_backend_symbol_processing \
3191  sparc64_elf_symbol_processing
3192#define elf_backend_check_relocs \
3193  sparc64_elf_check_relocs
3194#define elf_backend_adjust_dynamic_symbol \
3195  sparc64_elf_adjust_dynamic_symbol
3196#define elf_backend_size_dynamic_sections \
3197  sparc64_elf_size_dynamic_sections
3198#define elf_backend_relocate_section \
3199  sparc64_elf_relocate_section
3200#define elf_backend_finish_dynamic_symbol \
3201  sparc64_elf_finish_dynamic_symbol
3202#define elf_backend_finish_dynamic_sections \
3203  sparc64_elf_finish_dynamic_sections
3204#define elf_backend_print_symbol_all \
3205  sparc64_elf_print_symbol_all
3206#define elf_backend_output_arch_syms \
3207  sparc64_elf_output_arch_syms
3208#define bfd_elf64_bfd_merge_private_bfd_data \
3209  sparc64_elf_merge_private_bfd_data
3210#define elf_backend_fake_sections \
3211  sparc64_elf_fake_sections
3212#define elf_backend_plt_sym_val	\
3213  sparc64_elf_plt_sym_val
3214
3215#define elf_backend_size_info \
3216  sparc64_elf_size_info
3217#define elf_backend_object_p \
3218  sparc64_elf_object_p
3219#define elf_backend_reloc_type_class \
3220  sparc64_elf_reloc_type_class
3221
3222#define elf_backend_want_got_plt 0
3223#define elf_backend_plt_readonly 0
3224#define elf_backend_want_plt_sym 1
3225#define elf_backend_rela_normal 1
3226
3227/* Section 5.2.4 of the ABI specifies a 256-byte boundary for the table.  */
3228#define elf_backend_plt_alignment 8
3229
3230#define elf_backend_got_header_size 8
3231
3232#include "elf64-target.h"
3233