1 /* Common code for PA ELF implementations.
2    Copyright (C) 1999-2024 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 #define ELF_R_TYPE(X)                         ELF64_R_TYPE(X)
31 #define ELF_R_SYM(X)                          ELF64_R_SYM(X)
32 #define elf_hppa_reloc_final_type     elf64_hppa_reloc_final_type
33 #define _bfd_elf_hppa_gen_reloc_type  _bfd_elf64_hppa_gen_reloc_type
34 #define elf_hppa_relocate_section     elf64_hppa_relocate_section
35 #define elf_hppa_final_link         elf64_hppa_final_link
36 #endif
37 #if ARCH_SIZE == 32
38 #define ELF_R_TYPE(X)                         ELF32_R_TYPE(X)
39 #define ELF_R_SYM(X)                          ELF32_R_SYM(X)
40 #define elf_hppa_reloc_final_type     elf32_hppa_reloc_final_type
41 #define _bfd_elf_hppa_gen_reloc_type  _bfd_elf32_hppa_gen_reloc_type
42 #define elf_hppa_relocate_section     elf32_hppa_relocate_section
43 #define elf_hppa_final_link         elf32_hppa_final_link
44 #endif
45 
46 /* 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 #define OFFSET_14R_FROM_21L 4
336 #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
elf_hppa_reloc_final_type(bfd * abfd,elf_hppa_reloc_type base_type,int format,unsigned int field)342 elf_hppa_reloc_final_type (bfd *abfd,
343                                  elf_hppa_reloc_type base_type,
344                                  int format,
345                                  unsigned int field)
346 {
347   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   switch (base_type)
353     {
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     case R_PARISC_DIR32:
358     case R_PARISC_DIR64:
359     case R_HPPA_ABS_CALL:
360       switch (format)
361           {
362           case 14:
363             switch (field)
364               {
365               case e_fsel:
366                 final_type = R_PARISC_DIR14F;
367                 break;
368               case e_rsel:
369               case e_rrsel:
370               case e_rdsel:
371                 final_type = R_PARISC_DIR14R;
372                 break;
373               case e_rtsel:
374                 final_type = R_PARISC_DLTIND14R;
375                 break;
376               case e_rtpsel:
377                 final_type = R_PARISC_LTOFF_FPTR14DR;
378                 break;
379               case e_tsel:
380                 final_type = R_PARISC_DLTIND14F;
381                 break;
382               case e_rpsel:
383                 final_type = R_PARISC_PLABEL14R;
384                 break;
385               default:
386                 return R_PARISC_NONE;
387               }
388             break;
389 
390           case 17:
391             switch (field)
392               {
393               case e_fsel:
394                 final_type = R_PARISC_DIR17F;
395                 break;
396               case e_rsel:
397               case e_rrsel:
398               case e_rdsel:
399                 final_type = R_PARISC_DIR17R;
400                 break;
401               default:
402                 return R_PARISC_NONE;
403               }
404             break;
405 
406           case 21:
407             switch (field)
408               {
409               case e_lsel:
410               case e_lrsel:
411               case e_ldsel:
412               case e_nlsel:
413               case e_nlrsel:
414                 final_type = R_PARISC_DIR21L;
415                 break;
416               case e_ltsel:
417                 final_type = R_PARISC_DLTIND21L;
418                 break;
419               case e_ltpsel:
420                 final_type = R_PARISC_LTOFF_FPTR21L;
421                 break;
422               case e_lpsel:
423                 final_type = R_PARISC_PLABEL21L;
424                 break;
425               default:
426                 return R_PARISC_NONE;
427               }
428             break;
429 
430           case 32:
431             switch (field)
432               {
433               case e_fsel:
434                 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                 if (bfd_arch_bits_per_address (abfd) != 32)
439                     final_type = R_PARISC_SECREL32;
440                 break;
441               case e_psel:
442                 final_type = R_PARISC_PLABEL32;
443                 break;
444               default:
445                 return R_PARISC_NONE;
446               }
447             break;
448 
449           case 64:
450             switch (field)
451               {
452               case e_fsel:
453                 final_type = R_PARISC_DIR64;
454                 break;
455               case e_psel:
456                 final_type = R_PARISC_FPTR64;
457                 break;
458               default:
459                 return R_PARISC_NONE;
460               }
461             break;
462 
463           default:
464             return R_PARISC_NONE;
465           }
466       break;
467 
468     case R_HPPA_GOTOFF:
469       switch (format)
470           {
471           case 14:
472             switch (field)
473               {
474               case e_rsel:
475               case e_rrsel:
476               case e_rdsel:
477                 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32.  */
478                 final_type = base_type + OFFSET_14R_FROM_21L;
479                 break;
480               case e_fsel:
481                 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32.  */
482                 final_type = base_type + OFFSET_14F_FROM_21L;
483                 break;
484               default:
485                 return R_PARISC_NONE;
486               }
487             break;
488 
489           case 21:
490             switch (field)
491               {
492               case e_lsel:
493               case e_lrsel:
494               case e_ldsel:
495               case e_nlsel:
496               case e_nlrsel:
497                 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32.  */
498                 final_type = base_type;
499                 break;
500               default:
501                 return R_PARISC_NONE;
502               }
503             break;
504 
505           case 64:
506             switch (field)
507               {
508               case e_fsel:
509                 final_type = R_PARISC_GPREL64;
510                 break;
511               default:
512                 return R_PARISC_NONE;
513               }
514             break;
515 
516           default:
517             return R_PARISC_NONE;
518           }
519       break;
520 
521     case R_HPPA_PCREL_CALL:
522       switch (format)
523           {
524           case 12:
525             switch (field)
526               {
527               case e_fsel:
528                 final_type = R_PARISC_PCREL12F;
529                 break;
530               default:
531                 return R_PARISC_NONE;
532               }
533             break;
534 
535           case 14:
536             /* Contrary to appearances, these are not calls of any sort.
537                Rather, they are loads/stores with a pcrel reloc.  */
538             switch (field)
539               {
540               case e_rsel:
541               case e_rrsel:
542               case e_rdsel:
543                 final_type = R_PARISC_PCREL14R;
544                 break;
545               case e_fsel:
546                 if (bfd_get_mach (abfd) < 25)
547                     final_type = R_PARISC_PCREL14F;
548                 else
549                     final_type = R_PARISC_PCREL16F;
550                 break;
551               default:
552                 return R_PARISC_NONE;
553               }
554             break;
555 
556           case 17:
557             switch (field)
558               {
559               case e_rsel:
560               case e_rrsel:
561               case e_rdsel:
562                 final_type = R_PARISC_PCREL17R;
563                 break;
564               case e_fsel:
565                 final_type = R_PARISC_PCREL17F;
566                 break;
567               default:
568                 return R_PARISC_NONE;
569               }
570             break;
571 
572           case 21:
573             switch (field)
574               {
575               case e_lsel:
576               case e_lrsel:
577               case e_ldsel:
578               case e_nlsel:
579               case e_nlrsel:
580                 final_type = R_PARISC_PCREL21L;
581                 break;
582               default:
583                 return R_PARISC_NONE;
584               }
585             break;
586 
587           case 22:
588             switch (field)
589               {
590               case e_fsel:
591                 final_type = R_PARISC_PCREL22F;
592                 break;
593               default:
594                 return R_PARISC_NONE;
595               }
596             break;
597 
598           case 32:
599             switch (field)
600               {
601               case e_fsel:
602                 final_type = R_PARISC_PCREL32;
603                 break;
604               default:
605                 return R_PARISC_NONE;
606               }
607             break;
608 
609           case 64:
610             switch (field)
611               {
612               case e_fsel:
613                 final_type = R_PARISC_PCREL64;
614                 break;
615               default:
616                 return R_PARISC_NONE;
617               }
618             break;
619 
620           default:
621             return R_PARISC_NONE;
622           }
623       break;
624 
625     case R_PARISC_TLS_GD21L:
626       switch (field)
627           {
628             case e_ltsel:
629             case e_lrsel:
630               final_type = R_PARISC_TLS_GD21L;
631               break;
632             case e_rtsel:
633             case e_rrsel:
634               final_type = R_PARISC_TLS_GD14R;
635               break;
636             default:
637               return R_PARISC_NONE;
638           }
639       break;
640 
641     case R_PARISC_TLS_LDM21L:
642       switch (field)
643           {
644             case e_ltsel:
645             case e_lrsel:
646               final_type = R_PARISC_TLS_LDM21L;
647               break;
648             case e_rtsel:
649             case e_rrsel:
650               final_type = R_PARISC_TLS_LDM14R;
651               break;
652             default:
653               return R_PARISC_NONE;
654           }
655       break;
656 
657     case R_PARISC_TLS_LDO21L:
658       switch (field)
659           {
660             case e_lrsel:
661               final_type = R_PARISC_TLS_LDO21L;
662               break;
663             case e_rrsel:
664               final_type = R_PARISC_TLS_LDO14R;
665               break;
666             default:
667               return R_PARISC_NONE;
668           }
669       break;
670 
671     case R_PARISC_TLS_IE21L:
672       switch (field)
673           {
674             case e_ltsel:
675             case e_lrsel:
676               final_type = R_PARISC_TLS_IE21L;
677               break;
678             case e_rtsel:
679             case e_rrsel:
680               final_type = R_PARISC_TLS_IE14R;
681               break;
682             default:
683               return R_PARISC_NONE;
684           }
685       break;
686 
687     case R_PARISC_TLS_LE21L:
688       switch (field)
689           {
690             case e_lrsel:
691               final_type = R_PARISC_TLS_LE21L;
692               break;
693             case e_rrsel:
694               final_type = R_PARISC_TLS_LE14R;
695               break;
696             default:
697               return R_PARISC_NONE;
698           }
699       break;
700 
701     case R_PARISC_SEGREL32:
702       switch (format)
703           {
704           case 32:
705             switch (field)
706               {
707               case e_fsel:
708                 final_type = R_PARISC_SEGREL32;
709                 break;
710               default:
711                 return R_PARISC_NONE;
712               }
713             break;
714 
715           case 64:
716             switch (field)
717               {
718               case e_fsel:
719                 final_type = R_PARISC_SEGREL64;
720                 break;
721               default:
722                 return R_PARISC_NONE;
723               }
724             break;
725 
726           default:
727             return R_PARISC_NONE;
728           }
729       break;
730 
731     case R_PARISC_GNU_VTENTRY:
732     case R_PARISC_GNU_VTINHERIT:
733     case R_PARISC_SEGBASE:
734       /* The defaults are fine for these cases.  */
735       break;
736 
737     default:
738       return R_PARISC_NONE;
739     }
740 
741   return final_type;
742 }
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 **
_bfd_elf_hppa_gen_reloc_type(bfd * abfd,elf_hppa_reloc_type base_type,int format,unsigned int field,int ignore ATTRIBUTE_UNUSED,asymbol * sym ATTRIBUTE_UNUSED)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 {
755   elf_hppa_reloc_type *finaltype;
756   elf_hppa_reloc_type **final_types;
757   size_t amt = sizeof (elf_hppa_reloc_type *) * 2;
758 
759   /* Allocate slots for the BFD relocation.  */
760   final_types = bfd_alloc (abfd, amt);
761   if (final_types == NULL)
762     return NULL;
763 
764   /* Allocate space for the relocation itself.  */
765   amt = sizeof (elf_hppa_reloc_type);
766   finaltype = bfd_alloc (abfd, amt);
767   if (finaltype == NULL)
768     return NULL;
769 
770   /* Some reasonable defaults.  */
771   final_types[0] = finaltype;
772   final_types[1] = NULL;
773 
774   *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
775 
776   return final_types;
777 }
778 
779 /* Translate from an elf into field into a howto relocation pointer.  */
780 
781 static bool
elf_hppa_info_to_howto(bfd * abfd,arelent * bfd_reloc,Elf_Internal_Rela * elf_reloc)782 elf_hppa_info_to_howto (bfd *abfd,
783                               arelent *bfd_reloc,
784                               Elf_Internal_Rela *elf_reloc)
785 {
786   unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
787   unsigned int type = r_type;
788   reloc_howto_type *howto = NULL;
789 
790   if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
791     {
792       howto = &elf_hppa_howto_table[r_type];
793       type = howto->type;
794     }
795   if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
796     {
797       /* xgettext:c-format */
798       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
799                                 abfd, r_type);
800       bfd_set_error (bfd_error_bad_value);
801       return false;
802     }
803   bfd_reloc->howto = howto;
804   return true;
805 }
806 
807 /* Translate from an elf into field into a howto relocation pointer.  */
808 
809 static bool
elf_hppa_info_to_howto_rel(bfd * abfd,arelent * bfd_reloc,Elf_Internal_Rela * elf_reloc)810 elf_hppa_info_to_howto_rel (bfd *abfd,
811                                   arelent *bfd_reloc,
812                                   Elf_Internal_Rela *elf_reloc)
813 {
814   unsigned int r_type = ELF_R_TYPE (elf_reloc->r_info);
815   unsigned int type = r_type;
816   reloc_howto_type *howto = NULL;
817 
818   if (r_type < (unsigned int) R_PARISC_UNIMPLEMENTED)
819     {
820       howto = &elf_hppa_howto_table[r_type];
821       type = howto->type;
822     }
823   if (type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
824     {
825       /* xgettext:c-format */
826       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
827                                 abfd, r_type);
828       bfd_set_error (bfd_error_bad_value);
829       return false;
830     }
831   bfd_reloc->howto = howto;
832   return true;
833 }
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 *
elf_hppa_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)839 elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
840                                   bfd_reloc_code_real_type code)
841 {
842   if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
843     {
844       BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
845       return &elf_hppa_howto_table[(int) code];
846     }
847   return NULL;
848 }
849 
850 static reloc_howto_type *
elf_hppa_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)851 elf_hppa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
852                                   const char *r_name)
853 {
854   unsigned int i;
855 
856   for (i = 0;
857        i < sizeof (elf_hppa_howto_table) / sizeof (elf_hppa_howto_table[0]);
858        i++)
859     if (elf_hppa_howto_table[i].name != NULL
860           && strcasecmp (elf_hppa_howto_table[i].name, r_name) == 0)
861       return &elf_hppa_howto_table[i];
862 
863   return NULL;
864 }
865 
866 /* Return TRUE if SYM represents a local label symbol.  */
867 
868 static bool
elf_hppa_is_local_label_name(bfd * abfd ATTRIBUTE_UNUSED,const char * name)869 elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
870 {
871   if (name[0] == 'L' && name[1] == '$')
872     return true;
873   return _bfd_elf_is_local_label_name (abfd, name);
874 }
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
elf_hppa_fake_sections(bfd * abfd,Elf_Internal_Shdr * hdr,asection * sec)880 elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
881 {
882   const char *name;
883 
884   name = bfd_section_name (sec);
885 
886   if (strcmp (name, ".PARISC.unwind") == 0)
887     {
888       int indx;
889       asection *asec;
890 
891 #if ARCH_SIZE == 64
892       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       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       for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
908           {
909             if (asec->name && strcmp (asec->name, ".text") == 0)
910               {
911                 hdr->sh_info = indx;
912                 hdr->sh_flags |= SHF_INFO_LINK;
913                 break;
914               }
915           }
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       hdr->sh_entsize = 4;
922     }
923   return true;
924 }
925 
926 static bool
elf_hppa_final_write_processing(bfd * abfd)927 elf_hppa_final_write_processing (bfd *abfd)
928 {
929   int mach = bfd_get_mach (abfd);
930 
931   elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
932                                              | EF_PARISC_EXT | EF_PARISC_LSB
933                                              | EF_PARISC_WIDE | EF_PARISC_NO_KABP
934                                              | EF_PARISC_LAZYSWAP);
935 
936   if (mach == 10)
937     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
938   else if (mach == 11)
939     elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
940   else if (mach == 20)
941     elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
942   else if (mach == 25)
943     elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
944                                               | 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                                               | EF_PARISC_TRAPNIL);
950   return _bfd_elf_final_write_processing (abfd);
951 }
952 
953 /* Comparison function for qsort to sort unwind section during a
954    final link.  */
955 
956 static int
hppa_unwind_entry_compare(const void * a,const void * b)957 hppa_unwind_entry_compare (const void *a, const void *b)
958 {
959   const bfd_byte *ap, *bp;
960   unsigned long av, bv;
961 
962   ap = a;
963   av = (unsigned long) ap[0] << 24;
964   av |= (unsigned long) ap[1] << 16;
965   av |= (unsigned long) ap[2] << 8;
966   av |= (unsigned long) ap[3];
967 
968   bp = b;
969   bv = (unsigned long) bp[0] << 24;
970   bv |= (unsigned long) bp[1] << 16;
971   bv |= (unsigned long) bp[2] << 8;
972   bv |= (unsigned long) bp[3];
973 
974   return av < bv ? -1 : av > bv ? 1 : 0;
975 }
976 
977 static bool
elf_hppa_sort_unwind(bfd * abfd)978 elf_hppa_sort_unwind (bfd *abfd)
979 {
980   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   s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
987   if (s != NULL && (s->flags & SEC_HAS_CONTENTS) != 0)
988 
989     {
990       bfd_size_type size;
991       bfd_byte *contents;
992 
993       if (!bfd_malloc_and_get_section (abfd, s, &contents))
994           return false;
995 
996       size = s->size;
997       qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
998 
999       if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
1000           return false;
1001     }
1002 
1003   return true;
1004 }
1005 
1006 /* What to do when ld finds relocations against symbols defined in
1007    discarded sections.  */
1008 
1009 static unsigned int
elf_hppa_action_discarded(asection * sec)1010 elf_hppa_action_discarded (asection *sec)
1011 {
1012   /* Ignore relocations in .data.rel.ro.local.  This section can contain
1013      PLABEL32 relocations to functions in discarded COMDAT groups.  */
1014   if (strcmp (".data.rel.ro.local", sec->name) == 0)
1015     return 0;
1016 
1017   if (strcmp (".PARISC.unwind", sec->name) == 0)
1018     return 0;
1019 
1020   return _bfd_elf_default_action_discarded (sec);
1021 }
1022