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