* cris.h (R_CRIS_32_TPREL): Correct comment.
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
CommitLineData
9e103c9c 1/* Common code for PA ELF implementations.
4fbb74a6 2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
555cd476 3 Free Software Foundation, Inc.
9e103c9c 4
9b52905e 5 This file is part of BFD, the Binary File Descriptor library.
9e103c9c 6
9b52905e
NC
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
9b52905e 10 (at your option) any later version.
9e103c9c 11
9b52905e
NC
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.
9e103c9c 16
9b52905e
NC
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
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
9e103c9c
JL
21
22#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
23
2eb429af
JL
24/* This file is included by multiple PA ELF BFD backends with different
25 sizes.
26
27 Most of the routines are written to be size independent, but sometimes
28 external constraints require 32 or 64 bit specific code. We remap
29 the definitions/functions as necessary here. */
9e103c9c 30#if ARCH_SIZE == 64
9b52905e
NC
31#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
32#define ELF_R_SYM(X) ELF64_R_SYM(X)
33#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
34#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
35#define elf_hppa_relocate_section elf64_hppa_relocate_section
36#define elf_hppa_final_link elf64_hppa_final_link
9e103c9c
JL
37#endif
38#if ARCH_SIZE == 32
9b52905e
NC
39#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
40#define ELF_R_SYM(X) ELF32_R_SYM(X)
41#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
42#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
43#define elf_hppa_relocate_section elf32_hppa_relocate_section
44#define elf_hppa_final_link elf32_hppa_final_link
3f9b03b5
AM
45#endif
46
9e103c9c
JL
47/* ELF/PA relocation howto entries. */
48
49static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
50{
b34976b6
AM
51 { R_PARISC_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
52 bfd_elf_generic_reloc, "R_PARISC_NONE", FALSE, 0, 0, FALSE },
9e103c9c
JL
53
54 /* The values in DIR32 are to placate the check in
55 _bfd_stab_section_find_nearest_line. */
b34976b6
AM
56 { R_PARISC_DIR32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
57 bfd_elf_generic_reloc, "R_PARISC_DIR32", FALSE, 0, 0xffffffff, FALSE },
ab96bf03 58 { R_PARISC_DIR21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6 59 bfd_elf_generic_reloc, "R_PARISC_DIR21L", FALSE, 0, 0, FALSE },
ab96bf03 60 { R_PARISC_DIR17R, 0, 2, 17, FALSE, 0, complain_overflow_bitfield,
b34976b6 61 bfd_elf_generic_reloc, "R_PARISC_DIR17R", FALSE, 0, 0, FALSE },
ab96bf03 62 { R_PARISC_DIR17F, 0, 2, 17, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
63 bfd_elf_generic_reloc, "R_PARISC_DIR17F", FALSE, 0, 0, FALSE },
64 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
65 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 66 { R_PARISC_DIR14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 67 bfd_elf_generic_reloc, "R_PARISC_DIR14R", FALSE, 0, 0, FALSE },
ab96bf03 68 { R_PARISC_DIR14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 69 bfd_elf_generic_reloc, "R_PARISC_DIR14F", FALSE, 0, 0, FALSE },
49bd834c 70 /* 8 */
ab96bf03 71 { R_PARISC_PCREL12F, 0, 2, 12, TRUE, 0, complain_overflow_bitfield,
b34976b6 72 bfd_elf_generic_reloc, "R_PARISC_PCREL12F", FALSE, 0, 0, FALSE },
ab96bf03 73 { R_PARISC_PCREL32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
b34976b6 74 bfd_elf_generic_reloc, "R_PARISC_PCREL32", FALSE, 0, 0, FALSE },
ab96bf03 75 { R_PARISC_PCREL21L, 0, 2, 21, TRUE, 0, complain_overflow_bitfield,
b34976b6 76 bfd_elf_generic_reloc, "R_PARISC_PCREL21L", FALSE, 0, 0, FALSE },
ab96bf03 77 { R_PARISC_PCREL17R, 0, 2, 17, TRUE, 0, complain_overflow_bitfield,
b34976b6 78 bfd_elf_generic_reloc, "R_PARISC_PCREL17R", FALSE, 0, 0, FALSE },
ab96bf03 79 { R_PARISC_PCREL17F, 0, 2, 17, TRUE, 0, complain_overflow_bitfield,
b34976b6 80 bfd_elf_generic_reloc, "R_PARISC_PCREL17F", FALSE, 0, 0, FALSE },
ab96bf03 81 { R_PARISC_PCREL17C, 0, 2, 17, TRUE, 0, complain_overflow_bitfield,
b34976b6 82 bfd_elf_generic_reloc, "R_PARISC_PCREL17C", FALSE, 0, 0, FALSE },
ab96bf03 83 { R_PARISC_PCREL14R, 0, 2, 14, TRUE, 0, complain_overflow_bitfield,
b34976b6 84 bfd_elf_generic_reloc, "R_PARISC_PCREL14R", FALSE, 0, 0, FALSE },
ab96bf03 85 { R_PARISC_PCREL14F, 0, 2, 14, TRUE, 0, complain_overflow_bitfield,
b34976b6 86 bfd_elf_generic_reloc, "R_PARISC_PCREL14F", FALSE, 0, 0, FALSE },
49bd834c 87 /* 16 */
b34976b6
AM
88 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
89 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
90 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 92 { R_PARISC_DPREL21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6 93 bfd_elf_generic_reloc, "R_PARISC_DPREL21L", FALSE, 0, 0, FALSE },
ab96bf03 94 { R_PARISC_DPREL14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 95 bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", FALSE, 0, 0, FALSE },
ab96bf03 96 { R_PARISC_DPREL14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
97 bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", FALSE, 0, 0, FALSE },
98 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
99 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 100 { R_PARISC_DPREL14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 101 bfd_elf_generic_reloc, "R_PARISC_DPREL14R", FALSE, 0, 0, FALSE },
ab96bf03 102 { R_PARISC_DPREL14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 103 bfd_elf_generic_reloc, "R_PARISC_DPREL14F", FALSE, 0, 0, FALSE },
49bd834c 104 /* 24 */
b34976b6
AM
105 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", 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 },
ab96bf03 109 { R_PARISC_DLTREL21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
110 bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", FALSE, 0, 0, FALSE },
111 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
113 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
114 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
115 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
116 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 117 { R_PARISC_DLTREL14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 118 bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", FALSE, 0, 0, FALSE },
ab96bf03 119 { R_PARISC_DLTREL14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 120 bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", FALSE, 0, 0, FALSE },
49bd834c 121 /* 32 */
b34976b6
AM
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 },
ab96bf03 126 { R_PARISC_DLTIND21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
127 bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", FALSE, 0, 0, FALSE },
128 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
129 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
130 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
131 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
132 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
133 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 134 { R_PARISC_DLTIND14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 135 bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", FALSE, 0, 0, FALSE },
ab96bf03 136 { R_PARISC_DLTIND14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 137 bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", FALSE, 0, 0, FALSE },
49bd834c 138 /* 40 */
b34976b6
AM
139 { R_PARISC_SETBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
140 bfd_elf_generic_reloc, "R_PARISC_SETBASE", FALSE, 0, 0, FALSE },
ab96bf03
AM
141 { R_PARISC_SECREL32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
142 bfd_elf_generic_reloc, "R_PARISC_SECREL32", FALSE, 0, 0xffffffff, FALSE },
143 { R_PARISC_BASEREL21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6 144 bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", FALSE, 0, 0, FALSE },
ab96bf03 145 { R_PARISC_BASEREL17R, 0, 2, 17, FALSE, 0, complain_overflow_bitfield,
b34976b6 146 bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", FALSE, 0, 0, FALSE },
ab96bf03 147 { R_PARISC_BASEREL17F, 0, 2, 17, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
148 bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", FALSE, 0, 0, FALSE },
149 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
150 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 151 { R_PARISC_BASEREL14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 152 bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", FALSE, 0, 0, FALSE },
ab96bf03 153 { R_PARISC_BASEREL14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 154 bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", FALSE, 0, 0, FALSE },
49bd834c 155 /* 48 */
b34976b6
AM
156 { R_PARISC_SEGBASE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
157 bfd_elf_generic_reloc, "R_PARISC_SEGBASE", FALSE, 0, 0, FALSE },
ab96bf03 158 { R_PARISC_SEGREL32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
b34976b6 159 bfd_elf_generic_reloc, "R_PARISC_SEGREL32", FALSE, 0, 0, FALSE },
ab96bf03 160 { R_PARISC_PLTOFF21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
161 bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", FALSE, 0, 0, FALSE },
162 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
163 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
164 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
165 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
166 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
167 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 168 { R_PARISC_PLTOFF14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 169 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", FALSE, 0, 0, FALSE },
ab96bf03 170 { R_PARISC_PLTOFF14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 171 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", FALSE, 0, 0, FALSE },
49bd834c 172 /* 56 */
b34976b6
AM
173 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
174 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 175 { R_PARISC_LTOFF_FPTR32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
b34976b6 176 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", FALSE, 0, 0, FALSE },
ab96bf03 177 { R_PARISC_LTOFF_FPTR21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
178 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", FALSE, 0, 0, FALSE },
179 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
180 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
181 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
182 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
183 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
184 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 185 { R_PARISC_LTOFF_FPTR14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
186 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", FALSE, 0, 0, FALSE },
187 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
188 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 189 /* 64 */
ab96bf03 190 { R_PARISC_FPTR64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6 191 bfd_elf_generic_reloc, "R_PARISC_FPTR64", FALSE, 0, 0, FALSE },
ab96bf03 192 { R_PARISC_PLABEL32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
b34976b6 193 bfd_elf_generic_reloc, "R_PARISC_PLABEL32", FALSE, 0, 0, FALSE },
ab96bf03 194 { R_PARISC_PLABEL21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
195 bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", 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 },
198 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
199 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
200 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
201 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 202 { R_PARISC_PLABEL14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
203 bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", FALSE, 0, 0, FALSE },
204 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
205 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 206 /* 72 */
ab96bf03 207 { R_PARISC_PCREL64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6 208 bfd_elf_generic_reloc, "R_PARISC_PCREL64", FALSE, 0, 0, FALSE },
ab96bf03 209 { R_PARISC_PCREL22C, 0, 2, 22, FALSE, 0, complain_overflow_bitfield,
b34976b6 210 bfd_elf_generic_reloc, "R_PARISC_PCREL22C", FALSE, 0, 0, FALSE },
ab96bf03 211 { R_PARISC_PCREL22F, 0, 2, 22, FALSE, 0, complain_overflow_bitfield,
b34976b6 212 bfd_elf_generic_reloc, "R_PARISC_PCREL22F", FALSE, 0, 0, FALSE },
ab96bf03 213 { R_PARISC_PCREL14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 214 bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", FALSE, 0, 0, FALSE },
ab96bf03 215 { R_PARISC_PCREL14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 216 bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", FALSE, 0, 0, FALSE },
ab96bf03 217 { R_PARISC_PCREL16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 218 bfd_elf_generic_reloc, "R_PARISC_PCREL16F", FALSE, 0, 0, FALSE },
ab96bf03 219 { R_PARISC_PCREL16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 220 bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", FALSE, 0, 0, FALSE },
ab96bf03 221 { R_PARISC_PCREL16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 222 bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", FALSE, 0, 0, FALSE },
49bd834c 223 /* 80 */
ab96bf03 224 { R_PARISC_DIR64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
225 bfd_elf_generic_reloc, "R_PARISC_DIR64", FALSE, 0, 0, FALSE },
226 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
227 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
228 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
229 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 230 { R_PARISC_DIR14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 231 bfd_elf_generic_reloc, "R_PARISC_DIR14WR", FALSE, 0, 0, FALSE },
ab96bf03 232 { R_PARISC_DIR14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 233 bfd_elf_generic_reloc, "R_PARISC_DIR14DR", FALSE, 0, 0, FALSE },
ab96bf03 234 { R_PARISC_DIR16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 235 bfd_elf_generic_reloc, "R_PARISC_DIR16F", FALSE, 0, 0, FALSE },
ab96bf03 236 { R_PARISC_DIR16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 237 bfd_elf_generic_reloc, "R_PARISC_DIR16WF", FALSE, 0, 0, FALSE },
ab96bf03 238 { R_PARISC_DIR16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 239 bfd_elf_generic_reloc, "R_PARISC_DIR16DF", FALSE, 0, 0, FALSE },
49bd834c 240 /* 88 */
ab96bf03 241 { R_PARISC_GPREL64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
242 bfd_elf_generic_reloc, "R_PARISC_GPREL64", FALSE, 0, 0, FALSE },
243 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
244 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
245 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
246 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 247 { R_PARISC_DLTREL14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 248 bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", FALSE, 0, 0, FALSE },
ab96bf03 249 { R_PARISC_DLTREL14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 250 bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", FALSE, 0, 0, FALSE },
ab96bf03 251 { R_PARISC_GPREL16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 252 bfd_elf_generic_reloc, "R_PARISC_GPREL16F", FALSE, 0, 0, FALSE },
ab96bf03 253 { R_PARISC_GPREL16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 254 bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", FALSE, 0, 0, FALSE },
ab96bf03 255 { R_PARISC_GPREL16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 256 bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", FALSE, 0, 0, FALSE },
49bd834c 257 /* 96 */
ab96bf03 258 { R_PARISC_LTOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
259 bfd_elf_generic_reloc, "R_PARISC_LTOFF64", FALSE, 0, 0, FALSE },
260 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
261 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
262 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
263 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 264 { R_PARISC_DLTIND14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 265 bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", FALSE, 0, 0, FALSE },
ab96bf03 266 { R_PARISC_DLTIND14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 267 bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", FALSE, 0, 0, FALSE },
ab96bf03 268 { R_PARISC_LTOFF16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 269 bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", FALSE, 0, 0, FALSE },
ab96bf03 270 { R_PARISC_LTOFF16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 271 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
ab96bf03 272 { R_PARISC_LTOFF16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 273 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", FALSE, 0, 0, FALSE },
49bd834c 274 /* 104 */
b34976b6
AM
275 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
276 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
277 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
278 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 279 { R_PARISC_BASEREL14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 280 bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", FALSE, 0, 0, FALSE },
ab96bf03 281 { R_PARISC_BASEREL14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
282 bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", FALSE, 0, 0, FALSE },
283 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
284 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
285 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
286 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
287 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
288 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
289 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
290 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 291 /* 112 */
ab96bf03 292 { R_PARISC_SEGREL64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
293 bfd_elf_generic_reloc, "R_PARISC_SEGREL64", 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 },
ab96bf03 298 { R_PARISC_PLTOFF14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 299 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", FALSE, 0, 0, FALSE },
ab96bf03 300 { R_PARISC_PLTOFF14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 301 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", FALSE, 0, 0, FALSE },
ab96bf03 302 { R_PARISC_PLTOFF16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 303 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", FALSE, 0, 0, FALSE },
ab96bf03 304 { R_PARISC_PLTOFF16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 305 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", FALSE, 0, 0, FALSE },
ab96bf03 306 { R_PARISC_PLTOFF16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 307 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", FALSE, 0, 0, FALSE },
49bd834c 308 /* 120 */
ab96bf03 309 { R_PARISC_LTOFF_FPTR64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
310 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
311 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
312 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
313 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
314 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 315 { R_PARISC_LTOFF_FPTR14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 316 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", FALSE, 0, 0, FALSE },
ab96bf03 317 { R_PARISC_LTOFF_FPTR14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 318 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", FALSE, 0, 0, FALSE },
ab96bf03 319 { R_PARISC_LTOFF_FPTR16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 320 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", FALSE, 0, 0, FALSE },
ab96bf03 321 { R_PARISC_LTOFF_FPTR16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 322 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", FALSE, 0, 0, FALSE },
ab96bf03 323 { R_PARISC_LTOFF_FPTR16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 324 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 325 /* 128 */
b34976b6
AM
326 { R_PARISC_COPY, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
327 bfd_elf_generic_reloc, "R_PARISC_COPY", FALSE, 0, 0, FALSE },
328 { R_PARISC_IPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
329 bfd_elf_generic_reloc, "R_PARISC_IPLT", FALSE, 0, 0, FALSE },
330 { R_PARISC_EPLT, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
331 bfd_elf_generic_reloc, "R_PARISC_EPLT", FALSE, 0, 0, FALSE },
332 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
333 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
334 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
335 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
336 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
337 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
338 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
339 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
340 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
341 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 342 /* 136 */
b34976b6
AM
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_dont,
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 },
351 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
352 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
353 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
354 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
355 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
356 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
357 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
358 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 359 /* 144 */
b34976b6
AM
360 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
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_dont,
367 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
368 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
369 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
370 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
371 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
372 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
373 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
374 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
375 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 376 /* 152 */
b34976b6
AM
377 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
378 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 379 { R_PARISC_TPREL32, 0, 2, 32, FALSE, 0, complain_overflow_dont,
b34976b6 380 bfd_elf_generic_reloc, "R_PARISC_TPREL32", FALSE, 0, 0, FALSE },
ab96bf03 381 { R_PARISC_TPREL21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
382 bfd_elf_generic_reloc, "R_PARISC_TPREL21L", 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 },
385 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
386 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
387 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
388 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 389 { R_PARISC_TPREL14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
390 bfd_elf_generic_reloc, "R_PARISC_TPREL14R", FALSE, 0, 0, FALSE },
391 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
392 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 393 /* 160 */
b34976b6
AM
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 },
ab96bf03 398 { R_PARISC_LTOFF_TP21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
399 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", 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 },
402 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
403 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
404 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
405 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 406 { R_PARISC_LTOFF_TP14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
9b52905e 407 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14R", FALSE, 0, 0, FALSE },
ab96bf03 408 { R_PARISC_LTOFF_TP14F, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 409 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", FALSE, 0, 0, FALSE },
49bd834c 410 /* 168 */
b34976b6
AM
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_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
416 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
417 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
418 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
419 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
420 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
421 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
422 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
423 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
424 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
425 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
426 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 427 /* 176 */
b34976b6
AM
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_dont,
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 },
436 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
437 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
438 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
439 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
440 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
441 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
442 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
443 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 444 /* 184 */
b34976b6
AM
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_bitfield,
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 },
453 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
454 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
455 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
456 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
457 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
458 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
459 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
460 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 461 /* 192 */
b34976b6
AM
462 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
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_bitfield,
469 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
470 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
471 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
472 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
473 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
474 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
475 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
476 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
477 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 478 /* 200 */
b34976b6
AM
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_dont,
482 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
483 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
484 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
485 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
486 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
487 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
488 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
489 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
490 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
491 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
492 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
493 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
494 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 495 /* 208 */
b34976b6
AM
496 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
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 },
504 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_dont,
505 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
506 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
507 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
508 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
509 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
510 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
511 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
49bd834c 512 /* 216 */
ab96bf03 513 { R_PARISC_TPREL64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
514 bfd_elf_generic_reloc, "R_PARISC_TPREL64", 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 },
ab96bf03 519 { R_PARISC_TPREL14WR, 0, 2, 14, FALSE, 0, complain_overflow_dont,
b34976b6 520 bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", FALSE, 0, 0, FALSE },
ab96bf03 521 { R_PARISC_TPREL14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 522 bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", FALSE, 0, 0, FALSE },
ab96bf03 523 { R_PARISC_TPREL16F, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 524 bfd_elf_generic_reloc, "R_PARISC_TPREL16F", FALSE, 0, 0, FALSE },
ab96bf03 525 { R_PARISC_TPREL16WF, 0, 2, 16, FALSE, 0, complain_overflow_dont,
b34976b6 526 bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", FALSE, 0, 0, FALSE },
ab96bf03 527 { R_PARISC_TPREL16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 528 bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", FALSE, 0, 0, FALSE },
49bd834c 529 /* 224 */
ab96bf03 530 { R_PARISC_LTOFF_TP64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
b34976b6
AM
531 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", FALSE, 0, 0, FALSE },
532 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
533 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
534 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
535 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", FALSE, 0, 0, FALSE },
ab96bf03 536 { R_PARISC_LTOFF_TP14WR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 537 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", FALSE, 0, 0, FALSE },
ab96bf03 538 { R_PARISC_LTOFF_TP14DR, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
b34976b6 539 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", FALSE, 0, 0, FALSE },
ab96bf03 540 { R_PARISC_LTOFF_TP16F, 0, 2, 16, FALSE, 0, complain_overflow_dont,
b34976b6 541 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", FALSE, 0, 0, FALSE },
ab96bf03 542 { R_PARISC_LTOFF_TP16WF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 543 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", FALSE, 0, 0, FALSE },
ab96bf03 544 { R_PARISC_LTOFF_TP16DF, 0, 2, 16, FALSE, 0, complain_overflow_bitfield,
b34976b6 545 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", FALSE, 0, 0, FALSE },
49bd834c 546 /* 232 */
b34976b6
AM
547 { R_PARISC_GNU_VTENTRY, 0, 0, 0, FALSE, 0, complain_overflow_dont,
548 bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", FALSE, 0, 0, FALSE },
549 { R_PARISC_GNU_VTINHERIT, 0, 0, 0, FALSE, 0, complain_overflow_dont,
550 bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", FALSE, 0, 0, FALSE },
ab96bf03 551 { R_PARISC_TLS_GD21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
9b52905e 552 bfd_elf_generic_reloc, "R_PARISC_TLS_GD21L", FALSE, 0, 0, FALSE },
ab96bf03 553 { R_PARISC_TLS_GD14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
9b52905e
NC
554 bfd_elf_generic_reloc, "R_PARISC_TLS_GD14R", FALSE, 0, 0, FALSE },
555 { R_PARISC_TLS_GDCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
556 bfd_elf_generic_reloc, "R_PARISC_TLS_GDCALL", FALSE, 0, 0, FALSE },
ab96bf03 557 { R_PARISC_TLS_LDM21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
9b52905e 558 bfd_elf_generic_reloc, "R_PARISC_TLS_LDM21L", FALSE, 0, 0, FALSE },
ab96bf03 559 { R_PARISC_TLS_LDM14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
9b52905e
NC
560 bfd_elf_generic_reloc, "R_PARISC_TLS_LDM14R", FALSE, 0, 0, FALSE },
561 { R_PARISC_TLS_LDMCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
562 bfd_elf_generic_reloc, "R_PARISC_TLS_LDMCALL", FALSE, 0, 0, FALSE },
563 /* 240 */
ab96bf03 564 { R_PARISC_TLS_LDO21L, 0, 2, 21, FALSE, 0, complain_overflow_bitfield,
9b52905e 565 bfd_elf_generic_reloc, "R_PARISC_TLS_LDO21L", FALSE, 0, 0, FALSE },
ab96bf03 566 { R_PARISC_TLS_LDO14R, 0, 2, 14, FALSE, 0, complain_overflow_bitfield,
9b52905e 567 bfd_elf_generic_reloc, "R_PARISC_TLS_LDO14R", FALSE, 0, 0, FALSE },
ab96bf03 568 { R_PARISC_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
9b52905e 569 bfd_elf_generic_reloc, "R_PARISC_TLS_DTPMOD32", FALSE, 0, 0, FALSE },
ab96bf03 570 { R_PARISC_TLS_DTPMOD64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
9b52905e 571 bfd_elf_generic_reloc, "R_PARISC_TLS_DTPMOD64", FALSE, 0, 0, FALSE },
ab96bf03 572 { R_PARISC_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
9b52905e 573 bfd_elf_generic_reloc, "R_PARISC_TLS_DTPOFF32", FALSE, 0, 0, FALSE },
ab96bf03 574 { R_PARISC_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
9b52905e 575 bfd_elf_generic_reloc, "R_PARISC_TLS_DTPOFF64", FALSE, 0, 0, FALSE },
9e103c9c
JL
576};
577
6e2bf930
JL
578#define OFFSET_14R_FROM_21L 4
579#define OFFSET_14F_FROM_21L 5
580
189c6563
AM
581/* Return the final relocation type for the given base type, instruction
582 format, and field selector. */
9e103c9c 583
189c6563 584elf_hppa_reloc_type
c39a58e6
AM
585elf_hppa_reloc_final_type (bfd *abfd,
586 elf_hppa_reloc_type base_type,
587 int format,
588 unsigned int field)
9e103c9c 589{
189c6563 590 elf_hppa_reloc_type final_type = base_type;
9e103c9c
JL
591
592 /* Just a tangle of nested switch statements to deal with the braindamage
593 that a different field selector means a completely different relocation
594 for PA ELF. */
595 switch (base_type)
596 {
9b52905e
NC
597 /* We have been using generic relocation types. However, that may not
598 really make sense. Anyway, we need to support both R_PARISC_DIR64
599 and R_PARISC_DIR32 here. */
0d571602
JL
600 case R_PARISC_DIR32:
601 case R_PARISC_DIR64:
9e103c9c
JL
602 case R_HPPA_ABS_CALL:
603 switch (format)
604 {
605 case 14:
606 switch (field)
607 {
47d89dba
AM
608 case e_fsel:
609 final_type = R_PARISC_DIR14F;
610 break;
9e103c9c
JL
611 case e_rsel:
612 case e_rrsel:
47d89dba 613 case e_rdsel:
9e103c9c
JL
614 final_type = R_PARISC_DIR14R;
615 break;
616 case e_rtsel:
f31cedf7 617 final_type = R_PARISC_DLTIND14R;
9e103c9c 618 break;
36860900
JL
619 case e_rtpsel:
620 final_type = R_PARISC_LTOFF_FPTR14DR;
621 break;
9e103c9c 622 case e_tsel:
f31cedf7 623 final_type = R_PARISC_DLTIND14F;
9e103c9c
JL
624 break;
625 case e_rpsel:
626 final_type = R_PARISC_PLABEL14R;
627 break;
628 default:
189c6563 629 return R_PARISC_NONE;
9e103c9c
JL
630 }
631 break;
632
633 case 17:
634 switch (field)
635 {
636 case e_fsel:
637 final_type = R_PARISC_DIR17F;
638 break;
639 case e_rsel:
640 case e_rrsel:
47d89dba 641 case e_rdsel:
9e103c9c
JL
642 final_type = R_PARISC_DIR17R;
643 break;
644 default:
189c6563 645 return R_PARISC_NONE;
9e103c9c
JL
646 }
647 break;
648
649 case 21:
650 switch (field)
651 {
652 case e_lsel:
653 case e_lrsel:
47d89dba 654 case e_ldsel:
edd21aca
AM
655 case e_nlsel:
656 case e_nlrsel:
9e103c9c
JL
657 final_type = R_PARISC_DIR21L;
658 break;
659 case e_ltsel:
f31cedf7 660 final_type = R_PARISC_DLTIND21L;
9e103c9c 661 break;
36860900
JL
662 case e_ltpsel:
663 final_type = R_PARISC_LTOFF_FPTR21L;
664 break;
9e103c9c
JL
665 case e_lpsel:
666 final_type = R_PARISC_PLABEL21L;
667 break;
668 default:
189c6563 669 return R_PARISC_NONE;
9e103c9c
JL
670 }
671 break;
672
673 case 32:
674 switch (field)
675 {
676 case e_fsel:
677 final_type = R_PARISC_DIR32;
432bdd91
JL
678 /* When in 64bit mode, a 32bit relocation is supposed to
679 be a section relative relocation. Dwarf2 (for example)
680 uses 32bit section relative relocations. */
681 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
46fe4e66 682 final_type = R_PARISC_SECREL32;
9e103c9c
JL
683 break;
684 case e_psel:
685 final_type = R_PARISC_PLABEL32;
686 break;
687 default:
189c6563 688 return R_PARISC_NONE;
9e103c9c
JL
689 }
690 break;
691
6e2bf930
JL
692 case 64:
693 switch (field)
694 {
695 case e_fsel:
696 final_type = R_PARISC_DIR64;
697 break;
698 case e_psel:
36860900
JL
699 final_type = R_PARISC_FPTR64;
700 break;
6e2bf930 701 default:
189c6563 702 return R_PARISC_NONE;
6e2bf930
JL
703 }
704 break;
705
9e103c9c 706 default:
189c6563 707 return R_PARISC_NONE;
9e103c9c
JL
708 }
709 break;
710
9e103c9c
JL
711 case R_HPPA_GOTOFF:
712 switch (format)
713 {
714 case 14:
715 switch (field)
716 {
717 case e_rsel:
718 case e_rrsel:
47d89dba 719 case e_rdsel:
9b52905e 720 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32. */
6e2bf930 721 final_type = base_type + OFFSET_14R_FROM_21L;
9e103c9c
JL
722 break;
723 case e_fsel:
9b52905e 724 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32. */
6e2bf930 725 final_type = base_type + OFFSET_14F_FROM_21L;
9e103c9c
JL
726 break;
727 default:
189c6563 728 return R_PARISC_NONE;
9e103c9c
JL
729 }
730 break;
731
732 case 21:
733 switch (field)
734 {
9e103c9c 735 case e_lsel:
edd21aca 736 case e_lrsel:
47d89dba 737 case e_ldsel:
edd21aca
AM
738 case e_nlsel:
739 case e_nlrsel:
9b52905e 740 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32. */
6e2bf930 741 final_type = base_type;
9e103c9c
JL
742 break;
743 default:
189c6563 744 return R_PARISC_NONE;
9e103c9c
JL
745 }
746 break;
747
6bba1048
DA
748 case 64:
749 switch (field)
750 {
751 case e_fsel:
752 final_type = R_PARISC_GPREL64;
753 break;
754 default:
755 return R_PARISC_NONE;
756 }
757 break;
758
9e103c9c 759 default:
189c6563 760 return R_PARISC_NONE;
9e103c9c
JL
761 }
762 break;
763
9e103c9c
JL
764 case R_HPPA_PCREL_CALL:
765 switch (format)
766 {
49bd834c
AM
767 case 12:
768 switch (field)
769 {
770 case e_fsel:
771 final_type = R_PARISC_PCREL12F;
772 break;
773 default:
189c6563 774 return R_PARISC_NONE;
49bd834c
AM
775 }
776 break;
777
9e103c9c 778 case 14:
49bd834c
AM
779 /* Contrary to appearances, these are not calls of any sort.
780 Rather, they are loads/stores with a pcrel reloc. */
9e103c9c
JL
781 switch (field)
782 {
783 case e_rsel:
784 case e_rrsel:
47d89dba 785 case e_rdsel:
9e103c9c
JL
786 final_type = R_PARISC_PCREL14R;
787 break;
788 case e_fsel:
ba94744e
AM
789 if (bfd_get_mach (abfd) < 25)
790 final_type = R_PARISC_PCREL14F;
791 else
792 final_type = R_PARISC_PCREL16F;
9e103c9c
JL
793 break;
794 default:
189c6563 795 return R_PARISC_NONE;
9e103c9c
JL
796 }
797 break;
798
799 case 17:
800 switch (field)
801 {
802 case e_rsel:
803 case e_rrsel:
47d89dba 804 case e_rdsel:
9e103c9c
JL
805 final_type = R_PARISC_PCREL17R;
806 break;
807 case e_fsel:
808 final_type = R_PARISC_PCREL17F;
809 break;
810 default:
189c6563 811 return R_PARISC_NONE;
9e103c9c
JL
812 }
813 break;
814
edd21aca 815 case 21:
341362b5
JL
816 switch (field)
817 {
edd21aca
AM
818 case e_lsel:
819 case e_lrsel:
47d89dba 820 case e_ldsel:
edd21aca
AM
821 case e_nlsel:
822 case e_nlrsel:
823 final_type = R_PARISC_PCREL21L;
341362b5
JL
824 break;
825 default:
189c6563 826 return R_PARISC_NONE;
341362b5
JL
827 }
828 break;
829
edd21aca 830 case 22:
9e103c9c
JL
831 switch (field)
832 {
edd21aca
AM
833 case e_fsel:
834 final_type = R_PARISC_PCREL22F;
9e103c9c
JL
835 break;
836 default:
189c6563 837 return R_PARISC_NONE;
9e103c9c
JL
838 }
839 break;
840
9992270f
DA
841 case 32:
842 switch (field)
843 {
844 case e_fsel:
845 final_type = R_PARISC_PCREL32;
846 break;
847 default:
848 return R_PARISC_NONE;
849 }
850 break;
851
852 case 64:
853 switch (field)
854 {
855 case e_fsel:
856 final_type = R_PARISC_PCREL64;
857 break;
858 default:
859 return R_PARISC_NONE;
860 }
861 break;
862
9e103c9c 863 default:
189c6563 864 return R_PARISC_NONE;
9e103c9c
JL
865 }
866 break;
867
9b52905e
NC
868 case R_PARISC_TLS_GD21L:
869 switch (field)
870 {
871 case e_ltsel:
872 case e_lrsel:
873 final_type = R_PARISC_TLS_GD21L;
874 break;
875 case e_rtsel:
876 case e_rrsel:
877 final_type = R_PARISC_TLS_GD14R;
878 break;
879 default:
880 return R_PARISC_NONE;
881 }
882 break;
883
884 case R_PARISC_TLS_LDM21L:
885 switch (field)
886 {
887 case e_ltsel:
888 case e_lrsel:
889 final_type = R_PARISC_TLS_LDM21L;
890 break;
891 case e_rtsel:
892 case e_rrsel:
893 final_type = R_PARISC_TLS_LDM14R;
894 break;
895 default:
896 return R_PARISC_NONE;
897 }
898 break;
899
900 case R_PARISC_TLS_LDO21L:
901 switch (field)
902 {
903 case e_lrsel:
904 final_type = R_PARISC_TLS_LDO21L;
905 break;
906 case e_rrsel:
907 final_type = R_PARISC_TLS_LDO14R;
908 break;
909 default:
910 return R_PARISC_NONE;
911 }
912 break;
913
914 case R_PARISC_TLS_IE21L:
915 switch (field)
916 {
917 case e_ltsel:
918 case e_lrsel:
919 final_type = R_PARISC_TLS_IE21L;
920 break;
921 case e_rtsel:
922 case e_rrsel:
923 final_type = R_PARISC_TLS_IE14R;
924 break;
925 default:
926 return R_PARISC_NONE;
927 }
928 break;
929
930 case R_PARISC_TLS_LE21L:
931 switch (field)
932 {
933 case e_lrsel:
934 final_type = R_PARISC_TLS_LE21L;
935 break;
936 case e_rrsel:
937 final_type = R_PARISC_TLS_LE14R;
938 break;
939 default:
940 return R_PARISC_NONE;
941 }
942 break;
943
6bba1048
DA
944 case R_PARISC_SEGREL32:
945 switch (format)
946 {
947 case 32:
948 switch (field)
949 {
950 case e_fsel:
951 final_type = R_PARISC_SEGREL32;
952 break;
953 default:
954 return R_PARISC_NONE;
955 }
956 break;
957
958 case 64:
959 switch (field)
960 {
961 case e_fsel:
962 final_type = R_PARISC_SEGREL64;
963 break;
964 default:
965 return R_PARISC_NONE;
966 }
967 break;
968
969 default:
970 return R_PARISC_NONE;
971 }
972 break;
973
49bd834c
AM
974 case R_PARISC_GNU_VTENTRY:
975 case R_PARISC_GNU_VTINHERIT:
fc91f658
JL
976 case R_PARISC_SEGBASE:
977 /* The defaults are fine for these cases. */
978 break;
979
9e103c9c 980 default:
189c6563 981 return R_PARISC_NONE;
9e103c9c
JL
982 }
983
189c6563
AM
984 return final_type;
985}
986
987/* Return one (or more) BFD relocations which implement the base
988 relocation with modifications based on format and field. */
989
990elf_hppa_reloc_type **
c39a58e6
AM
991_bfd_elf_hppa_gen_reloc_type (bfd *abfd,
992 elf_hppa_reloc_type base_type,
993 int format,
994 unsigned int field,
995 int ignore ATTRIBUTE_UNUSED,
996 asymbol *sym ATTRIBUTE_UNUSED)
189c6563
AM
997{
998 elf_hppa_reloc_type *finaltype;
999 elf_hppa_reloc_type **final_types;
1000 bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
1001
1002 /* Allocate slots for the BFD relocation. */
c39a58e6 1003 final_types = bfd_alloc (abfd, amt);
189c6563
AM
1004 if (final_types == NULL)
1005 return NULL;
1006
1007 /* Allocate space for the relocation itself. */
1008 amt = sizeof (elf_hppa_reloc_type);
c39a58e6 1009 finaltype = bfd_alloc (abfd, amt);
189c6563
AM
1010 if (finaltype == NULL)
1011 return NULL;
1012
1013 /* Some reasonable defaults. */
1014 final_types[0] = finaltype;
1015 final_types[1] = NULL;
1016
1017 *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
1018
9e103c9c
JL
1019 return final_types;
1020}
1021
1022/* Translate from an elf into field into a howto relocation pointer. */
1023
1024static void
c39a58e6
AM
1025elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1026 arelent *bfd_reloc,
1027 Elf_Internal_Rela *elf_reloc)
9e103c9c 1028{
c39a58e6 1029 BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
9e103c9c
JL
1030 < (unsigned int) R_PARISC_UNIMPLEMENTED);
1031 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
1032}
1033
1034/* Translate from an elf into field into a howto relocation pointer. */
1035
1036static void
c39a58e6
AM
1037elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
1038 arelent *bfd_reloc,
1039 Elf_Internal_Rela *elf_reloc)
9e103c9c 1040{
9b52905e 1041 BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
9e103c9c
JL
1042 < (unsigned int) R_PARISC_UNIMPLEMENTED);
1043 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
1044}
1045
1046/* Return the address of the howto table entry to perform the CODE
1047 relocation for an ARCH machine. */
1048
1049static reloc_howto_type *
c39a58e6
AM
1050elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1051 bfd_reloc_code_real_type code)
9e103c9c
JL
1052{
1053 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
1054 {
1055 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1056 return &elf_hppa_howto_table[(int) code];
1057 }
1058 return NULL;
1059}
95cbae0b 1060
157090f7
AM
1061static reloc_howto_type *
1062elf_hppa_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1063 const char *r_name)
1064{
1065 unsigned int i;
1066
1067 for (i = 0;
1068 i < sizeof (elf_hppa_howto_table) / sizeof (elf_hppa_howto_table[0]);
1069 i++)
1070 if (elf_hppa_howto_table[i].name != NULL
1071 && strcasecmp (elf_hppa_howto_table[i].name, r_name) == 0)
1072 return &elf_hppa_howto_table[i];
1073
1074 return NULL;
1075}
1076
b34976b6 1077/* Return TRUE if SYM represents a local label symbol. */
432bdd91 1078
b34976b6 1079static bfd_boolean
c39a58e6 1080elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
432bdd91 1081{
49bd834c 1082 if (name[0] == 'L' && name[1] == '$')
9b52905e 1083 return TRUE;
49bd834c 1084 return _bfd_elf_is_local_label_name (abfd, name);
432bdd91
JL
1085}
1086
052e120f
JL
1087/* Set the correct type for an ELF section. We do this by the
1088 section name, which is a hack, but ought to work. */
1089
b34976b6 1090static bfd_boolean
c39a58e6 1091elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
052e120f 1092{
c39a58e6 1093 const char *name;
052e120f
JL
1094
1095 name = bfd_get_section_name (abfd, sec);
1096
1097 if (strcmp (name, ".PARISC.unwind") == 0)
1098 {
1ca74062 1099 int indx;
edd21aca 1100 asection *asec;
9b52905e 1101
3f9b03b5 1102#if ARCH_SIZE == 64
052e120f 1103 hdr->sh_type = SHT_LOPROC + 1;
3f9b03b5
AM
1104#else
1105 hdr->sh_type = 1;
1106#endif
052e120f
JL
1107 /* ?!? How are unwinds supposed to work for symbols in arbitrary
1108 sections? Or what if we have multiple .text sections in a single
be7582f3 1109 .o file? HP really messed up on this one.
052e120f 1110
1ca74062
JL
1111 Ugh. We can not use elf_section_data (sec)->this_idx at this
1112 point because it is not initialized yet.
1113
1114 So we (gasp) recompute it here. Hopefully nobody ever changes the
1115 way sections are numbered in elf.c! */
edd21aca 1116 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++)
1ca74062 1117 {
edd21aca 1118 if (asec->name && strcmp (asec->name, ".text") == 0)
1ca74062
JL
1119 {
1120 hdr->sh_info = indx;
1121 break;
1122 }
1123 }
be7582f3 1124
052e120f
JL
1125 /* I have no idea if this is really necessary or what it means. */
1126 hdr->sh_entsize = 4;
1127 }
b34976b6 1128 return TRUE;
052e120f
JL
1129}
1130
3f9b03b5 1131static void
c39a58e6
AM
1132elf_hppa_final_write_processing (bfd *abfd,
1133 bfd_boolean linker ATTRIBUTE_UNUSED)
3f9b03b5
AM
1134{
1135 int mach = bfd_get_mach (abfd);
1136
1137 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
1138 | EF_PARISC_EXT | EF_PARISC_LSB
1139 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
1140 | EF_PARISC_LAZYSWAP);
1141
1142 if (mach == 10)
1143 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
1144 else if (mach == 11)
1145 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
1146 else if (mach == 20)
1147 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
1148 else if (mach == 25)
1149 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE
1150 | EFA_PARISC_2_0
1151 /* The GNU tools have trapped without
1152 option since 1993, so need to take
1153 a step backwards with the ELF
1154 based toolchains. */
1155 | EF_PARISC_TRAPNIL);
1156}
1157
46fe4e66
AM
1158/* Comparison function for qsort to sort unwind section during a
1159 final link. */
1160
1161static int
c39a58e6 1162hppa_unwind_entry_compare (const void *a, const void *b)
46fe4e66
AM
1163{
1164 const bfd_byte *ap, *bp;
1165 unsigned long av, bv;
1166
c39a58e6 1167 ap = a;
46fe4e66
AM
1168 av = (unsigned long) ap[0] << 24;
1169 av |= (unsigned long) ap[1] << 16;
1170 av |= (unsigned long) ap[2] << 8;
1171 av |= (unsigned long) ap[3];
1172
c39a58e6 1173 bp = b;
46fe4e66
AM
1174 bv = (unsigned long) bp[0] << 24;
1175 bv |= (unsigned long) bp[1] << 16;
1176 bv |= (unsigned long) bp[2] << 8;
1177 bv |= (unsigned long) bp[3];
1178
1179 return av < bv ? -1 : av > bv ? 1 : 0;
1180}
1181
9b52905e
NC
1182static bfd_boolean
1183elf_hppa_sort_unwind (bfd *abfd)
46fe4e66
AM
1184{
1185 asection *s;
1186
1187 /* Magic section names, but this is much safer than having
1188 relocate_section remember where SEGREL32 relocs occurred.
1189 Consider what happens if someone inept creates a linker script
1190 that puts unwind information in .text. */
1191 s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
1192 if (s != NULL)
1193 {
1194 bfd_size_type size;
eea6121a 1195 bfd_byte *contents;
46fe4e66 1196
eea6121a 1197 if (!bfd_malloc_and_get_section (abfd, s, &contents))
b34976b6 1198 return FALSE;
46fe4e66 1199
eea6121a 1200 size = s->size;
46fe4e66
AM
1201 qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
1202
1203 if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
b34976b6 1204 return FALSE;
46fe4e66
AM
1205 }
1206
b34976b6 1207 return TRUE;
46fe4e66
AM
1208}
1209
8a696751
AM
1210/* What to do when ld finds relocations against symbols defined in
1211 discarded sections. */
1212
1213static unsigned int
1214elf_hppa_action_discarded (asection *sec)
1215{
1216 if (strcmp (".PARISC.unwind", sec->name) == 0)
1217 return 0;
1218
1219 return _bfd_elf_default_action_discarded (sec);
1220}
1221
49bd834c 1222#if ARCH_SIZE == 64
2eb429af
JL
1223/* Hook called by the linker routine which adds symbols from an object
1224 file. HP's libraries define symbols with HP specific section
1225 indices, which we have to handle. */
1226
b34976b6 1227static bfd_boolean
c39a58e6
AM
1228elf_hppa_add_symbol_hook (bfd *abfd,
1229 struct bfd_link_info *info ATTRIBUTE_UNUSED,
555cd476 1230 Elf_Internal_Sym *sym,
c39a58e6
AM
1231 const char **namep ATTRIBUTE_UNUSED,
1232 flagword *flagsp ATTRIBUTE_UNUSED,
1233 asection **secp,
1234 bfd_vma *valp)
2eb429af 1235{
4fbb74a6 1236 unsigned int index = sym->st_shndx;
be7582f3 1237
2eb429af
JL
1238 switch (index)
1239 {
1240 case SHN_PARISC_ANSI_COMMON:
1241 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
1242 (*secp)->flags |= SEC_IS_COMMON;
1243 *valp = sym->st_size;
1244 break;
be7582f3 1245
2eb429af
JL
1246 case SHN_PARISC_HUGE_COMMON:
1247 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
1248 (*secp)->flags |= SEC_IS_COMMON;
1249 *valp = sym->st_size;
1250 break;
1251 }
1252
b34976b6 1253 return TRUE;
2eb429af
JL
1254}
1255
b34976b6 1256static bfd_boolean
c39a58e6
AM
1257elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1258 void *data)
af7dc644 1259{
c39a58e6 1260 struct bfd_link_info *info = data;
af7dc644 1261
e92d460e
AM
1262 if (h->root.type == bfd_link_hash_warning)
1263 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1264
af7dc644
JL
1265 /* If we are not creating a shared library, and this symbol is
1266 referenced by a shared library but is not defined anywhere, then
1267 the generic code will warn that it is undefined.
1268
1269 This behavior is undesirable on HPs since the standard shared
3f9b03b5 1270 libraries contain references to undefined symbols.
af7dc644
JL
1271
1272 So we twiddle the flags associated with such symbols so that they
3f9b03b5 1273 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
1274
1275 Ultimately we should have better controls over the generic ELF BFD
1276 linker code. */
1049f94e 1277 if (! info->relocatable
59c2e50f 1278 && info->unresolved_syms_in_shared_libs != RM_IGNORE
af7dc644 1279 && h->root.type == bfd_link_hash_undefined
f5385ebf
AM
1280 && h->ref_dynamic
1281 && !h->ref_regular)
af7dc644 1282 {
f5385ebf
AM
1283 h->ref_dynamic = 0;
1284 h->pointer_equality_needed = 1;
af7dc644
JL
1285 }
1286
b34976b6 1287 return TRUE;
af7dc644
JL
1288}
1289
b34976b6 1290static bfd_boolean
c39a58e6
AM
1291elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
1292 void *data)
af7dc644 1293{
c39a58e6 1294 struct bfd_link_info *info = data;
af7dc644 1295
e92d460e
AM
1296 if (h->root.type == bfd_link_hash_warning)
1297 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1298
af7dc644
JL
1299 /* If we are not creating a shared library, and this symbol is
1300 referenced by a shared library but is not defined anywhere, then
1301 the generic code will warn that it is undefined.
1302
1303 This behavior is undesirable on HPs since the standard shared
4cc11e76 1304 libraries contain references to undefined symbols.
af7dc644
JL
1305
1306 So we twiddle the flags associated with such symbols so that they
228d307f 1307 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
1308
1309 Ultimately we should have better controls over the generic ELF BFD
1310 linker code. */
1049f94e 1311 if (! info->relocatable
59c2e50f 1312 && info->unresolved_syms_in_shared_libs != RM_IGNORE
af7dc644 1313 && h->root.type == bfd_link_hash_undefined
f5385ebf
AM
1314 && !h->ref_dynamic
1315 && !h->ref_regular
1316 && h->pointer_equality_needed)
af7dc644 1317 {
f5385ebf
AM
1318 h->ref_dynamic = 1;
1319 h->pointer_equality_needed = 0;
af7dc644
JL
1320 }
1321
b34976b6 1322 return TRUE;
af7dc644
JL
1323}
1324
b34976b6 1325static bfd_boolean
c39a58e6 1326elf_hppa_is_dynamic_loader_symbol (const char *name)
1bf42538
JL
1327{
1328 return (! strcmp (name, "__CPU_REVISION")
1329 || ! strcmp (name, "__CPU_KEYBITS_1")
1330 || ! strcmp (name, "__SYSTEM_ID_D")
1331 || ! strcmp (name, "__FPU_MODEL")
1332 || ! strcmp (name, "__FPU_REVISION")
1333 || ! strcmp (name, "__ARGC")
1334 || ! strcmp (name, "__ARGV")
1335 || ! strcmp (name, "__ENVP")
1336 || ! strcmp (name, "__TLS_SIZE_D")
1337 || ! strcmp (name, "__LOAD_INFO")
1338 || ! strcmp (name, "__systab"));
1339}
1340
2ec0dd12
JL
1341/* Record the lowest address for the data and text segments. */
1342static void
7ae8e4e8 1343elf_hppa_record_segment_addrs (bfd *abfd,
c39a58e6
AM
1344 asection *section,
1345 void *data)
2ec0dd12 1346{
7ae8e4e8 1347 struct elf64_hppa_link_hash_table *hppa_info = data;
2ec0dd12 1348
7ae8e4e8
DA
1349 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
1350 {
2ea37f1c
NC
1351 bfd_vma value;
1352 Elf_Internal_Phdr *p;
1353
1354 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
1355 BFD_ASSERT (p != NULL);
1356 value = p->p_vaddr;
2ec0dd12 1357
7ae8e4e8
DA
1358 if (section->flags & SEC_READONLY)
1359 {
1360 if (value < hppa_info->text_segment_base)
1361 hppa_info->text_segment_base = value;
1362 }
1363 else
1364 {
1365 if (value < hppa_info->data_segment_base)
1366 hppa_info->data_segment_base = value;
1367 }
1368 }
2ec0dd12
JL
1369}
1370
2eb429af
JL
1371/* Called after we have seen all the input files/sections, but before
1372 final symbol resolution and section placement has been determined.
1373
1374 We use this hook to (possibly) provide a value for __gp, then we
1375 fall back to the generic ELF final link routine. */
1376
b34976b6 1377static bfd_boolean
c39a58e6 1378elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
2eb429af 1379{
b34976b6 1380 bfd_boolean retval;
edd21aca 1381 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
af7dc644 1382
1049f94e 1383 if (! info->relocatable)
2eb429af 1384 {
2eb429af 1385 struct elf_link_hash_entry *gp;
19ef5465 1386 bfd_vma gp_val;
1209c612
JL
1387
1388 /* The linker script defines a value for __gp iff it was referenced
1389 by one of the objects being linked. First try to find the symbol
1390 in the hash table. If that fails, just compute the value __gp
1391 should have had. */
b34976b6
AM
1392 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
1393 FALSE, FALSE);
2eb429af 1394
1209c612
JL
1395 if (gp)
1396 {
1397
1398 /* Adjust the value of __gp as we may want to slide it into the
1399 .plt section so that the stubs can access PLT entries without
1400 using an addil sequence. */
edd21aca 1401 gp->root.u.def.value += hppa_info->gp_offset;
1209c612
JL
1402
1403 gp_val = (gp->root.u.def.section->output_section->vma
1404 + gp->root.u.def.section->output_offset
1405 + gp->root.u.def.value);
1406 }
1407 else
1408 {
1409 asection *sec;
1209c612
JL
1410
1411 /* First look for a .plt section. If found, then __gp is the
1412 address of the .plt + gp_offset.
1413
1414 If no .plt is found, then look for .dlt, .opd and .data (in
d663e1cd
JL
1415 that order) and set __gp to the base address of whichever
1416 section is found first. */
1209c612
JL
1417
1418 sec = hppa_info->plt_sec;
d663e1cd 1419 if (sec && ! (sec->flags & SEC_EXCLUDE))
1209c612
JL
1420 gp_val = (sec->output_offset
1421 + sec->output_section->vma
1422 + hppa_info->gp_offset);
1423 else
1424 {
1425 sec = hppa_info->dlt_sec;
d663e1cd 1426 if (!sec || (sec->flags & SEC_EXCLUDE))
1209c612 1427 sec = hppa_info->opd_sec;
d663e1cd 1428 if (!sec || (sec->flags & SEC_EXCLUDE))
1209c612 1429 sec = bfd_get_section_by_name (abfd, ".data");
d663e1cd 1430 if (!sec || (sec->flags & SEC_EXCLUDE))
c456f082
AM
1431 gp_val = 0;
1432 else
1433 gp_val = sec->output_offset + sec->output_section->vma;
1209c612
JL
1434 }
1435 }
2eb429af 1436
1209c612 1437 /* Install whatever value we found/computed for __gp. */
2eb429af
JL
1438 _bfd_set_gp_value (abfd, gp_val);
1439 }
1440
2ec0dd12 1441 /* We need to know the base of the text and data segments so that we
edd21aca 1442 can perform SEGREL relocations. We will record the base addresses
2ec0dd12 1443 when we encounter the first SEGREL relocation. */
edd21aca
AM
1444 hppa_info->text_segment_base = (bfd_vma)-1;
1445 hppa_info->data_segment_base = (bfd_vma)-1;
2ec0dd12 1446
af7dc644 1447 /* HP's shared libraries have references to symbols that are not
4cc11e76 1448 defined anywhere. The generic ELF BFD linker code will complain
af7dc644
JL
1449 about such symbols.
1450
1451 So we detect the losing case and arrange for the flags on the symbol
1452 to indicate that it was never referenced. This keeps the generic
1453 ELF BFD link code happy and appears to not create any secondary
1454 problems. Ultimately we need a way to control the behavior of the
1455 generic ELF BFD link code better. */
1456 elf_link_hash_traverse (elf_hash_table (info),
1457 elf_hppa_unmark_useless_dynamic_symbols,
1458 info);
1459
2eb429af 1460 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 1461 retval = bfd_elf_final_link (abfd, info);
af7dc644
JL
1462
1463 elf_link_hash_traverse (elf_hash_table (info),
1464 elf_hppa_remark_useless_dynamic_symbols,
1465 info);
1466
46fe4e66
AM
1467 /* If we're producing a final executable, sort the contents of the
1468 unwind section. */
1469 if (retval)
1470 retval = elf_hppa_sort_unwind (abfd);
1471
af7dc644 1472 return retval;
2eb429af
JL
1473}
1474
9b52905e
NC
1475/* Relocate the given INSN. VALUE should be the actual value we want
1476 to insert into the instruction, ie by this point we should not be
1477 concerned with computing an offset relative to the DLT, PC, etc.
1478 Instead this routine is meant to handle the bit manipulations needed
1479 to insert the relocation into the given instruction. */
2eb429af 1480
9b52905e
NC
1481static int
1482elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
2eb429af 1483{
9b52905e
NC
1484 switch (r_type)
1485 {
1486 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
1487 the "B" instruction. */
1488 case R_PARISC_PCREL22F:
1489 case R_PARISC_PCREL22C:
1490 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
f0fe0e16 1491
9b52905e
NC
1492 /* This is any 12 bit branch. */
1493 case R_PARISC_PCREL12F:
1494 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
2eb429af 1495
9b52905e
NC
1496 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
1497 to the "B" instruction as well as BE. */
1498 case R_PARISC_PCREL17F:
1499 case R_PARISC_DIR17F:
1500 case R_PARISC_DIR17R:
1501 case R_PARISC_PCREL17C:
1502 case R_PARISC_PCREL17R:
1503 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
2eb429af 1504
9b52905e
NC
1505 /* ADDIL or LDIL instructions. */
1506 case R_PARISC_DLTREL21L:
1507 case R_PARISC_DLTIND21L:
1508 case R_PARISC_LTOFF_FPTR21L:
1509 case R_PARISC_PCREL21L:
1510 case R_PARISC_LTOFF_TP21L:
1511 case R_PARISC_DPREL21L:
1512 case R_PARISC_PLTOFF21L:
1513 case R_PARISC_DIR21L:
1514 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
2eb429af 1515
9b52905e
NC
1516 /* LDO and integer loads/stores with 14 bit displacements. */
1517 case R_PARISC_DLTREL14R:
1518 case R_PARISC_DLTREL14F:
1519 case R_PARISC_DLTIND14R:
1520 case R_PARISC_DLTIND14F:
1521 case R_PARISC_LTOFF_FPTR14R:
1522 case R_PARISC_PCREL14R:
1523 case R_PARISC_PCREL14F:
1524 case R_PARISC_LTOFF_TP14R:
1525 case R_PARISC_LTOFF_TP14F:
1526 case R_PARISC_DPREL14R:
1527 case R_PARISC_DPREL14F:
1528 case R_PARISC_PLTOFF14R:
1529 case R_PARISC_PLTOFF14F:
1530 case R_PARISC_DIR14R:
1531 case R_PARISC_DIR14F:
1532 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
2eb429af 1533
9b52905e
NC
1534 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
1535 case R_PARISC_LTOFF_FPTR16F:
1536 case R_PARISC_PCREL16F:
1537 case R_PARISC_LTOFF_TP16F:
1538 case R_PARISC_GPREL16F:
1539 case R_PARISC_PLTOFF16F:
1540 case R_PARISC_DIR16F:
1541 case R_PARISC_LTOFF16F:
1542 return (insn & ~0xffff) | re_assemble_16 (sym_value);
be7582f3 1543
9b52905e
NC
1544 /* Doubleword loads and stores with a 14 bit displacement. */
1545 case R_PARISC_DLTREL14DR:
1546 case R_PARISC_DLTIND14DR:
1547 case R_PARISC_LTOFF_FPTR14DR:
1548 case R_PARISC_LTOFF_FPTR16DF:
1549 case R_PARISC_PCREL14DR:
1550 case R_PARISC_PCREL16DF:
1551 case R_PARISC_LTOFF_TP14DR:
1552 case R_PARISC_LTOFF_TP16DF:
1553 case R_PARISC_DPREL14DR:
1554 case R_PARISC_GPREL16DF:
1555 case R_PARISC_PLTOFF14DR:
1556 case R_PARISC_PLTOFF16DF:
1557 case R_PARISC_DIR14DR:
1558 case R_PARISC_DIR16DF:
1559 case R_PARISC_LTOFF16DF:
1560 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
1561 | ((sym_value & 0x1ff8) << 1));
be7582f3 1562
9b52905e
NC
1563 /* Floating point single word load/store instructions. */
1564 case R_PARISC_DLTREL14WR:
1565 case R_PARISC_DLTIND14WR:
1566 case R_PARISC_LTOFF_FPTR14WR:
1567 case R_PARISC_LTOFF_FPTR16WF:
1568 case R_PARISC_PCREL14WR:
1569 case R_PARISC_PCREL16WF:
1570 case R_PARISC_LTOFF_TP14WR:
1571 case R_PARISC_LTOFF_TP16WF:
1572 case R_PARISC_DPREL14WR:
1573 case R_PARISC_GPREL16WF:
1574 case R_PARISC_PLTOFF14WR:
1575 case R_PARISC_PLTOFF16WF:
1576 case R_PARISC_DIR16WF:
1577 case R_PARISC_DIR14WR:
1578 case R_PARISC_LTOFF16WF:
1579 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
1580 | ((sym_value & 0x1ffc) << 1));
2eb429af 1581
9b52905e
NC
1582 default:
1583 return insn;
1584 }
1585}
be7582f3 1586
9b52905e
NC
1587/* Compute the value for a relocation (REL) during a final link stage,
1588 then insert the value into the proper location in CONTENTS.
be7582f3 1589
9b52905e
NC
1590 VALUE is a tentative value for the relocation and may be overridden
1591 and modified here based on the specific relocation to be performed.
be7582f3
JL
1592
1593 For example we do conversions for PC-relative branches in this routine
a7c10850 1594 or redirection of calls to external routines to stubs.
be7582f3
JL
1595
1596 The work of actually applying the relocation is left to a helper
1597 routine in an attempt to reduce the complexity and size of this
1598 function. */
2eb429af
JL
1599
1600static bfd_reloc_status_type
c39a58e6
AM
1601elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
1602 bfd *input_bfd,
1603 bfd *output_bfd,
1604 asection *input_section,
1605 bfd_byte *contents,
1606 bfd_vma value,
1607 struct bfd_link_info *info,
1608 asection *sym_sec,
1609 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1610 struct elf64_hppa_dyn_hash_entry *dyn_h)
2eb429af 1611{
dc810e39 1612 int insn;
be7582f3 1613 bfd_vma offset = rel->r_offset;
dc810e39 1614 bfd_signed_vma addend = rel->r_addend;
be7582f3 1615 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3f9b03b5 1616 unsigned int r_type = howto->type;
2eb429af 1617 bfd_byte *hit_data = contents + offset;
be7582f3 1618 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1619
1620 insn = bfd_get_32 (input_bfd, hit_data);
1621
2eb429af
JL
1622 switch (r_type)
1623 {
1624 case R_PARISC_NONE:
1625 break;
1626
ba94744e 1627 /* Basic function call support.
3f9b03b5
AM
1628
1629 Note for a call to a function defined in another dynamic library
1630 we want to redirect the call to a stub. */
1631
571047ad 1632 /* Random PC relative relocs. */
b233eaab
JL
1633 case R_PARISC_PCREL21L:
1634 case R_PARISC_PCREL14R:
1635 case R_PARISC_PCREL14F:
571047ad
JL
1636 case R_PARISC_PCREL14WR:
1637 case R_PARISC_PCREL14DR:
1638 case R_PARISC_PCREL16F:
1639 case R_PARISC_PCREL16WF:
1640 case R_PARISC_PCREL16DF:
1641 {
571047ad
JL
1642 /* If this is a call to a function defined in another dynamic
1643 library, then redirect the call to the local stub for this
1644 function. */
dfec422f
JL
1645 if (sym_sec == NULL || sym_sec->output_section == NULL)
1646 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1647 + hppa_info->stub_sec->output_section->vma);
a7c10850 1648
571047ad
JL
1649 /* Turn VALUE into a proper PC relative address. */
1650 value -= (offset + input_section->output_offset
1651 + input_section->output_section->vma);
1652
1653 /* Adjust for any field selectors. */
3f9b03b5
AM
1654 if (r_type == R_PARISC_PCREL21L)
1655 value = hppa_field_adjust (value, -8 + addend, e_lsel);
1656 else if (r_type == R_PARISC_PCREL14F
1657 || r_type == R_PARISC_PCREL16F
1658 || r_type == R_PARISC_PCREL16WF
1659 || r_type == R_PARISC_PCREL16DF)
1660 value = hppa_field_adjust (value, -8 + addend, e_fsel);
1661 else
1662 value = hppa_field_adjust (value, -8 + addend, e_rsel);
571047ad
JL
1663
1664 /* Apply the relocation to the given instruction. */
dc810e39 1665 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
571047ad
JL
1666 break;
1667 }
1668
49bd834c 1669 case R_PARISC_PCREL12F:
2eb429af
JL
1670 case R_PARISC_PCREL22F:
1671 case R_PARISC_PCREL17F:
571047ad
JL
1672 case R_PARISC_PCREL22C:
1673 case R_PARISC_PCREL17C:
1674 case R_PARISC_PCREL17R:
2eb429af 1675 {
be7582f3
JL
1676 /* If this is a call to a function defined in another dynamic
1677 library, then redirect the call to the local stub for this
1678 function. */
dfec422f 1679 if (sym_sec == NULL || sym_sec->output_section == NULL)
6a0b9871
JL
1680 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1681 + hppa_info->stub_sec->output_section->vma);
a7c10850 1682
be7582f3
JL
1683 /* Turn VALUE into a proper PC relative address. */
1684 value -= (offset + input_section->output_offset
1685 + input_section->output_section->vma);
1686
1687 /* Adjust for any field selectors. */
70d72e0e
AM
1688 if (r_type == R_PARISC_PCREL17R)
1689 value = hppa_field_adjust (value, -8 + addend, e_rsel);
1690 else
1691 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1692
be7582f3
JL
1693 /* All branches are implicitly shifted by 2 places. */
1694 value >>= 2;
2eb429af 1695
be7582f3 1696 /* Apply the relocation to the given instruction. */
dc810e39 1697 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
2eb429af
JL
1698 break;
1699 }
1700
be7582f3
JL
1701 /* Indirect references to data through the DLT. */
1702 case R_PARISC_DLTIND14R:
571047ad 1703 case R_PARISC_DLTIND14F:
be7582f3
JL
1704 case R_PARISC_DLTIND14DR:
1705 case R_PARISC_DLTIND14WR:
1706 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1707 case R_PARISC_LTOFF_FPTR14R:
1708 case R_PARISC_LTOFF_FPTR14DR:
1709 case R_PARISC_LTOFF_FPTR14WR:
1710 case R_PARISC_LTOFF_FPTR21L:
1711 case R_PARISC_LTOFF_FPTR16F:
1712 case R_PARISC_LTOFF_FPTR16WF:
1713 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1714 case R_PARISC_LTOFF_TP21L:
1715 case R_PARISC_LTOFF_TP14R:
1716 case R_PARISC_LTOFF_TP14F:
1717 case R_PARISC_LTOFF_TP14WR:
1718 case R_PARISC_LTOFF_TP14DR:
1719 case R_PARISC_LTOFF_TP16F:
1720 case R_PARISC_LTOFF_TP16WF:
1721 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1722 case R_PARISC_LTOFF16F:
1723 case R_PARISC_LTOFF16WF:
1724 case R_PARISC_LTOFF16DF:
c8933571 1725 {
6a0b9871 1726 /* If this relocation was against a local symbol, then we still
edd21aca 1727 have not set up the DLT entry (it's not convenient to do so
6a0b9871
JL
1728 in the "finalize_dlt" routine because it is difficult to get
1729 to the local symbol's value).
1730
1731 So, if this is a local symbol (h == NULL), then we need to
a7c10850 1732 fill in its DLT entry.
e48c661e
JL
1733
1734 Similarly we may still need to set up an entry in .opd for
1735 a local function which had its address taken. */
6a0b9871
JL
1736 if (dyn_h->h == NULL)
1737 {
1bf42538 1738 /* Now do .opd creation if needed. */
e48c661e
JL
1739 if (r_type == R_PARISC_LTOFF_FPTR14R
1740 || r_type == R_PARISC_LTOFF_FPTR14DR
1741 || r_type == R_PARISC_LTOFF_FPTR14WR
1742 || r_type == R_PARISC_LTOFF_FPTR21L
1743 || r_type == R_PARISC_LTOFF_FPTR16F
1744 || r_type == R_PARISC_LTOFF_FPTR16WF
1745 || r_type == R_PARISC_LTOFF_FPTR16DF)
1746 {
1747 /* The first two words of an .opd entry are zero. */
1748 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1749 0, 16);
1750
1751 /* The next word is the address of the function. */
1bf42538 1752 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1753 (hppa_info->opd_sec->contents
1754 + dyn_h->opd_offset + 16));
1755
1756 /* The last word is our local __gp value. */
1757 value = _bfd_get_gp_value
1758 (hppa_info->opd_sec->output_section->owner);
1759 bfd_put_64 (hppa_info->opd_sec->owner, value,
1760 (hppa_info->opd_sec->contents
1761 + dyn_h->opd_offset + 24));
1bf42538
JL
1762
1763 /* The DLT value is the address of the .opd entry. */
1764 value = (dyn_h->opd_offset
1765 + hppa_info->opd_sec->output_offset
1766 + hppa_info->opd_sec->output_section->vma);
1767 addend = 0;
e48c661e 1768 }
1bf42538
JL
1769
1770 bfd_put_64 (hppa_info->dlt_sec->owner,
1771 value + addend,
1772 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
6a0b9871
JL
1773 }
1774
be7582f3 1775 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1776 the symbol's actual address. Note that __gp may not point
1777 to the start of the DLT, so we have to compute the absolute
1778 address, then subtract out the value of __gp. */
1779 value = (dyn_h->dlt_offset
1780 + hppa_info->dlt_sec->output_offset
1781 + hppa_info->dlt_sec->output_section->vma);
1782 value -= _bfd_get_gp_value (output_bfd);
1783
be7582f3
JL
1784 /* All DLTIND relocations are basically the same at this point,
1785 except that we need different field selectors for the 21bit
1786 version vs the 14bit versions. */
e5bb3efc 1787 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1788 || r_type == R_PARISC_LTOFF_FPTR21L
1789 || r_type == R_PARISC_LTOFF_TP21L)
1bf42538 1790 value = hppa_field_adjust (value, 0, e_lsel);
571047ad
JL
1791 else if (r_type == R_PARISC_DLTIND14F
1792 || r_type == R_PARISC_LTOFF_FPTR16F
1793 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1794 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1795 || r_type == R_PARISC_LTOFF16F
1796 || r_type == R_PARISC_LTOFF16DF
1797 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1798 || r_type == R_PARISC_LTOFF_TP16F
1799 || r_type == R_PARISC_LTOFF_TP16WF
1800 || r_type == R_PARISC_LTOFF_TP16DF)
1bf42538 1801 value = hppa_field_adjust (value, 0, e_fsel);
be7582f3 1802 else
1bf42538 1803 value = hppa_field_adjust (value, 0, e_rsel);
be7582f3 1804
dc810e39 1805 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
c8933571
JL
1806 break;
1807 }
1808
be7582f3 1809 case R_PARISC_DLTREL14R:
571047ad 1810 case R_PARISC_DLTREL14F:
be7582f3
JL
1811 case R_PARISC_DLTREL14DR:
1812 case R_PARISC_DLTREL14WR:
c8933571 1813 case R_PARISC_DLTREL21L:
6849fb4d
JL
1814 case R_PARISC_DPREL21L:
1815 case R_PARISC_DPREL14WR:
1816 case R_PARISC_DPREL14DR:
1817 case R_PARISC_DPREL14R:
1818 case R_PARISC_DPREL14F:
1819 case R_PARISC_GPREL16F:
1820 case R_PARISC_GPREL16WF:
1821 case R_PARISC_GPREL16DF:
c8933571 1822 {
be7582f3
JL
1823 /* Subtract out the global pointer value to make value a DLT
1824 relative address. */
1825 value -= _bfd_get_gp_value (output_bfd);
1826
1827 /* All DLTREL relocations are basically the same at this point,
1828 except that we need different field selectors for the 21bit
1829 version vs the 14bit versions. */
6849fb4d
JL
1830 if (r_type == R_PARISC_DLTREL21L
1831 || r_type == R_PARISC_DPREL21L)
be7582f3 1832 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1833 else if (r_type == R_PARISC_DLTREL14F
1834 || r_type == R_PARISC_DPREL14F
1835 || r_type == R_PARISC_GPREL16F
1836 || r_type == R_PARISC_GPREL16WF
1837 || r_type == R_PARISC_GPREL16DF)
571047ad 1838 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1839 else
1840 value = hppa_field_adjust (value, addend, e_rrsel);
1841
dc810e39 1842 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
c8933571
JL
1843 break;
1844 }
1845
b7263961
JL
1846 case R_PARISC_DIR21L:
1847 case R_PARISC_DIR17R:
1848 case R_PARISC_DIR17F:
1849 case R_PARISC_DIR14R:
47d89dba 1850 case R_PARISC_DIR14F:
b7263961
JL
1851 case R_PARISC_DIR14WR:
1852 case R_PARISC_DIR14DR:
1853 case R_PARISC_DIR16F:
1854 case R_PARISC_DIR16WF:
1855 case R_PARISC_DIR16DF:
1856 {
1857 /* All DIR relocations are basically the same at this point,
70d72e0e
AM
1858 except that branch offsets need to be divided by four, and
1859 we need different field selectors. Note that we don't
1860 redirect absolute calls to local stubs. */
3f9b03b5 1861
b7263961
JL
1862 if (r_type == R_PARISC_DIR21L)
1863 value = hppa_field_adjust (value, addend, e_lrsel);
1864 else if (r_type == R_PARISC_DIR17F
1865 || r_type == R_PARISC_DIR16F
1866 || r_type == R_PARISC_DIR16WF
47d89dba
AM
1867 || r_type == R_PARISC_DIR16DF
1868 || r_type == R_PARISC_DIR14F)
b7263961
JL
1869 value = hppa_field_adjust (value, addend, e_fsel);
1870 else
1871 value = hppa_field_adjust (value, addend, e_rrsel);
1872
70d72e0e 1873 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
9b52905e
NC
1874 /* All branches are implicitly shifted by 2 places. */
1875 value >>= 2;
70d72e0e 1876
dc810e39 1877 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
b7263961
JL
1878 break;
1879 }
1880
8267b155
JL
1881 case R_PARISC_PLTOFF21L:
1882 case R_PARISC_PLTOFF14R:
1883 case R_PARISC_PLTOFF14F:
1884 case R_PARISC_PLTOFF14WR:
1885 case R_PARISC_PLTOFF14DR:
1886 case R_PARISC_PLTOFF16F:
1887 case R_PARISC_PLTOFF16WF:
1888 case R_PARISC_PLTOFF16DF:
1889 {
1890 /* We want the value of the PLT offset for this symbol, not
19ef5465
JL
1891 the symbol's actual address. Note that __gp may not point
1892 to the start of the DLT, so we have to compute the absolute
1893 address, then subtract out the value of __gp. */
1894 value = (dyn_h->plt_offset
1895 + hppa_info->plt_sec->output_offset
1896 + hppa_info->plt_sec->output_section->vma);
1897 value -= _bfd_get_gp_value (output_bfd);
8267b155
JL
1898
1899 /* All PLTOFF relocations are basically the same at this point,
1900 except that we need different field selectors for the 21bit
1901 version vs the 14bit versions. */
1902 if (r_type == R_PARISC_PLTOFF21L)
1903 value = hppa_field_adjust (value, addend, e_lrsel);
1904 else if (r_type == R_PARISC_PLTOFF14F
1905 || r_type == R_PARISC_PLTOFF16F
1906 || r_type == R_PARISC_PLTOFF16WF
1907 || r_type == R_PARISC_PLTOFF16DF)
1908 value = hppa_field_adjust (value, addend, e_fsel);
1909 else
1910 value = hppa_field_adjust (value, addend, e_rrsel);
1911
dc810e39 1912 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
8267b155
JL
1913 break;
1914 }
1915
e5bb3efc
JL
1916 case R_PARISC_LTOFF_FPTR32:
1917 {
e48c661e
JL
1918 /* We may still need to create the FPTR itself if it was for
1919 a local symbol. */
1920 if (dyn_h->h == NULL)
1921 {
1922 /* The first two words of an .opd entry are zero. */
1923 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1924
1925 /* The next word is the address of the function. */
1bf42538 1926 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1927 (hppa_info->opd_sec->contents
1928 + dyn_h->opd_offset + 16));
1929
1930 /* The last word is our local __gp value. */
1931 value = _bfd_get_gp_value
1932 (hppa_info->opd_sec->output_section->owner);
1933 bfd_put_64 (hppa_info->opd_sec->owner, value,
1934 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1bf42538
JL
1935
1936 /* The DLT value is the address of the .opd entry. */
1937 value = (dyn_h->opd_offset
1938 + hppa_info->opd_sec->output_offset
1939 + hppa_info->opd_sec->output_section->vma);
1940
1941 bfd_put_64 (hppa_info->dlt_sec->owner,
1942 value,
1943 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1944 }
1945
e5bb3efc 1946 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1947 the symbol's actual address. Note that __gp may not point
1948 to the start of the DLT, so we have to compute the absolute
1949 address, then subtract out the value of __gp. */
1950 value = (dyn_h->dlt_offset
1951 + hppa_info->dlt_sec->output_offset
1952 + hppa_info->dlt_sec->output_section->vma);
1953 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1954 bfd_put_32 (input_bfd, value, hit_data);
1955 return bfd_reloc_ok;
1956 }
1957
e5bb3efc 1958 case R_PARISC_LTOFF_FPTR64:
b233eaab 1959 case R_PARISC_LTOFF_TP64:
e5bb3efc 1960 {
e48c661e
JL
1961 /* We may still need to create the FPTR itself if it was for
1962 a local symbol. */
1963 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1964 {
1965 /* The first two words of an .opd entry are zero. */
1966 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1967
1968 /* The next word is the address of the function. */
1bf42538 1969 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
1970 (hppa_info->opd_sec->contents
1971 + dyn_h->opd_offset + 16));
1972
1973 /* The last word is our local __gp value. */
1974 value = _bfd_get_gp_value
1975 (hppa_info->opd_sec->output_section->owner);
1976 bfd_put_64 (hppa_info->opd_sec->owner, value,
1977 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1bf42538
JL
1978
1979 /* The DLT value is the address of the .opd entry. */
1980 value = (dyn_h->opd_offset
1981 + hppa_info->opd_sec->output_offset
1982 + hppa_info->opd_sec->output_section->vma);
1983
1984 bfd_put_64 (hppa_info->dlt_sec->owner,
1985 value,
1986 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1987 }
1988
e5bb3efc 1989 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1990 the symbol's actual address. Note that __gp may not point
1991 to the start of the DLT, so we have to compute the absolute
1992 address, then subtract out the value of __gp. */
1993 value = (dyn_h->dlt_offset
1994 + hppa_info->dlt_sec->output_offset
1995 + hppa_info->dlt_sec->output_section->vma);
1996 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1997 bfd_put_64 (input_bfd, value, hit_data);
1998 return bfd_reloc_ok;
1999 }
2000
2001 case R_PARISC_DIR32:
571047ad 2002 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
2003 return bfd_reloc_ok;
2004
2005 case R_PARISC_DIR64:
571047ad 2006 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
2007 return bfd_reloc_ok;
2008
6849fb4d
JL
2009 case R_PARISC_GPREL64:
2010 /* Subtract out the global pointer value to make value a DLT
2011 relative address. */
2012 value -= _bfd_get_gp_value (output_bfd);
6849fb4d
JL
2013
2014 bfd_put_64 (input_bfd, value + addend, hit_data);
2015 return bfd_reloc_ok;
2016
b7263961 2017 case R_PARISC_LTOFF64:
19ef5465
JL
2018 /* We want the value of the DLT offset for this symbol, not
2019 the symbol's actual address. Note that __gp may not point
2020 to the start of the DLT, so we have to compute the absolute
2021 address, then subtract out the value of __gp. */
2022 value = (dyn_h->dlt_offset
2023 + hppa_info->dlt_sec->output_offset
2024 + hppa_info->dlt_sec->output_section->vma);
2025 value -= _bfd_get_gp_value (output_bfd);
b7263961
JL
2026
2027 bfd_put_64 (input_bfd, value + addend, hit_data);
2028 return bfd_reloc_ok;
2029
571047ad
JL
2030 case R_PARISC_PCREL32:
2031 {
2032 /* If this is a call to a function defined in another dynamic
2033 library, then redirect the call to the local stub for this
2034 function. */
dfec422f
JL
2035 if (sym_sec == NULL || sym_sec->output_section == NULL)
2036 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2037 + hppa_info->stub_sec->output_section->vma);
a7c10850 2038
571047ad
JL
2039 /* Turn VALUE into a proper PC relative address. */
2040 value -= (offset + input_section->output_offset
2041 + input_section->output_section->vma);
2042
b233eaab 2043 value += addend;
571047ad 2044 value -= 8;
edd21aca 2045 bfd_put_32 (input_bfd, value, hit_data);
571047ad
JL
2046 return bfd_reloc_ok;
2047 }
2048
2049 case R_PARISC_PCREL64:
2050 {
2051 /* If this is a call to a function defined in another dynamic
2052 library, then redirect the call to the local stub for this
2053 function. */
dfec422f
JL
2054 if (sym_sec == NULL || sym_sec->output_section == NULL)
2055 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
2056 + hppa_info->stub_sec->output_section->vma);
a7c10850 2057
571047ad
JL
2058 /* Turn VALUE into a proper PC relative address. */
2059 value -= (offset + input_section->output_offset
2060 + input_section->output_section->vma);
2061
b233eaab 2062 value += addend;
571047ad
JL
2063 value -= 8;
2064 bfd_put_64 (input_bfd, value, hit_data);
2065 return bfd_reloc_ok;
2066 }
2067
e5bb3efc 2068 case R_PARISC_FPTR64:
e48c661e
JL
2069 {
2070 /* We may still need to create the FPTR itself if it was for
2071 a local symbol. */
2072 if (dyn_h->h == NULL)
2073 {
2074 /* The first two words of an .opd entry are zero. */
2075 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
2076
2077 /* The next word is the address of the function. */
1bf42538 2078 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
e48c661e
JL
2079 (hppa_info->opd_sec->contents
2080 + dyn_h->opd_offset + 16));
2081
2082 /* The last word is our local __gp value. */
2083 value = _bfd_get_gp_value
2084 (hppa_info->opd_sec->output_section->owner);
2085 bfd_put_64 (hppa_info->opd_sec->owner, value,
2086 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
2087 }
2088
d663e1cd
JL
2089 if (dyn_h->want_opd)
2090 /* We want the value of the OPD offset for this symbol. */
2091 value = (dyn_h->opd_offset
2092 + hppa_info->opd_sec->output_offset
2093 + hppa_info->opd_sec->output_section->vma);
2094 else
2095 /* We want the address of the symbol. */
2096 value += addend;
a7c10850 2097
1bf42538 2098 bfd_put_64 (input_bfd, value, hit_data);
e48c661e
JL
2099 return bfd_reloc_ok;
2100 }
e5bb3efc 2101
228d307f
JL
2102 case R_PARISC_SECREL32:
2103 bfd_put_32 (input_bfd,
edd21aca 2104 value + addend - sym_sec->output_section->vma,
228d307f
JL
2105 hit_data);
2106 return bfd_reloc_ok;
2107
2108 case R_PARISC_SEGREL32:
2ec0dd12
JL
2109 case R_PARISC_SEGREL64:
2110 {
2111 /* If this is the first SEGREL relocation, then initialize
2112 the segment base values. */
2113 if (hppa_info->text_segment_base == (bfd_vma) -1)
2114 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
edd21aca 2115 hppa_info);
2ec0dd12
JL
2116
2117 /* VALUE holds the absolute address. We want to include the
2118 addend, then turn it into a segment relative address.
2119
2120 The segment is derived from SYM_SEC. We assume that there are
2121 only two segments of note in the resulting executable/shlib.
2122 A readonly segment (.text) and a readwrite segment (.data). */
2123 value += addend;
2124
2125 if (sym_sec->flags & SEC_CODE)
2126 value -= hppa_info->text_segment_base;
2127 else
2128 value -= hppa_info->data_segment_base;
2129
2130 if (r_type == R_PARISC_SEGREL32)
2131 bfd_put_32 (input_bfd, value, hit_data);
2132 else
2133 bfd_put_64 (input_bfd, value, hit_data);
46fe4e66 2134 return bfd_reloc_ok;
2ec0dd12 2135 }
228d307f 2136
2eb429af
JL
2137 /* Something we don't know how to handle. */
2138 default:
228d307f 2139 return bfd_reloc_notsupported;
2eb429af
JL
2140 }
2141
2142 /* Update the instruction word. */
dc810e39 2143 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
edd21aca 2144 return bfd_reloc_ok;
2eb429af
JL
2145}
2146
9b52905e 2147/* Relocate an HPPA ELF section. */
2eb429af 2148
9b52905e
NC
2149static bfd_boolean
2150elf_hppa_relocate_section (bfd *output_bfd,
2151 struct bfd_link_info *info,
2152 bfd *input_bfd,
2153 asection *input_section,
2154 bfd_byte *contents,
2155 Elf_Internal_Rela *relocs,
2156 Elf_Internal_Sym *local_syms,
2157 asection **local_sections)
2eb429af 2158{
9b52905e
NC
2159 Elf_Internal_Shdr *symtab_hdr;
2160 Elf_Internal_Rela *rel;
2161 Elf_Internal_Rela *relend;
2162 struct elf64_hppa_link_hash_table *hppa_info;
2163
9b52905e
NC
2164 hppa_info = elf64_hppa_hash_table (info);
2165 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2166
2167 rel = relocs;
2168 relend = relocs + input_section->reloc_count;
2169 for (; rel < relend; rel++)
2eb429af 2170 {
9b52905e
NC
2171 int r_type;
2172 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2173 unsigned long r_symndx;
2174 struct elf_link_hash_entry *h;
2175 Elf_Internal_Sym *sym;
2176 asection *sym_sec;
2177 bfd_vma relocation;
2178 bfd_reloc_status_type r;
2179 const char *dyn_name;
2180 char *dynh_buf = NULL;
2181 size_t dynh_buflen = 0;
2182 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af 2183
9b52905e
NC
2184 r_type = ELF_R_TYPE (rel->r_info);
2185 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
2186 {
2187 bfd_set_error (bfd_error_bad_value);
2188 return FALSE;
2189 }
49bd834c 2190
9b52905e
NC
2191 /* This is a final link. */
2192 r_symndx = ELF_R_SYM (rel->r_info);
2193 h = NULL;
2194 sym = NULL;
2195 sym_sec = NULL;
2196 if (r_symndx < symtab_hdr->sh_info)
2197 {
2198 /* This is a local symbol. */
2199 sym = local_syms + r_symndx;
2200 sym_sec = local_sections[r_symndx];
2201 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
2eb429af 2202
9b52905e
NC
2203 /* If this symbol has an entry in the PA64 dynamic hash
2204 table, then get it. */
2205 dyn_name = get_dyn_name (input_bfd, h, rel,
2206 &dynh_buf, &dynh_buflen);
2207 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
2208 dyn_name, FALSE, FALSE);
be7582f3 2209
9b52905e
NC
2210 }
2211 else
2212 {
2213 /* This is not a local symbol. */
2214 long indx;
ba94744e 2215
ab96bf03 2216 relocation = 0;
9b52905e
NC
2217 indx = r_symndx - symtab_hdr->sh_info;
2218 h = elf_sym_hashes (input_bfd)[indx];
2219 while (h->root.type == bfd_link_hash_indirect
2220 || h->root.type == bfd_link_hash_warning)
2221 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2222 if (h->root.type == bfd_link_hash_defined
2223 || h->root.type == bfd_link_hash_defweak)
2224 {
2225 sym_sec = h->root.u.def.section;
be7582f3 2226
9b52905e
NC
2227 /* If this symbol has an entry in the PA64 dynamic hash
2228 table, then get it. */
2229 dyn_name = get_dyn_name (input_bfd, h, rel,
2230 &dynh_buf, &dynh_buflen);
2231 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
2232 dyn_name, FALSE, FALSE);
11c19a4e 2233
9b52905e
NC
2234 /* If we have a relocation against a symbol defined in a
2235 shared library and we have not created an entry in the
2236 PA64 dynamic symbol hash table for it, then we lose. */
ab96bf03
AM
2237 if (!info->relocatable
2238 && sym_sec->output_section == NULL && dyn_h == NULL)
9b52905e
NC
2239 {
2240 (*_bfd_error_handler)
2241 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
2242 input_bfd,
2243 input_section,
2244 (long) rel->r_offset,
2245 howto->name,
2246 h->root.root.string);
9b52905e
NC
2247 }
2248 else if (sym_sec->output_section)
2249 relocation = (h->root.u.def.value
2250 + sym_sec->output_offset
2251 + sym_sec->output_section->vma);
9b52905e
NC
2252 }
2253 else if (info->unresolved_syms_in_objects == RM_IGNORE
2254 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2255 {
2256 /* If this symbol has an entry in the PA64 dynamic hash
2257 table, then get it. */
2258 dyn_name = get_dyn_name (input_bfd, h, rel,
2259 &dynh_buf, &dynh_buflen);
2260 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
2261 dyn_name, FALSE, FALSE);
be7582f3 2262
ab96bf03 2263 if (!info->relocatable && dyn_h == NULL)
9b52905e
NC
2264 {
2265 (*_bfd_error_handler)
2266 (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
2267 input_bfd, input_section, h->root.root.string);
2268 }
9b52905e
NC
2269 }
2270 else if (h->root.type == bfd_link_hash_undefweak)
2271 {
2272 dyn_name = get_dyn_name (input_bfd, h, rel,
2273 &dynh_buf, &dynh_buflen);
2274 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
2275 dyn_name, FALSE, FALSE);
2276
ab96bf03 2277 if (!info->relocatable && dyn_h == NULL)
9b52905e
NC
2278 {
2279 (*_bfd_error_handler)
2280 (_("%B(%A): warning: unresolvable relocation against symbol `%s'"),
2281 input_bfd, input_section, h->root.root.string);
2282 }
9b52905e 2283 }
ab96bf03 2284 else if (!info->relocatable)
9b52905e
NC
2285 {
2286 /* Ignore dynamic loader defined symbols. */
ab96bf03 2287 if (!elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
9b52905e
NC
2288 {
2289 if (!((*info->callbacks->undefined_symbol)
2290 (info, h->root.root.string, input_bfd,
2291 input_section, rel->r_offset,
2292 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
2293 || ELF_ST_VISIBILITY (h->other)))))
2294 return FALSE;
2295 break;
2296 }
2297 }
2298 }
2299
ab96bf03
AM
2300 if (sym_sec != NULL && elf_discarded_section (sym_sec))
2301 {
2302 /* For relocs against symbols from removed linkonce sections,
2303 or sections discarded by a linker script, we just want the
2304 section contents zeroed. Avoid any special processing. */
2305 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
2306 rel->r_info = 0;
2307 rel->r_addend = 0;
2308 continue;
2309 }
2310
2311 if (info->relocatable)
2312 continue;
2313
9b52905e
NC
2314 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2315 input_section, contents,
2316 relocation, info, sym_sec,
2317 h, dyn_h);
2318
2319 if (r != bfd_reloc_ok)
2320 {
2321 switch (r)
2322 {
2323 default:
2324 abort ();
2325 case bfd_reloc_overflow:
2326 {
2327 const char *sym_name;
2328
2329 if (h != NULL)
2330 sym_name = NULL;
2331 else
2332 {
2333 sym_name = bfd_elf_string_from_elf_section (input_bfd,
2334 symtab_hdr->sh_link,
2335 sym->st_name);
2336 if (sym_name == NULL)
2337 return FALSE;
2338 if (*sym_name == '\0')
2339 sym_name = bfd_section_name (input_bfd, sym_sec);
2340 }
2341
2342 if (!((*info->callbacks->reloc_overflow)
2343 (info, (h ? &h->root : NULL), sym_name,
2344 howto->name, (bfd_vma) 0, input_bfd,
2345 input_section, rel->r_offset)))
2346 return FALSE;
2347 }
2348 break;
2349 }
2350 }
2eb429af 2351 }
9b52905e 2352 return TRUE;
2eb429af 2353}
9b52905e
NC
2354
2355#endif /* ARCH_SIZE == 64 */
This page took 0.60922 seconds and 4 git commands to generate.