Just mention current year in printed copyright message.
[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, 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 {
1346 if (info->symbolic)
1347 (*info->callbacks->undefined_symbol)
1348 (info, h->root.root.string, input_bfd,
1349 input_section, rel->r_offset, false);
1350
1351 /* If this symbol has an entry in the PA64 dynamic hash
1352 table, then get it. */
1353 dyn_name = get_dyn_name (input_bfd, h, rel,
1354 &dynh_buf, &dynh_buflen);
1355 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1356 dyn_name, false, false);
1357
1358 if (dyn_h == NULL)
1359 {
1360 (*_bfd_error_handler)
1361 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1362 bfd_get_filename (input_bfd), h->root.root.string,
1363 bfd_get_section_name (input_bfd, input_section));
1364 relocation = 0;
1365 }
1366 relocation = 0;
1367 }
1368 else if (h->root.type == bfd_link_hash_undefweak)
1369 relocation = 0;
1370 else
1371 {
1372 if (!((*info->callbacks->undefined_symbol)
1373 (info, h->root.root.string, input_bfd,
1374 input_section, rel->r_offset, true)))
1375 return false;
1376 break;
1377 }
1378 }
1379
1380 if (h != NULL)
1381 sym_name = h->root.root.string;
1382 else
1383 {
1384 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1385 symtab_hdr->sh_link,
1386 sym->st_name);
1387 if (sym_name == NULL)
1388 return false;
1389 if (*sym_name == '\0')
1390 sym_name = bfd_section_name (input_bfd, sym_sec);
1391 }
1392
1393 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1394 input_section, contents,
1395 relocation, info, sym_sec,
1396 h, dyn_h);
1397
1398 if (r != bfd_reloc_ok)
1399 {
1400 switch (r)
1401 {
1402 default:
1403 abort ();
1404 case bfd_reloc_overflow:
1405 {
1406 if (!((*info->callbacks->reloc_overflow)
1407 (info, sym_name, howto->name, (bfd_vma) 0,
1408 input_bfd, input_section, rel->r_offset)))
1409 return false;
1410 }
1411 break;
1412 }
1413 }
1414 }
1415 return true;
1416 }
1417
1418
1419 /* Compute the value for a relocation (REL) during a final link stage,
1420 then insert the value into the proper location in CONTENTS.
1421
1422 VALUE is a tentative value for the relocation and may be overridden
1423 and modified here based on the specific relocation to be performed.
1424
1425 For example we do conversions for PC-relative branches in this routine
1426 or redirection of calls to external routines to stubs.
1427
1428 The work of actually applying the relocation is left to a helper
1429 routine in an attempt to reduce the complexity and size of this
1430 function. */
1431
1432 static bfd_reloc_status_type
1433 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1434 input_section, contents, value,
1435 info, sym_sec, h, dyn_h)
1436 Elf_Internal_Rela *rel;
1437 bfd *input_bfd;
1438 bfd *output_bfd;
1439 asection *input_section;
1440 bfd_byte *contents;
1441 bfd_vma value;
1442 struct bfd_link_info *info;
1443 asection *sym_sec;
1444 struct elf_link_hash_entry *h;
1445 struct elf64_hppa_dyn_hash_entry *dyn_h;
1446 {
1447 unsigned int insn;
1448 bfd_vma offset = rel->r_offset;
1449 bfd_vma addend = rel->r_addend;
1450 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1451 unsigned int r_type = howto->type;
1452 bfd_byte *hit_data = contents + offset;
1453 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1454
1455 insn = bfd_get_32 (input_bfd, hit_data);
1456
1457 switch (r_type)
1458 {
1459 case R_PARISC_NONE:
1460 break;
1461
1462 /* Basic function call support. I'm not entirely sure if PCREL14F is
1463 actually needed or even handled correctly.
1464
1465 Note for a call to a function defined in another dynamic library
1466 we want to redirect the call to a stub. */
1467
1468 /* Random PC relative relocs. */
1469 case R_PARISC_PCREL21L:
1470 case R_PARISC_PCREL14R:
1471 case R_PARISC_PCREL14F:
1472 case R_PARISC_PCREL14WR:
1473 case R_PARISC_PCREL14DR:
1474 case R_PARISC_PCREL16F:
1475 case R_PARISC_PCREL16WF:
1476 case R_PARISC_PCREL16DF:
1477 {
1478 /* If this is a call to a function defined in another dynamic
1479 library, then redirect the call to the local stub for this
1480 function. */
1481 if (sym_sec == NULL || sym_sec->output_section == NULL)
1482 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1483 + hppa_info->stub_sec->output_section->vma);
1484
1485 /* Turn VALUE into a proper PC relative address. */
1486 value -= (offset + input_section->output_offset
1487 + input_section->output_section->vma);
1488
1489 /* Adjust for any field selectors. */
1490 if (r_type == R_PARISC_PCREL21L)
1491 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1492 else if (r_type == R_PARISC_PCREL14F
1493 || r_type == R_PARISC_PCREL16F
1494 || r_type == R_PARISC_PCREL16WF
1495 || r_type == R_PARISC_PCREL16DF)
1496 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1497 else
1498 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1499
1500 /* Apply the relocation to the given instruction. */
1501 insn = elf_hppa_relocate_insn (insn, value, r_type);
1502 break;
1503 }
1504
1505 case R_PARISC_PCREL22F:
1506 case R_PARISC_PCREL17F:
1507 case R_PARISC_PCREL22C:
1508 case R_PARISC_PCREL17C:
1509 case R_PARISC_PCREL17R:
1510 {
1511 /* If this is a call to a function defined in another dynamic
1512 library, then redirect the call to the local stub for this
1513 function. */
1514 if (sym_sec == NULL || sym_sec->output_section == NULL)
1515 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1516 + hppa_info->stub_sec->output_section->vma);
1517
1518 /* Turn VALUE into a proper PC relative address. */
1519 value -= (offset + input_section->output_offset
1520 + input_section->output_section->vma);
1521
1522 /* Adjust for any field selectors. */
1523 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1524
1525 /* All branches are implicitly shifted by 2 places. */
1526 value >>= 2;
1527
1528 /* Apply the relocation to the given instruction. */
1529 insn = elf_hppa_relocate_insn (insn, value, r_type);
1530 break;
1531 }
1532
1533 /* Indirect references to data through the DLT. */
1534 case R_PARISC_DLTIND14R:
1535 case R_PARISC_DLTIND14F:
1536 case R_PARISC_DLTIND14DR:
1537 case R_PARISC_DLTIND14WR:
1538 case R_PARISC_DLTIND21L:
1539 case R_PARISC_LTOFF_FPTR14R:
1540 case R_PARISC_LTOFF_FPTR14DR:
1541 case R_PARISC_LTOFF_FPTR14WR:
1542 case R_PARISC_LTOFF_FPTR21L:
1543 case R_PARISC_LTOFF_FPTR16F:
1544 case R_PARISC_LTOFF_FPTR16WF:
1545 case R_PARISC_LTOFF_FPTR16DF:
1546 case R_PARISC_LTOFF_TP21L:
1547 case R_PARISC_LTOFF_TP14R:
1548 case R_PARISC_LTOFF_TP14F:
1549 case R_PARISC_LTOFF_TP14WR:
1550 case R_PARISC_LTOFF_TP14DR:
1551 case R_PARISC_LTOFF_TP16F:
1552 case R_PARISC_LTOFF_TP16WF:
1553 case R_PARISC_LTOFF_TP16DF:
1554 case R_PARISC_LTOFF16F:
1555 case R_PARISC_LTOFF16WF:
1556 case R_PARISC_LTOFF16DF:
1557 {
1558 /* If this relocation was against a local symbol, then we still
1559 have not set up the DLT entry (it's not convienent to do so
1560 in the "finalize_dlt" routine because it is difficult to get
1561 to the local symbol's value).
1562
1563 So, if this is a local symbol (h == NULL), then we need to
1564 fill in its DLT entry.
1565
1566 Similarly we may still need to set up an entry in .opd for
1567 a local function which had its address taken. */
1568 if (dyn_h->h == NULL)
1569 {
1570 bfd_put_64 (hppa_info->dlt_sec->owner,
1571 value,
1572 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1573
1574 /* Now handle .opd creation if needed. */
1575 if (r_type == R_PARISC_LTOFF_FPTR14R
1576 || r_type == R_PARISC_LTOFF_FPTR14DR
1577 || r_type == R_PARISC_LTOFF_FPTR14WR
1578 || r_type == R_PARISC_LTOFF_FPTR21L
1579 || r_type == R_PARISC_LTOFF_FPTR16F
1580 || r_type == R_PARISC_LTOFF_FPTR16WF
1581 || r_type == R_PARISC_LTOFF_FPTR16DF)
1582 {
1583 /* The first two words of an .opd entry are zero. */
1584 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1585 0, 16);
1586
1587 /* The next word is the address of the function. */
1588 bfd_put_64 (hppa_info->opd_sec->owner, value,
1589 (hppa_info->opd_sec->contents
1590 + dyn_h->opd_offset + 16));
1591
1592 /* The last word is our local __gp value. */
1593 value = _bfd_get_gp_value
1594 (hppa_info->opd_sec->output_section->owner);
1595 bfd_put_64 (hppa_info->opd_sec->owner, value,
1596 (hppa_info->opd_sec->contents
1597 + dyn_h->opd_offset + 24));
1598 }
1599 }
1600
1601 /* We want the value of the DLT offset for this symbol, not
1602 the symbol's actual address. Note that __gp may not point
1603 to the start of the DLT, so we have to compute the absolute
1604 address, then subtract out the value of __gp. */
1605 value = (dyn_h->dlt_offset
1606 + hppa_info->dlt_sec->output_offset
1607 + hppa_info->dlt_sec->output_section->vma);
1608 value -= _bfd_get_gp_value (output_bfd);
1609
1610 /* All DLTIND relocations are basically the same at this point,
1611 except that we need different field selectors for the 21bit
1612 version vs the 14bit versions. */
1613 if (r_type == R_PARISC_DLTIND21L
1614 || r_type == R_PARISC_LTOFF_FPTR21L
1615 || r_type == R_PARISC_LTOFF_TP21L)
1616 value = hppa_field_adjust (value, addend, e_lrsel);
1617 else if (r_type == R_PARISC_DLTIND14F
1618 || r_type == R_PARISC_LTOFF_FPTR16F
1619 || r_type == R_PARISC_LTOFF_FPTR16WF
1620 || r_type == R_PARISC_LTOFF_FPTR16DF
1621 || r_type == R_PARISC_LTOFF16F
1622 || r_type == R_PARISC_LTOFF16DF
1623 || r_type == R_PARISC_LTOFF16WF
1624 || r_type == R_PARISC_LTOFF_TP16F
1625 || r_type == R_PARISC_LTOFF_TP16WF
1626 || r_type == R_PARISC_LTOFF_TP16DF)
1627 value = hppa_field_adjust (value, addend, e_fsel);
1628 else
1629 value = hppa_field_adjust (value, addend, e_rrsel);
1630
1631 insn = elf_hppa_relocate_insn (insn, value, r_type);
1632 break;
1633 }
1634
1635 case R_PARISC_DLTREL14R:
1636 case R_PARISC_DLTREL14F:
1637 case R_PARISC_DLTREL14DR:
1638 case R_PARISC_DLTREL14WR:
1639 case R_PARISC_DLTREL21L:
1640 case R_PARISC_DPREL21L:
1641 case R_PARISC_DPREL14WR:
1642 case R_PARISC_DPREL14DR:
1643 case R_PARISC_DPREL14R:
1644 case R_PARISC_DPREL14F:
1645 case R_PARISC_GPREL16F:
1646 case R_PARISC_GPREL16WF:
1647 case R_PARISC_GPREL16DF:
1648 {
1649 /* Subtract out the global pointer value to make value a DLT
1650 relative address. */
1651 value -= _bfd_get_gp_value (output_bfd);
1652
1653 /* All DLTREL relocations are basically the same at this point,
1654 except that we need different field selectors for the 21bit
1655 version vs the 14bit versions. */
1656 if (r_type == R_PARISC_DLTREL21L
1657 || r_type == R_PARISC_DPREL21L)
1658 value = hppa_field_adjust (value, addend, e_lrsel);
1659 else if (r_type == R_PARISC_DLTREL14F
1660 || r_type == R_PARISC_DPREL14F
1661 || r_type == R_PARISC_GPREL16F
1662 || r_type == R_PARISC_GPREL16WF
1663 || r_type == R_PARISC_GPREL16DF)
1664 value = hppa_field_adjust (value, addend, e_fsel);
1665 else
1666 value = hppa_field_adjust (value, addend, e_rrsel);
1667
1668 insn = elf_hppa_relocate_insn (insn, value, r_type);
1669 break;
1670 }
1671
1672 case R_PARISC_DIR21L:
1673 case R_PARISC_DIR17R:
1674 case R_PARISC_DIR17F:
1675 case R_PARISC_DIR14R:
1676 case R_PARISC_DIR14WR:
1677 case R_PARISC_DIR14DR:
1678 case R_PARISC_DIR16F:
1679 case R_PARISC_DIR16WF:
1680 case R_PARISC_DIR16DF:
1681 {
1682 /* All DIR relocations are basically the same at this point,
1683 except that we need different field selectors for the 21bit
1684 version vs the 14bit versions. */
1685
1686 if (r_type == R_PARISC_DIR21L)
1687 value = hppa_field_adjust (value, addend, e_lrsel);
1688 else if (r_type == R_PARISC_DIR17F
1689 || r_type == R_PARISC_DIR16F
1690 || r_type == R_PARISC_DIR16WF
1691 || r_type == R_PARISC_DIR16DF)
1692 value = hppa_field_adjust (value, addend, e_fsel);
1693 else
1694 value = hppa_field_adjust (value, addend, e_rrsel);
1695
1696 insn = elf_hppa_relocate_insn (insn, value, r_type);
1697 break;
1698 }
1699
1700 case R_PARISC_PLTOFF21L:
1701 case R_PARISC_PLTOFF14R:
1702 case R_PARISC_PLTOFF14F:
1703 case R_PARISC_PLTOFF14WR:
1704 case R_PARISC_PLTOFF14DR:
1705 case R_PARISC_PLTOFF16F:
1706 case R_PARISC_PLTOFF16WF:
1707 case R_PARISC_PLTOFF16DF:
1708 {
1709 /* We want the value of the PLT offset for this symbol, not
1710 the symbol's actual address. Note that __gp may not point
1711 to the start of the DLT, so we have to compute the absolute
1712 address, then subtract out the value of __gp. */
1713 value = (dyn_h->plt_offset
1714 + hppa_info->plt_sec->output_offset
1715 + hppa_info->plt_sec->output_section->vma);
1716 value -= _bfd_get_gp_value (output_bfd);
1717
1718 /* All PLTOFF relocations are basically the same at this point,
1719 except that we need different field selectors for the 21bit
1720 version vs the 14bit versions. */
1721 if (r_type == R_PARISC_PLTOFF21L)
1722 value = hppa_field_adjust (value, addend, e_lrsel);
1723 else if (r_type == R_PARISC_PLTOFF14F
1724 || r_type == R_PARISC_PLTOFF16F
1725 || r_type == R_PARISC_PLTOFF16WF
1726 || r_type == R_PARISC_PLTOFF16DF)
1727 value = hppa_field_adjust (value, addend, e_fsel);
1728 else
1729 value = hppa_field_adjust (value, addend, e_rrsel);
1730
1731 insn = elf_hppa_relocate_insn (insn, value, r_type);
1732 break;
1733 }
1734
1735 case R_PARISC_LTOFF_FPTR32:
1736 {
1737 /* We may still need to create the FPTR itself if it was for
1738 a local symbol. */
1739 if (dyn_h->h == NULL)
1740 {
1741 /* The first two words of an .opd entry are zero. */
1742 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1743
1744 /* The next word is the address of the function. */
1745 bfd_put_64 (hppa_info->opd_sec->owner, value,
1746 (hppa_info->opd_sec->contents
1747 + dyn_h->opd_offset + 16));
1748
1749 /* The last word is our local __gp value. */
1750 value = _bfd_get_gp_value
1751 (hppa_info->opd_sec->output_section->owner);
1752 bfd_put_64 (hppa_info->opd_sec->owner, value,
1753 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1754 }
1755
1756 /* We want the value of the DLT offset for this symbol, not
1757 the symbol's actual address. Note that __gp may not point
1758 to the start of the DLT, so we have to compute the absolute
1759 address, then subtract out the value of __gp. */
1760 value = (dyn_h->dlt_offset
1761 + hppa_info->dlt_sec->output_offset
1762 + hppa_info->dlt_sec->output_section->vma);
1763 value -= _bfd_get_gp_value (output_bfd);
1764 bfd_put_32 (input_bfd, value, hit_data);
1765 return bfd_reloc_ok;
1766 }
1767
1768 case R_PARISC_LTOFF_FPTR64:
1769 case R_PARISC_LTOFF_TP64:
1770 {
1771 /* We may still need to create the FPTR itself if it was for
1772 a local symbol. */
1773 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1774 {
1775 /* The first two words of an .opd entry are zero. */
1776 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1777
1778 /* The next word is the address of the function. */
1779 bfd_put_64 (hppa_info->opd_sec->owner, value,
1780 (hppa_info->opd_sec->contents
1781 + dyn_h->opd_offset + 16));
1782
1783 /* The last word is our local __gp value. */
1784 value = _bfd_get_gp_value
1785 (hppa_info->opd_sec->output_section->owner);
1786 bfd_put_64 (hppa_info->opd_sec->owner, value,
1787 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1788 }
1789
1790 /* We want the value of the DLT offset for this symbol, not
1791 the symbol's actual address. Note that __gp may not point
1792 to the start of the DLT, so we have to compute the absolute
1793 address, then subtract out the value of __gp. */
1794 value = (dyn_h->dlt_offset
1795 + hppa_info->dlt_sec->output_offset
1796 + hppa_info->dlt_sec->output_section->vma);
1797 value -= _bfd_get_gp_value (output_bfd);
1798 bfd_put_64 (input_bfd, value, hit_data);
1799 return bfd_reloc_ok;
1800 }
1801
1802 case R_PARISC_DIR32:
1803 bfd_put_32 (input_bfd, value + addend, hit_data);
1804 return bfd_reloc_ok;
1805
1806 case R_PARISC_DIR64:
1807 bfd_put_64 (input_bfd, value + addend, hit_data);
1808 return bfd_reloc_ok;
1809
1810 case R_PARISC_GPREL64:
1811 /* Subtract out the global pointer value to make value a DLT
1812 relative address. */
1813 value -= _bfd_get_gp_value (output_bfd);
1814 value += addend;
1815
1816 bfd_put_64 (input_bfd, value + addend, hit_data);
1817 return bfd_reloc_ok;
1818
1819 case R_PARISC_LTOFF64:
1820 /* We want the value of the DLT offset for this symbol, not
1821 the symbol's actual address. Note that __gp may not point
1822 to the start of the DLT, so we have to compute the absolute
1823 address, then subtract out the value of __gp. */
1824 value = (dyn_h->dlt_offset
1825 + hppa_info->dlt_sec->output_offset
1826 + hppa_info->dlt_sec->output_section->vma);
1827 value -= _bfd_get_gp_value (output_bfd);
1828
1829 bfd_put_64 (input_bfd, value + addend, hit_data);
1830 return bfd_reloc_ok;
1831
1832 case R_PARISC_PCREL32:
1833 {
1834 /* If this is a call to a function defined in another dynamic
1835 library, then redirect the call to the local stub for this
1836 function. */
1837 if (sym_sec == NULL || sym_sec->output_section == NULL)
1838 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1839 + hppa_info->stub_sec->output_section->vma);
1840
1841 /* Turn VALUE into a proper PC relative address. */
1842 value -= (offset + input_section->output_offset
1843 + input_section->output_section->vma);
1844
1845 value += addend;
1846 value -= 8;
1847 bfd_put_64 (input_bfd, value, hit_data);
1848 return bfd_reloc_ok;
1849 }
1850
1851 case R_PARISC_PCREL64:
1852 {
1853 /* If this is a call to a function defined in another dynamic
1854 library, then redirect the call to the local stub for this
1855 function. */
1856 if (sym_sec == NULL || sym_sec->output_section == NULL)
1857 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1858 + hppa_info->stub_sec->output_section->vma);
1859
1860
1861 /* Turn VALUE into a proper PC relative address. */
1862 value -= (offset + input_section->output_offset
1863 + input_section->output_section->vma);
1864
1865 value += addend;
1866 value -= 8;
1867 bfd_put_64 (input_bfd, value, hit_data);
1868 return bfd_reloc_ok;
1869 }
1870
1871
1872 case R_PARISC_FPTR64:
1873 {
1874 /* We may still need to create the FPTR itself if it was for
1875 a local symbol. */
1876 if (dyn_h->h == NULL)
1877 {
1878 /* The first two words of an .opd entry are zero. */
1879 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1880
1881 /* The next word is the address of the function. */
1882 bfd_put_64 (hppa_info->opd_sec->owner, value,
1883 (hppa_info->opd_sec->contents
1884 + dyn_h->opd_offset + 16));
1885
1886 /* The last word is our local __gp value. */
1887 value = _bfd_get_gp_value
1888 (hppa_info->opd_sec->output_section->owner);
1889 bfd_put_64 (hppa_info->opd_sec->owner, value,
1890 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1891 }
1892
1893 /* We want the value of the OPD offset for this symbol, not
1894 the symbol's actual address. */
1895 value = (dyn_h->opd_offset
1896 + hppa_info->opd_sec->output_offset
1897 + hppa_info->opd_sec->output_section->vma);
1898
1899 bfd_put_64 (input_bfd, value + addend, hit_data);
1900 return bfd_reloc_ok;
1901 }
1902
1903 case R_PARISC_SECREL32:
1904 bfd_put_32 (input_bfd,
1905 (value + addend
1906 - sym_sec->output_section->vma),
1907 hit_data);
1908 return bfd_reloc_ok;
1909
1910 case R_PARISC_SEGREL32:
1911 case R_PARISC_SEGREL64:
1912 {
1913 /* If this is the first SEGREL relocation, then initialize
1914 the segment base values. */
1915 if (hppa_info->text_segment_base == (bfd_vma) -1)
1916 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1917 elf64_hppa_hash_table (info));
1918
1919 /* VALUE holds the absolute address. We want to include the
1920 addend, then turn it into a segment relative address.
1921
1922 The segment is derived from SYM_SEC. We assume that there are
1923 only two segments of note in the resulting executable/shlib.
1924 A readonly segment (.text) and a readwrite segment (.data). */
1925 value += addend;
1926
1927 if (sym_sec->flags & SEC_CODE)
1928 value -= hppa_info->text_segment_base;
1929 else
1930 value -= hppa_info->data_segment_base;
1931
1932 if (r_type == R_PARISC_SEGREL32)
1933 bfd_put_32 (input_bfd, value, hit_data);
1934 else
1935 bfd_put_64 (input_bfd, value, hit_data);
1936 return bfd_reloc_ok;
1937 }
1938
1939
1940 /* Something we don't know how to handle. */
1941 default:
1942 return bfd_reloc_notsupported;
1943 }
1944
1945 /* Update the instruction word. */
1946 bfd_put_32 (input_bfd, insn, hit_data);
1947 return (bfd_reloc_ok);
1948 }
1949
1950 /* Relocate the given INSN. VALUE should be the actual value we want
1951 to insert into the instruction, ie by this point we should not be
1952 concerned with computing an offset relative to the DLT, PC, etc.
1953 Instead this routine is meant to handle the bit manipulations needed
1954 to insert the relocation into the given instruction. */
1955
1956 static unsigned int
1957 elf_hppa_relocate_insn (insn, sym_value, r_type)
1958 unsigned int insn;
1959 unsigned int sym_value;
1960 unsigned int r_type;
1961 {
1962 switch (r_type)
1963 {
1964 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1965 the "B" instruction. */
1966 case R_PARISC_PCREL22F:
1967 case R_PARISC_PCREL22C:
1968 return re_assemble_22 (insn, sym_value);
1969
1970 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1971 the "B" instruction as well as BE. */
1972 case R_PARISC_PCREL17F:
1973 case R_PARISC_DIR17F:
1974 case R_PARISC_DIR17R:
1975 case R_PARISC_PCREL17C:
1976 case R_PARISC_PCREL17R:
1977 return re_assemble_17 (insn, sym_value);
1978
1979 /* ADDIL or LDIL instructions. */
1980 case R_PARISC_DLTREL21L:
1981 case R_PARISC_DLTIND21L:
1982 case R_PARISC_LTOFF_FPTR21L:
1983 case R_PARISC_PCREL21L:
1984 case R_PARISC_LTOFF_TP21L:
1985 case R_PARISC_DPREL21L:
1986 case R_PARISC_PLTOFF21L:
1987 case R_PARISC_DIR21L:
1988 return re_assemble_21 (insn, sym_value);
1989
1990 /* LDO and integer loads/stores with 14bit displacements. */
1991 case R_PARISC_DLTREL14R:
1992 case R_PARISC_DLTREL14F:
1993 case R_PARISC_DLTIND14R:
1994 case R_PARISC_DLTIND14F:
1995 case R_PARISC_LTOFF_FPTR14R:
1996 case R_PARISC_LTOFF_FPTR16F:
1997 case R_PARISC_PCREL14R:
1998 case R_PARISC_PCREL14F:
1999 case R_PARISC_PCREL16F:
2000 case R_PARISC_LTOFF_TP14R:
2001 case R_PARISC_LTOFF_TP14F:
2002 case R_PARISC_LTOFF_TP16F:
2003 case R_PARISC_DPREL14R:
2004 case R_PARISC_DPREL14F:
2005 case R_PARISC_GPREL16F:
2006 case R_PARISC_PLTOFF14R:
2007 case R_PARISC_PLTOFF14F:
2008 case R_PARISC_PLTOFF16F:
2009 case R_PARISC_DIR14R:
2010 case R_PARISC_DIR16F:
2011 case R_PARISC_LTOFF16F:
2012 return (insn & ~ 0x3fff) | low_sign_unext (sym_value, 14);
2013
2014 /* Doubleword loads and stores with a 14bit displacement. */
2015 case R_PARISC_DLTREL14DR:
2016 case R_PARISC_DLTIND14DR:
2017 case R_PARISC_LTOFF_FPTR14DR:
2018 case R_PARISC_LTOFF_FPTR16DF:
2019 case R_PARISC_PCREL14DR:
2020 case R_PARISC_PCREL16DF:
2021 case R_PARISC_LTOFF_TP14DR:
2022 case R_PARISC_LTOFF_TP16DF:
2023 case R_PARISC_DPREL14DR:
2024 case R_PARISC_GPREL16DF:
2025 case R_PARISC_PLTOFF14DR:
2026 case R_PARISC_PLTOFF16DF:
2027 case R_PARISC_DIR14DR:
2028 case R_PARISC_DIR16DF:
2029 case R_PARISC_LTOFF16DF:
2030 return (insn & ~ 0x3ff1) | (((sym_value & 0x2000) >> 13)
2031 | ((sym_value & 0x1ff8) << 1));
2032
2033 /* Floating point single word load/store instructions. */
2034 case R_PARISC_DLTREL14WR:
2035 case R_PARISC_DLTIND14WR:
2036 case R_PARISC_LTOFF_FPTR14WR:
2037 case R_PARISC_LTOFF_FPTR16WF:
2038 case R_PARISC_PCREL14WR:
2039 case R_PARISC_PCREL16WF:
2040 case R_PARISC_LTOFF_TP14WR:
2041 case R_PARISC_LTOFF_TP16WF:
2042 case R_PARISC_DPREL14WR:
2043 case R_PARISC_GPREL16WF:
2044 case R_PARISC_PLTOFF14WR:
2045 case R_PARISC_PLTOFF16WF:
2046 case R_PARISC_DIR16WF:
2047 case R_PARISC_DIR14WR:
2048 case R_PARISC_LTOFF16WF:
2049 return (insn & ~ 0x3ff9) | (((sym_value & 0x2000) >> 13)
2050 | ((sym_value & 0x1ffc) << 1));
2051
2052 default:
2053 return insn;
2054 }
2055 }
2056 #endif
This page took 0.079895 seconds and 4 git commands to generate.