(elf_cpu32_plt0_entry): Use a1 instead of a0.
[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;
2eb429af 857
19ef5465
JL
858 /* The linker script defines a value for __gp, we just need to
859 install that value into magic place for the BFD. */
860 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
861 false, false);
2eb429af 862
19ef5465
JL
863 /* Adjust the value of __gp as we may want to slide it into the
864 .plt section so that the stubs can access PLT entries without
865 using an addil sequence. */
866 gp->root.u.def.value += elf64_hppa_hash_table (info)->gp_offset;
2eb429af 867
19ef5465
JL
868 gp_val = (gp->root.u.def.section->output_section->vma
869 + gp->root.u.def.section->output_offset
870 + gp->root.u.def.value);
2eb429af
JL
871 _bfd_set_gp_value (abfd, gp_val);
872 }
873
2ec0dd12
JL
874 /* We need to know the base of the text and data segments so that we
875 can perform SEGREL relocations. We will recore the base addresses
876 when we encounter the first SEGREL relocation. */
877 elf64_hppa_hash_table (info)->text_segment_base = (bfd_vma)-1;
878 elf64_hppa_hash_table (info)->data_segment_base = (bfd_vma)-1;
879
af7dc644
JL
880 /* HP's shared libraries have references to symbols that are not
881 defined anywhere. The generic ELF BFD linker code will complaim
882 about such symbols.
883
884 So we detect the losing case and arrange for the flags on the symbol
885 to indicate that it was never referenced. This keeps the generic
886 ELF BFD link code happy and appears to not create any secondary
887 problems. Ultimately we need a way to control the behavior of the
888 generic ELF BFD link code better. */
889 elf_link_hash_traverse (elf_hash_table (info),
890 elf_hppa_unmark_useless_dynamic_symbols,
891 info);
892
2eb429af 893 /* Invoke the regular ELF backend linker to do all the work. */
af7dc644
JL
894 retval = bfd_elf_bfd_final_link (abfd, info);
895
896 elf_link_hash_traverse (elf_hash_table (info),
897 elf_hppa_remark_useless_dynamic_symbols,
898 info);
899
900 return retval;
2eb429af
JL
901}
902
903/* Relocate an HPPA ELF section. */
904
905static boolean
906elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
907 contents, relocs, local_syms, local_sections)
908 bfd *output_bfd;
909 struct bfd_link_info *info;
910 bfd *input_bfd;
911 asection *input_section;
912 bfd_byte *contents;
913 Elf_Internal_Rela *relocs;
914 Elf_Internal_Sym *local_syms;
915 asection **local_sections;
916{
917 Elf_Internal_Shdr *symtab_hdr;
918 Elf_Internal_Rela *rel;
919 Elf_Internal_Rela *relend;
be7582f3 920 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
921
922 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
923
924 rel = relocs;
925 relend = relocs + input_section->reloc_count;
926 for (; rel < relend; rel++)
927 {
928 int r_type;
b2e311df 929 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af
JL
930 unsigned long r_symndx;
931 struct elf_link_hash_entry *h;
932 Elf_Internal_Sym *sym;
933 asection *sym_sec;
934 bfd_vma relocation;
935 bfd_reloc_status_type r;
936 const char *sym_name;
be7582f3
JL
937 char *dyn_name;
938 char *dynh_buf = NULL;
939 size_t dynh_buflen = 0;
940 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL;
2eb429af
JL
941
942 r_type = ELF_R_TYPE (rel->r_info);
943 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
944 {
945 bfd_set_error (bfd_error_bad_value);
946 return false;
947 }
2eb429af
JL
948
949 r_symndx = ELF_R_SYM (rel->r_info);
950
951 if (info->relocateable)
952 {
953 /* This is a relocateable link. We don't have to change
954 anything, unless the reloc is against a section symbol,
955 in which case we have to adjust according to where the
956 section symbol winds up in the output section. */
957 if (r_symndx < symtab_hdr->sh_info)
958 {
959 sym = local_syms + r_symndx;
960 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
961 {
962 sym_sec = local_sections[r_symndx];
963 rel->r_addend += sym_sec->output_offset;
964 }
965 }
966
967 continue;
968 }
969
970 /* This is a final link. */
971 h = NULL;
972 sym = NULL;
973 sym_sec = NULL;
974 if (r_symndx < symtab_hdr->sh_info)
975 {
be7582f3 976 /* This is a local symbol. */
2eb429af
JL
977 sym = local_syms + r_symndx;
978 sym_sec = local_sections[r_symndx];
979 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
980 ? 0 : sym->st_value)
981 + sym_sec->output_offset
982 + sym_sec->output_section->vma);
be7582f3
JL
983
984 /* If this symbol has an entry in the PA64 dynamic hash
985 table, then get it. */
986 dyn_name = get_dyn_name (input_bfd, h, rel,
987 &dynh_buf, &dynh_buflen);
988 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
989 dyn_name, false, false);
990
2eb429af
JL
991 }
992 else
993 {
be7582f3 994 /* This is not a local symbol. */
2eb429af
JL
995 long indx;
996
997 indx = r_symndx - symtab_hdr->sh_info;
998 h = elf_sym_hashes (input_bfd)[indx];
999 while (h->root.type == bfd_link_hash_indirect
1000 || h->root.type == bfd_link_hash_warning)
1001 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1002 if (h->root.type == bfd_link_hash_defined
1003 || h->root.type == bfd_link_hash_defweak)
1004 {
1005 sym_sec = h->root.u.def.section;
be7582f3 1006
be7582f3
JL
1007 /* If this symbol has an entry in the PA64 dynamic hash
1008 table, then get it. */
1009 dyn_name = get_dyn_name (input_bfd, h, rel,
1010 &dynh_buf, &dynh_buflen);
1011 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1012 dyn_name, false, false);
1013
1014 /* If we have a relocation against a symbol defined in a
1015 shared library and we have not created an entry in the
1016 PA64 dynamic symbol hash table for it, then we lose. */
1017 if (sym_sec->output_section == NULL && dyn_h == NULL)
1018 {
1019 (*_bfd_error_handler)
1020 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1021 bfd_get_filename (input_bfd), h->root.root.string,
1022 bfd_get_section_name (input_bfd, input_section));
1023 relocation = 0;
1024 }
1025 else if (sym_sec->output_section)
1026 relocation = (h->root.u.def.value
1027 + sym_sec->output_offset
1028 + sym_sec->output_section->vma);
1029 /* Value will be provided via one of the offsets in the
1030 dyn_h hash table entry. */
1031 else
1032 relocation = 0;
2eb429af 1033 }
dfec422f
JL
1034 /* Allow undefined symbols in shared libraries. */
1035 else if (info->shared && !info->symbolic && !info->no_undefined)
1036 {
1037 /* If this symbol has an entry in the PA64 dynamic hash
1038 table, then get it. */
1039 dyn_name = get_dyn_name (input_bfd, h, rel,
1040 &dynh_buf, &dynh_buflen);
1041 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1042 dyn_name, false, false);
1043
1044 if (dyn_h == NULL)
1045 {
1046 (*_bfd_error_handler)
1047 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
1048 bfd_get_filename (input_bfd), h->root.root.string,
1049 bfd_get_section_name (input_bfd, input_section));
1050 relocation = 0;
1051 }
1052 relocation = 0;
1053 }
2eb429af
JL
1054 else if (h->root.type == bfd_link_hash_undefweak)
1055 relocation = 0;
1056 else
1057 {
1058 if (!((*info->callbacks->undefined_symbol)
1059 (info, h->root.root.string, input_bfd,
1060 input_section, rel->r_offset)))
1061 return false;
1062 break;
1063 }
1064 }
1065
1066 if (h != NULL)
1067 sym_name = h->root.root.string;
1068 else
1069 {
1070 sym_name = bfd_elf_string_from_elf_section (input_bfd,
1071 symtab_hdr->sh_link,
1072 sym->st_name);
1073 if (sym_name == NULL)
1074 return false;
1075 if (*sym_name == '\0')
1076 sym_name = bfd_section_name (input_bfd, sym_sec);
1077 }
1078
be7582f3 1079 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
2eb429af 1080 input_section, contents,
be7582f3
JL
1081 relocation, info, sym_sec,
1082 h, dyn_h);
2eb429af
JL
1083
1084 if (r != bfd_reloc_ok)
1085 {
1086 switch (r)
1087 {
1088 default:
1089 abort ();
1090 case bfd_reloc_overflow:
1091 {
1092 if (!((*info->callbacks->reloc_overflow)
1093 (info, sym_name, howto->name, (bfd_vma) 0,
1094 input_bfd, input_section, rel->r_offset)))
1095 return false;
1096 }
1097 break;
1098 }
1099 }
1100 }
1101 return true;
1102}
1103
1104
be7582f3
JL
1105/* Compute the value for a relocation (REL) during a final link stage,
1106 then insert the value into the proper location in CONTENTS.
1107
1108 VALUE is a tentative value for the relocation and may be overridden
1109 and modified here based on the specific relocation to be performed.
1110
1111 For example we do conversions for PC-relative branches in this routine
1112 or redirection of calls to external routines to stubs.
1113
1114 The work of actually applying the relocation is left to a helper
1115 routine in an attempt to reduce the complexity and size of this
1116 function. */
2eb429af
JL
1117
1118static bfd_reloc_status_type
be7582f3
JL
1119elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
1120 input_section, contents, value,
1121 info, sym_sec, h, dyn_h)
1122 Elf_Internal_Rela *rel;
2eb429af 1123 bfd *input_bfd;
be7582f3 1124 bfd *output_bfd;
2eb429af
JL
1125 asection *input_section;
1126 bfd_byte *contents;
2eb429af 1127 bfd_vma value;
2eb429af
JL
1128 struct bfd_link_info *info;
1129 asection *sym_sec;
be7582f3
JL
1130 struct elf_link_hash_entry *h;
1131 struct elf64_hppa_dyn_hash_entry *dyn_h;
2eb429af
JL
1132{
1133 unsigned long insn;
be7582f3
JL
1134 bfd_vma offset = rel->r_offset;
1135 bfd_vma addend = rel->r_addend;
1136 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
2eb429af 1137 unsigned long r_type = howto->type;
2eb429af
JL
1138 unsigned long r_field = e_fsel;
1139 bfd_byte *hit_data = contents + offset;
be7582f3 1140 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
2eb429af
JL
1141
1142 insn = bfd_get_32 (input_bfd, hit_data);
1143
2eb429af
JL
1144 switch (r_type)
1145 {
1146 case R_PARISC_NONE:
1147 break;
1148
571047ad 1149 /* Random PC relative relocs. */
b233eaab
JL
1150 case R_PARISC_PCREL21L:
1151 case R_PARISC_PCREL14R:
1152 case R_PARISC_PCREL14F:
571047ad
JL
1153 case R_PARISC_PCREL14WR:
1154 case R_PARISC_PCREL14DR:
1155 case R_PARISC_PCREL16F:
1156 case R_PARISC_PCREL16WF:
1157 case R_PARISC_PCREL16DF:
1158 {
1159 if (r_type == R_PARISC_PCREL21L)
1160 r_field = e_lsel;
1161 else if (r_type == R_PARISC_PCREL14F
1162 || r_type == R_PARISC_PCREL16F
1163 || r_type == R_PARISC_PCREL16WF
1164 || r_type == R_PARISC_PCREL16DF)
1165 r_field = e_fsel;
1166 else
1167 r_field = e_rsel;
1168
1169 /* If this is a call to a function defined in another dynamic
1170 library, then redirect the call to the local stub for this
1171 function. */
dfec422f
JL
1172 if (sym_sec == NULL || sym_sec->output_section == NULL)
1173 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1174 + hppa_info->stub_sec->output_section->vma);
571047ad
JL
1175
1176 /* Turn VALUE into a proper PC relative address. */
1177 value -= (offset + input_section->output_offset
1178 + input_section->output_section->vma);
1179
1180 /* Adjust for any field selectors. */
1181 value = hppa_field_adjust (value, -8 + addend, r_field);
1182
1183 /* Apply the relocation to the given instruction. */
1184 insn = elf_hppa_relocate_insn (insn, value, r_type);
1185 break;
1186 }
1187
be7582f3
JL
1188 /* Basic function call support. I'm not entirely sure if PCREL14F is
1189 actually needed or even handled correctly.
1190
1191 Note for a call to a function defined in another dynamic library
1192 we want to redirect the call to a stub. */
2eb429af
JL
1193 case R_PARISC_PCREL22F:
1194 case R_PARISC_PCREL17F:
571047ad
JL
1195 case R_PARISC_PCREL22C:
1196 case R_PARISC_PCREL17C:
1197 case R_PARISC_PCREL17R:
2eb429af 1198 {
571047ad
JL
1199 if (r_type == R_PARISC_PCREL17R)
1200 r_field = e_rsel;
1201 else
1202 r_field = e_fsel;
1203
be7582f3
JL
1204 /* If this is a call to a function defined in another dynamic
1205 library, then redirect the call to the local stub for this
1206 function. */
dfec422f 1207 if (sym_sec == NULL || sym_sec->output_section == NULL)
6a0b9871
JL
1208 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1209 + hppa_info->stub_sec->output_section->vma);
be7582f3
JL
1210
1211 /* Turn VALUE into a proper PC relative address. */
1212 value -= (offset + input_section->output_offset
1213 + input_section->output_section->vma);
1214
1215 /* Adjust for any field selectors. */
571047ad 1216 value = hppa_field_adjust (value, -8 + addend, e_fsel);
2eb429af 1217
be7582f3
JL
1218 /* All branches are implicitly shifted by 2 places. */
1219 value >>= 2;
2eb429af 1220
be7582f3
JL
1221 /* Apply the relocation to the given instruction. */
1222 insn = elf_hppa_relocate_insn (insn, value, r_type);
2eb429af
JL
1223 break;
1224 }
1225
be7582f3
JL
1226 /* Indirect references to data through the DLT. */
1227 case R_PARISC_DLTIND14R:
571047ad 1228 case R_PARISC_DLTIND14F:
be7582f3
JL
1229 case R_PARISC_DLTIND14DR:
1230 case R_PARISC_DLTIND14WR:
1231 case R_PARISC_DLTIND21L:
e5bb3efc
JL
1232 case R_PARISC_LTOFF_FPTR14R:
1233 case R_PARISC_LTOFF_FPTR14DR:
1234 case R_PARISC_LTOFF_FPTR14WR:
1235 case R_PARISC_LTOFF_FPTR21L:
1236 case R_PARISC_LTOFF_FPTR16F:
1237 case R_PARISC_LTOFF_FPTR16WF:
1238 case R_PARISC_LTOFF_FPTR16DF:
b233eaab
JL
1239 case R_PARISC_LTOFF_TP21L:
1240 case R_PARISC_LTOFF_TP14R:
1241 case R_PARISC_LTOFF_TP14F:
1242 case R_PARISC_LTOFF_TP14WR:
1243 case R_PARISC_LTOFF_TP14DR:
1244 case R_PARISC_LTOFF_TP16F:
1245 case R_PARISC_LTOFF_TP16WF:
1246 case R_PARISC_LTOFF_TP16DF:
b7263961
JL
1247 case R_PARISC_LTOFF16F:
1248 case R_PARISC_LTOFF16WF:
1249 case R_PARISC_LTOFF16DF:
c8933571 1250 {
6a0b9871
JL
1251 /* If this relocation was against a local symbol, then we still
1252 have not set up the DLT entry (it's not convienent to do so
1253 in the "finalize_dlt" routine because it is difficult to get
1254 to the local symbol's value).
1255
1256 So, if this is a local symbol (h == NULL), then we need to
e48c661e
JL
1257 fill in its DLT entry.
1258
1259 Similarly we may still need to set up an entry in .opd for
1260 a local function which had its address taken. */
6a0b9871
JL
1261 if (dyn_h->h == NULL)
1262 {
1263 bfd_put_64 (hppa_info->dlt_sec->owner,
1264 value,
1265 hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
e48c661e
JL
1266
1267 /* Now handle .opd creation if needed. */
1268 if (r_type == R_PARISC_LTOFF_FPTR14R
1269 || r_type == R_PARISC_LTOFF_FPTR14DR
1270 || r_type == R_PARISC_LTOFF_FPTR14WR
1271 || r_type == R_PARISC_LTOFF_FPTR21L
1272 || r_type == R_PARISC_LTOFF_FPTR16F
1273 || r_type == R_PARISC_LTOFF_FPTR16WF
1274 || r_type == R_PARISC_LTOFF_FPTR16DF)
1275 {
1276 /* The first two words of an .opd entry are zero. */
1277 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset,
1278 0, 16);
1279
1280 /* The next word is the address of the function. */
1281 bfd_put_64 (hppa_info->opd_sec->owner, value,
1282 (hppa_info->opd_sec->contents
1283 + dyn_h->opd_offset + 16));
1284
1285 /* The last word is our local __gp value. */
1286 value = _bfd_get_gp_value
1287 (hppa_info->opd_sec->output_section->owner);
1288 bfd_put_64 (hppa_info->opd_sec->owner, value,
1289 (hppa_info->opd_sec->contents
1290 + dyn_h->opd_offset + 24));
1291 }
6a0b9871
JL
1292 }
1293
be7582f3 1294 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1295 the symbol's actual address. Note that __gp may not point
1296 to the start of the DLT, so we have to compute the absolute
1297 address, then subtract out the value of __gp. */
1298 value = (dyn_h->dlt_offset
1299 + hppa_info->dlt_sec->output_offset
1300 + hppa_info->dlt_sec->output_section->vma);
1301 value -= _bfd_get_gp_value (output_bfd);
1302
be7582f3
JL
1303
1304 /* All DLTIND relocations are basically the same at this point,
1305 except that we need different field selectors for the 21bit
1306 version vs the 14bit versions. */
e5bb3efc 1307 if (r_type == R_PARISC_DLTIND21L
b233eaab
JL
1308 || r_type == R_PARISC_LTOFF_FPTR21L
1309 || r_type == R_PARISC_LTOFF_TP21L)
be7582f3 1310 value = hppa_field_adjust (value, addend, e_lrsel);
571047ad
JL
1311 else if (r_type == R_PARISC_DLTIND14F
1312 || r_type == R_PARISC_LTOFF_FPTR16F
1313 || r_type == R_PARISC_LTOFF_FPTR16WF
b233eaab 1314 || r_type == R_PARISC_LTOFF_FPTR16DF
b7263961
JL
1315 || r_type == R_PARISC_LTOFF16F
1316 || r_type == R_PARISC_LTOFF16DF
1317 || r_type == R_PARISC_LTOFF16WF
b233eaab
JL
1318 || r_type == R_PARISC_LTOFF_TP16F
1319 || r_type == R_PARISC_LTOFF_TP16WF
1320 || r_type == R_PARISC_LTOFF_TP16DF)
e5bb3efc 1321 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1322 else
1323 value = hppa_field_adjust (value, addend, e_rrsel);
1324
1325 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1326 break;
1327 }
1328
be7582f3 1329 case R_PARISC_DLTREL14R:
571047ad 1330 case R_PARISC_DLTREL14F:
be7582f3
JL
1331 case R_PARISC_DLTREL14DR:
1332 case R_PARISC_DLTREL14WR:
c8933571 1333 case R_PARISC_DLTREL21L:
6849fb4d
JL
1334 case R_PARISC_DPREL21L:
1335 case R_PARISC_DPREL14WR:
1336 case R_PARISC_DPREL14DR:
1337 case R_PARISC_DPREL14R:
1338 case R_PARISC_DPREL14F:
1339 case R_PARISC_GPREL16F:
1340 case R_PARISC_GPREL16WF:
1341 case R_PARISC_GPREL16DF:
c8933571 1342 {
be7582f3
JL
1343 /* Subtract out the global pointer value to make value a DLT
1344 relative address. */
1345 value -= _bfd_get_gp_value (output_bfd);
1346
1347 /* All DLTREL relocations are basically the same at this point,
1348 except that we need different field selectors for the 21bit
1349 version vs the 14bit versions. */
6849fb4d
JL
1350 if (r_type == R_PARISC_DLTREL21L
1351 || r_type == R_PARISC_DPREL21L)
be7582f3 1352 value = hppa_field_adjust (value, addend, e_lrsel);
6849fb4d
JL
1353 else if (r_type == R_PARISC_DLTREL14F
1354 || r_type == R_PARISC_DPREL14F
1355 || r_type == R_PARISC_GPREL16F
1356 || r_type == R_PARISC_GPREL16WF
1357 || r_type == R_PARISC_GPREL16DF)
571047ad 1358 value = hppa_field_adjust (value, addend, e_fsel);
be7582f3
JL
1359 else
1360 value = hppa_field_adjust (value, addend, e_rrsel);
1361
1362 insn = elf_hppa_relocate_insn (insn, value, r_type);
c8933571
JL
1363 break;
1364 }
1365
b7263961
JL
1366 case R_PARISC_DIR21L:
1367 case R_PARISC_DIR17R:
1368 case R_PARISC_DIR17F:
1369 case R_PARISC_DIR14R:
1370 case R_PARISC_DIR14WR:
1371 case R_PARISC_DIR14DR:
1372 case R_PARISC_DIR16F:
1373 case R_PARISC_DIR16WF:
1374 case R_PARISC_DIR16DF:
1375 {
1376 /* All DIR relocations are basically the same at this point,
1377 except that we need different field selectors for the 21bit
1378 version vs the 14bit versions. */
1379 if (r_type == R_PARISC_DIR21L)
1380 value = hppa_field_adjust (value, addend, e_lrsel);
1381 else if (r_type == R_PARISC_DIR17F
1382 || r_type == R_PARISC_DIR16F
1383 || r_type == R_PARISC_DIR16WF
1384 || r_type == R_PARISC_DIR16DF)
1385 value = hppa_field_adjust (value, addend, e_fsel);
1386 else
1387 value = hppa_field_adjust (value, addend, e_rrsel);
1388
1389 insn = elf_hppa_relocate_insn (insn, value, r_type);
1390 break;
1391 }
1392
8267b155
JL
1393 case R_PARISC_PLTOFF21L:
1394 case R_PARISC_PLTOFF14R:
1395 case R_PARISC_PLTOFF14F:
1396 case R_PARISC_PLTOFF14WR:
1397 case R_PARISC_PLTOFF14DR:
1398 case R_PARISC_PLTOFF16F:
1399 case R_PARISC_PLTOFF16WF:
1400 case R_PARISC_PLTOFF16DF:
1401 {
1402 /* We want the value of the PLT offset for this symbol, not
19ef5465
JL
1403 the symbol's actual address. Note that __gp may not point
1404 to the start of the DLT, so we have to compute the absolute
1405 address, then subtract out the value of __gp. */
1406 value = (dyn_h->plt_offset
1407 + hppa_info->plt_sec->output_offset
1408 + hppa_info->plt_sec->output_section->vma);
1409 value -= _bfd_get_gp_value (output_bfd);
8267b155
JL
1410
1411 /* All PLTOFF relocations are basically the same at this point,
1412 except that we need different field selectors for the 21bit
1413 version vs the 14bit versions. */
1414 if (r_type == R_PARISC_PLTOFF21L)
1415 value = hppa_field_adjust (value, addend, e_lrsel);
1416 else if (r_type == R_PARISC_PLTOFF14F
1417 || r_type == R_PARISC_PLTOFF16F
1418 || r_type == R_PARISC_PLTOFF16WF
1419 || r_type == R_PARISC_PLTOFF16DF)
1420 value = hppa_field_adjust (value, addend, e_fsel);
1421 else
1422 value = hppa_field_adjust (value, addend, e_rrsel);
1423
1424 insn = elf_hppa_relocate_insn (insn, value, r_type);
1425 break;
1426 }
1427
e5bb3efc
JL
1428 case R_PARISC_LTOFF_FPTR32:
1429 {
e48c661e
JL
1430 /* We may still need to create the FPTR itself if it was for
1431 a local symbol. */
1432 if (dyn_h->h == NULL)
1433 {
1434 /* The first two words of an .opd entry are zero. */
1435 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1436
1437 /* The next word is the address of the function. */
1438 bfd_put_64 (hppa_info->opd_sec->owner, value,
1439 (hppa_info->opd_sec->contents
1440 + dyn_h->opd_offset + 16));
1441
1442 /* The last word is our local __gp value. */
1443 value = _bfd_get_gp_value
1444 (hppa_info->opd_sec->output_section->owner);
1445 bfd_put_64 (hppa_info->opd_sec->owner, value,
1446 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1447 }
1448
e5bb3efc 1449 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1450 the symbol's actual address. Note that __gp may not point
1451 to the start of the DLT, so we have to compute the absolute
1452 address, then subtract out the value of __gp. */
1453 value = (dyn_h->dlt_offset
1454 + hppa_info->dlt_sec->output_offset
1455 + hppa_info->dlt_sec->output_section->vma);
1456 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1457 bfd_put_32 (input_bfd, value, hit_data);
1458 return bfd_reloc_ok;
1459 }
1460
e5bb3efc 1461 case R_PARISC_LTOFF_FPTR64:
b233eaab 1462 case R_PARISC_LTOFF_TP64:
e5bb3efc 1463 {
e48c661e
JL
1464 /* We may still need to create the FPTR itself if it was for
1465 a local symbol. */
1466 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64)
1467 {
1468 /* The first two words of an .opd entry are zero. */
1469 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1470
1471 /* The next word is the address of the function. */
1472 bfd_put_64 (hppa_info->opd_sec->owner, value,
1473 (hppa_info->opd_sec->contents
1474 + dyn_h->opd_offset + 16));
1475
1476 /* The last word is our local __gp value. */
1477 value = _bfd_get_gp_value
1478 (hppa_info->opd_sec->output_section->owner);
1479 bfd_put_64 (hppa_info->opd_sec->owner, value,
1480 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1481 }
1482
e5bb3efc 1483 /* We want the value of the DLT offset for this symbol, not
19ef5465
JL
1484 the symbol's actual address. Note that __gp may not point
1485 to the start of the DLT, so we have to compute the absolute
1486 address, then subtract out the value of __gp. */
1487 value = (dyn_h->dlt_offset
1488 + hppa_info->dlt_sec->output_offset
1489 + hppa_info->dlt_sec->output_section->vma);
1490 value -= _bfd_get_gp_value (output_bfd);
e5bb3efc
JL
1491 bfd_put_64 (input_bfd, value, hit_data);
1492 return bfd_reloc_ok;
1493 }
1494
1495 case R_PARISC_DIR32:
571047ad 1496 bfd_put_32 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1497 return bfd_reloc_ok;
1498
1499 case R_PARISC_DIR64:
571047ad 1500 bfd_put_64 (input_bfd, value + addend, hit_data);
e5bb3efc
JL
1501 return bfd_reloc_ok;
1502
6849fb4d
JL
1503 case R_PARISC_GPREL64:
1504 /* Subtract out the global pointer value to make value a DLT
1505 relative address. */
1506 value -= _bfd_get_gp_value (output_bfd);
1507 value += addend;
1508
1509 bfd_put_64 (input_bfd, value + addend, hit_data);
1510 return bfd_reloc_ok;
1511
b7263961 1512 case R_PARISC_LTOFF64:
19ef5465
JL
1513 /* We want the value of the DLT offset for this symbol, not
1514 the symbol's actual address. Note that __gp may not point
1515 to the start of the DLT, so we have to compute the absolute
1516 address, then subtract out the value of __gp. */
1517 value = (dyn_h->dlt_offset
1518 + hppa_info->dlt_sec->output_offset
1519 + hppa_info->dlt_sec->output_section->vma);
1520 value -= _bfd_get_gp_value (output_bfd);
b7263961
JL
1521
1522 bfd_put_64 (input_bfd, value + addend, hit_data);
1523 return bfd_reloc_ok;
1524
571047ad
JL
1525 case R_PARISC_PCREL32:
1526 {
1527 /* If this is a call to a function defined in another dynamic
1528 library, then redirect the call to the local stub for this
1529 function. */
dfec422f
JL
1530 if (sym_sec == NULL || sym_sec->output_section == NULL)
1531 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1532 + hppa_info->stub_sec->output_section->vma);
571047ad
JL
1533
1534 /* Turn VALUE into a proper PC relative address. */
1535 value -= (offset + input_section->output_offset
1536 + input_section->output_section->vma);
1537
b233eaab 1538 value += addend;
571047ad
JL
1539 value -= 8;
1540 bfd_put_64 (input_bfd, value, hit_data);
1541 return bfd_reloc_ok;
1542 }
1543
1544 case R_PARISC_PCREL64:
1545 {
1546 /* If this is a call to a function defined in another dynamic
1547 library, then redirect the call to the local stub for this
1548 function. */
dfec422f
JL
1549 if (sym_sec == NULL || sym_sec->output_section == NULL)
1550 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
1551 + hppa_info->stub_sec->output_section->vma);
1552
571047ad
JL
1553
1554 /* Turn VALUE into a proper PC relative address. */
1555 value -= (offset + input_section->output_offset
1556 + input_section->output_section->vma);
1557
b233eaab 1558 value += addend;
571047ad
JL
1559 value -= 8;
1560 bfd_put_64 (input_bfd, value, hit_data);
1561 return bfd_reloc_ok;
1562 }
1563
1564
e5bb3efc 1565 case R_PARISC_FPTR64:
e48c661e
JL
1566 {
1567 /* We may still need to create the FPTR itself if it was for
1568 a local symbol. */
1569 if (dyn_h->h == NULL)
1570 {
1571 /* The first two words of an .opd entry are zero. */
1572 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
1573
1574 /* The next word is the address of the function. */
1575 bfd_put_64 (hppa_info->opd_sec->owner, value,
1576 (hppa_info->opd_sec->contents
1577 + dyn_h->opd_offset + 16));
1578
1579 /* The last word is our local __gp value. */
1580 value = _bfd_get_gp_value
1581 (hppa_info->opd_sec->output_section->owner);
1582 bfd_put_64 (hppa_info->opd_sec->owner, value,
1583 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
1584 }
1585
1586 /* We want the value of the OPD offset for this symbol, not
1587 the symbol's actual address. */
1588 value = (dyn_h->opd_offset
1589 + hppa_info->opd_sec->output_offset
1590 + hppa_info->opd_sec->output_section->vma);
6a0b9871 1591
e48c661e
JL
1592 bfd_put_64 (input_bfd, value + addend, hit_data);
1593 return bfd_reloc_ok;
1594 }
e5bb3efc 1595
228d307f
JL
1596 case R_PARISC_SECREL32:
1597 bfd_put_32 (input_bfd,
1598 (value + addend
1599 - sym_sec->output_section->vma),
1600 hit_data);
1601 return bfd_reloc_ok;
1602
1603 case R_PARISC_SEGREL32:
2ec0dd12
JL
1604 case R_PARISC_SEGREL64:
1605 {
1606 /* If this is the first SEGREL relocation, then initialize
1607 the segment base values. */
1608 if (hppa_info->text_segment_base == (bfd_vma) -1)
1609 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
1610 elf64_hppa_hash_table (info));
1611
1612 /* VALUE holds the absolute address. We want to include the
1613 addend, then turn it into a segment relative address.
1614
1615 The segment is derived from SYM_SEC. We assume that there are
1616 only two segments of note in the resulting executable/shlib.
1617 A readonly segment (.text) and a readwrite segment (.data). */
1618 value += addend;
1619
1620 if (sym_sec->flags & SEC_CODE)
1621 value -= hppa_info->text_segment_base;
1622 else
1623 value -= hppa_info->data_segment_base;
1624
1625 if (r_type == R_PARISC_SEGREL32)
1626 bfd_put_32 (input_bfd, value, hit_data);
1627 else
1628 bfd_put_64 (input_bfd, value, hit_data);
1629 return bfd_reloc_ok;
1630 }
1631
228d307f 1632
2eb429af
JL
1633 /* Something we don't know how to handle. */
1634 default:
228d307f 1635 return bfd_reloc_notsupported;
2eb429af
JL
1636 }
1637
1638 /* Update the instruction word. */
1639 bfd_put_32 (input_bfd, insn, hit_data);
1640 return (bfd_reloc_ok);
1641}
1642
be7582f3
JL
1643/* Relocate the given INSN. VALUE should be the actual value we want
1644 to insert into the instruction, ie by this point we should not be
1645 concerned with computing an offset relative to the DLT, PC, etc.
1646 Instead this routine is meant to handle the bit manipulations needed
1647 to insert the relocation into the given instruction. */
2eb429af
JL
1648
1649static unsigned long
be7582f3 1650elf_hppa_relocate_insn (insn, sym_value, r_type)
2eb429af 1651 unsigned long insn;
2eb429af 1652 long sym_value;
c8933571 1653 unsigned long r_type;
2eb429af 1654{
c8933571 1655 switch (r_type)
2eb429af 1656 {
be7582f3
JL
1657 /* This is any 22bit branch. In PA2.0 syntax it corresponds to
1658 the "B" instruction. */
c8933571 1659 case R_PARISC_PCREL22F:
571047ad 1660 case R_PARISC_PCREL22C:
be7582f3
JL
1661 {
1662 unsigned int w3, w2, w1, w;
2eb429af 1663
be7582f3
JL
1664 /* These are 22 bit branches. Mask off bits we do not care
1665 about. */
1666 sym_value &= 0x3fffff;
2eb429af 1667
be7582f3
JL
1668 /* Now extract the W1, W2, W3 and W fields from the value. */
1669 dis_assemble_22 (sym_value, &w3, &w1, &w2, &w);
2eb429af 1670
be7582f3
JL
1671 /* Mask out bits for the value in the instruction. */
1672 insn &= 0xfc00e002;
2eb429af 1673
be7582f3
JL
1674 /* Insert the bits for the W1, W2 and W fields into the
1675 instruction. */
1676 insn |= (w3 << 21) | (w2 << 2) | (w1 << 16) | w;
1677 return insn;
1678 }
2eb429af 1679
be7582f3
JL
1680 /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
1681 the "B" instruction as well as BE. */
1682 case R_PARISC_PCREL17F:
c8933571 1683 case R_PARISC_DIR17F:
b7263961 1684 case R_PARISC_DIR17R:
571047ad
JL
1685 case R_PARISC_PCREL17C:
1686 case R_PARISC_PCREL17R:
2eb429af
JL
1687 {
1688 unsigned int w2, w1, w;
1689
2eb429af
JL
1690 /* These are 17 bit branches. Mask off bits we do not care
1691 about. */
1692 sym_value &= 0x1ffff;
1693
1694 /* Now extract the W1, W2 and W fields from the value. */
1695 dis_assemble_17 (sym_value, &w1, &w2, &w);
1696
1697 /* Mask out bits for the value in the instruction. */
1698 insn &= 0xffe0e002;
1699
1700 /* Insert the bits for the W1, W2 and W fields into the
1701 instruction. */
1702 insn |= (w2 << 2) | (w1 << 16) | w;
1703 return insn;
1704 }
1705
be7582f3 1706 /* ADDIL or LDIL instructions. */
c8933571 1707 case R_PARISC_DLTREL21L:
be7582f3 1708 case R_PARISC_DLTIND21L:
e5bb3efc 1709 case R_PARISC_LTOFF_FPTR21L:
b233eaab
JL
1710 case R_PARISC_PCREL21L:
1711 case R_PARISC_LTOFF_TP21L:
6849fb4d 1712 case R_PARISC_DPREL21L:
8267b155 1713 case R_PARISC_PLTOFF21L:
b7263961 1714 case R_PARISC_DIR21L:
c8933571
JL
1715 {
1716 int w;
1717
c8933571
JL
1718 /* Mask off bits in INSN we do not want. */
1719 insn &= 0xffe00000;
1720
1721 /* Turn the 21bit value into the proper format. */
1722 dis_assemble_21 (sym_value, &w);
1723
1724 /* And insert the proper bits into INSN. */
1725 return insn | w;
1726 }
be7582f3
JL
1727
1728 /* LDO and integer loads/stores with 14bit displacements. */
c8933571 1729 case R_PARISC_DLTREL14R:
084d930b 1730 case R_PARISC_DLTREL14F:
be7582f3
JL
1731 case R_PARISC_DLTIND14R:
1732 case R_PARISC_DLTIND14F:
e5bb3efc
JL
1733 case R_PARISC_LTOFF_FPTR14R:
1734 case R_PARISC_LTOFF_FPTR16F:
b233eaab 1735 case R_PARISC_PCREL14R:
571047ad
JL
1736 case R_PARISC_PCREL14F:
1737 case R_PARISC_PCREL16F:
b233eaab
JL
1738 case R_PARISC_LTOFF_TP14R:
1739 case R_PARISC_LTOFF_TP14F:
1740 case R_PARISC_LTOFF_TP16F:
6849fb4d
JL
1741 case R_PARISC_DPREL14R:
1742 case R_PARISC_DPREL14F:
1743 case R_PARISC_GPREL16F:
8267b155
JL
1744 case R_PARISC_PLTOFF14R:
1745 case R_PARISC_PLTOFF14F:
1746 case R_PARISC_PLTOFF16F:
b7263961
JL
1747 case R_PARISC_DIR14R:
1748 case R_PARISC_DIR16F:
1749 case R_PARISC_LTOFF16F:
c8933571
JL
1750 {
1751 int w;
1752
c8933571
JL
1753 /* Mask off bits in INSN we do not want. */
1754 insn &= 0xffffc000;
1755
1756 /* Turn the 14bit value into the proper format. */
1757 low_sign_unext (sym_value, 14, &w);
1758
1759 /* And insert the proper bits into INSN. */
1760 return insn | w;
1761 }
be7582f3
JL
1762
1763 /* Doubleword loads and stores with a 14bit displacement. */
11c19a4e 1764 case R_PARISC_DLTREL14DR:
be7582f3 1765 case R_PARISC_DLTIND14DR:
e5bb3efc
JL
1766 case R_PARISC_LTOFF_FPTR14DR:
1767 case R_PARISC_LTOFF_FPTR16DF:
571047ad
JL
1768 case R_PARISC_PCREL14DR:
1769 case R_PARISC_PCREL16DF:
b233eaab
JL
1770 case R_PARISC_LTOFF_TP14DR:
1771 case R_PARISC_LTOFF_TP16DF:
6849fb4d
JL
1772 case R_PARISC_DPREL14DR:
1773 case R_PARISC_GPREL16DF:
8267b155
JL
1774 case R_PARISC_PLTOFF14DR:
1775 case R_PARISC_PLTOFF16DF:
b7263961
JL
1776 case R_PARISC_DIR14DR:
1777 case R_PARISC_DIR16DF:
1778 case R_PARISC_LTOFF16DF:
11c19a4e 1779 {
11c19a4e
JL
1780 /* Mask off bits in INSN we do not want. */
1781 insn &= 0xffffc00e;
1782
1783 /* The sign bit at 14 moves into bit zero in the destination. */
1784 insn |= ((sym_value & 0x2000) >> 13);
1785
1786 /* Turn off the bits in sym_value we do not care about. */
1787 sym_value &= 0x1ff8;
1788
1789 /* Now shift it one bit position left so that it lines up with the
1790 destination field in INSN. */
1791 sym_value <<= 1;
1792
1793 return insn | sym_value;
1794 }
1795
be7582f3 1796 /* Floating point single word load/store instructions. */
11c19a4e 1797 case R_PARISC_DLTREL14WR:
be7582f3 1798 case R_PARISC_DLTIND14WR:
e5bb3efc
JL
1799 case R_PARISC_LTOFF_FPTR14WR:
1800 case R_PARISC_LTOFF_FPTR16WF:
571047ad
JL
1801 case R_PARISC_PCREL14WR:
1802 case R_PARISC_PCREL16WF:
b233eaab
JL
1803 case R_PARISC_LTOFF_TP14WR:
1804 case R_PARISC_LTOFF_TP16WF:
6849fb4d
JL
1805 case R_PARISC_DPREL14WR:
1806 case R_PARISC_GPREL16WF:
8267b155
JL
1807 case R_PARISC_PLTOFF14WR:
1808 case R_PARISC_PLTOFF16WF:
b7263961
JL
1809 case R_PARISC_DIR16WF:
1810 case R_PARISC_DIR14WR:
1811 case R_PARISC_LTOFF16WF:
11c19a4e 1812 {
11c19a4e
JL
1813 /* Mask off bits in INSN we do not want. */
1814 insn &= 0xffffc006;
1815
1816 /* The sign bit at 14 moves into bit zero in the destination. */
1817 insn |= ((sym_value & 0x2000) >> 13);
1818
1819 /* Turn off the bits in sym_value we do not care about. */
1820 sym_value &= 0x1ffc;
1821
1822 /* Now shift it one bit position left so that it lines up with the
1823 destination field in INSN. */
1824 sym_value <<= 1;
1825
1826 return insn | sym_value;
1827 }
be7582f3 1828
2eb429af
JL
1829 default:
1830 return insn;
1831 }
1832}
This page took 0.140377 seconds and 4 git commands to generate.