* emultempl/elf32.em (gld${EMULATION_NAME}_open_dynamic_archive):
[deliverable/binutils-gdb.git] / bfd / elf-hppa.h
CommitLineData
9e103c9c 1/* Common code for PA ELF implementations.
5f771d47 2 Copyright (C) 1999 Free Software Foundation, Inc.
9e103c9c
JL
3
4This file is part of BFD, the Binary File Descriptor library.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1
21
2eb429af
JL
22/* This file is included by multiple PA ELF BFD backends with different
23 sizes.
24
25 Most of the routines are written to be size independent, but sometimes
26 external constraints require 32 or 64 bit specific code. We remap
27 the definitions/functions as necessary here. */
9e103c9c
JL
28#if ARCH_SIZE == 64
29#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
2eb429af 30#define ELF_R_SYM(X) ELF64_R_SYM(X)
9e103c9c 31#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
2eb429af
JL
32#define elf_hppa_relocate_section elf64_hppa_relocate_section
33#define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
34#define elf_hppa_final_link elf64_hppa_final_link
9e103c9c
JL
35#endif
36#if ARCH_SIZE == 32
37#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
2eb429af 38#define ELF_R_SYM(X) ELF32_R_SYM(X)
9e103c9c 39#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
2eb429af
JL
40#define elf_hppa_relocate_section elf32_hppa_relocate_section
41#define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
42#define elf_hppa_final_link elf32_hppa_final_link
9e103c9c
JL
43#endif
44
2eb429af
JL
45static boolean
46elf_hppa_relocate_section
47 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
48 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
49
50static bfd_reloc_status_type elf_hppa_final_link_relocate
be7582f3
JL
51 PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *,
52 bfd_byte *, bfd_vma, struct bfd_link_info *,
53 asection *, struct elf_link_hash_entry *,
54 struct elf64_hppa_dyn_hash_entry *));
2eb429af
JL
55
56static unsigned long elf_hppa_relocate_insn
be7582f3 57 PARAMS ((unsigned long, long, unsigned long));
2eb429af
JL
58
59static boolean elf_hppa_add_symbol_hook
f273939b 60 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
2eb429af
JL
61 const char **, flagword *, asection **, bfd_vma *));
62
63static boolean elf_hppa_final_link
64 PARAMS ((bfd *, struct bfd_link_info *));
65
af7dc644
JL
66static boolean elf_hppa_unmark_useless_dynamic_symbols
67 PARAMS ((struct elf_link_hash_entry *, PTR));
68
69static boolean elf_hppa_remark_useless_dynamic_symbols
70 PARAMS ((struct elf_link_hash_entry *, PTR));
71
2ec0dd12
JL
72static void elf_hppa_record_segment_addrs
73 PARAMS ((bfd *, asection *, PTR));
74
9e103c9c
JL
75/* ELF/PA relocation howto entries. */
76
77static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
78{
be7582f3 79 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
9e103c9c
JL
80
81 /* The values in DIR32 are to placate the check in
82 _bfd_stab_section_find_nearest_line. */
caf3d37c 83 {R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
be7582f3
JL
84 {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR21L"},
85 {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17R"},
86 {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR17F"},
87 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
88 {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14R"},
89 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
90 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
91 {R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL32"},
92
93 {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL21L"},
94 {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17R"},
95 {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17F"},
96 {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL17C"},
97 {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14R"},
98 {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14F"},
99 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
100 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
101 {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL21L"},
102 {R_PARISC_DPREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14WR"},
103
104 {R_PARISC_DPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14DR"},
105 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
106 {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14R"},
107 {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DPREL14F"},
108 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
109 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
110 {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL21L"},
111 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
112 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
113 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
114
115 {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14R"},
116 {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14F"},
117 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
118 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
119 {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND21L"},
120 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
121 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
122 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
123 {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14R"},
124 {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14F"},
125
126 {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SETBASE"},
127 {R_PARISC_SECREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SECREL32"},
128 {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL21L"},
129 {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17R"},
130 {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL17F"},
131 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
132 {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14R"},
133 {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14F"},
134 {R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGBASE"},
135 {R_PARISC_SEGREL32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL32"},
136
137 {R_PARISC_PLTOFF21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L"},
138 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
139 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
140 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
141 {R_PARISC_PLTOFF14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R"},
142 {R_PARISC_PLTOFF14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F"},
143 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
144 {R_PARISC_LTOFF_FPTR32, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32"},
145 {R_PARISC_LTOFF_FPTR21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L"},
146 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
147
148 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
149 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
150 {R_PARISC_LTOFF_FPTR14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R"},
151 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
152 {R_PARISC_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_FPTR64"},
153 {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL32"},
154 {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL21L"},
155 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
156 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
157 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
158
159 {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLABEL14R"},
160 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
161 {R_PARISC_PCREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL64"},
162 {R_PARISC_PCREL22C, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22C"},
163 {R_PARISC_PCREL22F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL22F"},
164 {R_PARISC_PCREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14WR"},
165 {R_PARISC_PCREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL14DR"},
166 {R_PARISC_PCREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16F"},
167 {R_PARISC_PCREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16WF"},
168 {R_PARISC_PCREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PCREL16DF"},
169
170 {R_PARISC_DIR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR64"},
b7263961
JL
171 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
172 {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_NONE"},
be7582f3
JL
173 {R_PARISC_DIR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14WR"},
174 {R_PARISC_DIR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR14DR"},
175 {R_PARISC_DIR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16F"},
176 {R_PARISC_DIR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16WF"},
177 {R_PARISC_DIR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DIR16DF"},
178 {R_PARISC_GPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL64"},
179 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
180
181 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
182 {R_PARISC_DLTREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR"},
183 {R_PARISC_DLTREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR"},
184 {R_PARISC_GPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16F"},
185 {R_PARISC_GPREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16WF"},
186 {R_PARISC_GPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_GPREL16DF"},
187 {R_PARISC_LTOFF64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF64"},
188 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
189 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
190 {R_PARISC_DLTIND14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR"},
191
192 {R_PARISC_DLTIND14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR"},
193 {R_PARISC_LTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16F"},
b7263961 194 {R_PARISC_LTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3 195 {R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF"},
be7582f3
JL
196 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
197 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
198 {R_PARISC_BASEREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BSEREL14WR"},
199 {R_PARISC_BASEREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR"},
200 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
201 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
202
203 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
204 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
205 {R_PARISC_SEGREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_SEGREL64"},
206 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
207 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
208 {R_PARISC_PLTOFF14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR"},
209 {R_PARISC_PLTOFF14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR"},
210 {R_PARISC_PLTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F"},
211 {R_PARISC_PLTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF"},
212 {R_PARISC_PLTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF"},
213
214 {R_PARISC_LTOFF_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
215 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
216 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
217 {R_PARISC_LTOFF_FPTR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR"},
218 {R_PARISC_LTOFF_FPTR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR"},
219 {R_PARISC_LTOFF_FPTR16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F"},
220 {R_PARISC_LTOFF_FPTR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF"},
221 {R_PARISC_LTOFF_FPTR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
222 {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_COPY"},
223 {R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_IPLT"},
224
225 {R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_EPLT"},
226 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
227 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
228 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
229 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
230 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
231 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
232 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
233 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
234 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
235
236 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
237 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
238 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
239 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
240 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
241 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
242 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
243 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
244 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
245 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
246
247 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
248 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
249 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
250 {R_PARISC_TPREL32, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL32"},
251 {R_PARISC_TPREL21L, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL21L"},
252 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
253 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
254 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
255 {R_PARISC_TPREL14R, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14R"},
256 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
257
258 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
259 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
260 {R_PARISC_LTOFF_TP21L, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L"},
261 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
262 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
263 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
264 {R_PARISC_LTOFF_TP14R, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
265 {R_PARISC_LTOFF_TP14F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F"},
266 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
267 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
268
269 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
270 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
271 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
272 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
273 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
274 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
275 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
276 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
277 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
278 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
279
280 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
281 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
282 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
283 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
284 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
285 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
286 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
287 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
288 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
289 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
290
291 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
292 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
293 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
294 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
295 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
296 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
297 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
298 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
299 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
300 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
301
302 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
303 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
304 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
305 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
306 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
307 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
308 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
309 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
310 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
311 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
312
313 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
314 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
315 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
316 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
317 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
318 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
319 {R_PARISC_TPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL64"},
320 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
321 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
322 {R_PARISC_TPREL14WR, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL14WR"},
323
324 {R_PARISC_TPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL14DR"},
325 {R_PARISC_TPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16F"},
326 {R_PARISC_TPREL16WF, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_TPREL16WF"},
327 {R_PARISC_TPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_TPREL16DF"},
328 {R_PARISC_LTOFF_TP64, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64"},
329 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
330 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED"},
331 {R_PARISC_LTOFF_TP14WR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR"},
332 {R_PARISC_LTOFF_TP14DR, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR"},
333 {R_PARISC_LTOFF_TP16F, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_LTOFF_TP16F"},
334
335 {R_PARISC_LTOFF_TP16WF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF"},
336 {R_PARISC_LTOFF_TP16DF, 0, 0, 0, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF"},
9e103c9c
JL
337};
338
6e2bf930
JL
339#define OFFSET_14R_FROM_21L 4
340#define OFFSET_14F_FROM_21L 5
341
9e103c9c
JL
342/* Return one (or more) BFD relocations which implement the base
343 relocation with modifications based on format and field. */
344
345elf_hppa_reloc_type **
346_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
347 bfd *abfd;
348 elf_hppa_reloc_type base_type;
349 int format;
350 int field;
be7582f3
JL
351 int ignore;
352 asymbol *sym;
9e103c9c
JL
353{
354 elf_hppa_reloc_type *finaltype;
355 elf_hppa_reloc_type **final_types;
356
357 /* Allocate slots for the BFD relocation. */
358 final_types = ((elf_hppa_reloc_type **)
359 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2));
360 if (final_types == NULL)
361 return NULL;
362
363 /* Allocate space for the relocation itself. */
364 finaltype = ((elf_hppa_reloc_type *)
365 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type)));
366 if (finaltype == NULL)
367 return NULL;
368
369 /* Some reasonable defaults. */
370 final_types[0] = finaltype;
371 final_types[1] = NULL;
372
373#define final_type finaltype[0]
374
375 final_type = base_type;
376
377 /* Just a tangle of nested switch statements to deal with the braindamage
378 that a different field selector means a completely different relocation
379 for PA ELF. */
380 switch (base_type)
381 {
0d571602
JL
382 /* We have been using generic relocation types. However, that may not
383 really make sense. Anyway, we need to support both R_PARISC_DIR64
384 and R_PARISC_DIR32 here. */
385 case R_PARISC_DIR32:
386 case R_PARISC_DIR64:
9e103c9c
JL
387 case R_HPPA_ABS_CALL:
388 switch (format)
389 {
390 case 14:
391 switch (field)
392 {
393 case e_rsel:
394 case e_rrsel:
395 final_type = R_PARISC_DIR14R;
396 break;
397 case e_rtsel:
f31cedf7 398 final_type = R_PARISC_DLTIND14R;
9e103c9c 399 break;
36860900
JL
400 case e_rtpsel:
401 final_type = R_PARISC_LTOFF_FPTR14DR;
402 break;
9e103c9c 403 case e_tsel:
f31cedf7 404 final_type = R_PARISC_DLTIND14F;
9e103c9c
JL
405 break;
406 case e_rpsel:
407 final_type = R_PARISC_PLABEL14R;
408 break;
409 default:
410 return NULL;
411 }
412 break;
413
414 case 17:
415 switch (field)
416 {
417 case e_fsel:
418 final_type = R_PARISC_DIR17F;
419 break;
420 case e_rsel:
421 case e_rrsel:
422 final_type = R_PARISC_DIR17R;
423 break;
424 default:
425 return NULL;
426 }
427 break;
428
429 case 21:
430 switch (field)
431 {
432 case e_lsel:
433 case e_lrsel:
434 final_type = R_PARISC_DIR21L;
435 break;
436 case e_ltsel:
f31cedf7 437 final_type = R_PARISC_DLTIND21L;
9e103c9c 438 break;
36860900
JL
439 case e_ltpsel:
440 final_type = R_PARISC_LTOFF_FPTR21L;
441 break;
9e103c9c
JL
442 case e_lpsel:
443 final_type = R_PARISC_PLABEL21L;
444 break;
445 default:
446 return NULL;
447 }
448 break;
449
450 case 32:
451 switch (field)
452 {
453 case e_fsel:
454 final_type = R_PARISC_DIR32;
432bdd91
JL
455 /* When in 64bit mode, a 32bit relocation is supposed to
456 be a section relative relocation. Dwarf2 (for example)
457 uses 32bit section relative relocations. */
458 if (bfd_get_arch_info (abfd)->bits_per_address != 32)
459 final_type = R_PARISC_SECREL32;
9e103c9c
JL
460 break;
461 case e_psel:
462 final_type = R_PARISC_PLABEL32;
463 break;
464 default:
465 return NULL;
466 }
467 break;
468
6e2bf930
JL
469 case 64:
470 switch (field)
471 {
472 case e_fsel:
473 final_type = R_PARISC_DIR64;
474 break;
475 case e_psel:
36860900
JL
476 final_type = R_PARISC_FPTR64;
477 break;
6e2bf930
JL
478 default:
479 return NULL;
480 }
481 break;
482
9e103c9c
JL
483 default:
484 return NULL;
485 }
486 break;
487
488
489 case R_HPPA_GOTOFF:
490 switch (format)
491 {
492 case 14:
493 switch (field)
494 {
495 case e_rsel:
496 case e_rrsel:
6e2bf930 497 final_type = base_type + OFFSET_14R_FROM_21L;
9e103c9c
JL
498 break;
499 case e_fsel:
6e2bf930 500 final_type = base_type + OFFSET_14F_FROM_21L;
9e103c9c
JL
501 break;
502 default:
503 return NULL;
504 }
505 break;
506
507 case 21:
508 switch (field)
509 {
510 case e_lrsel:
511 case e_lsel:
6e2bf930 512 final_type = base_type;
9e103c9c
JL
513 break;
514 default:
515 return NULL;
516 }
517 break;
518
519 default:
520 return NULL;
521 }
522 break;
523
524
525 case R_HPPA_PCREL_CALL:
526 switch (format)
527 {
528 case 14:
529 switch (field)
530 {
531 case e_rsel:
532 case e_rrsel:
533 final_type = R_PARISC_PCREL14R;
534 break;
535 case e_fsel:
536 final_type = R_PARISC_PCREL14F;
537 break;
538 default:
539 return NULL;
540 }
541 break;
542
543 case 17:
544 switch (field)
545 {
546 case e_rsel:
547 case e_rrsel:
548 final_type = R_PARISC_PCREL17R;
549 break;
550 case e_fsel:
551 final_type = R_PARISC_PCREL17F;
552 break;
553 default:
554 return NULL;
555 }
556 break;
557
341362b5
JL
558 case 22:
559 switch (field)
560 {
561 case e_fsel:
562 final_type = R_PARISC_PCREL22F;
563 break;
564 default:
565 return NULL;
566 }
567 break;
568
9e103c9c
JL
569 case 21:
570 switch (field)
571 {
572 case e_lsel:
573 case e_lrsel:
574 final_type = R_PARISC_PCREL21L;
575 break;
576 default:
577 return NULL;
578 }
579 break;
580
581 default:
582 return NULL;
583 }
584 break;
585
fc91f658
JL
586 case R_PARISC_SEGREL32:
587 case R_PARISC_SEGBASE:
588 /* The defaults are fine for these cases. */
589 break;
590
9e103c9c
JL
591 default:
592 return NULL;
593 }
594
595 return final_types;
596}
597
598/* Translate from an elf into field into a howto relocation pointer. */
599
600static void
601elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
be7582f3 602 bfd *abfd;
9e103c9c
JL
603 arelent *bfd_reloc;
604 Elf_Internal_Rela *elf_reloc;
605{
606 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
607 < (unsigned int) R_PARISC_UNIMPLEMENTED);
608 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
609}
610
611/* Translate from an elf into field into a howto relocation pointer. */
612
613static void
614elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
be7582f3 615 bfd *abfd;
9e103c9c
JL
616 arelent *bfd_reloc;
617 Elf_Internal_Rel *elf_reloc;
618{
619 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
620 < (unsigned int) R_PARISC_UNIMPLEMENTED);
621 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
622}
623
624/* Return the address of the howto table entry to perform the CODE
625 relocation for an ARCH machine. */
626
627static reloc_howto_type *
628elf_hppa_reloc_type_lookup (abfd, code)
be7582f3 629 bfd *abfd;
9e103c9c
JL
630 bfd_reloc_code_real_type code;
631{
632 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
633 {
634 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
635 return &elf_hppa_howto_table[(int) code];
636 }
637 return NULL;
638}
95cbae0b
JL
639
640static void
641elf_hppa_final_write_processing (abfd, linker)
642 bfd *abfd;
be7582f3 643 boolean linker;
95cbae0b
JL
644{
645 int mach = bfd_get_mach (abfd);
646
647 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL
648 | EF_PARISC_EXT | EF_PARISC_LSB
649 | EF_PARISC_WIDE | EF_PARISC_NO_KABP
650 | EF_PARISC_LAZYSWAP);
651
652 if (mach == 10)
653 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0;
654 else if (mach == 11)
655 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1;
656 else if (mach == 20)
3a9acac8
JL
657 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0;
658 else if (mach == 25)
659 elf_elfheader (abfd)->e_flags |= EF_PARISC_WIDE | EFA_PARISC_2_0;
95cbae0b 660}
432bdd91
JL
661
662/* Return true if SYM represents a local label symbol. */
663
664static boolean
665elf_hppa_is_local_label_name (abfd, name)
666 bfd *abfd ATTRIBUTE_UNUSED;
667 const char *name;
668{
669 return (name[0] == 'L' && name[1] == '$');
670}
671
052e120f
JL
672/* Set the correct type for an ELF section. We do this by the
673 section name, which is a hack, but ought to work. */
674
675static boolean
676elf_hppa_fake_sections (abfd, hdr, sec)
677 bfd *abfd;
678 Elf64_Internal_Shdr *hdr;
679 asection *sec;
680{
681 register const char *name;
682
683 name = bfd_get_section_name (abfd, sec);
684
685 if (strcmp (name, ".PARISC.unwind") == 0)
686 {
1ca74062 687 int indx;
183df869 688 asection *sec;
052e120f
JL
689 hdr->sh_type = SHT_LOPROC + 1;
690 /* ?!? How are unwinds supposed to work for symbols in arbitrary
691 sections? Or what if we have multiple .text sections in a single
be7582f3 692 .o file? HP really messed up on this one.
052e120f 693
1ca74062
JL
694 Ugh. We can not use elf_section_data (sec)->this_idx at this
695 point because it is not initialized yet.
696
697 So we (gasp) recompute it here. Hopefully nobody ever changes the
698 way sections are numbered in elf.c! */
699 for (sec = abfd->sections, indx = 1; sec; sec = sec->next, indx++)
700 {
701 if (sec->name && strcmp (sec->name, ".text") == 0)
702 {
703 hdr->sh_info = indx;
704 break;
705 }
706 }
be7582f3 707
052e120f
JL
708 /* I have no idea if this is really necessary or what it means. */
709 hdr->sh_entsize = 4;
710 }
711 return true;
712}
713
2eb429af
JL
714/* Hook called by the linker routine which adds symbols from an object
715 file. HP's libraries define symbols with HP specific section
716 indices, which we have to handle. */
717
718static boolean
719elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
720 bfd *abfd;
721 struct bfd_link_info *info ATTRIBUTE_UNUSED;
722 const Elf_Internal_Sym *sym;
723 const char **namep ATTRIBUTE_UNUSED;
724 flagword *flagsp ATTRIBUTE_UNUSED;
725 asection **secp;
726 bfd_vma *valp;
727{
728 int index = sym->st_shndx;
be7582f3 729
2eb429af
JL
730 switch (index)
731 {
732 case SHN_PARISC_ANSI_COMMON:
733 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
734 (*secp)->flags |= SEC_IS_COMMON;
735 *valp = sym->st_size;
736 break;
be7582f3 737
2eb429af
JL
738 case SHN_PARISC_HUGE_COMMON:
739 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
740 (*secp)->flags |= SEC_IS_COMMON;
741 *valp = sym->st_size;
742 break;
743 }
744
745 return true;
746}
747
af7dc644
JL
748static boolean
749elf_hppa_unmark_useless_dynamic_symbols (h, data)
750 struct elf_link_hash_entry *h;
751 PTR data;
752{
753 struct bfd_link_info *info = (struct bfd_link_info *)data;
754
755 /* If we are not creating a shared library, and this symbol is
756 referenced by a shared library but is not defined anywhere, then
757 the generic code will warn that it is undefined.
758
759 This behavior is undesirable on HPs since the standard shared
760 libraries contain reerences to undefined symbols.
761
762 So we twiddle the flags associated with such symbols so that they
763 will not trigger the warning. ?!? FIXME. This is horribly fraglie.
764
765 Ultimately we should have better controls over the generic ELF BFD
766 linker code. */
767 if (! info->relocateable
768 && ! (info->shared
769 && !info->no_undefined)
770 && h->root.type == bfd_link_hash_undefined
771 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
772 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
773 {
774 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC;
775 h->elf_link_hash_flags |= 0x8000;
776 }
777
778 return true;
779}
780
781
782static boolean
783elf_hppa_remark_useless_dynamic_symbols (h, data)
784 struct elf_link_hash_entry *h;
785 PTR data;
786{
787 struct bfd_link_info *info = (struct bfd_link_info *)data;
788
789 /* If we are not creating a shared library, and this symbol is
790 referenced by a shared library but is not defined anywhere, then
791 the generic code will warn that it is undefined.
792
793 This behavior is undesirable on HPs since the standard shared
794 libraries contain reerences to undefined symbols.
795
796 So we twiddle the flags associated with such symbols so that they
228d307f 797 will not trigger the warning. ?!? FIXME. This is horribly fragile.
af7dc644
JL
798
799 Ultimately we should have better controls over the generic ELF BFD
800 linker code. */
801 if (! info->relocateable
802 && ! (info->shared
803 && !info->no_undefined)
804 && h->root.type == bfd_link_hash_undefined
805 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
806 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
807 && (h->elf_link_hash_flags & 0x8000) != 0)
808 {
809 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
810 h->elf_link_hash_flags &= ~0x8000;
811 }
812
813 return true;
814}
815
2ec0dd12
JL
816/* Record the lowest address for the data and text segments. */
817static void
818elf_hppa_record_segment_addrs (abfd, section, data)
819 bfd *abfd ATTRIBUTE_UNUSED;
820 asection *section;
821 PTR data;
822{
823 struct elf64_hppa_link_hash_table *hppa_info;
824 bfd_vma value;
825
826 hppa_info = (struct elf64_hppa_link_hash_table *)data;
827
828 value = section->vma - section->filepos;
829
830 if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
831 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
832 && value < hppa_info->text_segment_base)
833 hppa_info->text_segment_base = value;
834 else if ((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
835 == (SEC_ALLOC | SEC_LOAD))
836 && value < hppa_info->data_segment_base)
837 hppa_info->data_segment_base = value;
838}
839
2eb429af
JL
840/* Called after we have seen all the input files/sections, but before
841 final symbol resolution and section placement has been determined.
842
843 We use this hook to (possibly) provide a value for __gp, then we
844 fall back to the generic ELF final link routine. */
845
846static boolean
847elf_hppa_final_link (abfd, info)
848 bfd *abfd;
849 struct bfd_link_info *info;
850{
af7dc644
JL
851 boolean retval;
852
19ef5465 853 if (! info->relocateable)
2eb429af 854 {
2eb429af 855 struct elf_link_hash_entry *gp;
19ef5465 856 bfd_vma gp_val;
1209c612 857 struct elf64_hppa_link_hash_table *hppa_info;
2eb429af 858
1209c612
JL
859 hppa_info = elf64_hppa_hash_table (info);
860
861 /* The linker script defines a value for __gp iff it was referenced
862 by one of the objects being linked. First try to find the symbol
863 in the hash table. If that fails, just compute the value __gp
864 should have had. */
19ef5465
JL
865 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
866 false, false);
2eb429af 867
1209c612
JL
868 if (gp)
869 {
870
871 /* Adjust the value of __gp as we may want to slide it into the
872 .plt section so that the stubs can access PLT entries without
873 using an addil sequence. */
874 gp->root.u.def.value += elf64_hppa_hash_table (info)->gp_offset;
875
876 gp_val = (gp->root.u.def.section->output_section->vma
877 + gp->root.u.def.section->output_offset
878 + gp->root.u.def.value);
879 }
880 else
881 {
882 asection *sec;
883
884
885 /* First look for a .plt section. If found, then __gp is the
886 address of the .plt + gp_offset.
887
888 If no .plt is found, then look for .dlt, .opd and .data (in
889 that order) and set __gp to the base address of whichever section
890 is found first. */
891
892 sec = hppa_info->plt_sec;
893 if (sec)
894 gp_val = (sec->output_offset
895 + sec->output_section->vma
896 + hppa_info->gp_offset);
897 else
898 {
899 sec = hppa_info->dlt_sec;
900 if (!sec)
901 sec = hppa_info->opd_sec;
902 if (!sec)
903 sec = bfd_get_section_by_name (abfd, ".data");
904 if (!sec)
905 return false;
906
907 gp_val = sec->output_offset + sec->output_section->vma;
908 }
909 }
2eb429af 910
1209c612 911 /* Install whatever value we found/computed for __gp. */
2eb429af
JL
912 _bfd_set_gp_value (abfd, gp_val);
913 }
914
2ec0dd12
JL
915 /* We need to know the base of the text and data segments so that we
916 can perform SEGREL relocations. We will recore the base addresses
917 when we encounter the first SEGREL relocation. */
918 elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
919 elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
920
af7dc644
JL
921 /* HP's shared libraries have references to symbols that are not
922 defined anywhere. The generic ELF BFD linker code will complaim
923 about such symbols.
924
925 So we detect the losing case and arrange for the flags on the symbol
926 to indicate that it was never referenced. This keeps the generic
927 ELF BFD link code happy and appears to not create any secondary
928 problems. Ultimately we need a way to control the behavior of the
929 generic ELF BFD link code better. */
930 elf_link_hash_traverse (elf_hash_table (info),
931 elf_hppa_unmark_useless_dynamic_symbols,
932 info);
933
2eb429af 934 /* Invoke the regular ELF backend linker to do all the work. */
af7dc644
JL
935 retval = bfd_elf_bfd_final_link (abfd, info);
936
937 elf_link_hash_traverse (elf_hash_table (info),
938 elf_hppa_remark_useless_dynamic_symbols,
939 info);
940
941 return retval;
2eb429af
JL
942}
943
944/* Relocate an HPPA ELF section. */
945
946static boolean
947elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
948 contents, relocs, local_syms, local_sections)
949 bfd *output_bfd;
950 struct bfd_link_info *info;
951 bfd *input_bfd;
952 asection *input_section;
953 bfd_byte *contents;
954 Elf_Internal_Rela *relocs;
955 Elf_Internal_Sym *local_syms;
956 asection **local_sections;
957{
958 Elf_Internal_Shdr *symtab_hdr;
959 Elf_Internal_Rela *rel;
960 Elf_Internal_Rela *relend;
be7582f3 961 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
962
963 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
964
965 rel = relocs;
966 relend = relocs + input_section->reloc_count;
967 for (; rel < relend; rel++)
968 {
969 int r_type;
b2e311df 970 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af
JL
971 unsigned long r_symndx;
972 struct elf_link_hash_entry *h;
973 Elf_Internal_Sym *sym;
974 asection *sym_sec;
975 bfd_vma relocation;
976 bfd_reloc_status_type r;
977 const char *sym_name;
be7582f3
JL
978 char *dyn_name;
979 char *dynh_buf = NULL;
980 size_t dynh_buflen = 0;
981 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af
JL
982
983 r_type = ELF_R_TYPE (rel->r_info);
984 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
985 {
986 bfd_set_error (bfd_error_bad_value);
987 return false;
988 }
2eb429af
JL
989
990 r_symndx = ELF_R_SYM (rel->r_info);
991
992 if (info->relocateable)
993 {
994 /* This is a relocateable link. We don't have to change
995 anything, unless the reloc is against a section symbol,
996 in which case we have to adjust according to where the
997 section symbol winds up in the output section. */
998 if (r_symndx < symtab_hdr->sh_info)
999 {
1000 sym = local_syms + r_symndx;
1001 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1002 {
1003 sym_sec = local_sections[r_symndx];
1004 rel->r_addend += sym_sec->output_offset;
1005 }
1006 }
1007
1008 continue;
1009 }
1010
1011 /* This is a final link. */
1012 h = NULL;
1013 sym = NULL;
1014 sym_sec = NULL;
1015 if (r_symndx < symtab_hdr->sh_info)
1016 {
be7582f3 1017 /* This is a local symbol. */
2eb429af
JL
1018 sym = local_syms + r_symndx;
1019 sym_sec = local_sections[r_symndx];
1020 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
1021 ? 0 : sym->st_value)
1022 + sym_sec->output_offset
1023 + sym_sec->output_section->vma);
be7582f3
JL
1024
1025 /* If this symbol has an entry in the PA64 dynamic hash
1026 table, then get it. */
1027 dyn_name = get_dyn_name (input_bfd, h, rel,
1028 &dynh_buf, &dynh_buflen);
1029 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1030 dyn_name, false, false);
1031
2eb429af
JL
1032 }
1033 else
1034 {
be7582f3 1035 /* This is not a local symbol. */
2eb429af
JL
1036 long indx;
1037
1038 indx = r_symndx - symtab_hdr->sh_info;
1039 h = elf_sym_hashes (input_bfd)[indx];
1040 while (h->root.type == bfd_link_hash_indirect
1041 || h->root.type == bfd_link_hash_warning)
1042 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1043 if (h->root.type == bfd_link_hash_defined
1044 || h->root.type == bfd_link_hash_defweak)
1045 {
1046 sym_sec = h->root.u.def.section;
be7582f3 1047
be7582f3
JL
1048 /* If this symbol has an entry in the PA64 dynamic hash
1049 table, then get it. */
1050 dyn_name = get_dyn_name (input_bfd, h, rel,
1051 &dynh_buf, &dynh_buflen);
1052 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1053 dyn_name, false, false);
1054
1055 /* If we have a relocation against a symbol defined in a
1056 shared library and we have not created an entry in the
1057 PA64 dynamic symbol hash table for it, then we lose. */
1058 if (sym_sec->output_section == NULL && dyn_h == NULL)
1059 {
1060 (*_bfd_error_handler)
1061 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1062 bfd_get_filename (input_bfd), h->root.root.string,
1063 bfd_get_section_name (input_bfd, input_section));
1064 relocation = 0;
1065 }
1066 else if (sym_sec->output_section)
1067 relocation = (h->root.u.def.value
1068 + sym_sec->output_offset
1069 + sym_sec->output_section->vma);
1070 /* Value will be provided via one of the offsets in the
1071 dyn_h hash table entry. */
1072 else
1073 relocation = 0;
2eb429af 1074 }
dfec422f
JL
1075 /* Allow undefined symbols in shared libraries. */
1076 else if (info->shared && !info->symbolic && !info->no_undefined)
1077 {
1078 /* If this symbol has an entry in the PA64 dynamic hash
1079 table, then get it. */
1080 dyn_name = get_dyn_name (input_bfd, h, rel,
1081 &dynh_buf, &dynh_buflen);
1082 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1083 dyn_name, false, false);
1084
1085 if (dyn_h == NULL)
1086 {
1087 (*_bfd_error_handler)
1088 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1089 bfd_get_filename (input_bfd), h->root.root.string,
1090 bfd_get_section_name (input_bfd, input_section));
1091 relocation = 0;
1092 }
1093 relocation = 0;
1094 }
2eb429af
JL
1095 else if (h->root.type == bfd_link_hash_undefweak)
1096 relocation = 0;
1097 else
1098 {
1099 if (!((*info->callbacks->undefined_symbol)
1100 (info, h->root.root.string, input_bfd,
1101 input_section, rel->r_offset)))
1102 return false;
1103 break;
1104 }
1105 }
1106
1107 if (h != NULL)
1108 sym_name = h->root.root.string;
1109 else
1110 {
1111 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1112 symtab_hdr->sh_link,
1113 sym->st_name);
1114 if (sym_name == NULL)
1115 return false;
1116 if (*sym_name == '\0')
1117 sym_name = bfd_section_name (input_bfd, sym_sec);
1118 }
1119
be7582f3 1120 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2eb429af 1121 input_section, contents,
be7582f3
JL
1122 relocation, info, sym_sec,
1123 h, dyn_h);
2eb429af
JL
1124
1125 if (r != bfd_reloc_ok)
1126 {
1127 switch (r)
1128 {
1129 default:
1130 abort ();
1131 case bfd_reloc_overflow:
1132 {
1133 if (!((*info->callbacks->reloc_overflow)
1134 (info, sym_name, howto->name, (bfd_vma) 0,
1135 input_bfd, input_section, rel->r_offset)))
1136 return false;
1137 }
1138 break;
1139 }
1140 }
1141 }
1142 return true;
1143}
1144
1145
be7582f3
JL
1146/* Compute the value for a relocation (REL) during a final link stage,
1147 then insert the value into the proper location in CONTENTS.
1148
1149 VALUE is a tentative value for the relocation and may be overridden
1150 and modified here based on the specific relocation to be performed.
1151
1152 For example we do conversions for PC-relative branches in this routine
1153 or redirection of calls to external routines to stubs.
1154
1155 The work of actually applying the relocation is left to a helper
1156 routine in an attempt to reduce the complexity and size of this
1157 function. */
2eb429af
JL
1158
1159static bfd_reloc_status_type
be7582f3
JL
1160elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1161 input_section, contents, value,
1162 info, sym_sec, h, dyn_h)
1163 Elf_Internal_Rela *rel;
2eb429af 1164 bfd *input_bfd;
be7582f3 1165 bfd *output_bfd;
2eb429af
JL
1166 asection *input_section;
1167 bfd_byte *contents;
2eb429af 1168 bfd_vma value;
2eb429af
JL
1169 struct bfd_link_info *info;
1170 asection *sym_sec;
be7582f3
JL
1171 struct elf_link_hash_entry *h;
1172 struct elf64_hppa_dyn_hash_entry *dyn_h;
2eb429af
JL
1173{
1174 unsigned long insn;
be7582f3
JL
1175 bfd_vma offset = rel->r_offset;
1176 bfd_vma addend = rel->r_addend;
1177 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af 1178 unsigned long r_type = howto->type;
2eb429af
JL
1179 unsigned long r_field = e_fsel;
1180 bfd_byte *hit_data = contents + offset;
be7582f3 1181 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1182
1183 insn = bfd_get_32 (input_bfd, hit_data);
1184
2eb429af
JL
1185 switch (r_type)
1186 {
1187 case R_PARISC_NONE:
1188 break;
1189
571047ad 1190 /* Random PC relative relocs. */
b233eaab
JL
1191 case R_PARISC_PCREL21L:
1192 case R_PARISC_PCREL14R:
1193 case R_PARISC_PCREL14F:
571047ad
JL
1194 case R_PARISC_PCREL14WR:
1195 case R_PARISC_PCREL14DR:
1196 case R_PARISC_PCREL16F:
1197 case R_PARISC_PCREL16WF:
1198 case R_PARISC_PCREL16DF:
1199 {
1200 if (r_type == R_PARISC_PCREL21L)
1201 r_field = e_lsel;
1202 else if (r_type == R_PARISC_PCREL14F
1203 || r_type == R_PARISC_PCREL16F
1204 || r_type == R_PARISC_PCREL16WF
1205 || r_type == R_PARISC_PCREL16DF)
1206 r_field = e_fsel;
1207 else
1208 r_field = e_rsel;
1209
1210 /* If this is a call to a function defined in another dynamic
1211 library, then redirect the call to the local stub for this
1212 function. */
dfec422f
JL
1213 if (sym_sec == NULL || sym_sec->output_section == NULL)
1214 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1215 + hppa_info->stub_sec->output_section->vma);
571047ad
JL
1216
1217 /* Turn VALUE into a proper PC relative address. */
1218 value -= (offset + input_section->output_offset
1219 + input_section->output_section->vma);
1220
1221 /* Adjust for any field selectors. */
1222 value = hppa_field_adjust (value, -8 + addend, r_field);
1223
1224 /* Apply the relocation to the given instruction. */
1225 insn = elf_hppa_relocate_insn (insn, value, r_type);
1226 break;
1227 }
1228
be7582f3
JL
1229 /* Basic function call support. I'm not entirely sure if PCREL14F is
1230 actually needed or even handled correctly.
1231
1232 Note for a call to a function defined in another dynamic library
1233 we want to redirect the call to a stub. */
2eb429af
JL
1234 case R_PARISC_PCREL22F:
1235 case R_PARISC_PCREL17F:
571047ad
JL
1236 case R_PARISC_PCREL22C:
1237 case R_PARISC_PCREL17C:
1238 case R_PARISC_PCREL17R:
2eb429af 1239 {
571047ad
JL
1240 if (r_type == R_PARISC_PCREL17R)
1241 r_field = e_rsel;
1242 else
1243 r_field = e_fsel;
1244
be7582f3
JL
1245 /* If this is a call to a function defined in another dynamic
1246 library, then redirect the call to the local stub for this
1247 function. */
dfec422f 1248 if (sym_sec == NULL || sym_sec->output_section == NULL)
6a0b9871
JL
1249 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1250 + hppa_info->stub_sec->output_section->vma);
be7582f3
JL
1251
1252 /* Turn VALUE into a proper PC relative address. */
1253 value -= (offset + input_section->output_offset
1254 + input_section->output_section->vma);
1255
1256 /* Adjust for any field selectors. */
571047ad 1257 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1258
be7582f3
JL
1259 /* All branches are implicitly shifted by 2 places. */
1260 value >>= 2;
2eb429af 1261
be7582f3
JL
1262 /* Apply the relocation to the given instruction. */
1263 insn = elf_hppa_relocate_insn (insn, value, r_type);
2eb429af
JL
1264 break;
1265 }
1266
be7582f3
JL
1267 /* Indirect references to data through the DLT. */
1268 case R_PARISC_DLTIND14R:
571047ad 1269 case R_PARISC_DLTIND14F:
be7582f3
JL
1270 case R_PARISC_DLTIND14DR:
1271 case R_PARISC_DLTIND14WR:
1272 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1273 case R_PARISC_LTOFF_FPTR14R:
1274 case R_PARISC_LTOFF_FPTR14DR:
1275 case R_PARISC_LTOFF_FPTR14WR:
1276 case R_PARISC_LTOFF_FPTR21L:
1277 case R_PARISC_LTOFF_FPTR16F:
1278 case R_PARISC_LTOFF_FPTR16WF:
1279 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1280 case R_PARISC_LTOFF_TP21L:
1281 case R_PARISC_LTOFF_TP14R:
1282 case R_PARISC_LTOFF_TP14F:
1283 case R_PARISC_LTOFF_TP14WR:
1284 case R_PARISC_LTOFF_TP14DR:
1285 case R_PARISC_LTOFF_TP16F:
1286 case R_PARISC_LTOFF_TP16WF:
1287 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1288 case R_PARISC_LTOFF16F:
1289 case R_PARISC_LTOFF16WF:
1290 case R_PARISC_LTOFF16DF:
c8933571 1291 {
6a0b9871
JL
1292 /* If this relocation was against a local symbol, then we still
1293 have not set up the DLT entry (it's not convienent to do so
1294 in the "finalize_dlt" routine because it is difficult to get
1295 to the local symbol's value).
1296
1297 So, if this is a local symbol (h == NULL), then we need to
e48c661e
JL
1298 fill in its DLT entry.
1299
1300 Similarly we may still need to set up an entry in .opd for
1301 a local function which had its address taken. */
6a0b9871
JL
1302 if (dyn_h->h == NULL)
1303 {
1304 bfd_put_64 (hppa_info->dlt_sec->owner,
1305 value,
1306 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1307
1308 /* Now handle .opd creation if needed. */
1309 if (r_type == R_PARISC_LTOFF_FPTR14R
1310 || r_type == R_PARISC_LTOFF_FPTR14DR
1311 || r_type == R_PARISC_LTOFF_FPTR14WR
1312 || r_type == R_PARISC_LTOFF_FPTR21L
1313 || r_type == R_PARISC_LTOFF_FPTR16F
1314 || r_type == R_PARISC_LTOFF_FPTR16WF
1315 || r_type == R_PARISC_LTOFF_FPTR16DF)
1316 {
1317 /* The first two words of an .opd entry are zero. */
1318 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1319 0, 16);
1320
1321 /* The next word is the address of the function. */
1322 bfd_put_64 (hppa_info->opd_sec->owner, value,
1323 (hppa_info->opd_sec->contents
1324 + dyn_h->opd_offset + 16));
1325
1326 /* The last word is our local __gp value. */
1327 value = _bfd_get_gp_value
1328 (hppa_info->opd_sec->output_section->owner);
1329 bfd_put_64 (hppa_info->opd_sec->owner, value,
1330 (hppa_info->opd_sec->contents
1331 + dyn_h->opd_offset + 24));
1332 }
6a0b9871
JL
1333 }
1334
be7582f3 1335 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1336 the symbol's actual address. Note that __gp may not point
1337 to the start of the DLT, so we have to compute the absolute
1338 address, then subtract out the value of __gp. */
1339 value = (dyn_h->dlt_offset
1340 + hppa_info->dlt_sec->output_offset
1341 + hppa_info->dlt_sec->output_section->vma);
1342 value -= _bfd_get_gp_value (output_bfd);
1343
be7582f3
JL
1344
1345 /* All DLTIND relocations are basically the same at this point,
1346 except that we need different field selectors for the 21bit
1347 version vs the 14bit versions. */
e5bb3efc 1348 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1349 || r_type == R_PARISC_LTOFF_FPTR21L
1350 || r_type == R_PARISC_LTOFF_TP21L)
be7582f3 1351 value = hppa_field_adjust (value, addend, e_lrsel);
571047ad
JL
1352 else if (r_type == R_PARISC_DLTIND14F
1353 || r_type == R_PARISC_LTOFF_FPTR16F
1354 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1355 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1356 || r_type == R_PARISC_LTOFF16F
1357 || r_type == R_PARISC_LTOFF16DF
1358 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1359 || r_type == R_PARISC_LTOFF_TP16F
1360 || r_type == R_PARISC_LTOFF_TP16WF
1361 || r_type == R_PARISC_LTOFF_TP16DF)
e5bb3efc 1362 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1363 else
1364 value = hppa_field_adjust (value, addend, e_rrsel);
1365
1366 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1367 break;
1368 }
1369
be7582f3 1370 case R_PARISC_DLTREL14R:
571047ad 1371 case R_PARISC_DLTREL14F:
be7582f3
JL
1372 case R_PARISC_DLTREL14DR:
1373 case R_PARISC_DLTREL14WR:
c8933571 1374 case R_PARISC_DLTREL21L:
6849fb4d
JL
1375 case R_PARISC_DPREL21L:
1376 case R_PARISC_DPREL14WR:
1377 case R_PARISC_DPREL14DR:
1378 case R_PARISC_DPREL14R:
1379 case R_PARISC_DPREL14F:
1380 case R_PARISC_GPREL16F:
1381 case R_PARISC_GPREL16WF:
1382 case R_PARISC_GPREL16DF:
c8933571 1383 {
be7582f3
JL
1384 /* Subtract out the global pointer value to make value a DLT
1385 relative address. */
1386 value -= _bfd_get_gp_value (output_bfd);
1387
1388 /* All DLTREL relocations are basically the same at this point,
1389 except that we need different field selectors for the 21bit
1390 version vs the 14bit versions. */
6849fb4d
JL
1391 if (r_type == R_PARISC_DLTREL21L
1392 || r_type == R_PARISC_DPREL21L)
be7582f3 1393 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1394 else if (r_type == R_PARISC_DLTREL14F
1395 || r_type == R_PARISC_DPREL14F
1396 || r_type == R_PARISC_GPREL16F
1397 || r_type == R_PARISC_GPREL16WF
1398 || r_type == R_PARISC_GPREL16DF)
571047ad 1399 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1400 else
1401 value = hppa_field_adjust (value, addend, e_rrsel);
1402
1403 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1404 break;
1405 }
1406
b7263961
JL
1407 case R_PARISC_DIR21L:
1408 case R_PARISC_DIR17R:
1409 case R_PARISC_DIR17F:
1410 case R_PARISC_DIR14R:
1411 case R_PARISC_DIR14WR:
1412 case R_PARISC_DIR14DR:
1413 case R_PARISC_DIR16F:
1414 case R_PARISC_DIR16WF:
1415 case R_PARISC_DIR16DF:
1416 {
1417 /* All DIR relocations are basically the same at this point,
1418 except that we need different field selectors for the 21bit
1419 version vs the 14bit versions. */
1420 if (r_type == R_PARISC_DIR21L)
1421 value = hppa_field_adjust (value, addend, e_lrsel);
1422 else if (r_type == R_PARISC_DIR17F
1423 || r_type == R_PARISC_DIR16F
1424 || r_type == R_PARISC_DIR16WF
1425 || r_type == R_PARISC_DIR16DF)
1426 value = hppa_field_adjust (value, addend, e_fsel);
1427 else
1428 value = hppa_field_adjust (value, addend, e_rrsel);
1429
1430 insn = elf_hppa_relocate_insn (insn, value, r_type);
1431 break;
1432 }
1433
8267b155
JL
1434 case R_PARISC_PLTOFF21L:
1435 case R_PARISC_PLTOFF14R:
1436 case R_PARISC_PLTOFF14F:
1437 case R_PARISC_PLTOFF14WR:
1438 case R_PARISC_PLTOFF14DR:
1439 case R_PARISC_PLTOFF16F:
1440 case R_PARISC_PLTOFF16WF:
1441 case R_PARISC_PLTOFF16DF:
1442 {
1443 /* We want the value of the PLT offset for this symbol, not
19ef5465
JL
1444 the symbol's actual address. Note that __gp may not point
1445 to the start of the DLT, so we have to compute the absolute
1446 address, then subtract out the value of __gp. */
1447 value = (dyn_h->plt_offset
1448 + hppa_info->plt_sec->output_offset
1449 + hppa_info->plt_sec->output_section->vma);
1450 value -= _bfd_get_gp_value (output_bfd);
8267b155
JL
1451
1452 /* All PLTOFF relocations are basically the same at this point,
1453 except that we need different field selectors for the 21bit
1454 version vs the 14bit versions. */
1455 if (r_type == R_PARISC_PLTOFF21L)
1456 value = hppa_field_adjust (value, addend, e_lrsel);
1457 else if (r_type == R_PARISC_PLTOFF14F
1458 || r_type == R_PARISC_PLTOFF16F
1459 || r_type == R_PARISC_PLTOFF16WF
1460 || r_type == R_PARISC_PLTOFF16DF)
1461 value = hppa_field_adjust (value, addend, e_fsel);
1462 else
1463 value = hppa_field_adjust (value, addend, e_rrsel);
1464
1465 insn = elf_hppa_relocate_insn (insn, value, r_type);
1466 break;
1467 }
1468
e5bb3efc
JL
1469 case R_PARISC_LTOFF_FPTR32:
1470 {
e48c661e
JL
1471 /* We may still need to create the FPTR itself if it was for
1472 a local symbol. */
1473 if (dyn_h->h == NULL)
1474 {
1475 /* The first two words of an .opd entry are zero. */
1476 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1477
1478 /* The next word is the address of the function. */
1479 bfd_put_64 (hppa_info->opd_sec->owner, value,
1480 (hppa_info->opd_sec->contents
1481 + dyn_h->opd_offset + 16));
1482
1483 /* The last word is our local __gp value. */
1484 value = _bfd_get_gp_value
1485 (hppa_info->opd_sec->output_section->owner);
1486 bfd_put_64 (hppa_info->opd_sec->owner, value,
1487 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1488 }
1489
e5bb3efc 1490 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1491 the symbol's actual address. Note that __gp may not point
1492 to the start of the DLT, so we have to compute the absolute
1493 address, then subtract out the value of __gp. */
1494 value = (dyn_h->dlt_offset
1495 + hppa_info->dlt_sec->output_offset
1496 + hppa_info->dlt_sec->output_section->vma);
1497 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1498 bfd_put_32 (input_bfd, value, hit_data);
1499 return bfd_reloc_ok;
1500 }
1501
e5bb3efc 1502 case R_PARISC_LTOFF_FPTR64:
b233eaab 1503 case R_PARISC_LTOFF_TP64:
e5bb3efc 1504 {
e48c661e
JL
1505 /* We may still need to create the FPTR itself if it was for
1506 a local symbol. */
1507 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1508 {
1509 /* The first two words of an .opd entry are zero. */
1510 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1511
1512 /* The next word is the address of the function. */
1513 bfd_put_64 (hppa_info->opd_sec->owner, value,
1514 (hppa_info->opd_sec->contents
1515 + dyn_h->opd_offset + 16));
1516
1517 /* The last word is our local __gp value. */
1518 value = _bfd_get_gp_value
1519 (hppa_info->opd_sec->output_section->owner);
1520 bfd_put_64 (hppa_info->opd_sec->owner, value,
1521 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1522 }
1523
e5bb3efc 1524 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1525 the symbol's actual address. Note that __gp may not point
1526 to the start of the DLT, so we have to compute the absolute
1527 address, then subtract out the value of __gp. */
1528 value = (dyn_h->dlt_offset
1529 + hppa_info->dlt_sec->output_offset
1530 + hppa_info->dlt_sec->output_section->vma);
1531 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1532 bfd_put_64 (input_bfd, value, hit_data);
1533 return bfd_reloc_ok;
1534 }
1535
1536 case R_PARISC_DIR32:
571047ad 1537 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1538 return bfd_reloc_ok;
1539
1540 case R_PARISC_DIR64:
571047ad 1541 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1542 return bfd_reloc_ok;
1543
6849fb4d
JL
1544 case R_PARISC_GPREL64:
1545 /* Subtract out the global pointer value to make value a DLT
1546 relative address. */
1547 value -= _bfd_get_gp_value (output_bfd);
1548 value += addend;
1549
1550 bfd_put_64 (input_bfd, value + addend, hit_data);
1551 return bfd_reloc_ok;
1552
b7263961 1553 case R_PARISC_LTOFF64:
19ef5465
JL
1554 /* We want the value of the DLT offset for this symbol, not
1555 the symbol's actual address. Note that __gp may not point
1556 to the start of the DLT, so we have to compute the absolute
1557 address, then subtract out the value of __gp. */
1558 value = (dyn_h->dlt_offset
1559 + hppa_info->dlt_sec->output_offset
1560 + hppa_info->dlt_sec->output_section->vma);
1561 value -= _bfd_get_gp_value (output_bfd);
b7263961
JL
1562
1563 bfd_put_64 (input_bfd, value + addend, hit_data);
1564 return bfd_reloc_ok;
1565
571047ad
JL
1566 case R_PARISC_PCREL32:
1567 {
1568 /* If this is a call to a function defined in another dynamic
1569 library, then redirect the call to the local stub for this
1570 function. */
dfec422f
JL
1571 if (sym_sec == NULL || sym_sec->output_section == NULL)
1572 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1573 + hppa_info->stub_sec->output_section->vma);
571047ad
JL
1574
1575 /* Turn VALUE into a proper PC relative address. */
1576 value -= (offset + input_section->output_offset
1577 + input_section->output_section->vma);
1578
b233eaab 1579 value += addend;
571047ad
JL
1580 value -= 8;
1581 bfd_put_64 (input_bfd, value, hit_data);
1582 return bfd_reloc_ok;
1583 }
1584
1585 case R_PARISC_PCREL64:
1586 {
1587 /* If this is a call to a function defined in another dynamic
1588 library, then redirect the call to the local stub for this
1589 function. */
dfec422f
JL
1590 if (sym_sec == NULL || sym_sec->output_section == NULL)
1591 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1592 + hppa_info->stub_sec->output_section->vma);
1593
571047ad
JL
1594
1595 /* Turn VALUE into a proper PC relative address. */
1596 value -= (offset + input_section->output_offset
1597 + input_section->output_section->vma);
1598
b233eaab 1599 value += addend;
571047ad
JL
1600 value -= 8;
1601 bfd_put_64 (input_bfd, value, hit_data);
1602 return bfd_reloc_ok;
1603 }
1604
1605
e5bb3efc 1606 case R_PARISC_FPTR64:
e48c661e
JL
1607 {
1608 /* We may still need to create the FPTR itself if it was for
1609 a local symbol. */
1610 if (dyn_h->h == NULL)
1611 {
1612 /* The first two words of an .opd entry are zero. */
1613 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1614
1615 /* The next word is the address of the function. */
1616 bfd_put_64 (hppa_info->opd_sec->owner, value,
1617 (hppa_info->opd_sec->contents
1618 + dyn_h->opd_offset + 16));
1619
1620 /* The last word is our local __gp value. */
1621 value = _bfd_get_gp_value
1622 (hppa_info->opd_sec->output_section->owner);
1623 bfd_put_64 (hppa_info->opd_sec->owner, value,
1624 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1625 }
1626
1627 /* We want the value of the OPD offset for this symbol, not
1628 the symbol's actual address. */
1629 value = (dyn_h->opd_offset
1630 + hppa_info->opd_sec->output_offset
1631 + hppa_info->opd_sec->output_section->vma);
6a0b9871 1632
e48c661e
JL
1633 bfd_put_64 (input_bfd, value + addend, hit_data);
1634 return bfd_reloc_ok;
1635 }
e5bb3efc 1636
228d307f
JL
1637 case R_PARISC_SECREL32:
1638 bfd_put_32 (input_bfd,
1639 (value + addend
1640 - sym_sec->output_section->vma),
1641 hit_data);
1642 return bfd_reloc_ok;
1643
1644 case R_PARISC_SEGREL32:
2ec0dd12
JL
1645 case R_PARISC_SEGREL64:
1646 {
1647 /* If this is the first SEGREL relocation, then initialize
1648 the segment base values. */
1649 if (hppa_info->text_segment_base == (bfd_vma) -1)
1650 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1651 elf64_hppa_hash_table (info));
1652
1653 /* VALUE holds the absolute address. We want to include the
1654 addend, then turn it into a segment relative address.
1655
1656 The segment is derived from SYM_SEC. We assume that there are
1657 only two segments of note in the resulting executable/shlib.
1658 A readonly segment (.text) and a readwrite segment (.data). */
1659 value += addend;
1660
1661 if (sym_sec->flags & SEC_CODE)
1662 value -= hppa_info->text_segment_base;
1663 else
1664 value -= hppa_info->data_segment_base;
1665
1666 if (r_type == R_PARISC_SEGREL32)
1667 bfd_put_32 (input_bfd, value, hit_data);
1668 else
1669 bfd_put_64 (input_bfd, value, hit_data);
1670 return bfd_reloc_ok;
1671 }
1672
228d307f 1673
2eb429af
JL
1674 /* Something we don't know how to handle. */
1675 default:
228d307f 1676 return bfd_reloc_notsupported;
2eb429af
JL
1677 }
1678
1679 /* Update the instruction word. */
1680 bfd_put_32 (input_bfd, insn, hit_data);
1681 return (bfd_reloc_ok);
1682}
1683
be7582f3
JL
1684/* Relocate the given INSN. VALUE should be the actual value we want
1685 to insert into the instruction, ie by this point we should not be
1686 concerned with computing an offset relative to the DLT, PC, etc.
1687 Instead this routine is meant to handle the bit manipulations needed
1688 to insert the relocation into the given instruction. */
2eb429af
JL
1689
1690static unsigned long
be7582f3 1691elf_hppa_relocate_insn (insn, sym_value, r_type)
2eb429af 1692 unsigned long insn;
2eb429af 1693 long sym_value;
c8933571 1694 unsigned long r_type;
2eb429af 1695{
c8933571 1696 switch (r_type)
2eb429af 1697 {
be7582f3
JL
1698 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1699 the "B" instruction. */
c8933571 1700 case R_PARISC_PCREL22F:
571047ad 1701 case R_PARISC_PCREL22C:
be7582f3
JL
1702 {
1703 unsigned int w3, w2, w1, w;
2eb429af 1704
be7582f3
JL
1705 /* These are 22 bit branches. Mask off bits we do not care
1706 about. */
1707 sym_value &= 0x3fffff;
2eb429af 1708
be7582f3
JL
1709 /* Now extract the W1, W2, W3 and W fields from the value. */
1710 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
2eb429af 1711
be7582f3
JL
1712 /* Mask out bits for the value in the instruction. */
1713 insn &= 0xfc00e002;
2eb429af 1714
be7582f3
JL
1715 /* Insert the bits for the W1, W2 and W fields into the
1716 instruction. */
1717 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1718 return insn;
1719 }
2eb429af 1720
be7582f3
JL
1721 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1722 the "B" instruction as well as BE. */
1723 case R_PARISC_PCREL17F:
c8933571 1724 case R_PARISC_DIR17F:
b7263961 1725 case R_PARISC_DIR17R:
571047ad
JL
1726 case R_PARISC_PCREL17C:
1727 case R_PARISC_PCREL17R:
2eb429af
JL
1728 {
1729 unsigned int w2, w1, w;
1730
2eb429af
JL
1731 /* These are 17 bit branches. Mask off bits we do not care
1732 about. */
1733 sym_value &= 0x1ffff;
1734
1735 /* Now extract the W1, W2 and W fields from the value. */
1736 dis_assemble_17 (sym_value, &w1, &w2, &w);
1737
1738 /* Mask out bits for the value in the instruction. */
1739 insn &= 0xffe0e002;
1740
1741 /* Insert the bits for the W1, W2 and W fields into the
1742 instruction. */
1743 insn |= (w2 << 2) | (w1 << 16) | w;
1744 return insn;
1745 }
1746
be7582f3 1747 /* ADDIL or LDIL instructions. */
c8933571 1748 case R_PARISC_DLTREL21L:
be7582f3 1749 case R_PARISC_DLTIND21L:
e5bb3efc 1750 case R_PARISC_LTOFF_FPTR21L:
b233eaab
JL
1751 case R_PARISC_PCREL21L:
1752 case R_PARISC_LTOFF_TP21L:
6849fb4d 1753 case R_PARISC_DPREL21L:
8267b155 1754 case R_PARISC_PLTOFF21L:
b7263961 1755 case R_PARISC_DIR21L:
c8933571
JL
1756 {
1757 int w;
1758
c8933571
JL
1759 /* Mask off bits in INSN we do not want. */
1760 insn &= 0xffe00000;
1761
1762 /* Turn the 21bit value into the proper format. */
1763 dis_assemble_21 (sym_value, &w);
1764
1765 /* And insert the proper bits into INSN. */
1766 return insn | w;
1767 }
be7582f3
JL
1768
1769 /* LDO and integer loads/stores with 14bit displacements. */
c8933571 1770 case R_PARISC_DLTREL14R:
084d930b 1771 case R_PARISC_DLTREL14F:
be7582f3
JL
1772 case R_PARISC_DLTIND14R:
1773 case R_PARISC_DLTIND14F:
e5bb3efc
JL
1774 case R_PARISC_LTOFF_FPTR14R:
1775 case R_PARISC_LTOFF_FPTR16F:
b233eaab 1776 case R_PARISC_PCREL14R:
571047ad
JL
1777 case R_PARISC_PCREL14F:
1778 case R_PARISC_PCREL16F:
b233eaab
JL
1779 case R_PARISC_LTOFF_TP14R:
1780 case R_PARISC_LTOFF_TP14F:
1781 case R_PARISC_LTOFF_TP16F:
6849fb4d
JL
1782 case R_PARISC_DPREL14R:
1783 case R_PARISC_DPREL14F:
1784 case R_PARISC_GPREL16F:
8267b155
JL
1785 case R_PARISC_PLTOFF14R:
1786 case R_PARISC_PLTOFF14F:
1787 case R_PARISC_PLTOFF16F:
b7263961
JL
1788 case R_PARISC_DIR14R:
1789 case R_PARISC_DIR16F:
1790 case R_PARISC_LTOFF16F:
c8933571
JL
1791 {
1792 int w;
1793
c8933571
JL
1794 /* Mask off bits in INSN we do not want. */
1795 insn &= 0xffffc000;
1796
1797 /* Turn the 14bit value into the proper format. */
1798 low_sign_unext (sym_value, 14, &w);
1799
1800 /* And insert the proper bits into INSN. */
1801 return insn | w;
1802 }
be7582f3
JL
1803
1804 /* Doubleword loads and stores with a 14bit displacement. */
11c19a4e 1805 case R_PARISC_DLTREL14DR:
be7582f3 1806 case R_PARISC_DLTIND14DR:
e5bb3efc
JL
1807 case R_PARISC_LTOFF_FPTR14DR:
1808 case R_PARISC_LTOFF_FPTR16DF:
571047ad
JL
1809 case R_PARISC_PCREL14DR:
1810 case R_PARISC_PCREL16DF:
b233eaab
JL
1811 case R_PARISC_LTOFF_TP14DR:
1812 case R_PARISC_LTOFF_TP16DF:
6849fb4d
JL
1813 case R_PARISC_DPREL14DR:
1814 case R_PARISC_GPREL16DF:
8267b155
JL
1815 case R_PARISC_PLTOFF14DR:
1816 case R_PARISC_PLTOFF16DF:
b7263961
JL
1817 case R_PARISC_DIR14DR:
1818 case R_PARISC_DIR16DF:
1819 case R_PARISC_LTOFF16DF:
11c19a4e 1820 {
11c19a4e
JL
1821 /* Mask off bits in INSN we do not want. */
1822 insn &= 0xffffc00e;
1823
1824 /* The sign bit at 14 moves into bit zero in the destination. */
1825 insn |= ((sym_value & 0x2000) >> 13);
1826
1827 /* Turn off the bits in sym_value we do not care about. */
1828 sym_value &= 0x1ff8;
1829
1830 /* Now shift it one bit position left so that it lines up with the
1831 destination field in INSN. */
1832 sym_value <<= 1;
1833
1834 return insn | sym_value;
1835 }
1836
be7582f3 1837 /* Floating point single word load/store instructions. */
11c19a4e 1838 case R_PARISC_DLTREL14WR:
be7582f3 1839 case R_PARISC_DLTIND14WR:
e5bb3efc
JL
1840 case R_PARISC_LTOFF_FPTR14WR:
1841 case R_PARISC_LTOFF_FPTR16WF:
571047ad
JL
1842 case R_PARISC_PCREL14WR:
1843 case R_PARISC_PCREL16WF:
b233eaab
JL
1844 case R_PARISC_LTOFF_TP14WR:
1845 case R_PARISC_LTOFF_TP16WF:
6849fb4d
JL
1846 case R_PARISC_DPREL14WR:
1847 case R_PARISC_GPREL16WF:
8267b155
JL
1848 case R_PARISC_PLTOFF14WR:
1849 case R_PARISC_PLTOFF16WF:
b7263961
JL
1850 case R_PARISC_DIR16WF:
1851 case R_PARISC_DIR14WR:
1852 case R_PARISC_LTOFF16WF:
11c19a4e 1853 {
11c19a4e
JL
1854 /* Mask off bits in INSN we do not want. */
1855 insn &= 0xffffc006;
1856
1857 /* The sign bit at 14 moves into bit zero in the destination. */
1858 insn |= ((sym_value & 0x2000) >> 13);
1859
1860 /* Turn off the bits in sym_value we do not care about. */
1861 sym_value &= 0x1ffc;
1862
1863 /* Now shift it one bit position left so that it lines up with the
1864 destination field in INSN. */
1865 sym_value <<= 1;
1866
1867 return insn | sym_value;
1868 }
be7582f3 1869
2eb429af
JL
1870 default:
1871 return insn;
1872 }
1873}
This page took 0.114481 seconds and 4 git commands to generate.