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