1 /* Common code for PA ELF implementations.
2 Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
20 #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
22 /* This file is included by multiple PA ELF BFD backends with different
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. */
29 #define ELF_R_TYPE(X) ELF64_R_TYPE(X)
30 #define ELF_R_SYM(X) ELF64_R_SYM(X)
31 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
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
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 bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
44 #define elf_hppa_final_link elf32_hppa_final_link
48 static bfd_reloc_status_type elf_hppa_final_link_relocate
49 (Elf_Internal_Rela *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
50 struct bfd_link_info *, asection *, struct elf_link_hash_entry *,
51 struct elf64_hppa_dyn_hash_entry *);
53 static int elf_hppa_relocate_insn
54 (int, int, unsigned int);
57 /* ELF/PA relocation howto entries. */
59 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
61 { R_PARISC_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "R_PARISC_NONE", FALSE, 0, 0, FALSE },
64 /* The values in DIR32 are to placate the check in
65 _bfd_stab_section_find_nearest_line. */
66 { R_PARISC_DIR32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
67 bfd_elf_generic_reloc, "R_PARISC_DIR32", FALSE, 0, 0xffffffff, FALSE },
68 { R_PARISC_DIR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
69 bfd_elf_generic_reloc, "R_PARISC_DIR21L", FALSE, 0, 0, FALSE },
70 { R_PARISC_DIR17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
71 bfd_elf_generic_reloc, "R_PARISC_DIR17R", FALSE, 0, 0, FALSE },
72 { R_PARISC_DIR17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
73 bfd_elf_generic_reloc, "R_PARISC_DIR17F", FALSE, 0, 0, FALSE },
74 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
75 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
76 { R_PARISC_DIR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
77 bfd_elf_generic_reloc, "R_PARISC_DIR14R", FALSE, 0, 0, FALSE },
78 { R_PARISC_DIR14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
79 bfd_elf_generic_reloc, "R_PARISC_DIR14F", FALSE, 0, 0, FALSE },
81 { R_PARISC_PCREL12F, 0, 0, 12, TRUE, 0, complain_overflow_bitfield,
82 bfd_elf_generic_reloc, "R_PARISC_PCREL12F", FALSE, 0, 0, FALSE },
83 { R_PARISC_PCREL32, 0, 0, 32, TRUE, 0, complain_overflow_bitfield,
84 bfd_elf_generic_reloc, "R_PARISC_PCREL32", FALSE, 0, 0, FALSE },
85 { R_PARISC_PCREL21L, 0, 0, 21, TRUE, 0, complain_overflow_bitfield,
86 bfd_elf_generic_reloc, "R_PARISC_PCREL21L", FALSE, 0, 0, FALSE },
87 { R_PARISC_PCREL17R, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
88 bfd_elf_generic_reloc, "R_PARISC_PCREL17R", FALSE, 0, 0, FALSE },
89 { R_PARISC_PCREL17F, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
90 bfd_elf_generic_reloc, "R_PARISC_PCREL17F", FALSE, 0, 0, FALSE },
91 { R_PARISC_PCREL17C, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
92 bfd_elf_generic_reloc, "R_PARISC_PCREL17C", FALSE, 0, 0, FALSE },
93 { R_PARISC_PCREL14R, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
94 bfd_elf_generic_reloc, "R_PARISC_PCREL14R", FALSE, 0, 0, FALSE },
95 { R_PARISC_PCREL14F, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
96 bfd_elf_generic_reloc, "R_PARISC_PCREL14F", FALSE, 0, 0, FALSE },
98 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
99 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
100 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
101 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
102 { R_PARISC_DPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_PARISC_DPREL21L", FALSE, 0, 0, FALSE },
104 { R_PARISC_DPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
105 bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", FALSE, 0, 0, FALSE },
106 { R_PARISC_DPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
107 bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", FALSE, 0, 0, FALSE },
108 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
110 { R_PARISC_DPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
111 bfd_elf_generic_reloc, "R_PARISC_DPREL14R", FALSE, 0, 0, FALSE },
112 { R_PARISC_DPREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
113 bfd_elf_generic_reloc, "R_PARISC_DPREL14F", FALSE, 0, 0, FALSE },
115 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
116 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", 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_DLTREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
120 bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", 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_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
126 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
127 { R_PARISC_DLTREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
128 bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", FALSE, 0, 0, FALSE },
129 { R_PARISC_DLTREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", FALSE, 0, 0, FALSE },
132 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
133 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
134 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
135 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
136 { R_PARISC_DLTIND21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
137 bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", FALSE, 0, 0, FALSE },
138 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
139 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", 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_DLTIND14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
145 bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", FALSE, 0, 0, FALSE },
146 { R_PARISC_DLTIND14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
147 bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", FALSE, 0, 0, FALSE },
149 { R_PARISC_SETBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
150 bfd_elf_generic_reloc, "R_PARISC_SETBASE", FALSE, 0, 0, FALSE },
151 { R_PARISC_SECREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
152 bfd_elf_generic_reloc, "R_PARISC_SECREL32", FALSE, 0, 0, FALSE },
153 { R_PARISC_BASEREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
154 bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", FALSE, 0, 0, FALSE },
155 { R_PARISC_BASEREL17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
156 bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", FALSE, 0, 0, FALSE },
157 { R_PARISC_BASEREL17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
158 bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", 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_BASEREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
162 bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", FALSE, 0, 0, FALSE },
163 { R_PARISC_BASEREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
164 bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", FALSE, 0, 0, FALSE },
166 { R_PARISC_SEGBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
167 bfd_elf_generic_reloc, "R_PARISC_SEGBASE", FALSE, 0, 0, FALSE },
168 { R_PARISC_SEGREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
169 bfd_elf_generic_reloc, "R_PARISC_SEGREL32", FALSE, 0, 0, FALSE },
170 { R_PARISC_PLTOFF21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
171 bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", FALSE, 0, 0, FALSE },
172 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
173 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", 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_PLTOFF14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
179 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", FALSE, 0, 0, FALSE },
180 { R_PARISC_PLTOFF14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
181 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", FALSE, 0, 0, FALSE },
183 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
184 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
185 { R_PARISC_LTOFF_FPTR32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
186 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", FALSE, 0, 0, FALSE },
187 { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
188 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", FALSE, 0, 0, FALSE },
189 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
190 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
191 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
192 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
193 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
194 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
195 { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
196 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", FALSE, 0, 0, FALSE },
197 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
198 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
200 { R_PARISC_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
201 bfd_elf_generic_reloc, "R_PARISC_FPTR64", FALSE, 0, 0, FALSE },
202 { R_PARISC_PLABEL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
203 bfd_elf_generic_reloc, "R_PARISC_PLABEL32", FALSE, 0, 0, FALSE },
204 { R_PARISC_PLABEL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
205 bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", FALSE, 0, 0, FALSE },
206 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
207 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
208 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
209 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
210 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
211 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
212 { R_PARISC_PLABEL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
213 bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", 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 },
217 { R_PARISC_PCREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
218 bfd_elf_generic_reloc, "R_PARISC_PCREL64", FALSE, 0, 0, FALSE },
219 { R_PARISC_PCREL22C, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
220 bfd_elf_generic_reloc, "R_PARISC_PCREL22C", FALSE, 0, 0, FALSE },
221 { R_PARISC_PCREL22F, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
222 bfd_elf_generic_reloc, "R_PARISC_PCREL22F", FALSE, 0, 0, FALSE },
223 { R_PARISC_PCREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
224 bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", FALSE, 0, 0, FALSE },
225 { R_PARISC_PCREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
226 bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", FALSE, 0, 0, FALSE },
227 { R_PARISC_PCREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
228 bfd_elf_generic_reloc, "R_PARISC_PCREL16F", FALSE, 0, 0, FALSE },
229 { R_PARISC_PCREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
230 bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", FALSE, 0, 0, FALSE },
231 { R_PARISC_PCREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
232 bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", FALSE, 0, 0, FALSE },
234 { R_PARISC_DIR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
235 bfd_elf_generic_reloc, "R_PARISC_DIR64", FALSE, 0, 0, FALSE },
236 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
237 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
238 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
239 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
240 { R_PARISC_DIR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
241 bfd_elf_generic_reloc, "R_PARISC_DIR14WR", FALSE, 0, 0, FALSE },
242 { R_PARISC_DIR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
243 bfd_elf_generic_reloc, "R_PARISC_DIR14DR", FALSE, 0, 0, FALSE },
244 { R_PARISC_DIR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
245 bfd_elf_generic_reloc, "R_PARISC_DIR16F", FALSE, 0, 0, FALSE },
246 { R_PARISC_DIR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
247 bfd_elf_generic_reloc, "R_PARISC_DIR16WF", FALSE, 0, 0, FALSE },
248 { R_PARISC_DIR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
249 bfd_elf_generic_reloc, "R_PARISC_DIR16DF", FALSE, 0, 0, FALSE },
251 { R_PARISC_GPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
252 bfd_elf_generic_reloc, "R_PARISC_GPREL64", FALSE, 0, 0, FALSE },
253 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
254 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
255 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
256 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
257 { R_PARISC_DLTREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
258 bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", FALSE, 0, 0, FALSE },
259 { R_PARISC_DLTREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
260 bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", FALSE, 0, 0, FALSE },
261 { R_PARISC_GPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
262 bfd_elf_generic_reloc, "R_PARISC_GPREL16F", FALSE, 0, 0, FALSE },
263 { R_PARISC_GPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
264 bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", FALSE, 0, 0, FALSE },
265 { R_PARISC_GPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
266 bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", FALSE, 0, 0, FALSE },
268 { R_PARISC_LTOFF64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
269 bfd_elf_generic_reloc, "R_PARISC_LTOFF64", FALSE, 0, 0, FALSE },
270 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
271 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
272 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
273 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
274 { R_PARISC_DLTIND14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
275 bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", FALSE, 0, 0, FALSE },
276 { R_PARISC_DLTIND14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
277 bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", FALSE, 0, 0, FALSE },
278 { R_PARISC_LTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
279 bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", FALSE, 0, 0, FALSE },
280 { R_PARISC_LTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
281 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
282 { R_PARISC_LTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
283 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
285 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
286 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
287 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
288 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
289 { R_PARISC_BASEREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
290 bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", FALSE, 0, 0, FALSE },
291 { R_PARISC_BASEREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
292 bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", 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 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
296 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
297 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
298 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
299 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
300 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
302 { R_PARISC_SEGREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
303 bfd_elf_generic_reloc, "R_PARISC_SEGREL64", FALSE, 0, 0, FALSE },
304 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
305 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
306 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
307 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
308 { R_PARISC_PLTOFF14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
309 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", FALSE, 0, 0, FALSE },
310 { R_PARISC_PLTOFF14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
311 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", FALSE, 0, 0, FALSE },
312 { R_PARISC_PLTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
313 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", FALSE, 0, 0, FALSE },
314 { R_PARISC_PLTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
315 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", FALSE, 0, 0, FALSE },
316 { R_PARISC_PLTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
317 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", FALSE, 0, 0, FALSE },
319 { R_PARISC_LTOFF_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
320 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
321 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
322 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
323 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
324 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
325 { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
326 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", FALSE, 0, 0, FALSE },
327 { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
328 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", FALSE, 0, 0, FALSE },
329 { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
330 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", FALSE, 0, 0, FALSE },
331 { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
332 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", FALSE, 0, 0, FALSE },
333 { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
334 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
336 { R_PARISC_COPY, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
337 bfd_elf_generic_reloc, "R_PARISC_COPY", FALSE, 0, 0, FALSE },
338 { R_PARISC_IPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
339 bfd_elf_generic_reloc, "R_PARISC_IPLT", FALSE, 0, 0, FALSE },
340 { R_PARISC_EPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
341 bfd_elf_generic_reloc, "R_PARISC_EPLT", FALSE, 0, 0, FALSE },
342 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
343 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
344 { 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_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
349 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
350 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
351 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
353 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
354 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
355 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
356 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
357 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
358 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
359 { R_PARISC_UNIMPLEMENTED, 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_dont,
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_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
366 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
367 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
368 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
370 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
371 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
372 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
373 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
374 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
375 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
376 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
377 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
378 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
379 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
380 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
381 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
382 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
383 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
384 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
385 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
387 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
388 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
389 { R_PARISC_TPREL32, 0, 0, 32, FALSE, 0, complain_overflow_dont,
390 bfd_elf_generic_reloc, "R_PARISC_TPREL32", FALSE, 0, 0, FALSE },
391 { R_PARISC_TPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_dont,
392 bfd_elf_generic_reloc, "R_PARISC_TPREL21L", FALSE, 0, 0, FALSE },
393 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
394 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
395 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
396 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
397 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
398 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
399 { R_PARISC_TPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_dont,
400 bfd_elf_generic_reloc, "R_PARISC_TPREL14R", FALSE, 0, 0, FALSE },
401 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
402 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
404 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
405 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
406 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
407 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
408 { R_PARISC_LTOFF_TP21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
409 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", FALSE, 0, 0, FALSE },
410 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
411 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
412 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
413 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
414 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
415 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
416 { R_PARISC_LTOFF_TP14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
417 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
418 { R_PARISC_LTOFF_TP14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
419 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", FALSE, 0, 0, FALSE },
421 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
422 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
423 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
424 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
425 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
426 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
427 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
428 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
429 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
430 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
431 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
432 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
433 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
434 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
435 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
436 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
438 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
439 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
440 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
441 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
442 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
443 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
444 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
445 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
446 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
447 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
448 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
449 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
450 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
451 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
452 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
453 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
455 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
456 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
457 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
458 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
459 { R_PARISC_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 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
464 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
465 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
466 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
467 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
468 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
469 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
470 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_bitfield,
481 bfd_elf_generic_reloc, "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 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
485 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
486 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
487 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
489 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
490 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
491 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
492 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
493 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
494 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
495 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
496 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
497 { 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_bitfield,
502 bfd_elf_generic_reloc, "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 },
506 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
507 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
508 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
509 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
510 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
511 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
512 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
513 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
514 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
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 },
523 { R_PARISC_TPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
524 bfd_elf_generic_reloc, "R_PARISC_TPREL64", FALSE, 0, 0, FALSE },
525 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
526 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
527 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
528 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
529 { R_PARISC_TPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_dont,
530 bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", FALSE, 0, 0, FALSE },
531 { R_PARISC_TPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
532 bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", FALSE, 0, 0, FALSE },
533 { R_PARISC_TPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
534 bfd_elf_generic_reloc, "R_PARISC_TPREL16F", FALSE, 0, 0, FALSE },
535 { R_PARISC_TPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_dont,
536 bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", FALSE, 0, 0, FALSE },
537 { R_PARISC_TPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
538 bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", FALSE, 0, 0, FALSE },
540 { R_PARISC_LTOFF_TP64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
541 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", FALSE, 0, 0, FALSE },
542 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
543 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
544 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
545 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
546 { R_PARISC_LTOFF_TP14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
547 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", FALSE, 0, 0, FALSE },
548 { R_PARISC_LTOFF_TP14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
549 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", FALSE, 0, 0, FALSE },
550 { R_PARISC_LTOFF_TP16F, 0, 0, 16, FALSE, 0, complain_overflow_dont,
551 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", FALSE, 0, 0, FALSE },
552 { R_PARISC_LTOFF_TP16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
553 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", FALSE, 0, 0, FALSE },
554 { R_PARISC_LTOFF_TP16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
555 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", FALSE, 0, 0, FALSE },
557 { R_PARISC_GNU_VTENTRY, 0, 0, 0, FALSE, 0, complain_overflow_dont,
558 bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", FALSE, 0, 0, FALSE },
559 { R_PARISC_GNU_VTINHERIT, 0, 0, 0, FALSE, 0, complain_overflow_dont,
560 bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", FALSE, 0, 0, FALSE },
563 #define OFFSET_14R_FROM_21L 4
564 #define OFFSET_14F_FROM_21L 5
566 /* Return the final relocation type for the given base type, instruction
567 format, and field selector. */
570 elf_hppa_reloc_final_type (bfd *abfd,
571 elf_hppa_reloc_type base_type,
575 elf_hppa_reloc_type final_type = base_type;
577 /* Just a tangle of nested switch statements to deal with the braindamage
578 that a different field selector means a completely different relocation
582 /* We have been using generic relocation types. However, that may not
583 really make sense. Anyway, we need to support both R_PARISC_DIR64
584 and R_PARISC_DIR32 here. */
587 case R_HPPA_ABS_CALL:
594 final_type = R_PARISC_DIR14F;
599 final_type = R_PARISC_DIR14R;
602 final_type = R_PARISC_DLTIND14R;
605 final_type = R_PARISC_LTOFF_FPTR14DR;
608 final_type = R_PARISC_DLTIND14F;
611 final_type = R_PARISC_PLABEL14R;
614 return R_PARISC_NONE;
622 final_type = R_PARISC_DIR17F;
627 final_type = R_PARISC_DIR17R;
630 return R_PARISC_NONE;
642 final_type = R_PARISC_DIR21L;
645 final_type = R_PARISC_DLTIND21L;
648 final_type = R_PARISC_LTOFF_FPTR21L;
651 final_type = R_PARISC_PLABEL21L;
654 return R_PARISC_NONE;
662 final_type = R_PARISC_DIR32;
663 /* When in 64bit mode, a 32bit relocation is supposed to
664 be a section relative relocation. Dwarf2 (for example)
665 uses 32bit section relative relocations. */
666 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
667 final_type = R_PARISC_SECREL32;
670 final_type = R_PARISC_PLABEL32;
673 return R_PARISC_NONE;
681 final_type = R_PARISC_DIR64;
684 final_type = R_PARISC_FPTR64;
687 return R_PARISC_NONE;
692 return R_PARISC_NONE;
705 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */
706 final_type = base_type + OFFSET_14R_FROM_21L;
709 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32 */
710 final_type = base_type + OFFSET_14F_FROM_21L;
713 return R_PARISC_NONE;
725 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */
726 final_type = base_type;
729 return R_PARISC_NONE;
734 return R_PARISC_NONE;
738 case R_HPPA_PCREL_CALL:
745 final_type = R_PARISC_PCREL12F;
748 return R_PARISC_NONE;
753 /* Contrary to appearances, these are not calls of any sort.
754 Rather, they are loads/stores with a pcrel reloc. */
760 final_type = R_PARISC_PCREL14R;
763 if (bfd_get_mach (abfd) < 25)
764 final_type = R_PARISC_PCREL14F;
766 final_type = R_PARISC_PCREL16F;
769 return R_PARISC_NONE;
779 final_type = R_PARISC_PCREL17R;
782 final_type = R_PARISC_PCREL17F;
785 return R_PARISC_NONE;
797 final_type = R_PARISC_PCREL21L;
800 return R_PARISC_NONE;
808 final_type = R_PARISC_PCREL22F;
811 return R_PARISC_NONE;
819 final_type = R_PARISC_PCREL32;
822 return R_PARISC_NONE;
830 final_type = R_PARISC_PCREL64;
833 return R_PARISC_NONE;
838 return R_PARISC_NONE;
842 case R_PARISC_GNU_VTENTRY:
843 case R_PARISC_GNU_VTINHERIT:
844 case R_PARISC_SEGREL32:
845 case R_PARISC_SEGBASE:
846 /* The defaults are fine for these cases. */
850 return R_PARISC_NONE;
856 /* Return one (or more) BFD relocations which implement the base
857 relocation with modifications based on format and field. */
859 elf_hppa_reloc_type **
860 _bfd_elf_hppa_gen_reloc_type (bfd *abfd,
861 elf_hppa_reloc_type base_type,
864 int ignore ATTRIBUTE_UNUSED,
865 asymbol *sym ATTRIBUTE_UNUSED)
867 elf_hppa_reloc_type *finaltype;
868 elf_hppa_reloc_type **final_types;
869 bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
871 /* Allocate slots for the BFD relocation. */
872 final_types = bfd_alloc (abfd, amt);
873 if (final_types == NULL)
876 /* Allocate space for the relocation itself. */
877 amt = sizeof (elf_hppa_reloc_type);
878 finaltype = bfd_alloc (abfd, amt);
879 if (finaltype == NULL)
882 /* Some reasonable defaults. */
883 final_types[0] = finaltype;
884 final_types[1] = NULL;
886 *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
891 /* Translate from an elf into field into a howto relocation pointer. */
894 elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
896 Elf_Internal_Rela *elf_reloc)
898 BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
899 < (unsigned int) R_PARISC_UNIMPLEMENTED);
900 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
903 /* Translate from an elf into field into a howto relocation pointer. */
906 elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
908 Elf_Internal_Rela *elf_reloc)
910 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
911 < (unsigned int) R_PARISC_UNIMPLEMENTED);
912 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
915 /* Return the address of the howto table entry to perform the CODE
916 relocation for an ARCH machine. */
918 static reloc_howto_type *
919 elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
920 bfd_reloc_code_real_type code)
922 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
924 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
925 return &elf_hppa_howto_table[(int) code];
930 /* Return TRUE if SYM represents a local label symbol. */
933 elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
935 if (name[0] == 'L' && name[1] == '$')
937 return _bfd_elf_is_local_label_name (abfd, name);
940 /* Set the correct type for an ELF section. We do this by the
941 section name, which is a hack, but ought to work. */
944 elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
948 name = bfd_get_section_name (abfd, sec);
950 if (strcmp (name, ".PARISC.unwind") == 0)
955 hdr->sh_type = SHT_LOPROC + 1;
959 /* ?!? How are unwinds supposed to work for symbols in arbitrary
960 sections? Or what if we have multiple .text sections in a single
961 .o file? HP really messed up on this one.
963 Ugh. We can not use elf_section_data (sec)->this_idx at this
964 point because it is not initialized yet.
966 So we (gasp) recompute it here. Hopefully nobody ever changes the
967 way sections are numbered in elf.c! */
968 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
970 if (asec->name && strcmp (asec->name, ".text") == 0)
977 /* I have no idea if this is really necessary or what it means. */
984 elf_hppa_final_write_processing (bfd *abfd,
985 bfd_boolean linker ATTRIBUTE_UNUSED)
987 int mach = bfd_get_mach (abfd);
989 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
990 | EF_PARISC_EXT | EF_PARISC_LSB
991 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
992 | EF_PARISC_LAZYSWAP);
995 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
997 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
999 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1000 else if (mach == 25)
1001 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1003 /* The GNU tools have trapped without
1004 option since 1993, so need to take
1005 a step backwards with the ELF
1006 based toolchains. */
1007 | EF_PARISC_TRAPNIL);
1010 /* Comparison function for qsort to sort unwind section during a
1014 hppa_unwind_entry_compare (const void *a, const void *b)
1016 const bfd_byte *ap, *bp;
1017 unsigned long av, bv;
1020 av = (unsigned long) ap[0] << 24;
1021 av |= (unsigned long) ap[1] << 16;
1022 av |= (unsigned long) ap[2] << 8;
1023 av |= (unsigned long) ap[3];
1026 bv = (unsigned long) bp[0] << 24;
1027 bv |= (unsigned long) bp[1] << 16;
1028 bv |= (unsigned long) bp[2] << 8;
1029 bv |= (unsigned long) bp[3];
1031 return av < bv ? -1 : av > bv ? 1 : 0;
1034 static bfd_boolean elf_hppa_sort_unwind (bfd *abfd)
1038 /* Magic section names, but this is much safer than having
1039 relocate_section remember where SEGREL32 relocs occurred.
1040 Consider what happens if someone inept creates a linker script
1041 that puts unwind information in .text. */
1042 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1048 size = s->_raw_size;
1049 contents = bfd_malloc (size);
1050 if (contents == NULL)
1053 if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
1056 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1058 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1066 /* Hook called by the linker routine which adds symbols from an object
1067 file. HP's libraries define symbols with HP specific section
1068 indices, which we have to handle. */
1071 elf_hppa_add_symbol_hook (bfd *abfd,
1072 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1073 const Elf_Internal_Sym *sym,
1074 const char **namep ATTRIBUTE_UNUSED,
1075 flagword *flagsp ATTRIBUTE_UNUSED,
1079 int index = sym->st_shndx;
1083 case SHN_PARISC_ANSI_COMMON:
1084 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1085 (*secp)->flags |= SEC_IS_COMMON;
1086 *valp = sym->st_size;
1089 case SHN_PARISC_HUGE_COMMON:
1090 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1091 (*secp)->flags |= SEC_IS_COMMON;
1092 *valp = sym->st_size;
1100 elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1103 struct bfd_link_info *info = data;
1105 if (h->root.type == bfd_link_hash_warning)
1106 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1108 /* If we are not creating a shared library, and this symbol is
1109 referenced by a shared library but is not defined anywhere, then
1110 the generic code will warn that it is undefined.
1112 This behavior is undesirable on HPs since the standard shared
1113 libraries contain references to undefined symbols.
1115 So we twiddle the flags associated with such symbols so that they
1116 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1118 Ultimately we should have better controls over the generic ELF BFD
1120 if (! info->relocatable
1121 && info->unresolved_syms_in_shared_libs != RM_IGNORE
1122 && h->root.type == bfd_link_hash_undefined
1123 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
1124 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
1126 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
1127 h->elf_link_hash_flags |= 0x8000;
1134 elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1137 struct bfd_link_info *info = data;
1139 if (h->root.type == bfd_link_hash_warning)
1140 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1142 /* If we are not creating a shared library, and this symbol is
1143 referenced by a shared library but is not defined anywhere, then
1144 the generic code will warn that it is undefined.
1146 This behavior is undesirable on HPs since the standard shared
1147 libraries contain references to undefined symbols.
1149 So we twiddle the flags associated with such symbols so that they
1150 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1152 Ultimately we should have better controls over the generic ELF BFD
1154 if (! info->relocatable
1155 && info->unresolved_syms_in_shared_libs != RM_IGNORE
1156 && h->root.type == bfd_link_hash_undefined
1157 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
1158 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
1159 && (h->elf_link_hash_flags & 0x8000) != 0)
1161 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
1162 h->elf_link_hash_flags &= ~0x8000;
1169 elf_hppa_is_dynamic_loader_symbol (const char *name)
1171 return (! strcmp (name, "__CPU_REVISION")
1172 || ! strcmp (name, "__CPU_KEYBITS_1")
1173 || ! strcmp (name, "__SYSTEM_ID_D")
1174 || ! strcmp (name, "__FPU_MODEL")
1175 || ! strcmp (name, "__FPU_REVISION")
1176 || ! strcmp (name, "__ARGC")
1177 || ! strcmp (name, "__ARGV")
1178 || ! strcmp (name, "__ENVP")
1179 || ! strcmp (name, "__TLS_SIZE_D")
1180 || ! strcmp (name, "__LOAD_INFO")
1181 || ! strcmp (name, "__systab"));
1184 /* Record the lowest address for the data and text segments. */
1186 elf_hppa_record_segment_addrs (bfd *abfd ATTRIBUTE_UNUSED,
1190 struct elf64_hppa_link_hash_table *hppa_info;
1195 value = section->vma - section->filepos;
1197 if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1198 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1199 && value < hppa_info->text_segment_base)
1200 hppa_info->text_segment_base = value;
1201 else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1202 == (SEC_ALLOC | SEC_LOAD))
1203 && value < hppa_info->data_segment_base)
1204 hppa_info->data_segment_base = value;
1207 /* Called after we have seen all the input files/sections, but before
1208 final symbol resolution and section placement has been determined.
1210 We use this hook to (possibly) provide a value for __gp, then we
1211 fall back to the generic ELF final link routine. */
1214 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
1217 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1219 if (! info->relocatable)
1221 struct elf_link_hash_entry *gp;
1224 /* The linker script defines a value for __gp iff it was referenced
1225 by one of the objects being linked. First try to find the symbol
1226 in the hash table. If that fails, just compute the value __gp
1228 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
1234 /* Adjust the value of __gp as we may want to slide it into the
1235 .plt section so that the stubs can access PLT entries without
1236 using an addil sequence. */
1237 gp->root.u.def.value += hppa_info->gp_offset;
1239 gp_val = (gp->root.u.def.section->output_section->vma
1240 + gp->root.u.def.section->output_offset
1241 + gp->root.u.def.value);
1247 /* First look for a .plt section. If found, then __gp is the
1248 address of the .plt + gp_offset.
1250 If no .plt is found, then look for .dlt, .opd and .data (in
1251 that order) and set __gp to the base address of whichever
1252 section is found first. */
1254 sec = hppa_info->plt_sec;
1255 if (sec && ! (sec->flags & SEC_EXCLUDE))
1256 gp_val = (sec->output_offset
1257 + sec->output_section->vma
1258 + hppa_info->gp_offset);
1261 sec = hppa_info->dlt_sec;
1262 if (!sec || (sec->flags & SEC_EXCLUDE))
1263 sec = hppa_info->opd_sec;
1264 if (!sec || (sec->flags & SEC_EXCLUDE))
1265 sec = bfd_get_section_by_name (abfd, ".data");
1266 if (!sec || (sec->flags & SEC_EXCLUDE))
1269 gp_val = sec->output_offset + sec->output_section->vma;
1273 /* Install whatever value we found/computed for __gp. */
1274 _bfd_set_gp_value (abfd, gp_val);
1277 /* We need to know the base of the text and data segments so that we
1278 can perform SEGREL relocations. We will record the base addresses
1279 when we encounter the first SEGREL relocation. */
1280 hppa_info->text_segment_base = (bfd_vma)-1;
1281 hppa_info->data_segment_base = (bfd_vma)-1;
1283 /* HP's shared libraries have references to symbols that are not
1284 defined anywhere. The generic ELF BFD linker code will complain
1287 So we detect the losing case and arrange for the flags on the symbol
1288 to indicate that it was never referenced. This keeps the generic
1289 ELF BFD link code happy and appears to not create any secondary
1290 problems. Ultimately we need a way to control the behavior of the
1291 generic ELF BFD link code better. */
1292 elf_link_hash_traverse (elf_hash_table (info),
1293 elf_hppa_unmark_useless_dynamic_symbols,
1296 /* Invoke the regular ELF backend linker to do all the work. */
1297 retval = bfd_elf_bfd_final_link (abfd, info);
1299 elf_link_hash_traverse (elf_hash_table (info),
1300 elf_hppa_remark_useless_dynamic_symbols,
1303 /* If we're producing a final executable, sort the contents of the
1306 retval = elf_hppa_sort_unwind (abfd);
1311 /* Relocate an HPPA ELF section. */
1314 elf_hppa_relocate_section (bfd *output_bfd,
1315 struct bfd_link_info *info,
1317 asection *input_section,
1319 Elf_Internal_Rela *relocs,
1320 Elf_Internal_Sym *local_syms,
1321 asection **local_sections)
1323 Elf_Internal_Shdr *symtab_hdr;
1324 Elf_Internal_Rela *rel;
1325 Elf_Internal_Rela *relend;
1326 struct elf64_hppa_link_hash_table *hppa_info;
1328 if (info->relocatable)
1331 hppa_info = elf64_hppa_hash_table (info);
1332 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1335 relend = relocs + input_section->reloc_count;
1336 for (; rel < relend; rel++)
1339 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1340 unsigned long r_symndx;
1341 struct elf_link_hash_entry *h;
1342 Elf_Internal_Sym *sym;
1345 bfd_reloc_status_type r;
1346 const char *sym_name;
1347 const char *dyn_name;
1348 char *dynh_buf = NULL;
1349 size_t dynh_buflen = 0;
1350 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
1352 r_type = ELF_R_TYPE (rel->r_info);
1353 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1355 bfd_set_error (bfd_error_bad_value);
1359 /* This is a final link. */
1360 r_symndx = ELF_R_SYM (rel->r_info);
1364 if (r_symndx < symtab_hdr->sh_info)
1366 /* This is a local symbol. */
1367 sym = local_syms + r_symndx;
1368 sym_sec = local_sections[r_symndx];
1369 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
1371 /* If this symbol has an entry in the PA64 dynamic hash
1372 table, then get it. */
1373 dyn_name = get_dyn_name (input_bfd, h, rel,
1374 &dynh_buf, &dynh_buflen);
1375 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1376 dyn_name, FALSE, FALSE);
1381 /* This is not a local symbol. */
1384 indx = r_symndx - symtab_hdr->sh_info;
1385 h = elf_sym_hashes (input_bfd)[indx];
1386 while (h->root.type == bfd_link_hash_indirect
1387 || h->root.type == bfd_link_hash_warning)
1388 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1389 if (h->root.type == bfd_link_hash_defined
1390 || h->root.type == bfd_link_hash_defweak)
1392 sym_sec = h->root.u.def.section;
1394 /* If this symbol has an entry in the PA64 dynamic hash
1395 table, then get it. */
1396 dyn_name = get_dyn_name (input_bfd, h, rel,
1397 &dynh_buf, &dynh_buflen);
1398 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1399 dyn_name, FALSE, FALSE);
1401 /* If we have a relocation against a symbol defined in a
1402 shared library and we have not created an entry in the
1403 PA64 dynamic symbol hash table for it, then we lose. */
1404 if (sym_sec->output_section == NULL && dyn_h == NULL)
1406 (*_bfd_error_handler)
1407 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1408 bfd_archive_filename (input_bfd), h->root.root.string,
1409 bfd_get_section_name (input_bfd, input_section));
1412 else if (sym_sec->output_section)
1413 relocation = (h->root.u.def.value
1414 + sym_sec->output_offset
1415 + sym_sec->output_section->vma);
1416 /* Value will be provided via one of the offsets in the
1417 dyn_h hash table entry. */
1421 else if (info->unresolved_syms_in_objects == RM_IGNORE
1422 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1424 /* If this symbol has an entry in the PA64 dynamic hash
1425 table, then get it. */
1426 dyn_name = get_dyn_name (input_bfd, h, rel,
1427 &dynh_buf, &dynh_buflen);
1428 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1429 dyn_name, FALSE, FALSE);
1433 (*_bfd_error_handler)
1434 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1435 bfd_archive_filename (input_bfd), h->root.root.string,
1436 bfd_get_section_name (input_bfd, input_section));
1440 else if (h->root.type == bfd_link_hash_undefweak)
1442 dyn_name = get_dyn_name (input_bfd, h, rel,
1443 &dynh_buf, &dynh_buflen);
1444 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1445 dyn_name, FALSE, FALSE);
1449 (*_bfd_error_handler)
1450 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1451 bfd_archive_filename (input_bfd), h->root.root.string,
1452 bfd_get_section_name (input_bfd, input_section));
1458 /* Ignore dynamic loader defined symbols. */
1459 if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1463 if (!((*info->callbacks->undefined_symbol)
1464 (info, h->root.root.string, input_bfd,
1465 input_section, rel->r_offset,
1466 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1467 || ELF_ST_VISIBILITY (h->other)))))
1475 sym_name = h->root.root.string;
1478 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1479 symtab_hdr->sh_link,
1481 if (sym_name == NULL)
1483 if (*sym_name == '\0')
1484 sym_name = bfd_section_name (input_bfd, sym_sec);
1487 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1488 input_section, contents,
1489 relocation, info, sym_sec,
1492 if (r != bfd_reloc_ok)
1498 case bfd_reloc_overflow:
1500 if (!((*info->callbacks->reloc_overflow)
1501 (info, sym_name, howto->name, (bfd_vma) 0,
1502 input_bfd, input_section, rel->r_offset)))
1512 /* Compute the value for a relocation (REL) during a final link stage,
1513 then insert the value into the proper location in CONTENTS.
1515 VALUE is a tentative value for the relocation and may be overridden
1516 and modified here based on the specific relocation to be performed.
1518 For example we do conversions for PC-relative branches in this routine
1519 or redirection of calls to external routines to stubs.
1521 The work of actually applying the relocation is left to a helper
1522 routine in an attempt to reduce the complexity and size of this
1525 static bfd_reloc_status_type
1526 elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
1529 asection *input_section,
1532 struct bfd_link_info *info,
1534 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1535 struct elf64_hppa_dyn_hash_entry *dyn_h)
1538 bfd_vma offset = rel->r_offset;
1539 bfd_signed_vma addend = rel->r_addend;
1540 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1541 unsigned int r_type = howto->type;
1542 bfd_byte *hit_data = contents + offset;
1543 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1545 insn = bfd_get_32 (input_bfd, hit_data);
1552 /* Basic function call support.
1554 Note for a call to a function defined in another dynamic library
1555 we want to redirect the call to a stub. */
1557 /* Random PC relative relocs. */
1558 case R_PARISC_PCREL21L:
1559 case R_PARISC_PCREL14R:
1560 case R_PARISC_PCREL14F:
1561 case R_PARISC_PCREL14WR:
1562 case R_PARISC_PCREL14DR:
1563 case R_PARISC_PCREL16F:
1564 case R_PARISC_PCREL16WF:
1565 case R_PARISC_PCREL16DF:
1567 /* If this is a call to a function defined in another dynamic
1568 library, then redirect the call to the local stub for this
1570 if (sym_sec == NULL || sym_sec->output_section == NULL)
1571 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1572 + hppa_info->stub_sec->output_section->vma);
1574 /* Turn VALUE into a proper PC relative address. */
1575 value -= (offset + input_section->output_offset
1576 + input_section->output_section->vma);
1578 /* Adjust for any field selectors. */
1579 if (r_type == R_PARISC_PCREL21L)
1580 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1581 else if (r_type == R_PARISC_PCREL14F
1582 || r_type == R_PARISC_PCREL16F
1583 || r_type == R_PARISC_PCREL16WF
1584 || r_type == R_PARISC_PCREL16DF)
1585 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1587 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1589 /* Apply the relocation to the given instruction. */
1590 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1594 case R_PARISC_PCREL12F:
1595 case R_PARISC_PCREL22F:
1596 case R_PARISC_PCREL17F:
1597 case R_PARISC_PCREL22C:
1598 case R_PARISC_PCREL17C:
1599 case R_PARISC_PCREL17R:
1601 /* If this is a call to a function defined in another dynamic
1602 library, then redirect the call to the local stub for this
1604 if (sym_sec == NULL || sym_sec->output_section == NULL)
1605 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1606 + hppa_info->stub_sec->output_section->vma);
1608 /* Turn VALUE into a proper PC relative address. */
1609 value -= (offset + input_section->output_offset
1610 + input_section->output_section->vma);
1612 /* Adjust for any field selectors. */
1613 if (r_type == R_PARISC_PCREL17R)
1614 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1616 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1618 /* All branches are implicitly shifted by 2 places. */
1621 /* Apply the relocation to the given instruction. */
1622 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1626 /* Indirect references to data through the DLT. */
1627 case R_PARISC_DLTIND14R:
1628 case R_PARISC_DLTIND14F:
1629 case R_PARISC_DLTIND14DR:
1630 case R_PARISC_DLTIND14WR:
1631 case R_PARISC_DLTIND21L:
1632 case R_PARISC_LTOFF_FPTR14R:
1633 case R_PARISC_LTOFF_FPTR14DR:
1634 case R_PARISC_LTOFF_FPTR14WR:
1635 case R_PARISC_LTOFF_FPTR21L:
1636 case R_PARISC_LTOFF_FPTR16F:
1637 case R_PARISC_LTOFF_FPTR16WF:
1638 case R_PARISC_LTOFF_FPTR16DF:
1639 case R_PARISC_LTOFF_TP21L:
1640 case R_PARISC_LTOFF_TP14R:
1641 case R_PARISC_LTOFF_TP14F:
1642 case R_PARISC_LTOFF_TP14WR:
1643 case R_PARISC_LTOFF_TP14DR:
1644 case R_PARISC_LTOFF_TP16F:
1645 case R_PARISC_LTOFF_TP16WF:
1646 case R_PARISC_LTOFF_TP16DF:
1647 case R_PARISC_LTOFF16F:
1648 case R_PARISC_LTOFF16WF:
1649 case R_PARISC_LTOFF16DF:
1651 /* If this relocation was against a local symbol, then we still
1652 have not set up the DLT entry (it's not convenient to do so
1653 in the "finalize_dlt" routine because it is difficult to get
1654 to the local symbol's value).
1656 So, if this is a local symbol (h == NULL), then we need to
1657 fill in its DLT entry.
1659 Similarly we may still need to set up an entry in .opd for
1660 a local function which had its address taken. */
1661 if (dyn_h->h == NULL)
1663 /* Now do .opd creation if needed. */
1664 if (r_type == R_PARISC_LTOFF_FPTR14R
1665 || r_type == R_PARISC_LTOFF_FPTR14DR
1666 || r_type == R_PARISC_LTOFF_FPTR14WR
1667 || r_type == R_PARISC_LTOFF_FPTR21L
1668 || r_type == R_PARISC_LTOFF_FPTR16F
1669 || r_type == R_PARISC_LTOFF_FPTR16WF
1670 || r_type == R_PARISC_LTOFF_FPTR16DF)
1672 /* The first two words of an .opd entry are zero. */
1673 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1676 /* The next word is the address of the function. */
1677 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1678 (hppa_info->opd_sec->contents
1679 + dyn_h->opd_offset + 16));
1681 /* The last word is our local __gp value. */
1682 value = _bfd_get_gp_value
1683 (hppa_info->opd_sec->output_section->owner);
1684 bfd_put_64 (hppa_info->opd_sec->owner, value,
1685 (hppa_info->opd_sec->contents
1686 + dyn_h->opd_offset + 24));
1688 /* The DLT value is the address of the .opd entry. */
1689 value = (dyn_h->opd_offset
1690 + hppa_info->opd_sec->output_offset
1691 + hppa_info->opd_sec->output_section->vma);
1695 bfd_put_64 (hppa_info->dlt_sec->owner,
1697 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1700 /* We want the value of the DLT offset for this symbol, not
1701 the symbol's actual address. Note that __gp may not point
1702 to the start of the DLT, so we have to compute the absolute
1703 address, then subtract out the value of __gp. */
1704 value = (dyn_h->dlt_offset
1705 + hppa_info->dlt_sec->output_offset
1706 + hppa_info->dlt_sec->output_section->vma);
1707 value -= _bfd_get_gp_value (output_bfd);
1709 /* All DLTIND relocations are basically the same at this point,
1710 except that we need different field selectors for the 21bit
1711 version vs the 14bit versions. */
1712 if (r_type == R_PARISC_DLTIND21L
1713 || r_type == R_PARISC_LTOFF_FPTR21L
1714 || r_type == R_PARISC_LTOFF_TP21L)
1715 value = hppa_field_adjust (value, 0, e_lsel);
1716 else if (r_type == R_PARISC_DLTIND14F
1717 || r_type == R_PARISC_LTOFF_FPTR16F
1718 || r_type == R_PARISC_LTOFF_FPTR16WF
1719 || r_type == R_PARISC_LTOFF_FPTR16DF
1720 || r_type == R_PARISC_LTOFF16F
1721 || r_type == R_PARISC_LTOFF16DF
1722 || r_type == R_PARISC_LTOFF16WF
1723 || r_type == R_PARISC_LTOFF_TP16F
1724 || r_type == R_PARISC_LTOFF_TP16WF
1725 || r_type == R_PARISC_LTOFF_TP16DF)
1726 value = hppa_field_adjust (value, 0, e_fsel);
1728 value = hppa_field_adjust (value, 0, e_rsel);
1730 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1734 case R_PARISC_DLTREL14R:
1735 case R_PARISC_DLTREL14F:
1736 case R_PARISC_DLTREL14DR:
1737 case R_PARISC_DLTREL14WR:
1738 case R_PARISC_DLTREL21L:
1739 case R_PARISC_DPREL21L:
1740 case R_PARISC_DPREL14WR:
1741 case R_PARISC_DPREL14DR:
1742 case R_PARISC_DPREL14R:
1743 case R_PARISC_DPREL14F:
1744 case R_PARISC_GPREL16F:
1745 case R_PARISC_GPREL16WF:
1746 case R_PARISC_GPREL16DF:
1748 /* Subtract out the global pointer value to make value a DLT
1749 relative address. */
1750 value -= _bfd_get_gp_value (output_bfd);
1752 /* All DLTREL relocations are basically the same at this point,
1753 except that we need different field selectors for the 21bit
1754 version vs the 14bit versions. */
1755 if (r_type == R_PARISC_DLTREL21L
1756 || r_type == R_PARISC_DPREL21L)
1757 value = hppa_field_adjust (value, addend, e_lrsel);
1758 else if (r_type == R_PARISC_DLTREL14F
1759 || r_type == R_PARISC_DPREL14F
1760 || r_type == R_PARISC_GPREL16F
1761 || r_type == R_PARISC_GPREL16WF
1762 || r_type == R_PARISC_GPREL16DF)
1763 value = hppa_field_adjust (value, addend, e_fsel);
1765 value = hppa_field_adjust (value, addend, e_rrsel);
1767 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1771 case R_PARISC_DIR21L:
1772 case R_PARISC_DIR17R:
1773 case R_PARISC_DIR17F:
1774 case R_PARISC_DIR14R:
1775 case R_PARISC_DIR14F:
1776 case R_PARISC_DIR14WR:
1777 case R_PARISC_DIR14DR:
1778 case R_PARISC_DIR16F:
1779 case R_PARISC_DIR16WF:
1780 case R_PARISC_DIR16DF:
1782 /* All DIR relocations are basically the same at this point,
1783 except that branch offsets need to be divided by four, and
1784 we need different field selectors. Note that we don't
1785 redirect absolute calls to local stubs. */
1787 if (r_type == R_PARISC_DIR21L)
1788 value = hppa_field_adjust (value, addend, e_lrsel);
1789 else if (r_type == R_PARISC_DIR17F
1790 || r_type == R_PARISC_DIR16F
1791 || r_type == R_PARISC_DIR16WF
1792 || r_type == R_PARISC_DIR16DF
1793 || r_type == R_PARISC_DIR14F)
1794 value = hppa_field_adjust (value, addend, e_fsel);
1796 value = hppa_field_adjust (value, addend, e_rrsel);
1798 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1800 /* All branches are implicitly shifted by 2 places. */
1804 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1808 case R_PARISC_PLTOFF21L:
1809 case R_PARISC_PLTOFF14R:
1810 case R_PARISC_PLTOFF14F:
1811 case R_PARISC_PLTOFF14WR:
1812 case R_PARISC_PLTOFF14DR:
1813 case R_PARISC_PLTOFF16F:
1814 case R_PARISC_PLTOFF16WF:
1815 case R_PARISC_PLTOFF16DF:
1817 /* We want the value of the PLT offset for this symbol, not
1818 the symbol's actual address. Note that __gp may not point
1819 to the start of the DLT, so we have to compute the absolute
1820 address, then subtract out the value of __gp. */
1821 value = (dyn_h->plt_offset
1822 + hppa_info->plt_sec->output_offset
1823 + hppa_info->plt_sec->output_section->vma);
1824 value -= _bfd_get_gp_value (output_bfd);
1826 /* All PLTOFF relocations are basically the same at this point,
1827 except that we need different field selectors for the 21bit
1828 version vs the 14bit versions. */
1829 if (r_type == R_PARISC_PLTOFF21L)
1830 value = hppa_field_adjust (value, addend, e_lrsel);
1831 else if (r_type == R_PARISC_PLTOFF14F
1832 || r_type == R_PARISC_PLTOFF16F
1833 || r_type == R_PARISC_PLTOFF16WF
1834 || r_type == R_PARISC_PLTOFF16DF)
1835 value = hppa_field_adjust (value, addend, e_fsel);
1837 value = hppa_field_adjust (value, addend, e_rrsel);
1839 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1843 case R_PARISC_LTOFF_FPTR32:
1845 /* We may still need to create the FPTR itself if it was for
1847 if (dyn_h->h == NULL)
1849 /* The first two words of an .opd entry are zero. */
1850 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1852 /* The next word is the address of the function. */
1853 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1854 (hppa_info->opd_sec->contents
1855 + dyn_h->opd_offset + 16));
1857 /* The last word is our local __gp value. */
1858 value = _bfd_get_gp_value
1859 (hppa_info->opd_sec->output_section->owner);
1860 bfd_put_64 (hppa_info->opd_sec->owner, value,
1861 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1863 /* The DLT value is the address of the .opd entry. */
1864 value = (dyn_h->opd_offset
1865 + hppa_info->opd_sec->output_offset
1866 + hppa_info->opd_sec->output_section->vma);
1868 bfd_put_64 (hppa_info->dlt_sec->owner,
1870 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1873 /* We want the value of the DLT offset for this symbol, not
1874 the symbol's actual address. Note that __gp may not point
1875 to the start of the DLT, so we have to compute the absolute
1876 address, then subtract out the value of __gp. */
1877 value = (dyn_h->dlt_offset
1878 + hppa_info->dlt_sec->output_offset
1879 + hppa_info->dlt_sec->output_section->vma);
1880 value -= _bfd_get_gp_value (output_bfd);
1881 bfd_put_32 (input_bfd, value, hit_data);
1882 return bfd_reloc_ok;
1885 case R_PARISC_LTOFF_FPTR64:
1886 case R_PARISC_LTOFF_TP64:
1888 /* We may still need to create the FPTR itself if it was for
1890 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1892 /* The first two words of an .opd entry are zero. */
1893 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1895 /* The next word is the address of the function. */
1896 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1897 (hppa_info->opd_sec->contents
1898 + dyn_h->opd_offset + 16));
1900 /* The last word is our local __gp value. */
1901 value = _bfd_get_gp_value
1902 (hppa_info->opd_sec->output_section->owner);
1903 bfd_put_64 (hppa_info->opd_sec->owner, value,
1904 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1906 /* The DLT value is the address of the .opd entry. */
1907 value = (dyn_h->opd_offset
1908 + hppa_info->opd_sec->output_offset
1909 + hppa_info->opd_sec->output_section->vma);
1911 bfd_put_64 (hppa_info->dlt_sec->owner,
1913 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1916 /* We want the value of the DLT offset for this symbol, not
1917 the symbol's actual address. Note that __gp may not point
1918 to the start of the DLT, so we have to compute the absolute
1919 address, then subtract out the value of __gp. */
1920 value = (dyn_h->dlt_offset
1921 + hppa_info->dlt_sec->output_offset
1922 + hppa_info->dlt_sec->output_section->vma);
1923 value -= _bfd_get_gp_value (output_bfd);
1924 bfd_put_64 (input_bfd, value, hit_data);
1925 return bfd_reloc_ok;
1928 case R_PARISC_DIR32:
1929 bfd_put_32 (input_bfd, value + addend, hit_data);
1930 return bfd_reloc_ok;
1932 case R_PARISC_DIR64:
1933 bfd_put_64 (input_bfd, value + addend, hit_data);
1934 return bfd_reloc_ok;
1936 case R_PARISC_GPREL64:
1937 /* Subtract out the global pointer value to make value a DLT
1938 relative address. */
1939 value -= _bfd_get_gp_value (output_bfd);
1941 bfd_put_64 (input_bfd, value + addend, hit_data);
1942 return bfd_reloc_ok;
1944 case R_PARISC_LTOFF64:
1945 /* We want the value of the DLT offset for this symbol, not
1946 the symbol's actual address. Note that __gp may not point
1947 to the start of the DLT, so we have to compute the absolute
1948 address, then subtract out the value of __gp. */
1949 value = (dyn_h->dlt_offset
1950 + hppa_info->dlt_sec->output_offset
1951 + hppa_info->dlt_sec->output_section->vma);
1952 value -= _bfd_get_gp_value (output_bfd);
1954 bfd_put_64 (input_bfd, value + addend, hit_data);
1955 return bfd_reloc_ok;
1957 case R_PARISC_PCREL32:
1959 /* If this is a call to a function defined in another dynamic
1960 library, then redirect the call to the local stub for this
1962 if (sym_sec == NULL || sym_sec->output_section == NULL)
1963 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1964 + hppa_info->stub_sec->output_section->vma);
1966 /* Turn VALUE into a proper PC relative address. */
1967 value -= (offset + input_section->output_offset
1968 + input_section->output_section->vma);
1972 bfd_put_32 (input_bfd, value, hit_data);
1973 return bfd_reloc_ok;
1976 case R_PARISC_PCREL64:
1978 /* If this is a call to a function defined in another dynamic
1979 library, then redirect the call to the local stub for this
1981 if (sym_sec == NULL || sym_sec->output_section == NULL)
1982 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1983 + hppa_info->stub_sec->output_section->vma);
1985 /* Turn VALUE into a proper PC relative address. */
1986 value -= (offset + input_section->output_offset
1987 + input_section->output_section->vma);
1991 bfd_put_64 (input_bfd, value, hit_data);
1992 return bfd_reloc_ok;
1995 case R_PARISC_FPTR64:
1997 /* We may still need to create the FPTR itself if it was for
1999 if (dyn_h->h == NULL)
2001 /* The first two words of an .opd entry are zero. */
2002 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2004 /* The next word is the address of the function. */
2005 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
2006 (hppa_info->opd_sec->contents
2007 + dyn_h->opd_offset + 16));
2009 /* The last word is our local __gp value. */
2010 value = _bfd_get_gp_value
2011 (hppa_info->opd_sec->output_section->owner);
2012 bfd_put_64 (hppa_info->opd_sec->owner, value,
2013 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2016 if (dyn_h->want_opd)
2017 /* We want the value of the OPD offset for this symbol. */
2018 value = (dyn_h->opd_offset
2019 + hppa_info->opd_sec->output_offset
2020 + hppa_info->opd_sec->output_section->vma);
2022 /* We want the address of the symbol. */
2025 bfd_put_64 (input_bfd, value, hit_data);
2026 return bfd_reloc_ok;
2029 case R_PARISC_SECREL32:
2030 bfd_put_32 (input_bfd,
2031 value + addend - sym_sec->output_section->vma,
2033 return bfd_reloc_ok;
2035 case R_PARISC_SEGREL32:
2036 case R_PARISC_SEGREL64:
2038 /* If this is the first SEGREL relocation, then initialize
2039 the segment base values. */
2040 if (hppa_info->text_segment_base == (bfd_vma) -1)
2041 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
2044 /* VALUE holds the absolute address. We want to include the
2045 addend, then turn it into a segment relative address.
2047 The segment is derived from SYM_SEC. We assume that there are
2048 only two segments of note in the resulting executable/shlib.
2049 A readonly segment (.text) and a readwrite segment (.data). */
2052 if (sym_sec->flags & SEC_CODE)
2053 value -= hppa_info->text_segment_base;
2055 value -= hppa_info->data_segment_base;
2057 if (r_type == R_PARISC_SEGREL32)
2058 bfd_put_32 (input_bfd, value, hit_data);
2060 bfd_put_64 (input_bfd, value, hit_data);
2061 return bfd_reloc_ok;
2064 /* Something we don't know how to handle. */
2066 return bfd_reloc_notsupported;
2069 /* Update the instruction word. */
2070 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
2071 return bfd_reloc_ok;
2074 /* Relocate the given INSN. VALUE should be the actual value we want
2075 to insert into the instruction, ie by this point we should not be
2076 concerned with computing an offset relative to the DLT, PC, etc.
2077 Instead this routine is meant to handle the bit manipulations needed
2078 to insert the relocation into the given instruction. */
2081 elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
2085 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
2086 the "B" instruction. */
2087 case R_PARISC_PCREL22F:
2088 case R_PARISC_PCREL22C:
2089 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2091 /* This is any 12 bit branch. */
2092 case R_PARISC_PCREL12F:
2093 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2095 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
2096 to the "B" instruction as well as BE. */
2097 case R_PARISC_PCREL17F:
2098 case R_PARISC_DIR17F:
2099 case R_PARISC_DIR17R:
2100 case R_PARISC_PCREL17C:
2101 case R_PARISC_PCREL17R:
2102 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2104 /* ADDIL or LDIL instructions. */
2105 case R_PARISC_DLTREL21L:
2106 case R_PARISC_DLTIND21L:
2107 case R_PARISC_LTOFF_FPTR21L:
2108 case R_PARISC_PCREL21L:
2109 case R_PARISC_LTOFF_TP21L:
2110 case R_PARISC_DPREL21L:
2111 case R_PARISC_PLTOFF21L:
2112 case R_PARISC_DIR21L:
2113 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2115 /* LDO and integer loads/stores with 14 bit displacements. */
2116 case R_PARISC_DLTREL14R:
2117 case R_PARISC_DLTREL14F:
2118 case R_PARISC_DLTIND14R:
2119 case R_PARISC_DLTIND14F:
2120 case R_PARISC_LTOFF_FPTR14R:
2121 case R_PARISC_PCREL14R:
2122 case R_PARISC_PCREL14F:
2123 case R_PARISC_LTOFF_TP14R:
2124 case R_PARISC_LTOFF_TP14F:
2125 case R_PARISC_DPREL14R:
2126 case R_PARISC_DPREL14F:
2127 case R_PARISC_PLTOFF14R:
2128 case R_PARISC_PLTOFF14F:
2129 case R_PARISC_DIR14R:
2130 case R_PARISC_DIR14F:
2131 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2133 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
2134 case R_PARISC_LTOFF_FPTR16F:
2135 case R_PARISC_PCREL16F:
2136 case R_PARISC_LTOFF_TP16F:
2137 case R_PARISC_GPREL16F:
2138 case R_PARISC_PLTOFF16F:
2139 case R_PARISC_DIR16F:
2140 case R_PARISC_LTOFF16F:
2141 return (insn & ~0xffff) | re_assemble_16 (sym_value);
2143 /* Doubleword loads and stores with a 14 bit displacement. */
2144 case R_PARISC_DLTREL14DR:
2145 case R_PARISC_DLTIND14DR:
2146 case R_PARISC_LTOFF_FPTR14DR:
2147 case R_PARISC_LTOFF_FPTR16DF:
2148 case R_PARISC_PCREL14DR:
2149 case R_PARISC_PCREL16DF:
2150 case R_PARISC_LTOFF_TP14DR:
2151 case R_PARISC_LTOFF_TP16DF:
2152 case R_PARISC_DPREL14DR:
2153 case R_PARISC_GPREL16DF:
2154 case R_PARISC_PLTOFF14DR:
2155 case R_PARISC_PLTOFF16DF:
2156 case R_PARISC_DIR14DR:
2157 case R_PARISC_DIR16DF:
2158 case R_PARISC_LTOFF16DF:
2159 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2160 | ((sym_value & 0x1ff8) << 1));
2162 /* Floating point single word load/store instructions. */
2163 case R_PARISC_DLTREL14WR:
2164 case R_PARISC_DLTIND14WR:
2165 case R_PARISC_LTOFF_FPTR14WR:
2166 case R_PARISC_LTOFF_FPTR16WF:
2167 case R_PARISC_PCREL14WR:
2168 case R_PARISC_PCREL16WF:
2169 case R_PARISC_LTOFF_TP14WR:
2170 case R_PARISC_LTOFF_TP16WF:
2171 case R_PARISC_DPREL14WR:
2172 case R_PARISC_GPREL16WF:
2173 case R_PARISC_PLTOFF14WR:
2174 case R_PARISC_PLTOFF16WF:
2175 case R_PARISC_DIR16WF:
2176 case R_PARISC_DIR14WR:
2177 case R_PARISC_LTOFF16WF:
2178 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2179 | ((sym_value & 0x1ffc) << 1));