1 /* Common code for PA ELF implementations.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
21 #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
23 /* This file is included by multiple PA ELF BFD backends with different
26 Most of the routines are written to be size independent, but sometimes
27 external constraints require 32 or 64 bit specific code. We remap
28 the definitions/functions as necessary here. */
30 #define ELF_R_TYPE(X) ELF64_R_TYPE(X)
31 #define ELF_R_SYM(X) ELF64_R_SYM(X)
32 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
33 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
34 #define elf_hppa_relocate_section elf64_hppa_relocate_section
35 #define elf_hppa_final_link elf64_hppa_final_link
38 #define ELF_R_TYPE(X) ELF32_R_TYPE(X)
39 #define ELF_R_SYM(X) ELF32_R_SYM(X)
40 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
41 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
42 #define elf_hppa_relocate_section elf32_hppa_relocate_section
43 #define elf_hppa_final_link elf32_hppa_final_link
47 static bfd_reloc_status_type elf_hppa_final_link_relocate
48 (Elf_Internal_Rela *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
49 struct bfd_link_info *, asection *, struct elf_link_hash_entry *,
50 struct elf64_hppa_dyn_hash_entry *);
52 static int elf_hppa_relocate_insn
53 (int, int, unsigned int);
56 /* ELF/PA relocation howto entries. */
58 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
60 { R_PARISC_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
61 bfd_elf_generic_reloc, "R_PARISC_NONE", FALSE, 0, 0, FALSE },
63 /* The values in DIR32 are to placate the check in
64 _bfd_stab_section_find_nearest_line. */
65 { R_PARISC_DIR32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
66 bfd_elf_generic_reloc, "R_PARISC_DIR32", FALSE, 0, 0xffffffff, FALSE },
67 { R_PARISC_DIR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
68 bfd_elf_generic_reloc, "R_PARISC_DIR21L", FALSE, 0, 0, FALSE },
69 { R_PARISC_DIR17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
70 bfd_elf_generic_reloc, "R_PARISC_DIR17R", FALSE, 0, 0, FALSE },
71 { R_PARISC_DIR17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
72 bfd_elf_generic_reloc, "R_PARISC_DIR17F", FALSE, 0, 0, FALSE },
73 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
74 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
75 { R_PARISC_DIR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
76 bfd_elf_generic_reloc, "R_PARISC_DIR14R", FALSE, 0, 0, FALSE },
77 { R_PARISC_DIR14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
78 bfd_elf_generic_reloc, "R_PARISC_DIR14F", FALSE, 0, 0, FALSE },
80 { R_PARISC_PCREL12F, 0, 0, 12, TRUE, 0, complain_overflow_bitfield,
81 bfd_elf_generic_reloc, "R_PARISC_PCREL12F", FALSE, 0, 0, FALSE },
82 { R_PARISC_PCREL32, 0, 0, 32, TRUE, 0, complain_overflow_bitfield,
83 bfd_elf_generic_reloc, "R_PARISC_PCREL32", FALSE, 0, 0, FALSE },
84 { R_PARISC_PCREL21L, 0, 0, 21, TRUE, 0, complain_overflow_bitfield,
85 bfd_elf_generic_reloc, "R_PARISC_PCREL21L", FALSE, 0, 0, FALSE },
86 { R_PARISC_PCREL17R, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
87 bfd_elf_generic_reloc, "R_PARISC_PCREL17R", FALSE, 0, 0, FALSE },
88 { R_PARISC_PCREL17F, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
89 bfd_elf_generic_reloc, "R_PARISC_PCREL17F", FALSE, 0, 0, FALSE },
90 { R_PARISC_PCREL17C, 0, 0, 17, TRUE, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_PARISC_PCREL17C", FALSE, 0, 0, FALSE },
92 { R_PARISC_PCREL14R, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
93 bfd_elf_generic_reloc, "R_PARISC_PCREL14R", FALSE, 0, 0, FALSE },
94 { R_PARISC_PCREL14F, 0, 0, 14, TRUE, 0, complain_overflow_bitfield,
95 bfd_elf_generic_reloc, "R_PARISC_PCREL14F", FALSE, 0, 0, FALSE },
97 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
98 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
99 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
101 { R_PARISC_DPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
102 bfd_elf_generic_reloc, "R_PARISC_DPREL21L", FALSE, 0, 0, FALSE },
103 { R_PARISC_DPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
104 bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", FALSE, 0, 0, FALSE },
105 { R_PARISC_DPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", FALSE, 0, 0, FALSE },
107 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
108 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
109 { R_PARISC_DPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
110 bfd_elf_generic_reloc, "R_PARISC_DPREL14R", FALSE, 0, 0, FALSE },
111 { R_PARISC_DPREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_PARISC_DPREL14F", FALSE, 0, 0, FALSE },
114 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
115 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
116 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
117 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
118 { R_PARISC_DLTREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
119 bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", FALSE, 0, 0, FALSE },
120 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
121 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
122 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
123 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
124 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
125 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
126 { R_PARISC_DLTREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", FALSE, 0, 0, FALSE },
128 { R_PARISC_DLTREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
129 bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", FALSE, 0, 0, FALSE },
131 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
132 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
133 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
134 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
135 { R_PARISC_DLTIND21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
136 bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", FALSE, 0, 0, FALSE },
137 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
138 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
139 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
140 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
141 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
142 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
143 { R_PARISC_DLTIND14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
144 bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", FALSE, 0, 0, FALSE },
145 { R_PARISC_DLTIND14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
146 bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", FALSE, 0, 0, FALSE },
148 { R_PARISC_SETBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
149 bfd_elf_generic_reloc, "R_PARISC_SETBASE", FALSE, 0, 0, FALSE },
150 { R_PARISC_SECREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
151 bfd_elf_generic_reloc, "R_PARISC_SECREL32", FALSE, 0, 0, FALSE },
152 { R_PARISC_BASEREL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
153 bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", FALSE, 0, 0, FALSE },
154 { R_PARISC_BASEREL17R, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
155 bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", FALSE, 0, 0, FALSE },
156 { R_PARISC_BASEREL17F, 0, 0, 17, FALSE, 0, complain_overflow_bitfield,
157 bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", FALSE, 0, 0, FALSE },
158 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
159 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
160 { R_PARISC_BASEREL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
161 bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", FALSE, 0, 0, FALSE },
162 { R_PARISC_BASEREL14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
163 bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", FALSE, 0, 0, FALSE },
165 { R_PARISC_SEGBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
166 bfd_elf_generic_reloc, "R_PARISC_SEGBASE", FALSE, 0, 0, FALSE },
167 { R_PARISC_SEGREL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
168 bfd_elf_generic_reloc, "R_PARISC_SEGREL32", FALSE, 0, 0, FALSE },
169 { R_PARISC_PLTOFF21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
170 bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", FALSE, 0, 0, FALSE },
171 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
172 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
173 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
174 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
175 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
176 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
177 { R_PARISC_PLTOFF14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
178 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", FALSE, 0, 0, FALSE },
179 { R_PARISC_PLTOFF14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
180 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", FALSE, 0, 0, FALSE },
182 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
183 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
184 { R_PARISC_LTOFF_FPTR32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
185 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", FALSE, 0, 0, FALSE },
186 { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
187 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", FALSE, 0, 0, FALSE },
188 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
189 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
190 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
191 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
192 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
193 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
194 { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
195 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", FALSE, 0, 0, FALSE },
196 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
197 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
199 { R_PARISC_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
200 bfd_elf_generic_reloc, "R_PARISC_FPTR64", FALSE, 0, 0, FALSE },
201 { R_PARISC_PLABEL32, 0, 0, 32, FALSE, 0, complain_overflow_bitfield,
202 bfd_elf_generic_reloc, "R_PARISC_PLABEL32", FALSE, 0, 0, FALSE },
203 { R_PARISC_PLABEL21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
204 bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", FALSE, 0, 0, FALSE },
205 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
206 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
207 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
208 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
209 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
210 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
211 { R_PARISC_PLABEL14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
212 bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", FALSE, 0, 0, FALSE },
213 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
214 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
216 { R_PARISC_PCREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
217 bfd_elf_generic_reloc, "R_PARISC_PCREL64", FALSE, 0, 0, FALSE },
218 { R_PARISC_PCREL22C, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
219 bfd_elf_generic_reloc, "R_PARISC_PCREL22C", FALSE, 0, 0, FALSE },
220 { R_PARISC_PCREL22F, 0, 0, 22, FALSE, 0, complain_overflow_bitfield,
221 bfd_elf_generic_reloc, "R_PARISC_PCREL22F", FALSE, 0, 0, FALSE },
222 { R_PARISC_PCREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
223 bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", FALSE, 0, 0, FALSE },
224 { R_PARISC_PCREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
225 bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", FALSE, 0, 0, FALSE },
226 { R_PARISC_PCREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
227 bfd_elf_generic_reloc, "R_PARISC_PCREL16F", FALSE, 0, 0, FALSE },
228 { R_PARISC_PCREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
229 bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", FALSE, 0, 0, FALSE },
230 { R_PARISC_PCREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
231 bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", FALSE, 0, 0, FALSE },
233 { R_PARISC_DIR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
234 bfd_elf_generic_reloc, "R_PARISC_DIR64", FALSE, 0, 0, FALSE },
235 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
236 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
237 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
238 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
239 { R_PARISC_DIR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
240 bfd_elf_generic_reloc, "R_PARISC_DIR14WR", FALSE, 0, 0, FALSE },
241 { R_PARISC_DIR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
242 bfd_elf_generic_reloc, "R_PARISC_DIR14DR", FALSE, 0, 0, FALSE },
243 { R_PARISC_DIR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
244 bfd_elf_generic_reloc, "R_PARISC_DIR16F", FALSE, 0, 0, FALSE },
245 { R_PARISC_DIR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
246 bfd_elf_generic_reloc, "R_PARISC_DIR16WF", FALSE, 0, 0, FALSE },
247 { R_PARISC_DIR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
248 bfd_elf_generic_reloc, "R_PARISC_DIR16DF", FALSE, 0, 0, FALSE },
250 { R_PARISC_GPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
251 bfd_elf_generic_reloc, "R_PARISC_GPREL64", FALSE, 0, 0, FALSE },
252 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
253 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
254 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
255 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
256 { R_PARISC_DLTREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
257 bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", FALSE, 0, 0, FALSE },
258 { R_PARISC_DLTREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
259 bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", FALSE, 0, 0, FALSE },
260 { R_PARISC_GPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
261 bfd_elf_generic_reloc, "R_PARISC_GPREL16F", FALSE, 0, 0, FALSE },
262 { R_PARISC_GPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
263 bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", FALSE, 0, 0, FALSE },
264 { R_PARISC_GPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
265 bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", FALSE, 0, 0, FALSE },
267 { R_PARISC_LTOFF64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
268 bfd_elf_generic_reloc, "R_PARISC_LTOFF64", FALSE, 0, 0, FALSE },
269 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
270 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
271 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
272 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
273 { R_PARISC_DLTIND14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
274 bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", FALSE, 0, 0, FALSE },
275 { R_PARISC_DLTIND14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
276 bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", FALSE, 0, 0, FALSE },
277 { R_PARISC_LTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
278 bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", FALSE, 0, 0, FALSE },
279 { R_PARISC_LTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
280 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
281 { R_PARISC_LTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
282 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
284 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
285 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
286 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
287 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
288 { R_PARISC_BASEREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
289 bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", FALSE, 0, 0, FALSE },
290 { R_PARISC_BASEREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
291 bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", FALSE, 0, 0, FALSE },
292 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
293 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
294 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
295 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
296 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
297 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
298 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
299 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
301 { R_PARISC_SEGREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
302 bfd_elf_generic_reloc, "R_PARISC_SEGREL64", FALSE, 0, 0, FALSE },
303 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
304 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
305 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
306 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
307 { R_PARISC_PLTOFF14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
308 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", FALSE, 0, 0, FALSE },
309 { R_PARISC_PLTOFF14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
310 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", FALSE, 0, 0, FALSE },
311 { R_PARISC_PLTOFF16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
312 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", FALSE, 0, 0, FALSE },
313 { R_PARISC_PLTOFF16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
314 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", FALSE, 0, 0, FALSE },
315 { R_PARISC_PLTOFF16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
316 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", FALSE, 0, 0, FALSE },
318 { R_PARISC_LTOFF_FPTR64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
319 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
320 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
321 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
322 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
323 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
324 { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
325 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", FALSE, 0, 0, FALSE },
326 { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
327 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", FALSE, 0, 0, FALSE },
328 { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
329 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", FALSE, 0, 0, FALSE },
330 { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
331 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", FALSE, 0, 0, FALSE },
332 { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
333 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
335 { R_PARISC_COPY, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
336 bfd_elf_generic_reloc, "R_PARISC_COPY", FALSE, 0, 0, FALSE },
337 { R_PARISC_IPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
338 bfd_elf_generic_reloc, "R_PARISC_IPLT", FALSE, 0, 0, FALSE },
339 { R_PARISC_EPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
340 bfd_elf_generic_reloc, "R_PARISC_EPLT", FALSE, 0, 0, FALSE },
341 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
342 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
343 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
344 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
345 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
346 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
347 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
348 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
349 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
350 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
352 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
353 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
354 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
355 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
356 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
357 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
358 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
359 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
360 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
361 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
362 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
363 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
364 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
365 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
366 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
367 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
369 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
370 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
371 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
372 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
373 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
374 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
375 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
376 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
377 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
378 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
379 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
380 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
381 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
382 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
383 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
384 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
386 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
387 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
388 { R_PARISC_TPREL32, 0, 0, 32, FALSE, 0, complain_overflow_dont,
389 bfd_elf_generic_reloc, "R_PARISC_TPREL32", FALSE, 0, 0, FALSE },
390 { R_PARISC_TPREL21L, 0, 0, 21, FALSE, 0, complain_overflow_dont,
391 bfd_elf_generic_reloc, "R_PARISC_TPREL21L", FALSE, 0, 0, FALSE },
392 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
393 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
394 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
395 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
396 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
397 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
398 { R_PARISC_TPREL14R, 0, 0, 14, FALSE, 0, complain_overflow_dont,
399 bfd_elf_generic_reloc, "R_PARISC_TPREL14R", FALSE, 0, 0, FALSE },
400 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
401 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
403 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
404 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
405 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
406 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
407 { R_PARISC_LTOFF_TP21L, 0, 0, 21, FALSE, 0, complain_overflow_bitfield,
408 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", FALSE, 0, 0, FALSE },
409 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
410 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
411 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
412 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
413 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
414 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
415 { R_PARISC_LTOFF_TP14R, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
416 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
417 { R_PARISC_LTOFF_TP14F, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
418 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", FALSE, 0, 0, FALSE },
420 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
421 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
422 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
423 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
424 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
425 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
426 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
427 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
428 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
429 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
430 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
431 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
432 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
433 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
434 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
435 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
437 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
438 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
439 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
440 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
441 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
442 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
443 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
444 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
445 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
446 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
447 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
448 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
449 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
450 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
451 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
452 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
454 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
455 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
456 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
457 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
458 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
459 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
460 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
461 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
462 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
463 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
464 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
465 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
466 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
467 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
468 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
469 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
471 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
472 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
473 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
474 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
475 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
476 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
477 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
478 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
479 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
480 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
481 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
482 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
483 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
484 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
485 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
486 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
488 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
489 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
490 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
491 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
492 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
493 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
494 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
495 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
496 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
497 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
498 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
499 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
500 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
501 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
502 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
503 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
505 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
506 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
507 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
508 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
509 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
510 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
511 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
512 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
513 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
514 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
515 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
516 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
517 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
518 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
519 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
520 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
522 { R_PARISC_TPREL64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
523 bfd_elf_generic_reloc, "R_PARISC_TPREL64", FALSE, 0, 0, FALSE },
524 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
525 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
526 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
527 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
528 { R_PARISC_TPREL14WR, 0, 0, 14, FALSE, 0, complain_overflow_dont,
529 bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", FALSE, 0, 0, FALSE },
530 { R_PARISC_TPREL14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
531 bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", FALSE, 0, 0, FALSE },
532 { R_PARISC_TPREL16F, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
533 bfd_elf_generic_reloc, "R_PARISC_TPREL16F", FALSE, 0, 0, FALSE },
534 { R_PARISC_TPREL16WF, 0, 0, 16, FALSE, 0, complain_overflow_dont,
535 bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", FALSE, 0, 0, FALSE },
536 { R_PARISC_TPREL16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
537 bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", FALSE, 0, 0, FALSE },
539 { R_PARISC_LTOFF_TP64, 0, 0, 64, FALSE, 0, complain_overflow_bitfield,
540 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", FALSE, 0, 0, FALSE },
541 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
542 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
543 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
544 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
545 { R_PARISC_LTOFF_TP14WR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
546 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", FALSE, 0, 0, FALSE },
547 { R_PARISC_LTOFF_TP14DR, 0, 0, 14, FALSE, 0, complain_overflow_bitfield,
548 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", FALSE, 0, 0, FALSE },
549 { R_PARISC_LTOFF_TP16F, 0, 0, 16, FALSE, 0, complain_overflow_dont,
550 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", FALSE, 0, 0, FALSE },
551 { R_PARISC_LTOFF_TP16WF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
552 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", FALSE, 0, 0, FALSE },
553 { R_PARISC_LTOFF_TP16DF, 0, 0, 16, FALSE, 0, complain_overflow_bitfield,
554 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", FALSE, 0, 0, FALSE },
556 { R_PARISC_GNU_VTENTRY, 0, 0, 0, FALSE, 0, complain_overflow_dont,
557 bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", FALSE, 0, 0, FALSE },
558 { R_PARISC_GNU_VTINHERIT, 0, 0, 0, FALSE, 0, complain_overflow_dont,
559 bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", FALSE, 0, 0, FALSE },
562 #define OFFSET_14R_FROM_21L 4
563 #define OFFSET_14F_FROM_21L 5
565 /* Return the final relocation type for the given base type, instruction
566 format, and field selector. */
569 elf_hppa_reloc_final_type (bfd *abfd,
570 elf_hppa_reloc_type base_type,
574 elf_hppa_reloc_type final_type = base_type;
576 /* Just a tangle of nested switch statements to deal with the braindamage
577 that a different field selector means a completely different relocation
581 /* We have been using generic relocation types. However, that may not
582 really make sense. Anyway, we need to support both R_PARISC_DIR64
583 and R_PARISC_DIR32 here. */
586 case R_HPPA_ABS_CALL:
593 final_type = R_PARISC_DIR14F;
598 final_type = R_PARISC_DIR14R;
601 final_type = R_PARISC_DLTIND14R;
604 final_type = R_PARISC_LTOFF_FPTR14DR;
607 final_type = R_PARISC_DLTIND14F;
610 final_type = R_PARISC_PLABEL14R;
613 return R_PARISC_NONE;
621 final_type = R_PARISC_DIR17F;
626 final_type = R_PARISC_DIR17R;
629 return R_PARISC_NONE;
641 final_type = R_PARISC_DIR21L;
644 final_type = R_PARISC_DLTIND21L;
647 final_type = R_PARISC_LTOFF_FPTR21L;
650 final_type = R_PARISC_PLABEL21L;
653 return R_PARISC_NONE;
661 final_type = R_PARISC_DIR32;
662 /* When in 64bit mode, a 32bit relocation is supposed to
663 be a section relative relocation. Dwarf2 (for example)
664 uses 32bit section relative relocations. */
665 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
666 final_type = R_PARISC_SECREL32;
669 final_type = R_PARISC_PLABEL32;
672 return R_PARISC_NONE;
680 final_type = R_PARISC_DIR64;
683 final_type = R_PARISC_FPTR64;
686 return R_PARISC_NONE;
691 return R_PARISC_NONE;
704 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */
705 final_type = base_type + OFFSET_14R_FROM_21L;
708 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32 */
709 final_type = base_type + OFFSET_14F_FROM_21L;
712 return R_PARISC_NONE;
724 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */
725 final_type = base_type;
728 return R_PARISC_NONE;
733 return R_PARISC_NONE;
737 case R_HPPA_PCREL_CALL:
744 final_type = R_PARISC_PCREL12F;
747 return R_PARISC_NONE;
752 /* Contrary to appearances, these are not calls of any sort.
753 Rather, they are loads/stores with a pcrel reloc. */
759 final_type = R_PARISC_PCREL14R;
762 if (bfd_get_mach (abfd) < 25)
763 final_type = R_PARISC_PCREL14F;
765 final_type = R_PARISC_PCREL16F;
768 return R_PARISC_NONE;
778 final_type = R_PARISC_PCREL17R;
781 final_type = R_PARISC_PCREL17F;
784 return R_PARISC_NONE;
796 final_type = R_PARISC_PCREL21L;
799 return R_PARISC_NONE;
807 final_type = R_PARISC_PCREL22F;
810 return R_PARISC_NONE;
818 final_type = R_PARISC_PCREL32;
821 return R_PARISC_NONE;
829 final_type = R_PARISC_PCREL64;
832 return R_PARISC_NONE;
837 return R_PARISC_NONE;
841 case R_PARISC_GNU_VTENTRY:
842 case R_PARISC_GNU_VTINHERIT:
843 case R_PARISC_SEGREL32:
844 case R_PARISC_SEGBASE:
845 /* The defaults are fine for these cases. */
849 return R_PARISC_NONE;
855 /* Return one (or more) BFD relocations which implement the base
856 relocation with modifications based on format and field. */
858 elf_hppa_reloc_type **
859 _bfd_elf_hppa_gen_reloc_type (bfd *abfd,
860 elf_hppa_reloc_type base_type,
863 int ignore ATTRIBUTE_UNUSED,
864 asymbol *sym ATTRIBUTE_UNUSED)
866 elf_hppa_reloc_type *finaltype;
867 elf_hppa_reloc_type **final_types;
868 bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
870 /* Allocate slots for the BFD relocation. */
871 final_types = bfd_alloc (abfd, amt);
872 if (final_types == NULL)
875 /* Allocate space for the relocation itself. */
876 amt = sizeof (elf_hppa_reloc_type);
877 finaltype = bfd_alloc (abfd, amt);
878 if (finaltype == NULL)
881 /* Some reasonable defaults. */
882 final_types[0] = finaltype;
883 final_types[1] = NULL;
885 *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
890 /* Translate from an elf into field into a howto relocation pointer. */
893 elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
895 Elf_Internal_Rela *elf_reloc)
897 BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
898 < (unsigned int) R_PARISC_UNIMPLEMENTED);
899 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
902 /* Translate from an elf into field into a howto relocation pointer. */
905 elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
907 Elf_Internal_Rela *elf_reloc)
909 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
910 < (unsigned int) R_PARISC_UNIMPLEMENTED);
911 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
914 /* Return the address of the howto table entry to perform the CODE
915 relocation for an ARCH machine. */
917 static reloc_howto_type *
918 elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
919 bfd_reloc_code_real_type code)
921 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
923 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
924 return &elf_hppa_howto_table[(int) code];
929 /* Return TRUE if SYM represents a local label symbol. */
932 elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
934 if (name[0] == 'L' && name[1] == '$')
936 return _bfd_elf_is_local_label_name (abfd, name);
939 /* Set the correct type for an ELF section. We do this by the
940 section name, which is a hack, but ought to work. */
943 elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
947 name = bfd_get_section_name (abfd, sec);
949 if (strcmp (name, ".PARISC.unwind") == 0)
954 hdr->sh_type = SHT_LOPROC + 1;
958 /* ?!? How are unwinds supposed to work for symbols in arbitrary
959 sections? Or what if we have multiple .text sections in a single
960 .o file? HP really messed up on this one.
962 Ugh. We can not use elf_section_data (sec)->this_idx at this
963 point because it is not initialized yet.
965 So we (gasp) recompute it here. Hopefully nobody ever changes the
966 way sections are numbered in elf.c! */
967 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
969 if (asec->name && strcmp (asec->name, ".text") == 0)
976 /* I have no idea if this is really necessary or what it means. */
983 elf_hppa_final_write_processing (bfd *abfd,
984 bfd_boolean linker ATTRIBUTE_UNUSED)
986 int mach = bfd_get_mach (abfd);
988 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
989 | EF_PARISC_EXT | EF_PARISC_LSB
990 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
991 | EF_PARISC_LAZYSWAP);
994 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
996 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
998 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1000 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1002 /* The GNU tools have trapped without
1003 option since 1993, so need to take
1004 a step backwards with the ELF
1005 based toolchains. */
1006 | EF_PARISC_TRAPNIL);
1009 /* Comparison function for qsort to sort unwind section during a
1013 hppa_unwind_entry_compare (const void *a, const void *b)
1015 const bfd_byte *ap, *bp;
1016 unsigned long av, bv;
1019 av = (unsigned long) ap[0] << 24;
1020 av |= (unsigned long) ap[1] << 16;
1021 av |= (unsigned long) ap[2] << 8;
1022 av |= (unsigned long) ap[3];
1025 bv = (unsigned long) bp[0] << 24;
1026 bv |= (unsigned long) bp[1] << 16;
1027 bv |= (unsigned long) bp[2] << 8;
1028 bv |= (unsigned long) bp[3];
1030 return av < bv ? -1 : av > bv ? 1 : 0;
1033 static bfd_boolean elf_hppa_sort_unwind (bfd *abfd)
1037 /* Magic section names, but this is much safer than having
1038 relocate_section remember where SEGREL32 relocs occurred.
1039 Consider what happens if someone inept creates a linker script
1040 that puts unwind information in .text. */
1041 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1047 if (!bfd_malloc_and_get_section (abfd, s, &contents))
1051 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1053 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1060 /* What to do when ld finds relocations against symbols defined in
1061 discarded sections. */
1064 elf_hppa_action_discarded (asection *sec)
1066 if (strcmp (".PARISC.unwind", sec->name) == 0)
1069 return _bfd_elf_default_action_discarded (sec);
1073 /* Hook called by the linker routine which adds symbols from an object
1074 file. HP's libraries define symbols with HP specific section
1075 indices, which we have to handle. */
1078 elf_hppa_add_symbol_hook (bfd *abfd,
1079 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1080 Elf_Internal_Sym *sym,
1081 const char **namep ATTRIBUTE_UNUSED,
1082 flagword *flagsp ATTRIBUTE_UNUSED,
1086 int index = sym->st_shndx;
1090 case SHN_PARISC_ANSI_COMMON:
1091 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1092 (*secp)->flags |= SEC_IS_COMMON;
1093 *valp = sym->st_size;
1096 case SHN_PARISC_HUGE_COMMON:
1097 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1098 (*secp)->flags |= SEC_IS_COMMON;
1099 *valp = sym->st_size;
1107 elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1110 struct bfd_link_info *info = data;
1112 if (h->root.type == bfd_link_hash_warning)
1113 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1115 /* If we are not creating a shared library, and this symbol is
1116 referenced by a shared library but is not defined anywhere, then
1117 the generic code will warn that it is undefined.
1119 This behavior is undesirable on HPs since the standard shared
1120 libraries contain references to undefined symbols.
1122 So we twiddle the flags associated with such symbols so that they
1123 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1125 Ultimately we should have better controls over the generic ELF BFD
1127 if (! info->relocatable
1128 && info->unresolved_syms_in_shared_libs != RM_IGNORE
1129 && h->root.type == bfd_link_hash_undefined
1134 h->pointer_equality_needed = 1;
1141 elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1144 struct bfd_link_info *info = data;
1146 if (h->root.type == bfd_link_hash_warning)
1147 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1149 /* If we are not creating a shared library, and this symbol is
1150 referenced by a shared library but is not defined anywhere, then
1151 the generic code will warn that it is undefined.
1153 This behavior is undesirable on HPs since the standard shared
1154 libraries contain references to undefined symbols.
1156 So we twiddle the flags associated with such symbols so that they
1157 will not trigger the warning. ?!? FIXME. This is horribly fragile.
1159 Ultimately we should have better controls over the generic ELF BFD
1161 if (! info->relocatable
1162 && info->unresolved_syms_in_shared_libs != RM_IGNORE
1163 && h->root.type == bfd_link_hash_undefined
1166 && h->pointer_equality_needed)
1169 h->pointer_equality_needed = 0;
1176 elf_hppa_is_dynamic_loader_symbol (const char *name)
1178 return (! strcmp (name, "__CPU_REVISION")
1179 || ! strcmp (name, "__CPU_KEYBITS_1")
1180 || ! strcmp (name, "__SYSTEM_ID_D")
1181 || ! strcmp (name, "__FPU_MODEL")
1182 || ! strcmp (name, "__FPU_REVISION")
1183 || ! strcmp (name, "__ARGC")
1184 || ! strcmp (name, "__ARGV")
1185 || ! strcmp (name, "__ENVP")
1186 || ! strcmp (name, "__TLS_SIZE_D")
1187 || ! strcmp (name, "__LOAD_INFO")
1188 || ! strcmp (name, "__systab"));
1191 /* Record the lowest address for the data and text segments. */
1193 elf_hppa_record_segment_addrs (bfd *abfd ATTRIBUTE_UNUSED,
1197 struct elf64_hppa_link_hash_table *hppa_info;
1202 value = section->vma - section->filepos;
1204 if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1205 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1206 && value < hppa_info->text_segment_base)
1207 hppa_info->text_segment_base = value;
1208 else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
1209 == (SEC_ALLOC | SEC_LOAD))
1210 && value < hppa_info->data_segment_base)
1211 hppa_info->data_segment_base = value;
1214 /* Called after we have seen all the input files/sections, but before
1215 final symbol resolution and section placement has been determined.
1217 We use this hook to (possibly) provide a value for __gp, then we
1218 fall back to the generic ELF final link routine. */
1221 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
1224 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1226 if (! info->relocatable)
1228 struct elf_link_hash_entry *gp;
1231 /* The linker script defines a value for __gp iff it was referenced
1232 by one of the objects being linked. First try to find the symbol
1233 in the hash table. If that fails, just compute the value __gp
1235 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
1241 /* Adjust the value of __gp as we may want to slide it into the
1242 .plt section so that the stubs can access PLT entries without
1243 using an addil sequence. */
1244 gp->root.u.def.value += hppa_info->gp_offset;
1246 gp_val = (gp->root.u.def.section->output_section->vma
1247 + gp->root.u.def.section->output_offset
1248 + gp->root.u.def.value);
1254 /* First look for a .plt section. If found, then __gp is the
1255 address of the .plt + gp_offset.
1257 If no .plt is found, then look for .dlt, .opd and .data (in
1258 that order) and set __gp to the base address of whichever
1259 section is found first. */
1261 sec = hppa_info->plt_sec;
1262 if (sec && ! (sec->flags & SEC_EXCLUDE))
1263 gp_val = (sec->output_offset
1264 + sec->output_section->vma
1265 + hppa_info->gp_offset);
1268 sec = hppa_info->dlt_sec;
1269 if (!sec || (sec->flags & SEC_EXCLUDE))
1270 sec = hppa_info->opd_sec;
1271 if (!sec || (sec->flags & SEC_EXCLUDE))
1272 sec = bfd_get_section_by_name (abfd, ".data");
1273 if (!sec || (sec->flags & SEC_EXCLUDE))
1276 gp_val = sec->output_offset + sec->output_section->vma;
1280 /* Install whatever value we found/computed for __gp. */
1281 _bfd_set_gp_value (abfd, gp_val);
1284 /* We need to know the base of the text and data segments so that we
1285 can perform SEGREL relocations. We will record the base addresses
1286 when we encounter the first SEGREL relocation. */
1287 hppa_info->text_segment_base = (bfd_vma)-1;
1288 hppa_info->data_segment_base = (bfd_vma)-1;
1290 /* HP's shared libraries have references to symbols that are not
1291 defined anywhere. The generic ELF BFD linker code will complain
1294 So we detect the losing case and arrange for the flags on the symbol
1295 to indicate that it was never referenced. This keeps the generic
1296 ELF BFD link code happy and appears to not create any secondary
1297 problems. Ultimately we need a way to control the behavior of the
1298 generic ELF BFD link code better. */
1299 elf_link_hash_traverse (elf_hash_table (info),
1300 elf_hppa_unmark_useless_dynamic_symbols,
1303 /* Invoke the regular ELF backend linker to do all the work. */
1304 retval = bfd_elf_final_link (abfd, info);
1306 elf_link_hash_traverse (elf_hash_table (info),
1307 elf_hppa_remark_useless_dynamic_symbols,
1310 /* If we're producing a final executable, sort the contents of the
1313 retval = elf_hppa_sort_unwind (abfd);
1318 /* Relocate an HPPA ELF section. */
1321 elf_hppa_relocate_section (bfd *output_bfd,
1322 struct bfd_link_info *info,
1324 asection *input_section,
1326 Elf_Internal_Rela *relocs,
1327 Elf_Internal_Sym *local_syms,
1328 asection **local_sections)
1330 Elf_Internal_Shdr *symtab_hdr;
1331 Elf_Internal_Rela *rel;
1332 Elf_Internal_Rela *relend;
1333 struct elf64_hppa_link_hash_table *hppa_info;
1335 if (info->relocatable)
1338 hppa_info = elf64_hppa_hash_table (info);
1339 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1342 relend = relocs + input_section->reloc_count;
1343 for (; rel < relend; rel++)
1346 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1347 unsigned long r_symndx;
1348 struct elf_link_hash_entry *h;
1349 Elf_Internal_Sym *sym;
1352 bfd_reloc_status_type r;
1353 const char *dyn_name;
1354 char *dynh_buf = NULL;
1355 size_t dynh_buflen = 0;
1356 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
1358 r_type = ELF_R_TYPE (rel->r_info);
1359 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
1361 bfd_set_error (bfd_error_bad_value);
1365 /* This is a final link. */
1366 r_symndx = ELF_R_SYM (rel->r_info);
1370 if (r_symndx < symtab_hdr->sh_info)
1372 /* This is a local symbol. */
1373 sym = local_syms + r_symndx;
1374 sym_sec = local_sections[r_symndx];
1375 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
1377 /* If this symbol has an entry in the PA64 dynamic hash
1378 table, then get it. */
1379 dyn_name = get_dyn_name (input_bfd, h, rel,
1380 &dynh_buf, &dynh_buflen);
1381 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1382 dyn_name, FALSE, FALSE);
1387 /* This is not a local symbol. */
1390 indx = r_symndx - symtab_hdr->sh_info;
1391 h = elf_sym_hashes (input_bfd)[indx];
1392 while (h->root.type == bfd_link_hash_indirect
1393 || h->root.type == bfd_link_hash_warning)
1394 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1395 if (h->root.type == bfd_link_hash_defined
1396 || h->root.type == bfd_link_hash_defweak)
1398 sym_sec = h->root.u.def.section;
1400 /* If this symbol has an entry in the PA64 dynamic hash
1401 table, then get it. */
1402 dyn_name = get_dyn_name (input_bfd, h, rel,
1403 &dynh_buf, &dynh_buflen);
1404 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1405 dyn_name, FALSE, FALSE);
1407 /* If we have a relocation against a symbol defined in a
1408 shared library and we have not created an entry in the
1409 PA64 dynamic symbol hash table for it, then we lose. */
1410 if (sym_sec->output_section == NULL && dyn_h == NULL)
1412 (*_bfd_error_handler)
1413 (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1414 input_bfd, input_section, h->root.root.string);
1417 else if (sym_sec->output_section)
1418 relocation = (h->root.u.def.value
1419 + sym_sec->output_offset
1420 + sym_sec->output_section->vma);
1421 /* Value will be provided via one of the offsets in the
1422 dyn_h hash table entry. */
1426 else if (info->unresolved_syms_in_objects == RM_IGNORE
1427 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1429 /* If this symbol has an entry in the PA64 dynamic hash
1430 table, then get it. */
1431 dyn_name = get_dyn_name (input_bfd, h, rel,
1432 &dynh_buf, &dynh_buflen);
1433 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1434 dyn_name, FALSE, FALSE);
1438 (*_bfd_error_handler)
1439 (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1440 input_bfd, input_section, h->root.root.string);
1444 else if (h->root.type == bfd_link_hash_undefweak)
1446 dyn_name = get_dyn_name (input_bfd, h, rel,
1447 &dynh_buf, &dynh_buflen);
1448 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1449 dyn_name, FALSE, FALSE);
1453 (*_bfd_error_handler)
1454 (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
1455 input_bfd, input_section, h->root.root.string);
1461 /* Ignore dynamic loader defined symbols. */
1462 if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
1466 if (!((*info->callbacks->undefined_symbol)
1467 (info, h->root.root.string, input_bfd,
1468 input_section, rel->r_offset,
1469 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
1470 || ELF_ST_VISIBILITY (h->other)))))
1477 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1478 input_section, contents,
1479 relocation, info, sym_sec,
1482 if (r != bfd_reloc_ok)
1488 case bfd_reloc_overflow:
1490 const char *sym_name;
1496 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1497 symtab_hdr->sh_link,
1499 if (sym_name == NULL)
1501 if (*sym_name == '\0')
1502 sym_name = bfd_section_name (input_bfd, sym_sec);
1505 if (!((*info->callbacks->reloc_overflow)
1506 (info, (h ? &h->root : NULL), sym_name,
1507 howto->name, (bfd_vma) 0, input_bfd,
1508 input_section, rel->r_offset)))
1518 /* Compute the value for a relocation (REL) during a final link stage,
1519 then insert the value into the proper location in CONTENTS.
1521 VALUE is a tentative value for the relocation and may be overridden
1522 and modified here based on the specific relocation to be performed.
1524 For example we do conversions for PC-relative branches in this routine
1525 or redirection of calls to external routines to stubs.
1527 The work of actually applying the relocation is left to a helper
1528 routine in an attempt to reduce the complexity and size of this
1531 static bfd_reloc_status_type
1532 elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
1535 asection *input_section,
1538 struct bfd_link_info *info,
1540 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1541 struct elf64_hppa_dyn_hash_entry *dyn_h)
1544 bfd_vma offset = rel->r_offset;
1545 bfd_signed_vma addend = rel->r_addend;
1546 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
1547 unsigned int r_type = howto->type;
1548 bfd_byte *hit_data = contents + offset;
1549 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
1551 insn = bfd_get_32 (input_bfd, hit_data);
1558 /* Basic function call support.
1560 Note for a call to a function defined in another dynamic library
1561 we want to redirect the call to a stub. */
1563 /* Random PC relative relocs. */
1564 case R_PARISC_PCREL21L:
1565 case R_PARISC_PCREL14R:
1566 case R_PARISC_PCREL14F:
1567 case R_PARISC_PCREL14WR:
1568 case R_PARISC_PCREL14DR:
1569 case R_PARISC_PCREL16F:
1570 case R_PARISC_PCREL16WF:
1571 case R_PARISC_PCREL16DF:
1573 /* If this is a call to a function defined in another dynamic
1574 library, then redirect the call to the local stub for this
1576 if (sym_sec == NULL || sym_sec->output_section == NULL)
1577 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1578 + hppa_info->stub_sec->output_section->vma);
1580 /* Turn VALUE into a proper PC relative address. */
1581 value -= (offset + input_section->output_offset
1582 + input_section->output_section->vma);
1584 /* Adjust for any field selectors. */
1585 if (r_type == R_PARISC_PCREL21L)
1586 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1587 else if (r_type == R_PARISC_PCREL14F
1588 || r_type == R_PARISC_PCREL16F
1589 || r_type == R_PARISC_PCREL16WF
1590 || r_type == R_PARISC_PCREL16DF)
1591 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1593 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1595 /* Apply the relocation to the given instruction. */
1596 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1600 case R_PARISC_PCREL12F:
1601 case R_PARISC_PCREL22F:
1602 case R_PARISC_PCREL17F:
1603 case R_PARISC_PCREL22C:
1604 case R_PARISC_PCREL17C:
1605 case R_PARISC_PCREL17R:
1607 /* If this is a call to a function defined in another dynamic
1608 library, then redirect the call to the local stub for this
1610 if (sym_sec == NULL || sym_sec->output_section == NULL)
1611 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1612 + hppa_info->stub_sec->output_section->vma);
1614 /* Turn VALUE into a proper PC relative address. */
1615 value -= (offset + input_section->output_offset
1616 + input_section->output_section->vma);
1618 /* Adjust for any field selectors. */
1619 if (r_type == R_PARISC_PCREL17R)
1620 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1622 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1624 /* All branches are implicitly shifted by 2 places. */
1627 /* Apply the relocation to the given instruction. */
1628 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1632 /* Indirect references to data through the DLT. */
1633 case R_PARISC_DLTIND14R:
1634 case R_PARISC_DLTIND14F:
1635 case R_PARISC_DLTIND14DR:
1636 case R_PARISC_DLTIND14WR:
1637 case R_PARISC_DLTIND21L:
1638 case R_PARISC_LTOFF_FPTR14R:
1639 case R_PARISC_LTOFF_FPTR14DR:
1640 case R_PARISC_LTOFF_FPTR14WR:
1641 case R_PARISC_LTOFF_FPTR21L:
1642 case R_PARISC_LTOFF_FPTR16F:
1643 case R_PARISC_LTOFF_FPTR16WF:
1644 case R_PARISC_LTOFF_FPTR16DF:
1645 case R_PARISC_LTOFF_TP21L:
1646 case R_PARISC_LTOFF_TP14R:
1647 case R_PARISC_LTOFF_TP14F:
1648 case R_PARISC_LTOFF_TP14WR:
1649 case R_PARISC_LTOFF_TP14DR:
1650 case R_PARISC_LTOFF_TP16F:
1651 case R_PARISC_LTOFF_TP16WF:
1652 case R_PARISC_LTOFF_TP16DF:
1653 case R_PARISC_LTOFF16F:
1654 case R_PARISC_LTOFF16WF:
1655 case R_PARISC_LTOFF16DF:
1657 /* If this relocation was against a local symbol, then we still
1658 have not set up the DLT entry (it's not convenient to do so
1659 in the "finalize_dlt" routine because it is difficult to get
1660 to the local symbol's value).
1662 So, if this is a local symbol (h == NULL), then we need to
1663 fill in its DLT entry.
1665 Similarly we may still need to set up an entry in .opd for
1666 a local function which had its address taken. */
1667 if (dyn_h->h == NULL)
1669 /* Now do .opd creation if needed. */
1670 if (r_type == R_PARISC_LTOFF_FPTR14R
1671 || r_type == R_PARISC_LTOFF_FPTR14DR
1672 || r_type == R_PARISC_LTOFF_FPTR14WR
1673 || r_type == R_PARISC_LTOFF_FPTR21L
1674 || r_type == R_PARISC_LTOFF_FPTR16F
1675 || r_type == R_PARISC_LTOFF_FPTR16WF
1676 || r_type == R_PARISC_LTOFF_FPTR16DF)
1678 /* The first two words of an .opd entry are zero. */
1679 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1682 /* The next word is the address of the function. */
1683 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1684 (hppa_info->opd_sec->contents
1685 + dyn_h->opd_offset + 16));
1687 /* The last word is our local __gp value. */
1688 value = _bfd_get_gp_value
1689 (hppa_info->opd_sec->output_section->owner);
1690 bfd_put_64 (hppa_info->opd_sec->owner, value,
1691 (hppa_info->opd_sec->contents
1692 + dyn_h->opd_offset + 24));
1694 /* The DLT value is the address of the .opd entry. */
1695 value = (dyn_h->opd_offset
1696 + hppa_info->opd_sec->output_offset
1697 + hppa_info->opd_sec->output_section->vma);
1701 bfd_put_64 (hppa_info->dlt_sec->owner,
1703 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1706 /* We want the value of the DLT offset for this symbol, not
1707 the symbol's actual address. Note that __gp may not point
1708 to the start of the DLT, so we have to compute the absolute
1709 address, then subtract out the value of __gp. */
1710 value = (dyn_h->dlt_offset
1711 + hppa_info->dlt_sec->output_offset
1712 + hppa_info->dlt_sec->output_section->vma);
1713 value -= _bfd_get_gp_value (output_bfd);
1715 /* All DLTIND relocations are basically the same at this point,
1716 except that we need different field selectors for the 21bit
1717 version vs the 14bit versions. */
1718 if (r_type == R_PARISC_DLTIND21L
1719 || r_type == R_PARISC_LTOFF_FPTR21L
1720 || r_type == R_PARISC_LTOFF_TP21L)
1721 value = hppa_field_adjust (value, 0, e_lsel);
1722 else if (r_type == R_PARISC_DLTIND14F
1723 || r_type == R_PARISC_LTOFF_FPTR16F
1724 || r_type == R_PARISC_LTOFF_FPTR16WF
1725 || r_type == R_PARISC_LTOFF_FPTR16DF
1726 || r_type == R_PARISC_LTOFF16F
1727 || r_type == R_PARISC_LTOFF16DF
1728 || r_type == R_PARISC_LTOFF16WF
1729 || r_type == R_PARISC_LTOFF_TP16F
1730 || r_type == R_PARISC_LTOFF_TP16WF
1731 || r_type == R_PARISC_LTOFF_TP16DF)
1732 value = hppa_field_adjust (value, 0, e_fsel);
1734 value = hppa_field_adjust (value, 0, e_rsel);
1736 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1740 case R_PARISC_DLTREL14R:
1741 case R_PARISC_DLTREL14F:
1742 case R_PARISC_DLTREL14DR:
1743 case R_PARISC_DLTREL14WR:
1744 case R_PARISC_DLTREL21L:
1745 case R_PARISC_DPREL21L:
1746 case R_PARISC_DPREL14WR:
1747 case R_PARISC_DPREL14DR:
1748 case R_PARISC_DPREL14R:
1749 case R_PARISC_DPREL14F:
1750 case R_PARISC_GPREL16F:
1751 case R_PARISC_GPREL16WF:
1752 case R_PARISC_GPREL16DF:
1754 /* Subtract out the global pointer value to make value a DLT
1755 relative address. */
1756 value -= _bfd_get_gp_value (output_bfd);
1758 /* All DLTREL relocations are basically the same at this point,
1759 except that we need different field selectors for the 21bit
1760 version vs the 14bit versions. */
1761 if (r_type == R_PARISC_DLTREL21L
1762 || r_type == R_PARISC_DPREL21L)
1763 value = hppa_field_adjust (value, addend, e_lrsel);
1764 else if (r_type == R_PARISC_DLTREL14F
1765 || r_type == R_PARISC_DPREL14F
1766 || r_type == R_PARISC_GPREL16F
1767 || r_type == R_PARISC_GPREL16WF
1768 || r_type == R_PARISC_GPREL16DF)
1769 value = hppa_field_adjust (value, addend, e_fsel);
1771 value = hppa_field_adjust (value, addend, e_rrsel);
1773 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1777 case R_PARISC_DIR21L:
1778 case R_PARISC_DIR17R:
1779 case R_PARISC_DIR17F:
1780 case R_PARISC_DIR14R:
1781 case R_PARISC_DIR14F:
1782 case R_PARISC_DIR14WR:
1783 case R_PARISC_DIR14DR:
1784 case R_PARISC_DIR16F:
1785 case R_PARISC_DIR16WF:
1786 case R_PARISC_DIR16DF:
1788 /* All DIR relocations are basically the same at this point,
1789 except that branch offsets need to be divided by four, and
1790 we need different field selectors. Note that we don't
1791 redirect absolute calls to local stubs. */
1793 if (r_type == R_PARISC_DIR21L)
1794 value = hppa_field_adjust (value, addend, e_lrsel);
1795 else if (r_type == R_PARISC_DIR17F
1796 || r_type == R_PARISC_DIR16F
1797 || r_type == R_PARISC_DIR16WF
1798 || r_type == R_PARISC_DIR16DF
1799 || r_type == R_PARISC_DIR14F)
1800 value = hppa_field_adjust (value, addend, e_fsel);
1802 value = hppa_field_adjust (value, addend, e_rrsel);
1804 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
1806 /* All branches are implicitly shifted by 2 places. */
1810 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1814 case R_PARISC_PLTOFF21L:
1815 case R_PARISC_PLTOFF14R:
1816 case R_PARISC_PLTOFF14F:
1817 case R_PARISC_PLTOFF14WR:
1818 case R_PARISC_PLTOFF14DR:
1819 case R_PARISC_PLTOFF16F:
1820 case R_PARISC_PLTOFF16WF:
1821 case R_PARISC_PLTOFF16DF:
1823 /* We want the value of the PLT offset for this symbol, not
1824 the symbol's actual address. Note that __gp may not point
1825 to the start of the DLT, so we have to compute the absolute
1826 address, then subtract out the value of __gp. */
1827 value = (dyn_h->plt_offset
1828 + hppa_info->plt_sec->output_offset
1829 + hppa_info->plt_sec->output_section->vma);
1830 value -= _bfd_get_gp_value (output_bfd);
1832 /* All PLTOFF relocations are basically the same at this point,
1833 except that we need different field selectors for the 21bit
1834 version vs the 14bit versions. */
1835 if (r_type == R_PARISC_PLTOFF21L)
1836 value = hppa_field_adjust (value, addend, e_lrsel);
1837 else if (r_type == R_PARISC_PLTOFF14F
1838 || r_type == R_PARISC_PLTOFF16F
1839 || r_type == R_PARISC_PLTOFF16WF
1840 || r_type == R_PARISC_PLTOFF16DF)
1841 value = hppa_field_adjust (value, addend, e_fsel);
1843 value = hppa_field_adjust (value, addend, e_rrsel);
1845 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
1849 case R_PARISC_LTOFF_FPTR32:
1851 /* We may still need to create the FPTR itself if it was for
1853 if (dyn_h->h == NULL)
1855 /* The first two words of an .opd entry are zero. */
1856 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1858 /* The next word is the address of the function. */
1859 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1860 (hppa_info->opd_sec->contents
1861 + dyn_h->opd_offset + 16));
1863 /* The last word is our local __gp value. */
1864 value = _bfd_get_gp_value
1865 (hppa_info->opd_sec->output_section->owner);
1866 bfd_put_64 (hppa_info->opd_sec->owner, value,
1867 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1869 /* The DLT value is the address of the .opd entry. */
1870 value = (dyn_h->opd_offset
1871 + hppa_info->opd_sec->output_offset
1872 + hppa_info->opd_sec->output_section->vma);
1874 bfd_put_64 (hppa_info->dlt_sec->owner,
1876 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1879 /* We want the value of the DLT offset for this symbol, not
1880 the symbol's actual address. Note that __gp may not point
1881 to the start of the DLT, so we have to compute the absolute
1882 address, then subtract out the value of __gp. */
1883 value = (dyn_h->dlt_offset
1884 + hppa_info->dlt_sec->output_offset
1885 + hppa_info->dlt_sec->output_section->vma);
1886 value -= _bfd_get_gp_value (output_bfd);
1887 bfd_put_32 (input_bfd, value, hit_data);
1888 return bfd_reloc_ok;
1891 case R_PARISC_LTOFF_FPTR64:
1892 case R_PARISC_LTOFF_TP64:
1894 /* We may still need to create the FPTR itself if it was for
1896 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1898 /* The first two words of an .opd entry are zero. */
1899 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1901 /* The next word is the address of the function. */
1902 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
1903 (hppa_info->opd_sec->contents
1904 + dyn_h->opd_offset + 16));
1906 /* The last word is our local __gp value. */
1907 value = _bfd_get_gp_value
1908 (hppa_info->opd_sec->output_section->owner);
1909 bfd_put_64 (hppa_info->opd_sec->owner, value,
1910 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1912 /* The DLT value is the address of the .opd entry. */
1913 value = (dyn_h->opd_offset
1914 + hppa_info->opd_sec->output_offset
1915 + hppa_info->opd_sec->output_section->vma);
1917 bfd_put_64 (hppa_info->dlt_sec->owner,
1919 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
1922 /* We want the value of the DLT offset for this symbol, not
1923 the symbol's actual address. Note that __gp may not point
1924 to the start of the DLT, so we have to compute the absolute
1925 address, then subtract out the value of __gp. */
1926 value = (dyn_h->dlt_offset
1927 + hppa_info->dlt_sec->output_offset
1928 + hppa_info->dlt_sec->output_section->vma);
1929 value -= _bfd_get_gp_value (output_bfd);
1930 bfd_put_64 (input_bfd, value, hit_data);
1931 return bfd_reloc_ok;
1934 case R_PARISC_DIR32:
1935 bfd_put_32 (input_bfd, value + addend, hit_data);
1936 return bfd_reloc_ok;
1938 case R_PARISC_DIR64:
1939 bfd_put_64 (input_bfd, value + addend, hit_data);
1940 return bfd_reloc_ok;
1942 case R_PARISC_GPREL64:
1943 /* Subtract out the global pointer value to make value a DLT
1944 relative address. */
1945 value -= _bfd_get_gp_value (output_bfd);
1947 bfd_put_64 (input_bfd, value + addend, hit_data);
1948 return bfd_reloc_ok;
1950 case R_PARISC_LTOFF64:
1951 /* We want the value of the DLT offset for this symbol, not
1952 the symbol's actual address. Note that __gp may not point
1953 to the start of the DLT, so we have to compute the absolute
1954 address, then subtract out the value of __gp. */
1955 value = (dyn_h->dlt_offset
1956 + hppa_info->dlt_sec->output_offset
1957 + hppa_info->dlt_sec->output_section->vma);
1958 value -= _bfd_get_gp_value (output_bfd);
1960 bfd_put_64 (input_bfd, value + addend, hit_data);
1961 return bfd_reloc_ok;
1963 case R_PARISC_PCREL32:
1965 /* If this is a call to a function defined in another dynamic
1966 library, then redirect the call to the local stub for this
1968 if (sym_sec == NULL || sym_sec->output_section == NULL)
1969 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1970 + hppa_info->stub_sec->output_section->vma);
1972 /* Turn VALUE into a proper PC relative address. */
1973 value -= (offset + input_section->output_offset
1974 + input_section->output_section->vma);
1978 bfd_put_32 (input_bfd, value, hit_data);
1979 return bfd_reloc_ok;
1982 case R_PARISC_PCREL64:
1984 /* If this is a call to a function defined in another dynamic
1985 library, then redirect the call to the local stub for this
1987 if (sym_sec == NULL || sym_sec->output_section == NULL)
1988 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1989 + hppa_info->stub_sec->output_section->vma);
1991 /* Turn VALUE into a proper PC relative address. */
1992 value -= (offset + input_section->output_offset
1993 + input_section->output_section->vma);
1997 bfd_put_64 (input_bfd, value, hit_data);
1998 return bfd_reloc_ok;
2001 case R_PARISC_FPTR64:
2003 /* We may still need to create the FPTR itself if it was for
2005 if (dyn_h->h == NULL)
2007 /* The first two words of an .opd entry are zero. */
2008 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2010 /* The next word is the address of the function. */
2011 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
2012 (hppa_info->opd_sec->contents
2013 + dyn_h->opd_offset + 16));
2015 /* The last word is our local __gp value. */
2016 value = _bfd_get_gp_value
2017 (hppa_info->opd_sec->output_section->owner);
2018 bfd_put_64 (hppa_info->opd_sec->owner, value,
2019 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2022 if (dyn_h->want_opd)
2023 /* We want the value of the OPD offset for this symbol. */
2024 value = (dyn_h->opd_offset
2025 + hppa_info->opd_sec->output_offset
2026 + hppa_info->opd_sec->output_section->vma);
2028 /* We want the address of the symbol. */
2031 bfd_put_64 (input_bfd, value, hit_data);
2032 return bfd_reloc_ok;
2035 case R_PARISC_SECREL32:
2036 bfd_put_32 (input_bfd,
2037 value + addend - sym_sec->output_section->vma,
2039 return bfd_reloc_ok;
2041 case R_PARISC_SEGREL32:
2042 case R_PARISC_SEGREL64:
2044 /* If this is the first SEGREL relocation, then initialize
2045 the segment base values. */
2046 if (hppa_info->text_segment_base == (bfd_vma) -1)
2047 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
2050 /* VALUE holds the absolute address. We want to include the
2051 addend, then turn it into a segment relative address.
2053 The segment is derived from SYM_SEC. We assume that there are
2054 only two segments of note in the resulting executable/shlib.
2055 A readonly segment (.text) and a readwrite segment (.data). */
2058 if (sym_sec->flags & SEC_CODE)
2059 value -= hppa_info->text_segment_base;
2061 value -= hppa_info->data_segment_base;
2063 if (r_type == R_PARISC_SEGREL32)
2064 bfd_put_32 (input_bfd, value, hit_data);
2066 bfd_put_64 (input_bfd, value, hit_data);
2067 return bfd_reloc_ok;
2070 /* Something we don't know how to handle. */
2072 return bfd_reloc_notsupported;
2075 /* Update the instruction word. */
2076 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
2077 return bfd_reloc_ok;
2080 /* Relocate the given INSN. VALUE should be the actual value we want
2081 to insert into the instruction, ie by this point we should not be
2082 concerned with computing an offset relative to the DLT, PC, etc.
2083 Instead this routine is meant to handle the bit manipulations needed
2084 to insert the relocation into the given instruction. */
2087 elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
2091 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
2092 the "B" instruction. */
2093 case R_PARISC_PCREL22F:
2094 case R_PARISC_PCREL22C:
2095 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
2097 /* This is any 12 bit branch. */
2098 case R_PARISC_PCREL12F:
2099 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2101 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
2102 to the "B" instruction as well as BE. */
2103 case R_PARISC_PCREL17F:
2104 case R_PARISC_DIR17F:
2105 case R_PARISC_DIR17R:
2106 case R_PARISC_PCREL17C:
2107 case R_PARISC_PCREL17R:
2108 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2110 /* ADDIL or LDIL instructions. */
2111 case R_PARISC_DLTREL21L:
2112 case R_PARISC_DLTIND21L:
2113 case R_PARISC_LTOFF_FPTR21L:
2114 case R_PARISC_PCREL21L:
2115 case R_PARISC_LTOFF_TP21L:
2116 case R_PARISC_DPREL21L:
2117 case R_PARISC_PLTOFF21L:
2118 case R_PARISC_DIR21L:
2119 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2121 /* LDO and integer loads/stores with 14 bit displacements. */
2122 case R_PARISC_DLTREL14R:
2123 case R_PARISC_DLTREL14F:
2124 case R_PARISC_DLTIND14R:
2125 case R_PARISC_DLTIND14F:
2126 case R_PARISC_LTOFF_FPTR14R:
2127 case R_PARISC_PCREL14R:
2128 case R_PARISC_PCREL14F:
2129 case R_PARISC_LTOFF_TP14R:
2130 case R_PARISC_LTOFF_TP14F:
2131 case R_PARISC_DPREL14R:
2132 case R_PARISC_DPREL14F:
2133 case R_PARISC_PLTOFF14R:
2134 case R_PARISC_PLTOFF14F:
2135 case R_PARISC_DIR14R:
2136 case R_PARISC_DIR14F:
2137 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2139 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
2140 case R_PARISC_LTOFF_FPTR16F:
2141 case R_PARISC_PCREL16F:
2142 case R_PARISC_LTOFF_TP16F:
2143 case R_PARISC_GPREL16F:
2144 case R_PARISC_PLTOFF16F:
2145 case R_PARISC_DIR16F:
2146 case R_PARISC_LTOFF16F:
2147 return (insn & ~0xffff) | re_assemble_16 (sym_value);
2149 /* Doubleword loads and stores with a 14 bit displacement. */
2150 case R_PARISC_DLTREL14DR:
2151 case R_PARISC_DLTIND14DR:
2152 case R_PARISC_LTOFF_FPTR14DR:
2153 case R_PARISC_LTOFF_FPTR16DF:
2154 case R_PARISC_PCREL14DR:
2155 case R_PARISC_PCREL16DF:
2156 case R_PARISC_LTOFF_TP14DR:
2157 case R_PARISC_LTOFF_TP16DF:
2158 case R_PARISC_DPREL14DR:
2159 case R_PARISC_GPREL16DF:
2160 case R_PARISC_PLTOFF14DR:
2161 case R_PARISC_PLTOFF16DF:
2162 case R_PARISC_DIR14DR:
2163 case R_PARISC_DIR16DF:
2164 case R_PARISC_LTOFF16DF:
2165 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
2166 | ((sym_value & 0x1ff8) << 1));
2168 /* Floating point single word load/store instructions. */
2169 case R_PARISC_DLTREL14WR:
2170 case R_PARISC_DLTIND14WR:
2171 case R_PARISC_LTOFF_FPTR14WR:
2172 case R_PARISC_LTOFF_FPTR16WF:
2173 case R_PARISC_PCREL14WR:
2174 case R_PARISC_PCREL16WF:
2175 case R_PARISC_LTOFF_TP14WR:
2176 case R_PARISC_LTOFF_TP16WF:
2177 case R_PARISC_DPREL14WR:
2178 case R_PARISC_GPREL16WF:
2179 case R_PARISC_PLTOFF14WR:
2180 case R_PARISC_PLTOFF16WF:
2181 case R_PARISC_DIR16WF:
2182 case R_PARISC_DIR14WR:
2183 case R_PARISC_LTOFF16WF:
2184 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
2185 | ((sym_value & 0x1ffc) << 1));