2002-09-27 David Carlton <carlton@math.stanford.edu>
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
CommitLineData
9e103c9c 1/* Common code for PA ELF implementations.
189c6563 2 Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
9e103c9c
JL
3
4This file is part of BFD, the Binary File Descriptor library.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
21
2eb429af
JL
22/* This file is included by multiple PA ELF BFD backends with different
23 sizes.
24
25 Most of the routines are written to be size independent, but sometimes
26 external constraints require 32 or 64 bit specific code. We remap
27 the definitions/functions as necessary here. */
9e103c9c
JL
28#if ARCH_SIZE == 64
29#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
2eb429af 30#define ELF_R_SYM(X) ELF64_R_SYM(X)
3f9b03b5 31#define elf_hppa_internal_shdr Elf64_Internal_Shdr
189c6563 32#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
9e103c9c 33#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
2eb429af
JL
34#define elf_hppa_relocate_section elf64_hppa_relocate_section
35#define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
36#define elf_hppa_final_link elf64_hppa_final_link
9e103c9c
JL
37#endif
38#if ARCH_SIZE == 32
39#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
2eb429af 40#define ELF_R_SYM(X) ELF32_R_SYM(X)
3f9b03b5 41#define elf_hppa_internal_shdr Elf32_Internal_Shdr
189c6563 42#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
9e103c9c 43#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
2eb429af
JL
44#define elf_hppa_relocate_section elf32_hppa_relocate_section
45#define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
46#define elf_hppa_final_link elf32_hppa_final_link
9e103c9c
JL
47#endif
48
3f9b03b5
AM
49static void elf_hppa_info_to_howto
50 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
51
52static void elf_hppa_info_to_howto_rel
53 PARAMS ((bfd *, arelent *, Elf_Internal_Rel *));
54
55static reloc_howto_type * elf_hppa_reloc_type_lookup
56 PARAMS ((bfd *, bfd_reloc_code_real_type));
2eb429af 57
3f9b03b5
AM
58static boolean elf_hppa_is_local_label_name
59 PARAMS ((bfd *, const char *));
60
61static boolean elf_hppa_fake_sections
62 PARAMS ((bfd *abfd, elf_hppa_internal_shdr *, asection *));
63
3f9b03b5
AM
64static void elf_hppa_final_write_processing
65 PARAMS ((bfd *, boolean));
2eb429af 66
46fe4e66
AM
67static int hppa_unwind_entry_compare
68 PARAMS ((const PTR, const PTR));
69
70static boolean elf_hppa_sort_unwind
71 PARAMS ((bfd *));
72
49bd834c 73#if ARCH_SIZE == 64
2eb429af 74static boolean elf_hppa_add_symbol_hook
f273939b 75 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
2eb429af
JL
76 const char **, flagword *, asection **, bfd_vma *));
77
af7dc644
JL
78static boolean elf_hppa_unmark_useless_dynamic_symbols
79 PARAMS ((struct elf_link_hash_entry *, PTR));
80
81static boolean elf_hppa_remark_useless_dynamic_symbols
82 PARAMS ((struct elf_link_hash_entry *, PTR));
83
1bf42538
JL
84static boolean elf_hppa_is_dynamic_loader_symbol
85 PARAMS ((const char *));
86
2ec0dd12
JL
87static void elf_hppa_record_segment_addrs
88 PARAMS ((bfd *, asection *, PTR));
89
3f9b03b5
AM
90static boolean elf_hppa_final_link
91 PARAMS ((bfd *, struct bfd_link_info *));
92
93static boolean elf_hppa_relocate_section
94 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
46fe4e66 95 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
3f9b03b5
AM
96
97static bfd_reloc_status_type elf_hppa_final_link_relocate
98 PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *,
46fe4e66
AM
99 bfd_byte *, bfd_vma, struct bfd_link_info *,
100 asection *, struct elf_link_hash_entry *,
3f9b03b5
AM
101 struct elf64_hppa_dyn_hash_entry *));
102
dc810e39
AM
103static int elf_hppa_relocate_insn
104 PARAMS ((int, int, unsigned int));
3f9b03b5
AM
105#endif
106
9e103c9c
JL
107/* ELF/PA relocation howto entries. */
108
109static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
110{
3f9b03b5
AM
111 { R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_PARISC_NONE", false, 0, 0, false },
9e103c9c
JL
113
114 /* The values in DIR32 are to placate the check in
115 _bfd_stab_section_find_nearest_line. */
3f9b03b5
AM
116 { R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield,
117 bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false },
118 { R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
119 bfd_elf_generic_reloc, "R_PARISC_DIR21L", false, 0, 0, false },
120 { R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield,
121 bfd_elf_generic_reloc, "R_PARISC_DIR17R", false, 0, 0, false },
122 { R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield,
123 bfd_elf_generic_reloc, "R_PARISC_DIR17F", false, 0, 0, false },
124 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
125 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
126 { R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_PARISC_DIR14R", false, 0, 0, false },
47d89dba
AM
128 { R_PARISC_DIR14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
129 bfd_elf_generic_reloc, "R_PARISC_DIR14F", false, 0, 0, false },
49bd834c
AM
130 /* 8 */
131 { R_PARISC_PCREL12F, 0, 0, 12, true, 0, complain_overflow_bitfield,
132 bfd_elf_generic_reloc, "R_PARISC_PCREL12F", false, 0, 0, false },
3f9b03b5
AM
133 { R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield,
134 bfd_elf_generic_reloc, "R_PARISC_PCREL32", false, 0, 0, false },
3f9b03b5
AM
135 { R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield,
136 bfd_elf_generic_reloc, "R_PARISC_PCREL21L", false, 0, 0, false },
137 { R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield,
138 bfd_elf_generic_reloc, "R_PARISC_PCREL17R", false, 0, 0, false },
139 { R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield,
140 bfd_elf_generic_reloc, "R_PARISC_PCREL17F", false, 0, 0, false },
141 { R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield,
142 bfd_elf_generic_reloc, "R_PARISC_PCREL17C", false, 0, 0, false },
143 { R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield,
144 bfd_elf_generic_reloc, "R_PARISC_PCREL14R", false, 0, 0, false },
145 { R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield,
146 bfd_elf_generic_reloc, "R_PARISC_PCREL14F", false, 0, 0, false },
49bd834c 147 /* 16 */
3f9b03b5
AM
148 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
149 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
150 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
151 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
152 { R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
153 bfd_elf_generic_reloc, "R_PARISC_DPREL21L", false, 0, 0, false },
c46b7515 154 { R_PARISC_DPREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 155 bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", false, 0, 0, false },
c46b7515 156 { R_PARISC_DPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
157 bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", false, 0, 0, false },
158 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
159 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
160 { R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
161 bfd_elf_generic_reloc, "R_PARISC_DPREL14R", false, 0, 0, false },
162 { R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
163 bfd_elf_generic_reloc, "R_PARISC_DPREL14F", false, 0, 0, false },
49bd834c 164 /* 24 */
3f9b03b5
AM
165 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
166 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
167 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
168 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
169 { R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
170 bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", false, 0, 0, false },
171 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
172 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
173 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
174 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
175 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
176 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
177 { R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
178 bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", false, 0, 0, false },
179 { R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
180 bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", false, 0, 0, false },
49bd834c 181 /* 32 */
3f9b03b5
AM
182 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
183 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
184 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
185 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
186 { R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
187 bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", false, 0, 0, false },
188 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
189 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
190 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
191 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
192 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
193 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
194 { R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
195 bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", false, 0, 0, false },
196 { R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
197 bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", false, 0, 0, false },
49bd834c 198 /* 40 */
3f9b03b5
AM
199 { R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield,
200 bfd_elf_generic_reloc, "R_PARISC_SETBASE", false, 0, 0, false },
c46b7515 201 { R_PARISC_SECREL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
202 bfd_elf_generic_reloc, "R_PARISC_SECREL32", false, 0, 0, false },
203 { R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
204 bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", false, 0, 0, false },
205 { R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield,
206 bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", false, 0, 0, false },
207 { R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield,
208 bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", false, 0, 0, false },
209 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
210 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
211 { R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
212 bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", false, 0, 0, false },
213 { R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
214 bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", false, 0, 0, false },
49bd834c 215 /* 48 */
3f9b03b5
AM
216 { R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield,
217 bfd_elf_generic_reloc, "R_PARISC_SEGBASE", false, 0, 0, false },
c46b7515 218 { R_PARISC_SEGREL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
3f9b03b5 219 bfd_elf_generic_reloc, "R_PARISC_SEGREL32", false, 0, 0, false },
c46b7515 220 { R_PARISC_PLTOFF21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
221 bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", false, 0, 0, false },
222 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
223 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
224 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
225 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
226 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
227 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 228 { R_PARISC_PLTOFF14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 229 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", false, 0, 0, false },
c46b7515 230 { R_PARISC_PLTOFF14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 231 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", false, 0, 0, false },
49bd834c 232 /* 56 */
3f9b03b5
AM
233 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
234 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 235 { R_PARISC_LTOFF_FPTR32, 0, 0, 32, false, 0, complain_overflow_bitfield,
3f9b03b5 236 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", false, 0, 0, false },
c46b7515 237 { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
238 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", false, 0, 0, false },
239 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
240 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
241 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
242 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
243 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
244 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 245 { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
246 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", false, 0, 0, false },
247 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
248 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 249 /* 64 */
c46b7515 250 { R_PARISC_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
251 bfd_elf_generic_reloc, "R_PARISC_FPTR64", false, 0, 0, false },
252 { R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
253 bfd_elf_generic_reloc, "R_PARISC_PLABEL32", false, 0, 0, false },
254 { R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
255 bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", false, 0, 0, false },
256 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
257 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
258 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
259 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
260 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
261 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
262 { R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
263 bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", false, 0, 0, false },
264 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
265 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 266 /* 72 */
c46b7515 267 { R_PARISC_PCREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5 268 bfd_elf_generic_reloc, "R_PARISC_PCREL64", false, 0, 0, false },
c46b7515 269 { R_PARISC_PCREL22C, 0, 0, 22, false, 0, complain_overflow_bitfield,
3f9b03b5 270 bfd_elf_generic_reloc, "R_PARISC_PCREL22C", false, 0, 0, false },
c46b7515 271 { R_PARISC_PCREL22F, 0, 0, 22, false, 0, complain_overflow_bitfield,
3f9b03b5 272 bfd_elf_generic_reloc, "R_PARISC_PCREL22F", false, 0, 0, false },
c46b7515 273 { R_PARISC_PCREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 274 bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", false, 0, 0, false },
c46b7515 275 { R_PARISC_PCREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 276 bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", false, 0, 0, false },
c46b7515 277 { R_PARISC_PCREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 278 bfd_elf_generic_reloc, "R_PARISC_PCREL16F", false, 0, 0, false },
c46b7515 279 { R_PARISC_PCREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 280 bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", false, 0, 0, false },
c46b7515 281 { R_PARISC_PCREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 282 bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", false, 0, 0, false },
49bd834c 283 /* 80 */
c46b7515 284 { R_PARISC_DIR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5 285 bfd_elf_generic_reloc, "R_PARISC_DIR64", false, 0, 0, false },
c46b7515
AM
286 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
287 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
288 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
289 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
290 { R_PARISC_DIR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 291 bfd_elf_generic_reloc, "R_PARISC_DIR14WR", false, 0, 0, false },
c46b7515 292 { R_PARISC_DIR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 293 bfd_elf_generic_reloc, "R_PARISC_DIR14DR", false, 0, 0, false },
c46b7515 294 { R_PARISC_DIR16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 295 bfd_elf_generic_reloc, "R_PARISC_DIR16F", false, 0, 0, false },
c46b7515 296 { R_PARISC_DIR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 297 bfd_elf_generic_reloc, "R_PARISC_DIR16WF", false, 0, 0, false },
c46b7515 298 { R_PARISC_DIR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 299 bfd_elf_generic_reloc, "R_PARISC_DIR16DF", false, 0, 0, false },
49bd834c 300 /* 88 */
c46b7515 301 { R_PARISC_GPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
302 bfd_elf_generic_reloc, "R_PARISC_GPREL64", false, 0, 0, false },
303 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
304 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
305 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
306 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 307 { R_PARISC_DLTREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 308 bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", false, 0, 0, false },
c46b7515 309 { R_PARISC_DLTREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 310 bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", false, 0, 0, false },
c46b7515 311 { R_PARISC_GPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 312 bfd_elf_generic_reloc, "R_PARISC_GPREL16F", false, 0, 0, false },
c46b7515 313 { R_PARISC_GPREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 314 bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", false, 0, 0, false },
c46b7515 315 { R_PARISC_GPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 316 bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", false, 0, 0, false },
49bd834c 317 /* 96 */
c46b7515 318 { R_PARISC_LTOFF64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
319 bfd_elf_generic_reloc, "R_PARISC_LTOFF64", false, 0, 0, false },
320 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
321 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
322 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
323 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 324 { R_PARISC_DLTIND14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 325 bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", false, 0, 0, false },
c46b7515 326 { R_PARISC_DLTIND14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 327 bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", false, 0, 0, false },
c46b7515 328 { R_PARISC_LTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 329 bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", false, 0, 0, false },
c46b7515 330 { R_PARISC_LTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 331 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false },
c46b7515 332 { R_PARISC_LTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 333 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false },
49bd834c 334 /* 104 */
3f9b03b5
AM
335 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
336 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
337 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
338 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 339 { R_PARISC_BASEREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
49bd834c 340 bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", false, 0, 0, false },
c46b7515 341 { R_PARISC_BASEREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
342 bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", false, 0, 0, false },
343 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
344 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
345 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
346 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
347 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
348 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
349 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
350 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 351 /* 112 */
c46b7515 352 { R_PARISC_SEGREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
353 bfd_elf_generic_reloc, "R_PARISC_SEGREL64", false, 0, 0, false },
354 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
355 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
356 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
357 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 358 { R_PARISC_PLTOFF14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 359 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", false, 0, 0, false },
c46b7515 360 { R_PARISC_PLTOFF14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 361 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", false, 0, 0, false },
c46b7515 362 { R_PARISC_PLTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 363 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", false, 0, 0, false },
c46b7515 364 { R_PARISC_PLTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 365 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", false, 0, 0, false },
c46b7515 366 { R_PARISC_PLTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 367 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", false, 0, 0, false },
49bd834c 368 /* 120 */
c46b7515 369 { R_PARISC_LTOFF_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
370 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
371 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
372 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
373 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
374 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 375 { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 376 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", false, 0, 0, false },
c46b7515 377 { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 378 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", false, 0, 0, false },
c46b7515 379 { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 380 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", false, 0, 0, false },
c46b7515 381 { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 382 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", false, 0, 0, false },
c46b7515 383 { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 384 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 385 /* 128 */
3f9b03b5
AM
386 { R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield,
387 bfd_elf_generic_reloc, "R_PARISC_COPY", false, 0, 0, false },
388 { R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield,
389 bfd_elf_generic_reloc, "R_PARISC_IPLT", false, 0, 0, false },
3f9b03b5
AM
390 { R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield,
391 bfd_elf_generic_reloc, "R_PARISC_EPLT", false, 0, 0, false },
392 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
393 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
394 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
395 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
396 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
397 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
398 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
399 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
400 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
401 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 402 /* 136 */
3f9b03b5
AM
403 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
404 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
405 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 406 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
407 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
408 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
409 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
410 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 411 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 412 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
413 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
414 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
415 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
416 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
417 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
418 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 419 /* 144 */
3f9b03b5
AM
420 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
421 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
422 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
423 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
424 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
425 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
426 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 427 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
428 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
429 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
430 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
431 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 432 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 433 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 434 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c
AM
435 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
436 /* 152 */
3f9b03b5 437 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 438 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 439 { R_PARISC_TPREL32, 0, 0, 32, false, 0, complain_overflow_dont,
49bd834c 440 bfd_elf_generic_reloc, "R_PARISC_TPREL32", false, 0, 0, false },
c46b7515 441 { R_PARISC_TPREL21L, 0, 0, 21, false, 0, complain_overflow_dont,
49bd834c 442 bfd_elf_generic_reloc, "R_PARISC_TPREL21L", false, 0, 0, false },
3f9b03b5 443 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 444 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 445 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 446 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 447 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 448 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 449 { R_PARISC_TPREL14R, 0, 0, 14, false, 0, complain_overflow_dont,
49bd834c 450 bfd_elf_generic_reloc, "R_PARISC_TPREL14R", false, 0, 0, false },
3f9b03b5 451 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c
AM
452 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
453 /* 160 */
3f9b03b5 454 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 455 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5 456 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 457 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 458 { R_PARISC_LTOFF_TP21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
459 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", false, 0, 0, false },
460 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 461 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
462 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
463 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
464 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
465 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 466 { R_PARISC_LTOFF_TP14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 467 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 468 { R_PARISC_LTOFF_TP14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 469 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", false, 0, 0, false },
49bd834c 470 /* 168 */
3f9b03b5
AM
471 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
472 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
473 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
474 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
475 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
476 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
477 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 478 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
479 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
480 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
481 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
482 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
483 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
484 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
485 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
486 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 487 /* 176 */
3f9b03b5
AM
488 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
489 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
490 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
491 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
492 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 493 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
494 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
495 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
496 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
497 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
498 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 499 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
500 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
501 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
502 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
503 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 504 /* 184 */
3f9b03b5
AM
505 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
506 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
507 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
508 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
509 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
510 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
511 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
512 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
513 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 514 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
515 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
516 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
517 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
518 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
519 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c
AM
520 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
521 /* 192 */
3f9b03b5
AM
522 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
523 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
524 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
525 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
526 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
527 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
528 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
529 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
530 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
531 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
532 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
533 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
534 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 535 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
536 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
537 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 538 /* 200 */
3f9b03b5
AM
539 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
540 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
541 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 542 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
543 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
544 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
545 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
546 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
547 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
548 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
549 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
550 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
551 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
552 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
553 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
554 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 555 /* 208 */
3f9b03b5 556 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 557 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
558 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
559 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
560 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
561 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
562 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
563 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
564 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
49bd834c 565 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
3f9b03b5
AM
566 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
567 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
568 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
569 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
570 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
571 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
49bd834c 572 /* 216 */
c46b7515 573 { R_PARISC_TPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
574 bfd_elf_generic_reloc, "R_PARISC_TPREL64", false, 0, 0, false },
575 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
576 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
577 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
578 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 579 { R_PARISC_TPREL14WR, 0, 0, 14, false, 0, complain_overflow_dont,
49bd834c 580 bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", false, 0, 0, false },
c46b7515 581 { R_PARISC_TPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 582 bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", false, 0, 0, false },
c46b7515 583 { R_PARISC_TPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 584 bfd_elf_generic_reloc, "R_PARISC_TPREL16F", false, 0, 0, false },
c46b7515 585 { R_PARISC_TPREL16WF, 0, 0, 16, false, 0, complain_overflow_dont,
49bd834c 586 bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", false, 0, 0, false },
c46b7515 587 { R_PARISC_TPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 588 bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", false, 0, 0, false },
49bd834c 589 /* 224 */
c46b7515 590 { R_PARISC_LTOFF_TP64, 0, 0, 64, false, 0, complain_overflow_bitfield,
3f9b03b5
AM
591 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", false, 0, 0, false },
592 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
593 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
594 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
595 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
c46b7515 596 { R_PARISC_LTOFF_TP14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 597 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", false, 0, 0, false },
c46b7515 598 { R_PARISC_LTOFF_TP14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
3f9b03b5 599 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", false, 0, 0, false },
c46b7515 600 { R_PARISC_LTOFF_TP16F, 0, 0, 16, false, 0, complain_overflow_dont,
49bd834c 601 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", false, 0, 0, false },
c46b7515 602 { R_PARISC_LTOFF_TP16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 603 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", false, 0, 0, false },
c46b7515 604 { R_PARISC_LTOFF_TP16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
3f9b03b5 605 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", false, 0, 0, false },
49bd834c
AM
606 /* 232 */
607 { R_PARISC_GNU_VTENTRY, 0, 0, 0, false, 0, complain_overflow_dont,
608 bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", false, 0, 0, false },
609 { R_PARISC_GNU_VTINHERIT, 0, 0, 0, false, 0, complain_overflow_dont,
610 bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", false, 0, 0, false },
9e103c9c
JL
611};
612
6e2bf930
JL
613#define OFFSET_14R_FROM_21L 4
614#define OFFSET_14F_FROM_21L 5
615
189c6563
AM
616/* Return the final relocation type for the given base type, instruction
617 format, and field selector. */
9e103c9c 618
189c6563
AM
619elf_hppa_reloc_type
620elf_hppa_reloc_final_type (abfd, base_type, format, field)
9e103c9c
JL
621 bfd *abfd;
622 elf_hppa_reloc_type base_type;
623 int format;
edd21aca 624 unsigned int field;
9e103c9c 625{
189c6563 626 elf_hppa_reloc_type final_type = base_type;
9e103c9c
JL
627
628 /* Just a tangle of nested switch statements to deal with the braindamage
629 that a different field selector means a completely different relocation
630 for PA ELF. */
631 switch (base_type)
632 {
0d571602
JL
633 /* We have been using generic relocation types. However, that may not
634 really make sense. Anyway, we need to support both R_PARISC_DIR64
635 and R_PARISC_DIR32 here. */
636 case R_PARISC_DIR32:
637 case R_PARISC_DIR64:
9e103c9c
JL
638 case R_HPPA_ABS_CALL:
639 switch (format)
640 {
641 case 14:
642 switch (field)
643 {
47d89dba
AM
644 case e_fsel:
645 final_type = R_PARISC_DIR14F;
646 break;
9e103c9c
JL
647 case e_rsel:
648 case e_rrsel:
47d89dba 649 case e_rdsel:
9e103c9c
JL
650 final_type = R_PARISC_DIR14R;
651 break;
652 case e_rtsel:
f31cedf7 653 final_type = R_PARISC_DLTIND14R;
9e103c9c 654 break;
36860900
JL
655 case e_rtpsel:
656 final_type = R_PARISC_LTOFF_FPTR14DR;
657 break;
9e103c9c 658 case e_tsel:
f31cedf7 659 final_type = R_PARISC_DLTIND14F;
9e103c9c
JL
660 break;
661 case e_rpsel:
662 final_type = R_PARISC_PLABEL14R;
663 break;
664 default:
189c6563 665 return R_PARISC_NONE;
9e103c9c
JL
666 }
667 break;
668
669 case 17:
670 switch (field)
671 {
672 case e_fsel:
673 final_type = R_PARISC_DIR17F;
674 break;
675 case e_rsel:
676 case e_rrsel:
47d89dba 677 case e_rdsel:
9e103c9c
JL
678 final_type = R_PARISC_DIR17R;
679 break;
680 default:
189c6563 681 return R_PARISC_NONE;
9e103c9c
JL
682 }
683 break;
684
685 case 21:
686 switch (field)
687 {
688 case e_lsel:
689 case e_lrsel:
47d89dba 690 case e_ldsel:
edd21aca
AM
691 case e_nlsel:
692 case e_nlrsel:
9e103c9c
JL
693 final_type = R_PARISC_DIR21L;
694 break;
695 case e_ltsel:
f31cedf7 696 final_type = R_PARISC_DLTIND21L;
9e103c9c 697 break;
36860900
JL
698 case e_ltpsel:
699 final_type = R_PARISC_LTOFF_FPTR21L;
700 break;
9e103c9c
JL
701 case e_lpsel:
702 final_type = R_PARISC_PLABEL21L;
703 break;
704 default:
189c6563 705 return R_PARISC_NONE;
9e103c9c
JL
706 }
707 break;
708
709 case 32:
710 switch (field)
711 {
712 case e_fsel:
713 final_type = R_PARISC_DIR32;
432bdd91
JL
714 /* When in 64bit mode, a 32bit relocation is supposed to
715 be a section relative relocation. Dwarf2 (for example)
716 uses 32bit section relative relocations. */
717 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
46fe4e66 718 final_type = R_PARISC_SECREL32;
9e103c9c
JL
719 break;
720 case e_psel:
721 final_type = R_PARISC_PLABEL32;
722 break;
723 default:
189c6563 724 return R_PARISC_NONE;
9e103c9c
JL
725 }
726 break;
727
6e2bf930
JL
728 case 64:
729 switch (field)
730 {
731 case e_fsel:
732 final_type = R_PARISC_DIR64;
733 break;
734 case e_psel:
36860900
JL
735 final_type = R_PARISC_FPTR64;
736 break;
6e2bf930 737 default:
189c6563 738 return R_PARISC_NONE;
6e2bf930
JL
739 }
740 break;
741
9e103c9c 742 default:
189c6563 743 return R_PARISC_NONE;
9e103c9c
JL
744 }
745 break;
746
9e103c9c
JL
747 case R_HPPA_GOTOFF:
748 switch (format)
749 {
750 case 14:
751 switch (field)
752 {
753 case e_rsel:
754 case e_rrsel:
47d89dba 755 case e_rdsel:
edd21aca 756 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */
6e2bf930 757 final_type = base_type + OFFSET_14R_FROM_21L;
9e103c9c
JL
758 break;
759 case e_fsel:
edd21aca 760 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32 */
6e2bf930 761 final_type = base_type + OFFSET_14F_FROM_21L;
9e103c9c
JL
762 break;
763 default:
189c6563 764 return R_PARISC_NONE;
9e103c9c
JL
765 }
766 break;
767
768 case 21:
769 switch (field)
770 {
9e103c9c 771 case e_lsel:
edd21aca 772 case e_lrsel:
47d89dba 773 case e_ldsel:
edd21aca
AM
774 case e_nlsel:
775 case e_nlrsel:
776 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */
6e2bf930 777 final_type = base_type;
9e103c9c
JL
778 break;
779 default:
189c6563 780 return R_PARISC_NONE;
9e103c9c
JL
781 }
782 break;
783
784 default:
189c6563 785 return R_PARISC_NONE;
9e103c9c
JL
786 }
787 break;
788
9e103c9c
JL
789 case R_HPPA_PCREL_CALL:
790 switch (format)
791 {
49bd834c
AM
792 case 12:
793 switch (field)
794 {
795 case e_fsel:
796 final_type = R_PARISC_PCREL12F;
797 break;
798 default:
189c6563 799 return R_PARISC_NONE;
49bd834c
AM
800 }
801 break;
802
9e103c9c 803 case 14:
49bd834c
AM
804 /* Contrary to appearances, these are not calls of any sort.
805 Rather, they are loads/stores with a pcrel reloc. */
9e103c9c
JL
806 switch (field)
807 {
808 case e_rsel:
809 case e_rrsel:
47d89dba 810 case e_rdsel:
9e103c9c
JL
811 final_type = R_PARISC_PCREL14R;
812 break;
813 case e_fsel:
ba94744e
AM
814 if (bfd_get_mach (abfd) < 25)
815 final_type = R_PARISC_PCREL14F;
816 else
817 final_type = R_PARISC_PCREL16F;
9e103c9c
JL
818 break;
819 default:
189c6563 820 return R_PARISC_NONE;
9e103c9c
JL
821 }
822 break;
823
824 case 17:
825 switch (field)
826 {
827 case e_rsel:
828 case e_rrsel:
47d89dba 829 case e_rdsel:
9e103c9c
JL
830 final_type = R_PARISC_PCREL17R;
831 break;
832 case e_fsel:
833 final_type = R_PARISC_PCREL17F;
834 break;
835 default:
189c6563 836 return R_PARISC_NONE;
9e103c9c
JL
837 }
838 break;
839
edd21aca 840 case 21:
341362b5
JL
841 switch (field)
842 {
edd21aca
AM
843 case e_lsel:
844 case e_lrsel:
47d89dba 845 case e_ldsel:
edd21aca
AM
846 case e_nlsel:
847 case e_nlrsel:
848 final_type = R_PARISC_PCREL21L;
341362b5
JL
849 break;
850 default:
189c6563 851 return R_PARISC_NONE;
341362b5
JL
852 }
853 break;
854
edd21aca 855 case 22:
9e103c9c
JL
856 switch (field)
857 {
edd21aca
AM
858 case e_fsel:
859 final_type = R_PARISC_PCREL22F;
9e103c9c
JL
860 break;
861 default:
189c6563 862 return R_PARISC_NONE;
9e103c9c
JL
863 }
864 break;
865
866 default:
189c6563 867 return R_PARISC_NONE;
9e103c9c
JL
868 }
869 break;
870
49bd834c
AM
871 case R_PARISC_GNU_VTENTRY:
872 case R_PARISC_GNU_VTINHERIT:
fc91f658
JL
873 case R_PARISC_SEGREL32:
874 case R_PARISC_SEGBASE:
875 /* The defaults are fine for these cases. */
876 break;
877
9e103c9c 878 default:
189c6563 879 return R_PARISC_NONE;
9e103c9c
JL
880 }
881
189c6563
AM
882 return final_type;
883}
884
885/* Return one (or more) BFD relocations which implement the base
886 relocation with modifications based on format and field. */
887
888elf_hppa_reloc_type **
889_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
890 bfd *abfd;
891 elf_hppa_reloc_type base_type;
892 int format;
893 unsigned int field;
894 int ignore ATTRIBUTE_UNUSED;
895 asymbol *sym ATTRIBUTE_UNUSED;
896{
897 elf_hppa_reloc_type *finaltype;
898 elf_hppa_reloc_type **final_types;
899 bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
900
901 /* Allocate slots for the BFD relocation. */
902 final_types = (elf_hppa_reloc_type **) bfd_alloc (abfd, amt);
903 if (final_types == NULL)
904 return NULL;
905
906 /* Allocate space for the relocation itself. */
907 amt = sizeof (elf_hppa_reloc_type);
908 finaltype = (elf_hppa_reloc_type *) bfd_alloc (abfd, amt);
909 if (finaltype == NULL)
910 return NULL;
911
912 /* Some reasonable defaults. */
913 final_types[0] = finaltype;
914 final_types[1] = NULL;
915
916 *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
917
9e103c9c
JL
918 return final_types;
919}
920
921/* Translate from an elf into field into a howto relocation pointer. */
922
923static void
924elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
3f9b03b5 925 bfd *abfd ATTRIBUTE_UNUSED;
9e103c9c
JL
926 arelent *bfd_reloc;
927 Elf_Internal_Rela *elf_reloc;
928{
929 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
930 < (unsigned int) R_PARISC_UNIMPLEMENTED);
931 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
932}
933
934/* Translate from an elf into field into a howto relocation pointer. */
935
936static void
937elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
3f9b03b5 938 bfd *abfd ATTRIBUTE_UNUSED;
9e103c9c
JL
939 arelent *bfd_reloc;
940 Elf_Internal_Rel *elf_reloc;
941{
942 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
943 < (unsigned int) R_PARISC_UNIMPLEMENTED);
944 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
945}
946
947/* Return the address of the howto table entry to perform the CODE
948 relocation for an ARCH machine. */
949
950static reloc_howto_type *
951elf_hppa_reloc_type_lookup (abfd, code)
3f9b03b5 952 bfd *abfd ATTRIBUTE_UNUSED;
9e103c9c
JL
953 bfd_reloc_code_real_type code;
954{
955 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
956 {
957 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
958 return &elf_hppa_howto_table[(int) code];
959 }
960 return NULL;
961}
95cbae0b 962
432bdd91
JL
963/* Return true if SYM represents a local label symbol. */
964
965static boolean
966elf_hppa_is_local_label_name (abfd, name)
967 bfd *abfd ATTRIBUTE_UNUSED;
968 const char *name;
969{
49bd834c
AM
970 if (name[0] == 'L' && name[1] == '$')
971 return 1;
972 return _bfd_elf_is_local_label_name (abfd, name);
432bdd91
JL
973}
974
052e120f
JL
975/* Set the correct type for an ELF section. We do this by the
976 section name, which is a hack, but ought to work. */
977
978static boolean
979elf_hppa_fake_sections (abfd, hdr, sec)
980 bfd *abfd;
3f9b03b5 981 elf_hppa_internal_shdr *hdr;
052e120f
JL
982 asection *sec;
983{
984 register const char *name;
985
986 name = bfd_get_section_name (abfd, sec);
987
988 if (strcmp (name, ".PARISC.unwind") == 0)
989 {
1ca74062 990 int indx;
edd21aca 991 asection *asec;
3f9b03b5 992#if ARCH_SIZE == 64
052e120f 993 hdr->sh_type = SHT_LOPROC + 1;
3f9b03b5
AM
994#else
995 hdr->sh_type = 1;
996#endif
052e120f
JL
997 /* ?!? How are unwinds supposed to work for symbols in arbitrary
998 sections? Or what if we have multiple .text sections in a single
be7582f3 999 .o file? HP really messed up on this one.
052e120f 1000
1ca74062
JL
1001 Ugh. We can not use elf_section_data (sec)->this_idx at this
1002 point because it is not initialized yet.
1003
1004 So we (gasp) recompute it here. Hopefully nobody ever changes the
1005 way sections are numbered in elf.c! */
edd21aca 1006 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
1ca74062 1007 {
edd21aca 1008 if (asec->name && strcmp (asec->name, ".text") == 0)
1ca74062
JL
1009 {
1010 hdr->sh_info = indx;
1011 break;
1012 }
1013 }
be7582f3 1014
052e120f
JL
1015 /* I have no idea if this is really necessary or what it means. */
1016 hdr->sh_entsize = 4;
1017 }
1018 return true;
1019}
1020
3f9b03b5
AM
1021static void
1022elf_hppa_final_write_processing (abfd, linker)
1023 bfd *abfd;
edd21aca 1024 boolean linker ATTRIBUTE_UNUSED;
3f9b03b5
AM
1025{
1026 int mach = bfd_get_mach (abfd);
1027
1028 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
1029 | EF_PARISC_EXT | EF_PARISC_LSB
1030 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
1031 | EF_PARISC_LAZYSWAP);
1032
1033 if (mach == 10)
1034 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
1035 else if (mach == 11)
1036 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
1037 else if (mach == 20)
1038 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1039 else if (mach == 25)
1040 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1041 | EFA_PARISC_2_0
1042 /* The GNU tools have trapped without
1043 option since 1993, so need to take
1044 a step backwards with the ELF
1045 based toolchains. */
1046 | EF_PARISC_TRAPNIL);
1047}
1048
46fe4e66
AM
1049/* Comparison function for qsort to sort unwind section during a
1050 final link. */
1051
1052static int
1053hppa_unwind_entry_compare (a, b)
1054 const PTR a;
1055 const PTR b;
1056{
1057 const bfd_byte *ap, *bp;
1058 unsigned long av, bv;
1059
1060 ap = (const bfd_byte *) a;
1061 av = (unsigned long) ap[0] << 24;
1062 av |= (unsigned long) ap[1] << 16;
1063 av |= (unsigned long) ap[2] << 8;
1064 av |= (unsigned long) ap[3];
1065
1066 bp = (const bfd_byte *) b;
1067 bv = (unsigned long) bp[0] << 24;
1068 bv |= (unsigned long) bp[1] << 16;
1069 bv |= (unsigned long) bp[2] << 8;
1070 bv |= (unsigned long) bp[3];
1071
1072 return av < bv ? -1 : av > bv ? 1 : 0;
1073}
1074
1075static boolean elf_hppa_sort_unwind (abfd)
1076 bfd *abfd;
1077{
1078 asection *s;
1079
1080 /* Magic section names, but this is much safer than having
1081 relocate_section remember where SEGREL32 relocs occurred.
1082 Consider what happens if someone inept creates a linker script
1083 that puts unwind information in .text. */
1084 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1085 if (s != NULL)
1086 {
1087 bfd_size_type size;
1088 char *contents;
1089
1090 size = s->_raw_size;
1091 contents = bfd_malloc (size);
1092 if (contents == NULL)
1093 return false;
1094
1095 if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
1096 return false;
1097
1098 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1099
1100 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1101 return false;
1102 }
1103
1104 return true;
1105}
1106
49bd834c 1107#if ARCH_SIZE == 64
2eb429af
JL
1108/* Hook called by the linker routine which adds symbols from an object
1109 file. HP's libraries define symbols with HP specific section
1110 indices, which we have to handle. */
1111
1112static boolean
1113elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1114 bfd *abfd;
1115 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1116 const Elf_Internal_Sym *sym;
1117 const char **namep ATTRIBUTE_UNUSED;
1118 flagword *flagsp ATTRIBUTE_UNUSED;
1119 asection **secp;
1120 bfd_vma *valp;
1121{
1122 int index = sym->st_shndx;
be7582f3 1123
2eb429af
JL
1124 switch (index)
1125 {
1126 case SHN_PARISC_ANSI_COMMON:
1127 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1128 (*secp)->flags |= SEC_IS_COMMON;
1129 *valp = sym->st_size;
1130 break;
be7582f3 1131
2eb429af
JL
1132 case SHN_PARISC_HUGE_COMMON:
1133 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1134 (*secp)->flags |= SEC_IS_COMMON;
1135 *valp = sym->st_size;
1136 break;
1137 }
1138
1139 return true;
1140}
1141
af7dc644
JL
1142static boolean
1143elf_hppa_unmark_useless_dynamic_symbols (h, data)
1144 struct elf_link_hash_entry *h;
1145 PTR data;
1146{
1147 struct bfd_link_info *info = (struct bfd_link_info *)data;
1148
e92d460e
AM
1149 if (h->root.type == bfd_link_hash_warning)
1150 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1151
af7dc644
JL
1152 /* If we are not creating a shared library, and this symbol is
1153 referenced by a shared library but is not defined anywhere, then
1154 the generic code will warn that it is undefined.
1155
1156 This behavior is undesirable on HPs since the standard shared
3f9b03b5 1157 libraries contain references to undefined symbols.
af7dc644
JL
1158
1159 So we twiddle the flags associated with such symbols so that they
3f9b03b5 1160 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
1161
1162 Ultimately we should have better controls over the generic ELF BFD
1163 linker code. */
1164 if (! info->relocateable
1165 && ! (info->shared
1166 && !info->no_undefined)
1167 && h->root.type == bfd_link_hash_undefined
1168 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
1169 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
1170 {
1171 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
1172 h->elf_link_hash_flags |= 0x8000;
1173 }
1174
1175 return true;
1176}
1177
af7dc644
JL
1178static boolean
1179elf_hppa_remark_useless_dynamic_symbols (h, data)
1180 struct elf_link_hash_entry *h;
1181 PTR data;
1182{
1183 struct bfd_link_info *info = (struct bfd_link_info *)data;
1184
e92d460e
AM
1185 if (h->root.type == bfd_link_hash_warning)
1186 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1187
af7dc644
JL
1188 /* If we are not creating a shared library, and this symbol is
1189 referenced by a shared library but is not defined anywhere, then
1190 the generic code will warn that it is undefined.
1191
1192 This behavior is undesirable on HPs since the standard shared
1193 libraries contain reerences to undefined symbols.
1194
1195 So we twiddle the flags associated with such symbols so that they
228d307f 1196 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
1197
1198 Ultimately we should have better controls over the generic ELF BFD
1199 linker code. */
1200 if (! info->relocateable
1201 && ! (info->shared
1202 && !info->no_undefined)
1203 && h->root.type == bfd_link_hash_undefined
1204 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1205 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
1206 && (h->elf_link_hash_flags & 0x8000) != 0)
1207 {
1208 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
1209 h->elf_link_hash_flags &= ~0x8000;
1210 }
1211
1212 return true;
1213}
1214
1bf42538
JL
1215static boolean
1216elf_hppa_is_dynamic_loader_symbol (name)
1217 const char * name;
1218{
1219 return (! strcmp (name, "__CPU_REVISION")
1220 || ! strcmp (name, "__CPU_KEYBITS_1")
1221 || ! strcmp (name, "__SYSTEM_ID_D")
1222 || ! strcmp (name, "__FPU_MODEL")
1223 || ! strcmp (name, "__FPU_REVISION")
1224 || ! strcmp (name, "__ARGC")
1225 || ! strcmp (name, "__ARGV")
1226 || ! strcmp (name, "__ENVP")
1227 || ! strcmp (name, "__TLS_SIZE_D")
1228 || ! strcmp (name, "__LOAD_INFO")
1229 || ! strcmp (name, "__systab"));
1230}
1231
2ec0dd12
JL
1232/* Record the lowest address for the data and text segments. */
1233static void
1234elf_hppa_record_segment_addrs (abfd, section, data)
1235 bfd *abfd ATTRIBUTE_UNUSED;
1236 asection *section;
1237 PTR data;
1238{
1239 struct elf64_hppa_link_hash_table *hppa_info;
1240 bfd_vma value;
a7c10850 1241
2ec0dd12
JL
1242 hppa_info = (struct elf64_hppa_link_hash_table *)data;
1243
1244 value = section->vma - section->filepos;
1245
edd21aca 1246 if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
2ec0dd12
JL
1247 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1248 && value < hppa_info->text_segment_base)
1249 hppa_info->text_segment_base = value;
edd21aca
AM
1250 else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1251 == (SEC_ALLOC | SEC_LOAD))
1252 && value < hppa_info->data_segment_base)
2ec0dd12
JL
1253 hppa_info->data_segment_base = value;
1254}
1255
2eb429af
JL
1256/* Called after we have seen all the input files/sections, but before
1257 final symbol resolution and section placement has been determined.
1258
1259 We use this hook to (possibly) provide a value for __gp, then we
1260 fall back to the generic ELF final link routine. */
1261
1262static boolean
1263elf_hppa_final_link (abfd, info)
1264 bfd *abfd;
1265 struct bfd_link_info *info;
1266{
af7dc644 1267 boolean retval;
edd21aca 1268 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
af7dc644 1269
19ef5465 1270 if (! info->relocateable)
2eb429af 1271 {
2eb429af 1272 struct elf_link_hash_entry *gp;
19ef5465 1273 bfd_vma gp_val;
1209c612
JL
1274
1275 /* The linker script defines a value for __gp iff it was referenced
1276 by one of the objects being linked. First try to find the symbol
1277 in the hash table. If that fails, just compute the value __gp
1278 should have had. */
19ef5465
JL
1279 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
1280 false, false);
2eb429af 1281
1209c612
JL
1282 if (gp)
1283 {
1284
1285 /* Adjust the value of __gp as we may want to slide it into the
1286 .plt section so that the stubs can access PLT entries without
1287 using an addil sequence. */
edd21aca 1288 gp->root.u.def.value += hppa_info->gp_offset;
1209c612
JL
1289
1290 gp_val = (gp->root.u.def.section->output_section->vma
1291 + gp->root.u.def.section->output_offset
1292 + gp->root.u.def.value);
1293 }
1294 else
1295 {
1296 asection *sec;
1209c612
JL
1297
1298 /* First look for a .plt section. If found, then __gp is the
1299 address of the .plt + gp_offset.
1300
1301 If no .plt is found, then look for .dlt, .opd and .data (in
d663e1cd
JL
1302 that order) and set __gp to the base address of whichever
1303 section is found first. */
1209c612
JL
1304
1305 sec = hppa_info->plt_sec;
d663e1cd 1306 if (sec && ! (sec->flags & SEC_EXCLUDE))
1209c612
JL
1307 gp_val = (sec->output_offset
1308 + sec->output_section->vma
1309 + hppa_info->gp_offset);
1310 else
1311 {
1312 sec = hppa_info->dlt_sec;
d663e1cd 1313 if (!sec || (sec->flags & SEC_EXCLUDE))
1209c612 1314 sec = hppa_info->opd_sec;
d663e1cd 1315 if (!sec || (sec->flags & SEC_EXCLUDE))
1209c612 1316 sec = bfd_get_section_by_name (abfd, ".data");
d663e1cd 1317 if (!sec || (sec->flags & SEC_EXCLUDE))
1209c612
JL
1318 return false;
1319
1320 gp_val = sec->output_offset + sec->output_section->vma;
1321 }
1322 }
2eb429af 1323
1209c612 1324 /* Install whatever value we found/computed for __gp. */
2eb429af
JL
1325 _bfd_set_gp_value (abfd, gp_val);
1326 }
1327
2ec0dd12 1328 /* We need to know the base of the text and data segments so that we
edd21aca 1329 can perform SEGREL relocations. We will record the base addresses
2ec0dd12 1330 when we encounter the first SEGREL relocation. */
edd21aca
AM
1331 hppa_info->text_segment_base = (bfd_vma)-1;
1332 hppa_info->data_segment_base = (bfd_vma)-1;
2ec0dd12 1333
af7dc644
JL
1334 /* HP's shared libraries have references to symbols that are not
1335 defined anywhere. The generic ELF BFD linker code will complaim
1336 about such symbols.
1337
1338 So we detect the losing case and arrange for the flags on the symbol
1339 to indicate that it was never referenced. This keeps the generic
1340 ELF BFD link code happy and appears to not create any secondary
1341 problems. Ultimately we need a way to control the behavior of the
1342 generic ELF BFD link code better. */
1343 elf_link_hash_traverse (elf_hash_table (info),
1344 elf_hppa_unmark_useless_dynamic_symbols,
1345 info);
1346
2eb429af 1347 /* Invoke the regular ELF backend linker to do all the work. */
af7dc644
JL
1348 retval = bfd_elf_bfd_final_link (abfd, info);
1349
1350 elf_link_hash_traverse (elf_hash_table (info),
1351 elf_hppa_remark_useless_dynamic_symbols,
1352 info);
1353
46fe4e66
AM
1354 /* If we're producing a final executable, sort the contents of the
1355 unwind section. */
1356 if (retval)
1357 retval = elf_hppa_sort_unwind (abfd);
1358
af7dc644 1359 return retval;
2eb429af
JL
1360}
1361
1362/* Relocate an HPPA ELF section. */
1363
1364static boolean
1365elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
1366 contents, relocs, local_syms, local_sections)
1367 bfd *output_bfd;
1368 struct bfd_link_info *info;
1369 bfd *input_bfd;
1370 asection *input_section;
1371 bfd_byte *contents;
1372 Elf_Internal_Rela *relocs;
1373 Elf_Internal_Sym *local_syms;
1374 asection **local_sections;
1375{
1376 Elf_Internal_Shdr *symtab_hdr;
1377 Elf_Internal_Rela *rel;
1378 Elf_Internal_Rela *relend;
f0fe0e16
AM
1379 struct elf64_hppa_link_hash_table *hppa_info;
1380
1381 if (info->relocateable)
1382 return true;
2eb429af 1383
f0fe0e16 1384 hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1385 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1386
1387 rel = relocs;
1388 relend = relocs + input_section->reloc_count;
1389 for (; rel < relend; rel++)
1390 {
1391 int r_type;
b2e311df 1392 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af
JL
1393 unsigned long r_symndx;
1394 struct elf_link_hash_entry *h;
1395 Elf_Internal_Sym *sym;
1396 asection *sym_sec;
1397 bfd_vma relocation;
1398 bfd_reloc_status_type r;
1399 const char *sym_name;
edd21aca 1400 const char *dyn_name;
be7582f3
JL
1401 char *dynh_buf = NULL;
1402 size_t dynh_buflen = 0;
1403 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af
JL
1404
1405 r_type = ELF_R_TYPE (rel->r_info);
1406 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1407 {
1408 bfd_set_error (bfd_error_bad_value);
1409 return false;
1410 }
2eb429af 1411
2eb429af 1412 /* This is a final link. */
f0fe0e16 1413 r_symndx = ELF_R_SYM (rel->r_info);
2eb429af
JL
1414 h = NULL;
1415 sym = NULL;
1416 sym_sec = NULL;
1417 if (r_symndx < symtab_hdr->sh_info)
1418 {
be7582f3 1419 /* This is a local symbol. */
2eb429af
JL
1420 sym = local_syms + r_symndx;
1421 sym_sec = local_sections[r_symndx];
f8df10f4 1422 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
be7582f3
JL
1423
1424 /* If this symbol has an entry in the PA64 dynamic hash
1425 table, then get it. */
0ba2a60e 1426 dyn_name = get_dyn_name (input_section, h, rel,
be7582f3
JL
1427 &dynh_buf, &dynh_buflen);
1428 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1429 dyn_name, false, false);
1430
2eb429af
JL
1431 }
1432 else
1433 {
be7582f3 1434 /* This is not a local symbol. */
2eb429af
JL
1435 long indx;
1436
1437 indx = r_symndx - symtab_hdr->sh_info;
1438 h = elf_sym_hashes (input_bfd)[indx];
1439 while (h->root.type == bfd_link_hash_indirect
1440 || h->root.type == bfd_link_hash_warning)
1441 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1442 if (h->root.type == bfd_link_hash_defined
1443 || h->root.type == bfd_link_hash_defweak)
1444 {
1445 sym_sec = h->root.u.def.section;
be7582f3 1446
be7582f3
JL
1447 /* If this symbol has an entry in the PA64 dynamic hash
1448 table, then get it. */
0ba2a60e 1449 dyn_name = get_dyn_name (input_section, h, rel,
be7582f3
JL
1450 &dynh_buf, &dynh_buflen);
1451 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1452 dyn_name, false, false);
1453
1454 /* If we have a relocation against a symbol defined in a
1455 shared library and we have not created an entry in the
1456 PA64 dynamic symbol hash table for it, then we lose. */
1457 if (sym_sec->output_section == NULL && dyn_h == NULL)
1458 {
1459 (*_bfd_error_handler)
1460 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
8f615d07 1461 bfd_archive_filename (input_bfd), h->root.root.string,
be7582f3
JL
1462 bfd_get_section_name (input_bfd, input_section));
1463 relocation = 0;
1464 }
1465 else if (sym_sec->output_section)
1466 relocation = (h->root.u.def.value
1467 + sym_sec->output_offset
1468 + sym_sec->output_section->vma);
1469 /* Value will be provided via one of the offsets in the
1470 dyn_h hash table entry. */
1471 else
1472 relocation = 0;
2eb429af 1473 }
dfec422f 1474 /* Allow undefined symbols in shared libraries. */
46fe4e66 1475 else if (info->shared && !info->no_undefined
3a27a730 1476 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
dfec422f 1477 {
5cc7c785
L
1478 if (info->symbolic)
1479 (*info->callbacks->undefined_symbol)
1480 (info, h->root.root.string, input_bfd,
1481 input_section, rel->r_offset, false);
1482
dfec422f
JL
1483 /* If this symbol has an entry in the PA64 dynamic hash
1484 table, then get it. */
0ba2a60e 1485 dyn_name = get_dyn_name (input_section, h, rel,
dfec422f
JL
1486 &dynh_buf, &dynh_buflen);
1487 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1488 dyn_name, false, false);
1489
1490 if (dyn_h == NULL)
1491 {
1492 (*_bfd_error_handler)
1493 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
8f615d07 1494 bfd_archive_filename (input_bfd), h->root.root.string,
dfec422f
JL
1495 bfd_get_section_name (input_bfd, input_section));
1496 relocation = 0;
1497 }
1498 relocation = 0;
1499 }
2eb429af
JL
1500 else if (h->root.type == bfd_link_hash_undefweak)
1501 relocation = 0;
1502 else
1503 {
1bf42538
JL
1504 /* Ignore dynamic loader defined symbols. */
1505 if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1506 relocation = 0;
1507 else
1508 {
1509 if (!((*info->callbacks->undefined_symbol)
1510 (info, h->root.root.string, input_bfd,
1511 input_section, rel->r_offset, true)))
1512 return false;
1513 break;
1514 }
2eb429af
JL
1515 }
1516 }
1517
1518 if (h != NULL)
1519 sym_name = h->root.root.string;
1520 else
1521 {
1522 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1523 symtab_hdr->sh_link,
1524 sym->st_name);
1525 if (sym_name == NULL)
1526 return false;
1527 if (*sym_name == '\0')
1528 sym_name = bfd_section_name (input_bfd, sym_sec);
1529 }
1530
be7582f3 1531 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2eb429af 1532 input_section, contents,
be7582f3
JL
1533 relocation, info, sym_sec,
1534 h, dyn_h);
2eb429af
JL
1535
1536 if (r != bfd_reloc_ok)
1537 {
1538 switch (r)
1539 {
1540 default:
1541 abort ();
1542 case bfd_reloc_overflow:
1543 {
1544 if (!((*info->callbacks->reloc_overflow)
1545 (info, sym_name, howto->name, (bfd_vma) 0,
1546 input_bfd, input_section, rel->r_offset)))
1547 return false;
1548 }
1549 break;
1550 }
1551 }
1552 }
1553 return true;
1554}
1555
be7582f3 1556/* Compute the value for a relocation (REL) during a final link stage,
a7c10850 1557 then insert the value into the proper location in CONTENTS.
be7582f3
JL
1558
1559 VALUE is a tentative value for the relocation and may be overridden
1560 and modified here based on the specific relocation to be performed.
1561
1562 For example we do conversions for PC-relative branches in this routine
a7c10850 1563 or redirection of calls to external routines to stubs.
be7582f3
JL
1564
1565 The work of actually applying the relocation is left to a helper
1566 routine in an attempt to reduce the complexity and size of this
1567 function. */
2eb429af
JL
1568
1569static bfd_reloc_status_type
be7582f3
JL
1570elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1571 input_section, contents, value,
1572 info, sym_sec, h, dyn_h)
1573 Elf_Internal_Rela *rel;
2eb429af 1574 bfd *input_bfd;
be7582f3 1575 bfd *output_bfd;
2eb429af
JL
1576 asection *input_section;
1577 bfd_byte *contents;
2eb429af 1578 bfd_vma value;
2eb429af
JL
1579 struct bfd_link_info *info;
1580 asection *sym_sec;
edd21aca 1581 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
be7582f3 1582 struct elf64_hppa_dyn_hash_entry *dyn_h;
2eb429af 1583{
dc810e39 1584 int insn;
be7582f3 1585 bfd_vma offset = rel->r_offset;
dc810e39 1586 bfd_signed_vma addend = rel->r_addend;
be7582f3 1587 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3f9b03b5 1588 unsigned int r_type = howto->type;
2eb429af 1589 bfd_byte *hit_data = contents + offset;
be7582f3 1590 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1591
1592 insn = bfd_get_32 (input_bfd, hit_data);
1593
2eb429af
JL
1594 switch (r_type)
1595 {
1596 case R_PARISC_NONE:
1597 break;
1598
ba94744e 1599 /* Basic function call support.
3f9b03b5
AM
1600
1601 Note for a call to a function defined in another dynamic library
1602 we want to redirect the call to a stub. */
1603
571047ad 1604 /* Random PC relative relocs. */
b233eaab
JL
1605 case R_PARISC_PCREL21L:
1606 case R_PARISC_PCREL14R:
1607 case R_PARISC_PCREL14F:
571047ad
JL
1608 case R_PARISC_PCREL14WR:
1609 case R_PARISC_PCREL14DR:
1610 case R_PARISC_PCREL16F:
1611 case R_PARISC_PCREL16WF:
1612 case R_PARISC_PCREL16DF:
1613 {
571047ad
JL
1614 /* If this is a call to a function defined in another dynamic
1615 library, then redirect the call to the local stub for this
1616 function. */
dfec422f
JL
1617 if (sym_sec == NULL || sym_sec->output_section == NULL)
1618 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1619 + hppa_info->stub_sec->output_section->vma);
a7c10850 1620
571047ad
JL
1621 /* Turn VALUE into a proper PC relative address. */
1622 value -= (offset + input_section->output_offset
1623 + input_section->output_section->vma);
1624
1625 /* Adjust for any field selectors. */
3f9b03b5
AM
1626 if (r_type == R_PARISC_PCREL21L)
1627 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1628 else if (r_type == R_PARISC_PCREL14F
1629 || r_type == R_PARISC_PCREL16F
1630 || r_type == R_PARISC_PCREL16WF
1631 || r_type == R_PARISC_PCREL16DF)
1632 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1633 else
1634 value = hppa_field_adjust (value, -8 + addend, e_rsel);
571047ad
JL
1635
1636 /* Apply the relocation to the given instruction. */
dc810e39 1637 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
571047ad
JL
1638 break;
1639 }
1640
49bd834c 1641 case R_PARISC_PCREL12F:
2eb429af
JL
1642 case R_PARISC_PCREL22F:
1643 case R_PARISC_PCREL17F:
571047ad
JL
1644 case R_PARISC_PCREL22C:
1645 case R_PARISC_PCREL17C:
1646 case R_PARISC_PCREL17R:
2eb429af 1647 {
be7582f3
JL
1648 /* If this is a call to a function defined in another dynamic
1649 library, then redirect the call to the local stub for this
1650 function. */
dfec422f 1651 if (sym_sec == NULL || sym_sec->output_section == NULL)
6a0b9871
JL
1652 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1653 + hppa_info->stub_sec->output_section->vma);
a7c10850 1654
be7582f3
JL
1655 /* Turn VALUE into a proper PC relative address. */
1656 value -= (offset + input_section->output_offset
1657 + input_section->output_section->vma);
1658
1659 /* Adjust for any field selectors. */
70d72e0e
AM
1660 if (r_type == R_PARISC_PCREL17R)
1661 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1662 else
1663 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1664
be7582f3
JL
1665 /* All branches are implicitly shifted by 2 places. */
1666 value >>= 2;
2eb429af 1667
be7582f3 1668 /* Apply the relocation to the given instruction. */
dc810e39 1669 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
2eb429af
JL
1670 break;
1671 }
1672
be7582f3
JL
1673 /* Indirect references to data through the DLT. */
1674 case R_PARISC_DLTIND14R:
571047ad 1675 case R_PARISC_DLTIND14F:
be7582f3
JL
1676 case R_PARISC_DLTIND14DR:
1677 case R_PARISC_DLTIND14WR:
1678 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1679 case R_PARISC_LTOFF_FPTR14R:
1680 case R_PARISC_LTOFF_FPTR14DR:
1681 case R_PARISC_LTOFF_FPTR14WR:
1682 case R_PARISC_LTOFF_FPTR21L:
1683 case R_PARISC_LTOFF_FPTR16F:
1684 case R_PARISC_LTOFF_FPTR16WF:
1685 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1686 case R_PARISC_LTOFF_TP21L:
1687 case R_PARISC_LTOFF_TP14R:
1688 case R_PARISC_LTOFF_TP14F:
1689 case R_PARISC_LTOFF_TP14WR:
1690 case R_PARISC_LTOFF_TP14DR:
1691 case R_PARISC_LTOFF_TP16F:
1692 case R_PARISC_LTOFF_TP16WF:
1693 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1694 case R_PARISC_LTOFF16F:
1695 case R_PARISC_LTOFF16WF:
1696 case R_PARISC_LTOFF16DF:
c8933571 1697 {
6a0b9871 1698 /* If this relocation was against a local symbol, then we still
edd21aca 1699 have not set up the DLT entry (it's not convenient to do so
6a0b9871
JL
1700 in the "finalize_dlt" routine because it is difficult to get
1701 to the local symbol's value).
1702
1703 So, if this is a local symbol (h == NULL), then we need to
a7c10850 1704 fill in its DLT entry.
e48c661e
JL
1705
1706 Similarly we may still need to set up an entry in .opd for
1707 a local function which had its address taken. */
6a0b9871
JL
1708 if (dyn_h->h == NULL)
1709 {
1bf42538 1710 /* Now do .opd creation if needed. */
e48c661e
JL
1711 if (r_type == R_PARISC_LTOFF_FPTR14R
1712 || r_type == R_PARISC_LTOFF_FPTR14DR
1713 || r_type == R_PARISC_LTOFF_FPTR14WR
1714 || r_type == R_PARISC_LTOFF_FPTR21L
1715 || r_type == R_PARISC_LTOFF_FPTR16F
1716 || r_type == R_PARISC_LTOFF_FPTR16WF
1717 || r_type == R_PARISC_LTOFF_FPTR16DF)
1718 {
1719 /* The first two words of an .opd entry are zero. */
1720 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1721 0, 16);
1722
1723 /* The next word is the address of the function. */
1bf42538 1724 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1725 (hppa_info->opd_sec->contents
1726 + dyn_h->opd_offset + 16));
1727
1728 /* The last word is our local __gp value. */
1729 value = _bfd_get_gp_value
1730 (hppa_info->opd_sec->output_section->owner);
1731 bfd_put_64 (hppa_info->opd_sec->owner, value,
1732 (hppa_info->opd_sec->contents
1733 + dyn_h->opd_offset + 24));
1bf42538
JL
1734
1735 /* The DLT value is the address of the .opd entry. */
1736 value = (dyn_h->opd_offset
1737 + hppa_info->opd_sec->output_offset
1738 + hppa_info->opd_sec->output_section->vma);
1739 addend = 0;
e48c661e 1740 }
1bf42538
JL
1741
1742 bfd_put_64 (hppa_info->dlt_sec->owner,
1743 value + addend,
1744 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
6a0b9871
JL
1745 }
1746
be7582f3 1747 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1748 the symbol's actual address. Note that __gp may not point
1749 to the start of the DLT, so we have to compute the absolute
1750 address, then subtract out the value of __gp. */
1751 value = (dyn_h->dlt_offset
1752 + hppa_info->dlt_sec->output_offset
1753 + hppa_info->dlt_sec->output_section->vma);
1754 value -= _bfd_get_gp_value (output_bfd);
1755
be7582f3
JL
1756 /* All DLTIND relocations are basically the same at this point,
1757 except that we need different field selectors for the 21bit
1758 version vs the 14bit versions. */
e5bb3efc 1759 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1760 || r_type == R_PARISC_LTOFF_FPTR21L
1761 || r_type == R_PARISC_LTOFF_TP21L)
1bf42538 1762 value = hppa_field_adjust (value, 0, e_lsel);
571047ad
JL
1763 else if (r_type == R_PARISC_DLTIND14F
1764 || r_type == R_PARISC_LTOFF_FPTR16F
1765 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1766 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1767 || r_type == R_PARISC_LTOFF16F
1768 || r_type == R_PARISC_LTOFF16DF
1769 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1770 || r_type == R_PARISC_LTOFF_TP16F
1771 || r_type == R_PARISC_LTOFF_TP16WF
1772 || r_type == R_PARISC_LTOFF_TP16DF)
1bf42538 1773 value = hppa_field_adjust (value, 0, e_fsel);
be7582f3 1774 else
1bf42538 1775 value = hppa_field_adjust (value, 0, e_rsel);
be7582f3 1776
dc810e39 1777 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
c8933571
JL
1778 break;
1779 }
1780
be7582f3 1781 case R_PARISC_DLTREL14R:
571047ad 1782 case R_PARISC_DLTREL14F:
be7582f3
JL
1783 case R_PARISC_DLTREL14DR:
1784 case R_PARISC_DLTREL14WR:
c8933571 1785 case R_PARISC_DLTREL21L:
6849fb4d
JL
1786 case R_PARISC_DPREL21L:
1787 case R_PARISC_DPREL14WR:
1788 case R_PARISC_DPREL14DR:
1789 case R_PARISC_DPREL14R:
1790 case R_PARISC_DPREL14F:
1791 case R_PARISC_GPREL16F:
1792 case R_PARISC_GPREL16WF:
1793 case R_PARISC_GPREL16DF:
c8933571 1794 {
be7582f3
JL
1795 /* Subtract out the global pointer value to make value a DLT
1796 relative address. */
1797 value -= _bfd_get_gp_value (output_bfd);
1798
1799 /* All DLTREL relocations are basically the same at this point,
1800 except that we need different field selectors for the 21bit
1801 version vs the 14bit versions. */
6849fb4d
JL
1802 if (r_type == R_PARISC_DLTREL21L
1803 || r_type == R_PARISC_DPREL21L)
be7582f3 1804 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1805 else if (r_type == R_PARISC_DLTREL14F
1806 || r_type == R_PARISC_DPREL14F
1807 || r_type == R_PARISC_GPREL16F
1808 || r_type == R_PARISC_GPREL16WF
1809 || r_type == R_PARISC_GPREL16DF)
571047ad 1810 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1811 else
1812 value = hppa_field_adjust (value, addend, e_rrsel);
1813
dc810e39 1814 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
c8933571
JL
1815 break;
1816 }
1817
b7263961
JL
1818 case R_PARISC_DIR21L:
1819 case R_PARISC_DIR17R:
1820 case R_PARISC_DIR17F:
1821 case R_PARISC_DIR14R:
47d89dba 1822 case R_PARISC_DIR14F:
b7263961
JL
1823 case R_PARISC_DIR14WR:
1824 case R_PARISC_DIR14DR:
1825 case R_PARISC_DIR16F:
1826 case R_PARISC_DIR16WF:
1827 case R_PARISC_DIR16DF:
1828 {
1829 /* All DIR relocations are basically the same at this point,
70d72e0e
AM
1830 except that branch offsets need to be divided by four, and
1831 we need different field selectors. Note that we don't
1832 redirect absolute calls to local stubs. */
3f9b03b5 1833
b7263961
JL
1834 if (r_type == R_PARISC_DIR21L)
1835 value = hppa_field_adjust (value, addend, e_lrsel);
1836 else if (r_type == R_PARISC_DIR17F
1837 || r_type == R_PARISC_DIR16F
1838 || r_type == R_PARISC_DIR16WF
47d89dba
AM
1839 || r_type == R_PARISC_DIR16DF
1840 || r_type == R_PARISC_DIR14F)
b7263961
JL
1841 value = hppa_field_adjust (value, addend, e_fsel);
1842 else
1843 value = hppa_field_adjust (value, addend, e_rrsel);
1844
70d72e0e
AM
1845 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1846 {
1847 /* All branches are implicitly shifted by 2 places. */
1848 value >>= 2;
1849 }
1850
dc810e39 1851 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
b7263961
JL
1852 break;
1853 }
1854
8267b155
JL
1855 case R_PARISC_PLTOFF21L:
1856 case R_PARISC_PLTOFF14R:
1857 case R_PARISC_PLTOFF14F:
1858 case R_PARISC_PLTOFF14WR:
1859 case R_PARISC_PLTOFF14DR:
1860 case R_PARISC_PLTOFF16F:
1861 case R_PARISC_PLTOFF16WF:
1862 case R_PARISC_PLTOFF16DF:
1863 {
1864 /* We want the value of the PLT offset for this symbol, not
19ef5465
JL
1865 the symbol's actual address. Note that __gp may not point
1866 to the start of the DLT, so we have to compute the absolute
1867 address, then subtract out the value of __gp. */
1868 value = (dyn_h->plt_offset
1869 + hppa_info->plt_sec->output_offset
1870 + hppa_info->plt_sec->output_section->vma);
1871 value -= _bfd_get_gp_value (output_bfd);
8267b155
JL
1872
1873 /* All PLTOFF relocations are basically the same at this point,
1874 except that we need different field selectors for the 21bit
1875 version vs the 14bit versions. */
1876 if (r_type == R_PARISC_PLTOFF21L)
1877 value = hppa_field_adjust (value, addend, e_lrsel);
1878 else if (r_type == R_PARISC_PLTOFF14F
1879 || r_type == R_PARISC_PLTOFF16F
1880 || r_type == R_PARISC_PLTOFF16WF
1881 || r_type == R_PARISC_PLTOFF16DF)
1882 value = hppa_field_adjust (value, addend, e_fsel);
1883 else
1884 value = hppa_field_adjust (value, addend, e_rrsel);
1885
dc810e39 1886 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
8267b155
JL
1887 break;
1888 }
1889
e5bb3efc
JL
1890 case R_PARISC_LTOFF_FPTR32:
1891 {
e48c661e
JL
1892 /* We may still need to create the FPTR itself if it was for
1893 a local symbol. */
1894 if (dyn_h->h == NULL)
1895 {
1896 /* The first two words of an .opd entry are zero. */
1897 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1898
1899 /* The next word is the address of the function. */
1bf42538 1900 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1901 (hppa_info->opd_sec->contents
1902 + dyn_h->opd_offset + 16));
1903
1904 /* The last word is our local __gp value. */
1905 value = _bfd_get_gp_value
1906 (hppa_info->opd_sec->output_section->owner);
1907 bfd_put_64 (hppa_info->opd_sec->owner, value,
1908 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1bf42538
JL
1909
1910 /* The DLT value is the address of the .opd entry. */
1911 value = (dyn_h->opd_offset
1912 + hppa_info->opd_sec->output_offset
1913 + hppa_info->opd_sec->output_section->vma);
1914
1915 bfd_put_64 (hppa_info->dlt_sec->owner,
1916 value,
1917 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1918 }
1919
e5bb3efc 1920 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1921 the symbol's actual address. Note that __gp may not point
1922 to the start of the DLT, so we have to compute the absolute
1923 address, then subtract out the value of __gp. */
1924 value = (dyn_h->dlt_offset
1925 + hppa_info->dlt_sec->output_offset
1926 + hppa_info->dlt_sec->output_section->vma);
1927 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1928 bfd_put_32 (input_bfd, value, hit_data);
1929 return bfd_reloc_ok;
1930 }
1931
e5bb3efc 1932 case R_PARISC_LTOFF_FPTR64:
b233eaab 1933 case R_PARISC_LTOFF_TP64:
e5bb3efc 1934 {
e48c661e
JL
1935 /* We may still need to create the FPTR itself if it was for
1936 a local symbol. */
1937 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1938 {
1939 /* The first two words of an .opd entry are zero. */
1940 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1941
1942 /* The next word is the address of the function. */
1bf42538 1943 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1944 (hppa_info->opd_sec->contents
1945 + dyn_h->opd_offset + 16));
1946
1947 /* The last word is our local __gp value. */
1948 value = _bfd_get_gp_value
1949 (hppa_info->opd_sec->output_section->owner);
1950 bfd_put_64 (hppa_info->opd_sec->owner, value,
1951 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1bf42538
JL
1952
1953 /* The DLT value is the address of the .opd entry. */
1954 value = (dyn_h->opd_offset
1955 + hppa_info->opd_sec->output_offset
1956 + hppa_info->opd_sec->output_section->vma);
1957
1958 bfd_put_64 (hppa_info->dlt_sec->owner,
1959 value,
1960 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1961 }
1962
e5bb3efc 1963 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1964 the symbol's actual address. Note that __gp may not point
1965 to the start of the DLT, so we have to compute the absolute
1966 address, then subtract out the value of __gp. */
1967 value = (dyn_h->dlt_offset
1968 + hppa_info->dlt_sec->output_offset
1969 + hppa_info->dlt_sec->output_section->vma);
1970 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1971 bfd_put_64 (input_bfd, value, hit_data);
1972 return bfd_reloc_ok;
1973 }
1974
1975 case R_PARISC_DIR32:
571047ad 1976 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1977 return bfd_reloc_ok;
1978
1979 case R_PARISC_DIR64:
571047ad 1980 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1981 return bfd_reloc_ok;
1982
6849fb4d
JL
1983 case R_PARISC_GPREL64:
1984 /* Subtract out the global pointer value to make value a DLT
1985 relative address. */
1986 value -= _bfd_get_gp_value (output_bfd);
6849fb4d
JL
1987
1988 bfd_put_64 (input_bfd, value + addend, hit_data);
1989 return bfd_reloc_ok;
1990
b7263961 1991 case R_PARISC_LTOFF64:
19ef5465
JL
1992 /* We want the value of the DLT offset for this symbol, not
1993 the symbol's actual address. Note that __gp may not point
1994 to the start of the DLT, so we have to compute the absolute
1995 address, then subtract out the value of __gp. */
1996 value = (dyn_h->dlt_offset
1997 + hppa_info->dlt_sec->output_offset
1998 + hppa_info->dlt_sec->output_section->vma);
1999 value -= _bfd_get_gp_value (output_bfd);
b7263961
JL
2000
2001 bfd_put_64 (input_bfd, value + addend, hit_data);
2002 return bfd_reloc_ok;
2003
571047ad
JL
2004 case R_PARISC_PCREL32:
2005 {
2006 /* If this is a call to a function defined in another dynamic
2007 library, then redirect the call to the local stub for this
2008 function. */
dfec422f
JL
2009 if (sym_sec == NULL || sym_sec->output_section == NULL)
2010 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2011 + hppa_info->stub_sec->output_section->vma);
a7c10850 2012
571047ad
JL
2013 /* Turn VALUE into a proper PC relative address. */
2014 value -= (offset + input_section->output_offset
2015 + input_section->output_section->vma);
2016
b233eaab 2017 value += addend;
571047ad 2018 value -= 8;
edd21aca 2019 bfd_put_32 (input_bfd, value, hit_data);
571047ad
JL
2020 return bfd_reloc_ok;
2021 }
2022
2023 case R_PARISC_PCREL64:
2024 {
2025 /* If this is a call to a function defined in another dynamic
2026 library, then redirect the call to the local stub for this
2027 function. */
dfec422f
JL
2028 if (sym_sec == NULL || sym_sec->output_section == NULL)
2029 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2030 + hppa_info->stub_sec->output_section->vma);
a7c10850 2031
571047ad
JL
2032 /* Turn VALUE into a proper PC relative address. */
2033 value -= (offset + input_section->output_offset
2034 + input_section->output_section->vma);
2035
b233eaab 2036 value += addend;
571047ad
JL
2037 value -= 8;
2038 bfd_put_64 (input_bfd, value, hit_data);
2039 return bfd_reloc_ok;
2040 }
2041
e5bb3efc 2042 case R_PARISC_FPTR64:
e48c661e
JL
2043 {
2044 /* We may still need to create the FPTR itself if it was for
2045 a local symbol. */
2046 if (dyn_h->h == NULL)
2047 {
2048 /* The first two words of an .opd entry are zero. */
2049 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2050
2051 /* The next word is the address of the function. */
1bf42538 2052 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
2053 (hppa_info->opd_sec->contents
2054 + dyn_h->opd_offset + 16));
2055
2056 /* The last word is our local __gp value. */
2057 value = _bfd_get_gp_value
2058 (hppa_info->opd_sec->output_section->owner);
2059 bfd_put_64 (hppa_info->opd_sec->owner, value,
2060 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2061 }
2062
d663e1cd
JL
2063 if (dyn_h->want_opd)
2064 /* We want the value of the OPD offset for this symbol. */
2065 value = (dyn_h->opd_offset
2066 + hppa_info->opd_sec->output_offset
2067 + hppa_info->opd_sec->output_section->vma);
2068 else
2069 /* We want the address of the symbol. */
2070 value += addend;
a7c10850 2071
1bf42538 2072 bfd_put_64 (input_bfd, value, hit_data);
e48c661e
JL
2073 return bfd_reloc_ok;
2074 }
e5bb3efc 2075
228d307f
JL
2076 case R_PARISC_SECREL32:
2077 bfd_put_32 (input_bfd,
edd21aca 2078 value + addend - sym_sec->output_section->vma,
228d307f
JL
2079 hit_data);
2080 return bfd_reloc_ok;
2081
2082 case R_PARISC_SEGREL32:
2ec0dd12
JL
2083 case R_PARISC_SEGREL64:
2084 {
2085 /* If this is the first SEGREL relocation, then initialize
2086 the segment base values. */
2087 if (hppa_info->text_segment_base == (bfd_vma) -1)
2088 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
edd21aca 2089 hppa_info);
2ec0dd12
JL
2090
2091 /* VALUE holds the absolute address. We want to include the
2092 addend, then turn it into a segment relative address.
2093
2094 The segment is derived from SYM_SEC. We assume that there are
2095 only two segments of note in the resulting executable/shlib.
2096 A readonly segment (.text) and a readwrite segment (.data). */
2097 value += addend;
2098
2099 if (sym_sec->flags & SEC_CODE)
2100 value -= hppa_info->text_segment_base;
2101 else
2102 value -= hppa_info->data_segment_base;
2103
2104 if (r_type == R_PARISC_SEGREL32)
2105 bfd_put_32 (input_bfd, value, hit_data);
2106 else
2107 bfd_put_64 (input_bfd, value, hit_data);
46fe4e66 2108 return bfd_reloc_ok;
2ec0dd12 2109 }
228d307f 2110
2eb429af
JL
2111 /* Something we don't know how to handle. */
2112 default:
228d307f 2113 return bfd_reloc_notsupported;
2eb429af
JL
2114 }
2115
2116 /* Update the instruction word. */
dc810e39 2117 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
edd21aca 2118 return bfd_reloc_ok;
2eb429af
JL
2119}
2120
be7582f3
JL
2121/* Relocate the given INSN. VALUE should be the actual value we want
2122 to insert into the instruction, ie by this point we should not be
2123 concerned with computing an offset relative to the DLT, PC, etc.
2124 Instead this routine is meant to handle the bit manipulations needed
2125 to insert the relocation into the given instruction. */
2eb429af 2126
dc810e39 2127static int
be7582f3 2128elf_hppa_relocate_insn (insn, sym_value, r_type)
dc810e39
AM
2129 int insn;
2130 int sym_value;
3f9b03b5 2131 unsigned int r_type;
2eb429af 2132{
c8933571 2133 switch (r_type)
2eb429af 2134 {
49bd834c 2135 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
be7582f3 2136 the "B" instruction. */
c8933571 2137 case R_PARISC_PCREL22F:
571047ad 2138 case R_PARISC_PCREL22C:
dc810e39 2139 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2eb429af 2140
49bd834c
AM
2141 /* This is any 12 bit branch. */
2142 case R_PARISC_PCREL12F:
dc810e39 2143 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
49bd834c
AM
2144
2145 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
2146 to the "B" instruction as well as BE. */
be7582f3 2147 case R_PARISC_PCREL17F:
c8933571 2148 case R_PARISC_DIR17F:
b7263961 2149 case R_PARISC_DIR17R:
571047ad
JL
2150 case R_PARISC_PCREL17C:
2151 case R_PARISC_PCREL17R:
dc810e39 2152 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2eb429af 2153
be7582f3 2154 /* ADDIL or LDIL instructions. */
c8933571 2155 case R_PARISC_DLTREL21L:
be7582f3 2156 case R_PARISC_DLTIND21L:
e5bb3efc 2157 case R_PARISC_LTOFF_FPTR21L:
b233eaab
JL
2158 case R_PARISC_PCREL21L:
2159 case R_PARISC_LTOFF_TP21L:
6849fb4d 2160 case R_PARISC_DPREL21L:
8267b155 2161 case R_PARISC_PLTOFF21L:
b7263961 2162 case R_PARISC_DIR21L:
dc810e39 2163 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
be7582f3 2164
49bd834c 2165 /* LDO and integer loads/stores with 14 bit displacements. */
c8933571 2166 case R_PARISC_DLTREL14R:
084d930b 2167 case R_PARISC_DLTREL14F:
be7582f3
JL
2168 case R_PARISC_DLTIND14R:
2169 case R_PARISC_DLTIND14F:
e5bb3efc 2170 case R_PARISC_LTOFF_FPTR14R:
b233eaab 2171 case R_PARISC_PCREL14R:
571047ad 2172 case R_PARISC_PCREL14F:
b233eaab
JL
2173 case R_PARISC_LTOFF_TP14R:
2174 case R_PARISC_LTOFF_TP14F:
6849fb4d
JL
2175 case R_PARISC_DPREL14R:
2176 case R_PARISC_DPREL14F:
8267b155
JL
2177 case R_PARISC_PLTOFF14R:
2178 case R_PARISC_PLTOFF14F:
b7263961 2179 case R_PARISC_DIR14R:
47d89dba 2180 case R_PARISC_DIR14F:
ba94744e
AM
2181 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2182
2183 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
2184 case R_PARISC_LTOFF_FPTR16F:
2185 case R_PARISC_PCREL16F:
2186 case R_PARISC_LTOFF_TP16F:
2187 case R_PARISC_GPREL16F:
2188 case R_PARISC_PLTOFF16F:
b7263961
JL
2189 case R_PARISC_DIR16F:
2190 case R_PARISC_LTOFF16F:
ba94744e 2191 return (insn & ~0xffff) | re_assemble_16 (sym_value);
be7582f3 2192
49bd834c 2193 /* Doubleword loads and stores with a 14 bit displacement. */
11c19a4e 2194 case R_PARISC_DLTREL14DR:
be7582f3 2195 case R_PARISC_DLTIND14DR:
e5bb3efc
JL
2196 case R_PARISC_LTOFF_FPTR14DR:
2197 case R_PARISC_LTOFF_FPTR16DF:
571047ad
JL
2198 case R_PARISC_PCREL14DR:
2199 case R_PARISC_PCREL16DF:
b233eaab
JL
2200 case R_PARISC_LTOFF_TP14DR:
2201 case R_PARISC_LTOFF_TP16DF:
6849fb4d
JL
2202 case R_PARISC_DPREL14DR:
2203 case R_PARISC_GPREL16DF:
8267b155
JL
2204 case R_PARISC_PLTOFF14DR:
2205 case R_PARISC_PLTOFF16DF:
b7263961
JL
2206 case R_PARISC_DIR14DR:
2207 case R_PARISC_DIR16DF:
2208 case R_PARISC_LTOFF16DF:
dc810e39
AM
2209 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2210 | ((sym_value & 0x1ff8) << 1));
11c19a4e 2211
be7582f3 2212 /* Floating point single word load/store instructions. */
11c19a4e 2213 case R_PARISC_DLTREL14WR:
be7582f3 2214 case R_PARISC_DLTIND14WR:
e5bb3efc
JL
2215 case R_PARISC_LTOFF_FPTR14WR:
2216 case R_PARISC_LTOFF_FPTR16WF:
571047ad
JL
2217 case R_PARISC_PCREL14WR:
2218 case R_PARISC_PCREL16WF:
b233eaab
JL
2219 case R_PARISC_LTOFF_TP14WR:
2220 case R_PARISC_LTOFF_TP16WF:
6849fb4d
JL
2221 case R_PARISC_DPREL14WR:
2222 case R_PARISC_GPREL16WF:
8267b155
JL
2223 case R_PARISC_PLTOFF14WR:
2224 case R_PARISC_PLTOFF16WF:
b7263961
JL
2225 case R_PARISC_DIR16WF:
2226 case R_PARISC_DIR14WR:
2227 case R_PARISC_LTOFF16WF:
dc810e39
AM
2228 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2229 | ((sym_value & 0x1ffc) << 1));
be7582f3 2230
2eb429af
JL
2231 default:
2232 return insn;
2233 }
2234}
3f9b03b5 2235#endif
This page took 0.255616 seconds and 4 git commands to generate.