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