/src/binutils-gdb/bfd/elf-hppa.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Common code for PA ELF implementations. |
2 | | Copyright (C) 1999-2025 Free Software Foundation, Inc. |
3 | | |
4 | | This file is part of BFD, the Binary File Descriptor library. |
5 | | |
6 | | This program is free software; you can redistribute it and/or modify |
7 | | it under the terms of the GNU General Public License as published by |
8 | | the Free Software Foundation; either version 3 of the License, or |
9 | | (at your option) any later version. |
10 | | |
11 | | This program is distributed in the hope that it will be useful, |
12 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | GNU General Public License for more details. |
15 | | |
16 | | You should have received a copy of the GNU General Public License |
17 | | along with this program; if not, write to the Free Software |
18 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
19 | | MA 02110-1301, USA. */ |
20 | | |
21 | | #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1 |
22 | | |
23 | | /* This file is included by multiple PA ELF BFD backends with different |
24 | | sizes. |
25 | | |
26 | | Most of the routines are written to be size independent, but sometimes |
27 | | external constraints require 32 or 64 bit specific code. We remap |
28 | | the definitions/functions as necessary here. */ |
29 | | #if ARCH_SIZE == 64 |
30 | 0 | #define ELF_R_TYPE(X) ELF64_R_TYPE(X) |
31 | 0 | #define ELF_R_SYM(X) ELF64_R_SYM(X) |
32 | 0 | #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type |
33 | | #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type |
34 | | #define elf_hppa_relocate_section elf64_hppa_relocate_section |
35 | | #define elf_hppa_final_link elf64_hppa_final_link |
36 | | #endif |
37 | | #if ARCH_SIZE == 32 |
38 | 0 | #define ELF_R_TYPE(X) ELF32_R_TYPE(X) |
39 | | #define ELF_R_SYM(X) ELF32_R_SYM(X) |
40 | 0 | #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type |
41 | | #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type |
42 | | #define elf_hppa_relocate_section elf32_hppa_relocate_section |
43 | | #define elf_hppa_final_link elf32_hppa_final_link |
44 | | #endif |
45 | | |
46 | | /* ELF/PA relocation howto entries. */ |
47 | | |
48 | | static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] = |
49 | | { |
50 | | #define HOW(type, size, bitsize, pc_rel, complain, mask) \ |
51 | | HOWTO (type, 0, size, bitsize, pc_rel, 0, complain_overflow_ ## complain, \ |
52 | | bfd_elf_generic_reloc, #type, false, 0, mask, false) |
53 | | |
54 | | /* The values in DIR32 are to placate the check in |
55 | | _bfd_stab_section_find_nearest_line. */ |
56 | | HOW (R_PARISC_NONE, 0, 0, false, dont, 0), |
57 | | HOW (R_PARISC_DIR32, 4, 32, false, bitfield, 0xffffffff), |
58 | | HOW (R_PARISC_DIR21L, 4, 21, false, bitfield, 0), |
59 | | HOW (R_PARISC_DIR17R, 4, 17, false, bitfield, 0), |
60 | | HOW (R_PARISC_DIR17F, 4, 17, false, bitfield, 0), |
61 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
62 | | HOW (R_PARISC_DIR14R, 4, 14, false, bitfield, 0), |
63 | | HOW (R_PARISC_DIR14F, 4, 14, false, bitfield, 0), |
64 | | /* 8 */ |
65 | | HOW (R_PARISC_PCREL12F, 4, 12, true, bitfield, 0), |
66 | | HOW (R_PARISC_PCREL32, 4, 32, true, bitfield, 0), |
67 | | HOW (R_PARISC_PCREL21L, 4, 21, true, bitfield, 0), |
68 | | HOW (R_PARISC_PCREL17R, 4, 17, true, bitfield, 0), |
69 | | HOW (R_PARISC_PCREL17F, 4, 17, true, bitfield, 0), |
70 | | HOW (R_PARISC_PCREL17C, 4, 17, true, bitfield, 0), |
71 | | HOW (R_PARISC_PCREL14R, 4, 14, true, bitfield, 0), |
72 | | HOW (R_PARISC_PCREL14F, 4, 14, true, bitfield, 0), |
73 | | /* 16 */ |
74 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
75 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
76 | | HOW (R_PARISC_DPREL21L, 4, 21, false, bitfield, 0), |
77 | | HOW (R_PARISC_DPREL14WR, 4, 14, false, bitfield, 0), |
78 | | HOW (R_PARISC_DPREL14DR, 4, 14, false, bitfield, 0), |
79 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
80 | | HOW (R_PARISC_DPREL14R, 4, 14, false, bitfield, 0), |
81 | | HOW (R_PARISC_DPREL14F, 4, 14, false, bitfield, 0), |
82 | | /* 24 */ |
83 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
84 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
85 | | HOW (R_PARISC_DLTREL21L, 4, 21, false, bitfield, 0), |
86 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
87 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
88 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
89 | | HOW (R_PARISC_DLTREL14R, 4, 14, false, bitfield, 0), |
90 | | HOW (R_PARISC_DLTREL14F, 4, 14, false, bitfield, 0), |
91 | | /* 32 */ |
92 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
93 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
94 | | HOW (R_PARISC_DLTIND21L, 4, 21, false, bitfield, 0), |
95 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
96 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
97 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
98 | | HOW (R_PARISC_DLTIND14R, 4, 14, false, bitfield, 0), |
99 | | HOW (R_PARISC_DLTIND14F, 4, 14, false, bitfield, 0), |
100 | | /* 40 */ |
101 | | HOW (R_PARISC_SETBASE, 0, 0, false, bitfield, 0), |
102 | | HOW (R_PARISC_SECREL32, 4, 32, false, bitfield, 0xffffffff), |
103 | | HOW (R_PARISC_BASEREL21L, 4, 21, false, bitfield, 0), |
104 | | HOW (R_PARISC_BASEREL17R, 4, 17, false, bitfield, 0), |
105 | | HOW (R_PARISC_BASEREL17F, 4, 17, false, bitfield, 0), |
106 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
107 | | HOW (R_PARISC_BASEREL14R, 4, 14, false, bitfield, 0), |
108 | | HOW (R_PARISC_BASEREL14F, 4, 14, false, bitfield, 0), |
109 | | /* 48 */ |
110 | | HOW (R_PARISC_SEGBASE, 0, 0, false, bitfield, 0), |
111 | | HOW (R_PARISC_SEGREL32, 4, 32, false, bitfield, 0), |
112 | | HOW (R_PARISC_PLTOFF21L, 4, 21, false, bitfield, 0), |
113 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
114 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
115 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
116 | | HOW (R_PARISC_PLTOFF14R, 4, 14, false, bitfield, 0), |
117 | | HOW (R_PARISC_PLTOFF14F, 4, 14, false, bitfield, 0), |
118 | | /* 56 */ |
119 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
120 | | HOW (R_PARISC_LTOFF_FPTR32, 4, 32, false, bitfield, 0), |
121 | | HOW (R_PARISC_LTOFF_FPTR21L, 4, 21, false, bitfield, 0), |
122 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
123 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
124 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
125 | | HOW (R_PARISC_LTOFF_FPTR14R, 4, 14, false, bitfield, 0), |
126 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
127 | | /* 64 */ |
128 | | HOW (R_PARISC_FPTR64, 8, 64, false, bitfield, 0), |
129 | | HOW (R_PARISC_PLABEL32, 4, 32, false, bitfield, 0), |
130 | | HOW (R_PARISC_PLABEL21L, 4, 21, false, bitfield, 0), |
131 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
132 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
133 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
134 | | HOW (R_PARISC_PLABEL14R, 4, 14, false, bitfield, 0), |
135 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
136 | | /* 72 */ |
137 | | HOW (R_PARISC_PCREL64, 8, 64, false, bitfield, 0), |
138 | | HOW (R_PARISC_PCREL22C, 4, 22, false, bitfield, 0), |
139 | | HOW (R_PARISC_PCREL22F, 4, 22, false, bitfield, 0), |
140 | | HOW (R_PARISC_PCREL14WR, 4, 14, false, bitfield, 0), |
141 | | HOW (R_PARISC_PCREL14DR, 4, 14, false, bitfield, 0), |
142 | | HOW (R_PARISC_PCREL16F, 4, 16, false, bitfield, 0), |
143 | | HOW (R_PARISC_PCREL16WF, 4, 16, false, bitfield, 0), |
144 | | HOW (R_PARISC_PCREL16DF, 4, 16, false, bitfield, 0), |
145 | | /* 80 */ |
146 | | HOW (R_PARISC_DIR64, 8, 64, false, bitfield, 0), |
147 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
148 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
149 | | HOW (R_PARISC_DIR14WR, 4, 14, false, bitfield, 0), |
150 | | HOW (R_PARISC_DIR14DR, 4, 14, false, bitfield, 0), |
151 | | HOW (R_PARISC_DIR16F, 4, 16, false, bitfield, 0), |
152 | | HOW (R_PARISC_DIR16WF, 4, 16, false, bitfield, 0), |
153 | | HOW (R_PARISC_DIR16DF, 4, 16, false, bitfield, 0), |
154 | | /* 88 */ |
155 | | HOW (R_PARISC_GPREL64, 8, 64, false, bitfield, 0), |
156 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
157 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
158 | | HOW (R_PARISC_DLTREL14WR, 4, 14, false, bitfield, 0), |
159 | | HOW (R_PARISC_DLTREL14DR, 4, 14, false, bitfield, 0), |
160 | | HOW (R_PARISC_GPREL16F, 4, 16, false, bitfield, 0), |
161 | | HOW (R_PARISC_GPREL16WF, 4, 16, false, bitfield, 0), |
162 | | HOW (R_PARISC_GPREL16DF, 4, 16, false, bitfield, 0), |
163 | | /* 96 */ |
164 | | HOW (R_PARISC_LTOFF64, 8, 64, false, bitfield, 0), |
165 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
166 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
167 | | HOW (R_PARISC_DLTIND14WR, 4, 14, false, bitfield, 0), |
168 | | HOW (R_PARISC_DLTIND14DR, 4, 14, false, bitfield, 0), |
169 | | HOW (R_PARISC_LTOFF16F, 4, 16, false, bitfield, 0), |
170 | | HOW (R_PARISC_LTOFF16WF, 4, 16, false, bitfield, 0), |
171 | | HOW (R_PARISC_LTOFF16DF, 4, 16, false, bitfield, 0), |
172 | | /* 104 */ |
173 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
174 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
175 | | HOW (R_PARISC_BASEREL14WR, 4, 14, false, bitfield, 0), |
176 | | HOW (R_PARISC_BASEREL14DR, 4, 14, false, bitfield, 0), |
177 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
178 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
179 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
180 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
181 | | /* 112 */ |
182 | | HOW (R_PARISC_SEGREL64, 8, 64, false, bitfield, 0), |
183 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
184 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
185 | | HOW (R_PARISC_PLTOFF14WR, 4, 14, false, bitfield, 0), |
186 | | HOW (R_PARISC_PLTOFF14DR, 4, 14, false, bitfield, 0), |
187 | | HOW (R_PARISC_PLTOFF16F, 4, 16, false, bitfield, 0), |
188 | | HOW (R_PARISC_PLTOFF16WF, 4, 16, false, bitfield, 0), |
189 | | HOW (R_PARISC_PLTOFF16DF, 4, 16, false, bitfield, 0), |
190 | | /* 120 */ |
191 | | HOW (R_PARISC_LTOFF_FPTR64, 8, 64, false, bitfield, 0), |
192 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
193 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
194 | | HOW (R_PARISC_LTOFF_FPTR14WR, 4, 14, false, bitfield, 0), |
195 | | HOW (R_PARISC_LTOFF_FPTR14DR, 4, 14, false, bitfield, 0), |
196 | | HOW (R_PARISC_LTOFF_FPTR16F, 4, 16, false, bitfield, 0), |
197 | | HOW (R_PARISC_LTOFF_FPTR16WF, 4, 16, false, bitfield, 0), |
198 | | HOW (R_PARISC_LTOFF_FPTR16DF, 4, 16, false, bitfield, 0), |
199 | | /* 128 */ |
200 | | HOW (R_PARISC_COPY, 0, 0, false, bitfield, 0), |
201 | | HOW (R_PARISC_IPLT, 0, 0, false, bitfield, 0), |
202 | | HOW (R_PARISC_EPLT, 0, 0, false, bitfield, 0), |
203 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
204 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
205 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
206 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
207 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
208 | | /* 136 */ |
209 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
210 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
211 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
212 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
213 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
214 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
215 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
216 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
217 | | /* 144 */ |
218 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
219 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
220 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
221 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
222 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
223 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
224 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
225 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
226 | | /* 152 */ |
227 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
228 | | HOW (R_PARISC_TPREL32, 4, 32, false, dont, 0), |
229 | | HOW (R_PARISC_TPREL21L, 4, 21, false, bitfield, 0), |
230 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
231 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
232 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
233 | | HOW (R_PARISC_TPREL14R, 4, 14, false, bitfield, 0), |
234 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
235 | | /* 160 */ |
236 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
237 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
238 | | HOW (R_PARISC_LTOFF_TP21L, 4, 21, false, bitfield, 0), |
239 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
240 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
241 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
242 | | HOW (R_PARISC_LTOFF_TP14R, 4, 14, false, bitfield, 0), |
243 | | HOW (R_PARISC_LTOFF_TP14F, 4, 14, false, bitfield, 0), |
244 | | /* 168 */ |
245 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
246 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
247 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
248 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
249 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
250 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
251 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
252 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
253 | | /* 176 */ |
254 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
255 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
256 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
257 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
258 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
259 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
260 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
261 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
262 | | /* 184 */ |
263 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
264 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
265 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
266 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
267 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
268 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
269 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
270 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
271 | | /* 192 */ |
272 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
273 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
274 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
275 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
276 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
277 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
278 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
279 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
280 | | /* 200 */ |
281 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
282 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
283 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
284 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
285 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
286 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
287 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
288 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
289 | | /* 208 */ |
290 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
291 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
292 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
293 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
294 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, dont, 0), |
295 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
296 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
297 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
298 | | /* 216 */ |
299 | | HOW (R_PARISC_TPREL64, 8, 64, false, bitfield, 0), |
300 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
301 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
302 | | HOW (R_PARISC_TPREL14WR, 4, 14, false, dont, 0), |
303 | | HOW (R_PARISC_TPREL14DR, 4, 14, false, bitfield, 0), |
304 | | HOW (R_PARISC_TPREL16F, 4, 16, false, bitfield, 0), |
305 | | HOW (R_PARISC_TPREL16WF, 4, 16, false, dont, 0), |
306 | | HOW (R_PARISC_TPREL16DF, 4, 16, false, bitfield, 0), |
307 | | /* 224 */ |
308 | | HOW (R_PARISC_LTOFF_TP64, 8, 64, false, bitfield, 0), |
309 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
310 | | HOW (R_PARISC_UNIMPLEMENTED, 0, 0, false, bitfield, 0), |
311 | | HOW (R_PARISC_LTOFF_TP14WR, 4, 14, false, bitfield, 0), |
312 | | HOW (R_PARISC_LTOFF_TP14DR, 4, 14, false, bitfield, 0), |
313 | | HOW (R_PARISC_LTOFF_TP16F, 4, 16, false, dont, 0), |
314 | | HOW (R_PARISC_LTOFF_TP16WF, 4, 16, false, bitfield, 0), |
315 | | HOW (R_PARISC_LTOFF_TP16DF, 4, 16, false, bitfield, 0), |
316 | | /* 232 */ |
317 | | HOW (R_PARISC_GNU_VTENTRY, 0, 0, false, dont, 0), |
318 | | HOW (R_PARISC_GNU_VTINHERIT, 0, 0, false, dont, 0), |
319 | | HOW (R_PARISC_TLS_GD21L, 4, 21, false, bitfield, 0), |
320 | | HOW (R_PARISC_TLS_GD14R, 4, 14, false, bitfield, 0), |
321 | | HOW (R_PARISC_TLS_GDCALL, 0, 0, false, dont, 0), |
322 | | HOW (R_PARISC_TLS_LDM21L, 4, 21, false, bitfield, 0), |
323 | | HOW (R_PARISC_TLS_LDM14R, 4, 14, false, bitfield, 0), |
324 | | HOW (R_PARISC_TLS_LDMCALL, 0, 0, false, dont, 0), |
325 | | /* 240 */ |
326 | | HOW (R_PARISC_TLS_LDO21L, 4, 21, false, bitfield, 0), |
327 | | HOW (R_PARISC_TLS_LDO14R, 4, 14, false, bitfield, 0), |
328 | | HOW (R_PARISC_TLS_DTPMOD32, 4, 32, false, bitfield, 0), |
329 | | HOW (R_PARISC_TLS_DTPMOD64, 8, 64, false, bitfield, 0), |
330 | | HOW (R_PARISC_TLS_DTPOFF32, 4, 32, false, bitfield, 0), |
331 | | HOW (R_PARISC_TLS_DTPOFF64, 8, 64, false, bitfield, 0) |
332 | | #undef HOW |
333 | | }; |
334 | | |
335 | 0 | #define OFFSET_14R_FROM_21L 4 |
336 | 0 | #define OFFSET_14F_FROM_21L 5 |
337 | | |
338 | | /* Return the final relocation type for the given base type, instruction |
339 | | format, and field selector. */ |
340 | | |
341 | | elf_hppa_reloc_type |
342 | | elf_hppa_reloc_final_type (bfd *abfd, |
343 | | elf_hppa_reloc_type base_type, |
344 | | int format, |
345 | | unsigned int field) |
346 | 0 | { |
347 | 0 | elf_hppa_reloc_type final_type = base_type; |
348 | | |
349 | | /* Just a tangle of nested switch statements to deal with the braindamage |
350 | | that a different field selector means a completely different relocation |
351 | | for PA ELF. */ |
352 | 0 | switch (base_type) |
353 | 0 | { |
354 | | /* We have been using generic relocation types. However, that may not |
355 | | really make sense. Anyway, we need to support both R_PARISC_DIR64 |
356 | | and R_PARISC_DIR32 here. */ |
357 | 0 | case R_PARISC_DIR32: |
358 | 0 | case R_PARISC_DIR64: |
359 | 0 | case R_HPPA_ABS_CALL: |
360 | 0 | switch (format) |
361 | 0 | { |
362 | 0 | case 14: |
363 | 0 | switch (field) |
364 | 0 | { |
365 | 0 | case e_fsel: |
366 | 0 | final_type = R_PARISC_DIR14F; |
367 | 0 | break; |
368 | 0 | case e_rsel: |
369 | 0 | case e_rrsel: |
370 | 0 | case e_rdsel: |
371 | 0 | final_type = R_PARISC_DIR14R; |
372 | 0 | break; |
373 | 0 | case e_rtsel: |
374 | 0 | final_type = R_PARISC_DLTIND14R; |
375 | 0 | break; |
376 | 0 | case e_rtpsel: |
377 | 0 | final_type = R_PARISC_LTOFF_FPTR14DR; |
378 | 0 | break; |
379 | 0 | case e_tsel: |
380 | 0 | final_type = R_PARISC_DLTIND14F; |
381 | 0 | break; |
382 | 0 | case e_rpsel: |
383 | 0 | final_type = R_PARISC_PLABEL14R; |
384 | 0 | break; |
385 | 0 | default: |
386 | 0 | return R_PARISC_NONE; |
387 | 0 | } |
388 | 0 | break; |
389 | | |
390 | 0 | case 17: |
391 | 0 | switch (field) |
392 | 0 | { |
393 | 0 | case e_fsel: |
394 | 0 | final_type = R_PARISC_DIR17F; |
395 | 0 | break; |
396 | 0 | case e_rsel: |
397 | 0 | case e_rrsel: |
398 | 0 | case e_rdsel: |
399 | 0 | final_type = R_PARISC_DIR17R; |
400 | 0 | break; |
401 | 0 | default: |
402 | 0 | return R_PARISC_NONE; |
403 | 0 | } |
404 | 0 | break; |
405 | | |
406 | 0 | case 21: |
407 | 0 | switch (field) |
408 | 0 | { |
409 | 0 | case e_lsel: |
410 | 0 | case e_lrsel: |
411 | 0 | case e_ldsel: |
412 | 0 | case e_nlsel: |
413 | 0 | case e_nlrsel: |
414 | 0 | final_type = R_PARISC_DIR21L; |
415 | 0 | break; |
416 | 0 | case e_ltsel: |
417 | 0 | final_type = R_PARISC_DLTIND21L; |
418 | 0 | break; |
419 | 0 | case e_ltpsel: |
420 | 0 | final_type = R_PARISC_LTOFF_FPTR21L; |
421 | 0 | break; |
422 | 0 | case e_lpsel: |
423 | 0 | final_type = R_PARISC_PLABEL21L; |
424 | 0 | break; |
425 | 0 | default: |
426 | 0 | return R_PARISC_NONE; |
427 | 0 | } |
428 | 0 | break; |
429 | | |
430 | 0 | case 32: |
431 | 0 | switch (field) |
432 | 0 | { |
433 | 0 | case e_fsel: |
434 | 0 | final_type = R_PARISC_DIR32; |
435 | | /* When in 64bit mode, a 32bit relocation is supposed to |
436 | | be a section relative relocation. Dwarf2 (for example) |
437 | | uses 32bit section relative relocations. */ |
438 | 0 | if (bfd_arch_bits_per_address (abfd) != 32) |
439 | 0 | final_type = R_PARISC_SECREL32; |
440 | 0 | break; |
441 | 0 | case e_psel: |
442 | 0 | final_type = R_PARISC_PLABEL32; |
443 | 0 | break; |
444 | 0 | default: |
445 | 0 | return R_PARISC_NONE; |
446 | 0 | } |
447 | 0 | break; |
448 | | |
449 | 0 | case 64: |
450 | 0 | switch (field) |
451 | 0 | { |
452 | 0 | case e_fsel: |
453 | 0 | final_type = R_PARISC_DIR64; |
454 | 0 | break; |
455 | 0 | case e_psel: |
456 | 0 | final_type = R_PARISC_FPTR64; |
457 | 0 | break; |
458 | 0 | default: |
459 | 0 | return R_PARISC_NONE; |
460 | 0 | } |
461 | 0 | break; |
462 | | |
463 | 0 | default: |
464 | 0 | return R_PARISC_NONE; |
465 | 0 | } |
466 | 0 | break; |
467 | | |
468 | 0 | case R_HPPA_GOTOFF: |
469 | 0 | switch (format) |
470 | 0 | { |
471 | 0 | case 14: |
472 | 0 | switch (field) |
473 | 0 | { |
474 | 0 | case e_rsel: |
475 | 0 | case e_rrsel: |
476 | 0 | case e_rdsel: |
477 | | /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32. */ |
478 | 0 | final_type = base_type + OFFSET_14R_FROM_21L; |
479 | 0 | break; |
480 | 0 | case e_fsel: |
481 | | /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32. */ |
482 | 0 | final_type = base_type + OFFSET_14F_FROM_21L; |
483 | 0 | break; |
484 | 0 | default: |
485 | 0 | return R_PARISC_NONE; |
486 | 0 | } |
487 | 0 | break; |
488 | | |
489 | 0 | case 21: |
490 | 0 | switch (field) |
491 | 0 | { |
492 | 0 | case e_lsel: |
493 | 0 | case e_lrsel: |
494 | 0 | case e_ldsel: |
495 | 0 | case e_nlsel: |
496 | 0 | case e_nlrsel: |
497 | | /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32. */ |
498 | 0 | final_type = base_type; |
499 | 0 | break; |
500 | 0 | default: |
501 | 0 | return R_PARISC_NONE; |
502 | 0 | } |
503 | 0 | break; |
504 | | |
505 | 0 | case 64: |
506 | 0 | switch (field) |
507 | 0 | { |
508 | 0 | case e_fsel: |
509 | 0 | final_type = R_PARISC_GPREL64; |
510 | 0 | break; |
511 | 0 | default: |
512 | 0 | return R_PARISC_NONE; |
513 | 0 | } |
514 | 0 | break; |
515 | | |
516 | 0 | default: |
517 | 0 | return R_PARISC_NONE; |
518 | 0 | } |
519 | 0 | break; |
520 | | |
521 | 0 | case R_HPPA_PCREL_CALL: |
522 | 0 | switch (format) |
523 | 0 | { |
524 | 0 | case 12: |
525 | 0 | switch (field) |
526 | 0 | { |
527 | 0 | case e_fsel: |
528 | 0 | final_type = R_PARISC_PCREL12F; |
529 | 0 | break; |
530 | 0 | default: |
531 | 0 | return R_PARISC_NONE; |
532 | 0 | } |
533 | 0 | break; |
534 | | |
535 | 0 | case 14: |
536 | | /* Contrary to appearances, these are not calls of any sort. |
537 | | Rather, they are loads/stores with a pcrel reloc. */ |
538 | 0 | switch (field) |
539 | 0 | { |
540 | 0 | case e_rsel: |
541 | 0 | case e_rrsel: |
542 | 0 | case e_rdsel: |
543 | 0 | final_type = R_PARISC_PCREL14R; |
544 | 0 | break; |
545 | 0 | case e_fsel: |
546 | 0 | if (bfd_get_mach (abfd) < 25) |
547 | 0 | final_type = R_PARISC_PCREL14F; |
548 | 0 | else |
549 | 0 | final_type = R_PARISC_PCREL16F; |
550 | 0 | break; |
551 | 0 | default: |
552 | 0 | return R_PARISC_NONE; |
553 | 0 | } |
554 | 0 | break; |
555 | | |
556 | 0 | case 17: |
557 | 0 | switch (field) |
558 | 0 | { |
559 | 0 | case e_rsel: |
560 | 0 | case e_rrsel: |
561 | 0 | case e_rdsel: |
562 | 0 | final_type = R_PARISC_PCREL17R; |
563 | 0 | break; |
564 | 0 | case e_fsel: |
565 | 0 | final_type = R_PARISC_PCREL17F; |
566 | 0 | break; |
567 | 0 | default: |
568 | 0 | return R_PARISC_NONE; |
569 | 0 | } |
570 | 0 | break; |
571 | | |
572 | 0 | case 21: |
573 | 0 | switch (field) |
574 | 0 | { |
575 | 0 | case e_lsel: |
576 | 0 | case e_lrsel: |
577 | 0 | case e_ldsel: |
578 | 0 | case e_nlsel: |
579 | 0 | case e_nlrsel: |
580 | 0 | final_type = R_PARISC_PCREL21L; |
581 | 0 | break; |
582 | 0 | default: |
583 | 0 | return R_PARISC_NONE; |
584 | 0 | } |
585 | 0 | break; |
586 | | |
587 | 0 | case 22: |
588 | 0 | switch (field) |
589 | 0 | { |
590 | 0 | case e_fsel: |
591 | 0 | final_type = R_PARISC_PCREL22F; |
592 | 0 | break; |
593 | 0 | default: |
594 | 0 | return R_PARISC_NONE; |
595 | 0 | } |
596 | 0 | break; |
597 | | |
598 | 0 | case 32: |
599 | 0 | switch (field) |
600 | 0 | { |
601 | 0 | case e_fsel: |
602 | 0 | final_type = R_PARISC_PCREL32; |
603 | 0 | break; |
604 | 0 | default: |
605 | 0 | return R_PARISC_NONE; |
606 | 0 | } |
607 | 0 | break; |
608 | | |
609 | 0 | case 64: |
610 | 0 | switch (field) |
611 | 0 | { |
612 | 0 | case e_fsel: |
613 | 0 | final_type = R_PARISC_PCREL64; |
614 | 0 | break; |
615 | 0 | default: |
616 | 0 | return R_PARISC_NONE; |
617 | 0 | } |
618 | 0 | break; |
619 | | |
620 | 0 | default: |
621 | 0 | return R_PARISC_NONE; |
622 | 0 | } |
623 | 0 | break; |
624 | | |
625 | 0 | case R_PARISC_TLS_GD21L: |
626 | 0 | switch (field) |
627 | 0 | { |
628 | 0 | case e_ltsel: |
629 | 0 | case e_lrsel: |
630 | 0 | final_type = R_PARISC_TLS_GD21L; |
631 | 0 | break; |
632 | 0 | case e_rtsel: |
633 | 0 | case e_rrsel: |
634 | 0 | final_type = R_PARISC_TLS_GD14R; |
635 | 0 | break; |
636 | 0 | default: |
637 | 0 | return R_PARISC_NONE; |
638 | 0 | } |
639 | 0 | break; |
640 | | |
641 | 0 | case R_PARISC_TLS_LDM21L: |
642 | 0 | switch (field) |
643 | 0 | { |
644 | 0 | case e_ltsel: |
645 | 0 | case e_lrsel: |
646 | 0 | final_type = R_PARISC_TLS_LDM21L; |
647 | 0 | break; |
648 | 0 | case e_rtsel: |
649 | 0 | case e_rrsel: |
650 | 0 | final_type = R_PARISC_TLS_LDM14R; |
651 | 0 | break; |
652 | 0 | default: |
653 | 0 | return R_PARISC_NONE; |
654 | 0 | } |
655 | 0 | break; |
656 | | |
657 | 0 | case R_PARISC_TLS_LDO21L: |
658 | 0 | switch (field) |
659 | 0 | { |
660 | 0 | case e_lrsel: |
661 | 0 | final_type = R_PARISC_TLS_LDO21L; |
662 | 0 | break; |
663 | 0 | case e_rrsel: |
664 | 0 | final_type = R_PARISC_TLS_LDO14R; |
665 | 0 | break; |
666 | 0 | default: |
667 | 0 | return R_PARISC_NONE; |
668 | 0 | } |
669 | 0 | break; |
670 | | |
671 | 0 | case R_PARISC_TLS_IE21L: |
672 | 0 | switch (field) |
673 | 0 | { |
674 | 0 | case e_ltsel: |
675 | 0 | case e_lrsel: |
676 | 0 | final_type = R_PARISC_TLS_IE21L; |
677 | 0 | break; |
678 | 0 | case e_rtsel: |
679 | 0 | case e_rrsel: |
680 | 0 | final_type = R_PARISC_TLS_IE14R; |
681 | 0 | break; |
682 | 0 | default: |
683 | 0 | return R_PARISC_NONE; |
684 | 0 | } |
685 | 0 | break; |
686 | | |
687 | 0 | case R_PARISC_TLS_LE21L: |
688 | 0 | switch (field) |
689 | 0 | { |
690 | 0 | case e_lrsel: |
691 | 0 | final_type = R_PARISC_TLS_LE21L; |
692 | 0 | break; |
693 | 0 | case e_rrsel: |
694 | 0 | final_type = R_PARISC_TLS_LE14R; |
695 | 0 | break; |
696 | 0 | default: |
697 | 0 | return R_PARISC_NONE; |
698 | 0 | } |
699 | 0 | break; |
700 | | |
701 | 0 | case R_PARISC_SEGREL32: |
702 | 0 | switch (format) |
703 | 0 | { |
704 | 0 | case 32: |
705 | 0 | switch (field) |
706 | 0 | { |
707 | 0 | case e_fsel: |
708 | 0 | final_type = R_PARISC_SEGREL32; |
709 | 0 | break; |
710 | 0 | default: |
711 | 0 | return R_PARISC_NONE; |
712 | 0 | } |
713 | 0 | break; |
714 | | |
715 | 0 | case 64: |
716 | 0 | switch (field) |
717 | 0 | { |
718 | 0 | case e_fsel: |
719 | 0 | final_type = R_PARISC_SEGREL64; |
720 | 0 | break; |
721 | 0 | default: |
722 | 0 | return R_PARISC_NONE; |
723 | 0 | } |
724 | 0 | break; |
725 | | |
726 | 0 | default: |
727 | 0 | return R_PARISC_NONE; |
728 | 0 | } |
729 | 0 | break; |
730 | | |
731 | 0 | case R_PARISC_GNU_VTENTRY: |
732 | 0 | case R_PARISC_GNU_VTINHERIT: |
733 | 0 | case R_PARISC_SEGBASE: |
734 | | /* The defaults are fine for these cases. */ |
735 | 0 | break; |
736 | | |
737 | 0 | default: |
738 | 0 | return R_PARISC_NONE; |
739 | 0 | } |
740 | | |
741 | 0 | return final_type; |
742 | 0 | } Unexecuted instantiation: elf64_hppa_reloc_final_type Unexecuted instantiation: elf32_hppa_reloc_final_type |
743 | | |
744 | | /* Return one (or more) BFD relocations which implement the base |
745 | | relocation with modifications based on format and field. */ |
746 | | |
747 | | elf_hppa_reloc_type ** |
748 | | _bfd_elf_hppa_gen_reloc_type (bfd *abfd, |
749 | | elf_hppa_reloc_type base_type, |
750 | | int format, |
751 | | unsigned int field, |
752 | | int ignore ATTRIBUTE_UNUSED, |
753 | | asymbol *sym ATTRIBUTE_UNUSED) |
754 | 0 | { |
755 | 0 | elf_hppa_reloc_type *finaltype; |
756 | 0 | elf_hppa_reloc_type **final_types; |
757 | 0 | size_t amt = sizeof (elf_hppa_reloc_type *) * 2; |
758 | | |
759 | | /* Allocate slots for the BFD relocation. */ |
760 | 0 | final_types = bfd_alloc (abfd, amt); |
761 | 0 | if (final_types == NULL) |
762 | 0 | return NULL; |
763 | | |
764 | | /* Allocate space for the relocation itself. */ |
765 | 0 | amt = sizeof (elf_hppa_reloc_type); |
766 | 0 | finaltype = bfd_alloc (abfd, amt); |
767 | 0 | if (finaltype == NULL) |
768 | 0 | return NULL; |
769 | | |
770 | | /* Some reasonable defaults. */ |
771 | 0 | final_types[0] = finaltype; |
772 | 0 | final_types[1] = NULL; |
773 | |
|
774 | 0 | *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field); |
775 | |
|
776 | 0 | return final_types; |
777 | 0 | } Unexecuted instantiation: _bfd_elf64_hppa_gen_reloc_type Unexecuted instantiation: _bfd_elf32_hppa_gen_reloc_type |
778 | | |
779 | | /* Translate from an elf into field into a howto relocation pointer. */ |
780 | | |
781 | | static bool |
782 | | elf_hppa_info_to_howto (bfd *abfd, |
783 | | arelent *bfd_reloc, |
784 | | Elf_Internal_Rela *elf_reloc) |
785 | 450 | { |
786 | 450 | unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info); |
787 | 450 | unsigned int type = r_type; |
788 | 450 | reloc_howto_type *howto = NULL; |
789 | | |
790 | 450 | if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED) |
791 | 450 | { |
792 | 450 | howto = &elf_hppa_howto_table[r_type]; |
793 | 450 | type = howto->type; |
794 | 450 | } |
795 | 450 | if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED) |
796 | 0 | { |
797 | | /* xgettext:c-format */ |
798 | 0 | _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
799 | 0 | abfd, r_type); |
800 | 0 | bfd_set_error (bfd_error_bad_value); |
801 | 0 | return false; |
802 | 0 | } |
803 | 450 | bfd_reloc->howto = howto; |
804 | 450 | return true; |
805 | 450 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_info_to_howto elf32-hppa.c:elf_hppa_info_to_howto Line | Count | Source | 785 | 450 | { | 786 | 450 | unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info); | 787 | 450 | unsigned int type = r_type; | 788 | 450 | reloc_howto_type *howto = NULL; | 789 | | | 790 | 450 | if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED) | 791 | 450 | { | 792 | 450 | howto = &elf_hppa_howto_table[r_type]; | 793 | 450 | type = howto->type; | 794 | 450 | } | 795 | 450 | if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED) | 796 | 0 | { | 797 | | /* xgettext:c-format */ | 798 | 0 | _bfd_error_handler (_("%pB: unsupported relocation type %#x"), | 799 | 0 | abfd, r_type); | 800 | 0 | bfd_set_error (bfd_error_bad_value); | 801 | 0 | return false; | 802 | 0 | } | 803 | 450 | bfd_reloc->howto = howto; | 804 | 450 | return true; | 805 | 450 | } |
|
806 | | |
807 | | /* Translate from an elf into field into a howto relocation pointer. */ |
808 | | |
809 | | static bool |
810 | | elf_hppa_info_to_howto_rel (bfd *abfd, |
811 | | arelent *bfd_reloc, |
812 | | Elf_Internal_Rela *elf_reloc) |
813 | 0 | { |
814 | 0 | unsigned int r_type = ELF_R_TYPE (elf_reloc->r_info); |
815 | 0 | unsigned int type = r_type; |
816 | 0 | reloc_howto_type *howto = NULL; |
817 | |
|
818 | 0 | if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED) |
819 | 0 | { |
820 | 0 | howto = &elf_hppa_howto_table[r_type]; |
821 | 0 | type = howto->type; |
822 | 0 | } |
823 | 0 | if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED) |
824 | 0 | { |
825 | | /* xgettext:c-format */ |
826 | 0 | _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
827 | 0 | abfd, r_type); |
828 | 0 | bfd_set_error (bfd_error_bad_value); |
829 | 0 | return false; |
830 | 0 | } |
831 | 0 | bfd_reloc->howto = howto; |
832 | 0 | return true; |
833 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_info_to_howto_rel Unexecuted instantiation: elf32-hppa.c:elf_hppa_info_to_howto_rel |
834 | | |
835 | | /* Return the address of the howto table entry to perform the CODE |
836 | | relocation for an ARCH machine. */ |
837 | | |
838 | | static reloc_howto_type * |
839 | | elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, |
840 | | bfd_reloc_code_real_type code) |
841 | 0 | { |
842 | 0 | if ((int) code < (int) R_PARISC_UNIMPLEMENTED) |
843 | 0 | { |
844 | 0 | BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code); |
845 | 0 | return &elf_hppa_howto_table[(int) code]; |
846 | 0 | } |
847 | 0 | return NULL; |
848 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_reloc_type_lookup Unexecuted instantiation: elf32-hppa.c:elf_hppa_reloc_type_lookup |
849 | | |
850 | | static reloc_howto_type * |
851 | | elf_hppa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, |
852 | | const char *r_name) |
853 | 0 | { |
854 | 0 | unsigned int i; |
855 | |
|
856 | 0 | for (i = 0; |
857 | 0 | i < sizeof (elf_hppa_howto_table) / sizeof (elf_hppa_howto_table[0]); |
858 | 0 | i++) |
859 | 0 | if (elf_hppa_howto_table[i].name != NULL |
860 | 0 | && strcasecmp (elf_hppa_howto_table[i].name, r_name) == 0) |
861 | 0 | return &elf_hppa_howto_table[i]; |
862 | | |
863 | 0 | return NULL; |
864 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_reloc_name_lookup Unexecuted instantiation: elf32-hppa.c:elf_hppa_reloc_name_lookup |
865 | | |
866 | | /* Return TRUE if SYM represents a local label symbol. */ |
867 | | |
868 | | static bool |
869 | | elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name) |
870 | 0 | { |
871 | 0 | if (name[0] == 'L' && name[1] == '$') |
872 | 0 | return true; |
873 | 0 | return _bfd_elf_is_local_label_name (abfd, name); |
874 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_is_local_label_name Unexecuted instantiation: elf32-hppa.c:elf_hppa_is_local_label_name |
875 | | |
876 | | /* Set the correct type for an ELF section. We do this by the |
877 | | section name, which is a hack, but ought to work. */ |
878 | | |
879 | | static bool |
880 | | elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec) |
881 | 0 | { |
882 | 0 | const char *name; |
883 | |
|
884 | 0 | name = bfd_section_name (sec); |
885 | |
|
886 | 0 | if (strcmp (name, ".PARISC.unwind") == 0) |
887 | 0 | { |
888 | 0 | int indx; |
889 | 0 | asection *asec; |
890 | |
|
891 | | #if ARCH_SIZE == 64 |
892 | 0 | hdr->sh_type = SHT_PARISC_UNWIND; |
893 | | #else |
894 | | /* Note - it is not clear why this is not SHT_PARISC_UNWIND as well. |
895 | | Presumably it is a historical constraint, so leave it as it is. */ |
896 | 0 | hdr->sh_type = SHT_PROGBITS; |
897 | | #endif |
898 | | /* ?!? How are unwinds supposed to work for symbols in arbitrary |
899 | | sections? Or what if we have multiple .text sections in a single |
900 | | .o file? HP really messed up on this one. |
901 | | |
902 | | Ugh. We can not use elf_section_data (sec)->this_idx at this |
903 | | point because it is not initialized yet. |
904 | | |
905 | | So we (gasp) recompute it here. Hopefully nobody ever changes the |
906 | | way sections are numbered in elf.c! */ |
907 | 0 | for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++) |
908 | 0 | { |
909 | 0 | if (asec->name && strcmp (asec->name, ".text") == 0) |
910 | 0 | { |
911 | 0 | hdr->sh_info = indx; |
912 | 0 | hdr->sh_flags |= SHF_INFO_LINK; |
913 | 0 | break; |
914 | 0 | } |
915 | 0 | } |
916 | | |
917 | | /* The unwind table entries are 16 bytes long, so it is not clear |
918 | | why this field is set to 4. (The ELF spec says that the sh_entsize |
919 | | field is a byte quantity, but this is a processor specific section, |
920 | | so it is allowed to change the rules). Leave as it is for now. */ |
921 | 0 | hdr->sh_entsize = 4; |
922 | 0 | } |
923 | 0 | return true; |
924 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_fake_sections Unexecuted instantiation: elf32-hppa.c:elf_hppa_fake_sections |
925 | | |
926 | | static bool |
927 | | elf_hppa_final_write_processing (bfd *abfd) |
928 | 1 | { |
929 | 1 | int mach = bfd_get_mach (abfd); |
930 | | |
931 | 1 | elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL |
932 | 1 | | EF_PARISC_EXT | EF_PARISC_LSB |
933 | 1 | | EF_PARISC_WIDE | EF_PARISC_NO_KABP |
934 | 1 | | EF_PARISC_LAZYSWAP); |
935 | | |
936 | 1 | if (mach == 10) |
937 | 0 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0; |
938 | 1 | else if (mach == 11) |
939 | 1 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1; |
940 | 0 | else if (mach == 20) |
941 | 0 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0; |
942 | 0 | else if (mach == 25) |
943 | 0 | elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE |
944 | 0 | | EFA_PARISC_2_0 |
945 | | /* The GNU tools have trapped without |
946 | | option since 1993, so need to take |
947 | | a step backwards with the ELF |
948 | | based toolchains. */ |
949 | 0 | | EF_PARISC_TRAPNIL); |
950 | 1 | return _bfd_elf_final_write_processing (abfd); |
951 | 1 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_final_write_processing elf32-hppa.c:elf_hppa_final_write_processing Line | Count | Source | 928 | 1 | { | 929 | 1 | int mach = bfd_get_mach (abfd); | 930 | | | 931 | 1 | elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL | 932 | 1 | | EF_PARISC_EXT | EF_PARISC_LSB | 933 | 1 | | EF_PARISC_WIDE | EF_PARISC_NO_KABP | 934 | 1 | | EF_PARISC_LAZYSWAP); | 935 | | | 936 | 1 | if (mach == 10) | 937 | 0 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0; | 938 | 1 | else if (mach == 11) | 939 | 1 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1; | 940 | 0 | else if (mach == 20) | 941 | 0 | elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0; | 942 | 0 | else if (mach == 25) | 943 | 0 | elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE | 944 | 0 | | EFA_PARISC_2_0 | 945 | | /* The GNU tools have trapped without | 946 | | option since 1993, so need to take | 947 | | a step backwards with the ELF | 948 | | based toolchains. */ | 949 | 0 | | EF_PARISC_TRAPNIL); | 950 | 1 | return _bfd_elf_final_write_processing (abfd); | 951 | 1 | } |
|
952 | | |
953 | | /* Comparison function for qsort to sort unwind section during a |
954 | | final link. */ |
955 | | |
956 | | static int |
957 | | hppa_unwind_entry_compare (const void *a, const void *b) |
958 | 0 | { |
959 | 0 | const bfd_byte *ap, *bp; |
960 | 0 | unsigned long av, bv; |
961 | |
|
962 | 0 | ap = a; |
963 | 0 | av = (unsigned long) ap[0] << 24; |
964 | 0 | av |= (unsigned long) ap[1] << 16; |
965 | 0 | av |= (unsigned long) ap[2] << 8; |
966 | 0 | av |= (unsigned long) ap[3]; |
967 | |
|
968 | 0 | bp = b; |
969 | 0 | bv = (unsigned long) bp[0] << 24; |
970 | 0 | bv |= (unsigned long) bp[1] << 16; |
971 | 0 | bv |= (unsigned long) bp[2] << 8; |
972 | 0 | bv |= (unsigned long) bp[3]; |
973 | |
|
974 | 0 | return av < bv ? -1 : av > bv ? 1 : 0; |
975 | 0 | } Unexecuted instantiation: elf64-hppa.c:hppa_unwind_entry_compare Unexecuted instantiation: elf32-hppa.c:hppa_unwind_entry_compare |
976 | | |
977 | | static bool |
978 | | elf_hppa_sort_unwind (bfd *abfd) |
979 | 0 | { |
980 | 0 | asection *s; |
981 | | |
982 | | /* Magic section names, but this is much safer than having |
983 | | relocate_section remember where SEGREL32 relocs occurred. |
984 | | Consider what happens if someone inept creates a linker script |
985 | | that puts unwind information in .text. */ |
986 | 0 | s = bfd_get_section_by_name (abfd, ".PARISC.unwind"); |
987 | 0 | if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0) |
988 | | |
989 | 0 | { |
990 | 0 | bfd_size_type size; |
991 | 0 | bfd_byte *contents; |
992 | |
|
993 | 0 | if (!bfd_malloc_and_get_section (abfd, s, &contents)) |
994 | 0 | return false; |
995 | | |
996 | 0 | size = s->size; |
997 | 0 | qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare); |
998 | |
|
999 | 0 | if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size)) |
1000 | 0 | return false; |
1001 | 0 | } |
1002 | | |
1003 | 0 | return true; |
1004 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_sort_unwind Unexecuted instantiation: elf32-hppa.c:elf_hppa_sort_unwind |
1005 | | |
1006 | | /* What to do when ld finds relocations against symbols defined in |
1007 | | discarded sections. */ |
1008 | | |
1009 | | static unsigned int |
1010 | | elf_hppa_action_discarded (asection *sec) |
1011 | 0 | { |
1012 | | /* Ignore relocations in .data.rel.ro.local. This section can contain |
1013 | | PLABEL32 relocations to functions in discarded COMDAT groups. */ |
1014 | 0 | if (strcmp (".data.rel.ro.local", sec->name) == 0) |
1015 | 0 | return 0; |
1016 | | |
1017 | 0 | if (strcmp (".PARISC.unwind", sec->name) == 0) |
1018 | 0 | return 0; |
1019 | | |
1020 | 0 | return _bfd_elf_default_action_discarded (sec); |
1021 | 0 | } Unexecuted instantiation: elf64-hppa.c:elf_hppa_action_discarded Unexecuted instantiation: elf32-hppa.c:elf_hppa_action_discarded |