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