OSDN Git Service

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