]> Git Repo - binutils.git/blob - bfd/elf32-hppa.c
Forward relocs to output if -Bshared
[binutils.git] / bfd / elf32-hppa.c
1 /* BFD back-end for HP PA-RISC ELF files.
2    Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4    Written by
5
6         Center for Software Science
7         Department of Computer Science
8         University of Utah
9
10 This file is part of BFD, the Binary File Descriptor library.
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
25
26 #include "bfd.h"
27 #include "sysdep.h"
28 #include "bfdlink.h"
29 #include "libbfd.h"
30 #include "obstack.h"
31 #include "elf-bfd.h"
32
33 /* The internal type of a symbol table extension entry.  */
34 typedef unsigned long symext_entryS;
35
36 /* The external type of a symbol table extension entry.  */
37 #define ELF32_PARISC_SX_SIZE (4)
38 #define ELF32_PARISC_SX_GET(bfd, addr) bfd_h_get_32 ((bfd), (addr))
39 #define ELF32_PARISC_SX_PUT(bfd, val, addr) \
40   bfd_h_put_32 ((bfd), (val), (addr))
41
42 /* HPPA symbol table extension entry types */
43 enum elf32_hppa_symextn_types
44 {
45   PARISC_SXT_NULL,
46   PARISC_SXT_SYMNDX,
47   PARISC_SXT_ARG_RELOC,
48 };
49
50 /* These macros compose and decompose the value of a symextn entry:
51
52    entry_type = ELF32_PARISC_SX_TYPE(word);
53    entry_value = ELF32_PARISC_SX_VAL(word);
54    word = ELF32_PARISC_SX_WORD(type,val);  */
55
56 #define ELF32_PARISC_SX_TYPE(p)         ((p) >> 24)
57 #define ELF32_PARISC_SX_VAL(p)          ((p) & 0xFFFFFF)
58 #define ELF32_PARISC_SX_WORD(type,val)  (((type) << 24) + (val & 0xFFFFFF))
59
60 /* The following was added facilitate implementation of the .hppa_symextn
61    section.  This section is built after the symbol table is built in the
62    elf_write_object_contents routine (called from bfd_close).  It is built
63    so late because it requires information that is not known until
64    the symbol and string table sections have been allocated, and
65    the symbol table has been built. */
66
67 #define SYMEXTN_SECTION_NAME ".PARISC.symext"
68
69 struct symext_chain
70   {
71     symext_entryS entry;
72     struct symext_chain *next;
73   };
74
75 typedef struct symext_chain symext_chainS;
76
77 /* We use three different hash tables to hold information for
78    linking PA ELF objects.
79
80    The first is the elf32_hppa_link_hash_table which is derived
81    from the standard ELF linker hash table.  We use this as a place to
82    attach other hash tables and static information.
83
84    The second is the stub hash table which is derived from the
85    base BFD hash table.  The stub hash table holds the information
86    necessary to build the linker stubs during a link.
87
88    The last hash table keeps track of argument location information needed
89    to build hash tables.  Each function with nonzero argument location
90    bits will have an entry in this table.  */
91
92 /* Hash table for linker stubs.  */
93
94 struct elf32_hppa_stub_hash_entry
95 {
96   /* Base hash table entry structure, we can get the name of the stub
97      (and thus know exactly what actions it performs) from the base
98      hash table entry.  */
99   struct bfd_hash_entry root;
100
101   /* Offset of the beginning of this stub.  */
102   bfd_vma offset;
103
104   /* Given the symbol's value and its section we can determine its final
105      value when building the stubs (so the stub knows where to jump.  */
106   symvalue target_value;
107   asection *target_section;
108 };
109
110 struct elf32_hppa_stub_hash_table
111 {
112   /* The hash table itself.  */
113   struct bfd_hash_table root;
114
115   /* The stub BFD.  */
116   bfd *stub_bfd;
117
118   /* Where to place the next stub.  */
119   bfd_byte *location;
120
121   /* Current offset in the stub section.  */
122   unsigned int offset;
123
124 };
125
126 /* Hash table for argument location information.  */
127
128 struct elf32_hppa_args_hash_entry
129 {
130   /* Base hash table entry structure.  */
131   struct bfd_hash_entry root;
132
133   /* The argument location bits for this entry.  */
134   int arg_bits;
135 };
136
137 struct elf32_hppa_args_hash_table
138 {
139   /* The hash table itself.  */
140   struct bfd_hash_table root;
141 };
142
143 struct elf32_hppa_link_hash_entry
144 {
145   struct elf_link_hash_entry root;
146 };
147
148 struct elf32_hppa_link_hash_table
149 {
150   /* The main hash table.  */
151   struct elf_link_hash_table root;
152
153   /* The stub hash table.  */
154   struct elf32_hppa_stub_hash_table *stub_hash_table;
155
156   /* The argument relocation bits hash table.  */
157   struct elf32_hppa_args_hash_table *args_hash_table;
158
159   /* A count of the number of output symbols.  */
160   unsigned int output_symbol_count;
161
162   /* Stuff so we can handle DP relative relocations.  */
163   long global_value;
164   int global_sym_defined;
165 };
166
167 /* FIXME.  */
168 #define ARGUMENTS       0
169 #define RETURN_VALUE    1
170
171 /* The various argument relocations that may be performed.  */
172 typedef enum
173 {
174   /* No relocation.  */
175   NO,
176   /* Relocate 32 bits from GR to FP register.  */
177   GF,
178   /* Relocate 64 bits from a GR pair to FP pair.  */
179   GD,
180   /* Relocate 32 bits from FP to GR.  */
181   FG,
182   /* Relocate 64 bits from FP pair to GR pair.  */
183   DG,
184 } arg_reloc_type;
185
186 /* What is being relocated (eg which argument or the return value).  */
187 typedef enum
188 {
189   ARG0, ARG1, ARG2, ARG3, RET,
190 } arg_reloc_location;
191
192
193 /* ELF32/HPPA relocation support
194
195         This file contains ELF32/HPPA relocation support as specified
196         in the Stratus FTX/Golf Object File Format (SED-1762) dated
197         February 1994.  */
198
199 #include "elf32-hppa.h"
200 #include "hppa_stubs.h"
201
202 static bfd_reloc_status_type hppa_elf_reloc
203   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
204
205 static unsigned long hppa_elf_relocate_insn
206   PARAMS ((bfd *, asection *, unsigned long, unsigned long, long,
207            long, unsigned long, unsigned long, unsigned long));
208
209 static bfd_reloc_status_type hppa_elf_reloc
210   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **));
211
212 static reloc_howto_type * elf_hppa_reloc_type_lookup
213   PARAMS ((bfd *, bfd_reloc_code_real_type));
214
215 static boolean elf32_hppa_set_section_contents
216   PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
217
218 static void elf_info_to_howto
219   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
220
221 static boolean elf32_hppa_backend_symbol_table_processing
222   PARAMS ((bfd *, elf_symbol_type *, unsigned int));
223
224 static void elf32_hppa_backend_begin_write_processing
225   PARAMS ((bfd *, struct bfd_link_info *));
226
227 static void elf32_hppa_backend_final_write_processing
228   PARAMS ((bfd *, boolean));
229
230 static void add_entry_to_symext_chain
231   PARAMS ((bfd *, unsigned int, unsigned int, symext_chainS **,
232            symext_chainS **));
233
234 static void
235 elf_hppa_tc_make_sections PARAMS ((bfd *, symext_chainS *));
236
237 static boolean hppa_elf_is_local_label PARAMS ((bfd *, asymbol *));
238
239 static boolean elf32_hppa_add_symbol_hook
240   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
241            const char **, flagword *, asection **, bfd_vma *));
242
243 static bfd_reloc_status_type elf32_hppa_bfd_final_link_relocate
244   PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *,
245            bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *,
246            asection *, const char *, int));
247
248 static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
249   PARAMS ((bfd *));
250
251 static struct bfd_hash_entry *
252 elf32_hppa_stub_hash_newfunc
253   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
254
255 static struct bfd_hash_entry *
256 elf32_hppa_args_hash_newfunc
257   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
258
259 static boolean
260 elf32_hppa_relocate_section
261   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
262            bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
263
264 static boolean
265 elf32_hppa_stub_hash_table_init
266   PARAMS ((struct elf32_hppa_stub_hash_table *, bfd *,
267            struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *,
268                                                struct bfd_hash_table *,
269                                                const char *))));
270
271 static boolean
272 elf32_hppa_build_one_stub PARAMS ((struct bfd_hash_entry *, PTR));
273
274 static boolean
275 elf32_hppa_read_symext_info
276   PARAMS ((bfd *, Elf_Internal_Shdr *, struct elf32_hppa_args_hash_table *,
277            Elf_Internal_Sym *));
278
279 static unsigned int elf32_hppa_size_of_stub
280   PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, const char *));
281
282 static boolean elf32_hppa_arg_reloc_needed
283   PARAMS ((unsigned int, unsigned int, arg_reloc_type []));
284
285 static void elf32_hppa_name_of_stub
286   PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, char *));
287
288 static boolean elf32_hppa_size_symext PARAMS ((struct bfd_hash_entry *, PTR));
289
290 static boolean elf32_hppa_link_output_symbol_hook
291   PARAMS ((bfd *, struct bfd_link_info *, const char *,
292            Elf_Internal_Sym *, asection *));
293
294 /* ELF/PA relocation howto entries.  */
295
296 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
297 {
298   {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_NONE"},
299   {R_PARISC_DIR32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR32"},
300   {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR21L"},
301   {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17R"},
302   {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17F"},
303   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
304   {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR14R"},
305   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
306
307   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
308   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
309   {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL21L"},
310   {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17R"},
311   {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17F"},
312   {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17C"},
313   {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14R"},
314   {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14F"},
315
316   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
317   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
318   {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL21L"},
319   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
320   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
321   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
322   {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14R"},
323   {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14F"},
324
325   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
326   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
327   {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL21L"},
328   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
329   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
330   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
331   {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14R"},
332   {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14F"},
333
334   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
335   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
336   {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND21L"},
337   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
338   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
339   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
340   {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14R"},
341   {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14F"},
342
343   {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_SETBASE"},
344   {R_PARISC_BASEREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL32"},
345   {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL21L"},
346   {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17R"},
347   {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17F"},
348   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
349   {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14R"},
350   {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14F"},
351
352   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
353   {R_PARISC_TEXTREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_TEXTREL32"},
354   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
355   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
356   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
357   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
358   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
359   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
360
361   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
362   {R_PARISC_DATAREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
363   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
364   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
365   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
366   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
367   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
368   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
369
370
371   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
372   {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL32"},
373   {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL21L"},
374   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
375   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
376   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
377   {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL14R"},
378   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
379
380   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
381   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
382   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
383   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
384   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
385   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
386   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
387   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
388
389   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
390   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
391   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
392   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
393   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
394   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
395   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
396   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
397   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
398   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
399   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
400   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
401   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
402   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
403   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
404   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
405
406   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
407   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
408   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
409   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
410   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
411   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
412   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
413   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
414   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
415   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
416   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
417   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
418   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
419   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
420   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
421   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
422
423   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
424   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
425   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
426   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
427   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
428   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
429   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
430   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
431   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
432   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
433   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
434   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
435   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
436   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
437   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
438   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
439
440
441   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
442   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
443   {R_PARISC_PLTIND21L, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND21L"},
444   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
445   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
446   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"},
447   {R_PARISC_PLTIND14R, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14R"},
448   {R_PARISC_PLTIND14F, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14F"},
449
450
451   {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_COPY"},
452   {R_PARISC_GLOB_DAT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_GLOB_DAT"},
453   {R_PARISC_JMP_SLOT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_JMP_SLOT"},
454   {R_PARISC_RELATIVE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_RELATIVE"},
455
456   {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
457 };
458
459 /* Where (what register type) is an argument comming from?  */
460 typedef enum
461 {
462   AR_NO,
463   AR_GR,
464   AR_FR,
465   AR_FU,
466   AR_FPDBL1,
467   AR_FPDBL2,
468 } arg_location;
469
470 /* Horizontal represents the callee's argument location information,
471    vertical represents caller's argument location information.  Value at a
472    particular X,Y location represents what (if any) argument relocation
473    needs to be performed to make caller and callee agree.  */
474
475 static CONST arg_reloc_type arg_mismatches[6][6] =
476 {
477   {NO, NO, NO, NO, NO, NO},
478   {NO, NO, GF, NO, GD, NO},
479   {NO, FG, NO, NO, NO, NO},
480   {NO, NO, NO, NO, NO, NO},
481   {NO, DG, NO, NO, NO, NO},
482   {NO, DG, NO, NO, NO, NO},
483 };
484
485 /* Likewise, but reversed for the return value.  */
486 static CONST arg_reloc_type ret_mismatches[6][6] =
487 {
488   {NO, NO, NO, NO, NO, NO},
489   {NO, NO, FG, NO, DG, NO},
490   {NO, GF, NO, NO, NO, NO},
491   {NO, NO, NO, NO, NO, NO},
492   {NO, GD, NO, NO, NO, NO},
493   {NO, GD, NO, NO, NO, NO},
494 };
495
496 /* Misc static crud for symbol extension records.  */
497 static symext_chainS *symext_rootP;
498 static symext_chainS *symext_lastP;
499 static bfd_size_type symext_chain_size;
500
501 /* FIXME: We should be able to try this static variable!  */
502 static bfd_byte *symextn_contents;
503
504
505 /* For linker stub hash tables.  */
506 #define elf32_hppa_stub_hash_lookup(table, string, create, copy) \
507   ((struct elf32_hppa_stub_hash_entry *) \
508    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
509
510 #define elf32_hppa_stub_hash_traverse(table, func, info) \
511   (bfd_hash_traverse \
512    (&(table)->root, \
513     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
514     (info)))
515
516 /* For linker args hash tables.  */
517 #define elf32_hppa_args_hash_lookup(table, string, create, copy) \
518   ((struct elf32_hppa_args_hash_entry *) \
519    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
520
521 #define elf32_hppa_args_hash_traverse(table, func, info) \
522   (bfd_hash_traverse \
523    (&(table)->root, \
524     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
525     (info)))
526
527 #define elf32_hppa_args_hash_table_init(table, newfunc) \
528   (bfd_hash_table_init \
529    (&(table)->root, \
530     (struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, \
531                                          struct bfd_hash_table *, \
532                                          const char *))) (newfunc)))
533
534 /* For HPPA linker hash table.  */
535
536 #define elf32_hppa_link_hash_lookup(table, string, create, copy, follow)\
537   ((struct elf32_hppa_link_hash_entry *)                                \
538    elf_link_hash_lookup (&(table)->root, (string), (create),            \
539                          (copy), (follow)))
540
541 #define elf32_hppa_link_hash_traverse(table, func, info)                \
542   (elf_link_hash_traverse                                               \
543    (&(table)->root,                                                     \
544     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
545     (info)))
546
547 /* Get the PA ELF linker hash table from a link_info structure.  */
548
549 #define elf32_hppa_hash_table(p) \
550   ((struct elf32_hppa_link_hash_table *) ((p)->hash))
551
552
553 /* Extract specific argument location bits for WHICH from
554    the full argument location in AR.  */
555 #define EXTRACT_ARBITS(ar, which) ((ar) >> (8 - ((which) * 2))) & 3
556
557 /* Assorted hash table functions.  */
558
559 /* Initialize an entry in the stub hash table.  */
560
561 static struct bfd_hash_entry *
562 elf32_hppa_stub_hash_newfunc (entry, table, string)
563      struct bfd_hash_entry *entry;
564      struct bfd_hash_table *table;
565      const char *string;
566 {
567   struct elf32_hppa_stub_hash_entry *ret;
568
569   ret = (struct elf32_hppa_stub_hash_entry *) entry;
570
571   /* Allocate the structure if it has not already been allocated by a
572      subclass.  */
573   if (ret == NULL)
574     ret = ((struct elf32_hppa_stub_hash_entry *)
575            bfd_hash_allocate (table,
576                               sizeof (struct elf32_hppa_stub_hash_entry)));
577   if (ret == NULL)
578     return NULL;
579
580   /* Call the allocation method of the superclass.  */
581   ret = ((struct elf32_hppa_stub_hash_entry *)
582          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
583
584   if (ret)
585     {
586       /* Initialize the local fields.  */
587       ret->offset = 0;
588       ret->target_value = 0;
589       ret->target_section = NULL;
590     }
591
592   return (struct bfd_hash_entry *) ret;
593 }
594
595 /* Initialize a stub hash table.  */
596
597 static boolean
598 elf32_hppa_stub_hash_table_init (table, stub_bfd, newfunc)
599      struct elf32_hppa_stub_hash_table *table;
600      bfd *stub_bfd;
601      struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
602                                                 struct bfd_hash_table *,
603                                                 const char *));
604 {
605   table->offset = 0;
606   table->location = 0;
607   table->stub_bfd = stub_bfd;
608   return (bfd_hash_table_init (&table->root, newfunc));
609 }
610
611 /* Initialize an entry in the argument location hash table.  */
612
613 static struct bfd_hash_entry *
614 elf32_hppa_args_hash_newfunc (entry, table, string)
615      struct bfd_hash_entry *entry;
616      struct bfd_hash_table *table;
617      const char *string;
618 {
619   struct elf32_hppa_args_hash_entry *ret;
620
621   ret = (struct elf32_hppa_args_hash_entry *) entry;
622
623   /* Allocate the structure if it has not already been allocated by a
624      subclass.  */
625   if (ret == NULL)
626     ret = ((struct elf32_hppa_args_hash_entry *)
627            bfd_hash_allocate (table,
628                               sizeof (struct elf32_hppa_args_hash_entry)));
629   if (ret == NULL)
630     return NULL;
631
632   /* Call the allocation method of the superclass.  */
633   ret = ((struct elf32_hppa_args_hash_entry *)
634          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
635
636   /* Initialize the local fields.  */
637   if (ret)
638     ret->arg_bits = 0;
639
640   return (struct bfd_hash_entry *) ret;
641 }
642
643 /* Create the derived linker hash table.  The PA ELF port uses the derived
644    hash table to keep information specific to the PA ELF linker (without
645    using static variables).  */
646
647 static struct bfd_link_hash_table *
648 elf32_hppa_link_hash_table_create (abfd)
649      bfd *abfd;
650 {
651   struct elf32_hppa_link_hash_table *ret;
652
653   ret = ((struct elf32_hppa_link_hash_table *)
654          bfd_alloc (abfd, sizeof (struct elf32_hppa_link_hash_table)));
655   if (ret == NULL)
656     return NULL;
657   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
658                                       _bfd_elf_link_hash_newfunc))
659     {
660       bfd_release (abfd, ret);
661       return NULL;
662     }
663   ret->stub_hash_table = NULL;
664   ret->args_hash_table = NULL;
665   ret->output_symbol_count = 0;
666   ret->global_value = 0;
667   ret->global_sym_defined = 0;
668
669   return &ret->root.root;
670 }
671
672 /* Relocate the given INSN given the various input parameters.
673
674    FIXME: endianness and sizeof (long) issues abound here.  */
675
676 static unsigned long
677 hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
678                         r_addend, r_format, r_field, pcrel)
679      bfd *abfd;
680      asection *input_sect;
681      unsigned long insn;
682      unsigned long address;
683      long sym_value;
684      long r_addend;
685      unsigned long r_format;
686      unsigned long r_field;
687      unsigned long pcrel;
688 {
689   unsigned char opcode = get_opcode (insn);
690   long constant_value;
691
692   switch (opcode)
693     {
694     case LDO:
695     case LDB:
696     case LDH:
697     case LDW:
698     case LDWM:
699     case STB:
700     case STH:
701     case STW:
702     case STWM:
703     case COMICLR:
704     case SUBI:
705     case ADDIT:
706     case ADDI:
707     case LDIL:
708     case ADDIL:
709       constant_value = HPPA_R_CONSTANT (r_addend);
710
711       if (pcrel)
712         sym_value -= address;
713
714       sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
715       return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
716
717     case BL:
718     case BE:
719     case BLE:
720       /* XXX computing constant_value is not needed??? */
721       constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
722                                     (insn & 0x00001ffc) >> 2,
723                                     insn & 1);
724
725       constant_value = (constant_value << 15) >> 15;
726       if (pcrel)
727         {
728           sym_value -=
729             address + input_sect->output_offset
730             + input_sect->output_section->vma;
731           sym_value = hppa_field_adjust (sym_value, -8, r_field);
732         }
733       else
734         sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
735
736       return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
737
738     default:
739       if (opcode == 0)
740         {
741           constant_value = HPPA_R_CONSTANT (r_addend);
742
743           if (pcrel)
744             sym_value -= address;
745
746           return hppa_field_adjust (sym_value, constant_value, r_field);
747         }
748       else
749         abort ();
750     }
751 }
752
753 /* Relocate an HPPA ELF section.  */
754
755 static boolean
756 elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
757                              contents, relocs, local_syms, local_sections)
758      bfd *output_bfd;
759      struct bfd_link_info *info;
760      bfd *input_bfd;
761      asection *input_section;
762      bfd_byte *contents;
763      Elf_Internal_Rela *relocs;
764      Elf_Internal_Sym *local_syms;
765      asection **local_sections;
766 {
767   Elf_Internal_Shdr *symtab_hdr;
768   Elf_Internal_Rela *rel;
769   Elf_Internal_Rela *relend;
770
771   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
772
773   rel = relocs;
774   relend = relocs + input_section->reloc_count;
775   for (; rel < relend; rel++)
776     {
777       int r_type;
778       reloc_howto_type *howto;
779       unsigned long r_symndx;
780       struct elf_link_hash_entry *h;
781       Elf_Internal_Sym *sym;
782       asection *sym_sec;
783       bfd_vma relocation;
784       bfd_reloc_status_type r;
785       const char *sym_name;
786
787       r_type = ELF32_R_TYPE (rel->r_info);
788       if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
789         {
790           bfd_set_error (bfd_error_bad_value);
791           return false;
792         }
793       howto = elf_hppa_howto_table + r_type;
794
795       r_symndx = ELF32_R_SYM (rel->r_info);
796
797       if (info->relocateable)
798         {
799           /* This is a relocateable link.  We don't have to change
800              anything, unless the reloc is against a section symbol,
801              in which case we have to adjust according to where the
802              section symbol winds up in the output section.  */
803           if (r_symndx < symtab_hdr->sh_info)
804             {
805               sym = local_syms + r_symndx;
806               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
807                 {
808                   sym_sec = local_sections[r_symndx];
809                   rel->r_addend += sym_sec->output_offset;
810                 }
811             }
812
813           continue;
814         }
815
816       /* This is a final link.  */
817       h = NULL;
818       sym = NULL;
819       sym_sec = NULL;
820       if (r_symndx < symtab_hdr->sh_info)
821         {
822           sym = local_syms + r_symndx;
823           sym_sec = local_sections[r_symndx];
824           relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
825                            ? 0 : sym->st_value)
826                          + sym_sec->output_offset
827                          + sym_sec->output_section->vma);
828         }
829       else
830         {
831           long indx;
832
833           indx = r_symndx - symtab_hdr->sh_info;
834           h = elf_sym_hashes (input_bfd)[indx];
835           while (h->root.type == bfd_link_hash_indirect
836                  || h->root.type == bfd_link_hash_warning)
837             h = (struct elf_link_hash_entry *) h->root.u.i.link;
838           if (h->root.type == bfd_link_hash_defined
839               || h->root.type == bfd_link_hash_defweak)
840             {
841               sym_sec = h->root.u.def.section;
842               relocation = (h->root.u.def.value
843                             + sym_sec->output_offset
844                             + sym_sec->output_section->vma);
845             }
846           else if (h->root.type == bfd_link_hash_undefweak)
847             relocation = 0;
848           else
849             {
850               if (!((*info->callbacks->undefined_symbol)
851                     (info, h->root.root.string, input_bfd,
852                      input_section, rel->r_offset)))
853                 return false;
854               break;
855             }
856         }
857
858       if (h != NULL)
859         sym_name = h->root.root.string;
860       else
861         {
862           sym_name = bfd_elf_string_from_elf_section (input_bfd,
863                                                       symtab_hdr->sh_link,
864                                                       sym->st_name);
865           if (sym_name == NULL)
866             return false;
867           if (*sym_name == '\0')
868             sym_name = bfd_section_name (input_bfd, sym_sec);
869         }
870
871       /* If args_hash_table is NULL, then we have encountered some
872          kind of link error (ex. undefined symbols).  Do not try to
873          apply any relocations, continue the loop so we can notify
874          the user of several errors in a single attempted link.  */
875       if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
876         continue;
877
878       r = elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
879                                               input_section, contents,
880                                               rel->r_offset, relocation,
881                                               rel->r_addend, info, sym_sec,
882                                               sym_name, h == NULL);
883
884       if (r != bfd_reloc_ok)
885         {
886           switch (r)
887             {
888             /* This can happen for DP relative relocs if $global$ is
889                undefined.  This is a panic situation so we don't try
890                to continue.  */
891             case bfd_reloc_undefined:
892             case bfd_reloc_notsupported:
893               if (!((*info->callbacks->undefined_symbol)
894                     (info, "$global$", input_bfd,
895                      input_section, rel->r_offset)))
896                 return false;
897               return false;
898             case bfd_reloc_dangerous:
899               {
900                 /* We use this return value to indicate that we performed
901                    a "dangerous" relocation.  This doesn't mean we did
902                    the wrong thing, it just means there may be some cleanup
903                    that needs to be done here.
904
905                    In particular we had to swap the last call insn and its
906                    delay slot.  If the delay slot insn needed a relocation,
907                    then we'll need to adjust the next relocation entry's
908                    offset to account for the fact that the insn moved.
909
910                    This hair wouldn't be necessary if we inserted stubs
911                    between procedures and used a "bl" to get to the stub.  */
912                 if (rel != relend)
913                   {
914                     Elf_Internal_Rela *next_rel = rel + 1;
915
916                     if (rel->r_offset + 4 == next_rel->r_offset)
917                       next_rel->r_offset -= 4;
918                   }
919                 break;
920               }
921             default:
922             case bfd_reloc_outofrange:
923             case bfd_reloc_overflow:
924               {
925                 if (!((*info->callbacks->reloc_overflow)
926                       (info, sym_name, howto->name, (bfd_vma) 0,
927                         input_bfd, input_section, rel->r_offset)))
928                   return false;
929               }
930               break;
931             }
932         }
933     }
934
935   return true;
936 }
937
938 /* Return one (or more) BFD relocations which implement the base
939    relocation with modifications based on format and field.  */
940
941 elf32_hppa_reloc_type **
942 hppa_elf_gen_reloc_type (abfd, base_type, format, field, ignore)
943      bfd *abfd;
944      elf32_hppa_reloc_type base_type;
945      int format;
946      int field;
947      int ignore;
948 {
949   elf32_hppa_reloc_type *finaltype;
950   elf32_hppa_reloc_type **final_types;
951
952   /* Allocate slots for the BFD relocation.  */
953   final_types = (elf32_hppa_reloc_type **)
954     bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2);
955   if (final_types == NULL)
956     return NULL;
957
958   /* Allocate space for the relocation itself.  */
959   finaltype = (elf32_hppa_reloc_type *)
960     bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type));
961   if (finaltype == NULL)
962     return NULL;
963
964   /* Some reasonable defaults.  */
965   final_types[0] = finaltype;
966   final_types[1] = NULL;
967
968 #define final_type finaltype[0]
969
970   final_type = base_type;
971
972   /* Just a tangle of nested switch statements to deal with the braindamage
973      that a different field selector means a completely different relocation
974      for PA ELF.  */
975   switch (base_type)
976     {
977     case R_HPPA:
978     case R_HPPA_ABS_CALL:
979       switch (format)
980         {
981         case 14:
982           switch (field)
983             {
984             case e_rsel:
985             case e_rrsel:
986               final_type = R_PARISC_DIR14R;
987               break;
988             case e_rtsel:
989               final_type = R_PARISC_DLTREL14R;
990               break;
991             case e_tsel:
992               final_type = R_PARISC_DLTREL14F;
993               break;
994             case e_rpsel:
995               final_type = R_PARISC_PLABEL14R;
996               break;
997             default:
998               return NULL;
999             }
1000           break;
1001
1002         case 17:
1003           switch (field)
1004             {
1005             case e_fsel:
1006               final_type = R_PARISC_DIR17F;
1007               break;
1008             case e_rsel:
1009             case e_rrsel:
1010               final_type = R_PARISC_DIR17R;
1011               break;
1012             default:
1013               return NULL;
1014             }
1015           break;
1016
1017         case 21:
1018           switch (field)
1019             {
1020             case e_lsel:
1021             case e_lrsel:
1022               final_type = R_PARISC_DIR21L;
1023               break;
1024             case e_ltsel:
1025               final_type = R_PARISC_DLTREL21L;
1026               break;
1027             case e_lpsel:
1028               final_type = R_PARISC_PLABEL21L;
1029               break;
1030             default:
1031               return NULL;
1032             }
1033           break;
1034
1035         case 32:
1036           switch (field)
1037             {
1038             case e_fsel:
1039               final_type = R_PARISC_DIR32;
1040               break;
1041             case e_psel:
1042               final_type = R_PARISC_PLABEL32;
1043               break;
1044             default:
1045               return NULL;
1046             }
1047           break;
1048
1049         default:
1050           return NULL;
1051         }
1052       break;
1053
1054
1055     case R_HPPA_GOTOFF:
1056       switch (format)
1057         {
1058         case 14:
1059           switch (field)
1060             {
1061             case e_rsel:
1062             case e_rrsel:
1063               final_type = R_PARISC_DPREL14R;
1064               break;
1065             case e_fsel:
1066               final_type = R_PARISC_DPREL14F;
1067               break;
1068             default:
1069               return NULL;
1070             }
1071           break;
1072
1073         case 21:
1074           switch (field)
1075             {
1076             case e_lrsel:
1077             case e_lsel:
1078               final_type = R_PARISC_DPREL21L;
1079               break;
1080             default:
1081               return NULL;
1082             }
1083           break;
1084
1085         default:
1086           return NULL;
1087         }
1088       break;
1089
1090
1091     case R_HPPA_PCREL_CALL:
1092       switch (format)
1093         {
1094         case 14:
1095           switch (field)
1096             {
1097             case e_rsel:
1098             case e_rrsel:
1099               final_type = R_PARISC_PCREL14R;
1100               break;
1101             case e_fsel:
1102               final_type = R_PARISC_PCREL14F;
1103               break;
1104             default:
1105               return NULL;
1106             }
1107           break;
1108
1109         case 17:
1110           switch (field)
1111             {
1112             case e_rsel:
1113             case e_rrsel:
1114               final_type = R_PARISC_PCREL17R;
1115               break;
1116             case e_fsel:
1117               final_type = R_PARISC_PCREL17F;
1118               break;
1119             default:
1120               return NULL;
1121             }
1122           break;
1123
1124         case 21:
1125           switch (field)
1126             {
1127             case e_lsel:
1128             case e_lrsel:
1129               final_type = R_PARISC_PCREL21L;
1130               break;
1131             default:
1132               return NULL;
1133             }
1134           break;
1135
1136         default:
1137           return NULL;
1138         }
1139       break;
1140
1141     default:
1142       return NULL;
1143     }
1144
1145   return final_types;
1146 }
1147
1148 #undef final_type
1149
1150 /* Set the contents of a particular section at a particular location.  */
1151
1152 static boolean
1153 elf32_hppa_set_section_contents (abfd, section, location, offset, count)
1154      bfd *abfd;
1155      sec_ptr section;
1156      PTR location;
1157      file_ptr offset;
1158      bfd_size_type count;
1159 {
1160   /* Ignore write requests for the symbol extension section until we've
1161      had the chance to rebuild it ourselves.  */
1162   if (!strcmp (section->name, ".PARISC.symextn") && !symext_chain_size)
1163     return true;
1164   else
1165     return _bfd_elf_set_section_contents (abfd, section, location,
1166                                           offset, count);
1167 }
1168
1169 /* Translate from an elf into field into a howto relocation pointer.  */
1170
1171 static void
1172 elf_info_to_howto (abfd, cache_ptr, dst)
1173      bfd *abfd;
1174      arelent *cache_ptr;
1175      Elf32_Internal_Rela *dst;
1176 {
1177   BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_PARISC_UNIMPLEMENTED);
1178   cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)];
1179 }
1180
1181
1182 /* Actually perform a relocation.  NOTE this is (mostly) superceeded
1183    by elf32_hppa_bfd_final_link_relocate which is called by the new
1184    fast linker.  */
1185
1186 static bfd_reloc_status_type
1187 hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1188                 error_message)
1189      bfd *abfd;
1190      arelent *reloc_entry;
1191      asymbol *symbol_in;
1192      PTR data;
1193      asection *input_section;
1194      bfd *output_bfd;
1195      char **error_message;
1196 {
1197   /* It is no longer valid to call hppa_elf_reloc when creating
1198      a final executable.  */
1199   if (output_bfd)
1200     {
1201       reloc_entry->address += input_section->output_offset;
1202
1203       /* Work around lossage in generic elf code to write relocations.
1204          (maps different section symbols into the same symbol index).  */
1205       if ((symbol_in->flags & BSF_SECTION_SYM)
1206           && symbol_in->section)
1207         reloc_entry->addend += symbol_in->section->output_offset;
1208       return bfd_reloc_ok;
1209     }
1210   else
1211     {
1212       *error_message = (char *) "Unsupported call to hppa_elf_reloc";
1213       return bfd_reloc_notsupported;
1214     }
1215 }
1216
1217 /* Actually perform a relocation as part of a final link.  This can get
1218    rather hairy when linker stubs are needed.  */
1219
1220 static bfd_reloc_status_type
1221 elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
1222                                     input_section, contents, offset, value,
1223                                     addend, info, sym_sec, sym_name, is_local)
1224      reloc_howto_type *howto;
1225      bfd *input_bfd;
1226      bfd *output_bfd;
1227      asection *input_section;
1228      bfd_byte *contents;
1229      bfd_vma offset;
1230      bfd_vma value;
1231      bfd_vma addend;
1232      struct bfd_link_info *info;
1233      asection *sym_sec;
1234      const char *sym_name;
1235      int is_local;
1236 {
1237   unsigned long insn;
1238   unsigned long r_type = howto->type;
1239   unsigned long r_format = howto->bitsize;
1240   unsigned long r_field = e_fsel;
1241   bfd_byte *hit_data = contents + offset;
1242   boolean r_pcrel = howto->pc_relative;
1243
1244   insn = bfd_get_32 (input_bfd, hit_data);
1245
1246   /* Make sure we have a value for $global$.  FIXME isn't this effectively
1247      just like the gp pointer on MIPS?  Can we use those routines for this
1248      purpose?  */
1249   if (!elf32_hppa_hash_table (info)->global_sym_defined)
1250     {
1251       struct elf_link_hash_entry *h;
1252       asection *sec;
1253
1254       h = elf_link_hash_lookup (elf_hash_table (info), "$global$", false,
1255                                  false, false);
1256
1257       /* If there isn't a $global$, then we're in deep trouble.  */
1258       if (h == NULL)
1259         return bfd_reloc_notsupported;
1260
1261       /* If $global$ isn't a defined symbol, then we're still in deep
1262          trouble.  */
1263       if (h->root.type != bfd_link_hash_defined)
1264         return bfd_reloc_undefined;
1265
1266       sec = h->root.u.def.section;
1267       elf32_hppa_hash_table (info)->global_value = (h->root.u.def.value
1268                                                     + sec->output_section->vma
1269                                                     + sec->output_offset);
1270       elf32_hppa_hash_table (info)->global_sym_defined = 1;
1271     }
1272
1273   switch (r_type)
1274     {
1275     case R_PARISC_NONE:
1276       break;
1277
1278     case R_PARISC_DIR32:
1279     case R_PARISC_DIR17F:
1280     case R_PARISC_PCREL17C:
1281       r_field = e_fsel;
1282       goto do_basic_type_1;
1283     case R_PARISC_DIR21L:
1284     case R_PARISC_PCREL21L:
1285       r_field = e_lrsel;
1286       goto do_basic_type_1;
1287     case R_PARISC_DIR17R:
1288     case R_PARISC_PCREL17R:
1289     case R_PARISC_DIR14R:
1290     case R_PARISC_PCREL14R:
1291       r_field = e_rrsel;
1292       goto do_basic_type_1;
1293
1294     /* For all the DP relative relocations, we need to examine the symbol's
1295        section.  If it's a code section, then "data pointer relative" makes
1296        no sense.  In that case we don't adjust the "value", and for 21 bit
1297        addil instructions, we change the source addend register from %dp to
1298        %r0.  */
1299     case R_PARISC_DPREL21L:
1300       r_field = e_lrsel;
1301       if (sym_sec->flags & SEC_CODE)
1302         {
1303           if ((insn & 0xfc000000) >> 26 == 0xa
1304                && (insn & 0x03e00000) >> 21 == 0x1b)
1305             insn &= ~0x03e00000;
1306         }
1307       else
1308         value -= elf32_hppa_hash_table (info)->global_value;
1309       goto do_basic_type_1;
1310     case R_PARISC_DPREL14R:
1311       r_field = e_rrsel;
1312       if ((sym_sec->flags & SEC_CODE) == 0)
1313         value -= elf32_hppa_hash_table (info)->global_value;
1314       goto do_basic_type_1;
1315     case R_PARISC_DPREL14F:
1316       r_field = e_fsel;
1317       if ((sym_sec->flags & SEC_CODE) == 0)
1318         value -= elf32_hppa_hash_table (info)->global_value;
1319       goto do_basic_type_1;
1320
1321     /* These cases are separate as they may involve a lot more work
1322        to deal with linker stubs.  */
1323     case R_PARISC_PLABEL32:
1324     case R_PARISC_PLABEL21L:
1325     case R_PARISC_PLABEL14R:
1326     case R_PARISC_PCREL17F:
1327       {
1328         bfd_vma location;
1329         unsigned int len, caller_args, callee_args;
1330         arg_reloc_type arg_reloc_types[5];
1331         struct elf32_hppa_args_hash_table *args_hash_table;
1332         struct elf32_hppa_args_hash_entry *args_hash;
1333         char *new_name, *stub_name;
1334
1335         /* Get the field selector right.  We'll need it in a minute.  */
1336         if (r_type == R_PARISC_PCREL17F
1337             || r_type == R_PARISC_PLABEL32)
1338           r_field = e_fsel;
1339         else if (r_type == R_PARISC_PLABEL21L)
1340           r_field = e_lrsel;
1341         else if (r_type == R_PARISC_PLABEL14R)
1342           r_field = e_rrsel;
1343
1344         /* Find out where we are and where we're going.  */
1345         location = (offset +
1346                     input_section->output_offset +
1347                     input_section->output_section->vma);
1348
1349         /* Now look for the argument relocation bits associated with the
1350            target.  */
1351         len = strlen (sym_name) + 1;
1352         if (is_local)
1353           len += 9;
1354         new_name = bfd_malloc (len);
1355         if (!new_name)
1356           return bfd_reloc_notsupported;
1357         strcpy (new_name, sym_name);
1358
1359         /* Local symbols have unique IDs.  */
1360         if (is_local)
1361           sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
1362
1363         args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1364
1365         args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
1366                                                  new_name, false, false);
1367         if (args_hash == NULL)
1368           callee_args = 0;
1369         else
1370           callee_args = args_hash->arg_bits;
1371
1372         /* If this is a CALL relocation, then get the caller's bits
1373            from the addend.  Else use the magic 0x155 value for PLABELS.
1374
1375            Also we don't care about the destination (value) for PLABELS.  */
1376         if (r_type == R_PARISC_PCREL17F)
1377           caller_args = HPPA_R_ARG_RELOC (addend);
1378         else
1379           {
1380             caller_args = 0x155;
1381             location = value;
1382           }
1383
1384         /* Any kind of linker stub needed?  */
1385         if (((int)(value - location) > 0x3ffff)
1386             || ((int)(value - location) < (int)0xfffc0000)
1387             || elf32_hppa_arg_reloc_needed (caller_args, callee_args,
1388                                             arg_reloc_types))
1389           {
1390             struct elf32_hppa_stub_hash_table *stub_hash_table;
1391             struct elf32_hppa_stub_hash_entry *stub_hash;
1392             asection *stub_section;
1393
1394             /* Build a name for the stub.  */
1395
1396             len = strlen (new_name);
1397             len += 23;
1398             stub_name = bfd_malloc (len);
1399             if (!stub_name)
1400               return bfd_reloc_notsupported;
1401             elf32_hppa_name_of_stub (caller_args, callee_args,
1402                                      location, value, stub_name);
1403             strcat (stub_name, new_name);
1404             free (new_name);
1405
1406             stub_hash_table = elf32_hppa_hash_table (info)->stub_hash_table;
1407
1408             stub_hash
1409               = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
1410                                              false, false);
1411
1412             /* We're done with that name.  */
1413             free (stub_name);
1414
1415             /* The stub BFD only has one section.  */
1416             stub_section = stub_hash_table->stub_bfd->sections;
1417
1418             if (stub_hash != NULL)
1419               {
1420
1421                 if (r_type == R_PARISC_PCREL17F)
1422                   {
1423                     unsigned long delay_insn;
1424                     unsigned int opcode, rtn_reg, ldo_target_reg, ldo_src_reg;
1425
1426                     /* We'll need to peek at the next insn.  */
1427                     delay_insn = bfd_get_32 (input_bfd, hit_data + 4);
1428                     opcode = get_opcode (delay_insn);
1429
1430                     /* We also need to know the return register for this
1431                        call.  */
1432                     rtn_reg = (insn & 0x03e00000) >> 21;
1433
1434                     ldo_src_reg = (delay_insn & 0x03e00000) >> 21;
1435                     ldo_target_reg = (delay_insn & 0x001f0000) >> 16;
1436
1437                     /* Munge up the value and other parameters for
1438                        hppa_elf_relocate_insn.  */
1439
1440                     value = (stub_hash->offset
1441                              + stub_section->output_offset
1442                              + stub_section->output_section->vma);
1443
1444                     r_format = 17;
1445                     r_field = e_fsel;
1446                     r_pcrel = 0;
1447                     addend = 0;
1448
1449                     /* We need to peek at the delay insn and determine if
1450                        we'll need to swap the branch and its delay insn.  */
1451                     if ((insn & 2)
1452                         || (opcode == LDO
1453                             && ldo_target_reg == rtn_reg)
1454                         || (delay_insn == 0x08000240))
1455                       {
1456                         /* No need to swap the branch and its delay slot, but
1457                            we do need to make sure to jump past the return
1458                            pointer update in the stub.  */
1459                         value += 4;
1460
1461                         /* If the delay insn does a return pointer adjustment,
1462                            then we have to make sure it stays valid.  */
1463                         if (opcode == LDO
1464                             && ldo_target_reg == rtn_reg)
1465                           {
1466                             delay_insn &= 0xfc00ffff;
1467                             delay_insn |= ((31 << 21) | (31 << 16));
1468                             bfd_put_32 (input_bfd, delay_insn, hit_data + 4);
1469                           }
1470                         /* Use a BLE to reach the stub.  */
1471                         insn = BLE_SR4_R0;
1472                       }
1473                     else
1474                       {
1475                         /* Wonderful, we have to swap the call insn and its
1476                            delay slot.  */
1477                         bfd_put_32 (input_bfd, delay_insn, hit_data);
1478                         /* Use a BLE,n to reach the stub.  */
1479                         insn = (BLE_SR4_R0 | 0x2);
1480                         bfd_put_32 (input_bfd, insn, hit_data + 4);
1481                         insn = hppa_elf_relocate_insn (input_bfd,
1482                                                        input_section,
1483                                                        insn, offset + 4,
1484                                                        value, addend,
1485                                                        r_format, r_field,
1486                                                        r_pcrel);
1487                         /* Update the instruction word.  */
1488                         bfd_put_32 (input_bfd, insn, hit_data + 4);
1489                         return bfd_reloc_dangerous;
1490                       }
1491                   }
1492                 else
1493                   {
1494                     /* PLABEL stuff is easy.  */
1495
1496                     value = (stub_hash->offset
1497                              + stub_section->output_offset
1498                              + stub_section->output_section->vma);
1499                     /* We don't need the RP adjustment for PLABELs.  */
1500                     value += 4;
1501                     if (r_type == R_PARISC_PLABEL32)
1502                       r_format = 32;
1503                     else if (r_type == R_PARISC_PLABEL21L)
1504                       r_format = 21;
1505                     else if (r_type == R_PARISC_PLABEL14R)
1506                       r_format = 14;
1507
1508                     r_pcrel = 0;
1509                     addend = 0;
1510                   }
1511                 }
1512               else
1513                 return bfd_reloc_notsupported;
1514           }
1515         goto do_basic_type_1;
1516       }
1517
1518 do_basic_type_1:
1519       insn = hppa_elf_relocate_insn (input_bfd, input_section, insn,
1520                                      offset, value, addend, r_format,
1521                                      r_field, r_pcrel);
1522       break;
1523
1524     /* Something we don't know how to handle.  */
1525     default:
1526       return bfd_reloc_notsupported;
1527     }
1528
1529   /* Update the instruction word.  */
1530   bfd_put_32 (input_bfd, insn, hit_data);
1531   return (bfd_reloc_ok);
1532 }
1533
1534 /* Return the address of the howto table entry to perform the CODE
1535    relocation for an ARCH machine.  */
1536
1537 static reloc_howto_type *
1538 elf_hppa_reloc_type_lookup (abfd, code)
1539      bfd *abfd;
1540      bfd_reloc_code_real_type code;
1541 {
1542   if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
1543     {
1544       BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1545       return &elf_hppa_howto_table[(int) code];
1546     }
1547   return NULL;
1548 }
1549
1550 /* Return true if SYM represents a local label symbol.  */
1551
1552 static boolean
1553 hppa_elf_is_local_label (abfd, sym)
1554      bfd *abfd;
1555      asymbol *sym;
1556 {
1557   return (sym->name[0] == 'L' && sym->name[1] == '$');
1558 }
1559
1560 /* Do any backend specific processing when beginning to write an object
1561    file.  For PA ELF we need to determine the size of the symbol extension
1562    section *before* any other output processing happens.  */
1563
1564 static void
1565 elf32_hppa_backend_begin_write_processing (abfd, info)
1566      bfd *abfd;
1567      struct bfd_link_info *info;
1568 {
1569   unsigned int i;
1570   asection *symextn_sec;
1571
1572   /* Size up the symbol extension section.  */
1573   if ((abfd->outsymbols == NULL
1574        && info == NULL)
1575       || symext_chain_size != 0)
1576     return;
1577
1578   if (info == NULL)
1579     {
1580       /* We were not called from the BFD ELF linker code, so we need
1581          to examine the output BFD's outsymbols.
1582
1583          Note we can not build the symbol extensions now as the symbol
1584          map hasn't been set up.  */
1585       for (i = 0; i < abfd->symcount; i++)
1586         {
1587           elf_symbol_type *symbol = (elf_symbol_type *)abfd->outsymbols[i];
1588
1589           /* Only functions ever need an entry in the symbol extension
1590              section.  */
1591           if (!(symbol->symbol.flags & BSF_FUNCTION))
1592             continue;
1593
1594           /* And only if they specify the locations of their arguments.  */
1595           if (symbol->tc_data.hppa_arg_reloc == 0)
1596             continue;
1597
1598           /* Yup.  This function symbol needs an entry.  */
1599           symext_chain_size += 2 * ELF32_PARISC_SX_SIZE;
1600         }
1601     }
1602   else if (info->relocateable == true)
1603     {
1604       struct elf32_hppa_args_hash_table *table;
1605       table = elf32_hppa_hash_table (info)->args_hash_table;
1606
1607       /* Determine the size of the symbol extension section.  */
1608       elf32_hppa_args_hash_traverse (table,
1609                                      elf32_hppa_size_symext,
1610                                      &symext_chain_size);
1611     }
1612
1613   /* Now create the section and set its size.  We'll fill in the
1614      contents later.  */
1615   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1616   if (symextn_sec == NULL)
1617     symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME);
1618
1619   bfd_set_section_flags (abfd, symextn_sec,
1620                          SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA);
1621   symextn_sec->output_section = symextn_sec;
1622   symextn_sec->output_offset = 0;
1623   bfd_set_section_alignment (abfd, symextn_sec, 2);
1624   bfd_set_section_size (abfd, symextn_sec, symext_chain_size);
1625 }
1626
1627 /* Called for each entry in the args location hash table.  For each
1628    entry we bump the size pointer by 2 records (16 bytes).  */
1629
1630 static boolean
1631 elf32_hppa_size_symext (gen_entry, in_args)
1632      struct bfd_hash_entry *gen_entry;
1633      PTR in_args;
1634 {
1635   bfd_size_type *sizep = (bfd_size_type *)in_args;
1636
1637   *sizep += 2 * ELF32_PARISC_SX_SIZE;
1638   return true;
1639 }
1640
1641 /* Backend routine called by the linker for each output symbol.
1642
1643    For PA ELF we use this opportunity to add an appropriate entry
1644    to the symbol extension chain for function symbols.  */
1645
1646 static boolean
1647 elf32_hppa_link_output_symbol_hook (abfd, info, name, sym, section)
1648      bfd *abfd;
1649      struct bfd_link_info *info;
1650      const char *name;
1651      Elf_Internal_Sym *sym;
1652      asection *section;
1653 {
1654   char *new_name;
1655   unsigned int len, index;
1656   struct elf32_hppa_args_hash_table *args_hash_table;
1657   struct elf32_hppa_args_hash_entry *args_hash;
1658
1659   /* If the args hash table is NULL, then we've encountered an error
1660      of some sorts (for example, an undefined symbol).  In that case
1661      we've got nothing else to do.
1662
1663      NOTE: elf_link_output_symbol will abort if we return false here!  */
1664   if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
1665     return true;
1666
1667   index = elf32_hppa_hash_table (info)->output_symbol_count++;
1668
1669   /* We need to look up this symbol in the args hash table to see if
1670      it has argument relocation bits.  */
1671   if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
1672     return true;
1673
1674   /* We know it's a function symbol of some kind.  */
1675   len = strlen (name) + 1;
1676   if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1677     len += 9;
1678
1679   new_name = bfd_malloc (len);
1680   if (new_name == NULL)
1681     return false;
1682
1683   strcpy (new_name, name);
1684   if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1685     sprintf (new_name + len - 10, "_%08x", (int)section);
1686
1687   /* Now that we have the unique name, we can look it up in the
1688      args hash table.  */
1689   args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1690   args_hash = elf32_hppa_args_hash_lookup (args_hash_table, new_name,
1691                                            false, false);
1692   free (new_name);
1693   if (args_hash == NULL)
1694     return true;
1695
1696   /* We know this symbol has arg reloc bits.  */
1697   add_entry_to_symext_chain (abfd, args_hash->arg_bits,
1698                              index, &symext_rootP, &symext_lastP);
1699   return true;
1700 }
1701
1702 /* Perform any processing needed late in the object file writing process.
1703    For PA ELF we build and set the contents of the symbol extension
1704    section.  */
1705
1706 static void
1707 elf32_hppa_backend_final_write_processing (abfd, linker)
1708      bfd *abfd;
1709      boolean linker;
1710 {
1711   asection *symextn_sec;
1712   unsigned int i;
1713
1714   /* Now build the symbol extension section.  */
1715   if (symext_chain_size == 0)
1716     return;
1717
1718   if (! linker)
1719     {
1720       /* We were not called from the backend linker, so we still need
1721          to build the symbol extension chain.
1722
1723          Look at each symbol, adding the appropriate information to the
1724          symbol extension section list as necessary.  */
1725       for (i = 0; i < abfd->symcount; i++)
1726         {
1727           elf_symbol_type *symbol = (elf_symbol_type *) abfd->outsymbols[i];
1728
1729           /* Only functions ever need an entry in the symbol extension
1730              section.  */
1731           if (!(symbol->symbol.flags & BSF_FUNCTION))
1732             continue;
1733
1734           /* And only if they specify the locations of their arguments.  */
1735           if (symbol->tc_data.hppa_arg_reloc == 0)
1736             continue;
1737
1738           /* Add this symbol's information to the chain.  */
1739           add_entry_to_symext_chain (abfd, symbol->tc_data.hppa_arg_reloc,
1740                                      symbol->symbol.udata.i, &symext_rootP,
1741                                      &symext_lastP);
1742         }
1743     }
1744
1745   /* Now fill in the contents of the symbol extension section.  */
1746   elf_hppa_tc_make_sections (abfd, symext_rootP);
1747
1748   /* And attach that as the section's contents.  */
1749   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1750   if (symextn_sec == (asection *) 0)
1751     abort();
1752
1753   symextn_sec->contents = (void *)symextn_contents;
1754
1755   bfd_set_section_contents (abfd, symextn_sec, symextn_sec->contents,
1756                             symextn_sec->output_offset, symextn_sec->_raw_size);
1757 }
1758
1759 /* Update the symbol extention chain to include the symbol pointed to
1760    by SYMBOLP if SYMBOLP is a function symbol.  Used internally and by GAS.  */
1761
1762 static void
1763 add_entry_to_symext_chain (abfd, arg_reloc, sym_idx, symext_root, symext_last)
1764      bfd *abfd;
1765      unsigned int arg_reloc;
1766      unsigned int sym_idx;
1767      symext_chainS **symext_root;
1768      symext_chainS **symext_last;
1769 {
1770   symext_chainS *symextP;
1771
1772   /* Allocate memory and initialize this entry.  */
1773   symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
1774   if (!symextP)
1775     abort();                    /* FIXME */
1776
1777   symextP[0].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_SYMNDX, sym_idx);
1778   symextP[0].next = &symextP[1];
1779
1780   symextP[1].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_ARG_RELOC, arg_reloc);
1781   symextP[1].next = NULL;
1782
1783   /* Now update the chain itself so it can be walked later to build
1784      the symbol extension section.  */
1785   if (*symext_root == NULL)
1786     {
1787       *symext_root = &symextP[0];
1788       *symext_last = &symextP[1];
1789     }
1790   else
1791     {
1792       (*symext_last)->next = &symextP[0];
1793       *symext_last = &symextP[1];
1794     }
1795 }
1796
1797 /* Build the symbol extension section.  */
1798
1799 static void
1800 elf_hppa_tc_make_sections (abfd, symext_root)
1801      bfd *abfd;
1802      symext_chainS *symext_root;
1803 {
1804   symext_chainS *symextP;
1805   unsigned int i;
1806   asection *symextn_sec;
1807
1808   symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1809
1810   /* Grab some memory for the contents of the symbol extension section
1811      itself.  */
1812   symextn_contents = (bfd_byte *) bfd_zalloc (abfd,
1813                                               symextn_sec->_raw_size);
1814   if (!symextn_contents)
1815     abort();                    /* FIXME */
1816
1817   /* Fill in the contents of the symbol extension chain.  */
1818   for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i)
1819     ELF32_PARISC_SX_PUT (abfd, (bfd_vma) symextP->entry,
1820                          symextn_contents + i * ELF32_PARISC_SX_SIZE);
1821
1822   return;
1823 }
1824
1825 /* Do some PA ELF specific work after reading in the symbol table.
1826    In particular attach the argument relocation from the
1827    symbol extension section to the appropriate symbols.  */
1828
1829 static boolean
1830 elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
1831      bfd *abfd;
1832      elf_symbol_type *esyms;
1833      unsigned int symcnt;
1834 {
1835   Elf32_Internal_Shdr *symextn_hdr =
1836     bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
1837   unsigned int i, current_sym_idx = 0;
1838
1839   /* If no symbol extension existed, then all symbol extension information
1840      is assumed to be zero.  */
1841   if (symextn_hdr == NULL)
1842     {
1843       for (i = 0; i < symcnt; i++)
1844         esyms[i].tc_data.hppa_arg_reloc = 0;
1845       return (true);
1846     }
1847
1848   /* FIXME:  Why not use bfd_get_section_contents here?  Also should give
1849      memory back when we're done.  */
1850   /* Allocate a buffer of the appropriate size for the symextn section.  */
1851   symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
1852   if (!symextn_hdr->contents)
1853     return false;
1854
1855   /* Read in the symextn section.  */
1856   if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
1857     return false;
1858   if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->sh_size, abfd)
1859       != symextn_hdr->sh_size)
1860     return false;
1861
1862   /* Parse entries in the symbol extension section, updating the symtab
1863      entries as we go */
1864   for (i = 0; i < symextn_hdr->sh_size / ELF32_PARISC_SX_SIZE; i++)
1865     {
1866       symext_entryS se =
1867         ELF32_PARISC_SX_GET (abfd,
1868                              (symextn_hdr->contents
1869                               + i * ELF32_PARISC_SX_SIZE));
1870       unsigned int se_value = ELF32_PARISC_SX_VAL (se);
1871       unsigned int se_type = ELF32_PARISC_SX_TYPE (se);
1872
1873       switch (se_type)
1874         {
1875         case PARISC_SXT_NULL:
1876           break;
1877
1878         case PARISC_SXT_SYMNDX:
1879           if (se_value >= symcnt)
1880             {
1881               bfd_set_error (bfd_error_bad_value);
1882               return (false);
1883             }
1884           current_sym_idx = se_value - 1;
1885           break;
1886
1887         case PARISC_SXT_ARG_RELOC:
1888           esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
1889           break;
1890
1891         default:
1892           bfd_set_error (bfd_error_bad_value);
1893           return (false);
1894         }
1895     }
1896   return (true);
1897 }
1898
1899 /* Read and attach the symbol extension information for the symbols
1900    in INPUT_BFD to the argument location hash table.  Handle locals
1901    if DO_LOCALS is true; likewise for globals when DO_GLOBALS is true.  */
1902
1903 static boolean
1904 elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table, local_syms)
1905      bfd *input_bfd;
1906      Elf_Internal_Shdr *symtab_hdr;
1907      struct elf32_hppa_args_hash_table *args_hash_table;
1908      Elf_Internal_Sym *local_syms;
1909 {
1910   asection *symextn_sec;
1911   bfd_byte *contents;
1912   unsigned int i, n_entries, current_index = 0;
1913
1914   /* Get the symbol extension section for this BFD.  If no section exists
1915      then there's nothing to do.  Likewise if the section exists, but
1916      has no contents.  */
1917   symextn_sec = bfd_get_section_by_name (input_bfd, SYMEXTN_SECTION_NAME);
1918   if (symextn_sec == NULL)
1919     return true;
1920
1921   /* Done separately so we can turn off SEC_HAS_CONTENTS (see below).  */
1922   if (symextn_sec->_raw_size == 0)
1923     {
1924       symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1925       return true;
1926     }
1927
1928   contents = (bfd_byte *) bfd_malloc ((size_t) symextn_sec->_raw_size);
1929   if (contents == NULL)
1930     return false;
1931
1932   /* How gross.  We turn off SEC_HAS_CONTENTS for the input symbol extension
1933      sections to keep the generic ELF/BFD code from trying to do anything
1934      with them.  We have to undo that hack temporarily so that we can read
1935      in the contents with the generic code.  */
1936   symextn_sec->flags |= SEC_HAS_CONTENTS;
1937   if (bfd_get_section_contents (input_bfd, symextn_sec, contents,
1938                                 0, symextn_sec->_raw_size) == false)
1939     {
1940       symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1941       free (contents);
1942       return false;
1943     }
1944
1945   /* Gross.  Turn off SEC_HAS_CONTENTS for the input symbol extension
1946      sections (see above).  */
1947   symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1948
1949   n_entries = symextn_sec->_raw_size / ELF32_PARISC_SX_SIZE;
1950   for (i = 0; i < n_entries; i++)
1951     {
1952       symext_entryS entry =
1953         ELF32_PARISC_SX_GET (input_bfd, contents + i * ELF32_PARISC_SX_SIZE);
1954       unsigned int value = ELF32_PARISC_SX_VAL (entry);
1955       unsigned int type = ELF32_PARISC_SX_TYPE (entry);
1956       struct elf32_hppa_args_hash_entry *args_hash;
1957
1958       switch (type)
1959         {
1960         case PARISC_SXT_NULL:
1961           break;
1962
1963         case PARISC_SXT_SYMNDX:
1964           if (value >= symtab_hdr->sh_size / sizeof (Elf32_External_Sym))
1965             {
1966               bfd_set_error (bfd_error_bad_value);
1967               free (contents);
1968               return false;
1969             }
1970           current_index = value;
1971           break;
1972
1973         case PARISC_SXT_ARG_RELOC:
1974           if (current_index < symtab_hdr->sh_info)
1975             {
1976               Elf_Internal_Shdr *hdr;
1977               char *new_name;
1978               const char *sym_name;
1979               asection *sym_sec;
1980               unsigned int len;
1981
1982               hdr = elf_elfsections (input_bfd)[local_syms[current_index].st_shndx];
1983               sym_sec = hdr->bfd_section;
1984               sym_name = bfd_elf_string_from_elf_section (input_bfd,
1985                                                       symtab_hdr->sh_link,
1986                                         local_syms[current_index].st_name);
1987               len = strlen (sym_name) + 10;
1988               new_name = bfd_malloc (len);
1989               if (new_name == NULL)
1990                 {
1991                   free (contents);
1992                   return false;
1993                 }
1994               strcpy (new_name, sym_name);
1995               sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
1996
1997               /* This is a global symbol with argument location info.
1998                  We need to enter it into the hash table.  */
1999               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2000                                                        new_name, true,
2001                                                        true);
2002               free (new_name);
2003               if (args_hash == NULL)
2004                 {
2005                   free (contents);
2006                   return false;
2007                 }
2008               args_hash->arg_bits = value;
2009               break;
2010             }
2011           else if (current_index >= symtab_hdr->sh_info)
2012             {
2013               struct elf_link_hash_entry *h;
2014
2015               current_index -= symtab_hdr->sh_info;
2016               h = elf_sym_hashes(input_bfd)[current_index];
2017               /* This is a global symbol with argument location
2018                  information.  We need to enter it into the hash table.  */
2019               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2020                                                        h->root.root.string,
2021                                                        true, true);
2022               if (args_hash == NULL)
2023                 {
2024                   bfd_set_error (bfd_error_bad_value);
2025                   free (contents);
2026                   return false;
2027                 }
2028               args_hash->arg_bits = value;
2029               break;
2030             }
2031           else
2032             break;
2033
2034         default:
2035           bfd_set_error (bfd_error_bad_value);
2036           free (contents);
2037           return false;
2038         }
2039     }
2040   free (contents);
2041   return true;
2042 }
2043
2044 /* Undo the generic ELF code's subtraction of section->vma from the
2045    value of each external symbol.  */
2046
2047 static boolean
2048 elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2049      bfd *abfd;
2050      struct bfd_link_info *info;
2051      const Elf_Internal_Sym *sym;
2052      const char **namep;
2053      flagword *flagsp;
2054      asection **secp;
2055      bfd_vma *valp;
2056 {
2057   *valp += (*secp)->vma;
2058   return true;
2059 }
2060
2061 /* Determine the name of the stub needed to perform a call assuming the
2062    argument relocation bits for caller and callee are in CALLER and CALLEE
2063    for a call from LOCATION to DESTINATION.  Copy the name into STUB_NAME.  */
2064
2065 static void
2066 elf32_hppa_name_of_stub (caller, callee, location, destination, stub_name)
2067      unsigned int caller, callee;
2068      bfd_vma location, destination;
2069      char *stub_name;
2070 {
2071   arg_reloc_type arg_reloc_types[5];
2072
2073   if (elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types))
2074     {
2075       arg_reloc_location i;
2076       /* Fill in the basic template.  */
2077       strcpy (stub_name, "__XX_XX_XX_XX_XX_stub_");
2078
2079       /* Now fix the specifics.  */
2080       for (i = ARG0; i <= RET; i++)
2081         switch (arg_reloc_types[i])
2082           {
2083             case NO:
2084               stub_name[3 * i + 2] = 'N';
2085               stub_name[3 * i + 3] = 'O';
2086               break;
2087             case GF:
2088               stub_name[3 * i + 2] = 'G';
2089               stub_name[3 * i + 3] = 'F';
2090               break;
2091             case FG:
2092               stub_name[3 * i + 2] = 'F';
2093               stub_name[3 * i + 3] = 'G';
2094               break;
2095             case GD:
2096               stub_name[3 * i + 2] = 'G';
2097               stub_name[3 * i + 3] = 'D';
2098               break;
2099             case DG:
2100               stub_name[3 * i + 2] = 'D';
2101               stub_name[3 * i + 3] = 'G';
2102               break;
2103           }
2104     }
2105   else
2106     strcpy (stub_name, "_____long_branch_stub_");
2107 }
2108
2109 /* Determine if an argument relocation stub is needed to perform a
2110    call assuming the argument relocation bits for caller and callee
2111    are in CALLER and CALLEE.  Place the type of relocations (if any)
2112    into stub_types_p.  */
2113
2114 static boolean
2115 elf32_hppa_arg_reloc_needed (caller, callee, stub_types)
2116      unsigned int caller, callee;
2117      arg_reloc_type stub_types[5];
2118 {
2119   /* Special case for no relocations.  */
2120   if (caller == 0 || callee == 0)
2121     return 0;
2122   else
2123     {
2124       arg_location caller_loc[5];
2125       arg_location callee_loc[5];
2126
2127       /* Extract the location information for the argument and return
2128          value on both the caller and callee sides.  */
2129       caller_loc[ARG0] = EXTRACT_ARBITS (caller, ARG0);
2130       callee_loc[ARG0] = EXTRACT_ARBITS (callee, ARG0);
2131       caller_loc[ARG1] = EXTRACT_ARBITS (caller, ARG1);
2132       callee_loc[ARG1] = EXTRACT_ARBITS (callee, ARG1);
2133       caller_loc[ARG2] = EXTRACT_ARBITS (caller, ARG2);
2134       callee_loc[ARG2] = EXTRACT_ARBITS (callee, ARG2);
2135       caller_loc[ARG3] = EXTRACT_ARBITS (caller, ARG3);
2136       callee_loc[ARG3] = EXTRACT_ARBITS (callee, ARG3);
2137       caller_loc[RET] = EXTRACT_ARBITS (caller, RET);
2138       callee_loc[RET] = EXTRACT_ARBITS (callee, RET);
2139
2140       /* Check some special combinations.  This is necessary to
2141          deal with double precision FP arguments.  */
2142       if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2143         {
2144           caller_loc[ARG0] = AR_FPDBL1;
2145           caller_loc[ARG1] = AR_NO;
2146         }
2147       if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2148         {
2149           caller_loc[ARG2] = AR_FPDBL2;
2150           caller_loc[ARG3] = AR_NO;
2151         }
2152       if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2153         {
2154           callee_loc[ARG0] = AR_FPDBL1;
2155           callee_loc[ARG1] = AR_NO;
2156         }
2157       if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2158         {
2159           callee_loc[ARG2] = AR_FPDBL2;
2160           callee_loc[ARG3] = AR_NO;
2161         }
2162
2163       /* Now look up any relocation needed for each argument and the
2164          return value.  */
2165       stub_types[ARG0] = arg_mismatches[caller_loc[ARG0]][callee_loc[ARG0]];
2166       stub_types[ARG1] = arg_mismatches[caller_loc[ARG1]][callee_loc[ARG1]];
2167       stub_types[ARG2] = arg_mismatches[caller_loc[ARG2]][callee_loc[ARG2]];
2168       stub_types[ARG3] = arg_mismatches[caller_loc[ARG3]][callee_loc[ARG3]];
2169       stub_types[RET] = ret_mismatches[caller_loc[RET]][callee_loc[RET]];
2170
2171       return (stub_types[ARG0] != NO
2172               || stub_types[ARG1] != NO
2173               || stub_types[ARG2] != NO
2174               || stub_types[ARG3] != NO
2175               || stub_types[RET] != NO);
2176     }
2177 }
2178
2179 /* Compute the size of the stub needed to call from LOCATION to DESTINATION
2180    (a function named SYM_NAME), with argument relocation bits CALLER and
2181    CALLEE.  Return zero if no stub is needed to perform such a call.  */
2182
2183 static unsigned int
2184 elf32_hppa_size_of_stub (callee, caller, location, destination, sym_name)
2185      unsigned int callee, caller;
2186      bfd_vma location, destination;
2187      const char *sym_name;
2188 {
2189   arg_reloc_type arg_reloc_types[5];
2190
2191   /* Determine if a long branch or argument relocation stub is needed.
2192      If an argument relocation stub is needed, the relocation will be
2193      stored into arg_reloc_types.  */
2194   if (!(((int)(location - destination) > 0x3ffff)
2195         || ((int)(location - destination) < (int)0xfffc0000)
2196         || elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types)))
2197     return 0;
2198
2199   /* Some kind of stub is needed.  Determine how big it needs to be.
2200      First check for argument relocation stubs as they also handle
2201      long calls.  Then check for long calls to millicode and finally
2202      the normal long calls.  */
2203   if (arg_reloc_types[ARG0] != NO
2204       || arg_reloc_types[ARG1] != NO
2205       || arg_reloc_types[ARG2] != NO
2206       || arg_reloc_types[ARG3] != NO
2207       || arg_reloc_types[RET] != NO)
2208     {
2209       /* Some kind of argument relocation stub is needed.  */
2210       unsigned int len = 16;
2211       arg_reloc_location i;
2212
2213       /* Each GR or FG relocation takes 2 insns, each GD or DG
2214          relocation takes 3 insns.  Plus 4 more insns for the
2215          RP adjustment, ldil & (be | ble) and copy.  */
2216       for (i = ARG0; i <= RET; i++)
2217         switch (arg_reloc_types[i])
2218           {
2219             case GF:
2220             case FG:
2221               len += 8;
2222               break;
2223
2224             case GD:
2225             case DG:
2226               len += 12;
2227               break;
2228
2229             default:
2230               break;
2231           }
2232
2233       /* Extra instructions are needed if we're relocating a return value.  */
2234       if (arg_reloc_types[RET] != NO)
2235         len += 12;
2236
2237       return len;
2238     }
2239   else if (!strncmp ("$$", sym_name, 2)
2240       && strcmp ("$$dyncall", sym_name))
2241     return 12;
2242   else
2243     return 16;
2244 }
2245
2246 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
2247    IN_ARGS contains the stub BFD and link info pointers.  */
2248
2249 static boolean
2250 elf32_hppa_build_one_stub (gen_entry, in_args)
2251      struct bfd_hash_entry *gen_entry;
2252      PTR in_args;
2253 {
2254   void **args = (void **)in_args;
2255   bfd *stub_bfd = (bfd *)args[0];
2256   struct bfd_link_info *info = (struct bfd_link_info *)args[1];
2257   struct elf32_hppa_stub_hash_entry *entry;
2258   struct elf32_hppa_stub_hash_table *stub_hash_table;
2259   bfd_byte *loc;
2260   symvalue sym_value;
2261   const char *sym_name;
2262
2263   /* Initialize pointers to the stub hash table, the particular entry we
2264      are building a stub for, and where (in memory) we should place the stub
2265      instructions.  */
2266   entry = (struct elf32_hppa_stub_hash_entry *)gen_entry;
2267   stub_hash_table = elf32_hppa_hash_table(info)->stub_hash_table;
2268   loc = stub_hash_table->location;
2269
2270   /* Make a note of the offset within the stubs for this entry.  */
2271   entry->offset = stub_hash_table->offset;
2272
2273   /* The symbol's name starts at offset 22.  */
2274   sym_name = entry->root.string + 22;
2275
2276   sym_value = (entry->target_value
2277                + entry->target_section->output_offset
2278                + entry->target_section->output_section->vma);
2279
2280   if (strncmp ("_____long_branch_stub_", entry->root.string, 22))
2281     {
2282       /* This must be an argument or return value relocation stub.  */
2283       unsigned long insn;
2284       arg_reloc_location i;
2285       bfd_byte *begin_loc = loc;
2286
2287       /* First the return pointer adjustment.  Depending on exact calling
2288          sequence this instruction may be skipped.  */
2289       bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2290       loc += 4;
2291
2292       /* If we are relocating a return value, then we're going to have
2293          to return into the stub.  So we have to save off the user's
2294          return pointer into the stack at RP'.  */
2295       if (strncmp (entry->root.string + 14, "NO", 2))
2296         {
2297           bfd_put_32 (stub_bfd, STW_R31_M8R30, loc);
2298           loc += 4;
2299         }
2300
2301       /* Iterate over the argument relocations, emitting instructions
2302          to move them around as necessary.  */
2303       for (i = ARG0; i <= ARG3; i++)
2304         {
2305           if (!strncmp (entry->root.string + 3 * i + 2, "GF", 2))
2306             {
2307               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((26 - i) << 16), loc);
2308               bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | (4 + i), loc + 4);
2309               loc += 8;
2310             }
2311           else if (!strncmp (entry->root.string + 3 * i + 2, "FG", 2))
2312             {
2313               bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | (4 + i), loc);
2314               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((26 - i) << 16), loc + 4);
2315               loc += 8;
2316             }
2317           else if (!strncmp (entry->root.string + 3 * i + 2, "GD", 2))
2318             {
2319               bfd_put_32 (stub_bfd, STW_ARG_M12R30 | ((26 - i) << 16), loc);
2320               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((25 - i) << 16), loc + 4);
2321               bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | (5 + i), loc + 8);
2322               loc += 12;
2323             }
2324           else if (!strncmp (entry->root.string + 3 * i + 2, "DG", 2))
2325             {
2326               bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | (5 + i), loc);
2327               bfd_put_32 (stub_bfd, LDW_M12R30_ARG | ((26 - i) << 16), loc + 4);
2328               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((25 - i) << 16), loc + 8);
2329               loc += 12;
2330             }
2331         }
2332
2333       /* Load the high bits of the target address into %r1.  */
2334       insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2335                                 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2336       bfd_put_32 (stub_bfd, insn, loc);
2337       loc += 4;
2338
2339       /* If we are relocating a return value, then we're going to have
2340          to return into the stub, then perform the return value relocation.  */
2341       if (strncmp (entry->root.string + 14, "NO", 2))
2342         {
2343           /* To return to the stub we "ble" to the target and copy the return
2344              pointer from %r31 into %r2.  */
2345           insn = hppa_rebuild_insn (stub_bfd,
2346                                     BLE_SR4_R1,
2347                                     hppa_field_adjust (sym_value, 0,
2348                                                        e_rrsel) >> 2,
2349                                     17);
2350           bfd_put_32 (stub_bfd, insn, loc);
2351           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2352
2353           /* Reload the return pointer for our caller from the stack.  */
2354           bfd_put_32 (stub_bfd, LDW_M8R30_R31, loc + 8);
2355           loc += 12;
2356
2357           /* Perform the return value relocation.  */
2358           if (!strncmp (entry->root.string + 14, "GF", 2))
2359             {
2360               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (28 << 16), loc);
2361               bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | 4, loc + 4);
2362               loc += 8;
2363             }
2364           else if (!strncmp (entry->root.string + 14, "FG", 2))
2365             {
2366               bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | 4, loc);
2367               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (28 << 16), loc + 4);
2368               loc += 8;
2369             }
2370           else if (!strncmp (entry->root.string + 2, "GD", 2))
2371             {
2372               bfd_put_32 (stub_bfd, STW_ARG_M12R30 | (28 << 16), loc);
2373               bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (29 << 16), loc + 4);
2374               bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | 4, loc + 8);
2375               loc += 12;
2376             }
2377           else if (!strncmp (entry->root.string + 2, "DG", 2))
2378             {
2379               bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | 4, loc);
2380               bfd_put_32 (stub_bfd, LDW_M12R30_ARG | (28 << 16), loc + 4);
2381               bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (29 << 16), loc + 8);
2382               loc += 12;
2383             }
2384           /* Branch back to the user's code now.  */
2385           bfd_put_32 (stub_bfd, BV_N_0_R31, loc);
2386           loc += 4;
2387         }
2388       else
2389         {
2390           /* No return value relocation, so we can simply "be" to the
2391              target and copy out return pointer into %r2.  */
2392           insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1,
2393                                     hppa_field_adjust (sym_value, 0,
2394                                                        e_rrsel) >> 2, 17);
2395           bfd_put_32 (stub_bfd, insn, loc);
2396           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2397           loc += 8;
2398         }
2399
2400       /* Update the location and offsets.  */
2401       stub_hash_table->location += (loc - begin_loc);
2402       stub_hash_table->offset += (loc - begin_loc);
2403     }
2404   else
2405     {
2406       /* Create one of two variant long branch stubs.  One for $$dyncall and
2407          normal calls, the other for calls to millicode.  */
2408       unsigned long insn;
2409       int millicode_call = 0;
2410
2411       if (!strncmp ("$$", sym_name, 2) && strcmp ("$$dyncall", sym_name))
2412         millicode_call = 1;
2413
2414       /* First the return pointer adjustment.  Depending on exact calling
2415          sequence this instruction may be skipped.  */
2416       bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2417
2418       /* The next two instructions are the long branch itself.  A long branch
2419          is formed with "ldil" loading the upper bits of the target address
2420          into a register, then branching with "be" which adds in the lower bits.
2421          Long branches to millicode nullify the delay slot of the "be".  */
2422       insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2423                                 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2424       bfd_put_32 (stub_bfd, insn, loc + 4);
2425       insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1 | (millicode_call ? 2 : 0),
2426                                 hppa_field_adjust (sym_value, 0, e_rrsel) >> 2,
2427                                 17);
2428       bfd_put_32 (stub_bfd, insn, loc + 8);
2429
2430       if (!millicode_call)
2431         {
2432           /* The sequence to call this stub places the return pointer into %r31,
2433              the final target expects the return pointer in %r2, so copy the
2434               return pointer into the proper register.  */
2435           bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 12);
2436
2437           /* Update the location and offsets.  */
2438           stub_hash_table->location += 16;
2439           stub_hash_table->offset += 16;
2440         }
2441       else
2442         {
2443           /* Update the location and offsets.  */
2444           stub_hash_table->location += 12;
2445           stub_hash_table->offset += 12;
2446         }
2447
2448     }
2449   return true;
2450 }
2451
2452 /* External entry points for sizing and building linker stubs.  */
2453
2454 /* Build all the stubs associated with the current output file.  The
2455    stubs are kept in a hash table attached to the main linker hash
2456    table.  This is called via hppaelf_finish in the linker.  */
2457
2458 boolean
2459 elf32_hppa_build_stubs (stub_bfd, info)
2460      bfd *stub_bfd;
2461      struct bfd_link_info *info;
2462 {
2463   /* The stub BFD only has one section.  */
2464   asection *stub_sec = stub_bfd->sections;
2465   struct elf32_hppa_stub_hash_table *table;
2466   unsigned int size;
2467   void *args[2];
2468
2469   /* So we can pass both the BFD for the stubs and the link info
2470      structure to the routine which actually builds stubs.  */
2471   args[0] = stub_bfd;
2472   args[1] = info;
2473
2474   /* Allocate memory to hold the linker stubs.  */
2475   size = bfd_section_size (stub_bfd, stub_sec);
2476   stub_sec->contents = (unsigned char *) bfd_zalloc (stub_bfd, size);
2477   if (stub_sec->contents == NULL)
2478     return false;
2479   table = elf32_hppa_hash_table(info)->stub_hash_table;
2480   table->location = stub_sec->contents;
2481
2482   /* Build the stubs as directed by the stub hash table.  */
2483   elf32_hppa_stub_hash_traverse (table, elf32_hppa_build_one_stub, args);
2484
2485   return true;
2486 }
2487
2488 /* Determine and set the size of the stub section for a final link.
2489
2490    The basic idea here is to examine all the relocations looking for
2491    PC-relative calls to a target that is unreachable with a "bl"
2492    instruction or calls where the caller and callee disagree on the
2493    location of their arguments or return value.  */
2494
2495 boolean
2496 elf32_hppa_size_stubs (stub_bfd, output_bfd, link_info)
2497      bfd *stub_bfd;
2498      bfd *output_bfd;
2499      struct bfd_link_info *link_info;
2500 {
2501   bfd *input_bfd;
2502   asection *section, *stub_sec = 0;
2503   Elf_Internal_Shdr *symtab_hdr;
2504   Elf_Internal_Sym *local_syms, *isym, **all_local_syms;
2505   Elf32_External_Sym *ext_syms, *esym;
2506   unsigned int i, index, bfd_count = 0;
2507   struct elf32_hppa_stub_hash_table *stub_hash_table = 0;
2508   struct elf32_hppa_args_hash_table *args_hash_table = 0;
2509
2510   /* Create and initialize the stub hash table.  */
2511   stub_hash_table = ((struct elf32_hppa_stub_hash_table *)
2512                      bfd_malloc (sizeof (struct elf32_hppa_stub_hash_table)));
2513   if (!stub_hash_table)
2514     goto error_return;
2515
2516   if (!elf32_hppa_stub_hash_table_init (stub_hash_table, stub_bfd,
2517                                         elf32_hppa_stub_hash_newfunc))
2518     goto error_return;
2519
2520   /* Likewise for the argument location hash table.  */
2521   args_hash_table = ((struct elf32_hppa_args_hash_table *)
2522                      bfd_malloc (sizeof (struct elf32_hppa_args_hash_table)));
2523   if (!args_hash_table)
2524     goto error_return;
2525
2526   if (!elf32_hppa_args_hash_table_init (args_hash_table,
2527                                         elf32_hppa_args_hash_newfunc))
2528     goto error_return;
2529
2530   /* Attach the hash tables to the main hash table.  */
2531   elf32_hppa_hash_table(link_info)->stub_hash_table = stub_hash_table;
2532   elf32_hppa_hash_table(link_info)->args_hash_table = args_hash_table;
2533
2534   /* Count the number of input BFDs.  */
2535   for (input_bfd = link_info->input_bfds;
2536        input_bfd != NULL;
2537        input_bfd = input_bfd->link_next)
2538      bfd_count++;
2539
2540   /* We want to read in symbol extension records only once.  To do this
2541      we need to read in the local symbols in parallel and save them for
2542      later use; so hold pointers to the local symbols in an array.  */
2543   all_local_syms
2544     = (Elf_Internal_Sym **) bfd_malloc (sizeof (Elf_Internal_Sym *)
2545                                         * bfd_count);
2546   if (all_local_syms == NULL)
2547     goto error_return;
2548   memset (all_local_syms, 0, sizeof (Elf_Internal_Sym *) * bfd_count);
2549
2550   /* Walk over all the input BFDs adding entries to the args hash table
2551      for all the external functions.  */
2552   for (input_bfd = link_info->input_bfds, index = 0;
2553        input_bfd != NULL;
2554        input_bfd = input_bfd->link_next, index++)
2555     {
2556       /* We'll need the symbol table in a second.  */
2557       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2558       if (symtab_hdr->sh_info == 0)
2559         continue;
2560
2561       /* We need an array of the local symbols attached to the input bfd.
2562          Unfortunately, we're going to have to read & swap them in.  */
2563       local_syms
2564         = (Elf_Internal_Sym *) bfd_malloc (symtab_hdr->sh_info
2565                                            * sizeof (Elf_Internal_Sym));
2566       if (local_syms == NULL)
2567         {
2568           for (i = 0; i < bfd_count; i++)
2569             if (all_local_syms[i])
2570               free (all_local_syms[i]);
2571           free (all_local_syms);
2572           goto error_return;
2573         }
2574       all_local_syms[index] = local_syms;
2575
2576       ext_syms
2577         = (Elf32_External_Sym *) bfd_malloc (symtab_hdr->sh_info
2578                                              * sizeof (Elf32_External_Sym));
2579       if (ext_syms == NULL)
2580         {
2581           for (i = 0; i < bfd_count; i++)
2582             if (all_local_syms[i])
2583               free (all_local_syms[i]);
2584           free (all_local_syms);
2585           goto error_return;
2586         }
2587
2588       if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2589           || bfd_read (ext_syms, 1,
2590                        (symtab_hdr->sh_info
2591                         * sizeof (Elf32_External_Sym)), input_bfd)
2592           != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym)))
2593         {
2594           for (i = 0; i < bfd_count; i++)
2595             if (all_local_syms[i])
2596               free (all_local_syms[i]);
2597           free (all_local_syms);
2598           free (ext_syms);
2599           goto error_return;
2600         }
2601
2602       /* Swap the local symbols in.  */
2603       isym = local_syms;
2604       esym = ext_syms;
2605       for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++)
2606          bfd_elf32_swap_symbol_in (input_bfd, esym, isym);
2607
2608       /* Now we can free the external symbols.  */
2609       free (ext_syms);
2610
2611       if (elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table,
2612                                        local_syms) == false)
2613         {
2614           for (i = 0; i < bfd_count; i++)
2615             if (all_local_syms[i])
2616               free (all_local_syms[i]);
2617           free (all_local_syms);
2618           goto error_return;
2619         }
2620     }
2621
2622   /* Magic as we know the stub bfd only has one section.  */
2623   stub_sec = stub_bfd->sections;
2624
2625   /* If generating a relocateable output file, then we don't
2626      have to examine the relocs.  */
2627   if (link_info->relocateable)
2628     {
2629       for (i = 0; i < bfd_count; i++)
2630         if (all_local_syms[i])
2631           free (all_local_syms[i]);
2632       free (all_local_syms);
2633       return true;
2634     }
2635
2636   /* Now that we have argument location information for all the global
2637      functions we can start looking for stubs.  */
2638   for (input_bfd = link_info->input_bfds, index = 0;
2639        input_bfd != NULL;
2640        input_bfd = input_bfd->link_next, index++)
2641     {
2642       /* We'll need the symbol table in a second.  */
2643       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2644       if (symtab_hdr->sh_info == 0)
2645         continue;
2646
2647       local_syms = all_local_syms[index];
2648
2649       /* Walk over each section attached to the input bfd.  */
2650       for (section = input_bfd->sections;
2651            section != NULL;
2652            section = section->next)
2653         {
2654           Elf_Internal_Shdr *input_rel_hdr;
2655           Elf32_External_Rela *external_relocs, *erelaend, *erela;
2656           Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2657
2658           /* If there aren't any relocs, then there's nothing to do.  */
2659           if ((section->flags & SEC_RELOC) == 0
2660               || section->reloc_count == 0)
2661             continue;
2662
2663           /* Allocate space for the external relocations.  */
2664           external_relocs
2665             = ((Elf32_External_Rela *)
2666                bfd_malloc (section->reloc_count
2667                            * sizeof (Elf32_External_Rela)));
2668           if (external_relocs == NULL)
2669             {
2670               for (i = 0; i < bfd_count; i++)
2671                 if (all_local_syms[i])
2672                   free (all_local_syms[i]);
2673               free (all_local_syms);
2674               goto error_return;
2675             }
2676
2677           /* Likewise for the internal relocations.  */
2678           internal_relocs
2679             = ((Elf_Internal_Rela *)
2680                bfd_malloc (section->reloc_count * sizeof (Elf_Internal_Rela)));
2681           if (internal_relocs == NULL)
2682             {
2683               free (external_relocs);
2684               for (i = 0; i < bfd_count; i++)
2685                 if (all_local_syms[i])
2686                   free (all_local_syms[i]);
2687               free (all_local_syms);
2688               goto error_return;
2689             }
2690
2691           /* Read in the external relocs.  */
2692           input_rel_hdr = &elf_section_data (section)->rel_hdr;
2693           if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0
2694               || bfd_read (external_relocs, 1, input_rel_hdr->sh_size,
2695                            input_bfd) != input_rel_hdr->sh_size)
2696             {
2697               free (external_relocs);
2698               free (internal_relocs);
2699               for (i = 0; i < bfd_count; i++)
2700                 if (all_local_syms[i])
2701                   free (all_local_syms[i]);
2702               free (all_local_syms);
2703               goto error_return;
2704             }
2705
2706           /* Swap in the relocs.  */
2707           erela = external_relocs;
2708           erelaend = erela + section->reloc_count;
2709           irela = internal_relocs;
2710           for (; erela < erelaend; erela++, irela++)
2711             bfd_elf32_swap_reloca_in (input_bfd, erela, irela);
2712
2713           /* We're done with the external relocs, free them.  */
2714           free (external_relocs);
2715
2716           /* Now examine each relocation.  */
2717           irela = internal_relocs;
2718           irelaend = irela + section->reloc_count;
2719           for (; irela < irelaend; irela++)
2720             {
2721               long r_type, callee_args, caller_args, size_of_stub;
2722               unsigned long r_index;
2723               struct elf_link_hash_entry *hash;
2724               struct elf32_hppa_stub_hash_entry *stub_hash;
2725               struct elf32_hppa_args_hash_entry *args_hash;
2726               Elf_Internal_Sym *sym;
2727               asection *sym_sec;
2728               const char *sym_name;
2729               symvalue sym_value;
2730               bfd_vma location, destination;
2731               char *new_name = NULL;
2732
2733               r_type = ELF32_R_TYPE (irela->r_info);
2734               r_index = ELF32_R_SYM (irela->r_info);
2735
2736               if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
2737                 {
2738                   bfd_set_error (bfd_error_bad_value);
2739                   free (internal_relocs);
2740                   for (i = 0; i < bfd_count; i++)
2741                     if (all_local_syms[i])
2742                       free (all_local_syms[i]);
2743                   free (all_local_syms);
2744                   goto error_return;
2745                 }
2746
2747               /* Only look for stubs on call instructions or plabel
2748                  references.  */
2749               if (r_type != R_PARISC_PCREL17F
2750                   && r_type != R_PARISC_PLABEL32
2751                   && r_type != R_PARISC_PLABEL21L
2752                   && r_type != R_PARISC_PLABEL14R)
2753                 continue;
2754
2755               /* Now determine the call target, its name, value, section
2756                  and argument relocation bits.  */
2757               hash = NULL;
2758               sym = NULL;
2759               sym_sec = NULL;
2760               if (r_index < symtab_hdr->sh_info)
2761                 {
2762                   /* It's a local symbol.  */
2763                   Elf_Internal_Shdr *hdr;
2764
2765                   sym = local_syms + r_index;
2766                   hdr = elf_elfsections (input_bfd)[sym->st_shndx];
2767                   sym_sec = hdr->bfd_section;
2768                   sym_name = bfd_elf_string_from_elf_section (input_bfd,
2769                                                               symtab_hdr->sh_link,
2770                                                               sym->st_name);
2771                   sym_value = (ELF_ST_TYPE (sym->st_info) == STT_SECTION
2772                                ? 0 : sym->st_value);
2773                   destination = (sym_value
2774                                  + sym_sec->output_offset
2775                                  + sym_sec->output_section->vma);
2776
2777                   /* Tack on an ID so we can uniquely identify this local
2778                      symbol in the stub or arg info hash tables.  */
2779                   new_name = bfd_malloc (strlen (sym_name) + 10);
2780                   if (new_name == 0)
2781                     {
2782                       free (internal_relocs);
2783                       for (i = 0; i < bfd_count; i++)
2784                         if (all_local_syms[i])
2785                           free (all_local_syms[i]);
2786                       free (all_local_syms);
2787                       goto error_return;
2788                     }
2789                   sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
2790                   sym_name = new_name;
2791                 }
2792               else
2793                 {
2794                   /* It's an external symbol.  */
2795                   long index;
2796
2797                   index = r_index - symtab_hdr->sh_info;
2798                   hash = elf_sym_hashes (input_bfd)[index];
2799                   if (hash->root.type == bfd_link_hash_defined
2800                       || hash->root.type == bfd_link_hash_defweak)
2801                     {
2802                       sym_sec = hash->root.u.def.section;
2803                       sym_name = hash->root.root.string;
2804                       sym_value = hash->root.u.def.value;
2805                       destination = (sym_value
2806                                      + sym_sec->output_offset
2807                                      + sym_sec->output_section->vma);
2808                     }
2809                   else
2810                     {
2811                       bfd_set_error (bfd_error_bad_value);
2812                       free (internal_relocs);
2813                       for (i = 0; i < bfd_count; i++)
2814                         if (all_local_syms[i])
2815                           free (all_local_syms[i]);
2816                       free (all_local_syms);
2817                       goto error_return;
2818                     }
2819                 }
2820
2821               args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2822                                                        sym_name, false, false);
2823
2824               /* Get both caller and callee argument information.  */
2825               if (args_hash == NULL)
2826                 callee_args = 0;
2827               else
2828                 callee_args = args_hash->arg_bits;
2829
2830               /* For calls get the caller's bits from the addend of
2831                  the call relocation.  For PLABELS the caller's bits
2832                  are assumed to have all args & return values in general
2833                  registers (0x155).  */
2834               if (r_type == R_PARISC_PCREL17F)
2835                 caller_args = HPPA_R_ARG_RELOC (irela->r_addend);
2836               else
2837                 caller_args = 0x155;
2838
2839               /* Now determine where the call point is.  */
2840               location = (section->output_offset
2841                           + section->output_section->vma
2842                           + irela->r_offset);
2843
2844               /* We only care about the destination for PCREL function
2845                  calls (eg. we don't care for PLABELS).  */
2846               if (r_type != R_PARISC_PCREL17F)
2847                 location = destination;
2848
2849               /* Determine what (if any) linker stub is needed and its
2850                  size (in bytes).  */
2851               size_of_stub = elf32_hppa_size_of_stub (callee_args,
2852                                                       caller_args,
2853                                                       location,
2854                                                       destination,
2855                                                       sym_name);
2856               if (size_of_stub != 0)
2857                 {
2858                   char *stub_name;
2859                   unsigned int len;
2860
2861                   /* Get the name of this stub.  */
2862                   len = strlen (sym_name);
2863                   len += 23;
2864
2865                   stub_name = bfd_malloc (len);
2866                   if (!stub_name)
2867                     {
2868                       /* Because sym_name was mallocd above for local
2869                          symbols.  */
2870                       if (r_index < symtab_hdr->sh_info)
2871                         free (new_name);
2872
2873                       free (internal_relocs);
2874                       for (i = 0; i < bfd_count; i++)
2875                         if (all_local_syms[i])
2876                           free (all_local_syms[i]);
2877                       free (all_local_syms);
2878                       goto error_return;
2879                     }
2880                   elf32_hppa_name_of_stub (caller_args, callee_args,
2881                                            location, destination, stub_name);
2882                   strcat (stub_name + 22, sym_name);
2883
2884                   /* Because sym_name was malloced above for local symbols.  */
2885                   if (r_index < symtab_hdr->sh_info)
2886                     free (new_name);
2887
2888                   stub_hash
2889                     = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
2890                                                    false, false);
2891                   if (stub_hash != NULL)
2892                     {
2893                       /* The proper stub has already been created, nothing
2894                          else to do.  */
2895                       free (stub_name);
2896                     }
2897                   else
2898                     {
2899                       bfd_set_section_size (stub_bfd, stub_sec,
2900                                             (bfd_section_size (stub_bfd,
2901                                                                stub_sec)
2902                                              + size_of_stub));
2903
2904                       /* Enter this entry into the linker stub hash table.  */
2905                       stub_hash
2906                         = elf32_hppa_stub_hash_lookup (stub_hash_table,
2907                                                        stub_name, true, true);
2908                       if (stub_hash == NULL)
2909                         {
2910                           free (stub_name);
2911                           free (internal_relocs);
2912                           for (i = 0; i < bfd_count; i++)
2913                             if (all_local_syms[i])
2914                               free (all_local_syms[i]);
2915                           free (all_local_syms);
2916                           goto error_return;
2917                         }
2918
2919                       /* We'll need these to determine the address that the
2920                          stub will branch to.  */
2921                       stub_hash->target_value = sym_value;
2922                       stub_hash->target_section = sym_sec;
2923                     }
2924                   free (stub_name);
2925                 }
2926             }
2927           /* We're done with the internal relocs, free them.  */
2928           free (internal_relocs);
2929         }
2930     }
2931   /* We're done with the local symbols, free them.  */
2932   for (i = 0; i < bfd_count; i++)
2933     if (all_local_syms[i])
2934       free (all_local_syms[i]);
2935   free (all_local_syms);
2936   return true;
2937
2938 error_return:
2939   /* Return gracefully, avoiding dangling references to the hash tables.  */
2940   if (stub_hash_table)
2941     {
2942       elf32_hppa_hash_table(link_info)->stub_hash_table = NULL;
2943       free (stub_hash_table);
2944     }
2945   if (args_hash_table)
2946     {
2947       elf32_hppa_hash_table(link_info)->args_hash_table = NULL;
2948       free (args_hash_table);
2949     }
2950   /* Set the size of the stub section to zero since we're never going
2951      to create them.   Avoids losing when we try to get its contents
2952      too.  */
2953   bfd_set_section_size (stub_bfd, stub_sec, 0);
2954   return false;
2955 }
2956
2957 /* Misc BFD support code.  */
2958 #define bfd_elf32_bfd_reloc_type_lookup         elf_hppa_reloc_type_lookup
2959 #define bfd_elf32_bfd_is_local_label            hppa_elf_is_local_label
2960
2961 /* Symbol extension stuff.  */
2962 #define bfd_elf32_set_section_contents          elf32_hppa_set_section_contents
2963 #define elf_backend_symbol_table_processing \
2964   elf32_hppa_backend_symbol_table_processing
2965 #define elf_backend_begin_write_processing \
2966   elf32_hppa_backend_begin_write_processing
2967 #define elf_backend_final_write_processing \
2968   elf32_hppa_backend_final_write_processing
2969
2970 /* Stuff for the BFD linker.  */
2971 #define elf_backend_relocate_section            elf32_hppa_relocate_section
2972 #define elf_backend_add_symbol_hook             elf32_hppa_add_symbol_hook
2973 #define elf_backend_link_output_symbol_hook \
2974   elf32_hppa_link_output_symbol_hook
2975 #define bfd_elf32_bfd_link_hash_table_create \
2976   elf32_hppa_link_hash_table_create
2977
2978 #define TARGET_BIG_SYM          bfd_elf32_hppa_vec
2979 #define TARGET_BIG_NAME         "elf32-hppa"
2980 #define ELF_ARCH                bfd_arch_hppa
2981 #define ELF_MACHINE_CODE        EM_PARISC
2982 #define ELF_MAXPAGESIZE         0x1000
2983
2984 #include "elf32-target.h"
This page took 0.203204 seconds and 4 git commands to generate.