1 /* BFD back-end for HP PA-RISC ELF files.
2 Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997
3 Free Software Foundation, Inc.
7 Center for Software Science
8 Department of Computer Science
11 This file is part of BFD, the Binary File Descriptor library.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 elf32_hppa_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
*, unsigned 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_name
PARAMS ((bfd
*, const char *));
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 /* The values in DIR32 are to placate the check in
300 _bfd_stab_section_find_nearest_line. */
301 {R_PARISC_DIR32
, 0, 2, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DIR32", false, 0, 0xffffffff, false},
302 {R_PARISC_DIR21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DIR21L"},
303 {R_PARISC_DIR17R
, 0, 0, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DIR17R"},
304 {R_PARISC_DIR17F
, 0, 0, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DIR17F"},
305 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
306 {R_PARISC_DIR14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DIR14R"},
307 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
309 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
310 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
311 {R_PARISC_PCREL21L
, 0, 0, 21, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL21L"},
312 {R_PARISC_PCREL17R
, 0, 0, 17, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL17R"},
313 {R_PARISC_PCREL17F
, 0, 0, 17, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL17F"},
314 {R_PARISC_PCREL17C
, 0, 0, 17, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL17C"},
315 {R_PARISC_PCREL14R
, 0, 0, 14, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL14R"},
316 {R_PARISC_PCREL14F
, 0, 0, 14, true, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PCREL14F"},
318 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
319 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
320 {R_PARISC_DPREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DPREL21L"},
321 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
322 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
323 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
324 {R_PARISC_DPREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DPREL14R"},
325 {R_PARISC_DPREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DPREL14F"},
327 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
328 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
329 {R_PARISC_DLTREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTREL21L"},
330 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
331 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
332 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
333 {R_PARISC_DLTREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTREL14R"},
334 {R_PARISC_DLTREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTREL14F"},
336 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
337 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
338 {R_PARISC_DLTIND21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTIND21L"},
339 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
340 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
341 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
342 {R_PARISC_DLTIND14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTIND14R"},
343 {R_PARISC_DLTIND14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_DLTIND14F"},
345 {R_PARISC_SETBASE
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_SETBASE"},
346 {R_PARISC_BASEREL32
, 0, 0, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL32"},
347 {R_PARISC_BASEREL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL21L"},
348 {R_PARISC_BASEREL17R
, 0, 0, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL17R"},
349 {R_PARISC_BASEREL17F
, 0, 0, 17, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL17F"},
350 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
351 {R_PARISC_BASEREL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL14R"},
352 {R_PARISC_BASEREL14F
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_BASEREL14F"},
354 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
355 {R_PARISC_TEXTREL32
, 0, 0, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_TEXTREL32"},
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 {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"},
363 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
364 {R_PARISC_DATAREL32
, 0, 0, 32, 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 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
370 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
373 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
374 {R_PARISC_PLABEL32
, 0, 0, 32, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLABEL32"},
375 {R_PARISC_PLABEL21L
, 0, 0, 21, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLABEL21L"},
376 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
377 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
378 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
379 {R_PARISC_PLABEL14R
, 0, 0, 14, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLABEL14R"},
380 {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 {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"},
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 {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"},
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 {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"},
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 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
440 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
443 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
444 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
445 {R_PARISC_PLTIND21L
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLTIND21L"},
446 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
447 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
448 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_UNIMPLEMENTED"},
449 {R_PARISC_PLTIND14R
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLTIND14R"},
450 {R_PARISC_PLTIND14F
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_PLTIND14F"},
453 {R_PARISC_COPY
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_COPY"},
454 {R_PARISC_GLOB_DAT
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_GLOB_DAT"},
455 {R_PARISC_JMP_SLOT
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_JMP_SLOT"},
456 {R_PARISC_RELATIVE
, 0, 0, 0, false, 0, complain_overflow_bitfield
, hppa_elf_reloc
, "R_PARISC_RELATIVE"},
458 {R_PARISC_UNIMPLEMENTED
, 0, 0, 0, false, 0, complain_overflow_dont
, NULL
, "R_PARISC_UNIMPLEMENTED"},
461 /* Where (what register type) is an argument comming from? */
472 /* Horizontal represents the callee's argument location information,
473 vertical represents caller's argument location information. Value at a
474 particular X,Y location represents what (if any) argument relocation
475 needs to be performed to make caller and callee agree. */
477 static CONST arg_reloc_type arg_mismatches
[6][6] =
479 {NO
, NO
, NO
, NO
, NO
, NO
},
480 {NO
, NO
, GF
, NO
, GD
, NO
},
481 {NO
, FG
, NO
, NO
, NO
, NO
},
482 {NO
, NO
, NO
, NO
, NO
, NO
},
483 {NO
, DG
, NO
, NO
, NO
, NO
},
484 {NO
, DG
, NO
, NO
, NO
, NO
},
487 /* Likewise, but reversed for the return value. */
488 static CONST arg_reloc_type ret_mismatches
[6][6] =
490 {NO
, NO
, NO
, NO
, NO
, NO
},
491 {NO
, NO
, FG
, NO
, DG
, NO
},
492 {NO
, GF
, NO
, NO
, NO
, NO
},
493 {NO
, NO
, NO
, NO
, NO
, NO
},
494 {NO
, GD
, NO
, NO
, NO
, NO
},
495 {NO
, GD
, NO
, NO
, NO
, NO
},
498 /* Misc static crud for symbol extension records. */
499 static symext_chainS
*symext_rootP
;
500 static symext_chainS
*symext_lastP
;
501 static bfd_size_type symext_chain_size
;
503 /* FIXME: We should be able to try this static variable! */
504 static bfd_byte
*symextn_contents
;
507 /* For linker stub hash tables. */
508 #define elf32_hppa_stub_hash_lookup(table, string, create, copy) \
509 ((struct elf32_hppa_stub_hash_entry *) \
510 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
512 #define elf32_hppa_stub_hash_traverse(table, func, info) \
515 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
518 /* For linker args hash tables. */
519 #define elf32_hppa_args_hash_lookup(table, string, create, copy) \
520 ((struct elf32_hppa_args_hash_entry *) \
521 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
523 #define elf32_hppa_args_hash_traverse(table, func, info) \
526 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
529 #define elf32_hppa_args_hash_table_init(table, newfunc) \
530 (bfd_hash_table_init \
532 (struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, \
533 struct bfd_hash_table *, \
534 const char *))) (newfunc)))
536 /* For HPPA linker hash table. */
538 #define elf32_hppa_link_hash_lookup(table, string, create, copy, follow)\
539 ((struct elf32_hppa_link_hash_entry *) \
540 elf_link_hash_lookup (&(table)->root, (string), (create), \
543 #define elf32_hppa_link_hash_traverse(table, func, info) \
544 (elf_link_hash_traverse \
546 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
549 /* Get the PA ELF linker hash table from a link_info structure. */
551 #define elf32_hppa_hash_table(p) \
552 ((struct elf32_hppa_link_hash_table *) ((p)->hash))
555 /* Extract specific argument location bits for WHICH from
556 the full argument location in AR. */
557 #define EXTRACT_ARBITS(ar, which) ((ar) >> (8 - ((which) * 2))) & 3
559 /* Assorted hash table functions. */
561 /* Initialize an entry in the stub hash table. */
563 static struct bfd_hash_entry
*
564 elf32_hppa_stub_hash_newfunc (entry
, table
, string
)
565 struct bfd_hash_entry
*entry
;
566 struct bfd_hash_table
*table
;
569 struct elf32_hppa_stub_hash_entry
*ret
;
571 ret
= (struct elf32_hppa_stub_hash_entry
*) entry
;
573 /* Allocate the structure if it has not already been allocated by a
576 ret
= ((struct elf32_hppa_stub_hash_entry
*)
577 bfd_hash_allocate (table
,
578 sizeof (struct elf32_hppa_stub_hash_entry
)));
582 /* Call the allocation method of the superclass. */
583 ret
= ((struct elf32_hppa_stub_hash_entry
*)
584 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
));
588 /* Initialize the local fields. */
590 ret
->target_value
= 0;
591 ret
->target_section
= NULL
;
594 return (struct bfd_hash_entry
*) ret
;
597 /* Initialize a stub hash table. */
600 elf32_hppa_stub_hash_table_init (table
, stub_bfd
, newfunc
)
601 struct elf32_hppa_stub_hash_table
*table
;
603 struct bfd_hash_entry
*(*newfunc
) PARAMS ((struct bfd_hash_entry
*,
604 struct bfd_hash_table
*,
609 table
->stub_bfd
= stub_bfd
;
610 return (bfd_hash_table_init (&table
->root
, newfunc
));
613 /* Initialize an entry in the argument location hash table. */
615 static struct bfd_hash_entry
*
616 elf32_hppa_args_hash_newfunc (entry
, table
, string
)
617 struct bfd_hash_entry
*entry
;
618 struct bfd_hash_table
*table
;
621 struct elf32_hppa_args_hash_entry
*ret
;
623 ret
= (struct elf32_hppa_args_hash_entry
*) entry
;
625 /* Allocate the structure if it has not already been allocated by a
628 ret
= ((struct elf32_hppa_args_hash_entry
*)
629 bfd_hash_allocate (table
,
630 sizeof (struct elf32_hppa_args_hash_entry
)));
634 /* Call the allocation method of the superclass. */
635 ret
= ((struct elf32_hppa_args_hash_entry
*)
636 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
));
638 /* Initialize the local fields. */
642 return (struct bfd_hash_entry
*) ret
;
645 /* Create the derived linker hash table. The PA ELF port uses the derived
646 hash table to keep information specific to the PA ELF linker (without
647 using static variables). */
649 static struct bfd_link_hash_table
*
650 elf32_hppa_link_hash_table_create (abfd
)
653 struct elf32_hppa_link_hash_table
*ret
;
655 ret
= ((struct elf32_hppa_link_hash_table
*)
656 bfd_alloc (abfd
, sizeof (struct elf32_hppa_link_hash_table
)));
659 if (!_bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
660 _bfd_elf_link_hash_newfunc
))
662 bfd_release (abfd
, ret
);
665 ret
->stub_hash_table
= NULL
;
666 ret
->args_hash_table
= NULL
;
667 ret
->output_symbol_count
= 0;
668 ret
->global_value
= 0;
669 ret
->global_sym_defined
= 0;
671 return &ret
->root
.root
;
674 /* Relocate the given INSN given the various input parameters.
676 FIXME: endianness and sizeof (long) issues abound here. */
679 hppa_elf_relocate_insn (abfd
, input_sect
, insn
, address
, sym_value
,
680 r_addend
, r_format
, r_field
, pcrel
)
682 asection
*input_sect
;
684 unsigned long address
;
687 unsigned long r_format
;
688 unsigned long r_field
;
691 unsigned char opcode
= get_opcode (insn
);
711 constant_value
= HPPA_R_CONSTANT (r_addend
);
714 sym_value
-= address
;
716 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
717 return hppa_rebuild_insn (abfd
, insn
, sym_value
, r_format
);
722 /* XXX computing constant_value is not needed??? */
723 constant_value
= assemble_17 ((insn
& 0x001f0000) >> 16,
724 (insn
& 0x00001ffc) >> 2,
727 constant_value
= (constant_value
<< 15) >> 15;
731 address
+ input_sect
->output_offset
732 + input_sect
->output_section
->vma
;
733 sym_value
= hppa_field_adjust (sym_value
, -8, r_field
);
736 sym_value
= hppa_field_adjust (sym_value
, constant_value
, r_field
);
738 return hppa_rebuild_insn (abfd
, insn
, sym_value
>> 2, r_format
);
743 constant_value
= HPPA_R_CONSTANT (r_addend
);
746 sym_value
-= address
;
748 return hppa_field_adjust (sym_value
, constant_value
, r_field
);
755 /* Relocate an HPPA ELF section. */
758 elf32_hppa_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
759 contents
, relocs
, local_syms
, local_sections
)
761 struct bfd_link_info
*info
;
763 asection
*input_section
;
765 Elf_Internal_Rela
*relocs
;
766 Elf_Internal_Sym
*local_syms
;
767 asection
**local_sections
;
769 Elf_Internal_Shdr
*symtab_hdr
;
770 Elf_Internal_Rela
*rel
;
771 Elf_Internal_Rela
*relend
;
773 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
776 relend
= relocs
+ input_section
->reloc_count
;
777 for (; rel
< relend
; rel
++)
780 reloc_howto_type
*howto
;
781 unsigned long r_symndx
;
782 struct elf_link_hash_entry
*h
;
783 Elf_Internal_Sym
*sym
;
786 bfd_reloc_status_type r
;
787 const char *sym_name
;
789 r_type
= ELF32_R_TYPE (rel
->r_info
);
790 if (r_type
< 0 || r_type
>= (int) R_PARISC_UNIMPLEMENTED
)
792 bfd_set_error (bfd_error_bad_value
);
795 howto
= elf_hppa_howto_table
+ r_type
;
797 r_symndx
= ELF32_R_SYM (rel
->r_info
);
799 if (info
->relocateable
)
801 /* This is a relocateable link. We don't have to change
802 anything, unless the reloc is against a section symbol,
803 in which case we have to adjust according to where the
804 section symbol winds up in the output section. */
805 if (r_symndx
< symtab_hdr
->sh_info
)
807 sym
= local_syms
+ r_symndx
;
808 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
810 sym_sec
= local_sections
[r_symndx
];
811 rel
->r_addend
+= sym_sec
->output_offset
;
818 /* This is a final link. */
822 if (r_symndx
< symtab_hdr
->sh_info
)
824 sym
= local_syms
+ r_symndx
;
825 sym_sec
= local_sections
[r_symndx
];
826 relocation
= ((ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
828 + sym_sec
->output_offset
829 + sym_sec
->output_section
->vma
);
835 indx
= r_symndx
- symtab_hdr
->sh_info
;
836 h
= elf_sym_hashes (input_bfd
)[indx
];
837 while (h
->root
.type
== bfd_link_hash_indirect
838 || h
->root
.type
== bfd_link_hash_warning
)
839 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
840 if (h
->root
.type
== bfd_link_hash_defined
841 || h
->root
.type
== bfd_link_hash_defweak
)
843 sym_sec
= h
->root
.u
.def
.section
;
844 relocation
= (h
->root
.u
.def
.value
845 + sym_sec
->output_offset
846 + sym_sec
->output_section
->vma
);
848 else if (h
->root
.type
== bfd_link_hash_undefweak
)
852 if (!((*info
->callbacks
->undefined_symbol
)
853 (info
, h
->root
.root
.string
, input_bfd
,
854 input_section
, rel
->r_offset
)))
861 sym_name
= h
->root
.root
.string
;
864 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
867 if (sym_name
== NULL
)
869 if (*sym_name
== '\0')
870 sym_name
= bfd_section_name (input_bfd
, sym_sec
);
873 /* If args_hash_table is NULL, then we have encountered some
874 kind of link error (ex. undefined symbols). Do not try to
875 apply any relocations, continue the loop so we can notify
876 the user of several errors in a single attempted link. */
877 if (elf32_hppa_hash_table (info
)->args_hash_table
== NULL
)
880 r
= elf32_hppa_bfd_final_link_relocate (howto
, input_bfd
, output_bfd
,
881 input_section
, contents
,
882 rel
->r_offset
, relocation
,
883 rel
->r_addend
, info
, sym_sec
,
884 sym_name
, h
== NULL
);
886 if (r
!= bfd_reloc_ok
)
890 /* This can happen for DP relative relocs if $global$ is
891 undefined. This is a panic situation so we don't try
893 case bfd_reloc_undefined
:
894 case bfd_reloc_notsupported
:
895 if (!((*info
->callbacks
->undefined_symbol
)
896 (info
, "$global$", input_bfd
,
897 input_section
, rel
->r_offset
)))
900 case bfd_reloc_dangerous
:
902 /* We use this return value to indicate that we performed
903 a "dangerous" relocation. This doesn't mean we did
904 the wrong thing, it just means there may be some cleanup
905 that needs to be done here.
907 In particular we had to swap the last call insn and its
908 delay slot. If the delay slot insn needed a relocation,
909 then we'll need to adjust the next relocation entry's
910 offset to account for the fact that the insn moved.
912 This hair wouldn't be necessary if we inserted stubs
913 between procedures and used a "bl" to get to the stub. */
916 Elf_Internal_Rela
*next_rel
= rel
+ 1;
918 if (rel
->r_offset
+ 4 == next_rel
->r_offset
)
919 next_rel
->r_offset
-= 4;
924 case bfd_reloc_outofrange
:
925 case bfd_reloc_overflow
:
927 if (!((*info
->callbacks
->reloc_overflow
)
928 (info
, sym_name
, howto
->name
, (bfd_vma
) 0,
929 input_bfd
, input_section
, rel
->r_offset
)))
940 /* Return one (or more) BFD relocations which implement the base
941 relocation with modifications based on format and field. */
943 elf32_hppa_reloc_type
**
944 hppa_elf_gen_reloc_type (abfd
, base_type
, format
, field
, ignore
, sym
)
946 elf32_hppa_reloc_type base_type
;
952 elf32_hppa_reloc_type
*finaltype
;
953 elf32_hppa_reloc_type
**final_types
;
955 /* Allocate slots for the BFD relocation. */
956 final_types
= ((elf32_hppa_reloc_type
**)
957 bfd_alloc (abfd
, sizeof (elf32_hppa_reloc_type
*) * 2));
958 if (final_types
== NULL
)
961 /* Allocate space for the relocation itself. */
962 finaltype
= ((elf32_hppa_reloc_type
*)
963 bfd_alloc (abfd
, sizeof (elf32_hppa_reloc_type
)));
964 if (finaltype
== NULL
)
967 /* Some reasonable defaults. */
968 final_types
[0] = finaltype
;
969 final_types
[1] = NULL
;
971 #define final_type finaltype[0]
973 final_type
= base_type
;
975 /* Just a tangle of nested switch statements to deal with the braindamage
976 that a different field selector means a completely different relocation
981 case R_HPPA_ABS_CALL
:
989 final_type
= R_PARISC_DIR14R
;
992 final_type
= R_PARISC_DLTREL14R
;
995 final_type
= R_PARISC_DLTREL14F
;
998 final_type
= R_PARISC_PLABEL14R
;
1009 final_type
= R_PARISC_DIR17F
;
1013 final_type
= R_PARISC_DIR17R
;
1025 final_type
= R_PARISC_DIR21L
;
1028 final_type
= R_PARISC_DLTREL21L
;
1031 final_type
= R_PARISC_PLABEL21L
;
1042 final_type
= R_PARISC_DIR32
;
1045 final_type
= R_PARISC_PLABEL32
;
1066 final_type
= R_PARISC_DPREL14R
;
1069 final_type
= R_PARISC_DPREL14F
;
1081 final_type
= R_PARISC_DPREL21L
;
1094 case R_HPPA_PCREL_CALL
:
1102 final_type
= R_PARISC_PCREL14R
;
1105 final_type
= R_PARISC_PCREL14F
;
1117 final_type
= R_PARISC_PCREL17R
;
1120 final_type
= R_PARISC_PCREL17F
;
1132 final_type
= R_PARISC_PCREL21L
;
1153 /* Set the contents of a particular section at a particular location. */
1156 elf32_hppa_set_section_contents (abfd
, section
, location
, offset
, count
)
1161 bfd_size_type count
;
1163 /* Ignore write requests for the symbol extension section until we've
1164 had the chance to rebuild it ourselves. */
1165 if (!strcmp (section
->name
, ".PARISC.symextn") && !symext_chain_size
)
1168 return _bfd_elf_set_section_contents (abfd
, section
, location
,
1172 /* Translate from an elf into field into a howto relocation pointer. */
1175 elf32_hppa_info_to_howto (abfd
, cache_ptr
, dst
)
1178 Elf32_Internal_Rela
*dst
;
1180 BFD_ASSERT (ELF32_R_TYPE(dst
->r_info
) < (unsigned int) R_PARISC_UNIMPLEMENTED
);
1181 cache_ptr
->howto
= &elf_hppa_howto_table
[ELF32_R_TYPE (dst
->r_info
)];
1185 /* Actually perform a relocation. NOTE this is (mostly) superceeded
1186 by elf32_hppa_bfd_final_link_relocate which is called by the new
1189 static bfd_reloc_status_type
1190 hppa_elf_reloc (abfd
, reloc_entry
, symbol_in
, data
, input_section
, output_bfd
,
1193 arelent
*reloc_entry
;
1196 asection
*input_section
;
1198 char **error_message
;
1200 /* It is no longer valid to call hppa_elf_reloc when creating
1201 a final executable. */
1204 reloc_entry
->address
+= input_section
->output_offset
;
1206 /* Work around lossage in generic elf code to write relocations.
1207 (maps different section symbols into the same symbol index). */
1208 if ((symbol_in
->flags
& BSF_SECTION_SYM
)
1209 && symbol_in
->section
)
1210 reloc_entry
->addend
+= symbol_in
->section
->output_offset
;
1211 return bfd_reloc_ok
;
1215 *error_message
= (char *) _("Unsupported call to hppa_elf_reloc");
1216 return bfd_reloc_notsupported
;
1220 /* Actually perform a relocation as part of a final link. This can get
1221 rather hairy when linker stubs are needed. */
1223 static bfd_reloc_status_type
1224 elf32_hppa_bfd_final_link_relocate (howto
, input_bfd
, output_bfd
,
1225 input_section
, contents
, offset
, value
,
1226 addend
, info
, sym_sec
, sym_name
, is_local
)
1227 reloc_howto_type
*howto
;
1230 asection
*input_section
;
1235 struct bfd_link_info
*info
;
1237 const char *sym_name
;
1241 unsigned long r_type
= howto
->type
;
1242 unsigned long r_format
= howto
->bitsize
;
1243 unsigned long r_field
= e_fsel
;
1244 bfd_byte
*hit_data
= contents
+ offset
;
1245 boolean r_pcrel
= howto
->pc_relative
;
1247 insn
= bfd_get_32 (input_bfd
, hit_data
);
1249 /* Make sure we have a value for $global$. FIXME isn't this effectively
1250 just like the gp pointer on MIPS? Can we use those routines for this
1252 if (!elf32_hppa_hash_table (info
)->global_sym_defined
)
1254 struct elf_link_hash_entry
*h
;
1257 h
= elf_link_hash_lookup (elf_hash_table (info
), "$global$", false,
1260 /* If there isn't a $global$, then we're in deep trouble. */
1262 return bfd_reloc_notsupported
;
1264 /* If $global$ isn't a defined symbol, then we're still in deep
1266 if (h
->root
.type
!= bfd_link_hash_defined
)
1267 return bfd_reloc_undefined
;
1269 sec
= h
->root
.u
.def
.section
;
1270 elf32_hppa_hash_table (info
)->global_value
= (h
->root
.u
.def
.value
1271 + sec
->output_section
->vma
1272 + sec
->output_offset
);
1273 elf32_hppa_hash_table (info
)->global_sym_defined
= 1;
1281 case R_PARISC_DIR32
:
1282 case R_PARISC_DIR17F
:
1283 case R_PARISC_PCREL17C
:
1285 goto do_basic_type_1
;
1286 case R_PARISC_DIR21L
:
1287 case R_PARISC_PCREL21L
:
1289 goto do_basic_type_1
;
1290 case R_PARISC_DIR17R
:
1291 case R_PARISC_PCREL17R
:
1292 case R_PARISC_DIR14R
:
1293 case R_PARISC_PCREL14R
:
1295 goto do_basic_type_1
;
1297 /* For all the DP relative relocations, we need to examine the symbol's
1298 section. If it's a code section, then "data pointer relative" makes
1299 no sense. In that case we don't adjust the "value", and for 21 bit
1300 addil instructions, we change the source addend register from %dp to
1302 case R_PARISC_DPREL21L
:
1304 if (sym_sec
->flags
& SEC_CODE
)
1306 if ((insn
& 0xfc000000) >> 26 == 0xa
1307 && (insn
& 0x03e00000) >> 21 == 0x1b)
1308 insn
&= ~0x03e00000;
1311 value
-= elf32_hppa_hash_table (info
)->global_value
;
1312 goto do_basic_type_1
;
1313 case R_PARISC_DPREL14R
:
1315 if ((sym_sec
->flags
& SEC_CODE
) == 0)
1316 value
-= elf32_hppa_hash_table (info
)->global_value
;
1317 goto do_basic_type_1
;
1318 case R_PARISC_DPREL14F
:
1320 if ((sym_sec
->flags
& SEC_CODE
) == 0)
1321 value
-= elf32_hppa_hash_table (info
)->global_value
;
1322 goto do_basic_type_1
;
1324 /* These cases are separate as they may involve a lot more work
1325 to deal with linker stubs. */
1326 case R_PARISC_PLABEL32
:
1327 case R_PARISC_PLABEL21L
:
1328 case R_PARISC_PLABEL14R
:
1329 case R_PARISC_PCREL17F
:
1332 unsigned int len
, caller_args
, callee_args
;
1333 arg_reloc_type arg_reloc_types
[5];
1334 struct elf32_hppa_args_hash_table
*args_hash_table
;
1335 struct elf32_hppa_args_hash_entry
*args_hash
;
1336 char *new_name
, *stub_name
;
1338 /* Get the field selector right. We'll need it in a minute. */
1339 if (r_type
== R_PARISC_PCREL17F
1340 || r_type
== R_PARISC_PLABEL32
)
1342 else if (r_type
== R_PARISC_PLABEL21L
)
1344 else if (r_type
== R_PARISC_PLABEL14R
)
1347 /* Find out where we are and where we're going. */
1348 location
= (offset
+
1349 input_section
->output_offset
+
1350 input_section
->output_section
->vma
);
1352 /* Now look for the argument relocation bits associated with the
1354 len
= strlen (sym_name
) + 1;
1357 new_name
= bfd_malloc (len
);
1359 return bfd_reloc_notsupported
;
1360 strcpy (new_name
, sym_name
);
1362 /* Local symbols have unique IDs. */
1364 sprintf (new_name
+ len
- 10, "_%08x", (int)sym_sec
);
1366 args_hash_table
= elf32_hppa_hash_table (info
)->args_hash_table
;
1368 args_hash
= elf32_hppa_args_hash_lookup (args_hash_table
,
1369 new_name
, false, false);
1370 if (args_hash
== NULL
)
1373 callee_args
= args_hash
->arg_bits
;
1375 /* If this is a CALL relocation, then get the caller's bits
1376 from the addend. Else use the magic 0x155 value for PLABELS.
1378 Also we don't care about the destination (value) for PLABELS. */
1379 if (r_type
== R_PARISC_PCREL17F
)
1380 caller_args
= HPPA_R_ARG_RELOC (addend
);
1383 caller_args
= 0x155;
1387 /* Any kind of linker stub needed? */
1388 if (((int)(value
- location
) > 0x3ffff)
1389 || ((int)(value
- location
) < (int)0xfffc0000)
1390 || elf32_hppa_arg_reloc_needed (caller_args
, callee_args
,
1393 struct elf32_hppa_stub_hash_table
*stub_hash_table
;
1394 struct elf32_hppa_stub_hash_entry
*stub_hash
;
1395 asection
*stub_section
;
1397 /* Build a name for the stub. */
1399 len
= strlen (new_name
);
1401 stub_name
= bfd_malloc (len
);
1403 return bfd_reloc_notsupported
;
1404 elf32_hppa_name_of_stub (caller_args
, callee_args
,
1405 location
, value
, stub_name
);
1406 strcat (stub_name
, new_name
);
1409 stub_hash_table
= elf32_hppa_hash_table (info
)->stub_hash_table
;
1412 = elf32_hppa_stub_hash_lookup (stub_hash_table
, stub_name
,
1415 /* We're done with that name. */
1418 /* The stub BFD only has one section. */
1419 stub_section
= stub_hash_table
->stub_bfd
->sections
;
1421 if (stub_hash
!= NULL
)
1424 if (r_type
== R_PARISC_PCREL17F
)
1426 unsigned long delay_insn
;
1427 unsigned int opcode
, rtn_reg
, ldo_target_reg
, ldo_src_reg
;
1429 /* We'll need to peek at the next insn. */
1430 delay_insn
= bfd_get_32 (input_bfd
, hit_data
+ 4);
1431 opcode
= get_opcode (delay_insn
);
1433 /* We also need to know the return register for this
1435 rtn_reg
= (insn
& 0x03e00000) >> 21;
1437 ldo_src_reg
= (delay_insn
& 0x03e00000) >> 21;
1438 ldo_target_reg
= (delay_insn
& 0x001f0000) >> 16;
1440 /* Munge up the value and other parameters for
1441 hppa_elf_relocate_insn. */
1443 value
= (stub_hash
->offset
1444 + stub_section
->output_offset
1445 + stub_section
->output_section
->vma
);
1452 /* We need to peek at the delay insn and determine if
1453 we'll need to swap the branch and its delay insn. */
1456 && ldo_target_reg
== rtn_reg
)
1457 || (delay_insn
== 0x08000240))
1459 /* No need to swap the branch and its delay slot, but
1460 we do need to make sure to jump past the return
1461 pointer update in the stub. */
1464 /* If the delay insn does a return pointer adjustment,
1465 then we have to make sure it stays valid. */
1467 && ldo_target_reg
== rtn_reg
)
1469 delay_insn
&= 0xfc00ffff;
1470 delay_insn
|= ((31 << 21) | (31 << 16));
1471 bfd_put_32 (input_bfd
, delay_insn
, hit_data
+ 4);
1473 /* Use a BLE to reach the stub. */
1478 /* Wonderful, we have to swap the call insn and its
1480 bfd_put_32 (input_bfd
, delay_insn
, hit_data
);
1481 /* Use a BLE,n to reach the stub. */
1482 insn
= (BLE_SR4_R0
| 0x2);
1483 bfd_put_32 (input_bfd
, insn
, hit_data
+ 4);
1484 insn
= hppa_elf_relocate_insn (input_bfd
,
1490 /* Update the instruction word. */
1491 bfd_put_32 (input_bfd
, insn
, hit_data
+ 4);
1492 return bfd_reloc_dangerous
;
1497 /* PLABEL stuff is easy. */
1499 value
= (stub_hash
->offset
1500 + stub_section
->output_offset
1501 + stub_section
->output_section
->vma
);
1502 /* We don't need the RP adjustment for PLABELs. */
1504 if (r_type
== R_PARISC_PLABEL32
)
1506 else if (r_type
== R_PARISC_PLABEL21L
)
1508 else if (r_type
== R_PARISC_PLABEL14R
)
1516 return bfd_reloc_notsupported
;
1518 goto do_basic_type_1
;
1522 insn
= hppa_elf_relocate_insn (input_bfd
, input_section
, insn
,
1523 offset
, value
, addend
, r_format
,
1527 /* Something we don't know how to handle. */
1529 return bfd_reloc_notsupported
;
1532 /* Update the instruction word. */
1533 bfd_put_32 (input_bfd
, insn
, hit_data
);
1534 return (bfd_reloc_ok
);
1537 /* Return the address of the howto table entry to perform the CODE
1538 relocation for an ARCH machine. */
1540 static reloc_howto_type
*
1541 elf_hppa_reloc_type_lookup (abfd
, code
)
1543 bfd_reloc_code_real_type code
;
1545 if ((int) code
< (int) R_PARISC_UNIMPLEMENTED
)
1547 BFD_ASSERT ((int) elf_hppa_howto_table
[(int) code
].type
== (int) code
);
1548 return &elf_hppa_howto_table
[(int) code
];
1553 /* Return true if SYM represents a local label symbol. */
1556 hppa_elf_is_local_label_name (abfd
, name
)
1560 return (name
[0] == 'L' && name
[1] == '$');
1563 /* Do any backend specific processing when beginning to write an object
1564 file. For PA ELF we need to determine the size of the symbol extension
1565 section *before* any other output processing happens. */
1568 elf32_hppa_backend_begin_write_processing (abfd
, info
)
1570 struct bfd_link_info
*info
;
1573 asection
*symextn_sec
;
1575 /* Size up the symbol extension section. */
1576 if ((abfd
->outsymbols
== NULL
1578 || symext_chain_size
!= 0)
1583 /* We were not called from the BFD ELF linker code, so we need
1584 to examine the output BFD's outsymbols.
1586 Note we can not build the symbol extensions now as the symbol
1587 map hasn't been set up. */
1588 for (i
= 0; i
< abfd
->symcount
; i
++)
1590 elf_symbol_type
*symbol
= (elf_symbol_type
*)abfd
->outsymbols
[i
];
1592 /* Only functions ever need an entry in the symbol extension
1594 if (!(symbol
->symbol
.flags
& BSF_FUNCTION
))
1597 /* And only if they specify the locations of their arguments. */
1598 if (symbol
->tc_data
.hppa_arg_reloc
== 0)
1601 /* Yup. This function symbol needs an entry. */
1602 symext_chain_size
+= 2 * ELF32_PARISC_SX_SIZE
;
1605 else if (info
->relocateable
== true)
1607 struct elf32_hppa_args_hash_table
*table
;
1608 table
= elf32_hppa_hash_table (info
)->args_hash_table
;
1610 /* Determine the size of the symbol extension section. */
1611 elf32_hppa_args_hash_traverse (table
,
1612 elf32_hppa_size_symext
,
1613 &symext_chain_size
);
1616 /* Now create the section and set its size. We'll fill in the
1618 symextn_sec
= bfd_get_section_by_name (abfd
, SYMEXTN_SECTION_NAME
);
1619 if (symextn_sec
== NULL
)
1620 symextn_sec
= bfd_make_section (abfd
, SYMEXTN_SECTION_NAME
);
1622 bfd_set_section_flags (abfd
, symextn_sec
,
1623 SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_DATA
);
1624 symextn_sec
->output_section
= symextn_sec
;
1625 symextn_sec
->output_offset
= 0;
1626 bfd_set_section_alignment (abfd
, symextn_sec
, 2);
1627 bfd_set_section_size (abfd
, symextn_sec
, symext_chain_size
);
1630 /* Called for each entry in the args location hash table. For each
1631 entry we bump the size pointer by 2 records (16 bytes). */
1634 elf32_hppa_size_symext (gen_entry
, in_args
)
1635 struct bfd_hash_entry
*gen_entry
;
1638 bfd_size_type
*sizep
= (bfd_size_type
*)in_args
;
1640 *sizep
+= 2 * ELF32_PARISC_SX_SIZE
;
1644 /* Backend routine called by the linker for each output symbol.
1646 For PA ELF we use this opportunity to add an appropriate entry
1647 to the symbol extension chain for function symbols. */
1650 elf32_hppa_link_output_symbol_hook (abfd
, info
, name
, sym
, section
)
1652 struct bfd_link_info
*info
;
1654 Elf_Internal_Sym
*sym
;
1658 unsigned int len
, index
;
1659 struct elf32_hppa_args_hash_table
*args_hash_table
;
1660 struct elf32_hppa_args_hash_entry
*args_hash
;
1662 /* If the args hash table is NULL, then we've encountered an error
1663 of some sorts (for example, an undefined symbol). In that case
1664 we've got nothing else to do.
1666 NOTE: elf_link_output_symbol will abort if we return false here! */
1667 if (elf32_hppa_hash_table (info
)->args_hash_table
== NULL
)
1670 index
= elf32_hppa_hash_table (info
)->output_symbol_count
++;
1672 /* We need to look up this symbol in the args hash table to see if
1673 it has argument relocation bits. */
1674 if (ELF_ST_TYPE (sym
->st_info
) != STT_FUNC
)
1677 /* We know it's a function symbol of some kind. */
1678 len
= strlen (name
) + 1;
1679 if (ELF_ST_BIND (sym
->st_info
) == STB_LOCAL
)
1682 new_name
= bfd_malloc (len
);
1683 if (new_name
== NULL
)
1686 strcpy (new_name
, name
);
1687 if (ELF_ST_BIND (sym
->st_info
) == STB_LOCAL
)
1688 sprintf (new_name
+ len
- 10, "_%08x", (int)section
);
1690 /* Now that we have the unique name, we can look it up in the
1692 args_hash_table
= elf32_hppa_hash_table (info
)->args_hash_table
;
1693 args_hash
= elf32_hppa_args_hash_lookup (args_hash_table
, new_name
,
1696 if (args_hash
== NULL
)
1699 /* We know this symbol has arg reloc bits. */
1700 add_entry_to_symext_chain (abfd
, args_hash
->arg_bits
,
1701 index
, &symext_rootP
, &symext_lastP
);
1705 /* Perform any processing needed late in the object file writing process.
1706 For PA ELF we build and set the contents of the symbol extension
1710 elf32_hppa_backend_final_write_processing (abfd
, linker
)
1714 asection
*symextn_sec
;
1717 /* Now build the symbol extension section. */
1718 if (symext_chain_size
== 0)
1723 /* We were not called from the backend linker, so we still need
1724 to build the symbol extension chain.
1726 Look at each symbol, adding the appropriate information to the
1727 symbol extension section list as necessary. */
1728 for (i
= 0; i
< abfd
->symcount
; i
++)
1730 elf_symbol_type
*symbol
= (elf_symbol_type
*) abfd
->outsymbols
[i
];
1732 /* Only functions ever need an entry in the symbol extension
1734 if (!(symbol
->symbol
.flags
& BSF_FUNCTION
))
1737 /* And only if they specify the locations of their arguments. */
1738 if (symbol
->tc_data
.hppa_arg_reloc
== 0)
1741 /* Add this symbol's information to the chain. */
1742 add_entry_to_symext_chain (abfd
, symbol
->tc_data
.hppa_arg_reloc
,
1743 symbol
->symbol
.udata
.i
, &symext_rootP
,
1748 /* Now fill in the contents of the symbol extension section. */
1749 elf_hppa_tc_make_sections (abfd
, symext_rootP
);
1751 /* And attach that as the section's contents. */
1752 symextn_sec
= bfd_get_section_by_name (abfd
, SYMEXTN_SECTION_NAME
);
1753 if (symextn_sec
== (asection
*) 0)
1756 symextn_sec
->contents
= (void *)symextn_contents
;
1758 bfd_set_section_contents (abfd
, symextn_sec
, symextn_sec
->contents
,
1759 symextn_sec
->output_offset
, symextn_sec
->_raw_size
);
1762 /* Update the symbol extention chain to include the symbol pointed to
1763 by SYMBOLP if SYMBOLP is a function symbol. Used internally and by GAS. */
1766 add_entry_to_symext_chain (abfd
, arg_reloc
, sym_idx
, symext_root
, symext_last
)
1768 unsigned int arg_reloc
;
1769 unsigned int sym_idx
;
1770 symext_chainS
**symext_root
;
1771 symext_chainS
**symext_last
;
1773 symext_chainS
*symextP
;
1775 /* Allocate memory and initialize this entry. */
1776 symextP
= (symext_chainS
*) bfd_alloc (abfd
, sizeof (symext_chainS
) * 2);
1778 abort(); /* FIXME */
1780 symextP
[0].entry
= ELF32_PARISC_SX_WORD (PARISC_SXT_SYMNDX
, sym_idx
);
1781 symextP
[0].next
= &symextP
[1];
1783 symextP
[1].entry
= ELF32_PARISC_SX_WORD (PARISC_SXT_ARG_RELOC
, arg_reloc
);
1784 symextP
[1].next
= NULL
;
1786 /* Now update the chain itself so it can be walked later to build
1787 the symbol extension section. */
1788 if (*symext_root
== NULL
)
1790 *symext_root
= &symextP
[0];
1791 *symext_last
= &symextP
[1];
1795 (*symext_last
)->next
= &symextP
[0];
1796 *symext_last
= &symextP
[1];
1800 /* Build the symbol extension section. */
1803 elf_hppa_tc_make_sections (abfd
, symext_root
)
1805 symext_chainS
*symext_root
;
1807 symext_chainS
*symextP
;
1809 asection
*symextn_sec
;
1811 symextn_sec
= bfd_get_section_by_name (abfd
, SYMEXTN_SECTION_NAME
);
1813 /* Grab some memory for the contents of the symbol extension section
1815 symextn_contents
= (bfd_byte
*) bfd_zalloc (abfd
,
1816 symextn_sec
->_raw_size
);
1817 if (!symextn_contents
)
1818 abort(); /* FIXME */
1820 /* Fill in the contents of the symbol extension chain. */
1821 for (i
= 0, symextP
= symext_root
; symextP
; symextP
= symextP
->next
, ++i
)
1822 ELF32_PARISC_SX_PUT (abfd
, (bfd_vma
) symextP
->entry
,
1823 symextn_contents
+ i
* ELF32_PARISC_SX_SIZE
);
1828 /* Do some PA ELF specific work after reading in the symbol table.
1829 In particular attach the argument relocation from the
1830 symbol extension section to the appropriate symbols. */
1833 elf32_hppa_backend_symbol_table_processing (abfd
, esyms
,symcnt
)
1835 elf_symbol_type
*esyms
;
1836 unsigned int symcnt
;
1838 Elf32_Internal_Shdr
*symextn_hdr
=
1839 bfd_elf_find_section (abfd
, SYMEXTN_SECTION_NAME
);
1840 unsigned int i
, current_sym_idx
= 0;
1842 /* If no symbol extension existed, then all symbol extension information
1843 is assumed to be zero. */
1844 if (symextn_hdr
== NULL
)
1846 for (i
= 0; i
< symcnt
; i
++)
1847 esyms
[i
].tc_data
.hppa_arg_reloc
= 0;
1851 /* FIXME: Why not use bfd_get_section_contents here? Also should give
1852 memory back when we're done. */
1853 /* Allocate a buffer of the appropriate size for the symextn section. */
1854 symextn_hdr
->contents
= bfd_zalloc(abfd
,symextn_hdr
->sh_size
);
1855 if (!symextn_hdr
->contents
)
1858 /* Read in the symextn section. */
1859 if (bfd_seek (abfd
, symextn_hdr
->sh_offset
, SEEK_SET
) == -1)
1861 if (bfd_read ((PTR
) symextn_hdr
->contents
, 1, symextn_hdr
->sh_size
, abfd
)
1862 != symextn_hdr
->sh_size
)
1865 /* Parse entries in the symbol extension section, updating the symtab
1867 for (i
= 0; i
< symextn_hdr
->sh_size
/ ELF32_PARISC_SX_SIZE
; i
++)
1870 ELF32_PARISC_SX_GET (abfd
,
1871 ((unsigned char *)symextn_hdr
->contents
1872 + i
* ELF32_PARISC_SX_SIZE
));
1873 unsigned int se_value
= ELF32_PARISC_SX_VAL (se
);
1874 unsigned int se_type
= ELF32_PARISC_SX_TYPE (se
);
1878 case PARISC_SXT_NULL
:
1881 case PARISC_SXT_SYMNDX
:
1882 if (se_value
>= symcnt
)
1884 bfd_set_error (bfd_error_bad_value
);
1887 current_sym_idx
= se_value
- 1;
1890 case PARISC_SXT_ARG_RELOC
:
1891 esyms
[current_sym_idx
].tc_data
.hppa_arg_reloc
= se_value
;
1895 bfd_set_error (bfd_error_bad_value
);
1902 /* Read and attach the symbol extension information for the symbols
1903 in INPUT_BFD to the argument location hash table. Handle locals
1904 if DO_LOCALS is true; likewise for globals when DO_GLOBALS is true. */
1907 elf32_hppa_read_symext_info (input_bfd
, symtab_hdr
, args_hash_table
, local_syms
)
1909 Elf_Internal_Shdr
*symtab_hdr
;
1910 struct elf32_hppa_args_hash_table
*args_hash_table
;
1911 Elf_Internal_Sym
*local_syms
;
1913 asection
*symextn_sec
;
1915 unsigned int i
, n_entries
, current_index
= 0;
1917 /* Get the symbol extension section for this BFD. If no section exists
1918 then there's nothing to do. Likewise if the section exists, but
1920 symextn_sec
= bfd_get_section_by_name (input_bfd
, SYMEXTN_SECTION_NAME
);
1921 if (symextn_sec
== NULL
)
1924 /* Done separately so we can turn off SEC_HAS_CONTENTS (see below). */
1925 if (symextn_sec
->_raw_size
== 0)
1927 symextn_sec
->flags
&= ~SEC_HAS_CONTENTS
;
1931 contents
= (bfd_byte
*) bfd_malloc ((size_t) symextn_sec
->_raw_size
);
1932 if (contents
== NULL
)
1935 /* How gross. We turn off SEC_HAS_CONTENTS for the input symbol extension
1936 sections to keep the generic ELF/BFD code from trying to do anything
1937 with them. We have to undo that hack temporarily so that we can read
1938 in the contents with the generic code. */
1939 symextn_sec
->flags
|= SEC_HAS_CONTENTS
;
1940 if (bfd_get_section_contents (input_bfd
, symextn_sec
, contents
,
1941 0, symextn_sec
->_raw_size
) == false)
1943 symextn_sec
->flags
&= ~SEC_HAS_CONTENTS
;
1948 /* Gross. Turn off SEC_HAS_CONTENTS for the input symbol extension
1949 sections (see above). */
1950 symextn_sec
->flags
&= ~SEC_HAS_CONTENTS
;
1952 n_entries
= symextn_sec
->_raw_size
/ ELF32_PARISC_SX_SIZE
;
1953 for (i
= 0; i
< n_entries
; i
++)
1955 symext_entryS entry
=
1956 ELF32_PARISC_SX_GET (input_bfd
, contents
+ i
* ELF32_PARISC_SX_SIZE
);
1957 unsigned int value
= ELF32_PARISC_SX_VAL (entry
);
1958 unsigned int type
= ELF32_PARISC_SX_TYPE (entry
);
1959 struct elf32_hppa_args_hash_entry
*args_hash
;
1963 case PARISC_SXT_NULL
:
1966 case PARISC_SXT_SYMNDX
:
1967 if (value
>= symtab_hdr
->sh_size
/ sizeof (Elf32_External_Sym
))
1969 bfd_set_error (bfd_error_bad_value
);
1973 current_index
= value
;
1976 case PARISC_SXT_ARG_RELOC
:
1977 if (current_index
< symtab_hdr
->sh_info
)
1979 Elf_Internal_Shdr
*hdr
;
1981 const char *sym_name
;
1985 hdr
= elf_elfsections (input_bfd
)[local_syms
[current_index
].st_shndx
];
1986 sym_sec
= hdr
->bfd_section
;
1987 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
1988 symtab_hdr
->sh_link
,
1989 local_syms
[current_index
].st_name
);
1990 len
= strlen (sym_name
) + 10;
1991 new_name
= bfd_malloc (len
);
1992 if (new_name
== NULL
)
1997 strcpy (new_name
, sym_name
);
1998 sprintf (new_name
+ len
- 10, "_%08x", (int)sym_sec
);
2000 /* This is a global symbol with argument location info.
2001 We need to enter it into the hash table. */
2002 args_hash
= elf32_hppa_args_hash_lookup (args_hash_table
,
2006 if (args_hash
== NULL
)
2011 args_hash
->arg_bits
= value
;
2014 else if (current_index
>= symtab_hdr
->sh_info
)
2016 struct elf_link_hash_entry
*h
;
2018 current_index
-= symtab_hdr
->sh_info
;
2019 h
= elf_sym_hashes(input_bfd
)[current_index
];
2020 /* This is a global symbol with argument location
2021 information. We need to enter it into the hash table. */
2022 args_hash
= elf32_hppa_args_hash_lookup (args_hash_table
,
2023 h
->root
.root
.string
,
2025 if (args_hash
== NULL
)
2027 bfd_set_error (bfd_error_bad_value
);
2031 args_hash
->arg_bits
= value
;
2038 bfd_set_error (bfd_error_bad_value
);
2047 /* Undo the generic ELF code's subtraction of section->vma from the
2048 value of each external symbol. */
2051 elf32_hppa_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
2053 struct bfd_link_info
*info
;
2054 const Elf_Internal_Sym
*sym
;
2060 *valp
+= (*secp
)->vma
;
2064 /* Determine the name of the stub needed to perform a call assuming the
2065 argument relocation bits for caller and callee are in CALLER and CALLEE
2066 for a call from LOCATION to DESTINATION. Copy the name into STUB_NAME. */
2069 elf32_hppa_name_of_stub (caller
, callee
, location
, destination
, stub_name
)
2070 unsigned int caller
, callee
;
2071 bfd_vma location
, destination
;
2074 arg_reloc_type arg_reloc_types
[5];
2076 if (elf32_hppa_arg_reloc_needed (caller
, callee
, arg_reloc_types
))
2078 arg_reloc_location i
;
2079 /* Fill in the basic template. */
2080 strcpy (stub_name
, "__XX_XX_XX_XX_XX_stub_");
2082 /* Now fix the specifics. */
2083 for (i
= ARG0
; i
<= RET
; i
++)
2084 switch (arg_reloc_types
[i
])
2087 stub_name
[3 * i
+ 2] = 'N';
2088 stub_name
[3 * i
+ 3] = 'O';
2091 stub_name
[3 * i
+ 2] = 'G';
2092 stub_name
[3 * i
+ 3] = 'F';
2095 stub_name
[3 * i
+ 2] = 'F';
2096 stub_name
[3 * i
+ 3] = 'G';
2099 stub_name
[3 * i
+ 2] = 'G';
2100 stub_name
[3 * i
+ 3] = 'D';
2103 stub_name
[3 * i
+ 2] = 'D';
2104 stub_name
[3 * i
+ 3] = 'G';
2109 strcpy (stub_name
, "_____long_branch_stub_");
2112 /* Determine if an argument relocation stub is needed to perform a
2113 call assuming the argument relocation bits for caller and callee
2114 are in CALLER and CALLEE. Place the type of relocations (if any)
2115 into stub_types_p. */
2118 elf32_hppa_arg_reloc_needed (caller
, callee
, stub_types
)
2119 unsigned int caller
, callee
;
2120 arg_reloc_type stub_types
[5];
2122 /* Special case for no relocations. */
2123 if (caller
== 0 || callee
== 0)
2127 arg_location caller_loc
[5];
2128 arg_location callee_loc
[5];
2130 /* Extract the location information for the argument and return
2131 value on both the caller and callee sides. */
2132 caller_loc
[ARG0
] = EXTRACT_ARBITS (caller
, ARG0
);
2133 callee_loc
[ARG0
] = EXTRACT_ARBITS (callee
, ARG0
);
2134 caller_loc
[ARG1
] = EXTRACT_ARBITS (caller
, ARG1
);
2135 callee_loc
[ARG1
] = EXTRACT_ARBITS (callee
, ARG1
);
2136 caller_loc
[ARG2
] = EXTRACT_ARBITS (caller
, ARG2
);
2137 callee_loc
[ARG2
] = EXTRACT_ARBITS (callee
, ARG2
);
2138 caller_loc
[ARG3
] = EXTRACT_ARBITS (caller
, ARG3
);
2139 callee_loc
[ARG3
] = EXTRACT_ARBITS (callee
, ARG3
);
2140 caller_loc
[RET
] = EXTRACT_ARBITS (caller
, RET
);
2141 callee_loc
[RET
] = EXTRACT_ARBITS (callee
, RET
);
2143 /* Check some special combinations. This is necessary to
2144 deal with double precision FP arguments. */
2145 if (caller_loc
[ARG0
] == AR_FU
|| caller_loc
[ARG1
] == AR_FU
)
2147 caller_loc
[ARG0
] = AR_FPDBL1
;
2148 caller_loc
[ARG1
] = AR_NO
;
2150 if (caller_loc
[ARG2
] == AR_FU
|| caller_loc
[ARG3
] == AR_FU
)
2152 caller_loc
[ARG2
] = AR_FPDBL2
;
2153 caller_loc
[ARG3
] = AR_NO
;
2155 if (callee_loc
[ARG0
] == AR_FU
|| callee_loc
[ARG1
] == AR_FU
)
2157 callee_loc
[ARG0
] = AR_FPDBL1
;
2158 callee_loc
[ARG1
] = AR_NO
;
2160 if (callee_loc
[ARG2
] == AR_FU
|| callee_loc
[ARG3
] == AR_FU
)
2162 callee_loc
[ARG2
] = AR_FPDBL2
;
2163 callee_loc
[ARG3
] = AR_NO
;
2166 /* Now look up any relocation needed for each argument and the
2168 stub_types
[ARG0
] = arg_mismatches
[caller_loc
[ARG0
]][callee_loc
[ARG0
]];
2169 stub_types
[ARG1
] = arg_mismatches
[caller_loc
[ARG1
]][callee_loc
[ARG1
]];
2170 stub_types
[ARG2
] = arg_mismatches
[caller_loc
[ARG2
]][callee_loc
[ARG2
]];
2171 stub_types
[ARG3
] = arg_mismatches
[caller_loc
[ARG3
]][callee_loc
[ARG3
]];
2172 stub_types
[RET
] = ret_mismatches
[caller_loc
[RET
]][callee_loc
[RET
]];
2174 return (stub_types
[ARG0
] != NO
2175 || stub_types
[ARG1
] != NO
2176 || stub_types
[ARG2
] != NO
2177 || stub_types
[ARG3
] != NO
2178 || stub_types
[RET
] != NO
);
2182 /* Compute the size of the stub needed to call from LOCATION to DESTINATION
2183 (a function named SYM_NAME), with argument relocation bits CALLER and
2184 CALLEE. Return zero if no stub is needed to perform such a call. */
2187 elf32_hppa_size_of_stub (callee
, caller
, location
, destination
, sym_name
)
2188 unsigned int callee
, caller
;
2189 bfd_vma location
, destination
;
2190 const char *sym_name
;
2192 arg_reloc_type arg_reloc_types
[5];
2194 /* Determine if a long branch or argument relocation stub is needed.
2195 If an argument relocation stub is needed, the relocation will be
2196 stored into arg_reloc_types. */
2197 if (!(((int)(location
- destination
) > 0x3ffff)
2198 || ((int)(location
- destination
) < (int)0xfffc0000)
2199 || elf32_hppa_arg_reloc_needed (caller
, callee
, arg_reloc_types
)))
2202 /* Some kind of stub is needed. Determine how big it needs to be.
2203 First check for argument relocation stubs as they also handle
2204 long calls. Then check for long calls to millicode and finally
2205 the normal long calls. */
2206 if (arg_reloc_types
[ARG0
] != NO
2207 || arg_reloc_types
[ARG1
] != NO
2208 || arg_reloc_types
[ARG2
] != NO
2209 || arg_reloc_types
[ARG3
] != NO
2210 || arg_reloc_types
[RET
] != NO
)
2212 /* Some kind of argument relocation stub is needed. */
2213 unsigned int len
= 16;
2214 arg_reloc_location i
;
2216 /* Each GR or FG relocation takes 2 insns, each GD or DG
2217 relocation takes 3 insns. Plus 4 more insns for the
2218 RP adjustment, ldil & (be | ble) and copy. */
2219 for (i
= ARG0
; i
<= RET
; i
++)
2220 switch (arg_reloc_types
[i
])
2236 /* Extra instructions are needed if we're relocating a return value. */
2237 if (arg_reloc_types
[RET
] != NO
)
2242 else if (!strncmp ("$$", sym_name
, 2)
2243 && strcmp ("$$dyncall", sym_name
))
2249 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
2250 IN_ARGS contains the stub BFD and link info pointers. */
2253 elf32_hppa_build_one_stub (gen_entry
, in_args
)
2254 struct bfd_hash_entry
*gen_entry
;
2257 void **args
= (void **)in_args
;
2258 bfd
*stub_bfd
= (bfd
*)args
[0];
2259 struct bfd_link_info
*info
= (struct bfd_link_info
*)args
[1];
2260 struct elf32_hppa_stub_hash_entry
*entry
;
2261 struct elf32_hppa_stub_hash_table
*stub_hash_table
;
2264 const char *sym_name
;
2266 /* Initialize pointers to the stub hash table, the particular entry we
2267 are building a stub for, and where (in memory) we should place the stub
2269 entry
= (struct elf32_hppa_stub_hash_entry
*)gen_entry
;
2270 stub_hash_table
= elf32_hppa_hash_table(info
)->stub_hash_table
;
2271 loc
= stub_hash_table
->location
;
2273 /* Make a note of the offset within the stubs for this entry. */
2274 entry
->offset
= stub_hash_table
->offset
;
2276 /* The symbol's name starts at offset 22. */
2277 sym_name
= entry
->root
.string
+ 22;
2279 sym_value
= (entry
->target_value
2280 + entry
->target_section
->output_offset
2281 + entry
->target_section
->output_section
->vma
);
2283 if (strncmp ("_____long_branch_stub_", entry
->root
.string
, 22))
2285 /* This must be an argument or return value relocation stub. */
2287 arg_reloc_location i
;
2288 bfd_byte
*begin_loc
= loc
;
2290 /* First the return pointer adjustment. Depending on exact calling
2291 sequence this instruction may be skipped. */
2292 bfd_put_32 (stub_bfd
, LDO_M4_R31_R31
, loc
);
2295 /* If we are relocating a return value, then we're going to have
2296 to return into the stub. So we have to save off the user's
2297 return pointer into the stack at RP'. */
2298 if (strncmp (entry
->root
.string
+ 14, "NO", 2))
2300 bfd_put_32 (stub_bfd
, STW_R31_M8R30
, loc
);
2304 /* Iterate over the argument relocations, emitting instructions
2305 to move them around as necessary. */
2306 for (i
= ARG0
; i
<= ARG3
; i
++)
2308 if (!strncmp (entry
->root
.string
+ 3 * i
+ 2, "GF", 2))
2310 bfd_put_32 (stub_bfd
, STW_ARG_M16R30
| ((26 - i
) << 16), loc
);
2311 bfd_put_32 (stub_bfd
, FLDW_M16R30_FARG
| (4 + i
), loc
+ 4);
2314 else if (!strncmp (entry
->root
.string
+ 3 * i
+ 2, "FG", 2))
2316 bfd_put_32 (stub_bfd
, FSTW_FARG_M16R30
| (4 + i
), loc
);
2317 bfd_put_32 (stub_bfd
, LDW_M16R30_ARG
| ((26 - i
) << 16), loc
+ 4);
2320 else if (!strncmp (entry
->root
.string
+ 3 * i
+ 2, "GD", 2))
2322 bfd_put_32 (stub_bfd
, STW_ARG_M12R30
| ((26 - i
) << 16), loc
);
2323 bfd_put_32 (stub_bfd
, STW_ARG_M16R30
| ((25 - i
) << 16), loc
+ 4);
2324 bfd_put_32 (stub_bfd
, FLDD_M16R30_FARG
| (5 + i
), loc
+ 8);
2327 else if (!strncmp (entry
->root
.string
+ 3 * i
+ 2, "DG", 2))
2329 bfd_put_32 (stub_bfd
, FSTD_FARG_M16R30
| (5 + i
), loc
);
2330 bfd_put_32 (stub_bfd
, LDW_M12R30_ARG
| ((26 - i
) << 16), loc
+ 4);
2331 bfd_put_32 (stub_bfd
, LDW_M16R30_ARG
| ((25 - i
) << 16), loc
+ 8);
2336 /* Load the high bits of the target address into %r1. */
2337 insn
= hppa_rebuild_insn (stub_bfd
, LDIL_R1
,
2338 hppa_field_adjust (sym_value
, 0, e_lrsel
), 21);
2339 bfd_put_32 (stub_bfd
, insn
, loc
);
2342 /* If we are relocating a return value, then we're going to have
2343 to return into the stub, then perform the return value relocation. */
2344 if (strncmp (entry
->root
.string
+ 14, "NO", 2))
2346 /* To return to the stub we "ble" to the target and copy the return
2347 pointer from %r31 into %r2. */
2348 insn
= hppa_rebuild_insn (stub_bfd
,
2350 hppa_field_adjust (sym_value
, 0,
2353 bfd_put_32 (stub_bfd
, insn
, loc
);
2354 bfd_put_32 (stub_bfd
, COPY_R31_R2
, loc
+ 4);
2356 /* Reload the return pointer for our caller from the stack. */
2357 bfd_put_32 (stub_bfd
, LDW_M8R30_R31
, loc
+ 8);
2360 /* Perform the return value relocation. */
2361 if (!strncmp (entry
->root
.string
+ 14, "GF", 2))
2363 bfd_put_32 (stub_bfd
, STW_ARG_M16R30
| (28 << 16), loc
);
2364 bfd_put_32 (stub_bfd
, FLDW_M16R30_FARG
| 4, loc
+ 4);
2367 else if (!strncmp (entry
->root
.string
+ 14, "FG", 2))
2369 bfd_put_32 (stub_bfd
, FSTW_FARG_M16R30
| 4, loc
);
2370 bfd_put_32 (stub_bfd
, LDW_M16R30_ARG
| (28 << 16), loc
+ 4);
2373 else if (!strncmp (entry
->root
.string
+ 2, "GD", 2))
2375 bfd_put_32 (stub_bfd
, STW_ARG_M12R30
| (28 << 16), loc
);
2376 bfd_put_32 (stub_bfd
, STW_ARG_M16R30
| (29 << 16), loc
+ 4);
2377 bfd_put_32 (stub_bfd
, FLDD_M16R30_FARG
| 4, loc
+ 8);
2380 else if (!strncmp (entry
->root
.string
+ 2, "DG", 2))
2382 bfd_put_32 (stub_bfd
, FSTD_FARG_M16R30
| 4, loc
);
2383 bfd_put_32 (stub_bfd
, LDW_M12R30_ARG
| (28 << 16), loc
+ 4);
2384 bfd_put_32 (stub_bfd
, LDW_M16R30_ARG
| (29 << 16), loc
+ 8);
2387 /* Branch back to the user's code now. */
2388 bfd_put_32 (stub_bfd
, BV_N_0_R31
, loc
);
2393 /* No return value relocation, so we can simply "be" to the
2394 target and copy out return pointer into %r2. */
2395 insn
= hppa_rebuild_insn (stub_bfd
, BE_SR4_R1
,
2396 hppa_field_adjust (sym_value
, 0,
2398 bfd_put_32 (stub_bfd
, insn
, loc
);
2399 bfd_put_32 (stub_bfd
, COPY_R31_R2
, loc
+ 4);
2403 /* Update the location and offsets. */
2404 stub_hash_table
->location
+= (loc
- begin_loc
);
2405 stub_hash_table
->offset
+= (loc
- begin_loc
);
2409 /* Create one of two variant long branch stubs. One for $$dyncall and
2410 normal calls, the other for calls to millicode. */
2412 int millicode_call
= 0;
2414 if (!strncmp ("$$", sym_name
, 2) && strcmp ("$$dyncall", sym_name
))
2417 /* First the return pointer adjustment. Depending on exact calling
2418 sequence this instruction may be skipped. */
2419 bfd_put_32 (stub_bfd
, LDO_M4_R31_R31
, loc
);
2421 /* The next two instructions are the long branch itself. A long branch
2422 is formed with "ldil" loading the upper bits of the target address
2423 into a register, then branching with "be" which adds in the lower bits.
2424 Long branches to millicode nullify the delay slot of the "be". */
2425 insn
= hppa_rebuild_insn (stub_bfd
, LDIL_R1
,
2426 hppa_field_adjust (sym_value
, 0, e_lrsel
), 21);
2427 bfd_put_32 (stub_bfd
, insn
, loc
+ 4);
2428 insn
= hppa_rebuild_insn (stub_bfd
, BE_SR4_R1
| (millicode_call
? 2 : 0),
2429 hppa_field_adjust (sym_value
, 0, e_rrsel
) >> 2,
2431 bfd_put_32 (stub_bfd
, insn
, loc
+ 8);
2433 if (!millicode_call
)
2435 /* The sequence to call this stub places the return pointer into %r31,
2436 the final target expects the return pointer in %r2, so copy the
2437 return pointer into the proper register. */
2438 bfd_put_32 (stub_bfd
, COPY_R31_R2
, loc
+ 12);
2440 /* Update the location and offsets. */
2441 stub_hash_table
->location
+= 16;
2442 stub_hash_table
->offset
+= 16;
2446 /* Update the location and offsets. */
2447 stub_hash_table
->location
+= 12;
2448 stub_hash_table
->offset
+= 12;
2455 /* External entry points for sizing and building linker stubs. */
2457 /* Build all the stubs associated with the current output file. The
2458 stubs are kept in a hash table attached to the main linker hash
2459 table. This is called via hppaelf_finish in the linker. */
2462 elf32_hppa_build_stubs (stub_bfd
, info
)
2464 struct bfd_link_info
*info
;
2466 /* The stub BFD only has one section. */
2467 asection
*stub_sec
= stub_bfd
->sections
;
2468 struct elf32_hppa_stub_hash_table
*table
;
2472 /* So we can pass both the BFD for the stubs and the link info
2473 structure to the routine which actually builds stubs. */
2477 /* Allocate memory to hold the linker stubs. */
2478 size
= bfd_section_size (stub_bfd
, stub_sec
);
2479 stub_sec
->contents
= (unsigned char *) bfd_zalloc (stub_bfd
, size
);
2480 if (stub_sec
->contents
== NULL
)
2482 table
= elf32_hppa_hash_table(info
)->stub_hash_table
;
2483 table
->location
= stub_sec
->contents
;
2485 /* Build the stubs as directed by the stub hash table. */
2486 elf32_hppa_stub_hash_traverse (table
, elf32_hppa_build_one_stub
, args
);
2491 /* Determine and set the size of the stub section for a final link.
2493 The basic idea here is to examine all the relocations looking for
2494 PC-relative calls to a target that is unreachable with a "bl"
2495 instruction or calls where the caller and callee disagree on the
2496 location of their arguments or return value. */
2499 elf32_hppa_size_stubs (stub_bfd
, output_bfd
, link_info
)
2502 struct bfd_link_info
*link_info
;
2505 asection
*section
, *stub_sec
= 0;
2506 Elf_Internal_Shdr
*symtab_hdr
;
2507 Elf_Internal_Sym
*local_syms
, *isym
, **all_local_syms
;
2508 Elf32_External_Sym
*ext_syms
, *esym
;
2509 unsigned int i
, index
, bfd_count
= 0;
2510 struct elf32_hppa_stub_hash_table
*stub_hash_table
= 0;
2511 struct elf32_hppa_args_hash_table
*args_hash_table
= 0;
2513 /* Create and initialize the stub hash table. */
2514 stub_hash_table
= ((struct elf32_hppa_stub_hash_table
*)
2515 bfd_malloc (sizeof (struct elf32_hppa_stub_hash_table
)));
2516 if (!stub_hash_table
)
2519 if (!elf32_hppa_stub_hash_table_init (stub_hash_table
, stub_bfd
,
2520 elf32_hppa_stub_hash_newfunc
))
2523 /* Likewise for the argument location hash table. */
2524 args_hash_table
= ((struct elf32_hppa_args_hash_table
*)
2525 bfd_malloc (sizeof (struct elf32_hppa_args_hash_table
)));
2526 if (!args_hash_table
)
2529 if (!elf32_hppa_args_hash_table_init (args_hash_table
,
2530 elf32_hppa_args_hash_newfunc
))
2533 /* Attach the hash tables to the main hash table. */
2534 elf32_hppa_hash_table(link_info
)->stub_hash_table
= stub_hash_table
;
2535 elf32_hppa_hash_table(link_info
)->args_hash_table
= args_hash_table
;
2537 /* Count the number of input BFDs. */
2538 for (input_bfd
= link_info
->input_bfds
;
2540 input_bfd
= input_bfd
->link_next
)
2543 /* We want to read in symbol extension records only once. To do this
2544 we need to read in the local symbols in parallel and save them for
2545 later use; so hold pointers to the local symbols in an array. */
2547 = (Elf_Internal_Sym
**) bfd_malloc (sizeof (Elf_Internal_Sym
*)
2549 if (all_local_syms
== NULL
)
2551 memset (all_local_syms
, 0, sizeof (Elf_Internal_Sym
*) * bfd_count
);
2553 /* Walk over all the input BFDs adding entries to the args hash table
2554 for all the external functions. */
2555 for (input_bfd
= link_info
->input_bfds
, index
= 0;
2557 input_bfd
= input_bfd
->link_next
, index
++)
2559 /* We'll need the symbol table in a second. */
2560 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2561 if (symtab_hdr
->sh_info
== 0)
2564 /* We need an array of the local symbols attached to the input bfd.
2565 Unfortunately, we're going to have to read & swap them in. */
2567 = (Elf_Internal_Sym
*) bfd_malloc (symtab_hdr
->sh_info
2568 * sizeof (Elf_Internal_Sym
));
2569 if (local_syms
== NULL
)
2571 for (i
= 0; i
< bfd_count
; i
++)
2572 if (all_local_syms
[i
])
2573 free (all_local_syms
[i
]);
2574 free (all_local_syms
);
2577 all_local_syms
[index
] = local_syms
;
2580 = (Elf32_External_Sym
*) bfd_malloc (symtab_hdr
->sh_info
2581 * sizeof (Elf32_External_Sym
));
2582 if (ext_syms
== NULL
)
2584 for (i
= 0; i
< bfd_count
; i
++)
2585 if (all_local_syms
[i
])
2586 free (all_local_syms
[i
]);
2587 free (all_local_syms
);
2591 if (bfd_seek (input_bfd
, symtab_hdr
->sh_offset
, SEEK_SET
) != 0
2592 || bfd_read (ext_syms
, 1,
2593 (symtab_hdr
->sh_info
2594 * sizeof (Elf32_External_Sym
)), input_bfd
)
2595 != (symtab_hdr
->sh_info
* sizeof (Elf32_External_Sym
)))
2597 for (i
= 0; i
< bfd_count
; i
++)
2598 if (all_local_syms
[i
])
2599 free (all_local_syms
[i
]);
2600 free (all_local_syms
);
2605 /* Swap the local symbols in. */
2608 for (i
= 0; i
< symtab_hdr
->sh_info
; i
++, esym
++, isym
++)
2609 bfd_elf32_swap_symbol_in (input_bfd
, esym
, isym
);
2611 /* Now we can free the external symbols. */
2614 if (elf32_hppa_read_symext_info (input_bfd
, symtab_hdr
, args_hash_table
,
2615 local_syms
) == false)
2617 for (i
= 0; i
< bfd_count
; i
++)
2618 if (all_local_syms
[i
])
2619 free (all_local_syms
[i
]);
2620 free (all_local_syms
);
2625 /* Magic as we know the stub bfd only has one section. */
2626 stub_sec
= stub_bfd
->sections
;
2628 /* If generating a relocateable output file, then we don't
2629 have to examine the relocs. */
2630 if (link_info
->relocateable
)
2632 for (i
= 0; i
< bfd_count
; i
++)
2633 if (all_local_syms
[i
])
2634 free (all_local_syms
[i
]);
2635 free (all_local_syms
);
2639 /* Now that we have argument location information for all the global
2640 functions we can start looking for stubs. */
2641 for (input_bfd
= link_info
->input_bfds
, index
= 0;
2643 input_bfd
= input_bfd
->link_next
, index
++)
2645 /* We'll need the symbol table in a second. */
2646 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
2647 if (symtab_hdr
->sh_info
== 0)
2650 local_syms
= all_local_syms
[index
];
2652 /* Walk over each section attached to the input bfd. */
2653 for (section
= input_bfd
->sections
;
2655 section
= section
->next
)
2657 Elf_Internal_Shdr
*input_rel_hdr
;
2658 Elf32_External_Rela
*external_relocs
, *erelaend
, *erela
;
2659 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
2661 /* If there aren't any relocs, then there's nothing to do. */
2662 if ((section
->flags
& SEC_RELOC
) == 0
2663 || section
->reloc_count
== 0)
2666 /* Allocate space for the external relocations. */
2668 = ((Elf32_External_Rela
*)
2669 bfd_malloc (section
->reloc_count
2670 * sizeof (Elf32_External_Rela
)));
2671 if (external_relocs
== NULL
)
2673 for (i
= 0; i
< bfd_count
; i
++)
2674 if (all_local_syms
[i
])
2675 free (all_local_syms
[i
]);
2676 free (all_local_syms
);
2680 /* Likewise for the internal relocations. */
2682 = ((Elf_Internal_Rela
*)
2683 bfd_malloc (section
->reloc_count
* sizeof (Elf_Internal_Rela
)));
2684 if (internal_relocs
== NULL
)
2686 free (external_relocs
);
2687 for (i
= 0; i
< bfd_count
; i
++)
2688 if (all_local_syms
[i
])
2689 free (all_local_syms
[i
]);
2690 free (all_local_syms
);
2694 /* Read in the external relocs. */
2695 input_rel_hdr
= &elf_section_data (section
)->rel_hdr
;
2696 if (bfd_seek (input_bfd
, input_rel_hdr
->sh_offset
, SEEK_SET
) != 0
2697 || bfd_read (external_relocs
, 1, input_rel_hdr
->sh_size
,
2698 input_bfd
) != input_rel_hdr
->sh_size
)
2700 free (external_relocs
);
2701 free (internal_relocs
);
2702 for (i
= 0; i
< bfd_count
; i
++)
2703 if (all_local_syms
[i
])
2704 free (all_local_syms
[i
]);
2705 free (all_local_syms
);
2709 /* Swap in the relocs. */
2710 erela
= external_relocs
;
2711 erelaend
= erela
+ section
->reloc_count
;
2712 irela
= internal_relocs
;
2713 for (; erela
< erelaend
; erela
++, irela
++)
2714 bfd_elf32_swap_reloca_in (input_bfd
, erela
, irela
);
2716 /* We're done with the external relocs, free them. */
2717 free (external_relocs
);
2719 /* Now examine each relocation. */
2720 irela
= internal_relocs
;
2721 irelaend
= irela
+ section
->reloc_count
;
2722 for (; irela
< irelaend
; irela
++)
2724 long r_type
, callee_args
, caller_args
, size_of_stub
;
2725 unsigned long r_index
;
2726 struct elf_link_hash_entry
*hash
;
2727 struct elf32_hppa_stub_hash_entry
*stub_hash
;
2728 struct elf32_hppa_args_hash_entry
*args_hash
;
2729 Elf_Internal_Sym
*sym
;
2731 const char *sym_name
;
2733 bfd_vma location
, destination
;
2734 char *new_name
= NULL
;
2736 r_type
= ELF32_R_TYPE (irela
->r_info
);
2737 r_index
= ELF32_R_SYM (irela
->r_info
);
2739 if (r_type
< 0 || r_type
>= (int) R_PARISC_UNIMPLEMENTED
)
2741 bfd_set_error (bfd_error_bad_value
);
2742 free (internal_relocs
);
2743 for (i
= 0; i
< bfd_count
; i
++)
2744 if (all_local_syms
[i
])
2745 free (all_local_syms
[i
]);
2746 free (all_local_syms
);
2750 /* Only look for stubs on call instructions or plabel
2752 if (r_type
!= R_PARISC_PCREL17F
2753 && r_type
!= R_PARISC_PLABEL32
2754 && r_type
!= R_PARISC_PLABEL21L
2755 && r_type
!= R_PARISC_PLABEL14R
)
2758 /* Now determine the call target, its name, value, section
2759 and argument relocation bits. */
2763 if (r_index
< symtab_hdr
->sh_info
)
2765 /* It's a local symbol. */
2766 Elf_Internal_Shdr
*hdr
;
2768 sym
= local_syms
+ r_index
;
2769 hdr
= elf_elfsections (input_bfd
)[sym
->st_shndx
];
2770 sym_sec
= hdr
->bfd_section
;
2771 sym_name
= bfd_elf_string_from_elf_section (input_bfd
,
2772 symtab_hdr
->sh_link
,
2774 sym_value
= (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
2775 ? 0 : sym
->st_value
);
2776 destination
= (sym_value
2777 + sym_sec
->output_offset
2778 + sym_sec
->output_section
->vma
);
2780 /* Tack on an ID so we can uniquely identify this local
2781 symbol in the stub or arg info hash tables. */
2782 new_name
= bfd_malloc (strlen (sym_name
) + 10);
2785 free (internal_relocs
);
2786 for (i
= 0; i
< bfd_count
; i
++)
2787 if (all_local_syms
[i
])
2788 free (all_local_syms
[i
]);
2789 free (all_local_syms
);
2792 sprintf (new_name
, "%s_%08x", sym_name
, (int)sym_sec
);
2793 sym_name
= new_name
;
2797 /* It's an external symbol. */
2800 index
= r_index
- symtab_hdr
->sh_info
;
2801 hash
= elf_sym_hashes (input_bfd
)[index
];
2802 if (hash
->root
.type
== bfd_link_hash_defined
2803 || hash
->root
.type
== bfd_link_hash_defweak
)
2805 sym_sec
= hash
->root
.u
.def
.section
;
2806 sym_name
= hash
->root
.root
.string
;
2807 sym_value
= hash
->root
.u
.def
.value
;
2808 destination
= (sym_value
2809 + sym_sec
->output_offset
2810 + sym_sec
->output_section
->vma
);
2814 bfd_set_error (bfd_error_bad_value
);
2815 free (internal_relocs
);
2816 for (i
= 0; i
< bfd_count
; i
++)
2817 if (all_local_syms
[i
])
2818 free (all_local_syms
[i
]);
2819 free (all_local_syms
);
2824 args_hash
= elf32_hppa_args_hash_lookup (args_hash_table
,
2825 sym_name
, false, false);
2827 /* Get both caller and callee argument information. */
2828 if (args_hash
== NULL
)
2831 callee_args
= args_hash
->arg_bits
;
2833 /* For calls get the caller's bits from the addend of
2834 the call relocation. For PLABELS the caller's bits
2835 are assumed to have all args & return values in general
2836 registers (0x155). */
2837 if (r_type
== R_PARISC_PCREL17F
)
2838 caller_args
= HPPA_R_ARG_RELOC (irela
->r_addend
);
2840 caller_args
= 0x155;
2842 /* Now determine where the call point is. */
2843 location
= (section
->output_offset
2844 + section
->output_section
->vma
2847 /* We only care about the destination for PCREL function
2848 calls (eg. we don't care for PLABELS). */
2849 if (r_type
!= R_PARISC_PCREL17F
)
2850 location
= destination
;
2852 /* Determine what (if any) linker stub is needed and its
2854 size_of_stub
= elf32_hppa_size_of_stub (callee_args
,
2859 if (size_of_stub
!= 0)
2864 /* Get the name of this stub. */
2865 len
= strlen (sym_name
);
2868 stub_name
= bfd_malloc (len
);
2871 /* Because sym_name was mallocd above for local
2873 if (r_index
< symtab_hdr
->sh_info
)
2876 free (internal_relocs
);
2877 for (i
= 0; i
< bfd_count
; i
++)
2878 if (all_local_syms
[i
])
2879 free (all_local_syms
[i
]);
2880 free (all_local_syms
);
2883 elf32_hppa_name_of_stub (caller_args
, callee_args
,
2884 location
, destination
, stub_name
);
2885 strcat (stub_name
+ 22, sym_name
);
2887 /* Because sym_name was malloced above for local symbols. */
2888 if (r_index
< symtab_hdr
->sh_info
)
2892 = elf32_hppa_stub_hash_lookup (stub_hash_table
, stub_name
,
2894 if (stub_hash
!= NULL
)
2896 /* The proper stub has already been created, nothing
2902 bfd_set_section_size (stub_bfd
, stub_sec
,
2903 (bfd_section_size (stub_bfd
,
2907 /* Enter this entry into the linker stub hash table. */
2909 = elf32_hppa_stub_hash_lookup (stub_hash_table
,
2910 stub_name
, true, true);
2911 if (stub_hash
== NULL
)
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
);
2922 /* We'll need these to determine the address that the
2923 stub will branch to. */
2924 stub_hash
->target_value
= sym_value
;
2925 stub_hash
->target_section
= sym_sec
;
2930 /* We're done with the internal relocs, free them. */
2931 free (internal_relocs
);
2934 /* We're done with the local symbols, free them. */
2935 for (i
= 0; i
< bfd_count
; i
++)
2936 if (all_local_syms
[i
])
2937 free (all_local_syms
[i
]);
2938 free (all_local_syms
);
2942 /* Return gracefully, avoiding dangling references to the hash tables. */
2943 if (stub_hash_table
)
2945 elf32_hppa_hash_table(link_info
)->stub_hash_table
= NULL
;
2946 free (stub_hash_table
);
2948 if (args_hash_table
)
2950 elf32_hppa_hash_table(link_info
)->args_hash_table
= NULL
;
2951 free (args_hash_table
);
2953 /* Set the size of the stub section to zero since we're never going
2954 to create them. Avoids losing when we try to get its contents
2956 bfd_set_section_size (stub_bfd
, stub_sec
, 0);
2960 /* Misc BFD support code. */
2961 #define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
2962 #define bfd_elf32_bfd_is_local_label_name hppa_elf_is_local_label_name
2964 /* Symbol extension stuff. */
2965 #define bfd_elf32_set_section_contents elf32_hppa_set_section_contents
2966 #define elf_info_to_howto elf32_hppa_info_to_howto
2967 #define elf_backend_symbol_table_processing \
2968 elf32_hppa_backend_symbol_table_processing
2969 #define elf_backend_begin_write_processing \
2970 elf32_hppa_backend_begin_write_processing
2971 #define elf_backend_final_write_processing \
2972 elf32_hppa_backend_final_write_processing
2974 /* Stuff for the BFD linker. */
2975 #define elf_backend_relocate_section elf32_hppa_relocate_section
2976 #define elf_backend_add_symbol_hook elf32_hppa_add_symbol_hook
2977 #define elf_backend_link_output_symbol_hook \
2978 elf32_hppa_link_output_symbol_hook
2979 #define bfd_elf32_bfd_link_hash_table_create \
2980 elf32_hppa_link_hash_table_create
2982 #define TARGET_BIG_SYM bfd_elf32_hppa_vec
2983 #define TARGET_BIG_NAME "elf32-hppa"
2984 #define ELF_ARCH bfd_arch_hppa
2985 #define ELF_MACHINE_CODE EM_PARISC
2986 #define ELF_MAXPAGESIZE 0x1000
2988 #include "elf32-target.h"