Add new bitfield 'want_p_paddr_set_to_zero'.
[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 if (bfd_get_mach (abfd) < 25)
815 final_type = R_PARISC_PCREL14F;
816 else
817 final_type = R_PARISC_PCREL16F;
818 break;
819 default:
820 return R_PARISC_NONE;
821 }
822 break;
823
824 case 17:
825 switch (field)
826 {
827 case e_rsel:
828 case e_rrsel:
829 case e_rdsel:
830 final_type = R_PARISC_PCREL17R;
831 break;
832 case e_fsel:
833 final_type = R_PARISC_PCREL17F;
834 break;
835 default:
836 return R_PARISC_NONE;
837 }
838 break;
839
840 case 21:
841 switch (field)
842 {
843 case e_lsel:
844 case e_lrsel:
845 case e_ldsel:
846 case e_nlsel:
847 case e_nlrsel:
848 final_type = R_PARISC_PCREL21L;
849 break;
850 default:
851 return R_PARISC_NONE;
852 }
853 break;
854
855 case 22:
856 switch (field)
857 {
858 case e_fsel:
859 final_type = R_PARISC_PCREL22F;
860 break;
861 default:
862 return R_PARISC_NONE;
863 }
864 break;
865
866 default:
867 return R_PARISC_NONE;
868 }
869 break;
870
871 case R_PARISC_GNU_VTENTRY:
872 case R_PARISC_GNU_VTINHERIT:
873 case R_PARISC_SEGREL32:
874 case R_PARISC_SEGBASE:
875 /* The defaults are fine for these cases. */
876 break;
877
878 default:
879 return R_PARISC_NONE;
880 }
881
882 return final_type;
883 }
884
885 /* Return one (or more) BFD relocations which implement the base
886 relocation with modifications based on format and field. */
887
888 elf_hppa_reloc_type **
889 _bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
890 bfd *abfd;
891 elf_hppa_reloc_type base_type;
892 int format;
893 unsigned int field;
894 int ignore ATTRIBUTE_UNUSED;
895 asymbol *sym ATTRIBUTE_UNUSED;
896 {
897 elf_hppa_reloc_type *finaltype;
898 elf_hppa_reloc_type **final_types;
899 bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
900
901 /* Allocate slots for the BFD relocation. */
902 final_types = (elf_hppa_reloc_type **) bfd_alloc (abfd, amt);
903 if (final_types == NULL)
904 return NULL;
905
906 /* Allocate space for the relocation itself. */
907 amt = sizeof (elf_hppa_reloc_type);
908 finaltype = (elf_hppa_reloc_type *) bfd_alloc (abfd, amt);
909 if (finaltype == NULL)
910 return NULL;
911
912 /* Some reasonable defaults. */
913 final_types[0] = finaltype;
914 final_types[1] = NULL;
915
916 *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
917
918 return final_types;
919 }
920
921 /* Translate from an elf into field into a howto relocation pointer. */
922
923 static void
924 elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
925 bfd *abfd ATTRIBUTE_UNUSED;
926 arelent *bfd_reloc;
927 Elf_Internal_Rela *elf_reloc;
928 {
929 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
930 < (unsigned int) R_PARISC_UNIMPLEMENTED);
931 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
932 }
933
934 /* Translate from an elf into field into a howto relocation pointer. */
935
936 static void
937 elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
938 bfd *abfd ATTRIBUTE_UNUSED;
939 arelent *bfd_reloc;
940 Elf_Internal_Rel *elf_reloc;
941 {
942 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
943 < (unsigned int) R_PARISC_UNIMPLEMENTED);
944 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
945 }
946
947 /* Return the address of the howto table entry to perform the CODE
948 relocation for an ARCH machine. */
949
950 static reloc_howto_type *
951 elf_hppa_reloc_type_lookup (abfd, code)
952 bfd *abfd ATTRIBUTE_UNUSED;
953 bfd_reloc_code_real_type code;
954 {
955 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
956 {
957 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
958 return &elf_hppa_howto_table[(int) code];
959 }
960 return NULL;
961 }
962
963 /* Return true if SYM represents a local label symbol. */
964
965 static boolean
966 elf_hppa_is_local_label_name (abfd, name)
967 bfd *abfd ATTRIBUTE_UNUSED;
968 const char *name;
969 {
970 if (name[0] == 'L' && name[1] == '$')
971 return 1;
972 return _bfd_elf_is_local_label_name (abfd, name);
973 }
974
975 /* Set the correct type for an ELF section. We do this by the
976 section name, which is a hack, but ought to work. */
977
978 static boolean
979 elf_hppa_fake_sections (abfd, hdr, sec)
980 bfd *abfd;
981 elf_hppa_internal_shdr *hdr;
982 asection *sec;
983 {
984 register const char *name;
985
986 name = bfd_get_section_name (abfd, sec);
987
988 if (strcmp (name, ".PARISC.unwind") == 0)
989 {
990 int indx;
991 asection *asec;
992 #if ARCH_SIZE == 64
993 hdr->sh_type = SHT_LOPROC + 1;
994 #else
995 hdr->sh_type = 1;
996 #endif
997 /* ?!? How are unwinds supposed to work for symbols in arbitrary
998 sections? Or what if we have multiple .text sections in a single
999 .o file? HP really messed up on this one.
1000
1001 Ugh. We can not use elf_section_data (sec)->this_idx at this
1002 point because it is not initialized yet.
1003
1004 So we (gasp) recompute it here. Hopefully nobody ever changes the
1005 way sections are numbered in elf.c! */
1006 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
1007 {
1008 if (asec->name && strcmp (asec->name, ".text") == 0)
1009 {
1010 hdr->sh_info = indx;
1011 break;
1012 }
1013 }
1014
1015 /* I have no idea if this is really necessary or what it means. */
1016 hdr->sh_entsize = 4;
1017 }
1018 return true;
1019 }
1020
1021 static void
1022 elf_hppa_final_write_processing (abfd, linker)
1023 bfd *abfd;
1024 boolean linker ATTRIBUTE_UNUSED;
1025 {
1026 int mach = bfd_get_mach (abfd);
1027
1028 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
1029 | EF_PARISC_EXT | EF_PARISC_LSB
1030 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
1031 | EF_PARISC_LAZYSWAP);
1032
1033 if (mach == 10)
1034 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
1035 else if (mach == 11)
1036 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
1037 else if (mach == 20)
1038 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1039 else if (mach == 25)
1040 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1041 | EFA_PARISC_2_0
1042 /* The GNU tools have trapped without
1043 option since 1993, so need to take
1044 a step backwards with the ELF
1045 based toolchains. */
1046 | EF_PARISC_TRAPNIL);
1047 }
1048
1049 /* Comparison function for qsort to sort unwind section during a
1050 final link. */
1051
1052 static int
1053 hppa_unwind_entry_compare (a, b)
1054 const PTR a;
1055 const PTR b;
1056 {
1057 const bfd_byte *ap, *bp;
1058 unsigned long av, bv;
1059
1060 ap = (const bfd_byte *) a;
1061 av = (unsigned long) ap[0] << 24;
1062 av |= (unsigned long) ap[1] << 16;
1063 av |= (unsigned long) ap[2] << 8;
1064 av |= (unsigned long) ap[3];
1065
1066 bp = (const bfd_byte *) b;
1067 bv = (unsigned long) bp[0] << 24;
1068 bv |= (unsigned long) bp[1] << 16;
1069 bv |= (unsigned long) bp[2] << 8;
1070 bv |= (unsigned long) bp[3];
1071
1072 return av < bv ? -1 : av > bv ? 1 : 0;
1073 }
1074
1075 static boolean elf_hppa_sort_unwind (abfd)
1076 bfd *abfd;
1077 {
1078 asection *s;
1079
1080 /* Magic section names, but this is much safer than having
1081 relocate_section remember where SEGREL32 relocs occurred.
1082 Consider what happens if someone inept creates a linker script
1083 that puts unwind information in .text. */
1084 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1085 if (s != NULL)
1086 {
1087 bfd_size_type size;
1088 char *contents;
1089
1090 size = s->_raw_size;
1091 contents = bfd_malloc (size);
1092 if (contents == NULL)
1093 return false;
1094
1095 if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
1096 return false;
1097
1098 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1099
1100 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1101 return false;
1102 }
1103
1104 return true;
1105 }
1106
1107 #if ARCH_SIZE == 64
1108 /* Hook called by the linker routine which adds symbols from an object
1109 file. HP's libraries define symbols with HP specific section
1110 indices, which we have to handle. */
1111
1112 static boolean
1113 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1114 bfd *abfd;
1115 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1116 const Elf_Internal_Sym *sym;
1117 const char **namep ATTRIBUTE_UNUSED;
1118 flagword *flagsp ATTRIBUTE_UNUSED;
1119 asection **secp;
1120 bfd_vma *valp;
1121 {
1122 int index = sym->st_shndx;
1123
1124 switch (index)
1125 {
1126 case SHN_PARISC_ANSI_COMMON:
1127 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1128 (*secp)->flags |= SEC_IS_COMMON;
1129 *valp = sym->st_size;
1130 break;
1131
1132 case SHN_PARISC_HUGE_COMMON:
1133 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1134 (*secp)->flags |= SEC_IS_COMMON;
1135 *valp = sym->st_size;
1136 break;
1137 }
1138
1139 return true;
1140 }
1141
1142 static boolean
1143 elf_hppa_unmark_useless_dynamic_symbols (h, data)
1144 struct elf_link_hash_entry *h;
1145 PTR data;
1146 {
1147 struct bfd_link_info *info = (struct bfd_link_info *)data;
1148
1149 if (h->root.type == bfd_link_hash_warning)
1150 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1151
1152 /* If we are not creating a shared library, and this symbol is
1153 referenced by a shared library but is not defined anywhere, then
1154 the generic code will warn that it is undefined.
1155
1156 This behavior is undesirable on HPs since the standard shared
1157 libraries contain references to undefined symbols.
1158
1159 So we twiddle the flags associated with such symbols so that they
1160 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1161
1162 Ultimately we should have better controls over the generic ELF BFD
1163 linker code. */
1164 if (! info->relocateable
1165 && ! (info->shared
1166 && !info->no_undefined)
1167 && h->root.type == bfd_link_hash_undefined
1168 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
1169 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
1170 {
1171 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
1172 h->elf_link_hash_flags |= 0x8000;
1173 }
1174
1175 return true;
1176 }
1177
1178 static boolean
1179 elf_hppa_remark_useless_dynamic_symbols (h, data)
1180 struct elf_link_hash_entry *h;
1181 PTR data;
1182 {
1183 struct bfd_link_info *info = (struct bfd_link_info *)data;
1184
1185 if (h->root.type == bfd_link_hash_warning)
1186 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1187
1188 /* If we are not creating a shared library, and this symbol is
1189 referenced by a shared library but is not defined anywhere, then
1190 the generic code will warn that it is undefined.
1191
1192 This behavior is undesirable on HPs since the standard shared
1193 libraries contain reerences to undefined symbols.
1194
1195 So we twiddle the flags associated with such symbols so that they
1196 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1197
1198 Ultimately we should have better controls over the generic ELF BFD
1199 linker code. */
1200 if (! info->relocateable
1201 && ! (info->shared
1202 && !info->no_undefined)
1203 && h->root.type == bfd_link_hash_undefined
1204 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1205 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
1206 && (h->elf_link_hash_flags & 0x8000) != 0)
1207 {
1208 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
1209 h->elf_link_hash_flags &= ~0x8000;
1210 }
1211
1212 return true;
1213 }
1214
1215 static boolean
1216 elf_hppa_is_dynamic_loader_symbol (name)
1217 const char * name;
1218 {
1219 return (! strcmp (name, "__CPU_REVISION")
1220 || ! strcmp (name, "__CPU_KEYBITS_1")
1221 || ! strcmp (name, "__SYSTEM_ID_D")
1222 || ! strcmp (name, "__FPU_MODEL")
1223 || ! strcmp (name, "__FPU_REVISION")
1224 || ! strcmp (name, "__ARGC")
1225 || ! strcmp (name, "__ARGV")
1226 || ! strcmp (name, "__ENVP")
1227 || ! strcmp (name, "__TLS_SIZE_D")
1228 || ! strcmp (name, "__LOAD_INFO")
1229 || ! strcmp (name, "__systab"));
1230 }
1231
1232 /* Record the lowest address for the data and text segments. */
1233 static void
1234 elf_hppa_record_segment_addrs (abfd, section, data)
1235 bfd *abfd ATTRIBUTE_UNUSED;
1236 asection *section;
1237 PTR data;
1238 {
1239 struct elf64_hppa_link_hash_table *hppa_info;
1240 bfd_vma value;
1241
1242 hppa_info = (struct elf64_hppa_link_hash_table *)data;
1243
1244 value = section->vma - section->filepos;
1245
1246 if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1247 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1248 && value < hppa_info->text_segment_base)
1249 hppa_info->text_segment_base = value;
1250 else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1251 == (SEC_ALLOC | SEC_LOAD))
1252 && value < hppa_info->data_segment_base)
1253 hppa_info->data_segment_base = value;
1254 }
1255
1256 /* Called after we have seen all the input files/sections, but before
1257 final symbol resolution and section placement has been determined.
1258
1259 We use this hook to (possibly) provide a value for __gp, then we
1260 fall back to the generic ELF final link routine. */
1261
1262 static boolean
1263 elf_hppa_final_link (abfd, info)
1264 bfd *abfd;
1265 struct bfd_link_info *info;
1266 {
1267 boolean retval;
1268 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1269
1270 if (! info->relocateable)
1271 {
1272 struct elf_link_hash_entry *gp;
1273 bfd_vma gp_val;
1274
1275 /* The linker script defines a value for __gp iff it was referenced
1276 by one of the objects being linked. First try to find the symbol
1277 in the hash table. If that fails, just compute the value __gp
1278 should have had. */
1279 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
1280 false, false);
1281
1282 if (gp)
1283 {
1284
1285 /* Adjust the value of __gp as we may want to slide it into the
1286 .plt section so that the stubs can access PLT entries without
1287 using an addil sequence. */
1288 gp->root.u.def.value += hppa_info->gp_offset;
1289
1290 gp_val = (gp->root.u.def.section->output_section->vma
1291 + gp->root.u.def.section->output_offset
1292 + gp->root.u.def.value);
1293 }
1294 else
1295 {
1296 asection *sec;
1297
1298 /* First look for a .plt section. If found, then __gp is the
1299 address of the .plt + gp_offset.
1300
1301 If no .plt is found, then look for .dlt, .opd and .data (in
1302 that order) and set __gp to the base address of whichever
1303 section is found first. */
1304
1305 sec = hppa_info->plt_sec;
1306 if (sec && ! (sec->flags & SEC_EXCLUDE))
1307 gp_val = (sec->output_offset
1308 + sec->output_section->vma
1309 + hppa_info->gp_offset);
1310 else
1311 {
1312 sec = hppa_info->dlt_sec;
1313 if (!sec || (sec->flags & SEC_EXCLUDE))
1314 sec = hppa_info->opd_sec;
1315 if (!sec || (sec->flags & SEC_EXCLUDE))
1316 sec = bfd_get_section_by_name (abfd, ".data");
1317 if (!sec || (sec->flags & SEC_EXCLUDE))
1318 return false;
1319
1320 gp_val = sec->output_offset + sec->output_section->vma;
1321 }
1322 }
1323
1324 /* Install whatever value we found/computed for __gp. */
1325 _bfd_set_gp_value (abfd, gp_val);
1326 }
1327
1328 /* We need to know the base of the text and data segments so that we
1329 can perform SEGREL relocations. We will record the base addresses
1330 when we encounter the first SEGREL relocation. */
1331 hppa_info->text_segment_base = (bfd_vma)-1;
1332 hppa_info->data_segment_base = (bfd_vma)-1;
1333
1334 /* HP's shared libraries have references to symbols that are not
1335 defined anywhere. The generic ELF BFD linker code will complaim
1336 about such symbols.
1337
1338 So we detect the losing case and arrange for the flags on the symbol
1339 to indicate that it was never referenced. This keeps the generic
1340 ELF BFD link code happy and appears to not create any secondary
1341 problems. Ultimately we need a way to control the behavior of the
1342 generic ELF BFD link code better. */
1343 elf_link_hash_traverse (elf_hash_table (info),
1344 elf_hppa_unmark_useless_dynamic_symbols,
1345 info);
1346
1347 /* Invoke the regular ELF backend linker to do all the work. */
1348 retval = bfd_elf_bfd_final_link (abfd, info);
1349
1350 elf_link_hash_traverse (elf_hash_table (info),
1351 elf_hppa_remark_useless_dynamic_symbols,
1352 info);
1353
1354 /* If we're producing a final executable, sort the contents of the
1355 unwind section. */
1356 if (retval)
1357 retval = elf_hppa_sort_unwind (abfd);
1358
1359 return retval;
1360 }
1361
1362 /* Relocate an HPPA ELF section. */
1363
1364 static boolean
1365 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
1366 contents, relocs, local_syms, local_sections)
1367 bfd *output_bfd;
1368 struct bfd_link_info *info;
1369 bfd *input_bfd;
1370 asection *input_section;
1371 bfd_byte *contents;
1372 Elf_Internal_Rela *relocs;
1373 Elf_Internal_Sym *local_syms;
1374 asection **local_sections;
1375 {
1376 Elf_Internal_Shdr *symtab_hdr;
1377 Elf_Internal_Rela *rel;
1378 Elf_Internal_Rela *relend;
1379 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1380
1381 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1382
1383 rel = relocs;
1384 relend = relocs + input_section->reloc_count;
1385 for (; rel < relend; rel++)
1386 {
1387 int r_type;
1388 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1389 unsigned long r_symndx;
1390 struct elf_link_hash_entry *h;
1391 Elf_Internal_Sym *sym;
1392 asection *sym_sec;
1393 bfd_vma relocation;
1394 bfd_reloc_status_type r;
1395 const char *sym_name;
1396 const char *dyn_name;
1397 char *dynh_buf = NULL;
1398 size_t dynh_buflen = 0;
1399 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
1400
1401 r_type = ELF_R_TYPE (rel->r_info);
1402 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1403 {
1404 bfd_set_error (bfd_error_bad_value);
1405 return false;
1406 }
1407
1408 r_symndx = ELF_R_SYM (rel->r_info);
1409
1410 if (info->relocateable)
1411 {
1412 /* This is a relocateable link. We don't have to change
1413 anything, unless the reloc is against a section symbol,
1414 in which case we have to adjust according to where the
1415 section symbol winds up in the output section. */
1416 if (r_symndx < symtab_hdr->sh_info)
1417 {
1418 sym = local_syms + r_symndx;
1419 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1420 {
1421 sym_sec = local_sections[r_symndx];
1422 rel->r_addend += sym_sec->output_offset;
1423 }
1424 }
1425
1426 continue;
1427 }
1428
1429 /* This is a final link. */
1430 h = NULL;
1431 sym = NULL;
1432 sym_sec = NULL;
1433 if (r_symndx < symtab_hdr->sh_info)
1434 {
1435 /* This is a local symbol. */
1436 sym = local_syms + r_symndx;
1437 sym_sec = local_sections[r_symndx];
1438 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
1439
1440 /* If this symbol has an entry in the PA64 dynamic hash
1441 table, then get it. */
1442 dyn_name = get_dyn_name (input_section, h, rel,
1443 &dynh_buf, &dynh_buflen);
1444 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1445 dyn_name, false, false);
1446
1447 }
1448 else
1449 {
1450 /* This is not a local symbol. */
1451 long indx;
1452
1453 indx = r_symndx - symtab_hdr->sh_info;
1454 h = elf_sym_hashes (input_bfd)[indx];
1455 while (h->root.type == bfd_link_hash_indirect
1456 || h->root.type == bfd_link_hash_warning)
1457 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1458 if (h->root.type == bfd_link_hash_defined
1459 || h->root.type == bfd_link_hash_defweak)
1460 {
1461 sym_sec = h->root.u.def.section;
1462
1463 /* If this symbol has an entry in the PA64 dynamic hash
1464 table, then get it. */
1465 dyn_name = get_dyn_name (input_section, h, rel,
1466 &dynh_buf, &dynh_buflen);
1467 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1468 dyn_name, false, false);
1469
1470 /* If we have a relocation against a symbol defined in a
1471 shared library and we have not created an entry in the
1472 PA64 dynamic symbol hash table for it, then we lose. */
1473 if (sym_sec->output_section == NULL && dyn_h == NULL)
1474 {
1475 (*_bfd_error_handler)
1476 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1477 bfd_archive_filename (input_bfd), h->root.root.string,
1478 bfd_get_section_name (input_bfd, input_section));
1479 relocation = 0;
1480 }
1481 else if (sym_sec->output_section)
1482 relocation = (h->root.u.def.value
1483 + sym_sec->output_offset
1484 + sym_sec->output_section->vma);
1485 /* Value will be provided via one of the offsets in the
1486 dyn_h hash table entry. */
1487 else
1488 relocation = 0;
1489 }
1490 /* Allow undefined symbols in shared libraries. */
1491 else if (info->shared && !info->no_undefined
1492 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1493 {
1494 if (info->symbolic)
1495 (*info->callbacks->undefined_symbol)
1496 (info, h->root.root.string, input_bfd,
1497 input_section, rel->r_offset, false);
1498
1499 /* If this symbol has an entry in the PA64 dynamic hash
1500 table, then get it. */
1501 dyn_name = get_dyn_name (input_section, h, rel,
1502 &dynh_buf, &dynh_buflen);
1503 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1504 dyn_name, false, false);
1505
1506 if (dyn_h == NULL)
1507 {
1508 (*_bfd_error_handler)
1509 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1510 bfd_archive_filename (input_bfd), h->root.root.string,
1511 bfd_get_section_name (input_bfd, input_section));
1512 relocation = 0;
1513 }
1514 relocation = 0;
1515 }
1516 else if (h->root.type == bfd_link_hash_undefweak)
1517 relocation = 0;
1518 else
1519 {
1520 /* Ignore dynamic loader defined symbols. */
1521 if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1522 relocation = 0;
1523 else
1524 {
1525 if (!((*info->callbacks->undefined_symbol)
1526 (info, h->root.root.string, input_bfd,
1527 input_section, rel->r_offset, true)))
1528 return false;
1529 break;
1530 }
1531 }
1532 }
1533
1534 if (h != NULL)
1535 sym_name = h->root.root.string;
1536 else
1537 {
1538 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1539 symtab_hdr->sh_link,
1540 sym->st_name);
1541 if (sym_name == NULL)
1542 return false;
1543 if (*sym_name == '\0')
1544 sym_name = bfd_section_name (input_bfd, sym_sec);
1545 }
1546
1547 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1548 input_section, contents,
1549 relocation, info, sym_sec,
1550 h, dyn_h);
1551
1552 if (r != bfd_reloc_ok)
1553 {
1554 switch (r)
1555 {
1556 default:
1557 abort ();
1558 case bfd_reloc_overflow:
1559 {
1560 if (!((*info->callbacks->reloc_overflow)
1561 (info, sym_name, howto->name, (bfd_vma) 0,
1562 input_bfd, input_section, rel->r_offset)))
1563 return false;
1564 }
1565 break;
1566 }
1567 }
1568 }
1569 return true;
1570 }
1571
1572 /* Compute the value for a relocation (REL) during a final link stage,
1573 then insert the value into the proper location in CONTENTS.
1574
1575 VALUE is a tentative value for the relocation and may be overridden
1576 and modified here based on the specific relocation to be performed.
1577
1578 For example we do conversions for PC-relative branches in this routine
1579 or redirection of calls to external routines to stubs.
1580
1581 The work of actually applying the relocation is left to a helper
1582 routine in an attempt to reduce the complexity and size of this
1583 function. */
1584
1585 static bfd_reloc_status_type
1586 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1587 input_section, contents, value,
1588 info, sym_sec, h, dyn_h)
1589 Elf_Internal_Rela *rel;
1590 bfd *input_bfd;
1591 bfd *output_bfd;
1592 asection *input_section;
1593 bfd_byte *contents;
1594 bfd_vma value;
1595 struct bfd_link_info *info;
1596 asection *sym_sec;
1597 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
1598 struct elf64_hppa_dyn_hash_entry *dyn_h;
1599 {
1600 int insn;
1601 bfd_vma offset = rel->r_offset;
1602 bfd_signed_vma addend = rel->r_addend;
1603 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1604 unsigned int r_type = howto->type;
1605 bfd_byte *hit_data = contents + offset;
1606 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1607
1608 insn = bfd_get_32 (input_bfd, hit_data);
1609
1610 switch (r_type)
1611 {
1612 case R_PARISC_NONE:
1613 break;
1614
1615 /* Basic function call support.
1616
1617 Note for a call to a function defined in another dynamic library
1618 we want to redirect the call to a stub. */
1619
1620 /* Random PC relative relocs. */
1621 case R_PARISC_PCREL21L:
1622 case R_PARISC_PCREL14R:
1623 case R_PARISC_PCREL14F:
1624 case R_PARISC_PCREL14WR:
1625 case R_PARISC_PCREL14DR:
1626 case R_PARISC_PCREL16F:
1627 case R_PARISC_PCREL16WF:
1628 case R_PARISC_PCREL16DF:
1629 {
1630 /* If this is a call to a function defined in another dynamic
1631 library, then redirect the call to the local stub for this
1632 function. */
1633 if (sym_sec == NULL || sym_sec->output_section == NULL)
1634 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1635 + hppa_info->stub_sec->output_section->vma);
1636
1637 /* Turn VALUE into a proper PC relative address. */
1638 value -= (offset + input_section->output_offset
1639 + input_section->output_section->vma);
1640
1641 /* Adjust for any field selectors. */
1642 if (r_type == R_PARISC_PCREL21L)
1643 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1644 else if (r_type == R_PARISC_PCREL14F
1645 || r_type == R_PARISC_PCREL16F
1646 || r_type == R_PARISC_PCREL16WF
1647 || r_type == R_PARISC_PCREL16DF)
1648 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1649 else
1650 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1651
1652 /* Apply the relocation to the given instruction. */
1653 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1654 break;
1655 }
1656
1657 case R_PARISC_PCREL12F:
1658 case R_PARISC_PCREL22F:
1659 case R_PARISC_PCREL17F:
1660 case R_PARISC_PCREL22C:
1661 case R_PARISC_PCREL17C:
1662 case R_PARISC_PCREL17R:
1663 {
1664 /* If this is a call to a function defined in another dynamic
1665 library, then redirect the call to the local stub for this
1666 function. */
1667 if (sym_sec == NULL || sym_sec->output_section == NULL)
1668 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1669 + hppa_info->stub_sec->output_section->vma);
1670
1671 /* Turn VALUE into a proper PC relative address. */
1672 value -= (offset + input_section->output_offset
1673 + input_section->output_section->vma);
1674
1675 /* Adjust for any field selectors. */
1676 if (r_type == R_PARISC_PCREL17R)
1677 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1678 else
1679 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1680
1681 /* All branches are implicitly shifted by 2 places. */
1682 value >>= 2;
1683
1684 /* Apply the relocation to the given instruction. */
1685 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1686 break;
1687 }
1688
1689 /* Indirect references to data through the DLT. */
1690 case R_PARISC_DLTIND14R:
1691 case R_PARISC_DLTIND14F:
1692 case R_PARISC_DLTIND14DR:
1693 case R_PARISC_DLTIND14WR:
1694 case R_PARISC_DLTIND21L:
1695 case R_PARISC_LTOFF_FPTR14R:
1696 case R_PARISC_LTOFF_FPTR14DR:
1697 case R_PARISC_LTOFF_FPTR14WR:
1698 case R_PARISC_LTOFF_FPTR21L:
1699 case R_PARISC_LTOFF_FPTR16F:
1700 case R_PARISC_LTOFF_FPTR16WF:
1701 case R_PARISC_LTOFF_FPTR16DF:
1702 case R_PARISC_LTOFF_TP21L:
1703 case R_PARISC_LTOFF_TP14R:
1704 case R_PARISC_LTOFF_TP14F:
1705 case R_PARISC_LTOFF_TP14WR:
1706 case R_PARISC_LTOFF_TP14DR:
1707 case R_PARISC_LTOFF_TP16F:
1708 case R_PARISC_LTOFF_TP16WF:
1709 case R_PARISC_LTOFF_TP16DF:
1710 case R_PARISC_LTOFF16F:
1711 case R_PARISC_LTOFF16WF:
1712 case R_PARISC_LTOFF16DF:
1713 {
1714 /* If this relocation was against a local symbol, then we still
1715 have not set up the DLT entry (it's not convenient to do so
1716 in the "finalize_dlt" routine because it is difficult to get
1717 to the local symbol's value).
1718
1719 So, if this is a local symbol (h == NULL), then we need to
1720 fill in its DLT entry.
1721
1722 Similarly we may still need to set up an entry in .opd for
1723 a local function which had its address taken. */
1724 if (dyn_h->h == NULL)
1725 {
1726 /* Now do .opd creation if needed. */
1727 if (r_type == R_PARISC_LTOFF_FPTR14R
1728 || r_type == R_PARISC_LTOFF_FPTR14DR
1729 || r_type == R_PARISC_LTOFF_FPTR14WR
1730 || r_type == R_PARISC_LTOFF_FPTR21L
1731 || r_type == R_PARISC_LTOFF_FPTR16F
1732 || r_type == R_PARISC_LTOFF_FPTR16WF
1733 || r_type == R_PARISC_LTOFF_FPTR16DF)
1734 {
1735 /* The first two words of an .opd entry are zero. */
1736 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1737 0, 16);
1738
1739 /* The next word is the address of the function. */
1740 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1741 (hppa_info->opd_sec->contents
1742 + dyn_h->opd_offset + 16));
1743
1744 /* The last word is our local __gp value. */
1745 value = _bfd_get_gp_value
1746 (hppa_info->opd_sec->output_section->owner);
1747 bfd_put_64 (hppa_info->opd_sec->owner, value,
1748 (hppa_info->opd_sec->contents
1749 + dyn_h->opd_offset + 24));
1750
1751 /* The DLT value is the address of the .opd entry. */
1752 value = (dyn_h->opd_offset
1753 + hppa_info->opd_sec->output_offset
1754 + hppa_info->opd_sec->output_section->vma);
1755 addend = 0;
1756 }
1757
1758 bfd_put_64 (hppa_info->dlt_sec->owner,
1759 value + addend,
1760 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1761 }
1762
1763 /* We want the value of the DLT offset for this symbol, not
1764 the symbol's actual address. Note that __gp may not point
1765 to the start of the DLT, so we have to compute the absolute
1766 address, then subtract out the value of __gp. */
1767 value = (dyn_h->dlt_offset
1768 + hppa_info->dlt_sec->output_offset
1769 + hppa_info->dlt_sec->output_section->vma);
1770 value -= _bfd_get_gp_value (output_bfd);
1771
1772 /* All DLTIND relocations are basically the same at this point,
1773 except that we need different field selectors for the 21bit
1774 version vs the 14bit versions. */
1775 if (r_type == R_PARISC_DLTIND21L
1776 || r_type == R_PARISC_LTOFF_FPTR21L
1777 || r_type == R_PARISC_LTOFF_TP21L)
1778 value = hppa_field_adjust (value, 0, e_lsel);
1779 else if (r_type == R_PARISC_DLTIND14F
1780 || r_type == R_PARISC_LTOFF_FPTR16F
1781 || r_type == R_PARISC_LTOFF_FPTR16WF
1782 || r_type == R_PARISC_LTOFF_FPTR16DF
1783 || r_type == R_PARISC_LTOFF16F
1784 || r_type == R_PARISC_LTOFF16DF
1785 || r_type == R_PARISC_LTOFF16WF
1786 || r_type == R_PARISC_LTOFF_TP16F
1787 || r_type == R_PARISC_LTOFF_TP16WF
1788 || r_type == R_PARISC_LTOFF_TP16DF)
1789 value = hppa_field_adjust (value, 0, e_fsel);
1790 else
1791 value = hppa_field_adjust (value, 0, e_rsel);
1792
1793 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1794 break;
1795 }
1796
1797 case R_PARISC_DLTREL14R:
1798 case R_PARISC_DLTREL14F:
1799 case R_PARISC_DLTREL14DR:
1800 case R_PARISC_DLTREL14WR:
1801 case R_PARISC_DLTREL21L:
1802 case R_PARISC_DPREL21L:
1803 case R_PARISC_DPREL14WR:
1804 case R_PARISC_DPREL14DR:
1805 case R_PARISC_DPREL14R:
1806 case R_PARISC_DPREL14F:
1807 case R_PARISC_GPREL16F:
1808 case R_PARISC_GPREL16WF:
1809 case R_PARISC_GPREL16DF:
1810 {
1811 /* Subtract out the global pointer value to make value a DLT
1812 relative address. */
1813 value -= _bfd_get_gp_value (output_bfd);
1814
1815 /* All DLTREL relocations are basically the same at this point,
1816 except that we need different field selectors for the 21bit
1817 version vs the 14bit versions. */
1818 if (r_type == R_PARISC_DLTREL21L
1819 || r_type == R_PARISC_DPREL21L)
1820 value = hppa_field_adjust (value, addend, e_lrsel);
1821 else if (r_type == R_PARISC_DLTREL14F
1822 || r_type == R_PARISC_DPREL14F
1823 || r_type == R_PARISC_GPREL16F
1824 || r_type == R_PARISC_GPREL16WF
1825 || r_type == R_PARISC_GPREL16DF)
1826 value = hppa_field_adjust (value, addend, e_fsel);
1827 else
1828 value = hppa_field_adjust (value, addend, e_rrsel);
1829
1830 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1831 break;
1832 }
1833
1834 case R_PARISC_DIR21L:
1835 case R_PARISC_DIR17R:
1836 case R_PARISC_DIR17F:
1837 case R_PARISC_DIR14R:
1838 case R_PARISC_DIR14F:
1839 case R_PARISC_DIR14WR:
1840 case R_PARISC_DIR14DR:
1841 case R_PARISC_DIR16F:
1842 case R_PARISC_DIR16WF:
1843 case R_PARISC_DIR16DF:
1844 {
1845 /* All DIR relocations are basically the same at this point,
1846 except that branch offsets need to be divided by four, and
1847 we need different field selectors. Note that we don't
1848 redirect absolute calls to local stubs. */
1849
1850 if (r_type == R_PARISC_DIR21L)
1851 value = hppa_field_adjust (value, addend, e_lrsel);
1852 else if (r_type == R_PARISC_DIR17F
1853 || r_type == R_PARISC_DIR16F
1854 || r_type == R_PARISC_DIR16WF
1855 || r_type == R_PARISC_DIR16DF
1856 || r_type == R_PARISC_DIR14F)
1857 value = hppa_field_adjust (value, addend, e_fsel);
1858 else
1859 value = hppa_field_adjust (value, addend, e_rrsel);
1860
1861 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1862 {
1863 /* All branches are implicitly shifted by 2 places. */
1864 value >>= 2;
1865 }
1866
1867 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1868 break;
1869 }
1870
1871 case R_PARISC_PLTOFF21L:
1872 case R_PARISC_PLTOFF14R:
1873 case R_PARISC_PLTOFF14F:
1874 case R_PARISC_PLTOFF14WR:
1875 case R_PARISC_PLTOFF14DR:
1876 case R_PARISC_PLTOFF16F:
1877 case R_PARISC_PLTOFF16WF:
1878 case R_PARISC_PLTOFF16DF:
1879 {
1880 /* We want the value of the PLT offset for this symbol, not
1881 the symbol's actual address. Note that __gp may not point
1882 to the start of the DLT, so we have to compute the absolute
1883 address, then subtract out the value of __gp. */
1884 value = (dyn_h->plt_offset
1885 + hppa_info->plt_sec->output_offset
1886 + hppa_info->plt_sec->output_section->vma);
1887 value -= _bfd_get_gp_value (output_bfd);
1888
1889 /* All PLTOFF relocations are basically the same at this point,
1890 except that we need different field selectors for the 21bit
1891 version vs the 14bit versions. */
1892 if (r_type == R_PARISC_PLTOFF21L)
1893 value = hppa_field_adjust (value, addend, e_lrsel);
1894 else if (r_type == R_PARISC_PLTOFF14F
1895 || r_type == R_PARISC_PLTOFF16F
1896 || r_type == R_PARISC_PLTOFF16WF
1897 || r_type == R_PARISC_PLTOFF16DF)
1898 value = hppa_field_adjust (value, addend, e_fsel);
1899 else
1900 value = hppa_field_adjust (value, addend, e_rrsel);
1901
1902 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1903 break;
1904 }
1905
1906 case R_PARISC_LTOFF_FPTR32:
1907 {
1908 /* We may still need to create the FPTR itself if it was for
1909 a local symbol. */
1910 if (dyn_h->h == NULL)
1911 {
1912 /* The first two words of an .opd entry are zero. */
1913 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1914
1915 /* The next word is the address of the function. */
1916 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1917 (hppa_info->opd_sec->contents
1918 + dyn_h->opd_offset + 16));
1919
1920 /* The last word is our local __gp value. */
1921 value = _bfd_get_gp_value
1922 (hppa_info->opd_sec->output_section->owner);
1923 bfd_put_64 (hppa_info->opd_sec->owner, value,
1924 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1925
1926 /* The DLT value is the address of the .opd entry. */
1927 value = (dyn_h->opd_offset
1928 + hppa_info->opd_sec->output_offset
1929 + hppa_info->opd_sec->output_section->vma);
1930
1931 bfd_put_64 (hppa_info->dlt_sec->owner,
1932 value,
1933 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1934 }
1935
1936 /* We want the value of the DLT offset for this symbol, not
1937 the symbol's actual address. Note that __gp may not point
1938 to the start of the DLT, so we have to compute the absolute
1939 address, then subtract out the value of __gp. */
1940 value = (dyn_h->dlt_offset
1941 + hppa_info->dlt_sec->output_offset
1942 + hppa_info->dlt_sec->output_section->vma);
1943 value -= _bfd_get_gp_value (output_bfd);
1944 bfd_put_32 (input_bfd, value, hit_data);
1945 return bfd_reloc_ok;
1946 }
1947
1948 case R_PARISC_LTOFF_FPTR64:
1949 case R_PARISC_LTOFF_TP64:
1950 {
1951 /* We may still need to create the FPTR itself if it was for
1952 a local symbol. */
1953 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1954 {
1955 /* The first two words of an .opd entry are zero. */
1956 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1957
1958 /* The next word is the address of the function. */
1959 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1960 (hppa_info->opd_sec->contents
1961 + dyn_h->opd_offset + 16));
1962
1963 /* The last word is our local __gp value. */
1964 value = _bfd_get_gp_value
1965 (hppa_info->opd_sec->output_section->owner);
1966 bfd_put_64 (hppa_info->opd_sec->owner, value,
1967 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1968
1969 /* The DLT value is the address of the .opd entry. */
1970 value = (dyn_h->opd_offset
1971 + hppa_info->opd_sec->output_offset
1972 + hppa_info->opd_sec->output_section->vma);
1973
1974 bfd_put_64 (hppa_info->dlt_sec->owner,
1975 value,
1976 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1977 }
1978
1979 /* We want the value of the DLT offset for this symbol, not
1980 the symbol's actual address. Note that __gp may not point
1981 to the start of the DLT, so we have to compute the absolute
1982 address, then subtract out the value of __gp. */
1983 value = (dyn_h->dlt_offset
1984 + hppa_info->dlt_sec->output_offset
1985 + hppa_info->dlt_sec->output_section->vma);
1986 value -= _bfd_get_gp_value (output_bfd);
1987 bfd_put_64 (input_bfd, value, hit_data);
1988 return bfd_reloc_ok;
1989 }
1990
1991 case R_PARISC_DIR32:
1992 bfd_put_32 (input_bfd, value + addend, hit_data);
1993 return bfd_reloc_ok;
1994
1995 case R_PARISC_DIR64:
1996 bfd_put_64 (input_bfd, value + addend, hit_data);
1997 return bfd_reloc_ok;
1998
1999 case R_PARISC_GPREL64:
2000 /* Subtract out the global pointer value to make value a DLT
2001 relative address. */
2002 value -= _bfd_get_gp_value (output_bfd);
2003
2004 bfd_put_64 (input_bfd, value + addend, hit_data);
2005 return bfd_reloc_ok;
2006
2007 case R_PARISC_LTOFF64:
2008 /* We want the value of the DLT offset for this symbol, not
2009 the symbol's actual address. Note that __gp may not point
2010 to the start of the DLT, so we have to compute the absolute
2011 address, then subtract out the value of __gp. */
2012 value = (dyn_h->dlt_offset
2013 + hppa_info->dlt_sec->output_offset
2014 + hppa_info->dlt_sec->output_section->vma);
2015 value -= _bfd_get_gp_value (output_bfd);
2016
2017 bfd_put_64 (input_bfd, value + addend, hit_data);
2018 return bfd_reloc_ok;
2019
2020 case R_PARISC_PCREL32:
2021 {
2022 /* If this is a call to a function defined in another dynamic
2023 library, then redirect the call to the local stub for this
2024 function. */
2025 if (sym_sec == NULL || sym_sec->output_section == NULL)
2026 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2027 + hppa_info->stub_sec->output_section->vma);
2028
2029 /* Turn VALUE into a proper PC relative address. */
2030 value -= (offset + input_section->output_offset
2031 + input_section->output_section->vma);
2032
2033 value += addend;
2034 value -= 8;
2035 bfd_put_32 (input_bfd, value, hit_data);
2036 return bfd_reloc_ok;
2037 }
2038
2039 case R_PARISC_PCREL64:
2040 {
2041 /* If this is a call to a function defined in another dynamic
2042 library, then redirect the call to the local stub for this
2043 function. */
2044 if (sym_sec == NULL || sym_sec->output_section == NULL)
2045 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2046 + hppa_info->stub_sec->output_section->vma);
2047
2048 /* Turn VALUE into a proper PC relative address. */
2049 value -= (offset + input_section->output_offset
2050 + input_section->output_section->vma);
2051
2052 value += addend;
2053 value -= 8;
2054 bfd_put_64 (input_bfd, value, hit_data);
2055 return bfd_reloc_ok;
2056 }
2057
2058 case R_PARISC_FPTR64:
2059 {
2060 /* We may still need to create the FPTR itself if it was for
2061 a local symbol. */
2062 if (dyn_h->h == NULL)
2063 {
2064 /* The first two words of an .opd entry are zero. */
2065 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2066
2067 /* The next word is the address of the function. */
2068 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
2069 (hppa_info->opd_sec->contents
2070 + dyn_h->opd_offset + 16));
2071
2072 /* The last word is our local __gp value. */
2073 value = _bfd_get_gp_value
2074 (hppa_info->opd_sec->output_section->owner);
2075 bfd_put_64 (hppa_info->opd_sec->owner, value,
2076 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2077 }
2078
2079 if (dyn_h->want_opd)
2080 /* We want the value of the OPD offset for this symbol. */
2081 value = (dyn_h->opd_offset
2082 + hppa_info->opd_sec->output_offset
2083 + hppa_info->opd_sec->output_section->vma);
2084 else
2085 /* We want the address of the symbol. */
2086 value += addend;
2087
2088 bfd_put_64 (input_bfd, value, hit_data);
2089 return bfd_reloc_ok;
2090 }
2091
2092 case R_PARISC_SECREL32:
2093 bfd_put_32 (input_bfd,
2094 value + addend - sym_sec->output_section->vma,
2095 hit_data);
2096 return bfd_reloc_ok;
2097
2098 case R_PARISC_SEGREL32:
2099 case R_PARISC_SEGREL64:
2100 {
2101 /* If this is the first SEGREL relocation, then initialize
2102 the segment base values. */
2103 if (hppa_info->text_segment_base == (bfd_vma) -1)
2104 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
2105 hppa_info);
2106
2107 /* VALUE holds the absolute address. We want to include the
2108 addend, then turn it into a segment relative address.
2109
2110 The segment is derived from SYM_SEC. We assume that there are
2111 only two segments of note in the resulting executable/shlib.
2112 A readonly segment (.text) and a readwrite segment (.data). */
2113 value += addend;
2114
2115 if (sym_sec->flags & SEC_CODE)
2116 value -= hppa_info->text_segment_base;
2117 else
2118 value -= hppa_info->data_segment_base;
2119
2120 if (r_type == R_PARISC_SEGREL32)
2121 bfd_put_32 (input_bfd, value, hit_data);
2122 else
2123 bfd_put_64 (input_bfd, value, hit_data);
2124 return bfd_reloc_ok;
2125 }
2126
2127 /* Something we don't know how to handle. */
2128 default:
2129 return bfd_reloc_notsupported;
2130 }
2131
2132 /* Update the instruction word. */
2133 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
2134 return bfd_reloc_ok;
2135 }
2136
2137 /* Relocate the given INSN. VALUE should be the actual value we want
2138 to insert into the instruction, ie by this point we should not be
2139 concerned with computing an offset relative to the DLT, PC, etc.
2140 Instead this routine is meant to handle the bit manipulations needed
2141 to insert the relocation into the given instruction. */
2142
2143 static int
2144 elf_hppa_relocate_insn (insn, sym_value, r_type)
2145 int insn;
2146 int sym_value;
2147 unsigned int r_type;
2148 {
2149 switch (r_type)
2150 {
2151 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
2152 the "B" instruction. */
2153 case R_PARISC_PCREL22F:
2154 case R_PARISC_PCREL22C:
2155 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2156
2157 /* This is any 12 bit branch. */
2158 case R_PARISC_PCREL12F:
2159 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2160
2161 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
2162 to the "B" instruction as well as BE. */
2163 case R_PARISC_PCREL17F:
2164 case R_PARISC_DIR17F:
2165 case R_PARISC_DIR17R:
2166 case R_PARISC_PCREL17C:
2167 case R_PARISC_PCREL17R:
2168 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2169
2170 /* ADDIL or LDIL instructions. */
2171 case R_PARISC_DLTREL21L:
2172 case R_PARISC_DLTIND21L:
2173 case R_PARISC_LTOFF_FPTR21L:
2174 case R_PARISC_PCREL21L:
2175 case R_PARISC_LTOFF_TP21L:
2176 case R_PARISC_DPREL21L:
2177 case R_PARISC_PLTOFF21L:
2178 case R_PARISC_DIR21L:
2179 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2180
2181 /* LDO and integer loads/stores with 14 bit displacements. */
2182 case R_PARISC_DLTREL14R:
2183 case R_PARISC_DLTREL14F:
2184 case R_PARISC_DLTIND14R:
2185 case R_PARISC_DLTIND14F:
2186 case R_PARISC_LTOFF_FPTR14R:
2187 case R_PARISC_PCREL14R:
2188 case R_PARISC_PCREL14F:
2189 case R_PARISC_LTOFF_TP14R:
2190 case R_PARISC_LTOFF_TP14F:
2191 case R_PARISC_DPREL14R:
2192 case R_PARISC_DPREL14F:
2193 case R_PARISC_PLTOFF14R:
2194 case R_PARISC_PLTOFF14F:
2195 case R_PARISC_DIR14R:
2196 case R_PARISC_DIR14F:
2197 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2198
2199 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
2200 case R_PARISC_LTOFF_FPTR16F:
2201 case R_PARISC_PCREL16F:
2202 case R_PARISC_LTOFF_TP16F:
2203 case R_PARISC_GPREL16F:
2204 case R_PARISC_PLTOFF16F:
2205 case R_PARISC_DIR16F:
2206 case R_PARISC_LTOFF16F:
2207 return (insn & ~0xffff) | re_assemble_16 (sym_value);
2208
2209 /* Doubleword loads and stores with a 14 bit displacement. */
2210 case R_PARISC_DLTREL14DR:
2211 case R_PARISC_DLTIND14DR:
2212 case R_PARISC_LTOFF_FPTR14DR:
2213 case R_PARISC_LTOFF_FPTR16DF:
2214 case R_PARISC_PCREL14DR:
2215 case R_PARISC_PCREL16DF:
2216 case R_PARISC_LTOFF_TP14DR:
2217 case R_PARISC_LTOFF_TP16DF:
2218 case R_PARISC_DPREL14DR:
2219 case R_PARISC_GPREL16DF:
2220 case R_PARISC_PLTOFF14DR:
2221 case R_PARISC_PLTOFF16DF:
2222 case R_PARISC_DIR14DR:
2223 case R_PARISC_DIR16DF:
2224 case R_PARISC_LTOFF16DF:
2225 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2226 | ((sym_value & 0x1ff8) << 1));
2227
2228 /* Floating point single word load/store instructions. */
2229 case R_PARISC_DLTREL14WR:
2230 case R_PARISC_DLTIND14WR:
2231 case R_PARISC_LTOFF_FPTR14WR:
2232 case R_PARISC_LTOFF_FPTR16WF:
2233 case R_PARISC_PCREL14WR:
2234 case R_PARISC_PCREL16WF:
2235 case R_PARISC_LTOFF_TP14WR:
2236 case R_PARISC_LTOFF_TP16WF:
2237 case R_PARISC_DPREL14WR:
2238 case R_PARISC_GPREL16WF:
2239 case R_PARISC_PLTOFF14WR:
2240 case R_PARISC_PLTOFF16WF:
2241 case R_PARISC_DIR16WF:
2242 case R_PARISC_DIR14WR:
2243 case R_PARISC_LTOFF16WF:
2244 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2245 | ((sym_value & 0x1ffc) << 1));
2246
2247 default:
2248 return insn;
2249 }
2250 }
2251 #endif
This page took 0.187018 seconds and 4 git commands to generate.