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