sim: bfin: fix sign extension in dsp insns with MM flag
[binutils.git] / bfd / elf64-hppa.c
blobd78225b567dce34dd0d135259e9fc17adbf7530d
1 /* Support for HPPA 64-bit ELF
2 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
22 #include "alloca-conf.h"
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "elf-bfd.h"
27 #include "elf/hppa.h"
28 #include "libhppa.h"
29 #include "elf64-hppa.h"
32 #define ARCH_SIZE 64
34 #define PLT_ENTRY_SIZE 0x10
35 #define DLT_ENTRY_SIZE 0x8
36 #define OPD_ENTRY_SIZE 0x20
38 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
40 /* The stub is supposed to load the target address and target's DP
41 value out of the PLT, then do an external branch to the target
42 address.
44 LDD PLTOFF(%r27),%r1
45 BVE (%r1)
46 LDD PLTOFF+8(%r27),%r27
48 Note that we must use the LDD with a 14 bit displacement, not the one
49 with a 5 bit displacement. */
50 static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
51 0x53, 0x7b, 0x00, 0x00 };
53 struct elf64_hppa_link_hash_entry
55 struct elf_link_hash_entry eh;
57 /* Offsets for this symbol in various linker sections. */
58 bfd_vma dlt_offset;
59 bfd_vma plt_offset;
60 bfd_vma opd_offset;
61 bfd_vma stub_offset;
63 /* The index of the (possibly local) symbol in the input bfd and its
64 associated BFD. Needed so that we can have relocs against local
65 symbols in shared libraries. */
66 long sym_indx;
67 bfd *owner;
69 /* Dynamic symbols may need to have two different values. One for
70 the dynamic symbol table, one for the normal symbol table.
72 In such cases we store the symbol's real value and section
73 index here so we can restore the real value before we write
74 the normal symbol table. */
75 bfd_vma st_value;
76 int st_shndx;
78 /* Used to count non-got, non-plt relocations for delayed sizing
79 of relocation sections. */
80 struct elf64_hppa_dyn_reloc_entry
82 /* Next relocation in the chain. */
83 struct elf64_hppa_dyn_reloc_entry *next;
85 /* The type of the relocation. */
86 int type;
88 /* The input section of the relocation. */
89 asection *sec;
91 /* Number of relocs copied in this section. */
92 bfd_size_type count;
94 /* The index of the section symbol for the input section of
95 the relocation. Only needed when building shared libraries. */
96 int sec_symndx;
98 /* The offset within the input section of the relocation. */
99 bfd_vma offset;
101 /* The addend for the relocation. */
102 bfd_vma addend;
104 } *reloc_entries;
106 /* Nonzero if this symbol needs an entry in one of the linker
107 sections. */
108 unsigned want_dlt;
109 unsigned want_plt;
110 unsigned want_opd;
111 unsigned want_stub;
114 struct elf64_hppa_link_hash_table
116 struct elf_link_hash_table root;
118 /* Shortcuts to get to the various linker defined sections. */
119 asection *dlt_sec;
120 asection *dlt_rel_sec;
121 asection *plt_sec;
122 asection *plt_rel_sec;
123 asection *opd_sec;
124 asection *opd_rel_sec;
125 asection *other_rel_sec;
127 /* Offset of __gp within .plt section. When the PLT gets large we want
128 to slide __gp into the PLT section so that we can continue to use
129 single DP relative instructions to load values out of the PLT. */
130 bfd_vma gp_offset;
132 /* Note this is not strictly correct. We should create a stub section for
133 each input section with calls. The stub section should be placed before
134 the section with the call. */
135 asection *stub_sec;
137 bfd_vma text_segment_base;
138 bfd_vma data_segment_base;
140 /* We build tables to map from an input section back to its
141 symbol index. This is the BFD for which we currently have
142 a map. */
143 bfd *section_syms_bfd;
145 /* Array of symbol numbers for each input section attached to the
146 current BFD. */
147 int *section_syms;
150 #define hppa_link_hash_table(p) \
151 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
152 == HPPA64_ELF_DATA ? ((struct elf64_hppa_link_hash_table *) ((p)->hash)) : NULL)
154 #define hppa_elf_hash_entry(ent) \
155 ((struct elf64_hppa_link_hash_entry *)(ent))
157 #define eh_name(eh) \
158 (eh ? eh->root.root.string : "<undef>")
160 typedef struct bfd_hash_entry *(*new_hash_entry_func)
161 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
163 static struct bfd_link_hash_table *elf64_hppa_hash_table_create
164 (bfd *abfd);
166 /* This must follow the definitions of the various derived linker
167 hash tables and shared functions. */
168 #include "elf-hppa.h"
170 static bfd_boolean elf64_hppa_object_p
171 (bfd *);
173 static void elf64_hppa_post_process_headers
174 (bfd *, struct bfd_link_info *);
176 static bfd_boolean elf64_hppa_create_dynamic_sections
177 (bfd *, struct bfd_link_info *);
179 static bfd_boolean elf64_hppa_adjust_dynamic_symbol
180 (struct bfd_link_info *, struct elf_link_hash_entry *);
182 static bfd_boolean elf64_hppa_mark_milli_and_exported_functions
183 (struct elf_link_hash_entry *, void *);
185 static bfd_boolean elf64_hppa_size_dynamic_sections
186 (bfd *, struct bfd_link_info *);
188 static int elf64_hppa_link_output_symbol_hook
189 (struct bfd_link_info *, const char *, Elf_Internal_Sym *,
190 asection *, struct elf_link_hash_entry *);
192 static bfd_boolean elf64_hppa_finish_dynamic_symbol
193 (bfd *, struct bfd_link_info *,
194 struct elf_link_hash_entry *, Elf_Internal_Sym *);
196 static enum elf_reloc_type_class elf64_hppa_reloc_type_class
197 (const Elf_Internal_Rela *);
199 static bfd_boolean elf64_hppa_finish_dynamic_sections
200 (bfd *, struct bfd_link_info *);
202 static bfd_boolean elf64_hppa_check_relocs
203 (bfd *, struct bfd_link_info *,
204 asection *, const Elf_Internal_Rela *);
206 static bfd_boolean elf64_hppa_dynamic_symbol_p
207 (struct elf_link_hash_entry *, struct bfd_link_info *);
209 static bfd_boolean elf64_hppa_mark_exported_functions
210 (struct elf_link_hash_entry *, void *);
212 static bfd_boolean elf64_hppa_finalize_opd
213 (struct elf_link_hash_entry *, void *);
215 static bfd_boolean elf64_hppa_finalize_dlt
216 (struct elf_link_hash_entry *, void *);
218 static bfd_boolean allocate_global_data_dlt
219 (struct elf_link_hash_entry *, void *);
221 static bfd_boolean allocate_global_data_plt
222 (struct elf_link_hash_entry *, void *);
224 static bfd_boolean allocate_global_data_stub
225 (struct elf_link_hash_entry *, void *);
227 static bfd_boolean allocate_global_data_opd
228 (struct elf_link_hash_entry *, void *);
230 static bfd_boolean get_reloc_section
231 (bfd *, struct elf64_hppa_link_hash_table *, asection *);
233 static bfd_boolean count_dyn_reloc
234 (bfd *, struct elf64_hppa_link_hash_entry *,
235 int, asection *, int, bfd_vma, bfd_vma);
237 static bfd_boolean allocate_dynrel_entries
238 (struct elf_link_hash_entry *, void *);
240 static bfd_boolean elf64_hppa_finalize_dynreloc
241 (struct elf_link_hash_entry *, void *);
243 static bfd_boolean get_opd
244 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
246 static bfd_boolean get_plt
247 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
249 static bfd_boolean get_dlt
250 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
252 static bfd_boolean get_stub
253 (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
255 static int elf64_hppa_elf_get_symbol_type
256 (Elf_Internal_Sym *, int);
258 /* Initialize an entry in the link hash table. */
260 static struct bfd_hash_entry *
261 hppa64_link_hash_newfunc (struct bfd_hash_entry *entry,
262 struct bfd_hash_table *table,
263 const char *string)
265 /* Allocate the structure if it has not already been allocated by a
266 subclass. */
267 if (entry == NULL)
269 entry = bfd_hash_allocate (table,
270 sizeof (struct elf64_hppa_link_hash_entry));
271 if (entry == NULL)
272 return entry;
275 /* Call the allocation method of the superclass. */
276 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
277 if (entry != NULL)
279 struct elf64_hppa_link_hash_entry *hh;
281 /* Initialize our local data. All zeros. */
282 hh = hppa_elf_hash_entry (entry);
283 memset (&hh->dlt_offset, 0,
284 (sizeof (struct elf64_hppa_link_hash_entry)
285 - offsetof (struct elf64_hppa_link_hash_entry, dlt_offset)));
288 return entry;
291 /* Create the derived linker hash table. The PA64 ELF port uses this
292 derived hash table to keep information specific to the PA ElF
293 linker (without using static variables). */
295 static struct bfd_link_hash_table*
296 elf64_hppa_hash_table_create (bfd *abfd)
298 struct elf64_hppa_link_hash_table *htab;
299 bfd_size_type amt = sizeof (*htab);
301 htab = bfd_zalloc (abfd, amt);
302 if (htab == NULL)
303 return NULL;
305 if (!_bfd_elf_link_hash_table_init (&htab->root, abfd,
306 hppa64_link_hash_newfunc,
307 sizeof (struct elf64_hppa_link_hash_entry),
308 HPPA64_ELF_DATA))
310 bfd_release (abfd, htab);
311 return NULL;
314 htab->text_segment_base = (bfd_vma) -1;
315 htab->data_segment_base = (bfd_vma) -1;
317 return &htab->root.root;
320 /* Return nonzero if ABFD represents a PA2.0 ELF64 file.
322 Additionally we set the default architecture and machine. */
323 static bfd_boolean
324 elf64_hppa_object_p (bfd *abfd)
326 Elf_Internal_Ehdr * i_ehdrp;
327 unsigned int flags;
329 i_ehdrp = elf_elfheader (abfd);
330 if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
332 /* GCC on hppa-linux produces binaries with OSABI=Linux,
333 but the kernel produces corefiles with OSABI=SysV. */
334 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX
335 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
336 return FALSE;
338 else
340 /* HPUX produces binaries with OSABI=HPUX,
341 but the kernel produces corefiles with OSABI=SysV. */
342 if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX
343 && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
344 return FALSE;
347 flags = i_ehdrp->e_flags;
348 switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
350 case EFA_PARISC_1_0:
351 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
352 case EFA_PARISC_1_1:
353 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
354 case EFA_PARISC_2_0:
355 if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
356 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
357 else
358 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
359 case EFA_PARISC_2_0 | EF_PARISC_WIDE:
360 return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
362 /* Don't be fussy. */
363 return TRUE;
366 /* Given section type (hdr->sh_type), return a boolean indicating
367 whether or not the section is an elf64-hppa specific section. */
368 static bfd_boolean
369 elf64_hppa_section_from_shdr (bfd *abfd,
370 Elf_Internal_Shdr *hdr,
371 const char *name,
372 int shindex)
374 switch (hdr->sh_type)
376 case SHT_PARISC_EXT:
377 if (strcmp (name, ".PARISC.archext") != 0)
378 return FALSE;
379 break;
380 case SHT_PARISC_UNWIND:
381 if (strcmp (name, ".PARISC.unwind") != 0)
382 return FALSE;
383 break;
384 case SHT_PARISC_DOC:
385 case SHT_PARISC_ANNOT:
386 default:
387 return FALSE;
390 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
391 return FALSE;
393 return TRUE;
396 /* SEC is a section containing relocs for an input BFD when linking; return
397 a suitable section for holding relocs in the output BFD for a link. */
399 static bfd_boolean
400 get_reloc_section (bfd *abfd,
401 struct elf64_hppa_link_hash_table *hppa_info,
402 asection *sec)
404 const char *srel_name;
405 asection *srel;
406 bfd *dynobj;
408 srel_name = (bfd_elf_string_from_elf_section
409 (abfd, elf_elfheader(abfd)->e_shstrndx,
410 _bfd_elf_single_rel_hdr(sec)->sh_name));
411 if (srel_name == NULL)
412 return FALSE;
414 dynobj = hppa_info->root.dynobj;
415 if (!dynobj)
416 hppa_info->root.dynobj = dynobj = abfd;
418 srel = bfd_get_section_by_name (dynobj, srel_name);
419 if (srel == NULL)
421 srel = bfd_make_section_with_flags (dynobj, srel_name,
422 (SEC_ALLOC
423 | SEC_LOAD
424 | SEC_HAS_CONTENTS
425 | SEC_IN_MEMORY
426 | SEC_LINKER_CREATED
427 | SEC_READONLY));
428 if (srel == NULL
429 || !bfd_set_section_alignment (dynobj, srel, 3))
430 return FALSE;
433 hppa_info->other_rel_sec = srel;
434 return TRUE;
437 /* Add a new entry to the list of dynamic relocations against DYN_H.
439 We use this to keep a record of all the FPTR relocations against a
440 particular symbol so that we can create FPTR relocations in the
441 output file. */
443 static bfd_boolean
444 count_dyn_reloc (bfd *abfd,
445 struct elf64_hppa_link_hash_entry *hh,
446 int type,
447 asection *sec,
448 int sec_symndx,
449 bfd_vma offset,
450 bfd_vma addend)
452 struct elf64_hppa_dyn_reloc_entry *rent;
454 rent = (struct elf64_hppa_dyn_reloc_entry *)
455 bfd_alloc (abfd, (bfd_size_type) sizeof (*rent));
456 if (!rent)
457 return FALSE;
459 rent->next = hh->reloc_entries;
460 rent->type = type;
461 rent->sec = sec;
462 rent->sec_symndx = sec_symndx;
463 rent->offset = offset;
464 rent->addend = addend;
465 hh->reloc_entries = rent;
467 return TRUE;
470 /* Return a pointer to the local DLT, PLT and OPD reference counts
471 for ABFD. Returns NULL if the storage allocation fails. */
473 static bfd_signed_vma *
474 hppa64_elf_local_refcounts (bfd *abfd)
476 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
477 bfd_signed_vma *local_refcounts;
479 local_refcounts = elf_local_got_refcounts (abfd);
480 if (local_refcounts == NULL)
482 bfd_size_type size;
484 /* Allocate space for local DLT, PLT and OPD reference
485 counts. Done this way to save polluting elf_obj_tdata
486 with another target specific pointer. */
487 size = symtab_hdr->sh_info;
488 size *= 3 * sizeof (bfd_signed_vma);
489 local_refcounts = bfd_zalloc (abfd, size);
490 elf_local_got_refcounts (abfd) = local_refcounts;
492 return local_refcounts;
495 /* Scan the RELOCS and record the type of dynamic entries that each
496 referenced symbol needs. */
498 static bfd_boolean
499 elf64_hppa_check_relocs (bfd *abfd,
500 struct bfd_link_info *info,
501 asection *sec,
502 const Elf_Internal_Rela *relocs)
504 struct elf64_hppa_link_hash_table *hppa_info;
505 const Elf_Internal_Rela *relend;
506 Elf_Internal_Shdr *symtab_hdr;
507 const Elf_Internal_Rela *rel;
508 unsigned int sec_symndx;
510 if (info->relocatable)
511 return TRUE;
513 /* If this is the first dynamic object found in the link, create
514 the special sections required for dynamic linking. */
515 if (! elf_hash_table (info)->dynamic_sections_created)
517 if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
518 return FALSE;
521 hppa_info = hppa_link_hash_table (info);
522 if (hppa_info == NULL)
523 return FALSE;
524 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
526 /* If necessary, build a new table holding section symbols indices
527 for this BFD. */
529 if (info->shared && hppa_info->section_syms_bfd != abfd)
531 unsigned long i;
532 unsigned int highest_shndx;
533 Elf_Internal_Sym *local_syms = NULL;
534 Elf_Internal_Sym *isym, *isymend;
535 bfd_size_type amt;
537 /* We're done with the old cache of section index to section symbol
538 index information. Free it.
540 ?!? Note we leak the last section_syms array. Presumably we
541 could free it in one of the later routines in this file. */
542 if (hppa_info->section_syms)
543 free (hppa_info->section_syms);
545 /* Read this BFD's local symbols. */
546 if (symtab_hdr->sh_info != 0)
548 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
549 if (local_syms == NULL)
550 local_syms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
551 symtab_hdr->sh_info, 0,
552 NULL, NULL, NULL);
553 if (local_syms == NULL)
554 return FALSE;
557 /* Record the highest section index referenced by the local symbols. */
558 highest_shndx = 0;
559 isymend = local_syms + symtab_hdr->sh_info;
560 for (isym = local_syms; isym < isymend; isym++)
562 if (isym->st_shndx > highest_shndx
563 && isym->st_shndx < SHN_LORESERVE)
564 highest_shndx = isym->st_shndx;
567 /* Allocate an array to hold the section index to section symbol index
568 mapping. Bump by one since we start counting at zero. */
569 highest_shndx++;
570 amt = highest_shndx;
571 amt *= sizeof (int);
572 hppa_info->section_syms = (int *) bfd_malloc (amt);
574 /* Now walk the local symbols again. If we find a section symbol,
575 record the index of the symbol into the section_syms array. */
576 for (i = 0, isym = local_syms; isym < isymend; i++, isym++)
578 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
579 hppa_info->section_syms[isym->st_shndx] = i;
582 /* We are finished with the local symbols. */
583 if (local_syms != NULL
584 && symtab_hdr->contents != (unsigned char *) local_syms)
586 if (! info->keep_memory)
587 free (local_syms);
588 else
590 /* Cache the symbols for elf_link_input_bfd. */
591 symtab_hdr->contents = (unsigned char *) local_syms;
595 /* Record which BFD we built the section_syms mapping for. */
596 hppa_info->section_syms_bfd = abfd;
599 /* Record the symbol index for this input section. We may need it for
600 relocations when building shared libraries. When not building shared
601 libraries this value is never really used, but assign it to zero to
602 prevent out of bounds memory accesses in other routines. */
603 if (info->shared)
605 sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
607 /* If we did not find a section symbol for this section, then
608 something went terribly wrong above. */
609 if (sec_symndx == SHN_BAD)
610 return FALSE;
612 if (sec_symndx < SHN_LORESERVE)
613 sec_symndx = hppa_info->section_syms[sec_symndx];
614 else
615 sec_symndx = 0;
617 else
618 sec_symndx = 0;
620 relend = relocs + sec->reloc_count;
621 for (rel = relocs; rel < relend; ++rel)
623 enum
625 NEED_DLT = 1,
626 NEED_PLT = 2,
627 NEED_STUB = 4,
628 NEED_OPD = 8,
629 NEED_DYNREL = 16,
632 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
633 struct elf64_hppa_link_hash_entry *hh;
634 int need_entry;
635 bfd_boolean maybe_dynamic;
636 int dynrel_type = R_PARISC_NONE;
637 static reloc_howto_type *howto;
639 if (r_symndx >= symtab_hdr->sh_info)
641 /* We're dealing with a global symbol -- find its hash entry
642 and mark it as being referenced. */
643 long indx = r_symndx - symtab_hdr->sh_info;
644 hh = hppa_elf_hash_entry (elf_sym_hashes (abfd)[indx]);
645 while (hh->eh.root.type == bfd_link_hash_indirect
646 || hh->eh.root.type == bfd_link_hash_warning)
647 hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
649 hh->eh.ref_regular = 1;
651 else
652 hh = NULL;
654 /* We can only get preliminary data on whether a symbol is
655 locally or externally defined, as not all of the input files
656 have yet been processed. Do something with what we know, as
657 this may help reduce memory usage and processing time later. */
658 maybe_dynamic = FALSE;
659 if (hh && ((info->shared
660 && (!info->symbolic
661 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
662 || !hh->eh.def_regular
663 || hh->eh.root.type == bfd_link_hash_defweak))
664 maybe_dynamic = TRUE;
666 howto = elf_hppa_howto_table + ELF64_R_TYPE (rel->r_info);
667 need_entry = 0;
668 switch (howto->type)
670 /* These are simple indirect references to symbols through the
671 DLT. We need to create a DLT entry for any symbols which
672 appears in a DLTIND relocation. */
673 case R_PARISC_DLTIND21L:
674 case R_PARISC_DLTIND14R:
675 case R_PARISC_DLTIND14F:
676 case R_PARISC_DLTIND14WR:
677 case R_PARISC_DLTIND14DR:
678 need_entry = NEED_DLT;
679 break;
681 /* ?!? These need a DLT entry. But I have no idea what to do with
682 the "link time TP value. */
683 case R_PARISC_LTOFF_TP21L:
684 case R_PARISC_LTOFF_TP14R:
685 case R_PARISC_LTOFF_TP14F:
686 case R_PARISC_LTOFF_TP64:
687 case R_PARISC_LTOFF_TP14WR:
688 case R_PARISC_LTOFF_TP14DR:
689 case R_PARISC_LTOFF_TP16F:
690 case R_PARISC_LTOFF_TP16WF:
691 case R_PARISC_LTOFF_TP16DF:
692 need_entry = NEED_DLT;
693 break;
695 /* These are function calls. Depending on their precise target we
696 may need to make a stub for them. The stub uses the PLT, so we
697 need to create PLT entries for these symbols too. */
698 case R_PARISC_PCREL12F:
699 case R_PARISC_PCREL17F:
700 case R_PARISC_PCREL22F:
701 case R_PARISC_PCREL32:
702 case R_PARISC_PCREL64:
703 case R_PARISC_PCREL21L:
704 case R_PARISC_PCREL17R:
705 case R_PARISC_PCREL17C:
706 case R_PARISC_PCREL14R:
707 case R_PARISC_PCREL14F:
708 case R_PARISC_PCREL22C:
709 case R_PARISC_PCREL14WR:
710 case R_PARISC_PCREL14DR:
711 case R_PARISC_PCREL16F:
712 case R_PARISC_PCREL16WF:
713 case R_PARISC_PCREL16DF:
714 /* Function calls might need to go through the .plt, and
715 might need a long branch stub. */
716 if (hh != NULL && hh->eh.type != STT_PARISC_MILLI)
717 need_entry = (NEED_PLT | NEED_STUB);
718 else
719 need_entry = 0;
720 break;
722 case R_PARISC_PLTOFF21L:
723 case R_PARISC_PLTOFF14R:
724 case R_PARISC_PLTOFF14F:
725 case R_PARISC_PLTOFF14WR:
726 case R_PARISC_PLTOFF14DR:
727 case R_PARISC_PLTOFF16F:
728 case R_PARISC_PLTOFF16WF:
729 case R_PARISC_PLTOFF16DF:
730 need_entry = (NEED_PLT);
731 break;
733 case R_PARISC_DIR64:
734 if (info->shared || maybe_dynamic)
735 need_entry = (NEED_DYNREL);
736 dynrel_type = R_PARISC_DIR64;
737 break;
739 /* This is an indirect reference through the DLT to get the address
740 of a OPD descriptor. Thus we need to make a DLT entry that points
741 to an OPD entry. */
742 case R_PARISC_LTOFF_FPTR21L:
743 case R_PARISC_LTOFF_FPTR14R:
744 case R_PARISC_LTOFF_FPTR14WR:
745 case R_PARISC_LTOFF_FPTR14DR:
746 case R_PARISC_LTOFF_FPTR32:
747 case R_PARISC_LTOFF_FPTR64:
748 case R_PARISC_LTOFF_FPTR16F:
749 case R_PARISC_LTOFF_FPTR16WF:
750 case R_PARISC_LTOFF_FPTR16DF:
751 if (info->shared || maybe_dynamic)
752 need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
753 else
754 need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
755 dynrel_type = R_PARISC_FPTR64;
756 break;
758 /* This is a simple OPD entry. */
759 case R_PARISC_FPTR64:
760 if (info->shared || maybe_dynamic)
761 need_entry = (NEED_OPD | NEED_PLT | NEED_DYNREL);
762 else
763 need_entry = (NEED_OPD | NEED_PLT);
764 dynrel_type = R_PARISC_FPTR64;
765 break;
767 /* Add more cases as needed. */
770 if (!need_entry)
771 continue;
773 if (hh)
775 /* Stash away enough information to be able to find this symbol
776 regardless of whether or not it is local or global. */
777 hh->owner = abfd;
778 hh->sym_indx = r_symndx;
781 /* Create what's needed. */
782 if (need_entry & NEED_DLT)
784 /* Allocate space for a DLT entry, as well as a dynamic
785 relocation for this entry. */
786 if (! hppa_info->dlt_sec
787 && ! get_dlt (abfd, info, hppa_info))
788 goto err_out;
790 if (hh != NULL)
792 hh->want_dlt = 1;
793 hh->eh.got.refcount += 1;
795 else
797 bfd_signed_vma *local_dlt_refcounts;
799 /* This is a DLT entry for a local symbol. */
800 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
801 if (local_dlt_refcounts == NULL)
802 return FALSE;
803 local_dlt_refcounts[r_symndx] += 1;
807 if (need_entry & NEED_PLT)
809 if (! hppa_info->plt_sec
810 && ! get_plt (abfd, info, hppa_info))
811 goto err_out;
813 if (hh != NULL)
815 hh->want_plt = 1;
816 hh->eh.needs_plt = 1;
817 hh->eh.plt.refcount += 1;
819 else
821 bfd_signed_vma *local_dlt_refcounts;
822 bfd_signed_vma *local_plt_refcounts;
824 /* This is a PLT entry for a local symbol. */
825 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
826 if (local_dlt_refcounts == NULL)
827 return FALSE;
828 local_plt_refcounts = local_dlt_refcounts + symtab_hdr->sh_info;
829 local_plt_refcounts[r_symndx] += 1;
833 if (need_entry & NEED_STUB)
835 if (! hppa_info->stub_sec
836 && ! get_stub (abfd, info, hppa_info))
837 goto err_out;
838 if (hh)
839 hh->want_stub = 1;
842 if (need_entry & NEED_OPD)
844 if (! hppa_info->opd_sec
845 && ! get_opd (abfd, info, hppa_info))
846 goto err_out;
848 /* FPTRs are not allocated by the dynamic linker for PA64,
849 though it is possible that will change in the future. */
851 if (hh != NULL)
852 hh->want_opd = 1;
853 else
855 bfd_signed_vma *local_dlt_refcounts;
856 bfd_signed_vma *local_opd_refcounts;
858 /* This is a OPD for a local symbol. */
859 local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
860 if (local_dlt_refcounts == NULL)
861 return FALSE;
862 local_opd_refcounts = (local_dlt_refcounts
863 + 2 * symtab_hdr->sh_info);
864 local_opd_refcounts[r_symndx] += 1;
868 /* Add a new dynamic relocation to the chain of dynamic
869 relocations for this symbol. */
870 if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
872 if (! hppa_info->other_rel_sec
873 && ! get_reloc_section (abfd, hppa_info, sec))
874 goto err_out;
876 /* Count dynamic relocations against global symbols. */
877 if (hh != NULL
878 && !count_dyn_reloc (abfd, hh, dynrel_type, sec,
879 sec_symndx, rel->r_offset, rel->r_addend))
880 goto err_out;
882 /* If we are building a shared library and we just recorded
883 a dynamic R_PARISC_FPTR64 relocation, then make sure the
884 section symbol for this section ends up in the dynamic
885 symbol table. */
886 if (info->shared && dynrel_type == R_PARISC_FPTR64
887 && ! (bfd_elf_link_record_local_dynamic_symbol
888 (info, abfd, sec_symndx)))
889 return FALSE;
893 return TRUE;
895 err_out:
896 return FALSE;
899 struct elf64_hppa_allocate_data
901 struct bfd_link_info *info;
902 bfd_size_type ofs;
905 /* Should we do dynamic things to this symbol? */
907 static bfd_boolean
908 elf64_hppa_dynamic_symbol_p (struct elf_link_hash_entry *eh,
909 struct bfd_link_info *info)
911 /* ??? What, if anything, needs to happen wrt STV_PROTECTED symbols
912 and relocations that retrieve a function descriptor? Assume the
913 worst for now. */
914 if (_bfd_elf_dynamic_symbol_p (eh, info, 1))
916 /* ??? Why is this here and not elsewhere is_local_label_name. */
917 if (eh->root.root.string[0] == '$' && eh->root.root.string[1] == '$')
918 return FALSE;
920 return TRUE;
922 else
923 return FALSE;
926 /* Mark all functions exported by this file so that we can later allocate
927 entries in .opd for them. */
929 static bfd_boolean
930 elf64_hppa_mark_exported_functions (struct elf_link_hash_entry *eh, void *data)
932 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
933 struct bfd_link_info *info = (struct bfd_link_info *)data;
934 struct elf64_hppa_link_hash_table *hppa_info;
936 hppa_info = hppa_link_hash_table (info);
937 if (hppa_info == NULL)
938 return FALSE;
940 if (eh
941 && (eh->root.type == bfd_link_hash_defined
942 || eh->root.type == bfd_link_hash_defweak)
943 && eh->root.u.def.section->output_section != NULL
944 && eh->type == STT_FUNC)
946 if (! hppa_info->opd_sec
947 && ! get_opd (hppa_info->root.dynobj, info, hppa_info))
948 return FALSE;
950 hh->want_opd = 1;
952 /* Put a flag here for output_symbol_hook. */
953 hh->st_shndx = -1;
954 eh->needs_plt = 1;
957 return TRUE;
960 /* Allocate space for a DLT entry. */
962 static bfd_boolean
963 allocate_global_data_dlt (struct elf_link_hash_entry *eh, void *data)
965 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
966 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
968 if (hh->want_dlt)
970 if (x->info->shared)
972 /* Possibly add the symbol to the local dynamic symbol
973 table since we might need to create a dynamic relocation
974 against it. */
975 if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
977 bfd *owner = eh->root.u.def.section->owner;
979 if (! (bfd_elf_link_record_local_dynamic_symbol
980 (x->info, owner, hh->sym_indx)))
981 return FALSE;
985 hh->dlt_offset = x->ofs;
986 x->ofs += DLT_ENTRY_SIZE;
988 return TRUE;
991 /* Allocate space for a DLT.PLT entry. */
993 static bfd_boolean
994 allocate_global_data_plt (struct elf_link_hash_entry *eh, void *data)
996 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
997 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *) data;
999 if (hh->want_plt
1000 && elf64_hppa_dynamic_symbol_p (eh, x->info)
1001 && !((eh->root.type == bfd_link_hash_defined
1002 || eh->root.type == bfd_link_hash_defweak)
1003 && eh->root.u.def.section->output_section != NULL))
1005 hh->plt_offset = x->ofs;
1006 x->ofs += PLT_ENTRY_SIZE;
1007 if (hh->plt_offset < 0x2000)
1009 struct elf64_hppa_link_hash_table *hppa_info;
1011 hppa_info = hppa_link_hash_table (x->info);
1012 if (hppa_info == NULL)
1013 return FALSE;
1015 hppa_info->gp_offset = hh->plt_offset;
1018 else
1019 hh->want_plt = 0;
1021 return TRUE;
1024 /* Allocate space for a STUB entry. */
1026 static bfd_boolean
1027 allocate_global_data_stub (struct elf_link_hash_entry *eh, void *data)
1029 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1030 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1032 if (hh->want_stub
1033 && elf64_hppa_dynamic_symbol_p (eh, x->info)
1034 && !((eh->root.type == bfd_link_hash_defined
1035 || eh->root.type == bfd_link_hash_defweak)
1036 && eh->root.u.def.section->output_section != NULL))
1038 hh->stub_offset = x->ofs;
1039 x->ofs += sizeof (plt_stub);
1041 else
1042 hh->want_stub = 0;
1043 return TRUE;
1046 /* Allocate space for a FPTR entry. */
1048 static bfd_boolean
1049 allocate_global_data_opd (struct elf_link_hash_entry *eh, void *data)
1051 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1052 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1054 if (hh && hh->want_opd)
1056 /* We never need an opd entry for a symbol which is not
1057 defined by this output file. */
1058 if (hh && (hh->eh.root.type == bfd_link_hash_undefined
1059 || hh->eh.root.type == bfd_link_hash_undefweak
1060 || hh->eh.root.u.def.section->output_section == NULL))
1061 hh->want_opd = 0;
1063 /* If we are creating a shared library, took the address of a local
1064 function or might export this function from this object file, then
1065 we have to create an opd descriptor. */
1066 else if (x->info->shared
1067 || hh == NULL
1068 || (hh->eh.dynindx == -1 && hh->eh.type != STT_PARISC_MILLI)
1069 || (hh->eh.root.type == bfd_link_hash_defined
1070 || hh->eh.root.type == bfd_link_hash_defweak))
1072 /* If we are creating a shared library, then we will have to
1073 create a runtime relocation for the symbol to properly
1074 initialize the .opd entry. Make sure the symbol gets
1075 added to the dynamic symbol table. */
1076 if (x->info->shared
1077 && (hh == NULL || (hh->eh.dynindx == -1)))
1079 bfd *owner;
1080 /* PR 6511: Default to using the dynamic symbol table. */
1081 owner = (hh->owner ? hh->owner: eh->root.u.def.section->owner);
1083 if (!bfd_elf_link_record_local_dynamic_symbol
1084 (x->info, owner, hh->sym_indx))
1085 return FALSE;
1088 /* This may not be necessary or desirable anymore now that
1089 we have some support for dealing with section symbols
1090 in dynamic relocs. But name munging does make the result
1091 much easier to debug. ie, the EPLT reloc will reference
1092 a symbol like .foobar, instead of .text + offset. */
1093 if (x->info->shared && eh)
1095 char *new_name;
1096 struct elf_link_hash_entry *nh;
1098 new_name = alloca (strlen (eh->root.root.string) + 2);
1099 new_name[0] = '.';
1100 strcpy (new_name + 1, eh->root.root.string);
1102 nh = elf_link_hash_lookup (elf_hash_table (x->info),
1103 new_name, TRUE, TRUE, TRUE);
1105 nh->root.type = eh->root.type;
1106 nh->root.u.def.value = eh->root.u.def.value;
1107 nh->root.u.def.section = eh->root.u.def.section;
1109 if (! bfd_elf_link_record_dynamic_symbol (x->info, nh))
1110 return FALSE;
1113 hh->opd_offset = x->ofs;
1114 x->ofs += OPD_ENTRY_SIZE;
1117 /* Otherwise we do not need an opd entry. */
1118 else
1119 hh->want_opd = 0;
1121 return TRUE;
1124 /* HP requires the EI_OSABI field to be filled in. The assignment to
1125 EI_ABIVERSION may not be strictly necessary. */
1127 static void
1128 elf64_hppa_post_process_headers (bfd *abfd,
1129 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1131 Elf_Internal_Ehdr * i_ehdrp;
1133 i_ehdrp = elf_elfheader (abfd);
1135 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
1136 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
1139 /* Create function descriptor section (.opd). This section is called .opd
1140 because it contains "official procedure descriptors". The "official"
1141 refers to the fact that these descriptors are used when taking the address
1142 of a procedure, thus ensuring a unique address for each procedure. */
1144 static bfd_boolean
1145 get_opd (bfd *abfd,
1146 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1147 struct elf64_hppa_link_hash_table *hppa_info)
1149 asection *opd;
1150 bfd *dynobj;
1152 opd = hppa_info->opd_sec;
1153 if (!opd)
1155 dynobj = hppa_info->root.dynobj;
1156 if (!dynobj)
1157 hppa_info->root.dynobj = dynobj = abfd;
1159 opd = bfd_make_section_with_flags (dynobj, ".opd",
1160 (SEC_ALLOC
1161 | SEC_LOAD
1162 | SEC_HAS_CONTENTS
1163 | SEC_IN_MEMORY
1164 | SEC_LINKER_CREATED));
1165 if (!opd
1166 || !bfd_set_section_alignment (abfd, opd, 3))
1168 BFD_ASSERT (0);
1169 return FALSE;
1172 hppa_info->opd_sec = opd;
1175 return TRUE;
1178 /* Create the PLT section. */
1180 static bfd_boolean
1181 get_plt (bfd *abfd,
1182 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1183 struct elf64_hppa_link_hash_table *hppa_info)
1185 asection *plt;
1186 bfd *dynobj;
1188 plt = hppa_info->plt_sec;
1189 if (!plt)
1191 dynobj = hppa_info->root.dynobj;
1192 if (!dynobj)
1193 hppa_info->root.dynobj = dynobj = abfd;
1195 plt = bfd_make_section_with_flags (dynobj, ".plt",
1196 (SEC_ALLOC
1197 | SEC_LOAD
1198 | SEC_HAS_CONTENTS
1199 | SEC_IN_MEMORY
1200 | SEC_LINKER_CREATED));
1201 if (!plt
1202 || !bfd_set_section_alignment (abfd, plt, 3))
1204 BFD_ASSERT (0);
1205 return FALSE;
1208 hppa_info->plt_sec = plt;
1211 return TRUE;
1214 /* Create the DLT section. */
1216 static bfd_boolean
1217 get_dlt (bfd *abfd,
1218 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1219 struct elf64_hppa_link_hash_table *hppa_info)
1221 asection *dlt;
1222 bfd *dynobj;
1224 dlt = hppa_info->dlt_sec;
1225 if (!dlt)
1227 dynobj = hppa_info->root.dynobj;
1228 if (!dynobj)
1229 hppa_info->root.dynobj = dynobj = abfd;
1231 dlt = bfd_make_section_with_flags (dynobj, ".dlt",
1232 (SEC_ALLOC
1233 | SEC_LOAD
1234 | SEC_HAS_CONTENTS
1235 | SEC_IN_MEMORY
1236 | SEC_LINKER_CREATED));
1237 if (!dlt
1238 || !bfd_set_section_alignment (abfd, dlt, 3))
1240 BFD_ASSERT (0);
1241 return FALSE;
1244 hppa_info->dlt_sec = dlt;
1247 return TRUE;
1250 /* Create the stubs section. */
1252 static bfd_boolean
1253 get_stub (bfd *abfd,
1254 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1255 struct elf64_hppa_link_hash_table *hppa_info)
1257 asection *stub;
1258 bfd *dynobj;
1260 stub = hppa_info->stub_sec;
1261 if (!stub)
1263 dynobj = hppa_info->root.dynobj;
1264 if (!dynobj)
1265 hppa_info->root.dynobj = dynobj = abfd;
1267 stub = bfd_make_section_with_flags (dynobj, ".stub",
1268 (SEC_ALLOC | SEC_LOAD
1269 | SEC_HAS_CONTENTS
1270 | SEC_IN_MEMORY
1271 | SEC_READONLY
1272 | SEC_LINKER_CREATED));
1273 if (!stub
1274 || !bfd_set_section_alignment (abfd, stub, 3))
1276 BFD_ASSERT (0);
1277 return FALSE;
1280 hppa_info->stub_sec = stub;
1283 return TRUE;
1286 /* Create sections necessary for dynamic linking. This is only a rough
1287 cut and will likely change as we learn more about the somewhat
1288 unusual dynamic linking scheme HP uses.
1290 .stub:
1291 Contains code to implement cross-space calls. The first time one
1292 of the stubs is used it will call into the dynamic linker, later
1293 calls will go straight to the target.
1295 The only stub we support right now looks like
1297 ldd OFFSET(%dp),%r1
1298 bve %r0(%r1)
1299 ldd OFFSET+8(%dp),%dp
1301 Other stubs may be needed in the future. We may want the remove
1302 the break/nop instruction. It is only used right now to keep the
1303 offset of a .plt entry and a .stub entry in sync.
1305 .dlt:
1306 This is what most people call the .got. HP used a different name.
1307 Losers.
1309 .rela.dlt:
1310 Relocations for the DLT.
1312 .plt:
1313 Function pointers as address,gp pairs.
1315 .rela.plt:
1316 Should contain dynamic IPLT (and EPLT?) relocations.
1318 .opd:
1319 FPTRS
1321 .rela.opd:
1322 EPLT relocations for symbols exported from shared libraries. */
1324 static bfd_boolean
1325 elf64_hppa_create_dynamic_sections (bfd *abfd,
1326 struct bfd_link_info *info)
1328 asection *s;
1329 struct elf64_hppa_link_hash_table *hppa_info;
1331 hppa_info = hppa_link_hash_table (info);
1332 if (hppa_info == NULL)
1333 return FALSE;
1335 if (! get_stub (abfd, info, hppa_info))
1336 return FALSE;
1338 if (! get_dlt (abfd, info, hppa_info))
1339 return FALSE;
1341 if (! get_plt (abfd, info, hppa_info))
1342 return FALSE;
1344 if (! get_opd (abfd, info, hppa_info))
1345 return FALSE;
1347 s = bfd_make_section_with_flags (abfd, ".rela.dlt",
1348 (SEC_ALLOC | SEC_LOAD
1349 | SEC_HAS_CONTENTS
1350 | SEC_IN_MEMORY
1351 | SEC_READONLY
1352 | SEC_LINKER_CREATED));
1353 if (s == NULL
1354 || !bfd_set_section_alignment (abfd, s, 3))
1355 return FALSE;
1356 hppa_info->dlt_rel_sec = s;
1358 s = bfd_make_section_with_flags (abfd, ".rela.plt",
1359 (SEC_ALLOC | SEC_LOAD
1360 | SEC_HAS_CONTENTS
1361 | SEC_IN_MEMORY
1362 | SEC_READONLY
1363 | SEC_LINKER_CREATED));
1364 if (s == NULL
1365 || !bfd_set_section_alignment (abfd, s, 3))
1366 return FALSE;
1367 hppa_info->plt_rel_sec = s;
1369 s = bfd_make_section_with_flags (abfd, ".rela.data",
1370 (SEC_ALLOC | SEC_LOAD
1371 | SEC_HAS_CONTENTS
1372 | SEC_IN_MEMORY
1373 | SEC_READONLY
1374 | SEC_LINKER_CREATED));
1375 if (s == NULL
1376 || !bfd_set_section_alignment (abfd, s, 3))
1377 return FALSE;
1378 hppa_info->other_rel_sec = s;
1380 s = bfd_make_section_with_flags (abfd, ".rela.opd",
1381 (SEC_ALLOC | SEC_LOAD
1382 | SEC_HAS_CONTENTS
1383 | SEC_IN_MEMORY
1384 | SEC_READONLY
1385 | SEC_LINKER_CREATED));
1386 if (s == NULL
1387 || !bfd_set_section_alignment (abfd, s, 3))
1388 return FALSE;
1389 hppa_info->opd_rel_sec = s;
1391 return TRUE;
1394 /* Allocate dynamic relocations for those symbols that turned out
1395 to be dynamic. */
1397 static bfd_boolean
1398 allocate_dynrel_entries (struct elf_link_hash_entry *eh, void *data)
1400 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1401 struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1402 struct elf64_hppa_link_hash_table *hppa_info;
1403 struct elf64_hppa_dyn_reloc_entry *rent;
1404 bfd_boolean dynamic_symbol, shared;
1406 hppa_info = hppa_link_hash_table (x->info);
1407 if (hppa_info == NULL)
1408 return FALSE;
1410 dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, x->info);
1411 shared = x->info->shared;
1413 /* We may need to allocate relocations for a non-dynamic symbol
1414 when creating a shared library. */
1415 if (!dynamic_symbol && !shared)
1416 return TRUE;
1418 /* Take care of the normal data relocations. */
1420 for (rent = hh->reloc_entries; rent; rent = rent->next)
1422 /* Allocate one iff we are building a shared library, the relocation
1423 isn't a R_PARISC_FPTR64, or we don't want an opd entry. */
1424 if (!shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
1425 continue;
1427 hppa_info->other_rel_sec->size += sizeof (Elf64_External_Rela);
1429 /* Make sure this symbol gets into the dynamic symbol table if it is
1430 not already recorded. ?!? This should not be in the loop since
1431 the symbol need only be added once. */
1432 if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
1433 if (!bfd_elf_link_record_local_dynamic_symbol
1434 (x->info, rent->sec->owner, hh->sym_indx))
1435 return FALSE;
1438 /* Take care of the GOT and PLT relocations. */
1440 if ((dynamic_symbol || shared) && hh->want_dlt)
1441 hppa_info->dlt_rel_sec->size += sizeof (Elf64_External_Rela);
1443 /* If we are building a shared library, then every symbol that has an
1444 opd entry will need an EPLT relocation to relocate the symbol's address
1445 and __gp value based on the runtime load address. */
1446 if (shared && hh->want_opd)
1447 hppa_info->opd_rel_sec->size += sizeof (Elf64_External_Rela);
1449 if (hh->want_plt && dynamic_symbol)
1451 bfd_size_type t = 0;
1453 /* Dynamic symbols get one IPLT relocation. Local symbols in
1454 shared libraries get two REL relocations. Local symbols in
1455 main applications get nothing. */
1456 if (dynamic_symbol)
1457 t = sizeof (Elf64_External_Rela);
1458 else if (shared)
1459 t = 2 * sizeof (Elf64_External_Rela);
1461 hppa_info->plt_rel_sec->size += t;
1464 return TRUE;
1467 /* Adjust a symbol defined by a dynamic object and referenced by a
1468 regular object. */
1470 static bfd_boolean
1471 elf64_hppa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1472 struct elf_link_hash_entry *eh)
1474 /* ??? Undefined symbols with PLT entries should be re-defined
1475 to be the PLT entry. */
1477 /* If this is a weak symbol, and there is a real definition, the
1478 processor independent code will have arranged for us to see the
1479 real definition first, and we can just use the same value. */
1480 if (eh->u.weakdef != NULL)
1482 BFD_ASSERT (eh->u.weakdef->root.type == bfd_link_hash_defined
1483 || eh->u.weakdef->root.type == bfd_link_hash_defweak);
1484 eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1485 eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1486 return TRUE;
1489 /* If this is a reference to a symbol defined by a dynamic object which
1490 is not a function, we might allocate the symbol in our .dynbss section
1491 and allocate a COPY dynamic relocation.
1493 But PA64 code is canonically PIC, so as a rule we can avoid this sort
1494 of hackery. */
1496 return TRUE;
1499 /* This function is called via elf_link_hash_traverse to mark millicode
1500 symbols with a dynindx of -1 and to remove the string table reference
1501 from the dynamic symbol table. If the symbol is not a millicode symbol,
1502 elf64_hppa_mark_exported_functions is called. */
1504 static bfd_boolean
1505 elf64_hppa_mark_milli_and_exported_functions (struct elf_link_hash_entry *eh,
1506 void *data)
1508 struct bfd_link_info *info = (struct bfd_link_info *) data;
1510 if (eh->type == STT_PARISC_MILLI)
1512 if (eh->dynindx != -1)
1514 eh->dynindx = -1;
1515 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1516 eh->dynstr_index);
1518 return TRUE;
1521 return elf64_hppa_mark_exported_functions (eh, data);
1524 /* Set the final sizes of the dynamic sections and allocate memory for
1525 the contents of our special sections. */
1527 static bfd_boolean
1528 elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1530 struct elf64_hppa_link_hash_table *hppa_info;
1531 struct elf64_hppa_allocate_data data;
1532 bfd *dynobj;
1533 bfd *ibfd;
1534 asection *sec;
1535 bfd_boolean plt;
1536 bfd_boolean relocs;
1537 bfd_boolean reltext;
1539 hppa_info = hppa_link_hash_table (info);
1540 if (hppa_info == NULL)
1541 return FALSE;
1543 dynobj = elf_hash_table (info)->dynobj;
1544 BFD_ASSERT (dynobj != NULL);
1546 /* Mark each function this program exports so that we will allocate
1547 space in the .opd section for each function's FPTR. If we are
1548 creating dynamic sections, change the dynamic index of millicode
1549 symbols to -1 and remove them from the string table for .dynstr.
1551 We have to traverse the main linker hash table since we have to
1552 find functions which may not have been mentioned in any relocs. */
1553 elf_link_hash_traverse (elf_hash_table (info),
1554 (elf_hash_table (info)->dynamic_sections_created
1555 ? elf64_hppa_mark_milli_and_exported_functions
1556 : elf64_hppa_mark_exported_functions),
1557 info);
1559 if (elf_hash_table (info)->dynamic_sections_created)
1561 /* Set the contents of the .interp section to the interpreter. */
1562 if (info->executable)
1564 sec = bfd_get_section_by_name (dynobj, ".interp");
1565 BFD_ASSERT (sec != NULL);
1566 sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
1567 sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1570 else
1572 /* We may have created entries in the .rela.got section.
1573 However, if we are not creating the dynamic sections, we will
1574 not actually use these entries. Reset the size of .rela.dlt,
1575 which will cause it to get stripped from the output file
1576 below. */
1577 sec = bfd_get_section_by_name (dynobj, ".rela.dlt");
1578 if (sec != NULL)
1579 sec->size = 0;
1582 /* Set up DLT, PLT and OPD offsets for local syms, and space for local
1583 dynamic relocs. */
1584 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1586 bfd_signed_vma *local_dlt;
1587 bfd_signed_vma *end_local_dlt;
1588 bfd_signed_vma *local_plt;
1589 bfd_signed_vma *end_local_plt;
1590 bfd_signed_vma *local_opd;
1591 bfd_signed_vma *end_local_opd;
1592 bfd_size_type locsymcount;
1593 Elf_Internal_Shdr *symtab_hdr;
1594 asection *srel;
1596 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1597 continue;
1599 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
1601 struct elf64_hppa_dyn_reloc_entry *hdh_p;
1603 for (hdh_p = ((struct elf64_hppa_dyn_reloc_entry *)
1604 elf_section_data (sec)->local_dynrel);
1605 hdh_p != NULL;
1606 hdh_p = hdh_p->next)
1608 if (!bfd_is_abs_section (hdh_p->sec)
1609 && bfd_is_abs_section (hdh_p->sec->output_section))
1611 /* Input section has been discarded, either because
1612 it is a copy of a linkonce section or due to
1613 linker script /DISCARD/, so we'll be discarding
1614 the relocs too. */
1616 else if (hdh_p->count != 0)
1618 srel = elf_section_data (hdh_p->sec)->sreloc;
1619 srel->size += hdh_p->count * sizeof (Elf64_External_Rela);
1620 if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
1621 info->flags |= DF_TEXTREL;
1626 local_dlt = elf_local_got_refcounts (ibfd);
1627 if (!local_dlt)
1628 continue;
1630 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1631 locsymcount = symtab_hdr->sh_info;
1632 end_local_dlt = local_dlt + locsymcount;
1633 sec = hppa_info->dlt_sec;
1634 srel = hppa_info->dlt_rel_sec;
1635 for (; local_dlt < end_local_dlt; ++local_dlt)
1637 if (*local_dlt > 0)
1639 *local_dlt = sec->size;
1640 sec->size += DLT_ENTRY_SIZE;
1641 if (info->shared)
1643 srel->size += sizeof (Elf64_External_Rela);
1646 else
1647 *local_dlt = (bfd_vma) -1;
1650 local_plt = end_local_dlt;
1651 end_local_plt = local_plt + locsymcount;
1652 if (! hppa_info->root.dynamic_sections_created)
1654 /* Won't be used, but be safe. */
1655 for (; local_plt < end_local_plt; ++local_plt)
1656 *local_plt = (bfd_vma) -1;
1658 else
1660 sec = hppa_info->plt_sec;
1661 srel = hppa_info->plt_rel_sec;
1662 for (; local_plt < end_local_plt; ++local_plt)
1664 if (*local_plt > 0)
1666 *local_plt = sec->size;
1667 sec->size += PLT_ENTRY_SIZE;
1668 if (info->shared)
1669 srel->size += sizeof (Elf64_External_Rela);
1671 else
1672 *local_plt = (bfd_vma) -1;
1676 local_opd = end_local_plt;
1677 end_local_opd = local_opd + locsymcount;
1678 if (! hppa_info->root.dynamic_sections_created)
1680 /* Won't be used, but be safe. */
1681 for (; local_opd < end_local_opd; ++local_opd)
1682 *local_opd = (bfd_vma) -1;
1684 else
1686 sec = hppa_info->opd_sec;
1687 srel = hppa_info->opd_rel_sec;
1688 for (; local_opd < end_local_opd; ++local_opd)
1690 if (*local_opd > 0)
1692 *local_opd = sec->size;
1693 sec->size += OPD_ENTRY_SIZE;
1694 if (info->shared)
1695 srel->size += sizeof (Elf64_External_Rela);
1697 else
1698 *local_opd = (bfd_vma) -1;
1703 /* Allocate the GOT entries. */
1705 data.info = info;
1706 if (hppa_info->dlt_sec)
1708 data.ofs = hppa_info->dlt_sec->size;
1709 elf_link_hash_traverse (elf_hash_table (info),
1710 allocate_global_data_dlt, &data);
1711 hppa_info->dlt_sec->size = data.ofs;
1714 if (hppa_info->plt_sec)
1716 data.ofs = hppa_info->plt_sec->size;
1717 elf_link_hash_traverse (elf_hash_table (info),
1718 allocate_global_data_plt, &data);
1719 hppa_info->plt_sec->size = data.ofs;
1722 if (hppa_info->stub_sec)
1724 data.ofs = 0x0;
1725 elf_link_hash_traverse (elf_hash_table (info),
1726 allocate_global_data_stub, &data);
1727 hppa_info->stub_sec->size = data.ofs;
1730 /* Allocate space for entries in the .opd section. */
1731 if (hppa_info->opd_sec)
1733 data.ofs = hppa_info->opd_sec->size;
1734 elf_link_hash_traverse (elf_hash_table (info),
1735 allocate_global_data_opd, &data);
1736 hppa_info->opd_sec->size = data.ofs;
1739 /* Now allocate space for dynamic relocations, if necessary. */
1740 if (hppa_info->root.dynamic_sections_created)
1741 elf_link_hash_traverse (elf_hash_table (info),
1742 allocate_dynrel_entries, &data);
1744 /* The sizes of all the sections are set. Allocate memory for them. */
1745 plt = FALSE;
1746 relocs = FALSE;
1747 reltext = FALSE;
1748 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
1750 const char *name;
1752 if ((sec->flags & SEC_LINKER_CREATED) == 0)
1753 continue;
1755 /* It's OK to base decisions on the section name, because none
1756 of the dynobj section names depend upon the input files. */
1757 name = bfd_get_section_name (dynobj, sec);
1759 if (strcmp (name, ".plt") == 0)
1761 /* Remember whether there is a PLT. */
1762 plt = sec->size != 0;
1764 else if (strcmp (name, ".opd") == 0
1765 || CONST_STRNEQ (name, ".dlt")
1766 || strcmp (name, ".stub") == 0
1767 || strcmp (name, ".got") == 0)
1769 /* Strip this section if we don't need it; see the comment below. */
1771 else if (CONST_STRNEQ (name, ".rela"))
1773 if (sec->size != 0)
1775 asection *target;
1777 /* Remember whether there are any reloc sections other
1778 than .rela.plt. */
1779 if (strcmp (name, ".rela.plt") != 0)
1781 const char *outname;
1783 relocs = TRUE;
1785 /* If this relocation section applies to a read only
1786 section, then we probably need a DT_TEXTREL
1787 entry. The entries in the .rela.plt section
1788 really apply to the .got section, which we
1789 created ourselves and so know is not readonly. */
1790 outname = bfd_get_section_name (output_bfd,
1791 sec->output_section);
1792 target = bfd_get_section_by_name (output_bfd, outname + 4);
1793 if (target != NULL
1794 && (target->flags & SEC_READONLY) != 0
1795 && (target->flags & SEC_ALLOC) != 0)
1796 reltext = TRUE;
1799 /* We use the reloc_count field as a counter if we need
1800 to copy relocs into the output file. */
1801 sec->reloc_count = 0;
1804 else
1806 /* It's not one of our sections, so don't allocate space. */
1807 continue;
1810 if (sec->size == 0)
1812 /* If we don't need this section, strip it from the
1813 output file. This is mostly to handle .rela.bss and
1814 .rela.plt. We must create both sections in
1815 create_dynamic_sections, because they must be created
1816 before the linker maps input sections to output
1817 sections. The linker does that before
1818 adjust_dynamic_symbol is called, and it is that
1819 function which decides whether anything needs to go
1820 into these sections. */
1821 sec->flags |= SEC_EXCLUDE;
1822 continue;
1825 if ((sec->flags & SEC_HAS_CONTENTS) == 0)
1826 continue;
1828 /* Allocate memory for the section contents if it has not
1829 been allocated already. We use bfd_zalloc here in case
1830 unused entries are not reclaimed before the section's
1831 contents are written out. This should not happen, but this
1832 way if it does, we get a R_PARISC_NONE reloc instead of
1833 garbage. */
1834 if (sec->contents == NULL)
1836 sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
1837 if (sec->contents == NULL)
1838 return FALSE;
1842 if (elf_hash_table (info)->dynamic_sections_created)
1844 /* Always create a DT_PLTGOT. It actually has nothing to do with
1845 the PLT, it is how we communicate the __gp value of a load
1846 module to the dynamic linker. */
1847 #define add_dynamic_entry(TAG, VAL) \
1848 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1850 if (!add_dynamic_entry (DT_HP_DLD_FLAGS, 0)
1851 || !add_dynamic_entry (DT_PLTGOT, 0))
1852 return FALSE;
1854 /* Add some entries to the .dynamic section. We fill in the
1855 values later, in elf64_hppa_finish_dynamic_sections, but we
1856 must add the entries now so that we get the correct size for
1857 the .dynamic section. The DT_DEBUG entry is filled in by the
1858 dynamic linker and used by the debugger. */
1859 if (! info->shared)
1861 if (!add_dynamic_entry (DT_DEBUG, 0)
1862 || !add_dynamic_entry (DT_HP_DLD_HOOK, 0)
1863 || !add_dynamic_entry (DT_HP_LOAD_MAP, 0))
1864 return FALSE;
1867 /* Force DT_FLAGS to always be set.
1868 Required by HPUX 11.00 patch PHSS_26559. */
1869 if (!add_dynamic_entry (DT_FLAGS, (info)->flags))
1870 return FALSE;
1872 if (plt)
1874 if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1875 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1876 || !add_dynamic_entry (DT_JMPREL, 0))
1877 return FALSE;
1880 if (relocs)
1882 if (!add_dynamic_entry (DT_RELA, 0)
1883 || !add_dynamic_entry (DT_RELASZ, 0)
1884 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1885 return FALSE;
1888 if (reltext)
1890 if (!add_dynamic_entry (DT_TEXTREL, 0))
1891 return FALSE;
1892 info->flags |= DF_TEXTREL;
1895 #undef add_dynamic_entry
1897 return TRUE;
1900 /* Called after we have output the symbol into the dynamic symbol
1901 table, but before we output the symbol into the normal symbol
1902 table.
1904 For some symbols we had to change their address when outputting
1905 the dynamic symbol table. We undo that change here so that
1906 the symbols have their expected value in the normal symbol
1907 table. Ick. */
1909 static int
1910 elf64_hppa_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1911 const char *name,
1912 Elf_Internal_Sym *sym,
1913 asection *input_sec ATTRIBUTE_UNUSED,
1914 struct elf_link_hash_entry *eh)
1916 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1918 /* We may be called with the file symbol or section symbols.
1919 They never need munging, so it is safe to ignore them. */
1920 if (!name || !eh)
1921 return 1;
1923 /* Function symbols for which we created .opd entries *may* have been
1924 munged by finish_dynamic_symbol and have to be un-munged here.
1926 Note that finish_dynamic_symbol sometimes turns dynamic symbols
1927 into non-dynamic ones, so we initialize st_shndx to -1 in
1928 mark_exported_functions and check to see if it was overwritten
1929 here instead of just checking eh->dynindx. */
1930 if (hh->want_opd && hh->st_shndx != -1)
1932 /* Restore the saved value and section index. */
1933 sym->st_value = hh->st_value;
1934 sym->st_shndx = hh->st_shndx;
1937 return 1;
1940 /* Finish up dynamic symbol handling. We set the contents of various
1941 dynamic sections here. */
1943 static bfd_boolean
1944 elf64_hppa_finish_dynamic_symbol (bfd *output_bfd,
1945 struct bfd_link_info *info,
1946 struct elf_link_hash_entry *eh,
1947 Elf_Internal_Sym *sym)
1949 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1950 asection *stub, *splt, *sopd, *spltrel;
1951 struct elf64_hppa_link_hash_table *hppa_info;
1953 hppa_info = hppa_link_hash_table (info);
1954 if (hppa_info == NULL)
1955 return FALSE;
1957 stub = hppa_info->stub_sec;
1958 splt = hppa_info->plt_sec;
1959 sopd = hppa_info->opd_sec;
1960 spltrel = hppa_info->plt_rel_sec;
1962 /* Incredible. It is actually necessary to NOT use the symbol's real
1963 value when building the dynamic symbol table for a shared library.
1964 At least for symbols that refer to functions.
1966 We will store a new value and section index into the symbol long
1967 enough to output it into the dynamic symbol table, then we restore
1968 the original values (in elf64_hppa_link_output_symbol_hook). */
1969 if (hh->want_opd)
1971 BFD_ASSERT (sopd != NULL);
1973 /* Save away the original value and section index so that we
1974 can restore them later. */
1975 hh->st_value = sym->st_value;
1976 hh->st_shndx = sym->st_shndx;
1978 /* For the dynamic symbol table entry, we want the value to be
1979 address of this symbol's entry within the .opd section. */
1980 sym->st_value = (hh->opd_offset
1981 + sopd->output_offset
1982 + sopd->output_section->vma);
1983 sym->st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
1984 sopd->output_section);
1987 /* Initialize a .plt entry if requested. */
1988 if (hh->want_plt
1989 && elf64_hppa_dynamic_symbol_p (eh, info))
1991 bfd_vma value;
1992 Elf_Internal_Rela rel;
1993 bfd_byte *loc;
1995 BFD_ASSERT (splt != NULL && spltrel != NULL);
1997 /* We do not actually care about the value in the PLT entry
1998 if we are creating a shared library and the symbol is
1999 still undefined, we create a dynamic relocation to fill
2000 in the correct value. */
2001 if (info->shared && eh->root.type == bfd_link_hash_undefined)
2002 value = 0;
2003 else
2004 value = (eh->root.u.def.value + eh->root.u.def.section->vma);
2006 /* Fill in the entry in the procedure linkage table.
2008 The format of a plt entry is
2009 <funcaddr> <__gp>.
2011 plt_offset is the offset within the PLT section at which to
2012 install the PLT entry.
2014 We are modifying the in-memory PLT contents here, so we do not add
2015 in the output_offset of the PLT section. */
2017 bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset);
2018 value = _bfd_get_gp_value (splt->output_section->owner);
2019 bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset + 0x8);
2021 /* Create a dynamic IPLT relocation for this entry.
2023 We are creating a relocation in the output file's PLT section,
2024 which is included within the DLT secton. So we do need to include
2025 the PLT's output_offset in the computation of the relocation's
2026 address. */
2027 rel.r_offset = (hh->plt_offset + splt->output_offset
2028 + splt->output_section->vma);
2029 rel.r_info = ELF64_R_INFO (hh->eh.dynindx, R_PARISC_IPLT);
2030 rel.r_addend = 0;
2032 loc = spltrel->contents;
2033 loc += spltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2034 bfd_elf64_swap_reloca_out (splt->output_section->owner, &rel, loc);
2037 /* Initialize an external call stub entry if requested. */
2038 if (hh->want_stub
2039 && elf64_hppa_dynamic_symbol_p (eh, info))
2041 bfd_vma value;
2042 int insn;
2043 unsigned int max_offset;
2045 BFD_ASSERT (stub != NULL);
2047 /* Install the generic stub template.
2049 We are modifying the contents of the stub section, so we do not
2050 need to include the stub section's output_offset here. */
2051 memcpy (stub->contents + hh->stub_offset, plt_stub, sizeof (plt_stub));
2053 /* Fix up the first ldd instruction.
2055 We are modifying the contents of the STUB section in memory,
2056 so we do not need to include its output offset in this computation.
2058 Note the plt_offset value is the value of the PLT entry relative to
2059 the start of the PLT section. These instructions will reference
2060 data relative to the value of __gp, which may not necessarily have
2061 the same address as the start of the PLT section.
2063 gp_offset contains the offset of __gp within the PLT section. */
2064 value = hh->plt_offset - hppa_info->gp_offset;
2066 insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset);
2067 if (output_bfd->arch_info->mach >= 25)
2069 /* Wide mode allows 16 bit offsets. */
2070 max_offset = 32768;
2071 insn &= ~ 0xfff1;
2072 insn |= re_assemble_16 ((int) value);
2074 else
2076 max_offset = 8192;
2077 insn &= ~ 0x3ff1;
2078 insn |= re_assemble_14 ((int) value);
2081 if ((value & 7) || value + max_offset >= 2*max_offset - 8)
2083 (*_bfd_error_handler) (_("stub entry for %s cannot load .plt, dp offset = %ld"),
2084 hh->eh.root.root.string,
2085 (long) value);
2086 return FALSE;
2089 bfd_put_32 (stub->owner, (bfd_vma) insn,
2090 stub->contents + hh->stub_offset);
2092 /* Fix up the second ldd instruction. */
2093 value += 8;
2094 insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset + 8);
2095 if (output_bfd->arch_info->mach >= 25)
2097 insn &= ~ 0xfff1;
2098 insn |= re_assemble_16 ((int) value);
2100 else
2102 insn &= ~ 0x3ff1;
2103 insn |= re_assemble_14 ((int) value);
2105 bfd_put_32 (stub->owner, (bfd_vma) insn,
2106 stub->contents + hh->stub_offset + 8);
2109 return TRUE;
2112 /* The .opd section contains FPTRs for each function this file
2113 exports. Initialize the FPTR entries. */
2115 static bfd_boolean
2116 elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data)
2118 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2119 struct bfd_link_info *info = (struct bfd_link_info *)data;
2120 struct elf64_hppa_link_hash_table *hppa_info;
2121 asection *sopd;
2122 asection *sopdrel;
2124 hppa_info = hppa_link_hash_table (info);
2125 if (hppa_info == NULL)
2126 return FALSE;
2128 sopd = hppa_info->opd_sec;
2129 sopdrel = hppa_info->opd_rel_sec;
2131 if (hh->want_opd)
2133 bfd_vma value;
2135 /* The first two words of an .opd entry are zero.
2137 We are modifying the contents of the OPD section in memory, so we
2138 do not need to include its output offset in this computation. */
2139 memset (sopd->contents + hh->opd_offset, 0, 16);
2141 value = (eh->root.u.def.value
2142 + eh->root.u.def.section->output_section->vma
2143 + eh->root.u.def.section->output_offset);
2145 /* The next word is the address of the function. */
2146 bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 16);
2148 /* The last word is our local __gp value. */
2149 value = _bfd_get_gp_value (sopd->output_section->owner);
2150 bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 24);
2153 /* If we are generating a shared library, we must generate EPLT relocations
2154 for each entry in the .opd, even for static functions (they may have
2155 had their address taken). */
2156 if (info->shared && hh->want_opd)
2158 Elf_Internal_Rela rel;
2159 bfd_byte *loc;
2160 int dynindx;
2162 /* We may need to do a relocation against a local symbol, in
2163 which case we have to look up it's dynamic symbol index off
2164 the local symbol hash table. */
2165 if (eh->dynindx != -1)
2166 dynindx = eh->dynindx;
2167 else
2168 dynindx
2169 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2170 hh->sym_indx);
2172 /* The offset of this relocation is the absolute address of the
2173 .opd entry for this symbol. */
2174 rel.r_offset = (hh->opd_offset + sopd->output_offset
2175 + sopd->output_section->vma);
2177 /* If H is non-null, then we have an external symbol.
2179 It is imperative that we use a different dynamic symbol for the
2180 EPLT relocation if the symbol has global scope.
2182 In the dynamic symbol table, the function symbol will have a value
2183 which is address of the function's .opd entry.
2185 Thus, we can not use that dynamic symbol for the EPLT relocation
2186 (if we did, the data in the .opd would reference itself rather
2187 than the actual address of the function). Instead we have to use
2188 a new dynamic symbol which has the same value as the original global
2189 function symbol.
2191 We prefix the original symbol with a "." and use the new symbol in
2192 the EPLT relocation. This new symbol has already been recorded in
2193 the symbol table, we just have to look it up and use it.
2195 We do not have such problems with static functions because we do
2196 not make their addresses in the dynamic symbol table point to
2197 the .opd entry. Ultimately this should be safe since a static
2198 function can not be directly referenced outside of its shared
2199 library.
2201 We do have to play similar games for FPTR relocations in shared
2202 libraries, including those for static symbols. See the FPTR
2203 handling in elf64_hppa_finalize_dynreloc. */
2204 if (eh)
2206 char *new_name;
2207 struct elf_link_hash_entry *nh;
2209 new_name = alloca (strlen (eh->root.root.string) + 2);
2210 new_name[0] = '.';
2211 strcpy (new_name + 1, eh->root.root.string);
2213 nh = elf_link_hash_lookup (elf_hash_table (info),
2214 new_name, TRUE, TRUE, FALSE);
2216 /* All we really want from the new symbol is its dynamic
2217 symbol index. */
2218 if (nh)
2219 dynindx = nh->dynindx;
2222 rel.r_addend = 0;
2223 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_EPLT);
2225 loc = sopdrel->contents;
2226 loc += sopdrel->reloc_count++ * sizeof (Elf64_External_Rela);
2227 bfd_elf64_swap_reloca_out (sopd->output_section->owner, &rel, loc);
2229 return TRUE;
2232 /* The .dlt section contains addresses for items referenced through the
2233 dlt. Note that we can have a DLTIND relocation for a local symbol, thus
2234 we can not depend on finish_dynamic_symbol to initialize the .dlt. */
2236 static bfd_boolean
2237 elf64_hppa_finalize_dlt (struct elf_link_hash_entry *eh, void *data)
2239 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2240 struct bfd_link_info *info = (struct bfd_link_info *)data;
2241 struct elf64_hppa_link_hash_table *hppa_info;
2242 asection *sdlt, *sdltrel;
2244 hppa_info = hppa_link_hash_table (info);
2245 if (hppa_info == NULL)
2246 return FALSE;
2248 sdlt = hppa_info->dlt_sec;
2249 sdltrel = hppa_info->dlt_rel_sec;
2251 /* H/DYN_H may refer to a local variable and we know it's
2252 address, so there is no need to create a relocation. Just install
2253 the proper value into the DLT, note this shortcut can not be
2254 skipped when building a shared library. */
2255 if (! info->shared && hh && hh->want_dlt)
2257 bfd_vma value;
2259 /* If we had an LTOFF_FPTR style relocation we want the DLT entry
2260 to point to the FPTR entry in the .opd section.
2262 We include the OPD's output offset in this computation as
2263 we are referring to an absolute address in the resulting
2264 object file. */
2265 if (hh->want_opd)
2267 value = (hh->opd_offset
2268 + hppa_info->opd_sec->output_offset
2269 + hppa_info->opd_sec->output_section->vma);
2271 else if ((eh->root.type == bfd_link_hash_defined
2272 || eh->root.type == bfd_link_hash_defweak)
2273 && eh->root.u.def.section)
2275 value = eh->root.u.def.value + eh->root.u.def.section->output_offset;
2276 if (eh->root.u.def.section->output_section)
2277 value += eh->root.u.def.section->output_section->vma;
2278 else
2279 value += eh->root.u.def.section->vma;
2281 else
2282 /* We have an undefined function reference. */
2283 value = 0;
2285 /* We do not need to include the output offset of the DLT section
2286 here because we are modifying the in-memory contents. */
2287 bfd_put_64 (sdlt->owner, value, sdlt->contents + hh->dlt_offset);
2290 /* Create a relocation for the DLT entry associated with this symbol.
2291 When building a shared library the symbol does not have to be dynamic. */
2292 if (hh->want_dlt
2293 && (elf64_hppa_dynamic_symbol_p (eh, info) || info->shared))
2295 Elf_Internal_Rela rel;
2296 bfd_byte *loc;
2297 int dynindx;
2299 /* We may need to do a relocation against a local symbol, in
2300 which case we have to look up it's dynamic symbol index off
2301 the local symbol hash table. */
2302 if (eh && eh->dynindx != -1)
2303 dynindx = eh->dynindx;
2304 else
2305 dynindx
2306 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2307 hh->sym_indx);
2309 /* Create a dynamic relocation for this entry. Do include the output
2310 offset of the DLT entry since we need an absolute address in the
2311 resulting object file. */
2312 rel.r_offset = (hh->dlt_offset + sdlt->output_offset
2313 + sdlt->output_section->vma);
2314 if (eh && eh->type == STT_FUNC)
2315 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_FPTR64);
2316 else
2317 rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_DIR64);
2318 rel.r_addend = 0;
2320 loc = sdltrel->contents;
2321 loc += sdltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2322 bfd_elf64_swap_reloca_out (sdlt->output_section->owner, &rel, loc);
2324 return TRUE;
2327 /* Finalize the dynamic relocations. Specifically the FPTR relocations
2328 for dynamic functions used to initialize static data. */
2330 static bfd_boolean
2331 elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
2332 void *data)
2334 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2335 struct bfd_link_info *info = (struct bfd_link_info *)data;
2336 struct elf64_hppa_link_hash_table *hppa_info;
2337 int dynamic_symbol;
2339 dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, info);
2341 if (!dynamic_symbol && !info->shared)
2342 return TRUE;
2344 if (hh->reloc_entries)
2346 struct elf64_hppa_dyn_reloc_entry *rent;
2347 int dynindx;
2349 hppa_info = hppa_link_hash_table (info);
2350 if (hppa_info == NULL)
2351 return FALSE;
2353 /* We may need to do a relocation against a local symbol, in
2354 which case we have to look up it's dynamic symbol index off
2355 the local symbol hash table. */
2356 if (eh->dynindx != -1)
2357 dynindx = eh->dynindx;
2358 else
2359 dynindx
2360 = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2361 hh->sym_indx);
2363 for (rent = hh->reloc_entries; rent; rent = rent->next)
2365 Elf_Internal_Rela rel;
2366 bfd_byte *loc;
2368 /* Allocate one iff we are building a shared library, the relocation
2369 isn't a R_PARISC_FPTR64, or we don't want an opd entry. */
2370 if (!info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2371 continue;
2373 /* Create a dynamic relocation for this entry.
2375 We need the output offset for the reloc's section because
2376 we are creating an absolute address in the resulting object
2377 file. */
2378 rel.r_offset = (rent->offset + rent->sec->output_offset
2379 + rent->sec->output_section->vma);
2381 /* An FPTR64 relocation implies that we took the address of
2382 a function and that the function has an entry in the .opd
2383 section. We want the FPTR64 relocation to reference the
2384 entry in .opd.
2386 We could munge the symbol value in the dynamic symbol table
2387 (in fact we already do for functions with global scope) to point
2388 to the .opd entry. Then we could use that dynamic symbol in
2389 this relocation.
2391 Or we could do something sensible, not munge the symbol's
2392 address and instead just use a different symbol to reference
2393 the .opd entry. At least that seems sensible until you
2394 realize there's no local dynamic symbols we can use for that
2395 purpose. Thus the hair in the check_relocs routine.
2397 We use a section symbol recorded by check_relocs as the
2398 base symbol for the relocation. The addend is the difference
2399 between the section symbol and the address of the .opd entry. */
2400 if (info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2402 bfd_vma value, value2;
2404 /* First compute the address of the opd entry for this symbol. */
2405 value = (hh->opd_offset
2406 + hppa_info->opd_sec->output_section->vma
2407 + hppa_info->opd_sec->output_offset);
2409 /* Compute the value of the start of the section with
2410 the relocation. */
2411 value2 = (rent->sec->output_section->vma
2412 + rent->sec->output_offset);
2414 /* Compute the difference between the start of the section
2415 with the relocation and the opd entry. */
2416 value -= value2;
2418 /* The result becomes the addend of the relocation. */
2419 rel.r_addend = value;
2421 /* The section symbol becomes the symbol for the dynamic
2422 relocation. */
2423 dynindx
2424 = _bfd_elf_link_lookup_local_dynindx (info,
2425 rent->sec->owner,
2426 rent->sec_symndx);
2428 else
2429 rel.r_addend = rent->addend;
2431 rel.r_info = ELF64_R_INFO (dynindx, rent->type);
2433 loc = hppa_info->other_rel_sec->contents;
2434 loc += (hppa_info->other_rel_sec->reloc_count++
2435 * sizeof (Elf64_External_Rela));
2436 bfd_elf64_swap_reloca_out (hppa_info->other_rel_sec->output_section->owner,
2437 &rel, loc);
2441 return TRUE;
2444 /* Used to decide how to sort relocs in an optimal manner for the
2445 dynamic linker, before writing them out. */
2447 static enum elf_reloc_type_class
2448 elf64_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
2450 if (ELF64_R_SYM (rela->r_info) == STN_UNDEF)
2451 return reloc_class_relative;
2453 switch ((int) ELF64_R_TYPE (rela->r_info))
2455 case R_PARISC_IPLT:
2456 return reloc_class_plt;
2457 case R_PARISC_COPY:
2458 return reloc_class_copy;
2459 default:
2460 return reloc_class_normal;
2464 /* Finish up the dynamic sections. */
2466 static bfd_boolean
2467 elf64_hppa_finish_dynamic_sections (bfd *output_bfd,
2468 struct bfd_link_info *info)
2470 bfd *dynobj;
2471 asection *sdyn;
2472 struct elf64_hppa_link_hash_table *hppa_info;
2474 hppa_info = hppa_link_hash_table (info);
2475 if (hppa_info == NULL)
2476 return FALSE;
2478 /* Finalize the contents of the .opd section. */
2479 elf_link_hash_traverse (elf_hash_table (info),
2480 elf64_hppa_finalize_opd,
2481 info);
2483 elf_link_hash_traverse (elf_hash_table (info),
2484 elf64_hppa_finalize_dynreloc,
2485 info);
2487 /* Finalize the contents of the .dlt section. */
2488 dynobj = elf_hash_table (info)->dynobj;
2489 /* Finalize the contents of the .dlt section. */
2490 elf_link_hash_traverse (elf_hash_table (info),
2491 elf64_hppa_finalize_dlt,
2492 info);
2494 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2496 if (elf_hash_table (info)->dynamic_sections_created)
2498 Elf64_External_Dyn *dyncon, *dynconend;
2500 BFD_ASSERT (sdyn != NULL);
2502 dyncon = (Elf64_External_Dyn *) sdyn->contents;
2503 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
2504 for (; dyncon < dynconend; dyncon++)
2506 Elf_Internal_Dyn dyn;
2507 asection *s;
2509 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2511 switch (dyn.d_tag)
2513 default:
2514 break;
2516 case DT_HP_LOAD_MAP:
2517 /* Compute the absolute address of 16byte scratchpad area
2518 for the dynamic linker.
2520 By convention the linker script will allocate the scratchpad
2521 area at the start of the .data section. So all we have to
2522 to is find the start of the .data section. */
2523 s = bfd_get_section_by_name (output_bfd, ".data");
2524 dyn.d_un.d_ptr = s->vma;
2525 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2526 break;
2528 case DT_PLTGOT:
2529 /* HP's use PLTGOT to set the GOT register. */
2530 dyn.d_un.d_ptr = _bfd_get_gp_value (output_bfd);
2531 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2532 break;
2534 case DT_JMPREL:
2535 s = hppa_info->plt_rel_sec;
2536 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2537 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2538 break;
2540 case DT_PLTRELSZ:
2541 s = hppa_info->plt_rel_sec;
2542 dyn.d_un.d_val = s->size;
2543 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2544 break;
2546 case DT_RELA:
2547 s = hppa_info->other_rel_sec;
2548 if (! s || ! s->size)
2549 s = hppa_info->dlt_rel_sec;
2550 if (! s || ! s->size)
2551 s = hppa_info->opd_rel_sec;
2552 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2553 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2554 break;
2556 case DT_RELASZ:
2557 s = hppa_info->other_rel_sec;
2558 dyn.d_un.d_val = s->size;
2559 s = hppa_info->dlt_rel_sec;
2560 dyn.d_un.d_val += s->size;
2561 s = hppa_info->opd_rel_sec;
2562 dyn.d_un.d_val += s->size;
2563 /* There is some question about whether or not the size of
2564 the PLT relocs should be included here. HP's tools do
2565 it, so we'll emulate them. */
2566 s = hppa_info->plt_rel_sec;
2567 dyn.d_un.d_val += s->size;
2568 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2569 break;
2575 return TRUE;
2578 /* Support for core dump NOTE sections. */
2580 static bfd_boolean
2581 elf64_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2583 int offset;
2584 size_t size;
2586 switch (note->descsz)
2588 default:
2589 return FALSE;
2591 case 760: /* Linux/hppa */
2592 /* pr_cursig */
2593 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2595 /* pr_pid */
2596 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2598 /* pr_reg */
2599 offset = 112;
2600 size = 640;
2602 break;
2605 /* Make a ".reg/999" section. */
2606 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2607 size, note->descpos + offset);
2610 static bfd_boolean
2611 elf64_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2613 char * command;
2614 int n;
2616 switch (note->descsz)
2618 default:
2619 return FALSE;
2621 case 136: /* Linux/hppa elf_prpsinfo. */
2622 elf_tdata (abfd)->core_program
2623 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2624 elf_tdata (abfd)->core_command
2625 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2628 /* Note that for some reason, a spurious space is tacked
2629 onto the end of the args in some (at least one anyway)
2630 implementations, so strip it off if it exists. */
2631 command = elf_tdata (abfd)->core_command;
2632 n = strlen (command);
2634 if (0 < n && command[n - 1] == ' ')
2635 command[n - 1] = '\0';
2637 return TRUE;
2640 /* Return the number of additional phdrs we will need.
2642 The generic ELF code only creates PT_PHDRs for executables. The HP
2643 dynamic linker requires PT_PHDRs for dynamic libraries too.
2645 This routine indicates that the backend needs one additional program
2646 header for that case.
2648 Note we do not have access to the link info structure here, so we have
2649 to guess whether or not we are building a shared library based on the
2650 existence of a .interp section. */
2652 static int
2653 elf64_hppa_additional_program_headers (bfd *abfd,
2654 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2656 asection *s;
2658 /* If we are creating a shared library, then we have to create a
2659 PT_PHDR segment. HP's dynamic linker chokes without it. */
2660 s = bfd_get_section_by_name (abfd, ".interp");
2661 if (! s)
2662 return 1;
2663 return 0;
2666 /* Allocate and initialize any program headers required by this
2667 specific backend.
2669 The generic ELF code only creates PT_PHDRs for executables. The HP
2670 dynamic linker requires PT_PHDRs for dynamic libraries too.
2672 This allocates the PT_PHDR and initializes it in a manner suitable
2673 for the HP linker.
2675 Note we do not have access to the link info structure here, so we have
2676 to guess whether or not we are building a shared library based on the
2677 existence of a .interp section. */
2679 static bfd_boolean
2680 elf64_hppa_modify_segment_map (bfd *abfd,
2681 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2683 struct elf_segment_map *m;
2684 asection *s;
2686 s = bfd_get_section_by_name (abfd, ".interp");
2687 if (! s)
2689 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2690 if (m->p_type == PT_PHDR)
2691 break;
2692 if (m == NULL)
2694 m = ((struct elf_segment_map *)
2695 bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
2696 if (m == NULL)
2697 return FALSE;
2699 m->p_type = PT_PHDR;
2700 m->p_flags = PF_R | PF_X;
2701 m->p_flags_valid = 1;
2702 m->p_paddr_valid = 1;
2703 m->includes_phdrs = 1;
2705 m->next = elf_tdata (abfd)->segment_map;
2706 elf_tdata (abfd)->segment_map = m;
2710 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2711 if (m->p_type == PT_LOAD)
2713 unsigned int i;
2715 for (i = 0; i < m->count; i++)
2717 /* The code "hint" is not really a hint. It is a requirement
2718 for certain versions of the HP dynamic linker. Worse yet,
2719 it must be set even if the shared library does not have
2720 any code in its "text" segment (thus the check for .hash
2721 to catch this situation). */
2722 if (m->sections[i]->flags & SEC_CODE
2723 || (strcmp (m->sections[i]->name, ".hash") == 0))
2724 m->p_flags |= (PF_X | PF_HP_CODE);
2728 return TRUE;
2731 /* Called when writing out an object file to decide the type of a
2732 symbol. */
2733 static int
2734 elf64_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym,
2735 int type)
2737 if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
2738 return STT_PARISC_MILLI;
2739 else
2740 return type;
2743 /* Support HP specific sections for core files. */
2745 static bfd_boolean
2746 elf64_hppa_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int sec_index,
2747 const char *typename)
2749 if (hdr->p_type == PT_HP_CORE_KERNEL)
2751 asection *sect;
2753 if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2754 return FALSE;
2756 sect = bfd_make_section_anyway (abfd, ".kernel");
2757 if (sect == NULL)
2758 return FALSE;
2759 sect->size = hdr->p_filesz;
2760 sect->filepos = hdr->p_offset;
2761 sect->flags = SEC_HAS_CONTENTS | SEC_READONLY;
2762 return TRUE;
2765 if (hdr->p_type == PT_HP_CORE_PROC)
2767 int sig;
2769 if (bfd_seek (abfd, hdr->p_offset, SEEK_SET) != 0)
2770 return FALSE;
2771 if (bfd_bread (&sig, 4, abfd) != 4)
2772 return FALSE;
2774 elf_tdata (abfd)->core_signal = sig;
2776 if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2777 return FALSE;
2779 /* GDB uses the ".reg" section to read register contents. */
2780 return _bfd_elfcore_make_pseudosection (abfd, ".reg", hdr->p_filesz,
2781 hdr->p_offset);
2784 if (hdr->p_type == PT_HP_CORE_LOADABLE
2785 || hdr->p_type == PT_HP_CORE_STACK
2786 || hdr->p_type == PT_HP_CORE_MMF)
2787 hdr->p_type = PT_LOAD;
2789 return _bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename);
2792 /* Hook called by the linker routine which adds symbols from an object
2793 file. HP's libraries define symbols with HP specific section
2794 indices, which we have to handle. */
2796 static bfd_boolean
2797 elf_hppa_add_symbol_hook (bfd *abfd,
2798 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2799 Elf_Internal_Sym *sym,
2800 const char **namep ATTRIBUTE_UNUSED,
2801 flagword *flagsp ATTRIBUTE_UNUSED,
2802 asection **secp,
2803 bfd_vma *valp)
2805 unsigned int sec_index = sym->st_shndx;
2807 switch (sec_index)
2809 case SHN_PARISC_ANSI_COMMON:
2810 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
2811 (*secp)->flags |= SEC_IS_COMMON;
2812 *valp = sym->st_size;
2813 break;
2815 case SHN_PARISC_HUGE_COMMON:
2816 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
2817 (*secp)->flags |= SEC_IS_COMMON;
2818 *valp = sym->st_size;
2819 break;
2822 return TRUE;
2825 static bfd_boolean
2826 elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2827 void *data)
2829 struct bfd_link_info *info = data;
2831 /* If we are not creating a shared library, and this symbol is
2832 referenced by a shared library but is not defined anywhere, then
2833 the generic code will warn that it is undefined.
2835 This behavior is undesirable on HPs since the standard shared
2836 libraries contain references to undefined symbols.
2838 So we twiddle the flags associated with such symbols so that they
2839 will not trigger the warning. ?!? FIXME. This is horribly fragile.
2841 Ultimately we should have better controls over the generic ELF BFD
2842 linker code. */
2843 if (! info->relocatable
2844 && info->unresolved_syms_in_shared_libs != RM_IGNORE
2845 && h->root.type == bfd_link_hash_undefined
2846 && h->ref_dynamic
2847 && !h->ref_regular)
2849 h->ref_dynamic = 0;
2850 h->pointer_equality_needed = 1;
2853 return TRUE;
2856 static bfd_boolean
2857 elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2858 void *data)
2860 struct bfd_link_info *info = data;
2862 /* If we are not creating a shared library, and this symbol is
2863 referenced by a shared library but is not defined anywhere, then
2864 the generic code will warn that it is undefined.
2866 This behavior is undesirable on HPs since the standard shared
2867 libraries contain references to undefined symbols.
2869 So we twiddle the flags associated with such symbols so that they
2870 will not trigger the warning. ?!? FIXME. This is horribly fragile.
2872 Ultimately we should have better controls over the generic ELF BFD
2873 linker code. */
2874 if (! info->relocatable
2875 && info->unresolved_syms_in_shared_libs != RM_IGNORE
2876 && h->root.type == bfd_link_hash_undefined
2877 && !h->ref_dynamic
2878 && !h->ref_regular
2879 && h->pointer_equality_needed)
2881 h->ref_dynamic = 1;
2882 h->pointer_equality_needed = 0;
2885 return TRUE;
2888 static bfd_boolean
2889 elf_hppa_is_dynamic_loader_symbol (const char *name)
2891 return (! strcmp (name, "__CPU_REVISION")
2892 || ! strcmp (name, "__CPU_KEYBITS_1")
2893 || ! strcmp (name, "__SYSTEM_ID_D")
2894 || ! strcmp (name, "__FPU_MODEL")
2895 || ! strcmp (name, "__FPU_REVISION")
2896 || ! strcmp (name, "__ARGC")
2897 || ! strcmp (name, "__ARGV")
2898 || ! strcmp (name, "__ENVP")
2899 || ! strcmp (name, "__TLS_SIZE_D")
2900 || ! strcmp (name, "__LOAD_INFO")
2901 || ! strcmp (name, "__systab"));
2904 /* Record the lowest address for the data and text segments. */
2905 static void
2906 elf_hppa_record_segment_addrs (bfd *abfd,
2907 asection *section,
2908 void *data)
2910 struct elf64_hppa_link_hash_table *hppa_info = data;
2912 if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2914 bfd_vma value;
2915 Elf_Internal_Phdr *p;
2917 p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
2918 BFD_ASSERT (p != NULL);
2919 value = p->p_vaddr;
2921 if (section->flags & SEC_READONLY)
2923 if (value < hppa_info->text_segment_base)
2924 hppa_info->text_segment_base = value;
2926 else
2928 if (value < hppa_info->data_segment_base)
2929 hppa_info->data_segment_base = value;
2934 /* Called after we have seen all the input files/sections, but before
2935 final symbol resolution and section placement has been determined.
2937 We use this hook to (possibly) provide a value for __gp, then we
2938 fall back to the generic ELF final link routine. */
2940 static bfd_boolean
2941 elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
2943 bfd_boolean retval;
2944 struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
2946 if (hppa_info == NULL)
2947 return FALSE;
2949 if (! info->relocatable)
2951 struct elf_link_hash_entry *gp;
2952 bfd_vma gp_val;
2954 /* The linker script defines a value for __gp iff it was referenced
2955 by one of the objects being linked. First try to find the symbol
2956 in the hash table. If that fails, just compute the value __gp
2957 should have had. */
2958 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
2959 FALSE, FALSE);
2961 if (gp)
2964 /* Adjust the value of __gp as we may want to slide it into the
2965 .plt section so that the stubs can access PLT entries without
2966 using an addil sequence. */
2967 gp->root.u.def.value += hppa_info->gp_offset;
2969 gp_val = (gp->root.u.def.section->output_section->vma
2970 + gp->root.u.def.section->output_offset
2971 + gp->root.u.def.value);
2973 else
2975 asection *sec;
2977 /* First look for a .plt section. If found, then __gp is the
2978 address of the .plt + gp_offset.
2980 If no .plt is found, then look for .dlt, .opd and .data (in
2981 that order) and set __gp to the base address of whichever
2982 section is found first. */
2984 sec = hppa_info->plt_sec;
2985 if (sec && ! (sec->flags & SEC_EXCLUDE))
2986 gp_val = (sec->output_offset
2987 + sec->output_section->vma
2988 + hppa_info->gp_offset);
2989 else
2991 sec = hppa_info->dlt_sec;
2992 if (!sec || (sec->flags & SEC_EXCLUDE))
2993 sec = hppa_info->opd_sec;
2994 if (!sec || (sec->flags & SEC_EXCLUDE))
2995 sec = bfd_get_section_by_name (abfd, ".data");
2996 if (!sec || (sec->flags & SEC_EXCLUDE))
2997 gp_val = 0;
2998 else
2999 gp_val = sec->output_offset + sec->output_section->vma;
3003 /* Install whatever value we found/computed for __gp. */
3004 _bfd_set_gp_value (abfd, gp_val);
3007 /* We need to know the base of the text and data segments so that we
3008 can perform SEGREL relocations. We will record the base addresses
3009 when we encounter the first SEGREL relocation. */
3010 hppa_info->text_segment_base = (bfd_vma)-1;
3011 hppa_info->data_segment_base = (bfd_vma)-1;
3013 /* HP's shared libraries have references to symbols that are not
3014 defined anywhere. The generic ELF BFD linker code will complain
3015 about such symbols.
3017 So we detect the losing case and arrange for the flags on the symbol
3018 to indicate that it was never referenced. This keeps the generic
3019 ELF BFD link code happy and appears to not create any secondary
3020 problems. Ultimately we need a way to control the behavior of the
3021 generic ELF BFD link code better. */
3022 elf_link_hash_traverse (elf_hash_table (info),
3023 elf_hppa_unmark_useless_dynamic_symbols,
3024 info);
3026 /* Invoke the regular ELF backend linker to do all the work. */
3027 retval = bfd_elf_final_link (abfd, info);
3029 elf_link_hash_traverse (elf_hash_table (info),
3030 elf_hppa_remark_useless_dynamic_symbols,
3031 info);
3033 /* If we're producing a final executable, sort the contents of the
3034 unwind section. */
3035 if (retval && !info->relocatable)
3036 retval = elf_hppa_sort_unwind (abfd);
3038 return retval;
3041 /* Relocate the given INSN. VALUE should be the actual value we want
3042 to insert into the instruction, ie by this point we should not be
3043 concerned with computing an offset relative to the DLT, PC, etc.
3044 Instead this routine is meant to handle the bit manipulations needed
3045 to insert the relocation into the given instruction. */
3047 static int
3048 elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
3050 switch (r_type)
3052 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
3053 the "B" instruction. */
3054 case R_PARISC_PCREL22F:
3055 case R_PARISC_PCREL22C:
3056 return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
3058 /* This is any 12 bit branch. */
3059 case R_PARISC_PCREL12F:
3060 return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
3062 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
3063 to the "B" instruction as well as BE. */
3064 case R_PARISC_PCREL17F:
3065 case R_PARISC_DIR17F:
3066 case R_PARISC_DIR17R:
3067 case R_PARISC_PCREL17C:
3068 case R_PARISC_PCREL17R:
3069 return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
3071 /* ADDIL or LDIL instructions. */
3072 case R_PARISC_DLTREL21L:
3073 case R_PARISC_DLTIND21L:
3074 case R_PARISC_LTOFF_FPTR21L:
3075 case R_PARISC_PCREL21L:
3076 case R_PARISC_LTOFF_TP21L:
3077 case R_PARISC_DPREL21L:
3078 case R_PARISC_PLTOFF21L:
3079 case R_PARISC_DIR21L:
3080 return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
3082 /* LDO and integer loads/stores with 14 bit displacements. */
3083 case R_PARISC_DLTREL14R:
3084 case R_PARISC_DLTREL14F:
3085 case R_PARISC_DLTIND14R:
3086 case R_PARISC_DLTIND14F:
3087 case R_PARISC_LTOFF_FPTR14R:
3088 case R_PARISC_PCREL14R:
3089 case R_PARISC_PCREL14F:
3090 case R_PARISC_LTOFF_TP14R:
3091 case R_PARISC_LTOFF_TP14F:
3092 case R_PARISC_DPREL14R:
3093 case R_PARISC_DPREL14F:
3094 case R_PARISC_PLTOFF14R:
3095 case R_PARISC_PLTOFF14F:
3096 case R_PARISC_DIR14R:
3097 case R_PARISC_DIR14F:
3098 return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
3100 /* PA2.0W LDO and integer loads/stores with 16 bit displacements. */
3101 case R_PARISC_LTOFF_FPTR16F:
3102 case R_PARISC_PCREL16F:
3103 case R_PARISC_LTOFF_TP16F:
3104 case R_PARISC_GPREL16F:
3105 case R_PARISC_PLTOFF16F:
3106 case R_PARISC_DIR16F:
3107 case R_PARISC_LTOFF16F:
3108 return (insn & ~0xffff) | re_assemble_16 (sym_value);
3110 /* Doubleword loads and stores with a 14 bit displacement. */
3111 case R_PARISC_DLTREL14DR:
3112 case R_PARISC_DLTIND14DR:
3113 case R_PARISC_LTOFF_FPTR14DR:
3114 case R_PARISC_LTOFF_FPTR16DF:
3115 case R_PARISC_PCREL14DR:
3116 case R_PARISC_PCREL16DF:
3117 case R_PARISC_LTOFF_TP14DR:
3118 case R_PARISC_LTOFF_TP16DF:
3119 case R_PARISC_DPREL14DR:
3120 case R_PARISC_GPREL16DF:
3121 case R_PARISC_PLTOFF14DR:
3122 case R_PARISC_PLTOFF16DF:
3123 case R_PARISC_DIR14DR:
3124 case R_PARISC_DIR16DF:
3125 case R_PARISC_LTOFF16DF:
3126 return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
3127 | ((sym_value & 0x1ff8) << 1));
3129 /* Floating point single word load/store instructions. */
3130 case R_PARISC_DLTREL14WR:
3131 case R_PARISC_DLTIND14WR:
3132 case R_PARISC_LTOFF_FPTR14WR:
3133 case R_PARISC_LTOFF_FPTR16WF:
3134 case R_PARISC_PCREL14WR:
3135 case R_PARISC_PCREL16WF:
3136 case R_PARISC_LTOFF_TP14WR:
3137 case R_PARISC_LTOFF_TP16WF:
3138 case R_PARISC_DPREL14WR:
3139 case R_PARISC_GPREL16WF:
3140 case R_PARISC_PLTOFF14WR:
3141 case R_PARISC_PLTOFF16WF:
3142 case R_PARISC_DIR16WF:
3143 case R_PARISC_DIR14WR:
3144 case R_PARISC_LTOFF16WF:
3145 return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
3146 | ((sym_value & 0x1ffc) << 1));
3148 default:
3149 return insn;
3153 /* Compute the value for a relocation (REL) during a final link stage,
3154 then insert the value into the proper location in CONTENTS.
3156 VALUE is a tentative value for the relocation and may be overridden
3157 and modified here based on the specific relocation to be performed.
3159 For example we do conversions for PC-relative branches in this routine
3160 or redirection of calls to external routines to stubs.
3162 The work of actually applying the relocation is left to a helper
3163 routine in an attempt to reduce the complexity and size of this
3164 function. */
3166 static bfd_reloc_status_type
3167 elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
3168 bfd *input_bfd,
3169 bfd *output_bfd,
3170 asection *input_section,
3171 bfd_byte *contents,
3172 bfd_vma value,
3173 struct bfd_link_info *info,
3174 asection *sym_sec,
3175 struct elf_link_hash_entry *eh)
3177 struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
3178 struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
3179 bfd_vma *local_offsets;
3180 Elf_Internal_Shdr *symtab_hdr;
3181 int insn;
3182 bfd_vma max_branch_offset = 0;
3183 bfd_vma offset = rel->r_offset;
3184 bfd_signed_vma addend = rel->r_addend;
3185 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3186 unsigned int r_symndx = ELF_R_SYM (rel->r_info);
3187 unsigned int r_type = howto->type;
3188 bfd_byte *hit_data = contents + offset;
3190 if (hppa_info == NULL)
3191 return bfd_reloc_notsupported;
3193 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3194 local_offsets = elf_local_got_offsets (input_bfd);
3195 insn = bfd_get_32 (input_bfd, hit_data);
3197 switch (r_type)
3199 case R_PARISC_NONE:
3200 break;
3202 /* Basic function call support.
3204 Note for a call to a function defined in another dynamic library
3205 we want to redirect the call to a stub. */
3207 /* PC relative relocs without an implicit offset. */
3208 case R_PARISC_PCREL21L:
3209 case R_PARISC_PCREL14R:
3210 case R_PARISC_PCREL14F:
3211 case R_PARISC_PCREL14WR:
3212 case R_PARISC_PCREL14DR:
3213 case R_PARISC_PCREL16F:
3214 case R_PARISC_PCREL16WF:
3215 case R_PARISC_PCREL16DF:
3217 /* If this is a call to a function defined in another dynamic
3218 library, then redirect the call to the local stub for this
3219 function. */
3220 if (sym_sec == NULL || sym_sec->output_section == NULL)
3221 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3222 + hppa_info->stub_sec->output_section->vma);
3224 /* Turn VALUE into a proper PC relative address. */
3225 value -= (offset + input_section->output_offset
3226 + input_section->output_section->vma);
3228 /* Adjust for any field selectors. */
3229 if (r_type == R_PARISC_PCREL21L)
3230 value = hppa_field_adjust (value, -8 + addend, e_lsel);
3231 else if (r_type == R_PARISC_PCREL14F
3232 || r_type == R_PARISC_PCREL16F
3233 || r_type == R_PARISC_PCREL16WF
3234 || r_type == R_PARISC_PCREL16DF)
3235 value = hppa_field_adjust (value, -8 + addend, e_fsel);
3236 else
3237 value = hppa_field_adjust (value, -8 + addend, e_rsel);
3239 /* Apply the relocation to the given instruction. */
3240 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3241 break;
3244 case R_PARISC_PCREL12F:
3245 case R_PARISC_PCREL22F:
3246 case R_PARISC_PCREL17F:
3247 case R_PARISC_PCREL22C:
3248 case R_PARISC_PCREL17C:
3249 case R_PARISC_PCREL17R:
3251 /* If this is a call to a function defined in another dynamic
3252 library, then redirect the call to the local stub for this
3253 function. */
3254 if (sym_sec == NULL || sym_sec->output_section == NULL)
3255 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3256 + hppa_info->stub_sec->output_section->vma);
3258 /* Turn VALUE into a proper PC relative address. */
3259 value -= (offset + input_section->output_offset
3260 + input_section->output_section->vma);
3261 addend -= 8;
3263 if (r_type == (unsigned int) R_PARISC_PCREL22F)
3264 max_branch_offset = (1 << (22-1)) << 2;
3265 else if (r_type == (unsigned int) R_PARISC_PCREL17F)
3266 max_branch_offset = (1 << (17-1)) << 2;
3267 else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3268 max_branch_offset = (1 << (12-1)) << 2;
3270 /* Make sure we can reach the branch target. */
3271 if (max_branch_offset != 0
3272 && value + addend + max_branch_offset >= 2*max_branch_offset)
3274 (*_bfd_error_handler)
3275 (_("%B(%A+0x%lx): cannot reach %s"),
3276 input_bfd,
3277 input_section,
3278 offset,
3279 eh->root.root.string);
3280 bfd_set_error (bfd_error_bad_value);
3281 return bfd_reloc_notsupported;
3284 /* Adjust for any field selectors. */
3285 if (r_type == R_PARISC_PCREL17R)
3286 value = hppa_field_adjust (value, addend, e_rsel);
3287 else
3288 value = hppa_field_adjust (value, addend, e_fsel);
3290 /* All branches are implicitly shifted by 2 places. */
3291 value >>= 2;
3293 /* Apply the relocation to the given instruction. */
3294 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3295 break;
3298 /* Indirect references to data through the DLT. */
3299 case R_PARISC_DLTIND14R:
3300 case R_PARISC_DLTIND14F:
3301 case R_PARISC_DLTIND14DR:
3302 case R_PARISC_DLTIND14WR:
3303 case R_PARISC_DLTIND21L:
3304 case R_PARISC_LTOFF_FPTR14R:
3305 case R_PARISC_LTOFF_FPTR14DR:
3306 case R_PARISC_LTOFF_FPTR14WR:
3307 case R_PARISC_LTOFF_FPTR21L:
3308 case R_PARISC_LTOFF_FPTR16F:
3309 case R_PARISC_LTOFF_FPTR16WF:
3310 case R_PARISC_LTOFF_FPTR16DF:
3311 case R_PARISC_LTOFF_TP21L:
3312 case R_PARISC_LTOFF_TP14R:
3313 case R_PARISC_LTOFF_TP14F:
3314 case R_PARISC_LTOFF_TP14WR:
3315 case R_PARISC_LTOFF_TP14DR:
3316 case R_PARISC_LTOFF_TP16F:
3317 case R_PARISC_LTOFF_TP16WF:
3318 case R_PARISC_LTOFF_TP16DF:
3319 case R_PARISC_LTOFF16F:
3320 case R_PARISC_LTOFF16WF:
3321 case R_PARISC_LTOFF16DF:
3323 bfd_vma off;
3325 /* If this relocation was against a local symbol, then we still
3326 have not set up the DLT entry (it's not convenient to do so
3327 in the "finalize_dlt" routine because it is difficult to get
3328 to the local symbol's value).
3330 So, if this is a local symbol (h == NULL), then we need to
3331 fill in its DLT entry.
3333 Similarly we may still need to set up an entry in .opd for
3334 a local function which had its address taken. */
3335 if (hh == NULL)
3337 bfd_vma *local_opd_offsets, *local_dlt_offsets;
3339 if (local_offsets == NULL)
3340 abort ();
3342 /* Now do .opd creation if needed. */
3343 if (r_type == R_PARISC_LTOFF_FPTR14R
3344 || r_type == R_PARISC_LTOFF_FPTR14DR
3345 || r_type == R_PARISC_LTOFF_FPTR14WR
3346 || r_type == R_PARISC_LTOFF_FPTR21L
3347 || r_type == R_PARISC_LTOFF_FPTR16F
3348 || r_type == R_PARISC_LTOFF_FPTR16WF
3349 || r_type == R_PARISC_LTOFF_FPTR16DF)
3351 local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3352 off = local_opd_offsets[r_symndx];
3354 /* The last bit records whether we've already initialised
3355 this local .opd entry. */
3356 if ((off & 1) != 0)
3358 BFD_ASSERT (off != (bfd_vma) -1);
3359 off &= ~1;
3361 else
3363 local_opd_offsets[r_symndx] |= 1;
3365 /* The first two words of an .opd entry are zero. */
3366 memset (hppa_info->opd_sec->contents + off, 0, 16);
3368 /* The next word is the address of the function. */
3369 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3370 (hppa_info->opd_sec->contents + off + 16));
3372 /* The last word is our local __gp value. */
3373 value = _bfd_get_gp_value
3374 (hppa_info->opd_sec->output_section->owner);
3375 bfd_put_64 (hppa_info->opd_sec->owner, value,
3376 (hppa_info->opd_sec->contents + off + 24));
3379 /* The DLT value is the address of the .opd entry. */
3380 value = (off
3381 + hppa_info->opd_sec->output_offset
3382 + hppa_info->opd_sec->output_section->vma);
3383 addend = 0;
3386 local_dlt_offsets = local_offsets;
3387 off = local_dlt_offsets[r_symndx];
3389 if ((off & 1) != 0)
3391 BFD_ASSERT (off != (bfd_vma) -1);
3392 off &= ~1;
3394 else
3396 local_dlt_offsets[r_symndx] |= 1;
3397 bfd_put_64 (hppa_info->dlt_sec->owner,
3398 value + addend,
3399 hppa_info->dlt_sec->contents + off);
3402 else
3403 off = hh->dlt_offset;
3405 /* We want the value of the DLT offset for this symbol, not
3406 the symbol's actual address. Note that __gp may not point
3407 to the start of the DLT, so we have to compute the absolute
3408 address, then subtract out the value of __gp. */
3409 value = (off
3410 + hppa_info->dlt_sec->output_offset
3411 + hppa_info->dlt_sec->output_section->vma);
3412 value -= _bfd_get_gp_value (output_bfd);
3414 /* All DLTIND relocations are basically the same at this point,
3415 except that we need different field selectors for the 21bit
3416 version vs the 14bit versions. */
3417 if (r_type == R_PARISC_DLTIND21L
3418 || r_type == R_PARISC_LTOFF_FPTR21L
3419 || r_type == R_PARISC_LTOFF_TP21L)
3420 value = hppa_field_adjust (value, 0, e_lsel);
3421 else if (r_type == R_PARISC_DLTIND14F
3422 || r_type == R_PARISC_LTOFF_FPTR16F
3423 || r_type == R_PARISC_LTOFF_FPTR16WF
3424 || r_type == R_PARISC_LTOFF_FPTR16DF
3425 || r_type == R_PARISC_LTOFF16F
3426 || r_type == R_PARISC_LTOFF16DF
3427 || r_type == R_PARISC_LTOFF16WF
3428 || r_type == R_PARISC_LTOFF_TP16F
3429 || r_type == R_PARISC_LTOFF_TP16WF
3430 || r_type == R_PARISC_LTOFF_TP16DF)
3431 value = hppa_field_adjust (value, 0, e_fsel);
3432 else
3433 value = hppa_field_adjust (value, 0, e_rsel);
3435 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3436 break;
3439 case R_PARISC_DLTREL14R:
3440 case R_PARISC_DLTREL14F:
3441 case R_PARISC_DLTREL14DR:
3442 case R_PARISC_DLTREL14WR:
3443 case R_PARISC_DLTREL21L:
3444 case R_PARISC_DPREL21L:
3445 case R_PARISC_DPREL14WR:
3446 case R_PARISC_DPREL14DR:
3447 case R_PARISC_DPREL14R:
3448 case R_PARISC_DPREL14F:
3449 case R_PARISC_GPREL16F:
3450 case R_PARISC_GPREL16WF:
3451 case R_PARISC_GPREL16DF:
3453 /* Subtract out the global pointer value to make value a DLT
3454 relative address. */
3455 value -= _bfd_get_gp_value (output_bfd);
3457 /* All DLTREL relocations are basically the same at this point,
3458 except that we need different field selectors for the 21bit
3459 version vs the 14bit versions. */
3460 if (r_type == R_PARISC_DLTREL21L
3461 || r_type == R_PARISC_DPREL21L)
3462 value = hppa_field_adjust (value, addend, e_lrsel);
3463 else if (r_type == R_PARISC_DLTREL14F
3464 || r_type == R_PARISC_DPREL14F
3465 || r_type == R_PARISC_GPREL16F
3466 || r_type == R_PARISC_GPREL16WF
3467 || r_type == R_PARISC_GPREL16DF)
3468 value = hppa_field_adjust (value, addend, e_fsel);
3469 else
3470 value = hppa_field_adjust (value, addend, e_rrsel);
3472 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3473 break;
3476 case R_PARISC_DIR21L:
3477 case R_PARISC_DIR17R:
3478 case R_PARISC_DIR17F:
3479 case R_PARISC_DIR14R:
3480 case R_PARISC_DIR14F:
3481 case R_PARISC_DIR14WR:
3482 case R_PARISC_DIR14DR:
3483 case R_PARISC_DIR16F:
3484 case R_PARISC_DIR16WF:
3485 case R_PARISC_DIR16DF:
3487 /* All DIR relocations are basically the same at this point,
3488 except that branch offsets need to be divided by four, and
3489 we need different field selectors. Note that we don't
3490 redirect absolute calls to local stubs. */
3492 if (r_type == R_PARISC_DIR21L)
3493 value = hppa_field_adjust (value, addend, e_lrsel);
3494 else if (r_type == R_PARISC_DIR17F
3495 || r_type == R_PARISC_DIR16F
3496 || r_type == R_PARISC_DIR16WF
3497 || r_type == R_PARISC_DIR16DF
3498 || r_type == R_PARISC_DIR14F)
3499 value = hppa_field_adjust (value, addend, e_fsel);
3500 else
3501 value = hppa_field_adjust (value, addend, e_rrsel);
3503 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
3504 /* All branches are implicitly shifted by 2 places. */
3505 value >>= 2;
3507 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3508 break;
3511 case R_PARISC_PLTOFF21L:
3512 case R_PARISC_PLTOFF14R:
3513 case R_PARISC_PLTOFF14F:
3514 case R_PARISC_PLTOFF14WR:
3515 case R_PARISC_PLTOFF14DR:
3516 case R_PARISC_PLTOFF16F:
3517 case R_PARISC_PLTOFF16WF:
3518 case R_PARISC_PLTOFF16DF:
3520 /* We want the value of the PLT offset for this symbol, not
3521 the symbol's actual address. Note that __gp may not point
3522 to the start of the DLT, so we have to compute the absolute
3523 address, then subtract out the value of __gp. */
3524 value = (hh->plt_offset
3525 + hppa_info->plt_sec->output_offset
3526 + hppa_info->plt_sec->output_section->vma);
3527 value -= _bfd_get_gp_value (output_bfd);
3529 /* All PLTOFF relocations are basically the same at this point,
3530 except that we need different field selectors for the 21bit
3531 version vs the 14bit versions. */
3532 if (r_type == R_PARISC_PLTOFF21L)
3533 value = hppa_field_adjust (value, addend, e_lrsel);
3534 else if (r_type == R_PARISC_PLTOFF14F
3535 || r_type == R_PARISC_PLTOFF16F
3536 || r_type == R_PARISC_PLTOFF16WF
3537 || r_type == R_PARISC_PLTOFF16DF)
3538 value = hppa_field_adjust (value, addend, e_fsel);
3539 else
3540 value = hppa_field_adjust (value, addend, e_rrsel);
3542 insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3543 break;
3546 case R_PARISC_LTOFF_FPTR32:
3548 /* We may still need to create the FPTR itself if it was for
3549 a local symbol. */
3550 if (hh == NULL)
3552 /* The first two words of an .opd entry are zero. */
3553 memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3555 /* The next word is the address of the function. */
3556 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3557 (hppa_info->opd_sec->contents
3558 + hh->opd_offset + 16));
3560 /* The last word is our local __gp value. */
3561 value = _bfd_get_gp_value
3562 (hppa_info->opd_sec->output_section->owner);
3563 bfd_put_64 (hppa_info->opd_sec->owner, value,
3564 hppa_info->opd_sec->contents + hh->opd_offset + 24);
3566 /* The DLT value is the address of the .opd entry. */
3567 value = (hh->opd_offset
3568 + hppa_info->opd_sec->output_offset
3569 + hppa_info->opd_sec->output_section->vma);
3571 bfd_put_64 (hppa_info->dlt_sec->owner,
3572 value,
3573 hppa_info->dlt_sec->contents + hh->dlt_offset);
3576 /* We want the value of the DLT offset for this symbol, not
3577 the symbol's actual address. Note that __gp may not point
3578 to the start of the DLT, so we have to compute the absolute
3579 address, then subtract out the value of __gp. */
3580 value = (hh->dlt_offset
3581 + hppa_info->dlt_sec->output_offset
3582 + hppa_info->dlt_sec->output_section->vma);
3583 value -= _bfd_get_gp_value (output_bfd);
3584 bfd_put_32 (input_bfd, value, hit_data);
3585 return bfd_reloc_ok;
3588 case R_PARISC_LTOFF_FPTR64:
3589 case R_PARISC_LTOFF_TP64:
3591 /* We may still need to create the FPTR itself if it was for
3592 a local symbol. */
3593 if (eh == NULL && r_type == R_PARISC_LTOFF_FPTR64)
3595 /* The first two words of an .opd entry are zero. */
3596 memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3598 /* The next word is the address of the function. */
3599 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3600 (hppa_info->opd_sec->contents
3601 + hh->opd_offset + 16));
3603 /* The last word is our local __gp value. */
3604 value = _bfd_get_gp_value
3605 (hppa_info->opd_sec->output_section->owner);
3606 bfd_put_64 (hppa_info->opd_sec->owner, value,
3607 hppa_info->opd_sec->contents + hh->opd_offset + 24);
3609 /* The DLT value is the address of the .opd entry. */
3610 value = (hh->opd_offset
3611 + hppa_info->opd_sec->output_offset
3612 + hppa_info->opd_sec->output_section->vma);
3614 bfd_put_64 (hppa_info->dlt_sec->owner,
3615 value,
3616 hppa_info->dlt_sec->contents + hh->dlt_offset);
3619 /* We want the value of the DLT offset for this symbol, not
3620 the symbol's actual address. Note that __gp may not point
3621 to the start of the DLT, so we have to compute the absolute
3622 address, then subtract out the value of __gp. */
3623 value = (hh->dlt_offset
3624 + hppa_info->dlt_sec->output_offset
3625 + hppa_info->dlt_sec->output_section->vma);
3626 value -= _bfd_get_gp_value (output_bfd);
3627 bfd_put_64 (input_bfd, value, hit_data);
3628 return bfd_reloc_ok;
3631 case R_PARISC_DIR32:
3632 bfd_put_32 (input_bfd, value + addend, hit_data);
3633 return bfd_reloc_ok;
3635 case R_PARISC_DIR64:
3636 bfd_put_64 (input_bfd, value + addend, hit_data);
3637 return bfd_reloc_ok;
3639 case R_PARISC_GPREL64:
3640 /* Subtract out the global pointer value to make value a DLT
3641 relative address. */
3642 value -= _bfd_get_gp_value (output_bfd);
3644 bfd_put_64 (input_bfd, value + addend, hit_data);
3645 return bfd_reloc_ok;
3647 case R_PARISC_LTOFF64:
3648 /* We want the value of the DLT offset for this symbol, not
3649 the symbol's actual address. Note that __gp may not point
3650 to the start of the DLT, so we have to compute the absolute
3651 address, then subtract out the value of __gp. */
3652 value = (hh->dlt_offset
3653 + hppa_info->dlt_sec->output_offset
3654 + hppa_info->dlt_sec->output_section->vma);
3655 value -= _bfd_get_gp_value (output_bfd);
3657 bfd_put_64 (input_bfd, value + addend, hit_data);
3658 return bfd_reloc_ok;
3660 case R_PARISC_PCREL32:
3662 /* If this is a call to a function defined in another dynamic
3663 library, then redirect the call to the local stub for this
3664 function. */
3665 if (sym_sec == NULL || sym_sec->output_section == NULL)
3666 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3667 + hppa_info->stub_sec->output_section->vma);
3669 /* Turn VALUE into a proper PC relative address. */
3670 value -= (offset + input_section->output_offset
3671 + input_section->output_section->vma);
3673 value += addend;
3674 value -= 8;
3675 bfd_put_32 (input_bfd, value, hit_data);
3676 return bfd_reloc_ok;
3679 case R_PARISC_PCREL64:
3681 /* If this is a call to a function defined in another dynamic
3682 library, then redirect the call to the local stub for this
3683 function. */
3684 if (sym_sec == NULL || sym_sec->output_section == NULL)
3685 value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3686 + hppa_info->stub_sec->output_section->vma);
3688 /* Turn VALUE into a proper PC relative address. */
3689 value -= (offset + input_section->output_offset
3690 + input_section->output_section->vma);
3692 value += addend;
3693 value -= 8;
3694 bfd_put_64 (input_bfd, value, hit_data);
3695 return bfd_reloc_ok;
3698 case R_PARISC_FPTR64:
3700 bfd_vma off;
3702 /* We may still need to create the FPTR itself if it was for
3703 a local symbol. */
3704 if (hh == NULL)
3706 bfd_vma *local_opd_offsets;
3708 if (local_offsets == NULL)
3709 abort ();
3711 local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3712 off = local_opd_offsets[r_symndx];
3714 /* The last bit records whether we've already initialised
3715 this local .opd entry. */
3716 if ((off & 1) != 0)
3718 BFD_ASSERT (off != (bfd_vma) -1);
3719 off &= ~1;
3721 else
3723 /* The first two words of an .opd entry are zero. */
3724 memset (hppa_info->opd_sec->contents + off, 0, 16);
3726 /* The next word is the address of the function. */
3727 bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3728 (hppa_info->opd_sec->contents + off + 16));
3730 /* The last word is our local __gp value. */
3731 value = _bfd_get_gp_value
3732 (hppa_info->opd_sec->output_section->owner);
3733 bfd_put_64 (hppa_info->opd_sec->owner, value,
3734 hppa_info->opd_sec->contents + off + 24);
3737 else
3738 off = hh->opd_offset;
3740 if (hh == NULL || hh->want_opd)
3741 /* We want the value of the OPD offset for this symbol. */
3742 value = (off
3743 + hppa_info->opd_sec->output_offset
3744 + hppa_info->opd_sec->output_section->vma);
3745 else
3746 /* We want the address of the symbol. */
3747 value += addend;
3749 bfd_put_64 (input_bfd, value, hit_data);
3750 return bfd_reloc_ok;
3753 case R_PARISC_SECREL32:
3754 if (sym_sec)
3755 value -= sym_sec->output_section->vma;
3756 bfd_put_32 (input_bfd, value + addend, hit_data);
3757 return bfd_reloc_ok;
3759 case R_PARISC_SEGREL32:
3760 case R_PARISC_SEGREL64:
3762 /* If this is the first SEGREL relocation, then initialize
3763 the segment base values. */
3764 if (hppa_info->text_segment_base == (bfd_vma) -1)
3765 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
3766 hppa_info);
3768 /* VALUE holds the absolute address. We want to include the
3769 addend, then turn it into a segment relative address.
3771 The segment is derived from SYM_SEC. We assume that there are
3772 only two segments of note in the resulting executable/shlib.
3773 A readonly segment (.text) and a readwrite segment (.data). */
3774 value += addend;
3776 if (sym_sec->flags & SEC_CODE)
3777 value -= hppa_info->text_segment_base;
3778 else
3779 value -= hppa_info->data_segment_base;
3781 if (r_type == R_PARISC_SEGREL32)
3782 bfd_put_32 (input_bfd, value, hit_data);
3783 else
3784 bfd_put_64 (input_bfd, value, hit_data);
3785 return bfd_reloc_ok;
3788 /* Something we don't know how to handle. */
3789 default:
3790 return bfd_reloc_notsupported;
3793 /* Update the instruction word. */
3794 bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3795 return bfd_reloc_ok;
3798 /* Relocate an HPPA ELF section. */
3800 static bfd_boolean
3801 elf64_hppa_relocate_section (bfd *output_bfd,
3802 struct bfd_link_info *info,
3803 bfd *input_bfd,
3804 asection *input_section,
3805 bfd_byte *contents,
3806 Elf_Internal_Rela *relocs,
3807 Elf_Internal_Sym *local_syms,
3808 asection **local_sections)
3810 Elf_Internal_Shdr *symtab_hdr;
3811 Elf_Internal_Rela *rel;
3812 Elf_Internal_Rela *relend;
3813 struct elf64_hppa_link_hash_table *hppa_info;
3815 hppa_info = hppa_link_hash_table (info);
3816 if (hppa_info == NULL)
3817 return FALSE;
3819 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3821 rel = relocs;
3822 relend = relocs + input_section->reloc_count;
3823 for (; rel < relend; rel++)
3825 int r_type;
3826 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3827 unsigned long r_symndx;
3828 struct elf_link_hash_entry *eh;
3829 Elf_Internal_Sym *sym;
3830 asection *sym_sec;
3831 bfd_vma relocation;
3832 bfd_reloc_status_type r;
3834 r_type = ELF_R_TYPE (rel->r_info);
3835 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
3837 bfd_set_error (bfd_error_bad_value);
3838 return FALSE;
3840 if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3841 || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3842 continue;
3844 /* This is a final link. */
3845 r_symndx = ELF_R_SYM (rel->r_info);
3846 eh = NULL;
3847 sym = NULL;
3848 sym_sec = NULL;
3849 if (r_symndx < symtab_hdr->sh_info)
3851 /* This is a local symbol, hh defaults to NULL. */
3852 sym = local_syms + r_symndx;
3853 sym_sec = local_sections[r_symndx];
3854 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
3856 else
3858 /* This is not a local symbol. */
3859 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3861 /* It seems this can happen with erroneous or unsupported
3862 input (mixing a.out and elf in an archive, for example.) */
3863 if (sym_hashes == NULL)
3864 return FALSE;
3866 eh = sym_hashes[r_symndx - symtab_hdr->sh_info];
3868 while (eh->root.type == bfd_link_hash_indirect
3869 || eh->root.type == bfd_link_hash_warning)
3870 eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
3872 relocation = 0;
3873 if (eh->root.type == bfd_link_hash_defined
3874 || eh->root.type == bfd_link_hash_defweak)
3876 sym_sec = eh->root.u.def.section;
3877 if (sym_sec != NULL
3878 && sym_sec->output_section != NULL)
3879 relocation = (eh->root.u.def.value
3880 + sym_sec->output_section->vma
3881 + sym_sec->output_offset);
3883 else if (eh->root.type == bfd_link_hash_undefweak)
3885 else if (info->unresolved_syms_in_objects == RM_IGNORE
3886 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
3888 else if (!info->relocatable
3889 && elf_hppa_is_dynamic_loader_symbol (eh->root.root.string))
3890 continue;
3891 else if (!info->relocatable)
3893 bfd_boolean err;
3894 err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
3895 || ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT);
3896 if (!info->callbacks->undefined_symbol (info,
3897 eh->root.root.string,
3898 input_bfd,
3899 input_section,
3900 rel->r_offset, err))
3901 return FALSE;
3904 if (!info->relocatable
3905 && relocation == 0
3906 && eh->root.type != bfd_link_hash_defined
3907 && eh->root.type != bfd_link_hash_defweak
3908 && eh->root.type != bfd_link_hash_undefweak)
3910 if (info->unresolved_syms_in_objects == RM_IGNORE
3911 && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3912 && eh->type == STT_PARISC_MILLI)
3914 if (! info->callbacks->undefined_symbol
3915 (info, eh_name (eh), input_bfd,
3916 input_section, rel->r_offset, FALSE))
3917 return FALSE;
3922 if (sym_sec != NULL && elf_discarded_section (sym_sec))
3923 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3924 rel, relend, howto, contents);
3926 if (info->relocatable)
3927 continue;
3929 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
3930 input_section, contents,
3931 relocation, info, sym_sec,
3932 eh);
3934 if (r != bfd_reloc_ok)
3936 switch (r)
3938 default:
3939 abort ();
3940 case bfd_reloc_overflow:
3942 const char *sym_name;
3944 if (eh != NULL)
3945 sym_name = NULL;
3946 else
3948 sym_name = bfd_elf_string_from_elf_section (input_bfd,
3949 symtab_hdr->sh_link,
3950 sym->st_name);
3951 if (sym_name == NULL)
3952 return FALSE;
3953 if (*sym_name == '\0')
3954 sym_name = bfd_section_name (input_bfd, sym_sec);
3957 if (!((*info->callbacks->reloc_overflow)
3958 (info, (eh ? &eh->root : NULL), sym_name,
3959 howto->name, (bfd_vma) 0, input_bfd,
3960 input_section, rel->r_offset)))
3961 return FALSE;
3963 break;
3967 return TRUE;
3970 static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
3972 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3973 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3974 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3975 { STRING_COMMA_LEN (".dlt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3976 { STRING_COMMA_LEN (".sdata"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3977 { STRING_COMMA_LEN (".sbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3978 { STRING_COMMA_LEN (".tbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_HP_TLS },
3979 { NULL, 0, 0, 0, 0 }
3982 /* The hash bucket size is the standard one, namely 4. */
3984 const struct elf_size_info hppa64_elf_size_info =
3986 sizeof (Elf64_External_Ehdr),
3987 sizeof (Elf64_External_Phdr),
3988 sizeof (Elf64_External_Shdr),
3989 sizeof (Elf64_External_Rel),
3990 sizeof (Elf64_External_Rela),
3991 sizeof (Elf64_External_Sym),
3992 sizeof (Elf64_External_Dyn),
3993 sizeof (Elf_External_Note),
3996 64, 3,
3997 ELFCLASS64, EV_CURRENT,
3998 bfd_elf64_write_out_phdrs,
3999 bfd_elf64_write_shdrs_and_ehdr,
4000 bfd_elf64_checksum_contents,
4001 bfd_elf64_write_relocs,
4002 bfd_elf64_swap_symbol_in,
4003 bfd_elf64_swap_symbol_out,
4004 bfd_elf64_slurp_reloc_table,
4005 bfd_elf64_slurp_symbol_table,
4006 bfd_elf64_swap_dyn_in,
4007 bfd_elf64_swap_dyn_out,
4008 bfd_elf64_swap_reloc_in,
4009 bfd_elf64_swap_reloc_out,
4010 bfd_elf64_swap_reloca_in,
4011 bfd_elf64_swap_reloca_out
4014 #define TARGET_BIG_SYM bfd_elf64_hppa_vec
4015 #define TARGET_BIG_NAME "elf64-hppa"
4016 #define ELF_ARCH bfd_arch_hppa
4017 #define ELF_TARGET_ID HPPA64_ELF_DATA
4018 #define ELF_MACHINE_CODE EM_PARISC
4019 /* This is not strictly correct. The maximum page size for PA2.0 is
4020 64M. But everything still uses 4k. */
4021 #define ELF_MAXPAGESIZE 0x1000
4022 #define ELF_OSABI ELFOSABI_HPUX
4024 #define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4025 #define bfd_elf64_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4026 #define bfd_elf64_bfd_is_local_label_name elf_hppa_is_local_label_name
4027 #define elf_info_to_howto elf_hppa_info_to_howto
4028 #define elf_info_to_howto_rel elf_hppa_info_to_howto_rel
4030 #define elf_backend_section_from_shdr elf64_hppa_section_from_shdr
4031 #define elf_backend_object_p elf64_hppa_object_p
4032 #define elf_backend_final_write_processing \
4033 elf_hppa_final_write_processing
4034 #define elf_backend_fake_sections elf_hppa_fake_sections
4035 #define elf_backend_add_symbol_hook elf_hppa_add_symbol_hook
4037 #define elf_backend_relocate_section elf_hppa_relocate_section
4039 #define bfd_elf64_bfd_final_link elf_hppa_final_link
4041 #define elf_backend_create_dynamic_sections \
4042 elf64_hppa_create_dynamic_sections
4043 #define elf_backend_post_process_headers elf64_hppa_post_process_headers
4045 #define elf_backend_omit_section_dynsym \
4046 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4047 #define elf_backend_adjust_dynamic_symbol \
4048 elf64_hppa_adjust_dynamic_symbol
4050 #define elf_backend_size_dynamic_sections \
4051 elf64_hppa_size_dynamic_sections
4053 #define elf_backend_finish_dynamic_symbol \
4054 elf64_hppa_finish_dynamic_symbol
4055 #define elf_backend_finish_dynamic_sections \
4056 elf64_hppa_finish_dynamic_sections
4057 #define elf_backend_grok_prstatus elf64_hppa_grok_prstatus
4058 #define elf_backend_grok_psinfo elf64_hppa_grok_psinfo
4060 /* Stuff for the BFD linker: */
4061 #define bfd_elf64_bfd_link_hash_table_create \
4062 elf64_hppa_hash_table_create
4064 #define elf_backend_check_relocs \
4065 elf64_hppa_check_relocs
4067 #define elf_backend_size_info \
4068 hppa64_elf_size_info
4070 #define elf_backend_additional_program_headers \
4071 elf64_hppa_additional_program_headers
4073 #define elf_backend_modify_segment_map \
4074 elf64_hppa_modify_segment_map
4076 #define elf_backend_link_output_symbol_hook \
4077 elf64_hppa_link_output_symbol_hook
4079 #define elf_backend_want_got_plt 0
4080 #define elf_backend_plt_readonly 0
4081 #define elf_backend_want_plt_sym 0
4082 #define elf_backend_got_header_size 0
4083 #define elf_backend_type_change_ok TRUE
4084 #define elf_backend_get_symbol_type elf64_hppa_elf_get_symbol_type
4085 #define elf_backend_reloc_type_class elf64_hppa_reloc_type_class
4086 #define elf_backend_rela_normal 1
4087 #define elf_backend_special_sections elf64_hppa_special_sections
4088 #define elf_backend_action_discarded elf_hppa_action_discarded
4089 #define elf_backend_section_from_phdr elf64_hppa_section_from_phdr
4091 #define elf64_bed elf64_hppa_hpux_bed
4093 #include "elf64-target.h"
4095 #undef TARGET_BIG_SYM
4096 #define TARGET_BIG_SYM bfd_elf64_hppa_linux_vec
4097 #undef TARGET_BIG_NAME
4098 #define TARGET_BIG_NAME "elf64-hppa-linux"
4099 #undef ELF_OSABI
4100 #define ELF_OSABI ELFOSABI_LINUX
4101 #undef elf_backend_post_process_headers
4102 #define elf_backend_post_process_headers _bfd_elf_set_osabi
4103 #undef elf64_bed
4104 #define elf64_bed elf64_hppa_linux_bed
4106 #include "elf64-target.h"