1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
6 Center for Software Science
7 Department of Computer Science
10 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
33 /* The internal type of a symbol table extension entry. */
34 typedef unsigned long symext_entryS;
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))
42 /* HPPA symbol table extension entry types */
43 enum elf32_hppa_symextn_types
50 /* These macros compose and decompose the value of a symextn entry:
52 entry_type = ELF32_PARISC_SX_TYPE(word);
53 entry_value = ELF32_PARISC_SX_VAL(word);
54 word = ELF32_PARISC_SX_WORD(type,val); */
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))
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. */
67 #define SYMEXTN_SECTION_NAME ".PARISC.symext"
72 struct symext_chain *next;
75 typedef struct symext_chain symext_chainS;
77 /* We use three different hash tables to hold information for
78 linking PA ELF objects.
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.
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.
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. */
92 /* Hash table for linker stubs. */
94 struct elf32_hppa_stub_hash_entry
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
99 struct bfd_hash_entry root;
101 /* Offset of the beginning of this stub. */
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;
110 struct elf32_hppa_stub_hash_table
112 /* The hash table itself. */
113 struct bfd_hash_table root;
118 /* Where to place the next stub. */
121 /* Current offset in the stub section. */
126 /* Hash table for argument location information. */
128 struct elf32_hppa_args_hash_entry
130 /* Base hash table entry structure. */
131 struct bfd_hash_entry root;
133 /* The argument location bits for this entry. */
137 struct elf32_hppa_args_hash_table
139 /* The hash table itself. */
140 struct bfd_hash_table root;
143 struct elf32_hppa_link_hash_entry
145 struct elf_link_hash_entry root;
148 struct elf32_hppa_link_hash_table
150 /* The main hash table. */
151 struct elf_link_hash_table root;
153 /* The stub hash table. */
154 struct elf32_hppa_stub_hash_table *stub_hash_table;
156 /* The argument relocation bits hash table. */
157 struct elf32_hppa_args_hash_table *args_hash_table;
159 /* A count of the number of output symbols. */
160 unsigned int output_symbol_count;
162 /* Stuff so we can handle DP relative relocations. */
164 int global_sym_defined;
169 #define RETURN_VALUE 1
171 /* The various argument relocations that may be performed. */
176 /* Relocate 32 bits from GR to FP register. */
178 /* Relocate 64 bits from a GR pair to FP pair. */
180 /* Relocate 32 bits from FP to GR. */
182 /* Relocate 64 bits from FP pair to GR pair. */
186 /* What is being relocated (eg which argument or the return value). */
189 ARG0, ARG1, ARG2, ARG3, RET,
190 } arg_reloc_location;
193 /* ELF32/HPPA relocation support
195 This file contains ELF32/HPPA relocation support as specified
196 in the Stratus FTX/Golf Object File Format (SED-1762) dated
199 #include "elf32-hppa.h"
200 #include "hppa_stubs.h"
202 static bfd_reloc_status_type hppa_elf_reloc
203 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
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));
209 static bfd_reloc_status_type hppa_elf_reloc
210 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **));
212 static reloc_howto_type * elf_hppa_reloc_type_lookup
213 PARAMS ((bfd *, bfd_reloc_code_real_type));
215 static boolean elf32_hppa_set_section_contents
216 PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
218 static void elf_info_to_howto
219 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
221 static boolean elf32_hppa_backend_symbol_table_processing
222 PARAMS ((bfd *, elf_symbol_type *, int));
224 static void elf32_hppa_backend_begin_write_processing
225 PARAMS ((bfd *, struct bfd_link_info *));
227 static void elf32_hppa_backend_final_write_processing
228 PARAMS ((bfd *, boolean));
230 static void add_entry_to_symext_chain
231 PARAMS ((bfd *, unsigned int, unsigned int, symext_chainS **,
235 elf_hppa_tc_make_sections PARAMS ((bfd *, symext_chainS *));
237 static boolean hppa_elf_is_local_label PARAMS ((bfd *, asymbol *));
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 *));
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));
248 static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
251 static struct bfd_hash_entry *
252 elf32_hppa_stub_hash_newfunc
253 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
255 static struct bfd_hash_entry *
256 elf32_hppa_args_hash_newfunc
257 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
260 elf32_hppa_relocate_section
261 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
262 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
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 *,
272 elf32_hppa_build_one_stub PARAMS ((struct bfd_hash_entry *, PTR));
275 elf32_hppa_read_symext_info
276 PARAMS ((bfd *, Elf_Internal_Shdr *, struct elf32_hppa_args_hash_table *,
277 Elf_Internal_Sym *));
279 static unsigned int elf32_hppa_size_of_stub
280 PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, const char *));
282 static boolean elf32_hppa_arg_reloc_needed
283 PARAMS ((unsigned int, unsigned int, arg_reloc_type []));
285 static void elf32_hppa_name_of_stub
286 PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, char *));
288 static boolean elf32_hppa_size_symext PARAMS ((struct bfd_hash_entry *, PTR));
290 static boolean elf32_hppa_link_output_symbol_hook
291 PARAMS ((bfd *, struct bfd_link_info *, const char *,
292 Elf_Internal_Sym *, asection *));
294 /* ELF/PA relocation howto entries. */
296 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
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"},
456 {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"},
459 /* Where (what register type) is an argument comming from? */
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. */
475 static CONST arg_reloc_type arg_mismatches[6][6] =
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},
485 /* Likewise, but reversed for the return value. */
486 static CONST arg_reloc_type ret_mismatches[6][6] =
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},
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;
501 /* FIXME: We should be able to try this static variable! */
502 static bfd_byte *symextn_contents;
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)))
510 #define elf32_hppa_stub_hash_traverse(table, func, info) \
513 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
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)))
521 #define elf32_hppa_args_hash_traverse(table, func, info) \
524 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
527 #define elf32_hppa_args_hash_table_init(table, newfunc) \
528 (bfd_hash_table_init \
530 (struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, \
531 struct bfd_hash_table *, \
532 const char *))) (newfunc)))
534 /* For HPPA linker hash table. */
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), \
541 #define elf32_hppa_link_hash_traverse(table, func, info) \
542 (elf_link_hash_traverse \
544 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
547 /* Get the PA ELF linker hash table from a link_info structure. */
549 #define elf32_hppa_hash_table(p) \
550 ((struct elf32_hppa_link_hash_table *) ((p)->hash))
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
557 /* Assorted hash table functions. */
559 /* Initialize an entry in the stub hash table. */
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;
567 struct elf32_hppa_stub_hash_entry *ret;
569 ret = (struct elf32_hppa_stub_hash_entry *) entry;
571 /* Allocate the structure if it has not already been allocated by a
574 ret = ((struct elf32_hppa_stub_hash_entry *)
575 bfd_hash_allocate (table,
576 sizeof (struct elf32_hppa_stub_hash_entry)));
579 bfd_set_error (bfd_error_no_memory);
583 /* Call the allocation method of the superclass. */
584 ret = ((struct elf32_hppa_stub_hash_entry *)
585 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
589 /* Initialize the local fields. */
591 ret->target_value = 0;
592 ret->target_section = NULL;
595 return (struct bfd_hash_entry *) ret;
598 /* Initialize a stub hash table. */
601 elf32_hppa_stub_hash_table_init (table, stub_bfd, newfunc)
602 struct elf32_hppa_stub_hash_table *table;
604 struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
605 struct bfd_hash_table *,
610 table->stub_bfd = stub_bfd;
611 return (bfd_hash_table_init (&table->root, newfunc));
614 /* Initialize an entry in the argument location hash table. */
616 static struct bfd_hash_entry *
617 elf32_hppa_args_hash_newfunc (entry, table, string)
618 struct bfd_hash_entry *entry;
619 struct bfd_hash_table *table;
622 struct elf32_hppa_args_hash_entry *ret;
624 ret = (struct elf32_hppa_args_hash_entry *) entry;
626 /* Allocate the structure if it has not already been allocated by a
629 ret = ((struct elf32_hppa_args_hash_entry *)
630 bfd_hash_allocate (table,
631 sizeof (struct elf32_hppa_args_hash_entry)));
634 bfd_set_error (bfd_error_no_memory);
638 /* Call the allocation method of the superclass. */
639 ret = ((struct elf32_hppa_args_hash_entry *)
640 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
642 /* Initialize the local fields. */
646 return (struct bfd_hash_entry *) ret;
649 /* Create the derived linker hash table. The PA ELF port uses the derived
650 hash table to keep information specific to the PA ELF linker (without
651 using static variables). */
653 static struct bfd_link_hash_table *
654 elf32_hppa_link_hash_table_create (abfd)
657 struct elf32_hppa_link_hash_table *ret;
659 ret = ((struct elf32_hppa_link_hash_table *)
660 bfd_alloc (abfd, sizeof (struct elf32_hppa_link_hash_table)));
663 bfd_set_error (bfd_error_no_memory);
666 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
667 _bfd_elf_link_hash_newfunc))
669 bfd_release (abfd, ret);
672 ret->stub_hash_table = NULL;
673 ret->args_hash_table = NULL;
674 ret->output_symbol_count = 0;
675 ret->global_value = 0;
676 ret->global_sym_defined = 0;
678 return &ret->root.root;
681 /* Relocate the given INSN given the various input parameters.
683 FIXME: endianness and sizeof (long) issues abound here. */
686 hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value,
687 r_addend, r_format, r_field, pcrel)
689 asection *input_sect;
691 unsigned long address;
694 unsigned long r_format;
695 unsigned long r_field;
698 unsigned char opcode = get_opcode (insn);
718 constant_value = HPPA_R_CONSTANT (r_addend);
721 sym_value -= address;
723 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
724 return hppa_rebuild_insn (abfd, insn, sym_value, r_format);
729 /* XXX computing constant_value is not needed??? */
730 constant_value = assemble_17 ((insn & 0x001f0000) >> 16,
731 (insn & 0x00001ffc) >> 2,
734 constant_value = (constant_value << 15) >> 15;
738 address + input_sect->output_offset
739 + input_sect->output_section->vma;
740 sym_value = hppa_field_adjust (sym_value, -8, r_field);
743 sym_value = hppa_field_adjust (sym_value, constant_value, r_field);
745 return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format);
750 constant_value = HPPA_R_CONSTANT (r_addend);
753 sym_value -= address;
755 return hppa_field_adjust (sym_value, constant_value, r_field);
762 /* Relocate an HPPA ELF section. */
765 elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
766 contents, relocs, local_syms, local_sections)
768 struct bfd_link_info *info;
770 asection *input_section;
772 Elf_Internal_Rela *relocs;
773 Elf_Internal_Sym *local_syms;
774 asection **local_sections;
776 Elf_Internal_Shdr *symtab_hdr;
777 Elf_Internal_Rela *rel;
778 Elf_Internal_Rela *relend;
780 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
783 relend = relocs + input_section->reloc_count;
784 for (; rel < relend; rel++)
787 reloc_howto_type *howto;
789 struct elf_link_hash_entry *h;
790 Elf_Internal_Sym *sym;
793 bfd_reloc_status_type r;
794 const char *sym_name;
796 r_type = ELF32_R_TYPE (rel->r_info);
797 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
799 bfd_set_error (bfd_error_bad_value);
802 howto = elf_hppa_howto_table + r_type;
804 r_symndx = ELF32_R_SYM (rel->r_info);
806 if (info->relocateable)
808 /* This is a relocateable link. We don't have to change
809 anything, unless the reloc is against a section symbol,
810 in which case we have to adjust according to where the
811 section symbol winds up in the output section. */
812 if (r_symndx < symtab_hdr->sh_info)
814 sym = local_syms + r_symndx;
815 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
817 sym_sec = local_sections[r_symndx];
818 rel->r_addend += sym_sec->output_offset;
825 /* This is a final link. */
829 if (r_symndx < symtab_hdr->sh_info)
831 sym = local_syms + r_symndx;
832 sym_sec = local_sections[r_symndx];
833 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
835 + sym_sec->output_offset
836 + sym_sec->output_section->vma);
842 indx = r_symndx - symtab_hdr->sh_info;
843 h = elf_sym_hashes (input_bfd)[indx];
844 if (h->root.type == bfd_link_hash_defined
845 || h->root.type == bfd_link_hash_defweak)
847 sym_sec = h->root.u.def.section;
848 relocation = (h->root.u.def.value
849 + sym_sec->output_offset
850 + sym_sec->output_section->vma);
852 else if (h->root.type == bfd_link_hash_undefweak)
856 if (!((*info->callbacks->undefined_symbol)
857 (info, h->root.root.string, input_bfd,
858 input_section, rel->r_offset)))
865 sym_name = h->root.root.string;
868 sym_name = bfd_elf_string_from_elf_section (input_bfd,
871 if (sym_name == NULL)
873 if (*sym_name == '\0')
874 sym_name = bfd_section_name (input_bfd, sym_sec);
877 /* If args_hash_table is NULL, then we have encountered some
878 kind of link error (ex. undefined symbols). Do not try to
879 apply any relocations, continue the loop so we can notify
880 the user of several errors in a single attempted link. */
881 if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
884 r = elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
885 input_section, contents,
886 rel->r_offset, relocation,
887 rel->r_addend, info, sym_sec,
888 sym_name, h == NULL);
890 if (r != bfd_reloc_ok)
894 /* This can happen for DP relative relocs if $global$ is
895 undefined. This is a panic situation so we don't try
897 case bfd_reloc_undefined:
898 case bfd_reloc_notsupported:
899 if (!((*info->callbacks->undefined_symbol)
900 (info, "$global$", input_bfd,
901 input_section, rel->r_offset)))
904 case bfd_reloc_dangerous:
906 /* We use this return value to indicate that we performed
907 a "dangerous" relocation. This doesn't mean we did
908 the wrong thing, it just means there may be some cleanup
909 that needs to be done here.
911 In particular we had to swap the last call insn and its
912 delay slot. If the delay slot insn needed a relocation,
913 then we'll need to adjust the next relocation entry's
914 offset to account for the fact that the insn moved.
916 This hair wouldn't be necessary if we inserted stubs
917 between procedures and used a "bl" to get to the stub. */
920 Elf_Internal_Rela *next_rel = rel + 1;
922 if (rel->r_offset + 4 == next_rel->r_offset)
923 next_rel->r_offset -= 4;
928 case bfd_reloc_outofrange:
929 case bfd_reloc_overflow:
931 if (!((*info->callbacks->reloc_overflow)
932 (info, sym_name, howto->name, (bfd_vma) 0,
933 input_bfd, input_section, rel->r_offset)))
944 /* Return one (or more) BFD relocations which implement the base
945 relocation with modifications based on format and field. */
947 elf32_hppa_reloc_type **
948 hppa_elf_gen_reloc_type (abfd, base_type, format, field)
950 elf32_hppa_reloc_type base_type;
954 elf32_hppa_reloc_type *finaltype;
955 elf32_hppa_reloc_type **final_types;
957 /* Allocate slots for the BFD relocation. */
958 final_types = (elf32_hppa_reloc_type **)
959 bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2);
960 if (final_types == NULL)
963 /* Allocate space for the relocation itself. */
964 finaltype = (elf32_hppa_reloc_type *)
965 bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type));
966 if (finaltype == NULL)
969 /* Some reasonable defaults. */
970 final_types[0] = finaltype;
971 final_types[1] = NULL;
973 #define final_type finaltype[0]
975 final_type = base_type;
977 /* Just a tangle of nested switch statements to deal with the braindamage
978 that a different field selector means a completely different relocation
983 case R_HPPA_ABS_CALL:
991 final_type = R_PARISC_DIR14R;
994 final_type = R_PARISC_DLTREL14R;
997 final_type = R_PARISC_DLTREL14F;
1000 final_type = R_PARISC_PLABEL14R;
1011 final_type = R_PARISC_DIR17F;
1015 final_type = R_PARISC_DIR17R;
1027 final_type = R_PARISC_DIR21L;
1030 final_type = R_PARISC_DLTREL21L;
1033 final_type = R_PARISC_PLABEL21L;
1044 final_type = R_PARISC_DIR32;
1047 final_type = R_PARISC_PLABEL32;
1068 final_type = R_PARISC_DPREL14R;
1071 final_type = R_PARISC_DPREL14F;
1083 final_type = R_PARISC_DPREL21L;
1096 case R_HPPA_PCREL_CALL:
1104 final_type = R_PARISC_PCREL14R;
1107 final_type = R_PARISC_PCREL14F;
1119 final_type = R_PARISC_PCREL17R;
1122 final_type = R_PARISC_PCREL17F;
1134 final_type = R_PARISC_PCREL21L;
1155 /* Set the contents of a particular section at a particular location. */
1158 elf32_hppa_set_section_contents (abfd, section, location, offset, count)
1163 bfd_size_type count;
1165 /* Ignore write requests for the symbol extension section until we've
1166 had the chance to rebuild it ourselves. */
1167 if (!strcmp (section->name, ".PARISC.symextn") && !symext_chain_size)
1170 return _bfd_elf_set_section_contents (abfd, section, location,
1174 /* Translate from an elf into field into a howto relocation pointer. */
1177 elf_info_to_howto (abfd, cache_ptr, dst)
1180 Elf32_Internal_Rela *dst;
1182 BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_PARISC_UNIMPLEMENTED);
1183 cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)];
1187 /* Actually perform a relocation. NOTE this is (mostly) superceeded
1188 by elf32_hppa_bfd_final_link_relocate which is called by the new
1191 static bfd_reloc_status_type
1192 hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1195 arelent *reloc_entry;
1198 asection *input_section;
1200 char **error_message;
1202 /* It is no longer valid to call hppa_elf_reloc when creating
1203 a final executable. */
1206 reloc_entry->address += input_section->output_offset;
1208 /* Work around lossage in generic elf code to write relocations.
1209 (maps different section symbols into the same symbol index). */
1210 if ((symbol_in->flags & BSF_SECTION_SYM)
1211 && symbol_in->section)
1212 reloc_entry->addend += symbol_in->section->output_offset;
1213 return bfd_reloc_ok;
1217 *error_message = (char *) "Unsupported call to hppa_elf_reloc";
1218 return bfd_reloc_notsupported;
1222 /* Actually perform a relocation as part of a final link. This can get
1223 rather hairy when linker stubs are needed. */
1225 static bfd_reloc_status_type
1226 elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd,
1227 input_section, contents, offset, value,
1228 addend, info, sym_sec, sym_name, is_local)
1229 reloc_howto_type *howto;
1232 asection *input_section;
1237 struct bfd_link_info *info;
1239 const char *sym_name;
1243 unsigned long r_type = howto->type;
1244 unsigned long r_format = howto->bitsize;
1245 unsigned long r_field = e_fsel;
1246 bfd_byte *hit_data = contents + offset;
1247 boolean r_pcrel = howto->pc_relative;
1249 insn = bfd_get_32 (input_bfd, hit_data);
1251 /* Make sure we have a value for $global$. FIXME isn't this effectively
1252 just like the gp pointer on MIPS? Can we use those routines for this
1254 if (!elf32_hppa_hash_table (info)->global_sym_defined)
1256 struct elf_link_hash_entry *h;
1259 h = elf_link_hash_lookup (elf_hash_table (info), "$global$", false,
1262 /* If there isn't a $global$, then we're in deep trouble. */
1264 return bfd_reloc_notsupported;
1266 /* If $global$ isn't a defined symbol, then we're still in deep
1268 if (h->root.type != bfd_link_hash_defined)
1269 return bfd_reloc_undefined;
1271 sec = h->root.u.def.section;
1272 elf32_hppa_hash_table (info)->global_value = (h->root.u.def.value
1273 + sec->output_section->vma
1274 + sec->output_offset);
1275 elf32_hppa_hash_table (info)->global_sym_defined = 1;
1283 case R_PARISC_DIR32:
1284 case R_PARISC_DIR17F:
1285 case R_PARISC_PCREL17C:
1287 goto do_basic_type_1;
1288 case R_PARISC_DIR21L:
1289 case R_PARISC_PCREL21L:
1291 goto do_basic_type_1;
1292 case R_PARISC_DIR17R:
1293 case R_PARISC_PCREL17R:
1294 case R_PARISC_DIR14R:
1295 case R_PARISC_PCREL14R:
1297 goto do_basic_type_1;
1299 /* For all the DP relative relocations, we need to examine the symbol's
1300 section. If it's a code section, then "data pointer relative" makes
1301 no sense. In that case we don't adjust the "value", and for 21 bit
1302 addil instructions, we change the source addend register from %dp to
1304 case R_PARISC_DPREL21L:
1306 if (sym_sec->flags & SEC_CODE)
1308 if ((insn & 0xfc000000) >> 26 == 0xa
1309 && (insn & 0x03e00000) >> 21 == 0x1b)
1310 insn &= ~0x03e00000;
1313 value -= elf32_hppa_hash_table (info)->global_value;
1314 goto do_basic_type_1;
1315 case R_PARISC_DPREL14R:
1317 if ((sym_sec->flags & SEC_CODE) == 0)
1318 value -= elf32_hppa_hash_table (info)->global_value;
1319 goto do_basic_type_1;
1320 case R_PARISC_DPREL14F:
1322 if ((sym_sec->flags & SEC_CODE) == 0)
1323 value -= elf32_hppa_hash_table (info)->global_value;
1324 goto do_basic_type_1;
1326 /* These cases are separate as they may involve a lot more work
1327 to deal with linker stubs. */
1328 case R_PARISC_PLABEL32:
1329 case R_PARISC_PLABEL21L:
1330 case R_PARISC_PLABEL14R:
1331 case R_PARISC_PCREL17F:
1334 unsigned int len, caller_args, callee_args;
1335 arg_reloc_type arg_reloc_types[5];
1336 struct elf32_hppa_args_hash_table *args_hash_table;
1337 struct elf32_hppa_args_hash_entry *args_hash;
1338 char *new_name, *stub_name;
1340 /* Get the field selector right. We'll need it in a minute. */
1341 if (r_type == R_PARISC_PCREL17F
1342 || r_type == R_PARISC_PLABEL32)
1344 else if (r_type == R_PARISC_PLABEL21L)
1346 else if (r_type == R_PARISC_PLABEL14R)
1349 /* Find out where we are and where we're going. */
1350 location = (offset +
1351 input_section->output_offset +
1352 input_section->output_section->vma);
1354 /* Now look for the argument relocation bits associated with the
1356 len = strlen (sym_name) + 1;
1359 new_name = malloc (len);
1362 bfd_set_error (bfd_error_no_memory);
1363 return bfd_reloc_notsupported;
1365 strcpy (new_name, sym_name);
1367 /* Local symbols have unique IDs. */
1369 sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
1371 args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1373 args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
1374 new_name, false, false);
1375 if (args_hash == NULL)
1378 callee_args = args_hash->arg_bits;
1380 /* If this is a CALL relocation, then get the caller's bits
1381 from the addend. Else use the magic 0x155 value for PLABELS.
1383 Also we don't care about the destination (value) for PLABELS. */
1384 if (r_type == R_PARISC_PCREL17F)
1385 caller_args = HPPA_R_ARG_RELOC (addend);
1388 caller_args = 0x155;
1392 /* Any kind of linker stub needed? */
1393 if (((int)(value - location) > 0x3ffff)
1394 || ((int)(value - location) < (int)0xfffc0000)
1395 || elf32_hppa_arg_reloc_needed (caller_args, callee_args,
1398 struct elf32_hppa_stub_hash_table *stub_hash_table;
1399 struct elf32_hppa_stub_hash_entry *stub_hash;
1400 asection *stub_section;
1402 /* Build a name for the stub. */
1404 len = strlen (new_name);
1406 stub_name = malloc (len);
1409 bfd_set_error (bfd_error_no_memory);
1410 return bfd_reloc_notsupported;
1412 elf32_hppa_name_of_stub (caller_args, callee_args,
1413 location, value, stub_name);
1414 strcat (stub_name, new_name);
1417 stub_hash_table = elf32_hppa_hash_table (info)->stub_hash_table;
1420 = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
1423 /* We're done with that name. */
1426 /* The stub BFD only has one section. */
1427 stub_section = stub_hash_table->stub_bfd->sections;
1429 if (stub_hash != NULL)
1432 if (r_type == R_PARISC_PCREL17F)
1434 unsigned long delay_insn;
1435 unsigned int opcode, rtn_reg, ldo_target_reg, ldo_src_reg;
1437 /* We'll need to peek at the next insn. */
1438 delay_insn = bfd_get_32 (input_bfd, hit_data + 4);
1439 opcode = get_opcode (delay_insn);
1441 /* We also need to know the return register for this
1443 rtn_reg = (insn & 0x03e00000) >> 21;
1445 ldo_src_reg = (delay_insn & 0x03e00000) >> 21;
1446 ldo_target_reg = (delay_insn & 0x001f0000) >> 16;
1448 /* Munge up the value and other parameters for
1449 hppa_elf_relocate_insn. */
1451 value = (stub_hash->offset
1452 + stub_section->output_offset
1453 + stub_section->output_section->vma);
1460 /* We need to peek at the delay insn and determine if
1461 we'll need to swap the branch and its delay insn. */
1464 && ldo_target_reg == rtn_reg)
1465 || (delay_insn == 0x08000240))
1467 /* No need to swap the branch and its delay slot, but
1468 we do need to make sure to jump past the return
1469 pointer update in the stub. */
1472 /* If the delay insn does a return pointer adjustment,
1473 then we have to make sure it stays valid. */
1475 && ldo_target_reg == rtn_reg)
1477 delay_insn &= 0xfc00ffff;
1478 delay_insn |= ((31 << 21) | (31 << 16));
1479 bfd_put_32 (input_bfd, delay_insn, hit_data + 4);
1481 /* Use a BLE to reach the stub. */
1486 /* Wonderful, we have to swap the call insn and its
1488 bfd_put_32 (input_bfd, delay_insn, hit_data);
1489 /* Use a BLE,n to reach the stub. */
1490 insn = (BLE_SR4_R0 | 0x2);
1491 bfd_put_32 (input_bfd, insn, hit_data + 4);
1492 insn = hppa_elf_relocate_insn (input_bfd,
1498 /* Update the instruction word. */
1499 bfd_put_32 (input_bfd, insn, hit_data + 4);
1500 return bfd_reloc_dangerous;
1505 /* PLABEL stuff is easy. */
1507 value = (stub_hash->offset
1508 + stub_section->output_offset
1509 + stub_section->output_section->vma);
1510 /* We don't need the RP adjustment for PLABELs. */
1512 if (r_type == R_PARISC_PLABEL32)
1514 else if (r_type == R_PARISC_PLABEL21L)
1516 else if (r_type == R_PARISC_PLABEL14R)
1524 return bfd_reloc_notsupported;
1526 goto do_basic_type_1;
1530 insn = hppa_elf_relocate_insn (input_bfd, input_section, insn,
1531 offset, value, addend, r_format,
1535 /* Something we don't know how to handle. */
1537 return bfd_reloc_notsupported;
1540 /* Update the instruction word. */
1541 bfd_put_32 (input_bfd, insn, hit_data);
1542 return (bfd_reloc_ok);
1545 /* Return the address of the howto table entry to perform the CODE
1546 relocation for an ARCH machine. */
1548 static reloc_howto_type *
1549 elf_hppa_reloc_type_lookup (abfd, code)
1551 bfd_reloc_code_real_type code;
1553 if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
1555 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code);
1556 return &elf_hppa_howto_table[(int) code];
1561 /* Return true if SYM represents a local label symbol. */
1564 hppa_elf_is_local_label (abfd, sym)
1568 return (sym->name[0] == 'L' && sym->name[1] == '$');
1571 /* Do any backend specific processing when beginning to write an object
1572 file. For PA ELF we need to determine the size of the symbol extension
1573 section *before* any other output processing happens. */
1576 elf32_hppa_backend_begin_write_processing (abfd, info)
1578 struct bfd_link_info *info;
1581 asection *symextn_sec;
1583 /* Size up the symbol extension section. */
1584 if ((abfd->outsymbols == NULL
1586 || symext_chain_size != 0)
1591 /* We were not called from the BFD ELF linker code, so we need
1592 to examine the output BFD's outsymbols.
1594 Note we can not build the symbol extensions now as the symbol
1595 map hasn't been set up. */
1596 for (i = 0; i < abfd->symcount; i++)
1598 elf_symbol_type *symbol = (elf_symbol_type *)abfd->outsymbols[i];
1600 /* Only functions ever need an entry in the symbol extension
1602 if (!(symbol->symbol.flags & BSF_FUNCTION))
1605 /* And only if they specify the locations of their arguments. */
1606 if (symbol->tc_data.hppa_arg_reloc == 0)
1609 /* Yup. This function symbol needs an entry. */
1610 symext_chain_size += 2 * ELF32_PARISC_SX_SIZE;
1613 else if (info->relocateable == true)
1615 struct elf32_hppa_args_hash_table *table;
1616 table = elf32_hppa_hash_table (info)->args_hash_table;
1618 /* Determine the size of the symbol extension section. */
1619 elf32_hppa_args_hash_traverse (table,
1620 elf32_hppa_size_symext,
1621 &symext_chain_size);
1624 /* Now create the section and set its size. We'll fill in the
1626 symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1627 if (symextn_sec == NULL)
1628 symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME);
1630 bfd_set_section_flags (abfd, symextn_sec,
1631 SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA);
1632 symextn_sec->output_section = symextn_sec;
1633 symextn_sec->output_offset = 0;
1634 bfd_set_section_alignment (abfd, symextn_sec, 2);
1635 bfd_set_section_size (abfd, symextn_sec, symext_chain_size);
1638 /* Called for each entry in the args location hash table. For each
1639 entry we bump the size pointer by 2 records (16 bytes). */
1642 elf32_hppa_size_symext (gen_entry, in_args)
1643 struct bfd_hash_entry *gen_entry;
1646 bfd_size_type *sizep = (bfd_size_type *)in_args;
1648 *sizep += 2 * ELF32_PARISC_SX_SIZE;
1652 /* Backend routine called by the linker for each output symbol.
1654 For PA ELF we use this opportunity to add an appropriate entry
1655 to the symbol extension chain for function symbols. */
1658 elf32_hppa_link_output_symbol_hook (abfd, info, name, sym, section)
1660 struct bfd_link_info *info;
1662 Elf_Internal_Sym *sym;
1666 unsigned int len, index;
1667 struct elf32_hppa_args_hash_table *args_hash_table;
1668 struct elf32_hppa_args_hash_entry *args_hash;
1670 /* If the args hash table is NULL, then we've encountered an error
1671 of some sorts (for example, an undefined symbol). In that case
1672 we've got nothing else to do.
1674 NOTE: elf_link_output_symbol will abort if we return false here! */
1675 if (elf32_hppa_hash_table (info)->args_hash_table == NULL)
1678 index = elf32_hppa_hash_table (info)->output_symbol_count++;
1680 /* We need to look up this symbol in the args hash table to see if
1681 it has argument relocation bits. */
1682 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
1685 /* We know it's a function symbol of some kind. */
1686 len = strlen (name) + 1;
1687 if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1690 new_name = malloc (len);
1691 if (new_name == NULL)
1693 bfd_set_error (bfd_error_no_memory);
1697 strcpy (new_name, name);
1698 if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
1699 sprintf (new_name + len - 10, "_%08x", (int)section);
1701 /* Now that we have the unique name, we can look it up in the
1703 args_hash_table = elf32_hppa_hash_table (info)->args_hash_table;
1704 args_hash = elf32_hppa_args_hash_lookup (args_hash_table, new_name,
1707 if (args_hash == NULL)
1710 /* We know this symbol has arg reloc bits. */
1711 add_entry_to_symext_chain (abfd, args_hash->arg_bits,
1712 index, &symext_rootP, &symext_lastP);
1716 /* Perform any processing needed late in the object file writing process.
1717 For PA ELF we build and set the contents of the symbol extension
1721 elf32_hppa_backend_final_write_processing (abfd, linker)
1725 asection *symextn_sec;
1728 /* Now build the symbol extension section. */
1729 if (symext_chain_size == 0)
1734 /* We were not called from the backend linker, so we still need
1735 to build the symbol extension chain.
1737 Look at each symbol, adding the appropriate information to the
1738 symbol extension section list as necessary. */
1739 for (i = 0; i < abfd->symcount; i++)
1741 elf_symbol_type *symbol = (elf_symbol_type *) abfd->outsymbols[i];
1743 /* Only functions ever need an entry in the symbol extension
1745 if (!(symbol->symbol.flags & BSF_FUNCTION))
1748 /* And only if they specify the locations of their arguments. */
1749 if (symbol->tc_data.hppa_arg_reloc == 0)
1752 /* Add this symbol's information to the chain. */
1753 add_entry_to_symext_chain (abfd, symbol->tc_data.hppa_arg_reloc,
1754 symbol->symbol.udata.i, &symext_rootP,
1759 /* Now fill in the contents of the symbol extension section. */
1760 elf_hppa_tc_make_sections (abfd, symext_rootP);
1762 /* And attach that as the section's contents. */
1763 symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1764 if (symextn_sec == (asection *) 0)
1767 symextn_sec->contents = (void *)symextn_contents;
1769 bfd_set_section_contents (abfd, symextn_sec, symextn_sec->contents,
1770 symextn_sec->output_offset, symextn_sec->_raw_size);
1773 /* Update the symbol extention chain to include the symbol pointed to
1774 by SYMBOLP if SYMBOLP is a function symbol. Used internally and by GAS. */
1777 add_entry_to_symext_chain (abfd, arg_reloc, sym_idx, symext_root, symext_last)
1779 unsigned int arg_reloc;
1780 unsigned int sym_idx;
1781 symext_chainS **symext_root;
1782 symext_chainS **symext_last;
1784 symext_chainS *symextP;
1786 /* Allocate memory and initialize this entry. */
1787 symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2);
1790 bfd_set_error (bfd_error_no_memory);
1791 abort(); /* FIXME */
1794 symextP[0].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_SYMNDX, sym_idx);
1795 symextP[0].next = &symextP[1];
1797 symextP[1].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_ARG_RELOC, arg_reloc);
1798 symextP[1].next = NULL;
1800 /* Now update the chain itself so it can be walked later to build
1801 the symbol extension section. */
1802 if (*symext_root == NULL)
1804 *symext_root = &symextP[0];
1805 *symext_last = &symextP[1];
1809 (*symext_last)->next = &symextP[0];
1810 *symext_last = &symextP[1];
1814 /* Build the symbol extension section. */
1817 elf_hppa_tc_make_sections (abfd, symext_root)
1819 symext_chainS *symext_root;
1821 symext_chainS *symextP;
1823 asection *symextn_sec;
1825 symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME);
1827 /* Grab some memory for the contents of the symbol extension section
1829 symextn_contents = (bfd_byte *) bfd_zalloc (abfd,
1830 symextn_sec->_raw_size);
1831 if (!symextn_contents)
1833 bfd_set_error (bfd_error_no_memory);
1834 abort(); /* FIXME */
1837 /* Fill in the contents of the symbol extension chain. */
1838 for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i)
1839 ELF32_PARISC_SX_PUT (abfd, (bfd_vma) symextP->entry,
1840 symextn_contents + i * ELF32_PARISC_SX_SIZE);
1845 /* Do some PA ELF specific work after reading in the symbol table.
1846 In particular attach the argument relocation from the
1847 symbol extension section to the appropriate symbols. */
1850 elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
1852 elf_symbol_type *esyms;
1855 Elf32_Internal_Shdr *symextn_hdr =
1856 bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME);
1857 unsigned int i, current_sym_idx = 0;
1859 /* If no symbol extension existed, then all symbol extension information
1860 is assumed to be zero. */
1861 if (symextn_hdr == NULL)
1863 for (i = 0; i < symcnt; i++)
1864 esyms[i].tc_data.hppa_arg_reloc = 0;
1868 /* FIXME: Why not use bfd_get_section_contents here? Also should give
1869 memory back when we're done. */
1870 /* Allocate a buffer of the appropriate size for the symextn section. */
1871 symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size);
1872 if (!symextn_hdr->contents)
1874 bfd_set_error (bfd_error_no_memory);
1878 /* Read in the symextn section. */
1879 if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
1881 if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->sh_size, abfd)
1882 != symextn_hdr->sh_size)
1885 /* Parse entries in the symbol extension section, updating the symtab
1887 for (i = 0; i < symextn_hdr->sh_size / ELF32_PARISC_SX_SIZE; i++)
1890 ELF32_PARISC_SX_GET (abfd,
1891 (symextn_hdr->contents
1892 + i * ELF32_PARISC_SX_SIZE));
1893 unsigned int se_value = ELF32_PARISC_SX_VAL (se);
1894 unsigned int se_type = ELF32_PARISC_SX_TYPE (se);
1898 case PARISC_SXT_NULL:
1901 case PARISC_SXT_SYMNDX:
1902 if (se_value >= symcnt)
1904 bfd_set_error (bfd_error_bad_value);
1907 current_sym_idx = se_value - 1;
1910 case PARISC_SXT_ARG_RELOC:
1911 esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value;
1915 bfd_set_error (bfd_error_bad_value);
1922 /* Read and attach the symbol extension information for the symbols
1923 in INPUT_BFD to the argument location hash table. Handle locals
1924 if DO_LOCALS is true; likewise for globals when DO_GLOBALS is true. */
1927 elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table, local_syms)
1929 Elf_Internal_Shdr *symtab_hdr;
1930 struct elf32_hppa_args_hash_table *args_hash_table;
1931 Elf_Internal_Sym *local_syms;
1933 asection *symextn_sec;
1935 unsigned int i, n_entries, current_index = 0;
1937 /* Get the symbol extension section for this BFD. If no section exists
1938 then there's nothing to do. Likewise if the section exists, but
1940 symextn_sec = bfd_get_section_by_name (input_bfd, SYMEXTN_SECTION_NAME);
1941 if (symextn_sec == NULL)
1944 /* Done separately so we can turn off SEC_HAS_CONTENTS (see below). */
1945 if (symextn_sec->_raw_size == 0)
1947 symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1951 contents = (bfd_byte *) malloc (symextn_sec->_raw_size);
1952 if (contents == NULL)
1954 bfd_set_error (bfd_error_no_memory);
1958 /* How gross. We turn off SEC_HAS_CONTENTS for the input symbol extension
1959 sections to keep the generic ELF/BFD code from trying to do anything
1960 with them. We have to undo that hack temporarily so that we can read
1961 in the contents with the generic code. */
1962 symextn_sec->flags |= SEC_HAS_CONTENTS;
1963 if (bfd_get_section_contents (input_bfd, symextn_sec, contents,
1964 0, symextn_sec->_raw_size) == false)
1966 symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1971 /* Gross. Turn off SEC_HAS_CONTENTS for the input symbol extension
1972 sections (see above). */
1973 symextn_sec->flags &= ~SEC_HAS_CONTENTS;
1975 n_entries = symextn_sec->_raw_size / ELF32_PARISC_SX_SIZE;
1976 for (i = 0; i < n_entries; i++)
1978 symext_entryS entry =
1979 ELF32_PARISC_SX_GET (input_bfd, contents + i * ELF32_PARISC_SX_SIZE);
1980 unsigned int value = ELF32_PARISC_SX_VAL (entry);
1981 unsigned int type = ELF32_PARISC_SX_TYPE (entry);
1982 struct elf32_hppa_args_hash_entry *args_hash;
1986 case PARISC_SXT_NULL:
1989 case PARISC_SXT_SYMNDX:
1990 if (value >= symtab_hdr->sh_size / sizeof (Elf32_External_Sym))
1992 bfd_set_error (bfd_error_bad_value);
1996 current_index = value;
1999 case PARISC_SXT_ARG_RELOC:
2000 if (current_index < symtab_hdr->sh_info)
2002 Elf_Internal_Shdr *hdr;
2004 const char *sym_name;
2008 hdr = elf_elfsections (input_bfd)[local_syms[current_index].st_shndx];
2009 sym_sec = hdr->bfd_section;
2010 sym_name = bfd_elf_string_from_elf_section (input_bfd,
2011 symtab_hdr->sh_link,
2012 local_syms[current_index].st_name);
2013 len = strlen (sym_name) + 10;
2014 new_name = malloc (len);
2015 if (new_name == NULL)
2017 bfd_set_error (bfd_error_no_memory);
2021 strcpy (new_name, sym_name);
2022 sprintf (new_name + len - 10, "_%08x", (int)sym_sec);
2024 /* This is a global symbol with argument location info.
2025 We need to enter it into the hash table. */
2026 args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2030 if (args_hash == NULL)
2035 args_hash->arg_bits = value;
2038 else if (current_index >= symtab_hdr->sh_info)
2040 struct elf_link_hash_entry *h;
2042 current_index -= symtab_hdr->sh_info;
2043 h = elf_sym_hashes(input_bfd)[current_index];
2044 /* This is a global symbol with argument location
2045 information. We need to enter it into the hash table. */
2046 args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2047 h->root.root.string,
2049 if (args_hash == NULL)
2051 bfd_set_error (bfd_error_bad_value);
2055 args_hash->arg_bits = value;
2062 bfd_set_error (bfd_error_bad_value);
2071 /* Undo the generic ELF code's subtraction of section->vma from the
2072 value of each external symbol. */
2075 elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2077 struct bfd_link_info *info;
2078 const Elf_Internal_Sym *sym;
2084 *valp += (*secp)->vma;
2088 /* Determine the name of the stub needed to perform a call assuming the
2089 argument relocation bits for caller and callee are in CALLER and CALLEE
2090 for a call from LOCATION to DESTINATION. Copy the name into STUB_NAME. */
2093 elf32_hppa_name_of_stub (caller, callee, location, destination, stub_name)
2094 unsigned int caller, callee;
2095 bfd_vma location, destination;
2098 arg_reloc_type arg_reloc_types[5];
2100 if (elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types))
2102 arg_reloc_location i;
2103 /* Fill in the basic template. */
2104 strcpy (stub_name, "__XX_XX_XX_XX_XX_stub_");
2106 /* Now fix the specifics. */
2107 for (i = ARG0; i <= RET; i++)
2108 switch (arg_reloc_types[i])
2111 stub_name[3 * i + 2] = 'N';
2112 stub_name[3 * i + 3] = 'O';
2115 stub_name[3 * i + 2] = 'G';
2116 stub_name[3 * i + 3] = 'F';
2119 stub_name[3 * i + 2] = 'F';
2120 stub_name[3 * i + 3] = 'G';
2123 stub_name[3 * i + 2] = 'G';
2124 stub_name[3 * i + 3] = 'D';
2127 stub_name[3 * i + 2] = 'D';
2128 stub_name[3 * i + 3] = 'G';
2133 strcpy (stub_name, "_____long_branch_stub_");
2136 /* Determine if an argument relocation stub is needed to perform a
2137 call assuming the argument relocation bits for caller and callee
2138 are in CALLER and CALLEE. Place the type of relocations (if any)
2139 into stub_types_p. */
2142 elf32_hppa_arg_reloc_needed (caller, callee, stub_types)
2143 unsigned int caller, callee;
2144 arg_reloc_type stub_types[5];
2146 /* Special case for no relocations. */
2147 if (caller == 0 || callee == 0)
2151 arg_location caller_loc[5];
2152 arg_location callee_loc[5];
2154 /* Extract the location information for the argument and return
2155 value on both the caller and callee sides. */
2156 caller_loc[ARG0] = EXTRACT_ARBITS (caller, ARG0);
2157 callee_loc[ARG0] = EXTRACT_ARBITS (callee, ARG0);
2158 caller_loc[ARG1] = EXTRACT_ARBITS (caller, ARG1);
2159 callee_loc[ARG1] = EXTRACT_ARBITS (callee, ARG1);
2160 caller_loc[ARG2] = EXTRACT_ARBITS (caller, ARG2);
2161 callee_loc[ARG2] = EXTRACT_ARBITS (callee, ARG2);
2162 caller_loc[ARG3] = EXTRACT_ARBITS (caller, ARG3);
2163 callee_loc[ARG3] = EXTRACT_ARBITS (callee, ARG3);
2164 caller_loc[RET] = EXTRACT_ARBITS (caller, RET);
2165 callee_loc[RET] = EXTRACT_ARBITS (callee, RET);
2167 /* Check some special combinations. This is necessary to
2168 deal with double precision FP arguments. */
2169 if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU)
2171 caller_loc[ARG0] = AR_FPDBL1;
2172 caller_loc[ARG1] = AR_NO;
2174 if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU)
2176 caller_loc[ARG2] = AR_FPDBL2;
2177 caller_loc[ARG3] = AR_NO;
2179 if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU)
2181 callee_loc[ARG0] = AR_FPDBL1;
2182 callee_loc[ARG1] = AR_NO;
2184 if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU)
2186 callee_loc[ARG2] = AR_FPDBL2;
2187 callee_loc[ARG3] = AR_NO;
2190 /* Now look up any relocation needed for each argument and the
2192 stub_types[ARG0] = arg_mismatches[caller_loc[ARG0]][callee_loc[ARG0]];
2193 stub_types[ARG1] = arg_mismatches[caller_loc[ARG1]][callee_loc[ARG1]];
2194 stub_types[ARG2] = arg_mismatches[caller_loc[ARG2]][callee_loc[ARG2]];
2195 stub_types[ARG3] = arg_mismatches[caller_loc[ARG3]][callee_loc[ARG3]];
2196 stub_types[RET] = ret_mismatches[caller_loc[RET]][callee_loc[RET]];
2198 return (stub_types[ARG0] != NO
2199 || stub_types[ARG1] != NO
2200 || stub_types[ARG2] != NO
2201 || stub_types[ARG3] != NO
2202 || stub_types[RET] != NO);
2206 /* Compute the size of the stub needed to call from LOCATION to DESTINATION
2207 (a function named SYM_NAME), with argument relocation bits CALLER and
2208 CALLEE. Return zero if no stub is needed to perform such a call. */
2211 elf32_hppa_size_of_stub (callee, caller, location, destination, sym_name)
2212 unsigned int callee, caller;
2213 bfd_vma location, destination;
2214 const char *sym_name;
2216 arg_reloc_type arg_reloc_types[5];
2218 /* Determine if a long branch or argument relocation stub is needed.
2219 If an argument relocation stub is needed, the relocation will be
2220 stored into arg_reloc_types. */
2221 if (!(((int)(location - destination) > 0x3ffff)
2222 || ((int)(location - destination) < (int)0xfffc0000)
2223 || elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types)))
2226 /* Some kind of stub is needed. Determine how big it needs to be.
2227 First check for argument relocation stubs as they also handle
2228 long calls. Then check for long calls to millicode and finally
2229 the normal long calls. */
2230 if (arg_reloc_types[ARG0] != NO
2231 || arg_reloc_types[ARG1] != NO
2232 || arg_reloc_types[ARG2] != NO
2233 || arg_reloc_types[ARG3] != NO
2234 || arg_reloc_types[RET] != NO)
2236 /* Some kind of argument relocation stub is needed. */
2237 unsigned int len = 16;
2238 arg_reloc_location i;
2240 /* Each GR or FG relocation takes 2 insns, each GD or DG
2241 relocation takes 3 insns. Plus 4 more insns for the
2242 RP adjustment, ldil & (be | ble) and copy. */
2243 for (i = ARG0; i <= RET; i++)
2244 switch (arg_reloc_types[i])
2260 /* Extra instructions are needed if we're relocating a return value. */
2261 if (arg_reloc_types[RET] != NO)
2266 else if (!strncmp ("$$", sym_name, 2)
2267 && strcmp ("$$dyncall", sym_name))
2273 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
2274 IN_ARGS contains the stub BFD and link info pointers. */
2277 elf32_hppa_build_one_stub (gen_entry, in_args)
2278 struct bfd_hash_entry *gen_entry;
2281 void **args = (void **)in_args;
2282 bfd *stub_bfd = (bfd *)args[0];
2283 struct bfd_link_info *info = (struct bfd_link_info *)args[1];
2284 struct elf32_hppa_stub_hash_entry *entry;
2285 struct elf32_hppa_stub_hash_table *stub_hash_table;
2288 const char *sym_name;
2290 /* Initialize pointers to the stub hash table, the particular entry we
2291 are building a stub for, and where (in memory) we should place the stub
2293 entry = (struct elf32_hppa_stub_hash_entry *)gen_entry;
2294 stub_hash_table = elf32_hppa_hash_table(info)->stub_hash_table;
2295 loc = stub_hash_table->location;
2297 /* Make a note of the offset within the stubs for this entry. */
2298 entry->offset = stub_hash_table->offset;
2300 /* The symbol's name starts at offset 22. */
2301 sym_name = entry->root.string + 22;
2303 sym_value = (entry->target_value
2304 + entry->target_section->output_offset
2305 + entry->target_section->output_section->vma);
2307 if (strncmp ("_____long_branch_stub_", entry->root.string, 22))
2309 /* This must be an argument or return value relocation stub. */
2311 arg_reloc_location i;
2312 bfd_byte *begin_loc = loc;
2314 /* First the return pointer adjustment. Depending on exact calling
2315 sequence this instruction may be skipped. */
2316 bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2319 /* If we are relocating a return value, then we're going to have
2320 to return into the stub. So we have to save off the user's
2321 return pointer into the stack at RP'. */
2322 if (strncmp (entry->root.string + 14, "NO", 2))
2324 bfd_put_32 (stub_bfd, STW_R31_M8R30, loc);
2328 /* Iterate over the argument relocations, emitting instructions
2329 to move them around as necessary. */
2330 for (i = ARG0; i <= ARG3; i++)
2332 if (!strncmp (entry->root.string + 3 * i + 2, "GF", 2))
2334 bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((26 - i) << 16), loc);
2335 bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | (4 + i), loc + 4);
2338 else if (!strncmp (entry->root.string + 3 * i + 2, "FG", 2))
2340 bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | (4 + i), loc);
2341 bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((26 - i) << 16), loc + 4);
2344 else if (!strncmp (entry->root.string + 3 * i + 2, "GD", 2))
2346 bfd_put_32 (stub_bfd, STW_ARG_M12R30 | ((26 - i) << 16), loc);
2347 bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((25 - i) << 16), loc + 4);
2348 bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | (5 + i), loc + 8);
2351 else if (!strncmp (entry->root.string + 3 * i + 2, "DG", 2))
2353 bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | (5 + i), loc);
2354 bfd_put_32 (stub_bfd, LDW_M12R30_ARG | ((26 - i) << 16), loc + 4);
2355 bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((25 - i) << 16), loc + 8);
2360 /* Load the high bits of the target address into %r1. */
2361 insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2362 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2363 bfd_put_32 (stub_bfd, insn, loc);
2366 /* If we are relocating a return value, then we're going to have
2367 to return into the stub, then perform the return value relocation. */
2368 if (strncmp (entry->root.string + 14, "NO", 2))
2370 /* To return to the stub we "ble" to the target and copy the return
2371 pointer from %r31 into %r2. */
2372 insn = hppa_rebuild_insn (stub_bfd,
2374 hppa_field_adjust (sym_value, 0,
2377 bfd_put_32 (stub_bfd, insn, loc);
2378 bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2380 /* Reload the return pointer for our caller from the stack. */
2381 bfd_put_32 (stub_bfd, LDW_M8R30_R31, loc + 8);
2384 /* Perform the return value relocation. */
2385 if (!strncmp (entry->root.string + 14, "GF", 2))
2387 bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (28 << 16), loc);
2388 bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | 4, loc + 4);
2391 else if (!strncmp (entry->root.string + 14, "FG", 2))
2393 bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | 4, loc);
2394 bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (28 << 16), loc + 4);
2397 else if (!strncmp (entry->root.string + 2, "GD", 2))
2399 bfd_put_32 (stub_bfd, STW_ARG_M12R30 | (28 << 16), loc);
2400 bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (29 << 16), loc + 4);
2401 bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | 4, loc + 8);
2404 else if (!strncmp (entry->root.string + 2, "DG", 2))
2406 bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | 4, loc);
2407 bfd_put_32 (stub_bfd, LDW_M12R30_ARG | (28 << 16), loc + 4);
2408 bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (29 << 16), loc + 8);
2411 /* Branch back to the user's code now. */
2412 bfd_put_32 (stub_bfd, BV_N_0_R31, loc);
2417 /* No return value relocation, so we can simply "be" to the
2418 target and copy out return pointer into %r2. */
2419 insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1,
2420 hppa_field_adjust (sym_value, 0,
2422 bfd_put_32 (stub_bfd, insn, loc);
2423 bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4);
2427 /* Update the location and offsets. */
2428 stub_hash_table->location += (loc - begin_loc);
2429 stub_hash_table->offset += (loc - begin_loc);
2433 /* Create one of two variant long branch stubs. One for $$dyncall and
2434 normal calls, the other for calls to millicode. */
2436 int millicode_call = 0;
2438 if (!strncmp ("$$", sym_name, 2) && strcmp ("$$dyncall", sym_name))
2441 /* First the return pointer adjustment. Depending on exact calling
2442 sequence this instruction may be skipped. */
2443 bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc);
2445 /* The next two instructions are the long branch itself. A long branch
2446 is formed with "ldil" loading the upper bits of the target address
2447 into a register, then branching with "be" which adds in the lower bits.
2448 Long branches to millicode nullify the delay slot of the "be". */
2449 insn = hppa_rebuild_insn (stub_bfd, LDIL_R1,
2450 hppa_field_adjust (sym_value, 0, e_lrsel), 21);
2451 bfd_put_32 (stub_bfd, insn, loc + 4);
2452 insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1 | (millicode_call ? 2 : 0),
2453 hppa_field_adjust (sym_value, 0, e_rrsel) >> 2,
2455 bfd_put_32 (stub_bfd, insn, loc + 8);
2457 if (!millicode_call)
2459 /* The sequence to call this stub places the return pointer into %r31,
2460 the final target expects the return pointer in %r2, so copy the
2461 return pointer into the proper register. */
2462 bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 12);
2464 /* Update the location and offsets. */
2465 stub_hash_table->location += 16;
2466 stub_hash_table->offset += 16;
2470 /* Update the location and offsets. */
2471 stub_hash_table->location += 12;
2472 stub_hash_table->offset += 12;
2479 /* External entry points for sizing and building linker stubs. */
2481 /* Build all the stubs associated with the current output file. The
2482 stubs are kept in a hash table attached to the main linker hash
2483 table. This is called via hppaelf_finish in the linker. */
2486 elf32_hppa_build_stubs (stub_bfd, info)
2488 struct bfd_link_info *info;
2490 /* The stub BFD only has one section. */
2491 asection *stub_sec = stub_bfd->sections;
2492 struct elf32_hppa_stub_hash_table *table;
2496 /* So we can pass both the BFD for the stubs and the link info
2497 structure to the routine which actually builds stubs. */
2501 /* Allocate memory to hold the linker stubs. */
2502 size = bfd_section_size (stub_bfd, stub_sec);
2503 stub_sec->contents = (unsigned char *) bfd_zalloc (stub_bfd, size);
2504 if (stub_sec->contents == NULL)
2506 bfd_set_error (bfd_error_no_memory);
2509 table = elf32_hppa_hash_table(info)->stub_hash_table;
2510 table->location = stub_sec->contents;
2512 /* Build the stubs as directed by the stub hash table. */
2513 elf32_hppa_stub_hash_traverse (table, elf32_hppa_build_one_stub, args);
2518 /* Determine and set the size of the stub section for a final link.
2520 The basic idea here is to examine all the relocations looking for
2521 PC-relative calls to a target that is unreachable with a "bl"
2522 instruction or calls where the caller and callee disagree on the
2523 location of their arguments or return value. */
2526 elf32_hppa_size_stubs (stub_bfd, output_bfd, link_info)
2529 struct bfd_link_info *link_info;
2532 asection *section, *stub_sec = 0;
2533 Elf_Internal_Shdr *symtab_hdr;
2534 Elf_Internal_Sym *local_syms, *isym, **all_local_syms;
2535 Elf32_External_Sym *ext_syms, *esym;
2536 unsigned int i, index, bfd_count = 0;
2537 struct elf32_hppa_stub_hash_table *stub_hash_table = 0;
2538 struct elf32_hppa_args_hash_table *args_hash_table = 0;
2540 /* Create and initialize the stub hash table. */
2541 stub_hash_table = ((struct elf32_hppa_stub_hash_table *)
2542 malloc (sizeof (struct elf32_hppa_stub_hash_table)));
2543 if (!stub_hash_table)
2545 bfd_set_error (bfd_error_no_memory);
2549 if (!elf32_hppa_stub_hash_table_init (stub_hash_table, stub_bfd,
2550 elf32_hppa_stub_hash_newfunc))
2553 /* Likewise for the argument location hash table. */
2554 args_hash_table = ((struct elf32_hppa_args_hash_table *)
2555 malloc (sizeof (struct elf32_hppa_args_hash_table)));
2556 if (!args_hash_table)
2558 bfd_set_error (bfd_error_no_memory);
2562 if (!elf32_hppa_args_hash_table_init (args_hash_table,
2563 elf32_hppa_args_hash_newfunc))
2566 /* Attach the hash tables to the main hash table. */
2567 elf32_hppa_hash_table(link_info)->stub_hash_table = stub_hash_table;
2568 elf32_hppa_hash_table(link_info)->args_hash_table = args_hash_table;
2570 /* Count the number of input BFDs. */
2571 for (input_bfd = link_info->input_bfds;
2573 input_bfd = input_bfd->link_next)
2576 /* We want to read in symbol extension records only once. To do this
2577 we need to read in the local symbols in parallel and save them for
2578 later use; so hold pointers to the local symbols in an array. */
2580 = (Elf_Internal_Sym **) malloc (sizeof (Elf_Internal_Sym *) * bfd_count);
2581 if (all_local_syms == NULL)
2583 bfd_set_error (bfd_error_no_memory);
2586 memset (all_local_syms, 0, sizeof (Elf_Internal_Sym *) * bfd_count);
2588 /* Walk over all the input BFDs adding entries to the args hash table
2589 for all the external functions. */
2590 for (input_bfd = link_info->input_bfds, index = 0;
2592 input_bfd = input_bfd->link_next, index++)
2594 /* We'll need the symbol table in a second. */
2595 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2596 if (symtab_hdr->sh_info == 0)
2599 /* We need an array of the local symbols attached to the input bfd.
2600 Unfortunately, we're going to have to read & swap them in. */
2602 = (Elf_Internal_Sym *)malloc (symtab_hdr->sh_info
2603 * sizeof (Elf_Internal_Sym));
2604 if (local_syms == NULL)
2606 bfd_set_error (bfd_error_no_memory);
2607 for (i = 0; i < bfd_count; i++)
2608 if (all_local_syms[i])
2609 free (all_local_syms[i]);
2610 free (all_local_syms);
2613 all_local_syms[index] = local_syms;
2616 = (Elf32_External_Sym *)malloc (symtab_hdr->sh_info
2617 * sizeof (Elf32_External_Sym));
2618 if (ext_syms == NULL)
2620 bfd_set_error (bfd_error_no_memory);
2621 for (i = 0; i < bfd_count; i++)
2622 if (all_local_syms[i])
2623 free (all_local_syms[i]);
2624 free (all_local_syms);
2628 if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0
2629 || bfd_read (ext_syms, 1,
2630 (symtab_hdr->sh_info
2631 * sizeof (Elf32_External_Sym)), input_bfd)
2632 != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym)))
2634 for (i = 0; i < bfd_count; i++)
2635 if (all_local_syms[i])
2636 free (all_local_syms[i]);
2637 free (all_local_syms);
2642 /* Swap the local symbols in. */
2645 for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++)
2646 bfd_elf32_swap_symbol_in (input_bfd, esym, isym);
2648 /* Now we can free the external symbols. */
2651 if (elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table,
2652 local_syms) == false)
2654 for (i = 0; i < bfd_count; i++)
2655 if (all_local_syms[i])
2656 free (all_local_syms[i]);
2657 free (all_local_syms);
2662 /* Magic as we know the stub bfd only has one section. */
2663 stub_sec = stub_bfd->sections;
2665 /* If generating a relocateable output file, then we don't
2666 have to examine the relocs. */
2667 if (link_info->relocateable)
2669 for (i = 0; i < bfd_count; i++)
2670 if (all_local_syms[i])
2671 free (all_local_syms[i]);
2672 free (all_local_syms);
2676 /* Now that we have argument location information for all the global
2677 functions we can start looking for stubs. */
2678 for (input_bfd = link_info->input_bfds, index = 0;
2680 input_bfd = input_bfd->link_next, index++)
2682 /* We'll need the symbol table in a second. */
2683 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2684 if (symtab_hdr->sh_info == 0)
2687 local_syms = all_local_syms[index];
2689 /* Walk over each section attached to the input bfd. */
2690 for (section = input_bfd->sections;
2692 section = section->next)
2694 Elf_Internal_Shdr *input_rel_hdr;
2695 Elf32_External_Rela *external_relocs, *erelaend, *erela;
2696 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2698 /* If there aren't any relocs, then there's nothing to do. */
2699 if ((section->flags & SEC_RELOC) == 0
2700 || section->reloc_count == 0)
2703 /* Allocate space for the external relocations. */
2705 = (Elf32_External_Rela *) malloc (section->reloc_count * sizeof (Elf32_External_Rela));
2706 if (external_relocs == NULL)
2708 bfd_set_error (bfd_error_no_memory);
2709 for (i = 0; i < bfd_count; i++)
2710 if (all_local_syms[i])
2711 free (all_local_syms[i]);
2712 free (all_local_syms);
2716 /* Likewise for the internal relocations. */
2718 = (Elf_Internal_Rela *) malloc (section->reloc_count * sizeof (Elf_Internal_Rela));
2719 if (internal_relocs == NULL)
2721 bfd_set_error (bfd_error_no_memory);
2722 free (external_relocs);
2723 for (i = 0; i < bfd_count; i++)
2724 if (all_local_syms[i])
2725 free (all_local_syms[i]);
2726 free (all_local_syms);
2730 /* Read in the external relocs. */
2731 input_rel_hdr = &elf_section_data (section)->rel_hdr;
2732 if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0
2733 || bfd_read (external_relocs, 1, input_rel_hdr->sh_size,
2734 input_bfd) != input_rel_hdr->sh_size)
2736 free (external_relocs);
2737 free (internal_relocs);
2738 for (i = 0; i < bfd_count; i++)
2739 if (all_local_syms[i])
2740 free (all_local_syms[i]);
2741 free (all_local_syms);
2745 /* Swap in the relocs. */
2746 erela = external_relocs;
2747 erelaend = erela + section->reloc_count;
2748 irela = internal_relocs;
2749 for (; erela < erelaend; erela++, irela++)
2750 bfd_elf32_swap_reloca_in (input_bfd, erela, irela);
2752 /* We're done with the external relocs, free them. */
2753 free (external_relocs);
2755 /* Now examine each relocation. */
2756 irela = internal_relocs;
2757 irelaend = irela + section->reloc_count;
2758 for (; irela < irelaend; irela++)
2760 long r_type, callee_args, caller_args, r_index, size_of_stub;
2761 struct elf_link_hash_entry *hash;
2762 struct elf32_hppa_stub_hash_entry *stub_hash;
2763 struct elf32_hppa_args_hash_entry *args_hash;
2764 Elf_Internal_Sym *sym;
2766 const char *sym_name;
2768 bfd_vma location, destination;
2769 char *new_name = NULL;
2771 r_type = ELF32_R_TYPE (irela->r_info);
2772 r_index = ELF32_R_SYM (irela->r_info);
2774 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
2776 bfd_set_error (bfd_error_bad_value);
2777 free (internal_relocs);
2778 for (i = 0; i < bfd_count; i++)
2779 if (all_local_syms[i])
2780 free (all_local_syms[i]);
2781 free (all_local_syms);
2785 /* Only look for stubs on call instructions or plabel
2787 if (r_type != R_PARISC_PCREL17F
2788 && r_type != R_PARISC_PLABEL32
2789 && r_type != R_PARISC_PLABEL21L
2790 && r_type != R_PARISC_PLABEL14R)
2793 /* Now determine the call target, its name, value, section
2794 and argument relocation bits. */
2798 if (r_index < symtab_hdr->sh_info)
2800 /* It's a local symbol. */
2801 Elf_Internal_Shdr *hdr;
2803 sym = local_syms + r_index;
2804 hdr = elf_elfsections (input_bfd)[sym->st_shndx];
2805 sym_sec = hdr->bfd_section;
2806 sym_name = bfd_elf_string_from_elf_section (input_bfd,
2807 symtab_hdr->sh_link,
2809 sym_value = (ELF_ST_TYPE (sym->st_info) == STT_SECTION
2810 ? 0 : sym->st_value);
2811 destination = (sym_value
2812 + sym_sec->output_offset
2813 + sym_sec->output_section->vma);
2815 /* Tack on an ID so we can uniquely identify this local
2816 symbol in the stub or arg info hash tables. */
2817 new_name = malloc (strlen (sym_name) + 10);
2820 bfd_set_error (bfd_error_bad_value);
2821 free (internal_relocs);
2822 for (i = 0; i < bfd_count; i++)
2823 if (all_local_syms[i])
2824 free (all_local_syms[i]);
2825 free (all_local_syms);
2828 sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec);
2829 sym_name = new_name;
2833 /* It's an external symbol. */
2836 index = r_index - symtab_hdr->sh_info;
2837 hash = elf_sym_hashes (input_bfd)[index];
2838 if (hash->root.type == bfd_link_hash_defined
2839 || hash->root.type == bfd_link_hash_defweak)
2841 sym_sec = hash->root.u.def.section;
2842 sym_name = hash->root.root.string;
2843 sym_value = hash->root.u.def.value;
2844 destination = (sym_value
2845 + sym_sec->output_offset
2846 + sym_sec->output_section->vma);
2850 bfd_set_error (bfd_error_bad_value);
2851 free (internal_relocs);
2852 for (i = 0; i < bfd_count; i++)
2853 if (all_local_syms[i])
2854 free (all_local_syms[i]);
2855 free (all_local_syms);
2860 args_hash = elf32_hppa_args_hash_lookup (args_hash_table,
2861 sym_name, false, false);
2863 /* Get both caller and callee argument information. */
2864 if (args_hash == NULL)
2867 callee_args = args_hash->arg_bits;
2869 /* For calls get the caller's bits from the addend of
2870 the call relocation. For PLABELS the caller's bits
2871 are assumed to have all args & return values in general
2872 registers (0x155). */
2873 if (r_type == R_PARISC_PCREL17F)
2874 caller_args = HPPA_R_ARG_RELOC (irela->r_addend);
2876 caller_args = 0x155;
2878 /* Now determine where the call point is. */
2879 location = (section->output_offset
2880 + section->output_section->vma
2883 /* We only care about the destination for PCREL function
2884 calls (eg. we don't care for PLABELS). */
2885 if (r_type != R_PARISC_PCREL17F)
2886 location = destination;
2888 /* Determine what (if any) linker stub is needed and its
2890 size_of_stub = elf32_hppa_size_of_stub (callee_args,
2895 if (size_of_stub != 0)
2900 /* Get the name of this stub. */
2901 len = strlen (sym_name);
2904 stub_name = malloc (len);
2907 bfd_set_error (bfd_error_no_memory);
2909 /* Because sym_name was mallocd above for local
2911 if (r_index < symtab_hdr->sh_info)
2914 free (internal_relocs);
2915 for (i = 0; i < bfd_count; i++)
2916 if (all_local_syms[i])
2917 free (all_local_syms[i]);
2918 free (all_local_syms);
2921 elf32_hppa_name_of_stub (caller_args, callee_args,
2922 location, destination, stub_name);
2923 strcat (stub_name + 22, sym_name);
2925 /* Because sym_name was malloced above for local symbols. */
2926 if (r_index < symtab_hdr->sh_info)
2930 = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name,
2932 if (stub_hash != NULL)
2934 /* The proper stub has already been created, nothing
2940 bfd_set_section_size (stub_bfd, stub_sec,
2941 (bfd_section_size (stub_bfd,
2945 /* Enter this entry into the linker stub hash table. */
2947 = elf32_hppa_stub_hash_lookup (stub_hash_table,
2948 stub_name, true, true);
2949 if (stub_hash == NULL)
2951 bfd_set_error (bfd_error_no_memory);
2953 free (internal_relocs);
2954 for (i = 0; i < bfd_count; i++)
2955 if (all_local_syms[i])
2956 free (all_local_syms[i]);
2957 free (all_local_syms);
2961 /* We'll need these to determine the address that the
2962 stub will branch to. */
2963 stub_hash->target_value = sym_value;
2964 stub_hash->target_section = sym_sec;
2969 /* We're done with the internal relocs, free them. */
2970 free (internal_relocs);
2973 /* We're done with the local symbols, free them. */
2974 for (i = 0; i < bfd_count; i++)
2975 if (all_local_syms[i])
2976 free (all_local_syms[i]);
2977 free (all_local_syms);
2981 /* Return gracefully, avoiding dangling references to the hash tables. */
2982 if (stub_hash_table)
2984 elf32_hppa_hash_table(link_info)->stub_hash_table = NULL;
2985 free (stub_hash_table);
2987 if (args_hash_table)
2989 elf32_hppa_hash_table(link_info)->args_hash_table = NULL;
2990 free (args_hash_table);
2992 /* Set the size of the stub section to zero since we're never going
2993 to create them. Avoids losing when we try to get its contents
2995 bfd_set_section_size (stub_bfd, stub_sec, 0);
2999 /* Misc BFD support code. */
3000 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
3001 #define bfd_elf32_bfd_is_local_label hppa_elf_is_local_label
3003 /* Symbol extension stuff. */
3004 #define bfd_elf32_set_section_contents elf32_hppa_set_section_contents
3005 #define elf_backend_symbol_table_processing \
3006 elf32_hppa_backend_symbol_table_processing
3007 #define elf_backend_begin_write_processing \
3008 elf32_hppa_backend_begin_write_processing
3009 #define elf_backend_final_write_processing \
3010 elf32_hppa_backend_final_write_processing
3012 /* Stuff for the BFD linker. */
3013 #define elf_backend_relocate_section elf32_hppa_relocate_section
3014 #define elf_backend_add_symbol_hook elf32_hppa_add_symbol_hook
3015 #define elf_backend_link_output_symbol_hook \
3016 elf32_hppa_link_output_symbol_hook
3017 #define bfd_elf32_bfd_link_hash_table_create \
3018 elf32_hppa_link_hash_table_create
3020 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
3021 #define TARGET_BIG_NAME "elf32-hppa"
3022 #define ELF_ARCH bfd_arch_hppa
3023 #define ELF_MACHINE_CODE EM_PARISC
3024 #define ELF_MAXPAGESIZE 0x1000
3026 #include "elf32-target.h"