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