* elf-hppa.h (elf_hppa_relocate_section): Pass input_bfd instead of
[external/binutils.git] / bfd / elf64-hppa.c
1 /* Support for HPPA 64-bit ELF
2    Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3
4    This file is part of BFD, the Binary File Descriptor library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #include "alloca-conf.h"
21 #include "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/hppa.h"
26 #include "libhppa.h"
27 #include "elf64-hppa.h"
28 #define ARCH_SIZE              64
29
30 #define PLT_ENTRY_SIZE 0x10
31 #define DLT_ENTRY_SIZE 0x8
32 #define OPD_ENTRY_SIZE 0x20
33
34 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
35
36 /* The stub is supposed to load the target address and target's DP
37    value out of the PLT, then do an external branch to the target
38    address.
39
40    LDD PLTOFF(%r27),%r1
41    BVE (%r1)
42    LDD PLTOFF+8(%r27),%r27
43
44    Note that we must use the LDD with a 14 bit displacement, not the one
45    with a 5 bit displacement.  */
46 static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
47                           0x53, 0x7b, 0x00, 0x00 };
48
49 struct elf64_hppa_dyn_hash_entry
50 {
51   struct bfd_hash_entry root;
52
53   /* Offsets for this symbol in various linker sections.  */
54   bfd_vma dlt_offset;
55   bfd_vma plt_offset;
56   bfd_vma opd_offset;
57   bfd_vma stub_offset;
58
59   /* The symbol table entry, if any, that this was derived from.  */
60   struct elf_link_hash_entry *h;
61
62   /* The index of the (possibly local) symbol in the input bfd and its
63      associated BFD.  Needed so that we can have relocs against local
64      symbols in shared libraries.  */
65   long sym_indx;
66   bfd *owner;
67
68   /* Dynamic symbols may need to have two different values.  One for
69      the dynamic symbol table, one for the normal symbol table.
70
71      In such cases we store the symbol's real value and section
72      index here so we can restore the real value before we write
73      the normal symbol table.  */
74   bfd_vma st_value;
75   int st_shndx;
76
77   /* Used to count non-got, non-plt relocations for delayed sizing
78      of relocation sections.  */
79   struct elf64_hppa_dyn_reloc_entry
80   {
81     /* Next relocation in the chain.  */
82     struct elf64_hppa_dyn_reloc_entry *next;
83
84     /* The type of the relocation.  */
85     int type;
86
87     /* The input section of the relocation.  */
88     asection *sec;
89
90     /* The index of the section symbol for the input section of
91        the relocation.  Only needed when building shared libraries.  */
92     int sec_symndx;
93
94     /* The offset within the input section of the relocation.  */
95     bfd_vma offset;
96
97     /* The addend for the relocation.  */
98     bfd_vma addend;
99
100   } *reloc_entries;
101
102   /* Nonzero if this symbol needs an entry in one of the linker
103      sections.  */
104   unsigned want_dlt;
105   unsigned want_plt;
106   unsigned want_opd;
107   unsigned want_stub;
108 };
109
110 struct elf64_hppa_dyn_hash_table
111 {
112   struct bfd_hash_table root;
113 };
114
115 struct elf64_hppa_link_hash_table
116 {
117   struct elf_link_hash_table root;
118
119   /* Shortcuts to get to the various linker defined sections.  */
120   asection *dlt_sec;
121   asection *dlt_rel_sec;
122   asection *plt_sec;
123   asection *plt_rel_sec;
124   asection *opd_sec;
125   asection *opd_rel_sec;
126   asection *other_rel_sec;
127
128   /* Offset of __gp within .plt section.  When the PLT gets large we want
129      to slide __gp into the PLT section so that we can continue to use
130      single DP relative instructions to load values out of the PLT.  */
131   bfd_vma gp_offset;
132
133   /* Note this is not strictly correct.  We should create a stub section for
134      each input section with calls.  The stub section should be placed before
135      the section with the call.  */
136   asection *stub_sec;
137
138   bfd_vma text_segment_base;
139   bfd_vma data_segment_base;
140
141   struct elf64_hppa_dyn_hash_table dyn_hash_table;
142
143   /* We build tables to map from an input section back to its
144      symbol index.  This is the BFD for which we currently have
145      a map.  */
146   bfd *section_syms_bfd;
147
148   /* Array of symbol numbers for each input section attached to the
149      current BFD.  */
150   int *section_syms;
151 };
152
153 #define elf64_hppa_hash_table(p) \
154   ((struct elf64_hppa_link_hash_table *) ((p)->hash))
155
156 typedef struct bfd_hash_entry *(*new_hash_entry_func)
157   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
158
159 static bfd_boolean elf64_hppa_dyn_hash_table_init
160   PARAMS ((struct elf64_hppa_dyn_hash_table *ht, bfd *abfd,
161            new_hash_entry_func new));
162 static struct bfd_hash_entry *elf64_hppa_new_dyn_hash_entry
163   PARAMS ((struct bfd_hash_entry *entry, struct bfd_hash_table *table,
164            const char *string));
165 static struct bfd_link_hash_table *elf64_hppa_hash_table_create
166   PARAMS ((bfd *abfd));
167 static struct elf64_hppa_dyn_hash_entry *elf64_hppa_dyn_hash_lookup
168   PARAMS ((struct elf64_hppa_dyn_hash_table *table, const char *string,
169            bfd_boolean create, bfd_boolean copy));
170 static void elf64_hppa_dyn_hash_traverse
171   PARAMS ((struct elf64_hppa_dyn_hash_table *table,
172            bfd_boolean (*func) (struct elf64_hppa_dyn_hash_entry *, PTR),
173            PTR info));
174
175 static const char *get_dyn_name
176   PARAMS ((bfd *, struct elf_link_hash_entry *,
177            const Elf_Internal_Rela *, char **, size_t *));
178
179 /* This must follow the definitions of the various derived linker
180    hash tables and shared functions.  */
181 #include "elf-hppa.h"
182
183 static bfd_boolean elf64_hppa_object_p
184   PARAMS ((bfd *));
185
186 static bfd_boolean elf64_hppa_section_from_shdr
187   PARAMS ((bfd *, Elf_Internal_Shdr *, const char *));
188
189 static void elf64_hppa_post_process_headers
190   PARAMS ((bfd *, struct bfd_link_info *));
191
192 static bfd_boolean elf64_hppa_create_dynamic_sections
193   PARAMS ((bfd *, struct bfd_link_info *));
194
195 static bfd_boolean elf64_hppa_adjust_dynamic_symbol
196   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
197
198 static bfd_boolean elf64_hppa_mark_milli_and_exported_functions
199   PARAMS ((struct elf_link_hash_entry *, PTR));
200
201 static bfd_boolean elf64_hppa_size_dynamic_sections
202   PARAMS ((bfd *, struct bfd_link_info *));
203
204 static bfd_boolean elf64_hppa_link_output_symbol_hook
205   PARAMS ((struct bfd_link_info *, const char *, Elf_Internal_Sym *,
206            asection *, struct elf_link_hash_entry *));
207
208 static bfd_boolean elf64_hppa_finish_dynamic_symbol
209   PARAMS ((bfd *, struct bfd_link_info *,
210            struct elf_link_hash_entry *, Elf_Internal_Sym *));
211
212 static int elf64_hppa_additional_program_headers
213   PARAMS ((bfd *));
214
215 static bfd_boolean elf64_hppa_modify_segment_map
216   PARAMS ((bfd *, struct bfd_link_info *));
217
218 static enum elf_reloc_type_class elf64_hppa_reloc_type_class
219   PARAMS ((const Elf_Internal_Rela *));
220
221 static bfd_boolean elf64_hppa_finish_dynamic_sections
222   PARAMS ((bfd *, struct bfd_link_info *));
223
224 static bfd_boolean elf64_hppa_check_relocs
225   PARAMS ((bfd *, struct bfd_link_info *,
226            asection *, const Elf_Internal_Rela *));
227
228 static bfd_boolean elf64_hppa_dynamic_symbol_p
229   PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
230
231 static bfd_boolean elf64_hppa_mark_exported_functions
232   PARAMS ((struct elf_link_hash_entry *, PTR));
233
234 static bfd_boolean elf64_hppa_finalize_opd
235   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
236
237 static bfd_boolean elf64_hppa_finalize_dlt
238   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
239
240 static bfd_boolean allocate_global_data_dlt
241   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
242
243 static bfd_boolean allocate_global_data_plt
244   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
245
246 static bfd_boolean allocate_global_data_stub
247   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
248
249 static bfd_boolean allocate_global_data_opd
250   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
251
252 static bfd_boolean get_reloc_section
253   PARAMS ((bfd *, struct elf64_hppa_link_hash_table *, asection *));
254
255 static bfd_boolean count_dyn_reloc
256   PARAMS ((bfd *, struct elf64_hppa_dyn_hash_entry *,
257            int, asection *, int, bfd_vma, bfd_vma));
258
259 static bfd_boolean allocate_dynrel_entries
260   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
261
262 static bfd_boolean elf64_hppa_finalize_dynreloc
263   PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
264
265 static bfd_boolean get_opd
266   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
267
268 static bfd_boolean get_plt
269   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
270
271 static bfd_boolean get_dlt
272   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
273
274 static bfd_boolean get_stub
275   PARAMS ((bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *));
276
277 static int elf64_hppa_elf_get_symbol_type
278   PARAMS ((Elf_Internal_Sym *, int));
279
280 static bfd_boolean
281 elf64_hppa_dyn_hash_table_init (ht, abfd, new)
282      struct elf64_hppa_dyn_hash_table *ht;
283      bfd *abfd ATTRIBUTE_UNUSED;
284      new_hash_entry_func new;
285 {
286   memset (ht, 0, sizeof (*ht));
287   return bfd_hash_table_init (&ht->root, new);
288 }
289
290 static struct bfd_hash_entry*
291 elf64_hppa_new_dyn_hash_entry (entry, table, string)
292      struct bfd_hash_entry *entry;
293      struct bfd_hash_table *table;
294      const char *string;
295 {
296   struct elf64_hppa_dyn_hash_entry *ret;
297   ret = (struct elf64_hppa_dyn_hash_entry *) entry;
298
299   /* Allocate the structure if it has not already been allocated by a
300      subclass.  */
301   if (!ret)
302     ret = bfd_hash_allocate (table, sizeof (*ret));
303
304   if (!ret)
305     return 0;
306
307   /* Initialize our local data.  All zeros, and definitely easier
308      than setting 8 bit fields.  */
309   memset (ret, 0, sizeof (*ret));
310
311   /* Call the allocation method of the superclass.  */
312   ret = ((struct elf64_hppa_dyn_hash_entry *)
313          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
314
315   return &ret->root;
316 }
317
318 /* Create the derived linker hash table.  The PA64 ELF port uses this
319    derived hash table to keep information specific to the PA ElF
320    linker (without using static variables).  */
321
322 static struct bfd_link_hash_table*
323 elf64_hppa_hash_table_create (abfd)
324      bfd *abfd;
325 {
326   struct elf64_hppa_link_hash_table *ret;
327
328   ret = bfd_zalloc (abfd, (bfd_size_type) sizeof (*ret));
329   if (!ret)
330     return 0;
331   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
332                                       _bfd_elf_link_hash_newfunc))
333     {
334       bfd_release (abfd, ret);
335       return 0;
336     }
337
338   if (!elf64_hppa_dyn_hash_table_init (&ret->dyn_hash_table, abfd,
339                                        elf64_hppa_new_dyn_hash_entry))
340     return 0;
341   return &ret->root.root;
342 }
343
344 /* Look up an entry in a PA64 ELF linker hash table.  */
345
346 static struct elf64_hppa_dyn_hash_entry *
347 elf64_hppa_dyn_hash_lookup(table, string, create, copy)
348      struct elf64_hppa_dyn_hash_table *table;
349      const char *string;
350      bfd_boolean create, copy;
351 {
352   return ((struct elf64_hppa_dyn_hash_entry *)
353           bfd_hash_lookup (&table->root, string, create, copy));
354 }
355
356 /* Traverse a PA64 ELF linker hash table.  */
357
358 static void
359 elf64_hppa_dyn_hash_traverse (table, func, info)
360      struct elf64_hppa_dyn_hash_table *table;
361      bfd_boolean (*func) PARAMS ((struct elf64_hppa_dyn_hash_entry *, PTR));
362      PTR info;
363 {
364   (bfd_hash_traverse
365    (&table->root,
366     (bfd_boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) func,
367     info));
368 }
369 \f
370 /* Return nonzero if ABFD represents a PA2.0 ELF64 file.
371
372    Additionally we set the default architecture and machine.  */
373 static bfd_boolean
374 elf64_hppa_object_p (abfd)
375      bfd *abfd;
376 {
377   Elf_Internal_Ehdr * i_ehdrp;
378   unsigned int flags;
379
380   i_ehdrp = elf_elfheader (abfd);
381   if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
382     {
383       /* GCC on hppa-linux produces binaries with OSABI=Linux,
384          but the kernel produces corefiles with OSABI=SysV.  */
385       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX &&
386           i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
387         return FALSE;
388     }
389   else
390     {
391       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
392         return FALSE;
393     }
394
395   flags = i_ehdrp->e_flags;
396   switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
397     {
398     case EFA_PARISC_1_0:
399       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
400     case EFA_PARISC_1_1:
401       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
402     case EFA_PARISC_2_0:
403       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
404     case EFA_PARISC_2_0 | EF_PARISC_WIDE:
405       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
406     }
407   /* Don't be fussy.  */
408   return TRUE;
409 }
410
411 /* Given section type (hdr->sh_type), return a boolean indicating
412    whether or not the section is an elf64-hppa specific section.  */
413 static bfd_boolean
414 elf64_hppa_section_from_shdr (abfd, hdr, name)
415      bfd *abfd;
416      Elf_Internal_Shdr *hdr;
417      const char *name;
418 {
419   asection *newsect;
420
421   switch (hdr->sh_type)
422     {
423     case SHT_PARISC_EXT:
424       if (strcmp (name, ".PARISC.archext") != 0)
425         return FALSE;
426       break;
427     case SHT_PARISC_UNWIND:
428       if (strcmp (name, ".PARISC.unwind") != 0)
429         return FALSE;
430       break;
431     case SHT_PARISC_DOC:
432     case SHT_PARISC_ANNOT:
433     default:
434       return FALSE;
435     }
436
437   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
438     return FALSE;
439   newsect = hdr->bfd_section;
440
441   return TRUE;
442 }
443
444 /* Construct a string for use in the elf64_hppa_dyn_hash_table.  The
445    name describes what was once potentially anonymous memory.  We
446    allocate memory as necessary, possibly reusing PBUF/PLEN.  */
447
448 static const char *
449 get_dyn_name (abfd, h, rel, pbuf, plen)
450      bfd *abfd;
451      struct elf_link_hash_entry *h;
452      const Elf_Internal_Rela *rel;
453      char **pbuf;
454      size_t *plen;
455 {
456   asection *sec = abfd->sections;
457   size_t nlen, tlen;
458   char *buf;
459   size_t len;
460
461   if (h && rel->r_addend == 0)
462     return h->root.root.string;
463
464   if (h)
465     nlen = strlen (h->root.root.string);
466   else
467     nlen = 8 + 1 + sizeof (rel->r_info) * 2 - 8;
468   tlen = nlen + 1 + sizeof (rel->r_addend) * 2 + 1;
469
470   len = *plen;
471   buf = *pbuf;
472   if (len < tlen)
473     {
474       if (buf)
475         free (buf);
476       *pbuf = buf = malloc (tlen);
477       *plen = len = tlen;
478       if (!buf)
479         return NULL;
480     }
481
482   if (h)
483     {
484       memcpy (buf, h->root.root.string, nlen);
485       buf[nlen++] = '+';
486       sprintf_vma (buf + nlen, rel->r_addend);
487     }
488   else
489     {
490       nlen = sprintf (buf, "%x:%lx",
491                       sec->id & 0xffffffff,
492                       (long) ELF64_R_SYM (rel->r_info));
493       if (rel->r_addend)
494         {
495           buf[nlen++] = '+';
496           sprintf_vma (buf + nlen, rel->r_addend);
497         }
498     }
499
500   return buf;
501 }
502
503 /* SEC is a section containing relocs for an input BFD when linking; return
504    a suitable section for holding relocs in the output BFD for a link.  */
505
506 static bfd_boolean
507 get_reloc_section (abfd, hppa_info, sec)
508      bfd *abfd;
509      struct elf64_hppa_link_hash_table *hppa_info;
510      asection *sec;
511 {
512   const char *srel_name;
513   asection *srel;
514   bfd *dynobj;
515
516   srel_name = (bfd_elf_string_from_elf_section
517                (abfd, elf_elfheader(abfd)->e_shstrndx,
518                 elf_section_data(sec)->rel_hdr.sh_name));
519   if (srel_name == NULL)
520     return FALSE;
521
522   BFD_ASSERT ((strncmp (srel_name, ".rela", 5) == 0
523                && strcmp (bfd_get_section_name (abfd, sec),
524                           srel_name+5) == 0)
525               || (strncmp (srel_name, ".rel", 4) == 0
526                   && strcmp (bfd_get_section_name (abfd, sec),
527                              srel_name+4) == 0));
528
529   dynobj = hppa_info->root.dynobj;
530   if (!dynobj)
531     hppa_info->root.dynobj = dynobj = abfd;
532
533   srel = bfd_get_section_by_name (dynobj, srel_name);
534   if (srel == NULL)
535     {
536       srel = bfd_make_section (dynobj, srel_name);
537       if (srel == NULL
538           || !bfd_set_section_flags (dynobj, srel,
539                                      (SEC_ALLOC
540                                       | SEC_LOAD
541                                       | SEC_HAS_CONTENTS
542                                       | SEC_IN_MEMORY
543                                       | SEC_LINKER_CREATED
544                                       | SEC_READONLY))
545           || !bfd_set_section_alignment (dynobj, srel, 3))
546         return FALSE;
547     }
548
549   hppa_info->other_rel_sec = srel;
550   return TRUE;
551 }
552
553 /* Add a new entry to the list of dynamic relocations against DYN_H.
554
555    We use this to keep a record of all the FPTR relocations against a
556    particular symbol so that we can create FPTR relocations in the
557    output file.  */
558
559 static bfd_boolean
560 count_dyn_reloc (abfd, dyn_h, type, sec, sec_symndx, offset, addend)
561      bfd *abfd;
562      struct elf64_hppa_dyn_hash_entry *dyn_h;
563      int type;
564      asection *sec;
565      int sec_symndx;
566      bfd_vma offset;
567      bfd_vma addend;
568 {
569   struct elf64_hppa_dyn_reloc_entry *rent;
570
571   rent = (struct elf64_hppa_dyn_reloc_entry *)
572   bfd_alloc (abfd, (bfd_size_type) sizeof (*rent));
573   if (!rent)
574     return FALSE;
575
576   rent->next = dyn_h->reloc_entries;
577   rent->type = type;
578   rent->sec = sec;
579   rent->sec_symndx = sec_symndx;
580   rent->offset = offset;
581   rent->addend = addend;
582   dyn_h->reloc_entries = rent;
583
584   return TRUE;
585 }
586
587 /* Scan the RELOCS and record the type of dynamic entries that each
588    referenced symbol needs.  */
589
590 static bfd_boolean
591 elf64_hppa_check_relocs (abfd, info, sec, relocs)
592      bfd *abfd;
593      struct bfd_link_info *info;
594      asection *sec;
595      const Elf_Internal_Rela *relocs;
596 {
597   struct elf64_hppa_link_hash_table *hppa_info;
598   const Elf_Internal_Rela *relend;
599   Elf_Internal_Shdr *symtab_hdr;
600   const Elf_Internal_Rela *rel;
601   asection *dlt, *plt, *stubs;
602   char *buf;
603   size_t buf_len;
604   int sec_symndx;
605
606   if (info->relocatable)
607     return TRUE;
608
609   /* If this is the first dynamic object found in the link, create
610      the special sections required for dynamic linking.  */
611   if (! elf_hash_table (info)->dynamic_sections_created)
612     {
613       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
614         return FALSE;
615     }
616
617   hppa_info = elf64_hppa_hash_table (info);
618   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
619
620   /* If necessary, build a new table holding section symbols indices
621      for this BFD.  */
622
623   if (info->shared && hppa_info->section_syms_bfd != abfd)
624     {
625       unsigned long i;
626       unsigned int highest_shndx;
627       Elf_Internal_Sym *local_syms = NULL;
628       Elf_Internal_Sym *isym, *isymend;
629       bfd_size_type amt;
630
631       /* We're done with the old cache of section index to section symbol
632          index information.  Free it.
633
634          ?!? Note we leak the last section_syms array.  Presumably we
635          could free it in one of the later routines in this file.  */
636       if (hppa_info->section_syms)
637         free (hppa_info->section_syms);
638
639       /* Read this BFD's local symbols.  */
640       if (symtab_hdr->sh_info != 0)
641         {
642           local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
643           if (local_syms == NULL)
644             local_syms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
645                                                symtab_hdr->sh_info, 0,
646                                                NULL, NULL, NULL);
647           if (local_syms == NULL)
648             return FALSE;
649         }
650
651       /* Record the highest section index referenced by the local symbols.  */
652       highest_shndx = 0;
653       isymend = local_syms + symtab_hdr->sh_info;
654       for (isym = local_syms; isym < isymend; isym++)
655         {
656           if (isym->st_shndx > highest_shndx)
657             highest_shndx = isym->st_shndx;
658         }
659
660       /* Allocate an array to hold the section index to section symbol index
661          mapping.  Bump by one since we start counting at zero.  */
662       highest_shndx++;
663       amt = highest_shndx;
664       amt *= sizeof (int);
665       hppa_info->section_syms = (int *) bfd_malloc (amt);
666
667       /* Now walk the local symbols again.  If we find a section symbol,
668          record the index of the symbol into the section_syms array.  */
669       for (i = 0, isym = local_syms; isym < isymend; i++, isym++)
670         {
671           if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
672             hppa_info->section_syms[isym->st_shndx] = i;
673         }
674
675       /* We are finished with the local symbols.  */
676       if (local_syms != NULL
677           && symtab_hdr->contents != (unsigned char *) local_syms)
678         {
679           if (! info->keep_memory)
680             free (local_syms);
681           else
682             {
683               /* Cache the symbols for elf_link_input_bfd.  */
684               symtab_hdr->contents = (unsigned char *) local_syms;
685             }
686         }
687
688       /* Record which BFD we built the section_syms mapping for.  */
689       hppa_info->section_syms_bfd = abfd;
690     }
691
692   /* Record the symbol index for this input section.  We may need it for
693      relocations when building shared libraries.  When not building shared
694      libraries this value is never really used, but assign it to zero to
695      prevent out of bounds memory accesses in other routines.  */
696   if (info->shared)
697     {
698       sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
699
700       /* If we did not find a section symbol for this section, then
701          something went terribly wrong above.  */
702       if (sec_symndx == -1)
703         return FALSE;
704
705       sec_symndx = hppa_info->section_syms[sec_symndx];
706     }
707   else
708     sec_symndx = 0;
709
710   dlt = plt = stubs = NULL;
711   buf = NULL;
712   buf_len = 0;
713
714   relend = relocs + sec->reloc_count;
715   for (rel = relocs; rel < relend; ++rel)
716     {
717       enum
718         {
719           NEED_DLT = 1,
720           NEED_PLT = 2,
721           NEED_STUB = 4,
722           NEED_OPD = 8,
723           NEED_DYNREL = 16,
724         };
725
726       struct elf_link_hash_entry *h = NULL;
727       unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
728       struct elf64_hppa_dyn_hash_entry *dyn_h;
729       int need_entry;
730       const char *addr_name;
731       bfd_boolean maybe_dynamic;
732       int dynrel_type = R_PARISC_NONE;
733       static reloc_howto_type *howto;
734
735       if (r_symndx >= symtab_hdr->sh_info)
736         {
737           /* We're dealing with a global symbol -- find its hash entry
738              and mark it as being referenced.  */
739           long indx = r_symndx - symtab_hdr->sh_info;
740           h = elf_sym_hashes (abfd)[indx];
741           while (h->root.type == bfd_link_hash_indirect
742                  || h->root.type == bfd_link_hash_warning)
743             h = (struct elf_link_hash_entry *) h->root.u.i.link;
744
745           h->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
746         }
747
748       /* We can only get preliminary data on whether a symbol is
749          locally or externally defined, as not all of the input files
750          have yet been processed.  Do something with what we know, as
751          this may help reduce memory usage and processing time later.  */
752       maybe_dynamic = FALSE;
753       if (h && ((info->shared
754                  && (!info->symbolic || info->unresolved_syms_in_shared_libs == RM_IGNORE))
755                 || ! (h->elf_link_hash_flags & ELF_LINK_HASH_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->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
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_elf64_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->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
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_elf64_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_elf64_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_elf64_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->_raw_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_elf64_link_record_local_dynamic_symbol
1513             (x->info, rent->sec->owner, dyn_h->sym_indx))
1514           return FALSE;
1515     }
1516
1517   /* Take care of the GOT and PLT relocations.  */
1518
1519   if ((dynamic_symbol || shared) && dyn_h->want_dlt)
1520     hppa_info->dlt_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1521
1522   /* If we are building a shared library, then every symbol that has an
1523      opd entry will need an EPLT relocation to relocate the symbol's address
1524      and __gp value based on the runtime load address.  */
1525   if (shared && dyn_h->want_opd)
1526     hppa_info->opd_rel_sec->_raw_size += sizeof (Elf64_External_Rela);
1527
1528   if (dyn_h->want_plt && dynamic_symbol)
1529     {
1530       bfd_size_type t = 0;
1531
1532       /* Dynamic symbols get one IPLT relocation.  Local symbols in
1533          shared libraries get two REL relocations.  Local symbols in
1534          main applications get nothing.  */
1535       if (dynamic_symbol)
1536         t = sizeof (Elf64_External_Rela);
1537       else if (shared)
1538         t = 2 * sizeof (Elf64_External_Rela);
1539
1540       hppa_info->plt_rel_sec->_raw_size += t;
1541     }
1542
1543   return TRUE;
1544 }
1545
1546 /* Adjust a symbol defined by a dynamic object and referenced by a
1547    regular object.  */
1548
1549 static 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->weakdef != NULL)
1561     {
1562       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1563                   || h->weakdef->root.type == bfd_link_hash_defweak);
1564       h->root.u.def.section = h->weakdef->root.u.def.section;
1565       h->root.u.def.value = h->weakdef->root.u.def.value;
1566       return TRUE;
1567     }
1568
1569   /* If this is a reference to a symbol defined by a dynamic object which
1570      is not a function, we might allocate the symbol in our .dynbss section
1571      and allocate a COPY dynamic relocation.
1572
1573      But PA64 code is canonically PIC, so as a rule we can avoid this sort
1574      of hackery.  */
1575
1576   return TRUE;
1577 }
1578
1579 /* 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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_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->_raw_size);
1824           if (s->contents == NULL && s->_raw_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_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (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->_raw_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->_raw_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->_raw_size)
2546                 s = hppa_info->dlt_rel_sec;
2547               if (! s || ! s->_raw_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->_raw_size;
2556               s = hppa_info->dlt_rel_sec;
2557               dyn.d_un.d_val += s->_raw_size;
2558               s = hppa_info->opd_rel_sec;
2559               dyn.d_un.d_val += s->_raw_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->_raw_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"