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