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