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