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