OSDN Git Service

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