2001-06-02 H.J. Lu <hjl@gnu.org>
[platform/upstream/binutils.git] / bfd / elf64-hppa.c
1 /* Support for HPPA 64-bit ELF
2    Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #include "alloca-conf.h"
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/hppa.h"
26 #include "libhppa.h"
27 #include "elf64-hppa.h"
28 #define ARCH_SIZE              64
29
30 #define PLT_ENTRY_SIZE 0x10
31 #define DLT_ENTRY_SIZE 0x8
32 #define OPD_ENTRY_SIZE 0x20
33
34 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
35
36 /* The stub is supposed to load the target address and target's DP
37    value out of the PLT, then do an external branch to the target
38    address.
39
40    LDD PLTOFF(%r27),%r1
41    BVE (%r1)
42    LDD PLTOFF+8(%r27),%r27
43
44    Note that we must use the LDD with a 14 bit displacement, not the one
45    with a 5 bit displacement.  */
46 static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
47                           0x53, 0x7b, 0x00, 0x00 };
48
49 struct elf64_hppa_dyn_hash_entry
50 {
51   struct bfd_hash_entry root;
52
53   /* Offsets for this symbol in various linker sections.  */
54   bfd_vma dlt_offset;
55   bfd_vma plt_offset;
56   bfd_vma opd_offset;
57   bfd_vma stub_offset;
58
59   /* The symbol table entry, if any, that this was derived from.  */
60   struct elf_link_hash_entry *h;
61
62   /* The index of the (possibly local) symbol in the input bfd and its
63      associated BFD.  Needed so that we can have relocs against local
64      symbols in shared libraries.  */
65   unsigned long sym_indx;
66   bfd *owner;
67
68   /* Dynamic symbols may need to have two different values.  One for
69      the dynamic symbol table, one for the normal symbol table.
70
71      In such cases we store the symbol's real value and section
72      index here so we can restore the real value before we write
73      the normal symbol table.  */
74   bfd_vma st_value;
75   int st_shndx;
76
77   /* Used to count non-got, non-plt relocations for delayed sizing
78      of relocation sections.  */
79   struct elf64_hppa_dyn_reloc_entry
80   {
81     /* Next relocation in the chain.  */
82     struct elf64_hppa_dyn_reloc_entry *next;
83
84     /* The type of the relocation.  */
85     int type;
86
87     /* The input section of the relocation.  */
88     asection *sec;
89
90     /* The index of the section symbol for the input section of
91        the relocation.  Only needed when building shared libraries.  */
92     int sec_symndx;
93
94     /* The offset within the input section of the relocation.  */
95     bfd_vma offset;
96
97     /* The addend for the relocation.  */
98     bfd_vma addend;
99
100   } *reloc_entries;
101
102   /* Nonzero if this symbol needs an entry in one of the linker
103      sections.  */
104   unsigned want_dlt;
105   unsigned want_plt;
106   unsigned want_opd;
107   unsigned want_stub;
108 };
109
110 struct elf64_hppa_dyn_hash_table
111 {
112   struct bfd_hash_table root;
113 };
114
115 struct elf64_hppa_link_hash_table
116 {
117   struct elf_link_hash_table root;
118
119   /* Shortcuts to get to the various linker defined sections.  */
120   asection *dlt_sec;
121   asection *dlt_rel_sec;
122   asection *plt_sec;
123   asection *plt_rel_sec;
124   asection *opd_sec;
125   asection *opd_rel_sec;
126   asection *other_rel_sec;
127
128   /* Offset of __gp within .plt section.  When the PLT gets large we want
129      to slide __gp into the PLT section so that we can continue to use
130      single DP relative instructions to load values out of the PLT.  */
131   bfd_vma gp_offset;
132
133   /* Note this is not strictly correct.  We should create a stub section for
134      each input section with calls.  The stub section should be placed before
135      the section with the call.  */
136   asection *stub_sec;
137
138   bfd_vma text_segment_base;
139   bfd_vma data_segment_base;
140
141   struct elf64_hppa_dyn_hash_table dyn_hash_table;
142
143   /* We build tables to map from an input section back to its
144      symbol index.  This is the BFD for which we currently have
145      a map.  */
146   bfd *section_syms_bfd;
147
148   /* Array of symbol numbers for each input section attached to the
149      current BFD.  */
150   int *section_syms;
151 };
152
153 #define elf64_hppa_hash_table(p) \
154   ((struct elf64_hppa_link_hash_table *) ((p)->hash))
155
156 typedef struct bfd_hash_entry *(*new_hash_entry_func)
157   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
158
159 static boolean elf64_hppa_dyn_hash_table_init
160   PARAMS ((struct elf64_hppa_dyn_hash_table *ht, bfd *abfd,
161            new_hash_entry_func new));
162 static struct bfd_hash_entry *elf64_hppa_new_dyn_hash_entry
163   PARAMS ((struct bfd_hash_entry *entry, struct bfd_hash_table *table,
164            const char *string));
165 static struct bfd_link_hash_table *elf64_hppa_hash_table_create
166   PARAMS ((bfd *abfd));
167 static struct elf64_hppa_dyn_hash_entry *elf64_hppa_dyn_hash_lookup
168   PARAMS ((struct elf64_hppa_dyn_hash_table *table, const char *string,
169            boolean create, boolean copy));
170 static void elf64_hppa_dyn_hash_traverse
171   PARAMS ((struct elf64_hppa_dyn_hash_table *table,
172            boolean (*func) (struct elf64_hppa_dyn_hash_entry *, PTR),
173            PTR info));
174
175 static const char *get_dyn_name
176   PARAMS ((asection *, struct elf_link_hash_entry *,
177            const Elf_Internal_Rela *, char **, size_t *));
178
179 /* This must follow the definitions of the various derived linker
180    hash tables and shared functions.  */
181 #include "elf-hppa.h"
182
183 static boolean elf64_hppa_object_p
184   PARAMS ((bfd *));
185
186 static boolean elf64_hppa_section_from_shdr
187   PARAMS ((bfd *, Elf64_Internal_Shdr *, char *));
188
189 static void elf64_hppa_post_process_headers
190   PARAMS ((bfd *, struct bfd_link_info *));
191
192 static boolean elf64_hppa_create_dynamic_sections
193   PARAMS ((bfd *, struct bfd_link_info *));
194
195 static boolean elf64_hppa_adjust_dynamic_symbol
196   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
197
198 static boolean elf64_hppa_size_dynamic_sections
199   PARAMS ((bfd *, struct bfd_link_info *));
200
201 static boolean elf64_hppa_finish_dynamic_symbol
202   PARAMS ((bfd *, struct bfd_link_info *,
203            struct elf_link_hash_entry *, Elf_Internal_Sym *));
204
205 static boolean elf64_hppa_finish_dynamic_sections
206   PARAMS ((bfd *, struct bfd_link_info *));
207
208 static boolean elf64_hppa_check_relocs
209   PARAMS ((bfd *, struct bfd_link_info *,
210            asection *, const Elf_Internal_Rela *));
211
212 static boolean elf64_hppa_dynamic_symbol_p
213   PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
214
215 static boolean elf64_hppa_mark_exported_functions
216   PARAMS ((struct elf_link_hash_entry *, PTR));
217
218 static boolean elf64_hppa_finalize_opd
219   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
220
221 static boolean elf64_hppa_finalize_dlt
222   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
223
224 static boolean allocate_global_data_dlt
225   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
226
227 static boolean allocate_global_data_plt
228   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
229
230 static boolean allocate_global_data_stub
231   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
232
233 static boolean allocate_global_data_opd
234   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
235
236 static boolean get_reloc_section
237   PARAMS ((bfd *, struct elf64_hppa_link_hash_table *, asection *));
238
239 static boolean count_dyn_reloc
240   PARAMS ((bfd *, struct elf64_hppa_dyn_hash_entry *,
241            int, asection *, int, bfd_vma, bfd_vma));
242
243 static boolean allocate_dynrel_entries
244   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
245
246 static boolean elf64_hppa_finalize_dynreloc
247   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
248
249 static boolean get_opd
250   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
251
252 static boolean get_plt
253   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
254
255 static boolean get_dlt
256   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
257
258 static boolean get_stub
259   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
260
261 static int elf64_hppa_elf_get_symbol_type
262   PARAMS ((Elf_Internal_Sym *, int));
263
264 static boolean
265 elf64_hppa_dyn_hash_table_init (ht, abfd, new)
266      struct elf64_hppa_dyn_hash_table *ht;
267      bfd *abfd ATTRIBUTE_UNUSED;
268      new_hash_entry_func new;
269 {
270   memset (ht, 0, sizeof (*ht));
271   return bfd_hash_table_init (&ht->root, new);
272 }
273
274 static struct bfd_hash_entry*
275 elf64_hppa_new_dyn_hash_entry (entry, table, string)
276      struct bfd_hash_entry *entry;
277      struct bfd_hash_table *table;
278      const char *string;
279 {
280   struct elf64_hppa_dyn_hash_entry *ret;
281   ret = (struct elf64_hppa_dyn_hash_entry *) entry;
282
283   /* Allocate the structure if it has not already been allocated by a
284      subclass.  */
285   if (!ret)
286     ret = bfd_hash_allocate (table, sizeof (*ret));
287
288   if (!ret)
289     return 0;
290
291   /* Initialize our local data.  All zeros, and definitely easier
292      than setting 8 bit fields.  */
293   memset (ret, 0, sizeof (*ret));
294
295   /* Call the allocation method of the superclass.  */
296   ret = ((struct elf64_hppa_dyn_hash_entry *)
297          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
298
299   return &ret->root;
300 }
301
302 /* Create the derived linker hash table.  The PA64 ELF port uses this
303    derived hash table to keep information specific to the PA ElF
304    linker (without using static variables).  */
305
306 static struct bfd_link_hash_table*
307 elf64_hppa_hash_table_create (abfd)
308      bfd *abfd;
309 {
310   struct elf64_hppa_link_hash_table *ret;
311
312   ret = bfd_zalloc (abfd, sizeof (*ret));
313   if (!ret)
314     return 0;
315   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
316                                       _bfd_elf_link_hash_newfunc))
317     {
318       bfd_release (abfd, ret);
319       return 0;
320     }
321
322   if (!elf64_hppa_dyn_hash_table_init (&ret->dyn_hash_table, abfd,
323                                        elf64_hppa_new_dyn_hash_entry))
324     return 0;
325   return &ret->root.root;
326 }
327
328 /* Look up an entry in a PA64 ELF linker hash table.  */
329
330 static struct elf64_hppa_dyn_hash_entry *
331 elf64_hppa_dyn_hash_lookup(table, string, create, copy)
332      struct elf64_hppa_dyn_hash_table *table;
333      const char *string;
334      boolean create, copy;
335 {
336   return ((struct elf64_hppa_dyn_hash_entry *)
337           bfd_hash_lookup (&table->root, string, create, copy));
338 }
339
340 /* Traverse a PA64 ELF linker hash table.  */
341
342 static void
343 elf64_hppa_dyn_hash_traverse (table, func, info)
344      struct elf64_hppa_dyn_hash_table *table;
345      boolean (*func) PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
346      PTR info;
347 {
348   (bfd_hash_traverse
349    (&table->root,
350     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) func,
351     info));
352 }
353 \f
354 /* Return nonzero if ABFD represents a PA2.0 ELF64 file.
355
356    Additionally we set the default architecture and machine.  */
357 static boolean
358 elf64_hppa_object_p (abfd)
359      bfd *abfd;
360 {
361   Elf_Internal_Ehdr * i_ehdrp;
362   unsigned int flags;
363
364   i_ehdrp = elf_elfheader (abfd);
365   if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
366     {
367       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX)
368         return false;
369     }
370   else
371     {
372       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
373         return false;
374     }
375
376   flags = i_ehdrp->e_flags;
377   switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
378     {
379     case EFA_PARISC_1_0:
380       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
381     case EFA_PARISC_1_1:
382       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
383     case EFA_PARISC_2_0:
384       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
385     case EFA_PARISC_2_0 | EF_PARISC_WIDE:
386       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
387     }
388   /* Don't be fussy.  */
389   return true;
390 }
391
392 /* Given section type (hdr->sh_type), return a boolean indicating
393    whether or not the section is an elf64-hppa specific section.  */
394 static boolean
395 elf64_hppa_section_from_shdr (abfd, hdr, name)
396      bfd *abfd;
397      Elf64_Internal_Shdr *hdr;
398      char *name;
399 {
400   asection *newsect;
401
402   switch (hdr->sh_type)
403     {
404     case SHT_PARISC_EXT:
405       if (strcmp (name, ".PARISC.archext") != 0)
406         return false;
407       break;
408     case SHT_PARISC_UNWIND:
409       if (strcmp (name, ".PARISC.unwind") != 0)
410         return false;
411       break;
412     case SHT_PARISC_DOC:
413     case SHT_PARISC_ANNOT:
414     default:
415       return false;
416     }
417
418   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
419     return false;
420   newsect = hdr->bfd_section;
421
422   return true;
423 }
424
425 /* Construct a string for use in the elf64_hppa_dyn_hash_table.  The
426    name describes what was once potentially anonymous memory.  We
427    allocate memory as necessary, possibly reusing PBUF/PLEN.  */
428
429 static const char *
430 get_dyn_name (sec, h, rel, pbuf, plen)
431      asection *sec;
432      struct elf_link_hash_entry *h;
433      const Elf_Internal_Rela *rel;
434      char **pbuf;
435      size_t *plen;
436 {
437   size_t nlen, tlen;
438   char *buf;
439   size_t len;
440
441   if (h && rel->r_addend == 0)
442     return h->root.root.string;
443
444   if (h)
445     nlen = strlen (h->root.root.string);
446   else
447     nlen = 8 + 1 + sizeof (rel->r_info) * 2 - 8;
448   tlen = nlen + 1 + sizeof (rel->r_addend) * 2 + 1;
449
450   len = *plen;
451   buf = *pbuf;
452   if (len < tlen)
453     {
454       if (buf)
455         free (buf);
456       *pbuf = buf = malloc (tlen);
457       *plen = len = tlen;
458       if (!buf)
459         return NULL;
460     }
461
462   if (h)
463     {
464       memcpy (buf, h->root.root.string, nlen);
465       buf[nlen++] = '+';
466       sprintf_vma (buf + nlen, rel->r_addend);
467     }
468   else
469     {
470       nlen = sprintf (buf, "%x:%lx",
471                       sec->id & 0xffffffff,
472                       (long) ELF64_R_SYM (rel->r_info));
473       if (rel->r_addend)
474         {
475           buf[nlen++] = '+';
476           sprintf_vma (buf + nlen, rel->r_addend);
477         }
478     }
479
480   return buf;
481 }
482
483 /* SEC is a section containing relocs for an input BFD when linking; return
484    a suitable section for holding relocs in the output BFD for a link.  */
485
486 static boolean
487 get_reloc_section (abfd, hppa_info, sec)
488      bfd *abfd;
489      struct elf64_hppa_link_hash_table *hppa_info;
490      asection *sec;
491 {
492   const char *srel_name;
493   asection *srel;
494   bfd *dynobj;
495
496   srel_name = (bfd_elf_string_from_elf_section
497                (abfd, elf_elfheader(abfd)->e_shstrndx,
498                 elf_section_data(sec)->rel_hdr.sh_name));
499   if (srel_name == NULL)
500     return false;
501
502   BFD_ASSERT ((strncmp (srel_name, ".rela", 5) == 0
503                && strcmp (bfd_get_section_name (abfd, sec),
504                           srel_name+5) == 0)
505               || (strncmp (srel_name, ".rel", 4) == 0
506                   && strcmp (bfd_get_section_name (abfd, sec),
507                              srel_name+4) == 0));
508
509   dynobj = hppa_info->root.dynobj;
510   if (!dynobj)
511     hppa_info->root.dynobj = dynobj = abfd;
512
513   srel = bfd_get_section_by_name (dynobj, srel_name);
514   if (srel == NULL)
515     {
516       srel = bfd_make_section (dynobj, srel_name);
517       if (srel == NULL
518           || !bfd_set_section_flags (dynobj, srel,
519                                      (SEC_ALLOC
520                                       | SEC_LOAD
521                                       | SEC_HAS_CONTENTS
522                                       | SEC_IN_MEMORY
523                                       | SEC_LINKER_CREATED
524                                       | SEC_READONLY))
525           || !bfd_set_section_alignment (dynobj, srel, 3))
526         return false;
527     }
528
529   hppa_info->other_rel_sec = srel;
530   return true;
531 }
532
533 /* Add a new entry to the list of dynamic relocations against DYN_H.
534
535    We use this to keep a record of all the FPTR relocations against a
536    particular symbol so that we can create FPTR relocations in the
537    output file.  */
538
539 static boolean
540 count_dyn_reloc (abfd, dyn_h, type, sec, sec_symndx, offset, addend)
541      bfd *abfd;
542      struct elf64_hppa_dyn_hash_entry *dyn_h;
543      int type;
544      asection *sec;
545      int sec_symndx;
546      bfd_vma offset;
547      bfd_vma addend;
548 {
549   struct elf64_hppa_dyn_reloc_entry *rent;
550
551   rent = (struct elf64_hppa_dyn_reloc_entry *)
552   bfd_alloc (abfd, sizeof (*rent));
553   if (!rent)
554     return false;
555
556   rent->next = dyn_h->reloc_entries;
557   rent->type = type;
558   rent->sec = sec;
559   rent->sec_symndx = sec_symndx;
560   rent->offset = offset;
561   rent->addend = addend;
562   dyn_h->reloc_entries = rent;
563
564   return true;
565 }
566
567 /* Scan the RELOCS and record the type of dynamic entries that each
568    referenced symbol needs.  */
569
570 static boolean
571 elf64_hppa_check_relocs (abfd, info, sec, relocs)
572      bfd *abfd;
573      struct bfd_link_info *info;
574      asection *sec;
575      const Elf_Internal_Rela *relocs;
576 {
577   struct elf64_hppa_link_hash_table *hppa_info;
578   const Elf_Internal_Rela *relend;
579   Elf_Internal_Shdr *symtab_hdr;
580   const Elf_Internal_Rela *rel;
581   asection *dlt, *plt, *stubs;
582   char *buf;
583   size_t buf_len;
584   int sec_symndx;
585
586   if (info->relocateable)
587     return true;
588
589   /* If this is the first dynamic object found in the link, create
590      the special sections required for dynamic linking.  */
591   if (! elf_hash_table (info)->dynamic_sections_created)
592     {
593       if (! bfd_elf64_link_create_dynamic_sections (abfd, info))
594         return false;
595     }
596
597   hppa_info = elf64_hppa_hash_table (info);
598   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
599
600   /* If necessary, build a new table holding section symbols indices
601      for this BFD.  This is disgusting.  */
602
603   if (info->shared && hppa_info->section_syms_bfd != abfd)
604     {
605       unsigned long i;
606       int highest_shndx;
607       Elf_Internal_Sym *local_syms, *isym;
608       Elf64_External_Sym *ext_syms, *esym;
609
610       /* We're done with the old cache of section index to section symbol
611          index information.  Free it.
612
613          ?!? Note we leak the last section_syms array.  Presumably we
614          could free it in one of the later routines in this file.  */
615       if (hppa_info->section_syms)
616         free (hppa_info->section_syms);
617
618       /* Allocate memory for the internal and external symbols.  */
619       local_syms
620         = (Elf_Internal_Sym *) bfd_malloc (symtab_hdr->sh_info
621                                            * sizeof (Elf_Internal_Sym));
622       if (local_syms == NULL)
623         return false;
624
625       ext_syms
626         = (Elf64_External_Sym *) bfd_malloc (symtab_hdr->sh_info
627                                              * sizeof (Elf64_External_Sym));
628       if (ext_syms == NULL)
629         {
630           free (local_syms);
631           return false;
632         }
633
634       /* Read in the local symbols.  */
635       if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
636           || bfd_read (ext_syms, 1,
637                        (symtab_hdr->sh_info
638                         * sizeof (Elf64_External_Sym)), abfd)
639           != (symtab_hdr->sh_info * sizeof (Elf64_External_Sym)))
640         {
641           free (local_syms);
642           free (ext_syms);
643           return false;
644         }
645
646       /* Swap in the local symbols, also record the highest section index
647          referenced by the local symbols.  */
648       isym = local_syms;
649       esym = ext_syms;
650       highest_shndx = 0;
651       for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++)
652         {
653           bfd_elf64_swap_symbol_in (abfd, esym, isym);
654           if (isym->st_shndx > highest_shndx)
655             highest_shndx = isym->st_shndx;
656         }
657
658       /* Now we can free the external symbols.  */
659       free (ext_syms);
660
661       /* Allocate an array to hold the section index to section symbol index
662          mapping.  Bump by one since we start counting at zero.  */
663       highest_shndx++;
664       hppa_info->section_syms = (int *) bfd_malloc (highest_shndx
665                                                     * sizeof (int));
666
667       /* Now walk the local symbols again.  If we find a section symbol,
668          record the index of the symbol into the section_syms array.  */
669       for (isym = local_syms, i = 0; i < symtab_hdr->sh_info; i++, isym++)
670         {
671           if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
672             hppa_info->section_syms[isym->st_shndx] = i;
673         }
674
675       /* We are finished with the local symbols.  Get rid of them.  */
676       free (local_syms);
677
678       /* Record which BFD we built the section_syms mapping for.  */
679       hppa_info->section_syms_bfd = abfd;
680     }
681
682   /* Record the symbol index for this input section.  We may need it for
683      relocations when building shared libraries.  When not building shared
684      libraries this value is never really used, but assign it to zero to
685      prevent out of bounds memory accesses in other routines.  */
686   if (info->shared)
687     {
688       sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
689
690       /* If we did not find a section symbol for this section, then
691          something went terribly wrong above.  */
692       if (sec_symndx == -1)
693         return false;
694
695       sec_symndx = hppa_info->section_syms[sec_symndx];
696     }
697   else
698     sec_symndx = 0;
699
700   dlt = plt = stubs = NULL;
701   buf = NULL;
702   buf_len = 0;
703
704   relend = relocs + sec->reloc_count;
705   for (rel = relocs; rel < relend; ++rel)
706     {
707       enum {
708         NEED_DLT = 1,
709         NEED_PLT = 2,
710         NEED_STUB = 4,
711         NEED_OPD = 8,
712         NEED_DYNREL = 16,
713       };
714
715       struct elf_link_hash_entry *h = NULL;
716       unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
717       struct elf64_hppa_dyn_hash_entry *dyn_h;
718       int need_entry;
719       const char *addr_name;
720       boolean maybe_dynamic;
721       int dynrel_type = R_PARISC_NONE;
722       static reloc_howto_type *howto;
723
724       if (r_symndx >= symtab_hdr->sh_info)
725         {
726           /* We're dealing with a global symbol -- find its hash entry
727              and mark it as being referenced.  */
728           long indx = r_symndx - symtab_hdr->sh_info;
729           h = elf_sym_hashes (abfd)[indx];
730           while (h->root.type == bfd_link_hash_indirect
731                  || h->root.type == bfd_link_hash_warning)
732             h = (struct elf_link_hash_entry *) h->root.u.i.link;
733
734           h->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
735         }
736
737       /* We can only get preliminary data on whether a symbol is
738          locally or externally defined, as not all of the input files
739          have yet been processed.  Do something with what we know, as
740          this may help reduce memory usage and processing time later.  */
741       maybe_dynamic = false;
742       if (h && ((info->shared && ! info->symbolic)
743                 || ! (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
744                 || h->root.type == bfd_link_hash_defweak))
745         maybe_dynamic = true;
746
747       howto = elf_hppa_howto_table + ELF64_R_TYPE (rel->r_info);
748       need_entry = 0;
749       switch (howto->type)
750         {
751         /* These are simple indirect references to symbols through the
752            DLT.  We need to create a DLT entry for any symbols which
753            appears in a DLTIND relocation.  */
754         case R_PARISC_DLTIND21L:
755         case R_PARISC_DLTIND14R:
756         case R_PARISC_DLTIND14F:
757         case R_PARISC_DLTIND14WR:
758         case R_PARISC_DLTIND14DR:
759           need_entry = NEED_DLT;
760           break;
761
762         /* ?!?  These need a DLT entry.  But I have no idea what to do with
763            the "link time TP value.  */
764         case R_PARISC_LTOFF_TP21L:
765         case R_PARISC_LTOFF_TP14R:
766         case R_PARISC_LTOFF_TP14F:
767         case R_PARISC_LTOFF_TP64:
768         case R_PARISC_LTOFF_TP14WR:
769         case R_PARISC_LTOFF_TP14DR:
770         case R_PARISC_LTOFF_TP16F:
771         case R_PARISC_LTOFF_TP16WF:
772         case R_PARISC_LTOFF_TP16DF:
773           need_entry = NEED_DLT;
774           break;
775
776         /* These are function calls.  Depending on their precise target we
777            may need to make a stub for them.  The stub uses the PLT, so we
778            need to create PLT entries for these symbols too.  */
779         case R_PARISC_PCREL12F:
780         case R_PARISC_PCREL17F:
781         case R_PARISC_PCREL22F:
782         case R_PARISC_PCREL32:
783         case R_PARISC_PCREL64:
784         case R_PARISC_PCREL21L:
785         case R_PARISC_PCREL17R:
786         case R_PARISC_PCREL17C:
787         case R_PARISC_PCREL14R:
788         case R_PARISC_PCREL14F:
789         case R_PARISC_PCREL22C:
790         case R_PARISC_PCREL14WR:
791         case R_PARISC_PCREL14DR:
792         case R_PARISC_PCREL16F:
793         case R_PARISC_PCREL16WF:
794         case R_PARISC_PCREL16DF:
795           need_entry = (NEED_PLT | NEED_STUB);
796           break;
797
798         case R_PARISC_PLTOFF21L:
799         case R_PARISC_PLTOFF14R:
800         case R_PARISC_PLTOFF14F:
801         case R_PARISC_PLTOFF14WR:
802         case R_PARISC_PLTOFF14DR:
803         case R_PARISC_PLTOFF16F:
804         case R_PARISC_PLTOFF16WF:
805         case R_PARISC_PLTOFF16DF:
806           need_entry = (NEED_PLT);
807           break;
808
809         case R_PARISC_DIR64:
810           if (info->shared || maybe_dynamic)
811             need_entry = (NEED_DYNREL);
812           dynrel_type = R_PARISC_DIR64;
813           break;
814
815         /* This is an indirect reference through the DLT to get the address
816            of a OPD descriptor.  Thus we need to make a DLT entry that points
817            to an OPD entry.  */
818         case R_PARISC_LTOFF_FPTR21L:
819         case R_PARISC_LTOFF_FPTR14R:
820         case R_PARISC_LTOFF_FPTR14WR:
821         case R_PARISC_LTOFF_FPTR14DR:
822         case R_PARISC_LTOFF_FPTR32:
823         case R_PARISC_LTOFF_FPTR64:
824         case R_PARISC_LTOFF_FPTR16F:
825         case R_PARISC_LTOFF_FPTR16WF:
826         case R_PARISC_LTOFF_FPTR16DF:
827           if (info->shared || maybe_dynamic)
828             need_entry = (NEED_DLT | NEED_OPD);
829           else
830             need_entry = (NEED_DLT | NEED_OPD);
831           dynrel_type = R_PARISC_FPTR64;
832           break;
833
834         /* This is a simple OPD entry.  */
835         case R_PARISC_FPTR64:
836           if (info->shared || maybe_dynamic)
837             need_entry = (NEED_OPD | NEED_DYNREL);
838           else
839             need_entry = (NEED_OPD);
840           dynrel_type = R_PARISC_FPTR64;
841           break;
842
843         /* Add more cases as needed.  */
844         }
845
846       if (!need_entry)
847         continue;
848
849       /* Collect a canonical name for this address.  */
850       addr_name = get_dyn_name (sec, h, rel, &buf, &buf_len);
851
852       /* Collect the canonical entry data for this address.  */
853       dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
854                                           addr_name, true, true);
855       BFD_ASSERT (dyn_h);
856
857       /* Stash away enough information to be able to find this symbol
858          regardless of whether or not it is local or global.  */
859       dyn_h->h = h;
860       dyn_h->owner = abfd;
861       dyn_h->sym_indx = r_symndx;
862
863       /* ?!? We may need to do some error checking in here.  */
864       /* Create what's needed.  */
865       if (need_entry & NEED_DLT)
866         {
867           if (! hppa_info->dlt_sec
868               && ! get_dlt (abfd, info, hppa_info))
869             goto err_out;
870           dyn_h->want_dlt = 1;
871         }
872
873       if (need_entry & NEED_PLT)
874         {
875           if (! hppa_info->plt_sec
876               && ! get_plt (abfd, info, hppa_info))
877             goto err_out;
878           dyn_h->want_plt = 1;
879         }
880
881       if (need_entry & NEED_STUB)
882         {
883           if (! hppa_info->stub_sec
884               && ! get_stub (abfd, info, hppa_info))
885             goto err_out;
886           dyn_h->want_stub = 1;
887         }
888
889       if (need_entry & NEED_OPD)
890         {
891           if (! hppa_info->opd_sec
892               && ! get_opd (abfd, info, hppa_info))
893             goto err_out;
894
895           dyn_h->want_opd = 1;
896
897           /* FPTRs are not allocated by the dynamic linker for PA64, though
898              it is possible that will change in the future.  */
899
900           /* This could be a local function that had its address taken, in
901              which case H will be NULL.  */
902           if (h)
903             h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
904         }
905
906       /* Add a new dynamic relocation to the chain of dynamic
907          relocations for this symbol.  */
908       if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
909         {
910           if (! hppa_info->other_rel_sec
911               && ! get_reloc_section (abfd, hppa_info, sec))
912             goto err_out;
913
914           if (!count_dyn_reloc (abfd, dyn_h, dynrel_type, sec,
915                                 sec_symndx, rel->r_offset, rel->r_addend))
916             goto err_out;
917
918           /* If we are building a shared library and we just recorded
919              a dynamic R_PARISC_FPTR64 relocation, then make sure the
920              section symbol for this section ends up in the dynamic
921              symbol table.  */
922           if (info->shared && dynrel_type == R_PARISC_FPTR64
923               && ! (_bfd_elf64_link_record_local_dynamic_symbol
924                     (info, abfd, sec_symndx)))
925             return false;
926         }
927     }
928
929   if (buf)
930     free (buf);
931   return true;
932
933  err_out:
934   if (buf)
935     free (buf);
936   return false;
937 }
938
939 struct elf64_hppa_allocate_data
940 {
941   struct bfd_link_info *info;
942   bfd_size_type ofs;
943 };
944
945 /* Should we do dynamic things to this symbol?  */
946
947 static boolean
948 elf64_hppa_dynamic_symbol_p (h, info)
949      struct elf_link_hash_entry *h;
950      struct bfd_link_info *info;
951 {
952   if (h == NULL)
953     return false;
954
955   while (h->root.type == bfd_link_hash_indirect
956          || h->root.type == bfd_link_hash_warning)
957     h = (struct elf_link_hash_entry *) h->root.u.i.link;
958
959   if (h->dynindx == -1)
960     return false;
961
962   if (h->root.type == bfd_link_hash_undefweak
963       || h->root.type == bfd_link_hash_defweak)
964     return true;
965
966   if (h->root.root.string[0] == '$' && h->root.root.string[1] == '$')
967     return false;
968
969   if ((info->shared && !info->symbolic)
970       || ((h->elf_link_hash_flags
971            & (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR))
972           == (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR)))
973     return true;
974
975   return false;
976 }
977
978 /* Mark all funtions exported by this file so that we can later allocate
979    entries in .opd for them.  */
980
981 static boolean
982 elf64_hppa_mark_exported_functions (h, data)
983      struct elf_link_hash_entry *h;
984      PTR data;
985 {
986   struct bfd_link_info *info = (struct bfd_link_info *)data;
987   struct elf64_hppa_link_hash_table *hppa_info;
988
989   hppa_info = elf64_hppa_hash_table (info);
990
991   if (h
992       && (h->root.type == bfd_link_hash_defined
993           || h->root.type == bfd_link_hash_defweak)
994       && h->root.u.def.section->output_section != NULL
995       && h->type == STT_FUNC)
996     {
997        struct elf64_hppa_dyn_hash_entry *dyn_h;
998
999       /* Add this symbol to the PA64 linker hash table.  */
1000       dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1001                                           h->root.root.string, true, true);
1002       BFD_ASSERT (dyn_h);
1003       dyn_h->h = h;
1004
1005       if (! hppa_info->opd_sec
1006           && ! get_opd (hppa_info->root.dynobj, info, hppa_info))
1007         return false;
1008
1009       dyn_h->want_opd = 1;
1010       /* Put a flag here for output_symbol_hook.  */
1011       dyn_h->st_shndx = -1;
1012       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
1013     }
1014
1015   return true;
1016 }
1017
1018 /* Allocate space for a DLT entry.  */
1019
1020 static boolean
1021 allocate_global_data_dlt (dyn_h, data)
1022      struct elf64_hppa_dyn_hash_entry *dyn_h;
1023      PTR data;
1024 {
1025   struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1026
1027   if (dyn_h->want_dlt)
1028     {
1029       struct elf_link_hash_entry *h = dyn_h->h;
1030
1031       if (x->info->shared)
1032         {
1033           /* Possibly add the symbol to the local dynamic symbol
1034              table since we might need to create a dynamic relocation
1035              against it.  */
1036           if (! h
1037               || (h && h->dynindx == -1))
1038             {
1039               bfd *owner;
1040               owner = (h ? h->root.u.def.section->owner : dyn_h->owner);
1041
1042               if (!_bfd_elf64_link_record_local_dynamic_symbol
1043                     (x->info, owner, dyn_h->sym_indx))
1044                 return false;
1045             }
1046         }
1047
1048       dyn_h->dlt_offset = x->ofs;
1049       x->ofs += DLT_ENTRY_SIZE;
1050     }
1051   return true;
1052 }
1053
1054 /* Allocate space for a DLT.PLT entry.  */
1055
1056 static boolean
1057 allocate_global_data_plt (dyn_h, data)
1058      struct elf64_hppa_dyn_hash_entry *dyn_h;
1059      PTR data;
1060 {
1061   struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1062
1063   if (dyn_h->want_plt
1064       && elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info)
1065       && !((dyn_h->h->root.type == bfd_link_hash_defined
1066             || dyn_h->h->root.type == bfd_link_hash_defweak)
1067            && dyn_h->h->root.u.def.section->output_section != NULL))
1068     {
1069       dyn_h->plt_offset = x->ofs;
1070       x->ofs += PLT_ENTRY_SIZE;
1071       if (dyn_h->plt_offset < 0x2000)
1072         elf64_hppa_hash_table (x->info)->gp_offset = dyn_h->plt_offset;
1073     }
1074   else
1075     dyn_h->want_plt = 0;
1076
1077   return true;
1078 }
1079
1080 /* Allocate space for a STUB entry.  */
1081
1082 static boolean
1083 allocate_global_data_stub (dyn_h, data)
1084      struct elf64_hppa_dyn_hash_entry *dyn_h;
1085      PTR data;
1086 {
1087   struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1088
1089   if (dyn_h->want_stub
1090       && elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info)
1091       && !((dyn_h->h->root.type == bfd_link_hash_defined
1092             || dyn_h->h->root.type == bfd_link_hash_defweak)
1093            && dyn_h->h->root.u.def.section->output_section != NULL))
1094     {
1095       dyn_h->stub_offset = x->ofs;
1096       x->ofs += sizeof (plt_stub);
1097     }
1098   else
1099     dyn_h->want_stub = 0;
1100   return true;
1101 }
1102
1103 /* Allocate space for a FPTR entry.  */
1104
1105 static boolean
1106 allocate_global_data_opd (dyn_h, data)
1107      struct elf64_hppa_dyn_hash_entry *dyn_h;
1108      PTR data;
1109 {
1110   struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1111
1112   if (dyn_h->want_opd)
1113     {
1114       struct elf_link_hash_entry *h = dyn_h->h;
1115
1116       if (h)
1117         while (h->root.type == bfd_link_hash_indirect
1118                || h->root.type == bfd_link_hash_warning)
1119           h = (struct elf_link_hash_entry *) h->root.u.i.link;
1120
1121       /* We never need an opd entry for a symbol which is not
1122          defined by this output file.  */
1123       if (h && h->root.type == bfd_link_hash_undefined)
1124         dyn_h->want_opd = 0;
1125
1126       /* If we are creating a shared library, took the address of a local
1127          function or might export this function from this object file, then
1128          we have to create an opd descriptor.  */
1129       else if (x->info->shared
1130                || h == NULL
1131                || h->dynindx == -1
1132                || ((h->root.type == bfd_link_hash_defined
1133                     || h->root.type == bfd_link_hash_defweak)
1134                    && h->root.u.def.section->output_section != NULL))
1135         {
1136           /* If we are creating a shared library, then we will have to
1137              create a runtime relocation for the symbol to properly
1138              initialize the .opd entry.  Make sure the symbol gets
1139              added to the dynamic symbol table.  */
1140           if (x->info->shared
1141               && (h == NULL || (h->dynindx == -1)))
1142             {
1143               bfd *owner;
1144               owner = (h ? h->root.u.def.section->owner : dyn_h->owner);
1145
1146               if (!_bfd_elf64_link_record_local_dynamic_symbol
1147                     (x->info, owner, dyn_h->sym_indx))
1148                 return false;
1149             }
1150
1151           /* This may not be necessary or desirable anymore now that
1152              we have some support for dealing with section symbols
1153              in dynamic relocs.  But name munging does make the result
1154              much easier to debug.  ie, the EPLT reloc will reference
1155              a symbol like .foobar, instead of .text + offset.  */
1156           if (x->info->shared && h)
1157             {
1158               char *new_name;
1159               struct elf_link_hash_entry *nh;
1160
1161               new_name = alloca (strlen (h->root.root.string) + 2);
1162               new_name[0] = '.';
1163               strcpy (new_name + 1, h->root.root.string);
1164
1165               nh = elf_link_hash_lookup (elf_hash_table (x->info),
1166                                          new_name, true, true, true);
1167
1168               nh->root.type = h->root.type;
1169               nh->root.u.def.value = h->root.u.def.value;
1170               nh->root.u.def.section = h->root.u.def.section;
1171
1172               if (! bfd_elf64_link_record_dynamic_symbol (x->info, nh))
1173                 return false;
1174
1175              }
1176           dyn_h->opd_offset = x->ofs;
1177           x->ofs += OPD_ENTRY_SIZE;
1178         }
1179
1180       /* Otherwise we do not need an opd entry.  */
1181       else
1182         dyn_h->want_opd = 0;
1183     }
1184   return true;
1185 }
1186
1187 /* HP requires the EI_OSABI field to be filled in.  The assignment to
1188    EI_ABIVERSION may not be strictly necessary.  */
1189
1190 static void
1191 elf64_hppa_post_process_headers (abfd, link_info)
1192      bfd * abfd;
1193      struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
1194 {
1195   Elf_Internal_Ehdr * i_ehdrp;
1196
1197   i_ehdrp = elf_elfheader (abfd);
1198
1199   if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
1200     {
1201       i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
1202     }
1203   else
1204     {
1205       i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
1206       i_ehdrp->e_ident[EI_ABIVERSION] = 1;
1207     }
1208 }
1209
1210 /* Create function descriptor section (.opd).  This section is called .opd
1211    because it contains "official prodecure descriptors".  The "official"
1212    refers to the fact that these descriptors are used when taking the address
1213    of a procedure, thus ensuring a unique address for each procedure.  */
1214
1215 static boolean
1216 get_opd (abfd, info, hppa_info)
1217      bfd *abfd;
1218      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1219      struct elf64_hppa_link_hash_table *hppa_info;
1220 {
1221   asection *opd;
1222   bfd *dynobj;
1223
1224   opd = hppa_info->opd_sec;
1225   if (!opd)
1226     {
1227       dynobj = hppa_info->root.dynobj;
1228       if (!dynobj)
1229         hppa_info->root.dynobj = dynobj = abfd;
1230
1231       opd = bfd_make_section (dynobj, ".opd");
1232       if (!opd
1233           || !bfd_set_section_flags (dynobj, opd,
1234                                      (SEC_ALLOC
1235                                       | SEC_LOAD
1236                                       | SEC_HAS_CONTENTS
1237                                       | SEC_IN_MEMORY
1238                                       | SEC_LINKER_CREATED))
1239           || !bfd_set_section_alignment (abfd, opd, 3))
1240         {
1241           BFD_ASSERT (0);
1242           return false;
1243         }
1244
1245       hppa_info->opd_sec = opd;
1246     }
1247
1248   return true;
1249 }
1250
1251 /* Create the PLT section.  */
1252
1253 static boolean
1254 get_plt (abfd, info, hppa_info)
1255      bfd *abfd;
1256      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1257      struct elf64_hppa_link_hash_table *hppa_info;
1258 {
1259   asection *plt;
1260   bfd *dynobj;
1261
1262   plt = hppa_info->plt_sec;
1263   if (!plt)
1264     {
1265       dynobj = hppa_info->root.dynobj;
1266       if (!dynobj)
1267         hppa_info->root.dynobj = dynobj = abfd;
1268
1269       plt = bfd_make_section (dynobj, ".plt");
1270       if (!plt
1271           || !bfd_set_section_flags (dynobj, plt,
1272                                      (SEC_ALLOC
1273                                       | SEC_LOAD
1274                                       | SEC_HAS_CONTENTS
1275                                       | SEC_IN_MEMORY
1276                                       | SEC_LINKER_CREATED))
1277           || !bfd_set_section_alignment (abfd, plt, 3))
1278         {
1279           BFD_ASSERT (0);
1280           return false;
1281         }
1282
1283       hppa_info->plt_sec = plt;
1284     }
1285
1286   return true;
1287 }
1288
1289 /* Create the DLT section.  */
1290
1291 static boolean
1292 get_dlt (abfd, info, hppa_info)
1293      bfd *abfd;
1294      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1295      struct elf64_hppa_link_hash_table *hppa_info;
1296 {
1297   asection *dlt;
1298   bfd *dynobj;
1299
1300   dlt = hppa_info->dlt_sec;
1301   if (!dlt)
1302     {
1303       dynobj = hppa_info->root.dynobj;
1304       if (!dynobj)
1305         hppa_info->root.dynobj = dynobj = abfd;
1306
1307       dlt = bfd_make_section (dynobj, ".dlt");
1308       if (!dlt
1309           || !bfd_set_section_flags (dynobj, dlt,
1310                                      (SEC_ALLOC
1311                                       | SEC_LOAD
1312                                       | SEC_HAS_CONTENTS
1313                                       | SEC_IN_MEMORY
1314                                       | SEC_LINKER_CREATED))
1315           || !bfd_set_section_alignment (abfd, dlt, 3))
1316         {
1317           BFD_ASSERT (0);
1318           return false;
1319         }
1320
1321       hppa_info->dlt_sec = dlt;
1322     }
1323
1324   return true;
1325 }
1326
1327 /* Create the stubs section.  */
1328
1329 static boolean
1330 get_stub (abfd, info, hppa_info)
1331      bfd *abfd;
1332      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1333      struct elf64_hppa_link_hash_table *hppa_info;
1334 {
1335   asection *stub;
1336   bfd *dynobj;
1337
1338   stub = hppa_info->stub_sec;
1339   if (!stub)
1340     {
1341       dynobj = hppa_info->root.dynobj;
1342       if (!dynobj)
1343         hppa_info->root.dynobj = dynobj = abfd;
1344
1345       stub = bfd_make_section (dynobj, ".stub");
1346       if (!stub
1347           || !bfd_set_section_flags (dynobj, stub,
1348                                      (SEC_ALLOC
1349                                       | SEC_LOAD
1350                                       | SEC_HAS_CONTENTS
1351                                       | SEC_IN_MEMORY
1352                                       | SEC_READONLY
1353                                       | SEC_LINKER_CREATED))
1354           || !bfd_set_section_alignment (abfd, stub, 3))
1355         {
1356           BFD_ASSERT (0);
1357           return false;
1358         }
1359
1360       hppa_info->stub_sec = stub;
1361     }
1362
1363   return true;
1364 }
1365
1366 /* Create sections necessary for dynamic linking.  This is only a rough
1367    cut and will likely change as we learn more about the somewhat
1368    unusual dynamic linking scheme HP uses.
1369
1370    .stub:
1371         Contains code to implement cross-space calls.  The first time one
1372         of the stubs is used it will call into the dynamic linker, later
1373         calls will go straight to the target.
1374
1375         The only stub we support right now looks like
1376
1377         ldd OFFSET(%dp),%r1
1378         bve %r0(%r1)
1379         ldd OFFSET+8(%dp),%dp
1380
1381         Other stubs may be needed in the future.  We may want the remove
1382         the break/nop instruction.  It is only used right now to keep the
1383         offset of a .plt entry and a .stub entry in sync.
1384
1385    .dlt:
1386         This is what most people call the .got.  HP used a different name.
1387         Losers.
1388
1389    .rela.dlt:
1390         Relocations for the DLT.
1391
1392    .plt:
1393         Function pointers as address,gp pairs.
1394
1395    .rela.plt:
1396         Should contain dynamic IPLT (and EPLT?) relocations.
1397
1398    .opd:
1399         FPTRS
1400
1401    .rela.opd:
1402         EPLT relocations for symbols exported from shared libraries.  */
1403
1404 static boolean
1405 elf64_hppa_create_dynamic_sections (abfd, info)
1406      bfd *abfd;
1407      struct bfd_link_info *info;
1408 {
1409   asection *s;
1410
1411   if (! get_stub (abfd, info, elf64_hppa_hash_table (info)))
1412     return false;
1413
1414   if (! get_dlt (abfd, info, elf64_hppa_hash_table (info)))
1415     return false;
1416
1417   if (! get_plt (abfd, info, elf64_hppa_hash_table (info)))
1418     return false;
1419
1420   if (! get_opd (abfd, info, elf64_hppa_hash_table (info)))
1421     return false;
1422
1423   s = bfd_make_section(abfd, ".rela.dlt");
1424   if (s == NULL
1425       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1426                                            | SEC_HAS_CONTENTS
1427                                            | SEC_IN_MEMORY
1428                                            | SEC_READONLY
1429                                            | SEC_LINKER_CREATED))
1430       || !bfd_set_section_alignment (abfd, s, 3))
1431     return false;
1432   elf64_hppa_hash_table (info)->dlt_rel_sec = s;
1433
1434   s = bfd_make_section(abfd, ".rela.plt");
1435   if (s == NULL
1436       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1437                                            | SEC_HAS_CONTENTS
1438                                            | SEC_IN_MEMORY
1439                                            | SEC_READONLY
1440                                            | SEC_LINKER_CREATED))
1441       || !bfd_set_section_alignment (abfd, s, 3))
1442     return false;
1443   elf64_hppa_hash_table (info)->plt_rel_sec = s;
1444
1445   s = bfd_make_section(abfd, ".rela.data");
1446   if (s == NULL
1447       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1448                                            | SEC_HAS_CONTENTS
1449                                            | SEC_IN_MEMORY
1450                                            | SEC_READONLY
1451                                            | SEC_LINKER_CREATED))
1452       || !bfd_set_section_alignment (abfd, s, 3))
1453     return false;
1454   elf64_hppa_hash_table (info)->other_rel_sec = s;
1455
1456   s = bfd_make_section(abfd, ".rela.opd");
1457   if (s == NULL
1458       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1459                                            | SEC_HAS_CONTENTS
1460                                            | SEC_IN_MEMORY
1461                                            | SEC_READONLY
1462                                            | SEC_LINKER_CREATED))
1463       || !bfd_set_section_alignment (abfd, s, 3))
1464     return false;
1465   elf64_hppa_hash_table (info)->opd_rel_sec = s;
1466
1467   return true;
1468 }
1469
1470 /* Allocate dynamic relocations for those symbols that turned out
1471    to be dynamic.  */
1472
1473 static boolean
1474 allocate_dynrel_entries (dyn_h, data)
1475      struct elf64_hppa_dyn_hash_entry *dyn_h;
1476      PTR data;
1477 {
1478   struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1479   struct elf64_hppa_link_hash_table *hppa_info;
1480   struct elf64_hppa_dyn_reloc_entry *rent;
1481   boolean dynamic_symbol, shared;
1482
1483   hppa_info = elf64_hppa_hash_table (x->info);
1484   dynamic_symbol = elf64_hppa_dynamic_symbol_p (dyn_h->h, x->info);
1485   shared = x->info->shared;
1486
1487   /* We may need to allocate relocations for a non-dynamic symbol
1488      when creating a shared library.  */
1489   if (!dynamic_symbol && !shared)
1490     return true;
1491
1492   /* Take care of the normal data relocations.  */
1493
1494   for (rent = dyn_h->reloc_entries; rent; rent = rent->next)
1495     {
1496       switch (rent->type)
1497         {
1498         case R_PARISC_FPTR64:
1499           /* Allocate one iff we are not building a shared library and
1500              !want_opd, which by this point will be true only if we're
1501              actually allocating one statically in the main executable.  */
1502           if (!x->info->shared && dyn_h->want_opd)
1503             continue;
1504           break;
1505         }
1506       hppa_info->other_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1507
1508       /* Make sure this symbol gets into the dynamic symbol table if it is
1509          not already recorded.  ?!? This should not be in the loop since
1510          the symbol need only be added once.  */
1511       if (dyn_h->h == 0 || dyn_h->h->dynindx == -1)
1512         if (!_bfd_elf64_link_record_local_dynamic_symbol
1513             (x->info, rent->sec->owner, dyn_h->sym_indx))
1514           return false;
1515     }
1516
1517   /* Take care of the GOT and PLT relocations.  */
1518
1519   if ((dynamic_symbol || shared) && dyn_h->want_dlt)
1520     hppa_info->dlt_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1521
1522   /* If we are building a shared library, then every symbol that has an
1523      opd entry will need an EPLT relocation to relocate the symbol's address
1524      and __gp value based on the runtime load address.  */
1525   if (shared && dyn_h->want_opd)
1526     hppa_info->opd_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1527
1528   if (dyn_h->want_plt && dynamic_symbol)
1529     {
1530       bfd_size_type t = 0;
1531
1532       /* Dynamic symbols get one IPLT relocation.  Local symbols in
1533          shared libraries get two REL relocations.  Local symbols in
1534          main applications get nothing.  */
1535       if (dynamic_symbol)
1536         t = sizeof (Elf64_External_Rela);
1537       else if (shared)
1538         t = 2 * sizeof (Elf64_External_Rela);
1539
1540       hppa_info->plt_rel_sec->_raw_size += t;
1541     }
1542
1543   return true;
1544 }
1545
1546 /* Adjust a symbol defined by a dynamic object and referenced by a
1547    regular object.  */
1548
1549 static boolean
1550 elf64_hppa_adjust_dynamic_symbol (info, h)
1551      struct bfd_link_info *info ATTRIBUTE_UNUSED;
1552      struct elf_link_hash_entry *h;
1553 {
1554   /* ??? Undefined symbols with PLT entries should be re-defined
1555      to be the PLT entry.  */
1556
1557   /* If this is a weak symbol, and there is a real definition, the
1558      processor independent code will have arranged for us to see the
1559      real definition first, and we can just use the same value.  */
1560   if (h->weakdef != NULL)
1561     {
1562       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1563                   || h->weakdef->root.type == bfd_link_hash_defweak);
1564       h->root.u.def.section = h->weakdef->root.u.def.section;
1565       h->root.u.def.value = h->weakdef->root.u.def.value;
1566       return true;
1567     }
1568
1569   /* If this is a reference to a symbol defined by a dynamic object which
1570      is not a function, we might allocate the symbol in our .dynbss section
1571      and allocate a COPY dynamic relocation.
1572
1573      But PA64 code is canonically PIC, so as a rule we can avoid this sort
1574      of hackery.  */
1575
1576   return true;
1577 }
1578
1579 /* Set the final sizes of the dynamic sections and allocate memory for
1580    the contents of our special sections.  */
1581
1582 static boolean
1583 elf64_hppa_size_dynamic_sections (output_bfd, info)
1584      bfd *output_bfd;
1585      struct bfd_link_info *info;
1586 {
1587   bfd *dynobj;
1588   asection *s;
1589   boolean plt;
1590   boolean relocs;
1591   boolean reltext;
1592   struct elf64_hppa_allocate_data data;
1593   struct elf64_hppa_link_hash_table *hppa_info;
1594
1595   hppa_info = elf64_hppa_hash_table (info);
1596
1597   dynobj = elf_hash_table (info)->dynobj;
1598   BFD_ASSERT (dynobj != NULL);
1599
1600   if (elf_hash_table (info)->dynamic_sections_created)
1601     {
1602       /* Set the contents of the .interp section to the interpreter.  */
1603       if (! info->shared)
1604         {
1605           s = bfd_get_section_by_name (dynobj, ".interp");
1606           BFD_ASSERT (s != NULL);
1607           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1608           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1609         }
1610     }
1611   else
1612     {
1613       /* We may have created entries in the .rela.got section.
1614          However, if we are not creating the dynamic sections, we will
1615          not actually use these entries.  Reset the size of .rela.dlt,
1616          which will cause it to get stripped from the output file
1617          below.  */
1618       s = bfd_get_section_by_name (dynobj, ".rela.dlt");
1619       if (s != NULL)
1620         s->_raw_size = 0;
1621     }
1622
1623   /* Allocate the GOT entries.  */
1624
1625   data.info = info;
1626   if (elf64_hppa_hash_table (info)->dlt_sec)
1627     {
1628       data.ofs = 0x0;
1629       elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1630                                     allocate_global_data_dlt, &data);
1631       hppa_info->dlt_sec->_raw_size = data.ofs;
1632
1633       data.ofs = 0x0;
1634       elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1635                                     allocate_global_data_plt, &data);
1636       hppa_info->plt_sec->_raw_size = data.ofs;
1637
1638       data.ofs = 0x0;
1639       elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1640                                     allocate_global_data_stub, &data);
1641       hppa_info->stub_sec->_raw_size = data.ofs;
1642     }
1643
1644   /* Mark each function this program exports so that we will allocate
1645      space in the .opd section for each function's FPTR.
1646
1647      We have to traverse the main linker hash table since we have to
1648      find functions which may not have been mentioned in any relocs.  */
1649   elf_link_hash_traverse (elf_hash_table (info),
1650                           elf64_hppa_mark_exported_functions,
1651                           info);
1652
1653   /* Allocate space for entries in the .opd section.  */
1654   if (elf64_hppa_hash_table (info)->opd_sec)
1655     {
1656       data.ofs = 0;
1657       elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1658                                     allocate_global_data_opd, &data);
1659       hppa_info->opd_sec->_raw_size = data.ofs;
1660     }
1661
1662   /* Now allocate space for dynamic relocations, if necessary.  */
1663   if (hppa_info->root.dynamic_sections_created)
1664     elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
1665                                   allocate_dynrel_entries, &data);
1666
1667   /* The sizes of all the sections are set.  Allocate memory for them.  */
1668   plt = false;
1669   relocs = false;
1670   reltext = false;
1671   for (s = dynobj->sections; s != NULL; s = s->next)
1672     {
1673       const char *name;
1674       boolean strip;
1675
1676       if ((s->flags & SEC_LINKER_CREATED) == 0)
1677         continue;
1678
1679       /* It's OK to base decisions on the section name, because none
1680          of the dynobj section names depend upon the input files.  */
1681       name = bfd_get_section_name (dynobj, s);
1682
1683       strip = 0;
1684
1685       if (strcmp (name, ".plt") == 0)
1686         {
1687           if (s->_raw_size == 0)
1688             {
1689               /* Strip this section if we don't need it; see the
1690                  comment below.  */
1691               strip = true;
1692             }
1693           else
1694             {
1695               /* Remember whether there is a PLT.  */
1696               plt = true;
1697             }
1698         }
1699       else if (strcmp (name, ".dlt") == 0)
1700         {
1701           if (s->_raw_size == 0)
1702             {
1703               /* Strip this section if we don't need it; see the
1704                  comment below.  */
1705               strip = true;
1706             }
1707         }
1708       else if (strcmp (name, ".opd") == 0)
1709         {
1710           if (s->_raw_size == 0)
1711             {
1712               /* Strip this section if we don't need it; see the
1713                  comment below.  */
1714               strip = true;
1715             }
1716         }
1717       else if (strncmp (name, ".rela", 4) == 0)
1718         {
1719           if (s->_raw_size == 0)
1720             {
1721               /* If we don't need this section, strip it from the
1722                  output file.  This is mostly to handle .rela.bss and
1723                  .rela.plt.  We must create both sections in
1724                  create_dynamic_sections, because they must be created
1725                  before the linker maps input sections to output
1726                  sections.  The linker does that before
1727                  adjust_dynamic_symbol is called, and it is that
1728                  function which decides whether anything needs to go
1729                  into these sections.  */
1730               strip = true;
1731             }
1732           else
1733             {
1734               asection *target;
1735
1736               /* Remember whether there are any reloc sections other
1737                  than .rela.plt.  */
1738               if (strcmp (name, ".rela.plt") != 0)
1739                 {
1740                   const char *outname;
1741
1742                   relocs = true;
1743
1744                   /* If this relocation section applies to a read only
1745                      section, then we probably need a DT_TEXTREL
1746                      entry.  The entries in the .rela.plt section
1747                      really apply to the .got section, which we
1748                      created ourselves and so know is not readonly.  */
1749                   outname = bfd_get_section_name (output_bfd,
1750                                                   s->output_section);
1751                   target = bfd_get_section_by_name (output_bfd, outname + 4);
1752                   if (target != NULL
1753                       && (target->flags & SEC_READONLY) != 0
1754                       && (target->flags & SEC_ALLOC) != 0)
1755                     reltext = true;
1756                 }
1757
1758               /* We use the reloc_count field as a counter if we need
1759                  to copy relocs into the output file.  */
1760               s->reloc_count = 0;
1761             }
1762         }
1763       else if (strncmp (name, ".dlt", 4) != 0
1764                && strcmp (name, ".stub") != 0
1765                && strcmp (name, ".got") != 0)
1766         {
1767           /* It's not one of our sections, so don't allocate space.  */
1768           continue;
1769         }
1770
1771       if (strip)
1772         {
1773           _bfd_strip_section_from_output (info, s);
1774           continue;
1775         }
1776
1777       /* Allocate memory for the section contents if it has not
1778          been allocated already.  We use bfd_zalloc here in case
1779          unused entries are not reclaimed before the section's
1780          contents are written out.  This should not happen, but this
1781          way if it does, we get a R_PARISC_NONE reloc instead of
1782          garbage.  */
1783       if (s->contents == NULL)
1784         {
1785           s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
1786           if (s->contents == NULL && s->_raw_size != 0)
1787             return false;
1788         }
1789     }
1790
1791   if (elf_hash_table (info)->dynamic_sections_created)
1792     {
1793       /* Always create a DT_PLTGOT.  It actually has nothing to do with
1794          the PLT, it is how we communicate the __gp value of a load
1795          module to the dynamic linker.  */
1796       if (! bfd_elf64_add_dynamic_entry (info, DT_HP_DLD_FLAGS, 0)
1797           || ! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0))
1798         return false;
1799
1800       /* Add some entries to the .dynamic section.  We fill in the
1801          values later, in elf64_hppa_finish_dynamic_sections, but we
1802          must add the entries now so that we get the correct size for
1803          the .dynamic section.  The DT_DEBUG entry is filled in by the
1804          dynamic linker and used by the debugger.  */
1805       if (! info->shared)
1806         {
1807           if (! bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0)
1808               || ! bfd_elf64_add_dynamic_entry (info, DT_HP_DLD_HOOK, 0)
1809               || ! bfd_elf64_add_dynamic_entry (info, DT_HP_LOAD_MAP, 0))
1810             return false;
1811         }
1812
1813       if (plt)
1814         {
1815           if (! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
1816               || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
1817               || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
1818             return false;
1819         }
1820
1821       if (relocs)
1822         {
1823           if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
1824               || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
1825               || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
1826                                                 sizeof (Elf64_External_Rela)))
1827             return false;
1828         }
1829
1830       if (reltext)
1831         {
1832           if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
1833             return false;
1834           info->flags |= DF_TEXTREL;
1835         }
1836     }
1837
1838   return true;
1839 }
1840
1841 /* Called after we have output the symbol into the dynamic symbol
1842    table, but before we output the symbol into the normal symbol
1843    table.
1844
1845    For some symbols we had to change their address when outputting
1846    the dynamic symbol table.  We undo that change here so that
1847    the symbols have their expected value in the normal symbol
1848    table.  Ick.  */
1849
1850 static boolean
1851 elf64_hppa_link_output_symbol_hook (abfd, info, name, sym, input_sec)
1852      bfd *abfd ATTRIBUTE_UNUSED;
1853      struct bfd_link_info *info;
1854      const char *name;
1855      Elf_Internal_Sym *sym;
1856      asection *input_sec ATTRIBUTE_UNUSED;
1857 {
1858   struct elf64_hppa_link_hash_table *hppa_info;
1859   struct elf64_hppa_dyn_hash_entry *dyn_h;
1860
1861   /* We may be called with the file symbol or section symbols.
1862      They never need munging, so it is safe to ignore them.  */
1863   if (!name)
1864     return true;
1865
1866   /* Get the PA dyn_symbol (if any) associated with NAME.  */
1867   hppa_info = elf64_hppa_hash_table (info);
1868   dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1869                                       name, false, false);
1870
1871   /* Function symbols for which we created .opd entries *may* have been
1872      munged by finish_dynamic_symbol and have to be un-munged here.
1873
1874      Note that finish_dynamic_symbol sometimes turns dynamic symbols
1875      into non-dynamic ones, so we initialize st_shndx to -1 in
1876      mark_exported_functions and check to see if it was overwritten
1877      here instead of just checking dyn_h->h->dynindx.  */
1878   if (dyn_h && dyn_h->want_opd && dyn_h->st_shndx != -1)
1879     {
1880       /* Restore the saved value and section index.  */
1881       sym->st_value = dyn_h->st_value;
1882       sym->st_shndx = dyn_h->st_shndx;
1883     }
1884
1885   return true;
1886 }
1887
1888 /* Finish up dynamic symbol handling.  We set the contents of various
1889    dynamic sections here.  */
1890
1891 static boolean
1892 elf64_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
1893      bfd *output_bfd;
1894      struct bfd_link_info *info;
1895      struct elf_link_hash_entry *h;
1896      Elf_Internal_Sym *sym;
1897 {
1898   asection *stub, *splt, *sdlt, *sopd, *spltrel, *sdltrel;
1899   struct elf64_hppa_link_hash_table *hppa_info;
1900   struct elf64_hppa_dyn_hash_entry *dyn_h;
1901
1902   hppa_info = elf64_hppa_hash_table (info);
1903   dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
1904                                       h->root.root.string, false, false);
1905
1906   stub = hppa_info->stub_sec;
1907   splt = hppa_info->plt_sec;
1908   sdlt = hppa_info->dlt_sec;
1909   sopd = hppa_info->opd_sec;
1910   spltrel = hppa_info->plt_rel_sec;
1911   sdltrel = hppa_info->dlt_rel_sec;
1912
1913   BFD_ASSERT (stub != NULL && splt != NULL
1914               && sopd != NULL && sdlt != NULL)
1915
1916   /* Incredible.  It is actually necessary to NOT use the symbol's real
1917      value when building the dynamic symbol table for a shared library.
1918      At least for symbols that refer to functions.
1919
1920      We will store a new value and section index into the symbol long
1921      enough to output it into the dynamic symbol table, then we restore
1922      the original values (in elf64_hppa_link_output_symbol_hook).  */
1923   if (dyn_h && dyn_h->want_opd)
1924     {
1925       /* Save away the original value and section index so that we
1926          can restore them later.  */
1927       dyn_h->st_value = sym->st_value;
1928       dyn_h->st_shndx = sym->st_shndx;
1929
1930       /* For the dynamic symbol table entry, we want the value to be
1931          address of this symbol's entry within the .opd section.  */
1932       sym->st_value = (dyn_h->opd_offset
1933                        + sopd->output_offset
1934                        + sopd->output_section->vma);
1935       sym->st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
1936                                                          sopd->output_section);
1937     }
1938
1939   /* Initialize a .plt entry if requested.  */
1940   if (dyn_h && dyn_h->want_plt
1941       && elf64_hppa_dynamic_symbol_p (dyn_h->h, info))
1942     {
1943       bfd_vma value;
1944       Elf_Internal_Rela rel;
1945
1946       /* We do not actually care about the value in the PLT entry
1947          if we are creating a shared library and the symbol is
1948          still undefined, we create a dynamic relocation to fill
1949          in the correct value.  */
1950       if (info->shared && h->root.type == bfd_link_hash_undefined)
1951         value = 0;
1952       else
1953         value = (h->root.u.def.value + h->root.u.def.section->vma);
1954
1955       /* Fill in the entry in the procedure linkage table.
1956
1957          The format of a plt entry is
1958          <funcaddr> <__gp>.
1959
1960          plt_offset is the offset within the PLT section at which to
1961          install the PLT entry.
1962
1963          We are modifying the in-memory PLT contents here, so we do not add
1964          in the output_offset of the PLT section.  */
1965
1966       bfd_put_64 (splt->owner, value, splt->contents + dyn_h->plt_offset);
1967       value = _bfd_get_gp_value (splt->output_section->owner);
1968       bfd_put_64 (splt->owner, value, splt->contents + dyn_h->plt_offset + 0x8);
1969
1970       /* Create a dynamic IPLT relocation for this entry.
1971
1972          We are creating a relocation in the output file's PLT section,
1973          which is included within the DLT secton.  So we do need to include
1974          the PLT's output_offset in the computation of the relocation's
1975          address.  */
1976       rel.r_offset = (dyn_h->plt_offset + splt->output_offset
1977                       + splt->output_section->vma);
1978       rel.r_info = ELF64_R_INFO (h->dynindx, R_PARISC_IPLT);
1979       rel.r_addend = 0;
1980
1981       bfd_elf64_swap_reloca_out (splt->output_section->owner, &rel,
1982                                  (((Elf64_External_Rela *)
1983                                    spltrel->contents)
1984                                   + spltrel->reloc_count));
1985       spltrel->reloc_count++;
1986     }
1987
1988   /* Initialize an external call stub entry if requested.  */
1989   if (dyn_h && dyn_h->want_stub
1990       && elf64_hppa_dynamic_symbol_p (dyn_h->h, info))
1991     {
1992       bfd_vma value;
1993       int insn;
1994       unsigned int max_offset;
1995
1996       /* Install the generic stub template.
1997
1998          We are modifying the contents of the stub section, so we do not
1999          need to include the stub section's output_offset here.  */
2000       memcpy (stub->contents + dyn_h->stub_offset, plt_stub, sizeof (plt_stub));
2001
2002       /* Fix up the first ldd instruction.
2003
2004          We are modifying the contents of the STUB section in memory,
2005          so we do not need to include its output offset in this computation.
2006
2007          Note the plt_offset value is the value of the PLT entry relative to
2008          the start of the PLT section.  These instructions will reference
2009          data relative to the value of __gp, which may not necessarily have
2010          the same address as the start of the PLT section.
2011
2012          gp_offset contains the offset of __gp within the PLT section.  */
2013       value = dyn_h->plt_offset - hppa_info->gp_offset;
2014
2015       insn = bfd_get_32 (stub->owner, stub->contents + dyn_h->stub_offset);
2016       if (output_bfd->arch_info->mach >= 25)
2017         {
2018           /* Wide mode allows 16 bit offsets.  */
2019           max_offset = 32768;
2020           insn &= ~ 0xfff1;
2021           insn |= re_assemble_16 (value);
2022         }
2023       else
2024         {
2025           max_offset = 8192;
2026           insn &= ~ 0x3ff1;
2027           insn |= re_assemble_14 (value);
2028         }
2029
2030       if ((value & 7) || value + max_offset >= 2*max_offset - 8)
2031         {
2032           (*_bfd_error_handler) (_("stub entry for %s cannot load .plt, dp offset = %ld"),
2033                                  dyn_h->root.string,
2034                                  (long) value);
2035           return false;
2036         }
2037
2038       bfd_put_32 (stub->owner, insn,
2039                   stub->contents + dyn_h->stub_offset);
2040
2041       /* Fix up the second ldd instruction.  */
2042       value += 8;
2043       insn = bfd_get_32 (stub->owner, stub->contents + dyn_h->stub_offset + 8);
2044       if (output_bfd->arch_info->mach >= 25)
2045         {
2046           insn &= ~ 0xfff1;
2047           insn |= re_assemble_16 (value);
2048         }
2049       else
2050         {
2051           insn &= ~ 0x3ff1;
2052           insn |= re_assemble_14 (value);
2053         }
2054       bfd_put_32 (stub->owner, insn,
2055                   stub->contents + dyn_h->stub_offset + 8);
2056     }
2057
2058   /* Millicode symbols should not be put in the dynamic
2059      symbol table under any circumstances.  */
2060   if (ELF_ST_TYPE (sym->st_info) == STT_PARISC_MILLI)
2061     h->dynindx = -1;
2062
2063   return true;
2064 }
2065
2066 /* The .opd section contains FPTRs for each function this file
2067    exports.  Initialize the FPTR entries.  */
2068
2069 static boolean
2070 elf64_hppa_finalize_opd (dyn_h, data)
2071      struct elf64_hppa_dyn_hash_entry *dyn_h;
2072      PTR data;
2073 {
2074   struct bfd_link_info *info = (struct bfd_link_info *)data;
2075   struct elf64_hppa_link_hash_table *hppa_info;
2076   struct elf_link_hash_entry *h = dyn_h->h;
2077   asection *sopd;
2078   asection *sopdrel;
2079
2080   hppa_info = elf64_hppa_hash_table (info);
2081   sopd = hppa_info->opd_sec;
2082   sopdrel = hppa_info->opd_rel_sec;
2083
2084   if (h && dyn_h && dyn_h->want_opd)
2085     {
2086       bfd_vma value;
2087
2088       /* The first two words of an .opd entry are zero.
2089
2090          We are modifying the contents of the OPD section in memory, so we
2091          do not need to include its output offset in this computation.  */
2092       memset (sopd->contents + dyn_h->opd_offset, 0, 16);
2093
2094       value = (h->root.u.def.value
2095                + h->root.u.def.section->output_section->vma
2096                + h->root.u.def.section->output_offset);
2097
2098       /* The next word is the address of the function.  */
2099       bfd_put_64 (sopd->owner, value, sopd->contents + dyn_h->opd_offset + 16);
2100
2101       /* The last word is our local __gp value.  */
2102       value = _bfd_get_gp_value (sopd->output_section->owner);
2103       bfd_put_64 (sopd->owner, value, sopd->contents + dyn_h->opd_offset + 24);
2104     }
2105
2106   /* If we are generating a shared library, we must generate EPLT relocations
2107      for each entry in the .opd, even for static functions (they may have
2108      had their address taken).  */
2109   if (info->shared && dyn_h && dyn_h->want_opd)
2110     {
2111       Elf64_Internal_Rela rel;
2112       int dynindx;
2113
2114       /* We may need to do a relocation against a local symbol, in
2115          which case we have to look up it's dynamic symbol index off
2116          the local symbol hash table.  */
2117       if (h && h->dynindx != -1)
2118         dynindx = h->dynindx;
2119       else
2120         dynindx
2121           = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2122                                                 dyn_h->sym_indx);
2123
2124       /* The offset of this relocation is the absolute address of the
2125          .opd entry for this symbol.  */
2126       rel.r_offset = (dyn_h->opd_offset + sopd->output_offset
2127                       + sopd->output_section->vma);
2128
2129       /* If H is non-null, then we have an external symbol.
2130
2131          It is imperative that we use a different dynamic symbol for the
2132          EPLT relocation if the symbol has global scope.
2133
2134          In the dynamic symbol table, the function symbol will have a value
2135          which is address of the function's .opd entry.
2136
2137          Thus, we can not use that dynamic symbol for the EPLT relocation
2138          (if we did, the data in the .opd would reference itself rather
2139          than the actual address of the function).  Instead we have to use
2140          a new dynamic symbol which has the same value as the original global
2141          function symbol.
2142
2143          We prefix the original symbol with a "." and use the new symbol in
2144          the EPLT relocation.  This new symbol has already been recorded in
2145          the symbol table, we just have to look it up and use it.
2146
2147          We do not have such problems with static functions because we do
2148          not make their addresses in the dynamic symbol table point to
2149          the .opd entry.  Ultimately this should be safe since a static
2150          function can not be directly referenced outside of its shared
2151          library.
2152
2153          We do have to play similar games for FPTR relocations in shared
2154          libraries, including those for static symbols.  See the FPTR
2155          handling in elf64_hppa_finalize_dynreloc.  */
2156       if (h)
2157         {
2158           char *new_name;
2159           struct elf_link_hash_entry *nh;
2160
2161           new_name = alloca (strlen (h->root.root.string) + 2);
2162           new_name[0] = '.';
2163           strcpy (new_name + 1, h->root.root.string);
2164
2165           nh = elf_link_hash_lookup (elf_hash_table (info),
2166                                      new_name, false, false, false);
2167
2168           /* All we really want from the new symbol is its dynamic
2169              symbol index.  */
2170           dynindx = nh->dynindx;
2171         }
2172
2173       rel.r_addend = 0;
2174       rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_EPLT);
2175
2176       bfd_elf64_swap_reloca_out (sopd->output_section->owner, &rel,
2177                                  (((Elf64_External_Rela *)
2178                                    sopdrel->contents)
2179                                   + sopdrel->reloc_count));
2180       sopdrel->reloc_count++;
2181     }
2182   return true;
2183 }
2184
2185 /* The .dlt section contains addresses for items referenced through the
2186    dlt.  Note that we can have a DLTIND relocation for a local symbol, thus
2187    we can not depend on finish_dynamic_symbol to initialize the .dlt.  */
2188
2189 static boolean
2190 elf64_hppa_finalize_dlt (dyn_h, data)
2191      struct elf64_hppa_dyn_hash_entry *dyn_h;
2192      PTR data;
2193 {
2194   struct bfd_link_info *info = (struct bfd_link_info *)data;
2195   struct elf64_hppa_link_hash_table *hppa_info;
2196   asection *sdlt, *sdltrel;
2197   struct elf_link_hash_entry *h = dyn_h->h;
2198
2199   hppa_info = elf64_hppa_hash_table (info);
2200
2201   sdlt = hppa_info->dlt_sec;
2202   sdltrel = hppa_info->dlt_rel_sec;
2203
2204   /* H/DYN_H may refer to a local variable and we know it's
2205      address, so there is no need to create a relocation.  Just install
2206      the proper value into the DLT, note this shortcut can not be
2207      skipped when building a shared library.  */
2208   if (! info->shared && h && dyn_h && dyn_h->want_dlt)
2209     {
2210       bfd_vma value;
2211
2212       /* If we had an LTOFF_FPTR style relocation we want the DLT entry
2213          to point to the FPTR entry in the .opd section.
2214
2215          We include the OPD's output offset in this computation as
2216          we are referring to an absolute address in the resulting
2217          object file.  */
2218       if (dyn_h->want_opd)
2219         {
2220           value = (dyn_h->opd_offset
2221                    + hppa_info->opd_sec->output_offset
2222                    + hppa_info->opd_sec->output_section->vma);
2223         }
2224       else
2225         {
2226           value = (h->root.u.def.value
2227                    + h->root.u.def.section->output_offset);
2228
2229           if (h->root.u.def.section->output_section)
2230             value += h->root.u.def.section->output_section->vma;
2231           else
2232             value += h->root.u.def.section->vma;
2233         }
2234
2235       /* We do not need to include the output offset of the DLT section
2236          here because we are modifying the in-memory contents.  */
2237       bfd_put_64 (sdlt->owner, value, sdlt->contents + dyn_h->dlt_offset);
2238     }
2239
2240   /* Create a relocation for the DLT entry assocated with this symbol.
2241      When building a shared library the symbol does not have to be dynamic.  */
2242   if (dyn_h->want_dlt
2243       && (elf64_hppa_dynamic_symbol_p (dyn_h->h, info) || info->shared))
2244     {
2245       Elf64_Internal_Rela rel;
2246       int dynindx;
2247
2248       /* We may need to do a relocation against a local symbol, in
2249          which case we have to look up it's dynamic symbol index off
2250          the local symbol hash table.  */
2251       if (h && h->dynindx != -1)
2252         dynindx = h->dynindx;
2253       else
2254         dynindx
2255           = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2256                                                 dyn_h->sym_indx);
2257
2258       /* Create a dynamic relocation for this entry.  Do include the output
2259          offset of the DLT entry since we need an absolute address in the
2260          resulting object file.  */
2261       rel.r_offset = (dyn_h->dlt_offset + sdlt->output_offset
2262                       + sdlt->output_section->vma);
2263       if (h && h->type == STT_FUNC)
2264           rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_FPTR64);
2265       else
2266           rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_DIR64);
2267       rel.r_addend = 0;
2268
2269       bfd_elf64_swap_reloca_out (sdlt->output_section->owner, &rel,
2270                                  (((Elf64_External_Rela *)
2271                                    sdltrel->contents)
2272                                   + sdltrel->reloc_count));
2273       sdltrel->reloc_count++;
2274     }
2275   return true;
2276 }
2277
2278 /* Finalize the dynamic relocations.  Specifically the FPTR relocations
2279    for dynamic functions used to initialize static data.  */
2280
2281 static boolean
2282 elf64_hppa_finalize_dynreloc (dyn_h, data)
2283      struct elf64_hppa_dyn_hash_entry *dyn_h;
2284      PTR data;
2285 {
2286   struct bfd_link_info *info = (struct bfd_link_info *)data;
2287   struct elf64_hppa_link_hash_table *hppa_info;
2288   struct elf_link_hash_entry *h;
2289   int dynamic_symbol;
2290
2291   dynamic_symbol = elf64_hppa_dynamic_symbol_p (dyn_h->h, info);
2292
2293   if (!dynamic_symbol && !info->shared)
2294     return true;
2295
2296   if (dyn_h->reloc_entries)
2297     {
2298       struct elf64_hppa_dyn_reloc_entry *rent;
2299       int dynindx;
2300
2301       hppa_info = elf64_hppa_hash_table (info);
2302       h = dyn_h->h;
2303
2304       /* We may need to do a relocation against a local symbol, in
2305          which case we have to look up it's dynamic symbol index off
2306          the local symbol hash table.  */
2307       if (h && h->dynindx != -1)
2308         dynindx = h->dynindx;
2309       else
2310         dynindx
2311           = _bfd_elf_link_lookup_local_dynindx (info, dyn_h->owner,
2312                                                 dyn_h->sym_indx);
2313
2314       for (rent = dyn_h->reloc_entries; rent; rent = rent->next)
2315         {
2316           Elf64_Internal_Rela rel;
2317
2318           switch (rent->type)
2319             {
2320               case R_PARISC_FPTR64:
2321               /* Allocate one iff we are not building a shared library and
2322                  !want_opd, which by this point will be true only if we're
2323                  actually allocating one statically in the main executable.  */
2324               if (!info->shared && dyn_h->want_opd)
2325                 continue;
2326               break;
2327             }
2328
2329           /* Create a dynamic relocation for this entry.
2330
2331              We need the output offset for the reloc's section because
2332              we are creating an absolute address in the resulting object
2333              file.  */
2334           rel.r_offset = (rent->offset + rent->sec->output_offset
2335                           + rent->sec->output_section->vma);
2336
2337           /* An FPTR64 relocation implies that we took the address of
2338              a function and that the function has an entry in the .opd
2339              section.  We want the FPTR64 relocation to reference the
2340              entry in .opd.
2341
2342              We could munge the symbol value in the dynamic symbol table
2343              (in fact we already do for functions with global scope) to point
2344              to the .opd entry.  Then we could use that dynamic symbol in
2345              this relocation.
2346
2347              Or we could do something sensible, not munge the symbol's
2348              address and instead just use a different symbol to reference
2349              the .opd entry.  At least that seems sensible until you
2350              realize there's no local dynamic symbols we can use for that
2351              purpose.  Thus the hair in the check_relocs routine.
2352
2353              We use a section symbol recorded by check_relocs as the
2354              base symbol for the relocation.  The addend is the difference
2355              between the section symbol and the address of the .opd entry.  */
2356           if (info->shared && rent->type == R_PARISC_FPTR64)
2357             {
2358               bfd_vma value, value2;
2359
2360               /* First compute the address of the opd entry for this symbol.  */
2361               value = (dyn_h->opd_offset
2362                        + hppa_info->opd_sec->output_section->vma
2363                        + hppa_info->opd_sec->output_offset);
2364
2365               /* Compute the value of the start of the section with
2366                  the relocation.  */
2367               value2 = (rent->sec->output_section->vma
2368                         + rent->sec->output_offset);
2369
2370               /* Compute the difference between the start of the section
2371                  with the relocation and the opd entry.  */
2372               value -= value2;
2373
2374               /* The result becomes the addend of the relocation.  */
2375               rel.r_addend = value;
2376
2377               /* The section symbol becomes the symbol for the dynamic
2378                  relocation.  */
2379               dynindx
2380                 = _bfd_elf_link_lookup_local_dynindx (info,
2381                                                       rent->sec->owner,
2382                                                       rent->sec_symndx);
2383             }
2384           else
2385             rel.r_addend = rent->addend;
2386
2387           rel.r_info = ELF64_R_INFO (dynindx, rent->type);
2388
2389           bfd_elf64_swap_reloca_out (hppa_info->other_rel_sec->output_section->owner,
2390                                      &rel,
2391                                      (((Elf64_External_Rela *)
2392                                       hppa_info->other_rel_sec->contents)
2393                                       + hppa_info->other_rel_sec->reloc_count));
2394           hppa_info->other_rel_sec->reloc_count++;
2395         }
2396     }
2397
2398   return true;
2399 }
2400
2401 /* Finish up the dynamic sections.  */
2402
2403 static boolean
2404 elf64_hppa_finish_dynamic_sections (output_bfd, info)
2405      bfd *output_bfd;
2406      struct bfd_link_info *info;
2407 {
2408   bfd *dynobj;
2409   asection *sdyn;
2410   struct elf64_hppa_link_hash_table *hppa_info;
2411
2412   hppa_info = elf64_hppa_hash_table (info);
2413
2414   /* Finalize the contents of the .opd section.  */
2415   elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2416                                 elf64_hppa_finalize_opd,
2417                                 info);
2418
2419   elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2420                                 elf64_hppa_finalize_dynreloc,
2421                                 info);
2422
2423   /* Finalize the contents of the .dlt section.  */
2424   dynobj = elf_hash_table (info)->dynobj;
2425   /* Finalize the contents of the .dlt section.  */
2426   elf64_hppa_dyn_hash_traverse (&hppa_info->dyn_hash_table,
2427                                 elf64_hppa_finalize_dlt,
2428                                 info);
2429
2430   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2431
2432   if (elf_hash_table (info)->dynamic_sections_created)
2433     {
2434       Elf64_External_Dyn *dyncon, *dynconend;
2435
2436       BFD_ASSERT (sdyn != NULL);
2437
2438       dyncon = (Elf64_External_Dyn *) sdyn->contents;
2439       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2440       for (; dyncon < dynconend; dyncon++)
2441         {
2442           Elf_Internal_Dyn dyn;
2443           asection *s;
2444
2445           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2446
2447           switch (dyn.d_tag)
2448             {
2449             default:
2450               break;
2451
2452             case DT_HP_LOAD_MAP:
2453               /* Compute the absolute address of 16byte scratchpad area
2454                  for the dynamic linker.
2455
2456                  By convention the linker script will allocate the scratchpad
2457                  area at the start of the .data section.  So all we have to
2458                  to is find the start of the .data section.  */
2459               s = bfd_get_section_by_name (output_bfd, ".data");
2460               dyn.d_un.d_ptr = s->vma;
2461               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2462               break;
2463
2464             case DT_PLTGOT:
2465               /* HP's use PLTGOT to set the GOT register.  */
2466               dyn.d_un.d_ptr = _bfd_get_gp_value (output_bfd);
2467               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2468               break;
2469
2470             case DT_JMPREL:
2471               s = hppa_info->plt_rel_sec;
2472               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2473               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2474               break;
2475
2476             case DT_PLTRELSZ:
2477               s = hppa_info->plt_rel_sec;
2478               dyn.d_un.d_val = s->_raw_size;
2479               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2480               break;
2481
2482             case DT_RELA:
2483               s = hppa_info->other_rel_sec;
2484               if (! s)
2485                 s = hppa_info->dlt_rel_sec;
2486               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2487               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2488               break;
2489
2490             case DT_RELASZ:
2491               s = hppa_info->other_rel_sec;
2492               dyn.d_un.d_val = s->_raw_size;
2493               s = hppa_info->dlt_rel_sec;
2494               dyn.d_un.d_val += s->_raw_size;
2495               s = hppa_info->opd_rel_sec;
2496               dyn.d_un.d_val += s->_raw_size;
2497               /* There is some question about whether or not the size of
2498                  the PLT relocs should be included here.  HP's tools do
2499                  it, so we'll emulate them.  */
2500               s = hppa_info->plt_rel_sec;
2501               dyn.d_un.d_val += s->_raw_size;
2502               bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2503               break;
2504
2505             }
2506         }
2507     }
2508
2509   return true;
2510 }
2511
2512 /* Return the number of additional phdrs we will need.
2513
2514    The generic ELF code only creates PT_PHDRs for executables.  The HP
2515    dynamic linker requires PT_PHDRs for dynamic libraries too.
2516
2517    This routine indicates that the backend needs one additional program
2518    header for that case.
2519
2520    Note we do not have access to the link info structure here, so we have
2521    to guess whether or not we are building a shared library based on the
2522    existence of a .interp section.  */
2523
2524 static int
2525 elf64_hppa_additional_program_headers (abfd)
2526      bfd *abfd;
2527 {
2528   asection *s;
2529
2530   /* If we are creating a shared library, then we have to create a
2531      PT_PHDR segment.  HP's dynamic linker chokes without it.  */
2532   s = bfd_get_section_by_name (abfd, ".interp");
2533   if (! s)
2534     return 1;
2535   return 0;
2536 }
2537
2538 /* Allocate and initialize any program headers required by this
2539    specific backend.
2540
2541    The generic ELF code only creates PT_PHDRs for executables.  The HP
2542    dynamic linker requires PT_PHDRs for dynamic libraries too.
2543
2544    This allocates the PT_PHDR and initializes it in a manner suitable
2545    for the HP linker.
2546
2547    Note we do not have access to the link info structure here, so we have
2548    to guess whether or not we are building a shared library based on the
2549    existence of a .interp section.  */
2550
2551 static boolean
2552 elf64_hppa_modify_segment_map (abfd)
2553      bfd *abfd;
2554 {
2555   struct elf_segment_map *m;
2556   asection *s;
2557
2558   s = bfd_get_section_by_name (abfd, ".interp");
2559   if (! s)
2560     {
2561       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2562         if (m->p_type == PT_PHDR)
2563           break;
2564       if (m == NULL)
2565         {
2566           m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2567           if (m == NULL)
2568             return false;
2569
2570           m->p_type = PT_PHDR;
2571           m->p_flags = PF_R | PF_X;
2572           m->p_flags_valid = 1;
2573           m->p_paddr_valid = 1;
2574           m->includes_phdrs = 1;
2575
2576           m->next = elf_tdata (abfd)->segment_map;
2577           elf_tdata (abfd)->segment_map = m;
2578         }
2579     }
2580
2581   for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2582     if (m->p_type == PT_LOAD)
2583       {
2584         unsigned int i;
2585
2586         for (i = 0; i < m->count; i++)
2587           {
2588             /* The code "hint" is not really a hint.  It is a requirement
2589                for certain versions of the HP dynamic linker.  Worse yet,
2590                it must be set even if the shared library does not have
2591                any code in its "text" segment (thus the check for .hash
2592                to catch this situation).  */
2593             if (m->sections[i]->flags & SEC_CODE
2594                 || (strcmp (m->sections[i]->name, ".hash") == 0))
2595               m->p_flags |= (PF_X | PF_HP_CODE);
2596           }
2597       }
2598
2599   return true;
2600 }
2601
2602 /* Called when writing out an object file to decide the type of a
2603    symbol.  */
2604 static int
2605 elf64_hppa_elf_get_symbol_type (elf_sym, type)
2606      Elf_Internal_Sym *elf_sym;
2607      int type;
2608 {
2609   if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
2610     return STT_PARISC_MILLI;
2611   else
2612     return type;
2613 }
2614
2615 /* The hash bucket size is the standard one, namely 4.  */
2616
2617 const struct elf_size_info hppa64_elf_size_info =
2618 {
2619   sizeof (Elf64_External_Ehdr),
2620   sizeof (Elf64_External_Phdr),
2621   sizeof (Elf64_External_Shdr),
2622   sizeof (Elf64_External_Rel),
2623   sizeof (Elf64_External_Rela),
2624   sizeof (Elf64_External_Sym),
2625   sizeof (Elf64_External_Dyn),
2626   sizeof (Elf_External_Note),
2627   4,
2628   1,
2629   64, 8,
2630   ELFCLASS64, EV_CURRENT,
2631   bfd_elf64_write_out_phdrs,
2632   bfd_elf64_write_shdrs_and_ehdr,
2633   bfd_elf64_write_relocs,
2634   bfd_elf64_swap_symbol_out,
2635   bfd_elf64_slurp_reloc_table,
2636   bfd_elf64_slurp_symbol_table,
2637   bfd_elf64_swap_dyn_in,
2638   bfd_elf64_swap_dyn_out,
2639   NULL,
2640   NULL,
2641   NULL,
2642   NULL
2643 };
2644
2645 #define TARGET_BIG_SYM                  bfd_elf64_hppa_vec
2646 #define TARGET_BIG_NAME                 "elf64-hppa"
2647 #define ELF_ARCH                        bfd_arch_hppa
2648 #define ELF_MACHINE_CODE                EM_PARISC
2649 /* This is not strictly correct.  The maximum page size for PA2.0 is
2650    64M.  But everything still uses 4k.  */
2651 #define ELF_MAXPAGESIZE                 0x1000
2652 #define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
2653 #define bfd_elf64_bfd_is_local_label_name       elf_hppa_is_local_label_name
2654 #define elf_info_to_howto               elf_hppa_info_to_howto
2655 #define elf_info_to_howto_rel           elf_hppa_info_to_howto_rel
2656
2657 #define elf_backend_section_from_shdr   elf64_hppa_section_from_shdr
2658 #define elf_backend_object_p            elf64_hppa_object_p
2659 #define elf_backend_final_write_processing \
2660                                         elf_hppa_final_write_processing
2661 #define elf_backend_fake_sections       elf_hppa_fake_sections
2662 #define elf_backend_add_symbol_hook     elf_hppa_add_symbol_hook
2663
2664 #define elf_backend_relocate_section        elf_hppa_relocate_section
2665
2666 #define bfd_elf64_bfd_final_link        elf_hppa_final_link
2667
2668 #define elf_backend_create_dynamic_sections \
2669                                         elf64_hppa_create_dynamic_sections
2670 #define elf_backend_post_process_headers        elf64_hppa_post_process_headers
2671
2672 #define elf_backend_adjust_dynamic_symbol \
2673                                         elf64_hppa_adjust_dynamic_symbol
2674
2675 #define elf_backend_size_dynamic_sections \
2676                                         elf64_hppa_size_dynamic_sections
2677
2678 #define elf_backend_finish_dynamic_symbol \
2679                                         elf64_hppa_finish_dynamic_symbol
2680 #define elf_backend_finish_dynamic_sections \
2681                                         elf64_hppa_finish_dynamic_sections
2682
2683 /* Stuff for the BFD linker: */
2684 #define bfd_elf64_bfd_link_hash_table_create \
2685         elf64_hppa_hash_table_create
2686
2687 #define elf_backend_check_relocs \
2688         elf64_hppa_check_relocs
2689
2690 #define elf_backend_size_info \
2691   hppa64_elf_size_info
2692
2693 #define elf_backend_additional_program_headers \
2694         elf64_hppa_additional_program_headers
2695
2696 #define elf_backend_modify_segment_map \
2697         elf64_hppa_modify_segment_map
2698
2699 #define elf_backend_link_output_symbol_hook \
2700         elf64_hppa_link_output_symbol_hook
2701
2702 #define elf_backend_want_got_plt        0
2703 #define elf_backend_plt_readonly        0
2704 #define elf_backend_want_plt_sym        0
2705 #define elf_backend_got_header_size     0
2706 #define elf_backend_plt_header_size     0
2707 #define elf_backend_type_change_ok true
2708 #define elf_backend_get_symbol_type          elf64_hppa_elf_get_symbol_type
2709
2710 #include "elf64-target.h"
2711
2712 #undef TARGET_BIG_SYM
2713 #define TARGET_BIG_SYM                  bfd_elf64_hppa_linux_vec
2714 #undef TARGET_BIG_NAME
2715 #define TARGET_BIG_NAME                 "elf64-hppa-linux"
2716
2717 #define INCLUDED_TARGET_FILE 1
2718 #include "elf64-target.h"