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