1 /* Common code for PA ELF implementations.
2 Copyright (C) 1999, 2000 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_internal_shdr Elf64_Internal_Shdr
32 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
33 #define elf_hppa_relocate_section elf64_hppa_relocate_section
34 #define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
35 #define elf_hppa_final_link elf64_hppa_final_link
38 #define ELF_R_TYPE(X) ELF32_R_TYPE(X)
39 #define ELF_R_SYM(X) ELF32_R_SYM(X)
40 #define elf_hppa_internal_shdr Elf32_Internal_Shdr
41 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
42 #define elf_hppa_relocate_section elf32_hppa_relocate_section
43 #define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
44 #define elf_hppa_final_link elf32_hppa_final_link
47 elf_hppa_reloc_type
** _bfd_elf_hppa_gen_reloc_type
48 PARAMS ((bfd
*, elf_hppa_reloc_type
, int, unsigned int, int, asymbol
*));
50 static void elf_hppa_info_to_howto
51 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rela
*));
53 static void elf_hppa_info_to_howto_rel
54 PARAMS ((bfd
*, arelent
*, Elf_Internal_Rel
*));
56 static reloc_howto_type
* elf_hppa_reloc_type_lookup
57 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
59 static boolean elf_hppa_is_local_label_name
60 PARAMS ((bfd
*, const char *));
62 static boolean elf_hppa_fake_sections
63 PARAMS ((bfd
*abfd
, elf_hppa_internal_shdr
*, asection
*));
65 static void elf_hppa_final_write_processing
66 PARAMS ((bfd
*, boolean
));
69 static boolean elf_hppa_add_symbol_hook
70 PARAMS ((bfd
*, struct bfd_link_info
*, const Elf_Internal_Sym
*,
71 const char **, flagword
*, asection
**, bfd_vma
*));
73 static boolean elf_hppa_unmark_useless_dynamic_symbols
74 PARAMS ((struct elf_link_hash_entry
*, PTR
));
76 static boolean elf_hppa_remark_useless_dynamic_symbols
77 PARAMS ((struct elf_link_hash_entry
*, PTR
));
79 static void elf_hppa_record_segment_addrs
80 PARAMS ((bfd
*, asection
*, PTR
));
82 static boolean elf_hppa_final_link
83 PARAMS ((bfd
*, struct bfd_link_info
*));
85 static boolean elf_hppa_relocate_section
86 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*,
87 bfd_byte
*, Elf_Internal_Rela
*, Elf_Internal_Sym
*, asection
**));
89 static bfd_reloc_status_type elf_hppa_final_link_relocate
90 PARAMS ((Elf_Internal_Rela
*, bfd
*, bfd
*, asection
*,
91 bfd_byte
*, bfd_vma
, struct bfd_link_info
*,
92 asection
*, struct elf_link_hash_entry
*,
93 struct elf64_hppa_dyn_hash_entry
*));
95 static unsigned int elf_hppa_relocate_insn
96 PARAMS ((unsigned int, unsigned int, unsigned int));
100 /* ELF/PA relocation howto entries. */
102 static reloc_howto_type elf_hppa_howto_table
[ELF_HOWTO_TABLE_SIZE
] =
104 { R_PARISC_NONE
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
105 bfd_elf_generic_reloc
, "R_PARISC_NONE", false, 0, 0, false },
107 /* The values in DIR32 are to placate the check in
108 _bfd_stab_section_find_nearest_line. */
109 { R_PARISC_DIR32
, 0, 2, 32, false, 0, complain_overflow_bitfield
,
110 bfd_elf_generic_reloc
, "R_PARISC_DIR32", false, 0, 0xffffffff, false },
111 { R_PARISC_DIR21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
112 bfd_elf_generic_reloc
, "R_PARISC_DIR21L", false, 0, 0, false },
113 { R_PARISC_DIR17R
, 0, 0, 17, false, 0, complain_overflow_bitfield
,
114 bfd_elf_generic_reloc
, "R_PARISC_DIR17R", false, 0, 0, false },
115 { R_PARISC_DIR17F
, 0, 0, 17, false, 0, complain_overflow_bitfield
,
116 bfd_elf_generic_reloc
, "R_PARISC_DIR17F", false, 0, 0, false },
117 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
118 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
119 { R_PARISC_DIR14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
120 bfd_elf_generic_reloc
, "R_PARISC_DIR14R", false, 0, 0, false },
121 { R_PARISC_DIR14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
122 bfd_elf_generic_reloc
, "R_PARISC_DIR14F", false, 0, 0, false },
124 { R_PARISC_PCREL12F
, 0, 0, 12, true, 0, complain_overflow_bitfield
,
125 bfd_elf_generic_reloc
, "R_PARISC_PCREL12F", false, 0, 0, false },
126 { R_PARISC_PCREL32
, 0, 0, 32, true, 0, complain_overflow_bitfield
,
127 bfd_elf_generic_reloc
, "R_PARISC_PCREL32", false, 0, 0, false },
128 { R_PARISC_PCREL21L
, 0, 0, 21, true, 0, complain_overflow_bitfield
,
129 bfd_elf_generic_reloc
, "R_PARISC_PCREL21L", false, 0, 0, false },
130 { R_PARISC_PCREL17R
, 0, 0, 17, true, 0, complain_overflow_bitfield
,
131 bfd_elf_generic_reloc
, "R_PARISC_PCREL17R", false, 0, 0, false },
132 { R_PARISC_PCREL17F
, 0, 0, 17, true, 0, complain_overflow_bitfield
,
133 bfd_elf_generic_reloc
, "R_PARISC_PCREL17F", false, 0, 0, false },
134 { R_PARISC_PCREL17C
, 0, 0, 17, true, 0, complain_overflow_bitfield
,
135 bfd_elf_generic_reloc
, "R_PARISC_PCREL17C", false, 0, 0, false },
136 { R_PARISC_PCREL14R
, 0, 0, 14, true, 0, complain_overflow_bitfield
,
137 bfd_elf_generic_reloc
, "R_PARISC_PCREL14R", false, 0, 0, false },
138 { R_PARISC_PCREL14F
, 0, 0, 14, true, 0, complain_overflow_bitfield
,
139 bfd_elf_generic_reloc
, "R_PARISC_PCREL14F", false, 0, 0, false },
141 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
142 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
143 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
144 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
145 { R_PARISC_DPREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
146 bfd_elf_generic_reloc
, "R_PARISC_DPREL21L", false, 0, 0, false },
147 { R_PARISC_DPREL14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
148 bfd_elf_generic_reloc
, "R_PARISC_DPREL14WR", false, 0, 0, false },
149 { R_PARISC_DPREL14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
150 bfd_elf_generic_reloc
, "R_PARISC_DPREL14DR", false, 0, 0, false },
151 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
152 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
153 { R_PARISC_DPREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
154 bfd_elf_generic_reloc
, "R_PARISC_DPREL14R", false, 0, 0, false },
155 { R_PARISC_DPREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
156 bfd_elf_generic_reloc
, "R_PARISC_DPREL14F", false, 0, 0, false },
158 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
159 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
160 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
161 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
162 { R_PARISC_DLTREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
163 bfd_elf_generic_reloc
, "R_PARISC_DLTREL21L", false, 0, 0, false },
164 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
165 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
166 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
167 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
168 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
169 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
170 { R_PARISC_DLTREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
171 bfd_elf_generic_reloc
, "R_PARISC_DLTREL14R", false, 0, 0, false },
172 { R_PARISC_DLTREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
173 bfd_elf_generic_reloc
, "R_PARISC_DLTREL14F", false, 0, 0, false },
175 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
176 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
177 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
178 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
179 { R_PARISC_DLTIND21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
180 bfd_elf_generic_reloc
, "R_PARISC_DLTIND21L", false, 0, 0, false },
181 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
182 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
183 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
184 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
185 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
186 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
187 { R_PARISC_DLTIND14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
188 bfd_elf_generic_reloc
, "R_PARISC_DLTIND14R", false, 0, 0, false },
189 { R_PARISC_DLTIND14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
190 bfd_elf_generic_reloc
, "R_PARISC_DLTIND14F", false, 0, 0, false },
192 { R_PARISC_SETBASE
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
193 bfd_elf_generic_reloc
, "R_PARISC_SETBASE", false, 0, 0, false },
194 { R_PARISC_SECREL32
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
195 bfd_elf_generic_reloc
, "R_PARISC_SECREL32", false, 0, 0, false },
196 { R_PARISC_BASEREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
197 bfd_elf_generic_reloc
, "R_PARISC_BASEREL21L", false, 0, 0, false },
198 { R_PARISC_BASEREL17R
, 0, 0, 17, false, 0, complain_overflow_bitfield
,
199 bfd_elf_generic_reloc
, "R_PARISC_BASEREL17R", false, 0, 0, false },
200 { R_PARISC_BASEREL17F
, 0, 0, 17, false, 0, complain_overflow_bitfield
,
201 bfd_elf_generic_reloc
, "R_PARISC_BASEREL17F", false, 0, 0, false },
202 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
203 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
204 { R_PARISC_BASEREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
205 bfd_elf_generic_reloc
, "R_PARISC_BASEREL14R", false, 0, 0, false },
206 { R_PARISC_BASEREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
207 bfd_elf_generic_reloc
, "R_PARISC_BASEREL14F", false, 0, 0, false },
209 { R_PARISC_SEGBASE
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
210 bfd_elf_generic_reloc
, "R_PARISC_SEGBASE", false, 0, 0, false },
211 { R_PARISC_SEGREL32
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
212 bfd_elf_generic_reloc
, "R_PARISC_SEGREL32", false, 0, 0, false },
213 { R_PARISC_PLTOFF21L
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
214 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF21L", false, 0, 0, false },
215 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
216 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
217 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
218 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
219 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
220 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
221 { R_PARISC_PLTOFF14R
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
222 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF14R", false, 0, 0, false },
223 { R_PARISC_PLTOFF14F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
224 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF14F", false, 0, 0, false },
226 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
227 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
228 { R_PARISC_LTOFF_FPTR32
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
229 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR32", false, 0, 0, false },
230 { R_PARISC_LTOFF_FPTR21L
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
231 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR21L", false, 0, 0, false },
232 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
233 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
234 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
235 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
236 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
237 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
238 { R_PARISC_LTOFF_FPTR14R
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
239 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR14R", false, 0, 0, false },
240 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
241 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
243 { R_PARISC_FPTR64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
244 bfd_elf_generic_reloc
, "R_PARISC_FPTR64", false, 0, 0, false },
245 { R_PARISC_PLABEL32
, 0, 0, 32, false, 0, complain_overflow_bitfield
,
246 bfd_elf_generic_reloc
, "R_PARISC_PLABEL32", false, 0, 0, false },
247 { R_PARISC_PLABEL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
,
248 bfd_elf_generic_reloc
, "R_PARISC_PLABEL21L", false, 0, 0, false },
249 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
250 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
251 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
252 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
253 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
254 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
255 { R_PARISC_PLABEL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
,
256 bfd_elf_generic_reloc
, "R_PARISC_PLABEL14R", false, 0, 0, false },
257 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
258 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
260 { R_PARISC_PCREL64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
261 bfd_elf_generic_reloc
, "R_PARISC_PCREL64", false, 0, 0, false },
262 { R_PARISC_PCREL22C
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
263 bfd_elf_generic_reloc
, "R_PARISC_PCREL22C", false, 0, 0, false },
264 { R_PARISC_PCREL22F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
265 bfd_elf_generic_reloc
, "R_PARISC_PCREL22F", false, 0, 0, false },
266 { R_PARISC_PCREL14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
267 bfd_elf_generic_reloc
, "R_PARISC_PCREL14WR", false, 0, 0, false },
268 { R_PARISC_PCREL14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
269 bfd_elf_generic_reloc
, "R_PARISC_PCREL14DR", false, 0, 0, false },
270 { R_PARISC_PCREL16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
271 bfd_elf_generic_reloc
, "R_PARISC_PCREL16F", false, 0, 0, false },
272 { R_PARISC_PCREL16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
273 bfd_elf_generic_reloc
, "R_PARISC_PCREL16WF", false, 0, 0, false },
274 { R_PARISC_PCREL16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
275 bfd_elf_generic_reloc
, "R_PARISC_PCREL16DF", false, 0, 0, false },
277 { R_PARISC_DIR64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
278 bfd_elf_generic_reloc
, "R_PARISC_DIR64", false, 0, 0, false },
279 { R_PARISC_NONE
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
280 bfd_elf_generic_reloc
, "R_PARISC_NONE", false, 0, 0, false },
281 { R_PARISC_NONE
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
282 bfd_elf_generic_reloc
, "R_PARISC_NONE", false, 0, 0, false },
283 { R_PARISC_DIR14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
284 bfd_elf_generic_reloc
, "R_PARISC_DIR14WR", false, 0, 0, false },
285 { R_PARISC_DIR14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
286 bfd_elf_generic_reloc
, "R_PARISC_DIR14DR", false, 0, 0, false },
287 { R_PARISC_DIR16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
288 bfd_elf_generic_reloc
, "R_PARISC_DIR16F", false, 0, 0, false },
289 { R_PARISC_DIR16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
290 bfd_elf_generic_reloc
, "R_PARISC_DIR16WF", false, 0, 0, false },
291 { R_PARISC_DIR16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
292 bfd_elf_generic_reloc
, "R_PARISC_DIR16DF", false, 0, 0, false },
294 { R_PARISC_GPREL64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
295 bfd_elf_generic_reloc
, "R_PARISC_GPREL64", false, 0, 0, false },
296 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
297 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
298 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
299 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
300 { R_PARISC_DLTREL14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
301 bfd_elf_generic_reloc
, "R_PARISC_DLTREL14WR", false, 0, 0, false },
302 { R_PARISC_DLTREL14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
303 bfd_elf_generic_reloc
, "R_PARISC_DLTREL14DR", false, 0, 0, false },
304 { R_PARISC_GPREL16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
305 bfd_elf_generic_reloc
, "R_PARISC_GPREL16F", false, 0, 0, false },
306 { R_PARISC_GPREL16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
307 bfd_elf_generic_reloc
, "R_PARISC_GPREL16WF", false, 0, 0, false },
308 { R_PARISC_GPREL16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
309 bfd_elf_generic_reloc
, "R_PARISC_GPREL16DF", false, 0, 0, false },
311 { R_PARISC_LTOFF64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
312 bfd_elf_generic_reloc
, "R_PARISC_LTOFF64", false, 0, 0, false },
313 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
314 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
315 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
316 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
317 { R_PARISC_DLTIND14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
318 bfd_elf_generic_reloc
, "R_PARISC_DLTIND14WR", false, 0, 0, false },
319 { R_PARISC_DLTIND14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
320 bfd_elf_generic_reloc
, "R_PARISC_DLTIND14DR", false, 0, 0, false },
321 { R_PARISC_LTOFF16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
322 bfd_elf_generic_reloc
, "R_PARISC_LTOFF16F", false, 0, 0, false },
323 { R_PARISC_LTOFF16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
324 bfd_elf_generic_reloc
, "R_PARISC_LTOFF16DF", false, 0, 0, false },
325 { R_PARISC_LTOFF16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
326 bfd_elf_generic_reloc
, "R_PARISC_LTOFF16DF", false, 0, 0, false },
328 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
329 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
330 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
331 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
332 { R_PARISC_BASEREL14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
333 bfd_elf_generic_reloc
, "R_PARISC_BASEREL14WR", false, 0, 0, false },
334 { R_PARISC_BASEREL14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
335 bfd_elf_generic_reloc
, "R_PARISC_BASEREL14DR", false, 0, 0, false },
336 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
337 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
338 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
339 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
340 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
341 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
342 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
343 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
345 { R_PARISC_SEGREL64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
346 bfd_elf_generic_reloc
, "R_PARISC_SEGREL64", false, 0, 0, false },
347 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
348 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
349 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
350 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
351 { R_PARISC_PLTOFF14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
352 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF14WR", false, 0, 0, false },
353 { R_PARISC_PLTOFF14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
354 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF14DR", false, 0, 0, false },
355 { R_PARISC_PLTOFF16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
356 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF16F", false, 0, 0, false },
357 { R_PARISC_PLTOFF16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
358 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF16WF", false, 0, 0, false },
359 { R_PARISC_PLTOFF16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
360 bfd_elf_generic_reloc
, "R_PARISC_PLTOFF16DF", false, 0, 0, false },
362 { R_PARISC_LTOFF_FPTR64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
363 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
364 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
365 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
366 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
367 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
368 { R_PARISC_LTOFF_FPTR14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
369 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR14WR", false, 0, 0, false },
370 { R_PARISC_LTOFF_FPTR14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
371 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR14DR", false, 0, 0, false },
372 { R_PARISC_LTOFF_FPTR16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
373 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR16F", false, 0, 0, false },
374 { R_PARISC_LTOFF_FPTR16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
375 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_FPTR16WF", false, 0, 0, false },
376 { R_PARISC_LTOFF_FPTR16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
377 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
379 { R_PARISC_COPY
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
380 bfd_elf_generic_reloc
, "R_PARISC_COPY", false, 0, 0, false },
381 { R_PARISC_IPLT
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
382 bfd_elf_generic_reloc
, "R_PARISC_IPLT", false, 0, 0, false },
383 { R_PARISC_EPLT
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
384 bfd_elf_generic_reloc
, "R_PARISC_EPLT", false, 0, 0, false },
385 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
386 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
387 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
388 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
389 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
390 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
391 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
392 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
393 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
394 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
396 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
397 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
398 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
399 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
400 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
401 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
402 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
403 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
404 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
405 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
406 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
407 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
408 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
409 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
410 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
411 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
413 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
414 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
415 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
416 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
417 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
418 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
419 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
420 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
421 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
422 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
423 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
424 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
425 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
426 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
427 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
428 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
430 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
431 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
432 { R_PARISC_TPREL32
, 0, 0, 0, false, 0, complain_overflow_dont
,
433 bfd_elf_generic_reloc
, "R_PARISC_TPREL32", false, 0, 0, false },
434 { R_PARISC_TPREL21L
, 0, 0, 0, false, 0, complain_overflow_dont
,
435 bfd_elf_generic_reloc
, "R_PARISC_TPREL21L", false, 0, 0, false },
436 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
437 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
438 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
439 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
440 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
441 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
442 { R_PARISC_TPREL14R
, 0, 0, 0, false, 0, complain_overflow_dont
,
443 bfd_elf_generic_reloc
, "R_PARISC_TPREL14R", false, 0, 0, false },
444 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
445 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
447 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
448 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
449 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
450 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
451 { R_PARISC_LTOFF_TP21L
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
452 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP21L", false, 0, 0, false },
453 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
454 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
455 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
456 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
457 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
458 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
459 { R_PARISC_LTOFF_TP14R
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
460 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
461 { R_PARISC_LTOFF_TP14F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
462 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP14F", false, 0, 0, false },
464 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
465 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
466 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
467 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
468 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
469 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
470 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
471 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
472 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
473 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
474 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
475 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
476 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
477 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
478 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
479 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
481 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
482 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
483 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
484 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
485 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
486 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
487 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
488 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
489 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
490 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
491 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
492 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
493 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
494 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
495 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
496 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
498 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
499 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
500 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
501 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
502 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
503 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
504 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
505 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
506 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
507 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
508 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
509 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
510 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
511 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
512 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
513 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
515 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
516 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
517 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
518 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
519 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
520 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
521 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
522 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
523 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
524 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
525 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
526 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
527 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
528 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
529 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
530 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
532 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
533 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
534 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
535 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
536 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
537 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
538 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
539 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
540 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
541 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
542 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
543 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
544 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
545 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
546 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
547 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
549 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
550 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
551 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
552 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
553 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
554 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
555 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
556 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
557 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
,
558 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
559 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
560 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
561 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
562 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
563 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
564 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
566 { R_PARISC_TPREL64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
567 bfd_elf_generic_reloc
, "R_PARISC_TPREL64", false, 0, 0, false },
568 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
569 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
570 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
571 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
572 { R_PARISC_TPREL14WR
, 0, 0, 0, false, 0, complain_overflow_dont
,
573 bfd_elf_generic_reloc
, "R_PARISC_TPREL14WR", false, 0, 0, false },
574 { R_PARISC_TPREL14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
575 bfd_elf_generic_reloc
, "R_PARISC_TPREL14DR", false, 0, 0, false },
576 { R_PARISC_TPREL16F
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
577 bfd_elf_generic_reloc
, "R_PARISC_TPREL16F", false, 0, 0, false },
578 { R_PARISC_TPREL16WF
, 0, 0, 0, false, 0, complain_overflow_dont
,
579 bfd_elf_generic_reloc
, "R_PARISC_TPREL16WF", false, 0, 0, false },
580 { R_PARISC_TPREL16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
581 bfd_elf_generic_reloc
, "R_PARISC_TPREL16DF", false, 0, 0, false },
583 { R_PARISC_LTOFF_TP64
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
584 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP64", false, 0, 0, false },
585 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
586 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
587 { R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
588 bfd_elf_generic_reloc
, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
589 { R_PARISC_LTOFF_TP14WR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
590 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP14WR", false, 0, 0, false },
591 { R_PARISC_LTOFF_TP14DR
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
592 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP14DR", false, 0, 0, false },
593 { R_PARISC_LTOFF_TP16F
, 0, 0, 0, false, 0, complain_overflow_dont
,
594 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP16F", false, 0, 0, false },
595 { R_PARISC_LTOFF_TP16WF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
596 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP16WF", false, 0, 0, false },
597 { R_PARISC_LTOFF_TP16DF
, 0, 0, 0, false, 0, complain_overflow_bitfield
,
598 bfd_elf_generic_reloc
, "R_PARISC_LTOFF_TP16DF", false, 0, 0, false },
600 { R_PARISC_GNU_VTENTRY
, 0, 0, 0, false, 0, complain_overflow_dont
,
601 bfd_elf_generic_reloc
, "R_PARISC_GNU_VTENTRY", false, 0, 0, false },
602 { R_PARISC_GNU_VTINHERIT
, 0, 0, 0, false, 0, complain_overflow_dont
,
603 bfd_elf_generic_reloc
, "R_PARISC_GNU_VTINHERIT", false, 0, 0, false },
606 #define OFFSET_14R_FROM_21L 4
607 #define OFFSET_14F_FROM_21L 5
609 /* Return one (or more) BFD relocations which implement the base
610 relocation with modifications based on format and field. */
612 elf_hppa_reloc_type
**
613 _bfd_elf_hppa_gen_reloc_type (abfd
, base_type
, format
, field
, ignore
, sym
)
615 elf_hppa_reloc_type base_type
;
618 int ignore ATTRIBUTE_UNUSED
;
619 asymbol
*sym ATTRIBUTE_UNUSED
;
621 elf_hppa_reloc_type
*finaltype
;
622 elf_hppa_reloc_type
**final_types
;
624 /* Allocate slots for the BFD relocation. */
625 final_types
= ((elf_hppa_reloc_type
**)
626 bfd_alloc (abfd
, sizeof (elf_hppa_reloc_type
*) * 2));
627 if (final_types
== NULL
)
630 /* Allocate space for the relocation itself. */
631 finaltype
= ((elf_hppa_reloc_type
*)
632 bfd_alloc (abfd
, sizeof (elf_hppa_reloc_type
)));
633 if (finaltype
== NULL
)
636 /* Some reasonable defaults. */
637 final_types
[0] = finaltype
;
638 final_types
[1] = NULL
;
640 #define final_type finaltype[0]
642 final_type
= base_type
;
644 /* Just a tangle of nested switch statements to deal with the braindamage
645 that a different field selector means a completely different relocation
649 /* We have been using generic relocation types. However, that may not
650 really make sense. Anyway, we need to support both R_PARISC_DIR64
651 and R_PARISC_DIR32 here. */
654 case R_HPPA_ABS_CALL
:
661 final_type
= R_PARISC_DIR14F
;
666 final_type
= R_PARISC_DIR14R
;
669 final_type
= R_PARISC_DLTIND14R
;
672 final_type
= R_PARISC_LTOFF_FPTR14DR
;
675 final_type
= R_PARISC_DLTIND14F
;
678 final_type
= R_PARISC_PLABEL14R
;
689 final_type
= R_PARISC_DIR17F
;
694 final_type
= R_PARISC_DIR17R
;
709 final_type
= R_PARISC_DIR21L
;
712 final_type
= R_PARISC_DLTIND21L
;
715 final_type
= R_PARISC_LTOFF_FPTR21L
;
718 final_type
= R_PARISC_PLABEL21L
;
729 final_type
= R_PARISC_DIR32
;
730 /* When in 64bit mode, a 32bit relocation is supposed to
731 be a section relative relocation. Dwarf2 (for example)
732 uses 32bit section relative relocations. */
733 if (bfd_get_arch_info (abfd
)->bits_per_address
!= 32)
734 final_type
= R_PARISC_SECREL32
;
737 final_type
= R_PARISC_PLABEL32
;
748 final_type
= R_PARISC_DIR64
;
751 final_type
= R_PARISC_FPTR64
;
773 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */
774 final_type
= base_type
+ OFFSET_14R_FROM_21L
;
777 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32 */
778 final_type
= base_type
+ OFFSET_14F_FROM_21L
;
793 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */
794 final_type
= base_type
;
807 case R_HPPA_PCREL_CALL
:
814 final_type
= R_PARISC_PCREL12F
;
822 /* Contrary to appearances, these are not calls of any sort.
823 Rather, they are loads/stores with a pcrel reloc. */
829 final_type
= R_PARISC_PCREL14R
;
832 final_type
= R_PARISC_PCREL14F
;
845 final_type
= R_PARISC_PCREL17R
;
848 final_type
= R_PARISC_PCREL17F
;
863 final_type
= R_PARISC_PCREL21L
;
874 final_type
= R_PARISC_PCREL22F
;
886 case R_PARISC_GNU_VTENTRY
:
887 case R_PARISC_GNU_VTINHERIT
:
888 case R_PARISC_SEGREL32
:
889 case R_PARISC_SEGBASE
:
890 /* The defaults are fine for these cases. */
900 /* Translate from an elf into field into a howto relocation pointer. */
903 elf_hppa_info_to_howto (abfd
, bfd_reloc
, elf_reloc
)
904 bfd
*abfd ATTRIBUTE_UNUSED
;
906 Elf_Internal_Rela
*elf_reloc
;
908 BFD_ASSERT (ELF_R_TYPE(elf_reloc
->r_info
)
909 < (unsigned int) R_PARISC_UNIMPLEMENTED
);
910 bfd_reloc
->howto
= &elf_hppa_howto_table
[ELF_R_TYPE (elf_reloc
->r_info
)];
913 /* Translate from an elf into field into a howto relocation pointer. */
916 elf_hppa_info_to_howto_rel (abfd
, bfd_reloc
, elf_reloc
)
917 bfd
*abfd ATTRIBUTE_UNUSED
;
919 Elf_Internal_Rel
*elf_reloc
;
921 BFD_ASSERT (ELF_R_TYPE(elf_reloc
->r_info
)
922 < (unsigned int) R_PARISC_UNIMPLEMENTED
);
923 bfd_reloc
->howto
= &elf_hppa_howto_table
[ELF_R_TYPE (elf_reloc
->r_info
)];
926 /* Return the address of the howto table entry to perform the CODE
927 relocation for an ARCH machine. */
929 static reloc_howto_type
*
930 elf_hppa_reloc_type_lookup (abfd
, code
)
931 bfd
*abfd ATTRIBUTE_UNUSED
;
932 bfd_reloc_code_real_type code
;
934 if ((int) code
< (int) R_PARISC_UNIMPLEMENTED
)
936 BFD_ASSERT ((int) elf_hppa_howto_table
[(int) code
].type
== (int) code
);
937 return &elf_hppa_howto_table
[(int) code
];
942 /* Return true if SYM represents a local label symbol. */
945 elf_hppa_is_local_label_name (abfd
, name
)
946 bfd
*abfd ATTRIBUTE_UNUSED
;
949 if (name
[0] == 'L' && name
[1] == '$')
951 return _bfd_elf_is_local_label_name (abfd
, name
);
954 /* Set the correct type for an ELF section. We do this by the
955 section name, which is a hack, but ought to work. */
958 elf_hppa_fake_sections (abfd
, hdr
, sec
)
960 elf_hppa_internal_shdr
*hdr
;
963 register const char *name
;
965 name
= bfd_get_section_name (abfd
, sec
);
967 if (strcmp (name
, ".PARISC.unwind") == 0)
972 hdr
->sh_type
= SHT_LOPROC
+ 1;
976 /* ?!? How are unwinds supposed to work for symbols in arbitrary
977 sections? Or what if we have multiple .text sections in a single
978 .o file? HP really messed up on this one.
980 Ugh. We can not use elf_section_data (sec)->this_idx at this
981 point because it is not initialized yet.
983 So we (gasp) recompute it here. Hopefully nobody ever changes the
984 way sections are numbered in elf.c! */
985 for (asec
= abfd
->sections
, indx
= 1; asec
; asec
= asec
->next
, indx
++)
987 if (asec
->name
&& strcmp (asec
->name
, ".text") == 0)
994 /* I have no idea if this is really necessary or what it means. */
1001 elf_hppa_final_write_processing (abfd
, linker
)
1003 boolean linker ATTRIBUTE_UNUSED
;
1005 int mach
= bfd_get_mach (abfd
);
1007 elf_elfheader (abfd
)->e_flags
&= ~(EF_PARISC_ARCH
| EF_PARISC_TRAPNIL
1008 | EF_PARISC_EXT
| EF_PARISC_LSB
1009 | EF_PARISC_WIDE
| EF_PARISC_NO_KABP
1010 | EF_PARISC_LAZYSWAP
);
1013 elf_elfheader (abfd
)->e_flags
|= EFA_PARISC_1_0
;
1014 else if (mach
== 11)
1015 elf_elfheader (abfd
)->e_flags
|= EFA_PARISC_1_1
;
1016 else if (mach
== 20)
1017 elf_elfheader (abfd
)->e_flags
|= EFA_PARISC_2_0
;
1018 else if (mach
== 25)
1019 elf_elfheader (abfd
)->e_flags
|= (EF_PARISC_WIDE
1021 /* The GNU tools have trapped without
1022 option since 1993, so need to take
1023 a step backwards with the ELF
1024 based toolchains. */
1025 | EF_PARISC_TRAPNIL
);
1029 /* Hook called by the linker routine which adds symbols from an object
1030 file. HP's libraries define symbols with HP specific section
1031 indices, which we have to handle. */
1034 elf_hppa_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
1036 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1037 const Elf_Internal_Sym
*sym
;
1038 const char **namep ATTRIBUTE_UNUSED
;
1039 flagword
*flagsp ATTRIBUTE_UNUSED
;
1043 int index
= sym
->st_shndx
;
1047 case SHN_PARISC_ANSI_COMMON
:
1048 *secp
= bfd_make_section_old_way (abfd
, ".PARISC.ansi.common");
1049 (*secp
)->flags
|= SEC_IS_COMMON
;
1050 *valp
= sym
->st_size
;
1053 case SHN_PARISC_HUGE_COMMON
:
1054 *secp
= bfd_make_section_old_way (abfd
, ".PARISC.huge.common");
1055 (*secp
)->flags
|= SEC_IS_COMMON
;
1056 *valp
= sym
->st_size
;
1064 elf_hppa_unmark_useless_dynamic_symbols (h
, data
)
1065 struct elf_link_hash_entry
*h
;
1068 struct bfd_link_info
*info
= (struct bfd_link_info
*)data
;
1070 /* If we are not creating a shared library, and this symbol is
1071 referenced by a shared library but is not defined anywhere, then
1072 the generic code will warn that it is undefined.
1074 This behavior is undesirable on HPs since the standard shared
1075 libraries contain references to undefined symbols.
1077 So we twiddle the flags associated with such symbols so that they
1078 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1080 Ultimately we should have better controls over the generic ELF BFD
1082 if (! info
->relocateable
1084 && !info
->no_undefined
)
1085 && h
->root
.type
== bfd_link_hash_undefined
1086 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) != 0
1087 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR
) == 0)
1089 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_REF_DYNAMIC
;
1090 h
->elf_link_hash_flags
|= 0x8000;
1098 elf_hppa_remark_useless_dynamic_symbols (h
, data
)
1099 struct elf_link_hash_entry
*h
;
1102 struct bfd_link_info
*info
= (struct bfd_link_info
*)data
;
1104 /* If we are not creating a shared library, and this symbol is
1105 referenced by a shared library but is not defined anywhere, then
1106 the generic code will warn that it is undefined.
1108 This behavior is undesirable on HPs since the standard shared
1109 libraries contain reerences to undefined symbols.
1111 So we twiddle the flags associated with such symbols so that they
1112 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1114 Ultimately we should have better controls over the generic ELF BFD
1116 if (! info
->relocateable
1118 && !info
->no_undefined
)
1119 && h
->root
.type
== bfd_link_hash_undefined
1120 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) == 0
1121 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR
) == 0
1122 && (h
->elf_link_hash_flags
& 0x8000) != 0)
1124 h
->elf_link_hash_flags
|= ELF_LINK_HASH_REF_DYNAMIC
;
1125 h
->elf_link_hash_flags
&= ~0x8000;
1131 /* Record the lowest address for the data and text segments. */
1133 elf_hppa_record_segment_addrs (abfd
, section
, data
)
1134 bfd
*abfd ATTRIBUTE_UNUSED
;
1138 struct elf64_hppa_link_hash_table
*hppa_info
;
1141 hppa_info
= (struct elf64_hppa_link_hash_table
*)data
;
1143 value
= section
->vma
- section
->filepos
;
1145 if (((section
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
1146 == (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
1147 && value
< hppa_info
->text_segment_base
)
1148 hppa_info
->text_segment_base
= value
;
1149 else if (((section
->flags
& (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
1150 == (SEC_ALLOC
| SEC_LOAD
))
1151 && value
< hppa_info
->data_segment_base
)
1152 hppa_info
->data_segment_base
= value
;
1155 /* Called after we have seen all the input files/sections, but before
1156 final symbol resolution and section placement has been determined.
1158 We use this hook to (possibly) provide a value for __gp, then we
1159 fall back to the generic ELF final link routine. */
1162 elf_hppa_final_link (abfd
, info
)
1164 struct bfd_link_info
*info
;
1167 struct elf64_hppa_link_hash_table
*hppa_info
= elf64_hppa_hash_table (info
);
1169 if (! info
->relocateable
)
1171 struct elf_link_hash_entry
*gp
;
1174 /* The linker script defines a value for __gp iff it was referenced
1175 by one of the objects being linked. First try to find the symbol
1176 in the hash table. If that fails, just compute the value __gp
1178 gp
= elf_link_hash_lookup (elf_hash_table (info
), "__gp", false,
1184 /* Adjust the value of __gp as we may want to slide it into the
1185 .plt section so that the stubs can access PLT entries without
1186 using an addil sequence. */
1187 gp
->root
.u
.def
.value
+= hppa_info
->gp_offset
;
1189 gp_val
= (gp
->root
.u
.def
.section
->output_section
->vma
1190 + gp
->root
.u
.def
.section
->output_offset
1191 + gp
->root
.u
.def
.value
);
1198 /* First look for a .plt section. If found, then __gp is the
1199 address of the .plt + gp_offset.
1201 If no .plt is found, then look for .dlt, .opd and .data (in
1202 that order) and set __gp to the base address of whichever section
1205 sec
= hppa_info
->plt_sec
;
1207 gp_val
= (sec
->output_offset
1208 + sec
->output_section
->vma
1209 + hppa_info
->gp_offset
);
1212 sec
= hppa_info
->dlt_sec
;
1214 sec
= hppa_info
->opd_sec
;
1216 sec
= bfd_get_section_by_name (abfd
, ".data");
1220 gp_val
= sec
->output_offset
+ sec
->output_section
->vma
;
1224 /* Install whatever value we found/computed for __gp. */
1225 _bfd_set_gp_value (abfd
, gp_val
);
1228 /* We need to know the base of the text and data segments so that we
1229 can perform SEGREL relocations. We will record the base addresses
1230 when we encounter the first SEGREL relocation. */
1231 hppa_info
->text_segment_base
= (bfd_vma
)-1;
1232 hppa_info
->data_segment_base
= (bfd_vma
)-1;
1234 /* HP's shared libraries have references to symbols that are not
1235 defined anywhere. The generic ELF BFD linker code will complaim
1238 So we detect the losing case and arrange for the flags on the symbol
1239 to indicate that it was never referenced. This keeps the generic
1240 ELF BFD link code happy and appears to not create any secondary
1241 problems. Ultimately we need a way to control the behavior of the
1242 generic ELF BFD link code better. */
1243 elf_link_hash_traverse (elf_hash_table (info
),
1244 elf_hppa_unmark_useless_dynamic_symbols
,
1247 /* Invoke the regular ELF backend linker to do all the work. */
1248 retval
= bfd_elf_bfd_final_link (abfd
, info
);
1250 elf_link_hash_traverse (elf_hash_table (info
),
1251 elf_hppa_remark_useless_dynamic_symbols
,
1257 /* Relocate an HPPA ELF section. */
1260 elf_hppa_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
1261 contents
, relocs
, local_syms
, local_sections
)
1263 struct bfd_link_info
*info
;
1265 asection
*input_section
;
1267 Elf_Internal_Rela
*relocs
;
1268 Elf_Internal_Sym
*local_syms
;
1269 asection
**local_sections
;
1271 Elf_Internal_Shdr
*symtab_hdr
;
1272 Elf_Internal_Rela
*rel
;
1273 Elf_Internal_Rela
*relend
;
1274 struct elf64_hppa_link_hash_table
*hppa_info
= elf64_hppa_hash_table (info
);
1276 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
1279 relend
= relocs
+ input_section
->reloc_count
;
1280 for (; rel
< relend
; rel
++)
1283 reloc_howto_type
*howto
= elf_hppa_howto_table
+ ELF_R_TYPE (rel
->r_info
);
1284 unsigned long r_symndx
;
1285 struct elf_link_hash_entry
*h
;
1286 Elf_Internal_Sym
*sym
;
1289 bfd_reloc_status_type r
;
1290 const char *sym_name
;
1291 const char *dyn_name
;
1292 char *dynh_buf
= NULL
;
1293 size_t dynh_buflen
= 0;
1294 struct elf64_hppa_dyn_hash_entry
*dyn_h
= NULL
;
1296 r_type
= ELF_R_TYPE (rel
->r_info
);
1297 if (r_type
< 0 || r_type
>= (int) R_PARISC_UNIMPLEMENTED
)
1299 bfd_set_error (bfd_error_bad_value
);
1303 r_symndx
= ELF_R_SYM (rel
->r_info
);
1305 if (info
->relocateable
)
1307 /* This is a relocateable link. We don't have to change
1308 anything, unless the reloc is against a section symbol,
1309 in which case we have to adjust according to where the
1310 section symbol winds up in the output section. */
1311 if (r_symndx
< symtab_hdr
->sh_info
)
1313 sym
= local_syms
+ r_symndx
;
1314 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
1316 sym_sec
= local_sections
[r_symndx
];
1317 rel
->r_addend
+= sym_sec
->output_offset
;
1324 /* This is a final link. */
1328 if (r_symndx
< symtab_hdr
->sh_info
)
1330 /* This is a local symbol. */
1331 sym
= local_syms
+ r_symndx
;
1332 sym_sec
= local_sections
[r_symndx
];
1333 relocation
= ((ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
1334 ? 0 : sym
->st_value
)
1335 + sym_sec
->output_offset
1336 + sym_sec
->output_section
->vma
);
1338 /* If this symbol has an entry in the PA64 dynamic hash
1339 table, then get it. */
1340 dyn_name
= get_dyn_name (input_section
, h
, rel
,
1341 &dynh_buf
, &dynh_buflen
);
1342 dyn_h
= elf64_hppa_dyn_hash_lookup (&hppa_info
->dyn_hash_table
,
1343 dyn_name
, false, false);
1348 /* This is not a local symbol. */
1351 indx
= r_symndx
- symtab_hdr
->sh_info
;
1352 h
= elf_sym_hashes (input_bfd
)[indx
];
1353 while (h
->root
.type
== bfd_link_hash_indirect
1354 || h
->root
.type
== bfd_link_hash_warning
)
1355 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
1356 if (h
->root
.type
== bfd_link_hash_defined
1357 || h
->root
.type
== bfd_link_hash_defweak
)
1359 sym_sec
= h
->root
.u
.def
.section
;
1361 /* If this symbol has an entry in the PA64 dynamic hash
1362 table, then get it. */
1363 dyn_name
= get_dyn_name (input_section
, h
, rel
,
1364 &dynh_buf
, &dynh_buflen
);
1365 dyn_h
= elf64_hppa_dyn_hash_lookup (&hppa_info
->dyn_hash_table
,
1366 dyn_name
, false, false);
1368 /* If we have a relocation against a symbol defined in a
1369 shared library and we have not created an entry in the
1370 PA64 dynamic symbol hash table for it, then we lose. */
1371 if (sym_sec
->output_section
== NULL
&& dyn_h
== NULL
)
1373 (*_bfd_error_handler
)
1374 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1375 bfd_get_filename (input_bfd
), h
->root
.root
.string
,
1376 bfd_get_section_name (input_bfd
, input_section
));
1379 else if (sym_sec
->output_section
)
1380 relocation
= (h
->root
.u
.def
.value
1381 + sym_sec
->output_offset
1382 + sym_sec
->output_section
->vma
);
1383 /* Value will be provided via one of the offsets in the
1384 dyn_h hash table entry. */
1388 /* Allow undefined symbols in shared libraries. */
1389 else if (info
->shared
&& !info
->no_undefined
1390 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
1393 (*info
->callbacks
->undefined_symbol
)
1394 (info
, h
->root
.root
.string
, input_bfd
,
1395 input_section
, rel
->r_offset
, false);
1397 /* If this symbol has an entry in the PA64 dynamic hash
1398 table, then get it. */
1399 dyn_name
= get_dyn_name (input_section
, h
, rel
,
1400 &dynh_buf
, &dynh_buflen
);
1401 dyn_h
= elf64_hppa_dyn_hash_lookup (&hppa_info
->dyn_hash_table
,
1402 dyn_name
, false, false);
1406 (*_bfd_error_handler
)
1407 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1408 bfd_get_filename (input_bfd
), h
->root
.root
.string
,
1409 bfd_get_section_name (input_bfd
, input_section
));
1414 else if (h
->root
.type
== bfd_link_hash_undefweak
)
1418 if (!((*info
->callbacks
->undefined_symbol
)
1419 (info
, h
->root
.root
.string
, input_bfd
,
1420 input_section
, rel
->r_offset
, true)))
1427 sym_name
= h
->root
.root
.string
;
1430 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
1431 symtab_hdr
->sh_link
,
1433 if (sym_name
== NULL
)
1435 if (*sym_name
== '\0')
1436 sym_name
= bfd_section_name (input_bfd
, sym_sec
);
1439 r
= elf_hppa_final_link_relocate (rel
, input_bfd
, output_bfd
,
1440 input_section
, contents
,
1441 relocation
, info
, sym_sec
,
1444 if (r
!= bfd_reloc_ok
)
1450 case bfd_reloc_overflow
:
1452 if (!((*info
->callbacks
->reloc_overflow
)
1453 (info
, sym_name
, howto
->name
, (bfd_vma
) 0,
1454 input_bfd
, input_section
, rel
->r_offset
)))
1465 /* Compute the value for a relocation (REL) during a final link stage,
1466 then insert the value into the proper location in CONTENTS.
1468 VALUE is a tentative value for the relocation and may be overridden
1469 and modified here based on the specific relocation to be performed.
1471 For example we do conversions for PC-relative branches in this routine
1472 or redirection of calls to external routines to stubs.
1474 The work of actually applying the relocation is left to a helper
1475 routine in an attempt to reduce the complexity and size of this
1478 static bfd_reloc_status_type
1479 elf_hppa_final_link_relocate (rel
, input_bfd
, output_bfd
,
1480 input_section
, contents
, value
,
1481 info
, sym_sec
, h
, dyn_h
)
1482 Elf_Internal_Rela
*rel
;
1485 asection
*input_section
;
1488 struct bfd_link_info
*info
;
1490 struct elf_link_hash_entry
*h ATTRIBUTE_UNUSED
;
1491 struct elf64_hppa_dyn_hash_entry
*dyn_h
;
1494 bfd_vma offset
= rel
->r_offset
;
1495 bfd_vma addend
= rel
->r_addend
;
1496 reloc_howto_type
*howto
= elf_hppa_howto_table
+ ELF_R_TYPE (rel
->r_info
);
1497 unsigned int r_type
= howto
->type
;
1498 bfd_byte
*hit_data
= contents
+ offset
;
1499 struct elf64_hppa_link_hash_table
*hppa_info
= elf64_hppa_hash_table (info
);
1501 insn
= bfd_get_32 (input_bfd
, hit_data
);
1508 /* Basic function call support. I'm not entirely sure if PCREL14F is
1509 actually needed or even handled correctly.
1511 Note for a call to a function defined in another dynamic library
1512 we want to redirect the call to a stub. */
1514 /* Random PC relative relocs. */
1515 case R_PARISC_PCREL21L
:
1516 case R_PARISC_PCREL14R
:
1517 case R_PARISC_PCREL14F
:
1518 case R_PARISC_PCREL14WR
:
1519 case R_PARISC_PCREL14DR
:
1520 case R_PARISC_PCREL16F
:
1521 case R_PARISC_PCREL16WF
:
1522 case R_PARISC_PCREL16DF
:
1524 /* If this is a call to a function defined in another dynamic
1525 library, then redirect the call to the local stub for this
1527 if (sym_sec
== NULL
|| sym_sec
->output_section
== NULL
)
1528 value
= (dyn_h
->stub_offset
+ hppa_info
->stub_sec
->output_offset
1529 + hppa_info
->stub_sec
->output_section
->vma
);
1531 /* Turn VALUE into a proper PC relative address. */
1532 value
-= (offset
+ input_section
->output_offset
1533 + input_section
->output_section
->vma
);
1535 /* Adjust for any field selectors. */
1536 if (r_type
== R_PARISC_PCREL21L
)
1537 value
= hppa_field_adjust (value
, -8 + addend
, e_lsel
);
1538 else if (r_type
== R_PARISC_PCREL14F
1539 || r_type
== R_PARISC_PCREL16F
1540 || r_type
== R_PARISC_PCREL16WF
1541 || r_type
== R_PARISC_PCREL16DF
)
1542 value
= hppa_field_adjust (value
, -8 + addend
, e_fsel
);
1544 value
= hppa_field_adjust (value
, -8 + addend
, e_rsel
);
1546 /* Apply the relocation to the given instruction. */
1547 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1551 case R_PARISC_PCREL12F
:
1552 case R_PARISC_PCREL22F
:
1553 case R_PARISC_PCREL17F
:
1554 case R_PARISC_PCREL22C
:
1555 case R_PARISC_PCREL17C
:
1556 case R_PARISC_PCREL17R
:
1558 /* If this is a call to a function defined in another dynamic
1559 library, then redirect the call to the local stub for this
1561 if (sym_sec
== NULL
|| sym_sec
->output_section
== NULL
)
1562 value
= (dyn_h
->stub_offset
+ hppa_info
->stub_sec
->output_offset
1563 + hppa_info
->stub_sec
->output_section
->vma
);
1565 /* Turn VALUE into a proper PC relative address. */
1566 value
-= (offset
+ input_section
->output_offset
1567 + input_section
->output_section
->vma
);
1569 /* Adjust for any field selectors. */
1570 if (r_type
== R_PARISC_PCREL17R
)
1571 value
= hppa_field_adjust (value
, -8 + addend
, e_rsel
);
1573 value
= hppa_field_adjust (value
, -8 + addend
, e_fsel
);
1575 /* All branches are implicitly shifted by 2 places. */
1578 /* Apply the relocation to the given instruction. */
1579 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1583 /* Indirect references to data through the DLT. */
1584 case R_PARISC_DLTIND14R
:
1585 case R_PARISC_DLTIND14F
:
1586 case R_PARISC_DLTIND14DR
:
1587 case R_PARISC_DLTIND14WR
:
1588 case R_PARISC_DLTIND21L
:
1589 case R_PARISC_LTOFF_FPTR14R
:
1590 case R_PARISC_LTOFF_FPTR14DR
:
1591 case R_PARISC_LTOFF_FPTR14WR
:
1592 case R_PARISC_LTOFF_FPTR21L
:
1593 case R_PARISC_LTOFF_FPTR16F
:
1594 case R_PARISC_LTOFF_FPTR16WF
:
1595 case R_PARISC_LTOFF_FPTR16DF
:
1596 case R_PARISC_LTOFF_TP21L
:
1597 case R_PARISC_LTOFF_TP14R
:
1598 case R_PARISC_LTOFF_TP14F
:
1599 case R_PARISC_LTOFF_TP14WR
:
1600 case R_PARISC_LTOFF_TP14DR
:
1601 case R_PARISC_LTOFF_TP16F
:
1602 case R_PARISC_LTOFF_TP16WF
:
1603 case R_PARISC_LTOFF_TP16DF
:
1604 case R_PARISC_LTOFF16F
:
1605 case R_PARISC_LTOFF16WF
:
1606 case R_PARISC_LTOFF16DF
:
1608 /* If this relocation was against a local symbol, then we still
1609 have not set up the DLT entry (it's not convenient to do so
1610 in the "finalize_dlt" routine because it is difficult to get
1611 to the local symbol's value).
1613 So, if this is a local symbol (h == NULL), then we need to
1614 fill in its DLT entry.
1616 Similarly we may still need to set up an entry in .opd for
1617 a local function which had its address taken. */
1618 if (dyn_h
->h
== NULL
)
1620 bfd_put_64 (hppa_info
->dlt_sec
->owner
,
1622 hppa_info
->dlt_sec
->contents
+ dyn_h
->dlt_offset
);
1624 /* Now handle .opd creation if needed. */
1625 if (r_type
== R_PARISC_LTOFF_FPTR14R
1626 || r_type
== R_PARISC_LTOFF_FPTR14DR
1627 || r_type
== R_PARISC_LTOFF_FPTR14WR
1628 || r_type
== R_PARISC_LTOFF_FPTR21L
1629 || r_type
== R_PARISC_LTOFF_FPTR16F
1630 || r_type
== R_PARISC_LTOFF_FPTR16WF
1631 || r_type
== R_PARISC_LTOFF_FPTR16DF
)
1633 /* The first two words of an .opd entry are zero. */
1634 memset (hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
,
1637 /* The next word is the address of the function. */
1638 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1639 (hppa_info
->opd_sec
->contents
1640 + dyn_h
->opd_offset
+ 16));
1642 /* The last word is our local __gp value. */
1643 value
= _bfd_get_gp_value
1644 (hppa_info
->opd_sec
->output_section
->owner
);
1645 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1646 (hppa_info
->opd_sec
->contents
1647 + dyn_h
->opd_offset
+ 24));
1651 /* We want the value of the DLT offset for this symbol, not
1652 the symbol's actual address. Note that __gp may not point
1653 to the start of the DLT, so we have to compute the absolute
1654 address, then subtract out the value of __gp. */
1655 value
= (dyn_h
->dlt_offset
1656 + hppa_info
->dlt_sec
->output_offset
1657 + hppa_info
->dlt_sec
->output_section
->vma
);
1658 value
-= _bfd_get_gp_value (output_bfd
);
1660 /* All DLTIND relocations are basically the same at this point,
1661 except that we need different field selectors for the 21bit
1662 version vs the 14bit versions. */
1663 if (r_type
== R_PARISC_DLTIND21L
1664 || r_type
== R_PARISC_LTOFF_FPTR21L
1665 || r_type
== R_PARISC_LTOFF_TP21L
)
1666 value
= hppa_field_adjust (value
, addend
, e_lrsel
);
1667 else if (r_type
== R_PARISC_DLTIND14F
1668 || r_type
== R_PARISC_LTOFF_FPTR16F
1669 || r_type
== R_PARISC_LTOFF_FPTR16WF
1670 || r_type
== R_PARISC_LTOFF_FPTR16DF
1671 || r_type
== R_PARISC_LTOFF16F
1672 || r_type
== R_PARISC_LTOFF16DF
1673 || r_type
== R_PARISC_LTOFF16WF
1674 || r_type
== R_PARISC_LTOFF_TP16F
1675 || r_type
== R_PARISC_LTOFF_TP16WF
1676 || r_type
== R_PARISC_LTOFF_TP16DF
)
1677 value
= hppa_field_adjust (value
, addend
, e_fsel
);
1679 value
= hppa_field_adjust (value
, addend
, e_rrsel
);
1681 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1685 case R_PARISC_DLTREL14R
:
1686 case R_PARISC_DLTREL14F
:
1687 case R_PARISC_DLTREL14DR
:
1688 case R_PARISC_DLTREL14WR
:
1689 case R_PARISC_DLTREL21L
:
1690 case R_PARISC_DPREL21L
:
1691 case R_PARISC_DPREL14WR
:
1692 case R_PARISC_DPREL14DR
:
1693 case R_PARISC_DPREL14R
:
1694 case R_PARISC_DPREL14F
:
1695 case R_PARISC_GPREL16F
:
1696 case R_PARISC_GPREL16WF
:
1697 case R_PARISC_GPREL16DF
:
1699 /* Subtract out the global pointer value to make value a DLT
1700 relative address. */
1701 value
-= _bfd_get_gp_value (output_bfd
);
1703 /* All DLTREL relocations are basically the same at this point,
1704 except that we need different field selectors for the 21bit
1705 version vs the 14bit versions. */
1706 if (r_type
== R_PARISC_DLTREL21L
1707 || r_type
== R_PARISC_DPREL21L
)
1708 value
= hppa_field_adjust (value
, addend
, e_lrsel
);
1709 else if (r_type
== R_PARISC_DLTREL14F
1710 || r_type
== R_PARISC_DPREL14F
1711 || r_type
== R_PARISC_GPREL16F
1712 || r_type
== R_PARISC_GPREL16WF
1713 || r_type
== R_PARISC_GPREL16DF
)
1714 value
= hppa_field_adjust (value
, addend
, e_fsel
);
1716 value
= hppa_field_adjust (value
, addend
, e_rrsel
);
1718 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1722 case R_PARISC_DIR21L
:
1723 case R_PARISC_DIR17R
:
1724 case R_PARISC_DIR17F
:
1725 case R_PARISC_DIR14R
:
1726 case R_PARISC_DIR14F
:
1727 case R_PARISC_DIR14WR
:
1728 case R_PARISC_DIR14DR
:
1729 case R_PARISC_DIR16F
:
1730 case R_PARISC_DIR16WF
:
1731 case R_PARISC_DIR16DF
:
1733 /* All DIR relocations are basically the same at this point,
1734 except that branch offsets need to be divided by four, and
1735 we need different field selectors. Note that we don't
1736 redirect absolute calls to local stubs. */
1738 if (r_type
== R_PARISC_DIR21L
)
1739 value
= hppa_field_adjust (value
, addend
, e_lrsel
);
1740 else if (r_type
== R_PARISC_DIR17F
1741 || r_type
== R_PARISC_DIR16F
1742 || r_type
== R_PARISC_DIR16WF
1743 || r_type
== R_PARISC_DIR16DF
1744 || r_type
== R_PARISC_DIR14F
)
1745 value
= hppa_field_adjust (value
, addend
, e_fsel
);
1747 value
= hppa_field_adjust (value
, addend
, e_rrsel
);
1749 if (r_type
== R_PARISC_DIR17R
|| r_type
== R_PARISC_DIR17F
)
1751 /* All branches are implicitly shifted by 2 places. */
1755 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1759 case R_PARISC_PLTOFF21L
:
1760 case R_PARISC_PLTOFF14R
:
1761 case R_PARISC_PLTOFF14F
:
1762 case R_PARISC_PLTOFF14WR
:
1763 case R_PARISC_PLTOFF14DR
:
1764 case R_PARISC_PLTOFF16F
:
1765 case R_PARISC_PLTOFF16WF
:
1766 case R_PARISC_PLTOFF16DF
:
1768 /* We want the value of the PLT offset for this symbol, not
1769 the symbol's actual address. Note that __gp may not point
1770 to the start of the DLT, so we have to compute the absolute
1771 address, then subtract out the value of __gp. */
1772 value
= (dyn_h
->plt_offset
1773 + hppa_info
->plt_sec
->output_offset
1774 + hppa_info
->plt_sec
->output_section
->vma
);
1775 value
-= _bfd_get_gp_value (output_bfd
);
1777 /* All PLTOFF relocations are basically the same at this point,
1778 except that we need different field selectors for the 21bit
1779 version vs the 14bit versions. */
1780 if (r_type
== R_PARISC_PLTOFF21L
)
1781 value
= hppa_field_adjust (value
, addend
, e_lrsel
);
1782 else if (r_type
== R_PARISC_PLTOFF14F
1783 || r_type
== R_PARISC_PLTOFF16F
1784 || r_type
== R_PARISC_PLTOFF16WF
1785 || r_type
== R_PARISC_PLTOFF16DF
)
1786 value
= hppa_field_adjust (value
, addend
, e_fsel
);
1788 value
= hppa_field_adjust (value
, addend
, e_rrsel
);
1790 insn
= elf_hppa_relocate_insn (insn
, value
, r_type
);
1794 case R_PARISC_LTOFF_FPTR32
:
1796 /* We may still need to create the FPTR itself if it was for
1798 if (dyn_h
->h
== NULL
)
1800 /* The first two words of an .opd entry are zero. */
1801 memset (hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
, 0, 16);
1803 /* The next word is the address of the function. */
1804 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1805 (hppa_info
->opd_sec
->contents
1806 + dyn_h
->opd_offset
+ 16));
1808 /* The last word is our local __gp value. */
1809 value
= _bfd_get_gp_value
1810 (hppa_info
->opd_sec
->output_section
->owner
);
1811 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1812 hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
+ 24);
1815 /* We want the value of the DLT offset for this symbol, not
1816 the symbol's actual address. Note that __gp may not point
1817 to the start of the DLT, so we have to compute the absolute
1818 address, then subtract out the value of __gp. */
1819 value
= (dyn_h
->dlt_offset
1820 + hppa_info
->dlt_sec
->output_offset
1821 + hppa_info
->dlt_sec
->output_section
->vma
);
1822 value
-= _bfd_get_gp_value (output_bfd
);
1823 bfd_put_32 (input_bfd
, value
, hit_data
);
1824 return bfd_reloc_ok
;
1827 case R_PARISC_LTOFF_FPTR64
:
1828 case R_PARISC_LTOFF_TP64
:
1830 /* We may still need to create the FPTR itself if it was for
1832 if (dyn_h
->h
== NULL
&& r_type
== R_PARISC_LTOFF_FPTR64
)
1834 /* The first two words of an .opd entry are zero. */
1835 memset (hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
, 0, 16);
1837 /* The next word is the address of the function. */
1838 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1839 (hppa_info
->opd_sec
->contents
1840 + dyn_h
->opd_offset
+ 16));
1842 /* The last word is our local __gp value. */
1843 value
= _bfd_get_gp_value
1844 (hppa_info
->opd_sec
->output_section
->owner
);
1845 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1846 hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
+ 24);
1849 /* We want the value of the DLT offset for this symbol, not
1850 the symbol's actual address. Note that __gp may not point
1851 to the start of the DLT, so we have to compute the absolute
1852 address, then subtract out the value of __gp. */
1853 value
= (dyn_h
->dlt_offset
1854 + hppa_info
->dlt_sec
->output_offset
1855 + hppa_info
->dlt_sec
->output_section
->vma
);
1856 value
-= _bfd_get_gp_value (output_bfd
);
1857 bfd_put_64 (input_bfd
, value
, hit_data
);
1858 return bfd_reloc_ok
;
1861 case R_PARISC_DIR32
:
1862 bfd_put_32 (input_bfd
, value
+ addend
, hit_data
);
1863 return bfd_reloc_ok
;
1865 case R_PARISC_DIR64
:
1866 bfd_put_64 (input_bfd
, value
+ addend
, hit_data
);
1867 return bfd_reloc_ok
;
1869 case R_PARISC_GPREL64
:
1870 /* Subtract out the global pointer value to make value a DLT
1871 relative address. */
1872 value
-= _bfd_get_gp_value (output_bfd
);
1874 bfd_put_64 (input_bfd
, value
+ addend
, hit_data
);
1875 return bfd_reloc_ok
;
1877 case R_PARISC_LTOFF64
:
1878 /* We want the value of the DLT offset for this symbol, not
1879 the symbol's actual address. Note that __gp may not point
1880 to the start of the DLT, so we have to compute the absolute
1881 address, then subtract out the value of __gp. */
1882 value
= (dyn_h
->dlt_offset
1883 + hppa_info
->dlt_sec
->output_offset
1884 + hppa_info
->dlt_sec
->output_section
->vma
);
1885 value
-= _bfd_get_gp_value (output_bfd
);
1887 bfd_put_64 (input_bfd
, value
+ addend
, hit_data
);
1888 return bfd_reloc_ok
;
1890 case R_PARISC_PCREL32
:
1892 /* If this is a call to a function defined in another dynamic
1893 library, then redirect the call to the local stub for this
1895 if (sym_sec
== NULL
|| sym_sec
->output_section
== NULL
)
1896 value
= (dyn_h
->stub_offset
+ hppa_info
->stub_sec
->output_offset
1897 + hppa_info
->stub_sec
->output_section
->vma
);
1899 /* Turn VALUE into a proper PC relative address. */
1900 value
-= (offset
+ input_section
->output_offset
1901 + input_section
->output_section
->vma
);
1905 bfd_put_32 (input_bfd
, value
, hit_data
);
1906 return bfd_reloc_ok
;
1909 case R_PARISC_PCREL64
:
1911 /* If this is a call to a function defined in another dynamic
1912 library, then redirect the call to the local stub for this
1914 if (sym_sec
== NULL
|| sym_sec
->output_section
== NULL
)
1915 value
= (dyn_h
->stub_offset
+ hppa_info
->stub_sec
->output_offset
1916 + hppa_info
->stub_sec
->output_section
->vma
);
1919 /* Turn VALUE into a proper PC relative address. */
1920 value
-= (offset
+ input_section
->output_offset
1921 + input_section
->output_section
->vma
);
1925 bfd_put_64 (input_bfd
, value
, hit_data
);
1926 return bfd_reloc_ok
;
1930 case R_PARISC_FPTR64
:
1932 /* We may still need to create the FPTR itself if it was for
1934 if (dyn_h
->h
== NULL
)
1936 /* The first two words of an .opd entry are zero. */
1937 memset (hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
, 0, 16);
1939 /* The next word is the address of the function. */
1940 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1941 (hppa_info
->opd_sec
->contents
1942 + dyn_h
->opd_offset
+ 16));
1944 /* The last word is our local __gp value. */
1945 value
= _bfd_get_gp_value
1946 (hppa_info
->opd_sec
->output_section
->owner
);
1947 bfd_put_64 (hppa_info
->opd_sec
->owner
, value
,
1948 hppa_info
->opd_sec
->contents
+ dyn_h
->opd_offset
+ 24);
1951 /* We want the value of the OPD offset for this symbol, not
1952 the symbol's actual address. */
1953 value
= (dyn_h
->opd_offset
1954 + hppa_info
->opd_sec
->output_offset
1955 + hppa_info
->opd_sec
->output_section
->vma
);
1957 bfd_put_64 (input_bfd
, value
+ addend
, hit_data
);
1958 return bfd_reloc_ok
;
1961 case R_PARISC_SECREL32
:
1962 bfd_put_32 (input_bfd
,
1963 value
+ addend
- sym_sec
->output_section
->vma
,
1965 return bfd_reloc_ok
;
1967 case R_PARISC_SEGREL32
:
1968 case R_PARISC_SEGREL64
:
1970 /* If this is the first SEGREL relocation, then initialize
1971 the segment base values. */
1972 if (hppa_info
->text_segment_base
== (bfd_vma
) -1)
1973 bfd_map_over_sections (output_bfd
, elf_hppa_record_segment_addrs
,
1976 /* VALUE holds the absolute address. We want to include the
1977 addend, then turn it into a segment relative address.
1979 The segment is derived from SYM_SEC. We assume that there are
1980 only two segments of note in the resulting executable/shlib.
1981 A readonly segment (.text) and a readwrite segment (.data). */
1984 if (sym_sec
->flags
& SEC_CODE
)
1985 value
-= hppa_info
->text_segment_base
;
1987 value
-= hppa_info
->data_segment_base
;
1989 if (r_type
== R_PARISC_SEGREL32
)
1990 bfd_put_32 (input_bfd
, value
, hit_data
);
1992 bfd_put_64 (input_bfd
, value
, hit_data
);
1993 return bfd_reloc_ok
;
1997 /* Something we don't know how to handle. */
1999 return bfd_reloc_notsupported
;
2002 /* Update the instruction word. */
2003 bfd_put_32 (input_bfd
, insn
, hit_data
);
2004 return bfd_reloc_ok
;
2007 /* Relocate the given INSN. VALUE should be the actual value we want
2008 to insert into the instruction, ie by this point we should not be
2009 concerned with computing an offset relative to the DLT, PC, etc.
2010 Instead this routine is meant to handle the bit manipulations needed
2011 to insert the relocation into the given instruction. */
2014 elf_hppa_relocate_insn (insn
, sym_value
, r_type
)
2016 unsigned int sym_value
;
2017 unsigned int r_type
;
2021 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
2022 the "B" instruction. */
2023 case R_PARISC_PCREL22F
:
2024 case R_PARISC_PCREL22C
:
2025 return (insn
& ~ 0x3ff1ffd) | re_assemble_22 (sym_value
);
2027 /* This is any 12 bit branch. */
2028 case R_PARISC_PCREL12F
:
2029 return (insn
& ~ 0x1ffd) | re_assemble_12 (sym_value
);
2031 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
2032 to the "B" instruction as well as BE. */
2033 case R_PARISC_PCREL17F
:
2034 case R_PARISC_DIR17F
:
2035 case R_PARISC_DIR17R
:
2036 case R_PARISC_PCREL17C
:
2037 case R_PARISC_PCREL17R
:
2038 return (insn
& ~ 0x1f1ffd) | re_assemble_17 (sym_value
);
2040 /* ADDIL or LDIL instructions. */
2041 case R_PARISC_DLTREL21L
:
2042 case R_PARISC_DLTIND21L
:
2043 case R_PARISC_LTOFF_FPTR21L
:
2044 case R_PARISC_PCREL21L
:
2045 case R_PARISC_LTOFF_TP21L
:
2046 case R_PARISC_DPREL21L
:
2047 case R_PARISC_PLTOFF21L
:
2048 case R_PARISC_DIR21L
:
2049 return (insn
& ~ 0x1fffff) | re_assemble_21 (sym_value
);
2051 /* LDO and integer loads/stores with 14 bit displacements. */
2052 case R_PARISC_DLTREL14R
:
2053 case R_PARISC_DLTREL14F
:
2054 case R_PARISC_DLTIND14R
:
2055 case R_PARISC_DLTIND14F
:
2056 case R_PARISC_LTOFF_FPTR14R
:
2057 case R_PARISC_LTOFF_FPTR16F
:
2058 case R_PARISC_PCREL14R
:
2059 case R_PARISC_PCREL14F
:
2060 case R_PARISC_PCREL16F
:
2061 case R_PARISC_LTOFF_TP14R
:
2062 case R_PARISC_LTOFF_TP14F
:
2063 case R_PARISC_LTOFF_TP16F
:
2064 case R_PARISC_DPREL14R
:
2065 case R_PARISC_DPREL14F
:
2066 case R_PARISC_GPREL16F
:
2067 case R_PARISC_PLTOFF14R
:
2068 case R_PARISC_PLTOFF14F
:
2069 case R_PARISC_PLTOFF16F
:
2070 case R_PARISC_DIR14R
:
2071 case R_PARISC_DIR14F
:
2072 case R_PARISC_DIR16F
:
2073 case R_PARISC_LTOFF16F
:
2074 return (insn
& ~ 0x3fff) | low_sign_unext (sym_value
, 14);
2076 /* Doubleword loads and stores with a 14 bit displacement. */
2077 case R_PARISC_DLTREL14DR
:
2078 case R_PARISC_DLTIND14DR
:
2079 case R_PARISC_LTOFF_FPTR14DR
:
2080 case R_PARISC_LTOFF_FPTR16DF
:
2081 case R_PARISC_PCREL14DR
:
2082 case R_PARISC_PCREL16DF
:
2083 case R_PARISC_LTOFF_TP14DR
:
2084 case R_PARISC_LTOFF_TP16DF
:
2085 case R_PARISC_DPREL14DR
:
2086 case R_PARISC_GPREL16DF
:
2087 case R_PARISC_PLTOFF14DR
:
2088 case R_PARISC_PLTOFF16DF
:
2089 case R_PARISC_DIR14DR
:
2090 case R_PARISC_DIR16DF
:
2091 case R_PARISC_LTOFF16DF
:
2092 return (insn
& ~ 0x3ff1) | (((sym_value
& 0x2000) >> 13)
2093 | ((sym_value
& 0x1ff8) << 1));
2095 /* Floating point single word load/store instructions. */
2096 case R_PARISC_DLTREL14WR
:
2097 case R_PARISC_DLTIND14WR
:
2098 case R_PARISC_LTOFF_FPTR14WR
:
2099 case R_PARISC_LTOFF_FPTR16WF
:
2100 case R_PARISC_PCREL14WR
:
2101 case R_PARISC_PCREL16WF
:
2102 case R_PARISC_LTOFF_TP14WR
:
2103 case R_PARISC_LTOFF_TP16WF
:
2104 case R_PARISC_DPREL14WR
:
2105 case R_PARISC_GPREL16WF
:
2106 case R_PARISC_PLTOFF14WR
:
2107 case R_PARISC_PLTOFF16WF
:
2108 case R_PARISC_DIR16WF
:
2109 case R_PARISC_DIR14WR
:
2110 case R_PARISC_LTOFF16WF
:
2111 return (insn
& ~ 0x3ff9) | (((sym_value
& 0x2000) >> 13)
2112 | ((sym_value
& 0x1ffc) << 1));