OSDN Git Service

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